ETH Price: $3,456.98 (+3.87%)

Contract

0x2cA72F97955338B1c710FbEa3804a070945F3e8d
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040111088902020-10-22 22:56:361494 days ago1603407396IN
 Create: sbVotes
0 ETH0.2140477244

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
sbVotes

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 5: sbVotes.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

import "./SafeMath.sol";
import "./sbControllerInterface.sol";
import "./sbGenericServicePoolInterface.sol";
import "./sbStrongValuePoolInterface.sol";

contract sbVotes {
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );
    event Voted(
        address indexed voter,
        address community,
        address indexed service,
        uint256 amount,
        uint256 indexed day
    );
    event VoteRecalled(
        address indexed voter,
        address community,
        address indexed service,
        uint256 amount,
        uint256 indexed day
    );
    event ServiceDropped(
        address indexed voter,
        address community,
        address indexed service,
        uint256 indexed day
    );
    event Claimed(address indexed service, uint256 amount, uint256 indexed day);
    event AddVotes(address indexed staker, uint256 amount);
    event SubVotes(address indexed staker, uint256 amount);

    using SafeMath for uint256;

    bool public initDone;
    address public admin;
    address public pendingAdmin;
    address public superAdmin;
    address public pendingSuperAdmin;

    sbControllerInterface public sbController;
    sbGenericServicePoolInterface public sbGenericServicePool;
    sbStrongValuePoolInterface public sbStrongValuePool;

    mapping(address => uint96) public balances;
    mapping(address => address) public delegates;

    mapping(address => mapping(uint32 => uint32)) public checkpointsFromBlock;
    mapping(address => mapping(uint32 => uint96)) public checkpointsVotes;
    mapping(address => uint32) public numCheckpoints;

    mapping(address => address[]) internal voterServicePools;
    mapping(address => mapping(address => address[]))
        internal voterServicePoolServices;
    mapping(address => mapping(address => mapping(address => uint256[])))
        internal voterServicePoolServiceDays;
    mapping(address => mapping(address => mapping(address => uint256[])))
        internal voterServicePoolServiceAmounts;
    mapping(address => mapping(address => mapping(address => uint256[])))
        internal voterServicePoolServiceVoteSeconds;
    mapping(address => uint256) internal voterDayLastClaimedFor;
    mapping(address => uint256) internal voterVotesOut;

    mapping(address => mapping(address => uint256[]))
        internal serviceServicePoolDays;
    mapping(address => mapping(address => uint256[]))
        internal serviceServicePoolAmounts;
    mapping(address => mapping(address => uint256[]))
        internal serviceServicePoolVoteSeconds;
    mapping(address => mapping(address => uint256))
        internal serviceServicePoolDayLastClaimedFor;

    mapping(address => uint256[]) internal servicePoolDays;
    mapping(address => uint256[]) internal servicePoolAmounts;
    mapping(address => uint256[]) internal servicePoolVoteSeconds;

    function init(
        address sbControllerAddress,
        address sbStrongValuePoolAddress,
        address adminAddress,
        address superAdminAddress
    ) public {
        require(!initDone, "init done");
        sbController = sbControllerInterface(sbControllerAddress);
        sbStrongValuePool = sbStrongValuePoolInterface(
            sbStrongValuePoolAddress
        );
        admin = adminAddress;
        superAdmin = superAdminAddress;
        initDone = true;
    }

    function updateVotes(
        address voter,
        uint256 rawAmount,
        bool adding
    ) external {
        require(
            msg.sender == address(sbStrongValuePool),
            "not sbStrongValuePool"
        );
        uint96 amount = _safe96(rawAmount, "amount exceeds 96 bits");
        if (adding) {
            _addVotes(voter, amount);
        } else {
            require(voter == delegates[voter], "must delegate to self");
            require(
                _getAvailableServiceVotes(voter) >= amount,
                "must recall votes"
            );
            _subVotes(voter, amount);
        }
    }

    function getCurrentProposalVotes(address account)
        external
        view
        returns (uint96)
    {
        return _getCurrentProposalVotes(account);
    }

    function getPriorProposalVotes(address account, uint256 blockNumber)
        external
        view
        returns (uint96)
    {
        require(blockNumber < block.number, "not yet determined");
        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }
        if (checkpointsFromBlock[account][nCheckpoints - 1] <= blockNumber) {
            return checkpointsVotes[account][nCheckpoints - 1];
        }
        if (checkpointsFromBlock[account][0] > blockNumber) {
            return 0;
        }
        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2;
            uint32 fromBlock = checkpointsFromBlock[account][center];
            uint96 votes = checkpointsVotes[account][center];
            if (fromBlock == blockNumber) {
                return votes;
            } else if (fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpointsVotes[account][lower];
    }

    function getServiceDayLastClaimedFor(address servicePool, address service)
        public
        view
        returns (uint256)
    {
        uint256 len = serviceServicePoolDays[service][servicePool].length;
        if (len != 0) {
            return
                serviceServicePoolDayLastClaimedFor[service][servicePool] == 0
                    ? serviceServicePoolDays[service][servicePool][0].sub(1)
                    : serviceServicePoolDayLastClaimedFor[service][servicePool];
        }
        return 0;
    }

    function getVoterDayLastClaimedFor(address voter)
        public
        view
        returns (uint256)
    {
        if (voterDayLastClaimedFor[voter] == 0) {
            uint256 firstDayVoted = _getVoterFirstDay(voter);
            if (firstDayVoted == 0) {
                return 0;
            }
            return firstDayVoted.sub(1);
        }
        return voterDayLastClaimedFor[voter];
    }

    function recallAllVotes() public {
        require(voterVotesOut[msg.sender] > 0, "no votes out");
        _recallAllVotes(msg.sender);
    }

    function delegate(address delegatee) public {
        _delegate(msg.sender, delegatee);
    }

    function getDelegate(address delegator) public view returns (address) {
        return delegates[delegator];
    }

    function getAvailableServiceVotes(address account)
        public
        view
        returns (uint96)
    {
        return _getAvailableServiceVotes(account);
    }

    function getVoterServicePoolServices(address voter, address servicePool)
        public
        view
        returns (address[] memory)
    {
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        return voterServicePoolServices[voter][servicePool];
    }

    function vote(
        address servicePool,
        address service,
        uint256 amount
    ) public {
        require(amount > 0, "1: zero");
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(
            sbGenericServicePoolInterface(servicePool).isServiceAccepted(
                service
            ),
            "invalid service"
        );
        require(sbStrongValuePool.serviceMinMined(service), "not min mined");
        require(
            uint256(_getAvailableServiceVotes(msg.sender)) >= amount,
            "not enough votes"
        );
        if (!_voterServicePoolServiceExists(msg.sender, servicePool, service)) {
            require(
                voterServicePoolServices[msg.sender][servicePool].length.add(
                    1
                ) <= sbController.getVoteForServicesCount(),
                "1: too many"
            );
            voterServicePoolServices[msg.sender][servicePool].push(service);
        }
        if (!_voterServicePoolExists(msg.sender, servicePool)) {
            require(
                voterServicePools[msg.sender].length.add(1) <=
                    sbController.getVoteForServicePoolsCount(),
                "2: too many"
            );
            voterServicePools[msg.sender].push(servicePool);
        }
        uint256 currentDay = _getCurrentDay();
        _updateVoterServicePoolServiceData(
            msg.sender,
            servicePool,
            service,
            amount,
            true,
            currentDay
        );
        _updateServiceServicePoolData(
            service,
            servicePool,
            amount,
            true,
            currentDay
        );
        _updateServicePoolData(servicePool, amount, true, currentDay);
        voterVotesOut[msg.sender] = voterVotesOut[msg.sender].add(amount);
        emit Voted(msg.sender, servicePool, service, amount, currentDay);
    }

    function recallVote(
        address servicePool,
        address service,
        uint256 amount
    ) public {
        require(amount > 0, "zero");
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(
            sbGenericServicePoolInterface(servicePool).isServiceAccepted(
                service
            ),
            "invalid service"
        );
        require(
            _voterServicePoolServiceExists(msg.sender, servicePool, service),
            "not found"
        );
        uint256 currentDay = _getCurrentDay();
        (, uint256 votes, ) = _getVoterServicePoolServiceData(
            msg.sender,
            servicePool,
            service,
            currentDay
        );
        require(votes >= amount, "not enough votes");
        _updateVoterServicePoolServiceData(
            msg.sender,
            servicePool,
            service,
            amount,
            false,
            currentDay
        );
        _updateServiceServicePoolData(
            service,
            servicePool,
            amount,
            false,
            currentDay
        );
        _updateServicePoolData(servicePool, amount, false, currentDay);
        voterVotesOut[msg.sender] = voterVotesOut[msg.sender].sub(amount);
        emit VoteRecalled(msg.sender, servicePool, service, amount, currentDay);
    }

    function dropService(address servicePool, address service) public {
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(
            sbGenericServicePoolInterface(servicePool).isServiceAccepted(
                service
            ),
            "invalid service"
        );
        require(
            _voterServicePoolExists(msg.sender, servicePool),
            "2: not found"
        );
        require(
            _voterServicePoolServiceExists(msg.sender, servicePool, service),
            "1: not found"
        );
        uint256 currentDay = _getCurrentDay();
        (, uint256 votes, ) = _getVoterServicePoolServiceData(
            msg.sender,
            servicePool,
            service,
            currentDay
        );
        _updateVoterServicePoolServiceData(
            msg.sender,
            servicePool,
            service,
            votes,
            false,
            currentDay
        );
        _updateServiceServicePoolData(
            service,
            servicePool,
            votes,
            false,
            currentDay
        );
        _updateServicePoolData(servicePool, votes, false, currentDay);
        voterVotesOut[msg.sender] = voterVotesOut[msg.sender].sub(votes);
        uint256 voterServicePoolServicesIndex = _findIndexOfAddress(
            voterServicePoolServices[msg.sender][servicePool],
            service
        );
        _deleteArrayElement(
            voterServicePoolServicesIndex,
            voterServicePoolServices[msg.sender][servicePool]
        );
        if (voterServicePoolServices[msg.sender][servicePool].length == 0) {
            uint256 voterServicePoolsIndex = _findIndexOfAddress(
                voterServicePools[msg.sender],
                servicePool
            );
            _deleteArrayElement(
                voterServicePoolsIndex,
                voterServicePools[msg.sender]
            );
        }
        emit ServiceDropped(msg.sender, servicePool, service, currentDay);
    }

    function serviceClaimAll(address servicePool) public {
        uint256 len = serviceServicePoolDays[msg.sender][servicePool].length;
        require(len != 0, "no votes");
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        uint256 currentDay = _getCurrentDay();
        uint256 dayLastClaimedFor = serviceServicePoolDayLastClaimedFor[msg
            .sender][servicePool] == 0
            ? serviceServicePoolDays[msg.sender][servicePool][0].sub(1)
            : serviceServicePoolDayLastClaimedFor[msg.sender][servicePool];
        uint256 vestingDays = sbController.getVoteReceiverVestingDays();
        require(
            currentDay > dayLastClaimedFor.add(vestingDays),
            "already claimed"
        );
        _serviceClaim(
            currentDay,
            servicePool,
            msg.sender,
            dayLastClaimedFor,
            vestingDays
        );
    }

    function serviceClaimUpTo(address servicePool, uint256 day) public {
        uint256 len = serviceServicePoolDays[msg.sender][servicePool].length;
        require(len != 0, "no votes");
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(day <= _getCurrentDay(), "invalid day");
        uint256 dayLastClaimedFor = serviceServicePoolDayLastClaimedFor[msg
            .sender][servicePool] == 0
            ? serviceServicePoolDays[msg.sender][servicePool][0].sub(1)
            : serviceServicePoolDayLastClaimedFor[msg.sender][servicePool];
        uint256 vestingDays = sbController.getVoteReceiverVestingDays();
        require(day > dayLastClaimedFor.add(vestingDays), "already claimed");
        _serviceClaim(
            day,
            servicePool,
            msg.sender,
            dayLastClaimedFor,
            vestingDays
        );
    }

    function voterClaimAll() public {
        uint256 dayLastClaimedFor;
        if (voterDayLastClaimedFor[msg.sender] == 0) {
            uint256 firstDayVoted = _getVoterFirstDay(msg.sender);
            require(firstDayVoted != 0, "no votes");
            dayLastClaimedFor = firstDayVoted.sub(1);
        } else {
            dayLastClaimedFor = voterDayLastClaimedFor[msg.sender];
        }
        uint256 currentDay = _getCurrentDay();
        uint256 vestingDays = sbController.getVoteCasterVestingDays();
        require(
            currentDay > dayLastClaimedFor.add(vestingDays),
            "already claimed"
        );
        _voterClaim(currentDay, msg.sender, dayLastClaimedFor, vestingDays);
    }

    function voterClaimUpTo(uint256 day) public {
        uint256 dayLastClaimedFor;
        if (voterDayLastClaimedFor[msg.sender] == 0) {
            uint256 firstDayVoted = _getVoterFirstDay(msg.sender);
            require(firstDayVoted != 0, "no votes");
            dayLastClaimedFor = firstDayVoted.sub(1);
        } else {
            dayLastClaimedFor = voterDayLastClaimedFor[msg.sender];
        }
        require(day <= _getCurrentDay(), "invalid day");
        uint256 vestingDays = sbController.getVoteCasterVestingDays();
        require(day > dayLastClaimedFor.add(vestingDays), "already claimed");
        _voterClaim(day, msg.sender, dayLastClaimedFor, vestingDays);
    }

    function getServiceRewardsDueAll(address servicePool, address service)
        public
        view
        returns (uint256)
    {
        uint256 len = serviceServicePoolDays[service][servicePool].length;
        if (len == 0) {
            return 0;
        }
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        uint256 currentDay = _getCurrentDay();


            uint256 dayLastClaimedFor
         = serviceServicePoolDayLastClaimedFor[service][servicePool] == 0
            ? serviceServicePoolDays[service][servicePool][0].sub(1)
            : serviceServicePoolDayLastClaimedFor[service][servicePool];
        uint256 vestingDays = sbController.getVoteReceiverVestingDays();
        if (!(currentDay > dayLastClaimedFor.add(vestingDays))) {
            return 0;
        }
        return
            _getServiceRewardsDue(
                currentDay,
                servicePool,
                service,
                dayLastClaimedFor,
                vestingDays
            );
    }

    function getServiceRewardsDueUpTo(
        address servicePool,
        address service,
        uint256 day
    ) public view returns (uint256) {
        uint256 len = serviceServicePoolDays[service][servicePool].length;
        if (len == 0) {
            return 0;
        }
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(day <= _getCurrentDay(), "invalid day");


            uint256 dayLastClaimedFor
         = serviceServicePoolDayLastClaimedFor[service][servicePool] == 0
            ? serviceServicePoolDays[service][servicePool][0].sub(1)
            : serviceServicePoolDayLastClaimedFor[service][servicePool];
        uint256 vestingDays = sbController.getVoteReceiverVestingDays();
        if (!(day > dayLastClaimedFor.add(vestingDays))) {
            return 0;
        }
        return
            _getServiceRewardsDue(
                day,
                servicePool,
                service,
                dayLastClaimedFor,
                vestingDays
            );
    }

    function getVoterRewardsDueAll(address voter)
        public
        view
        returns (uint256)
    {
        uint256 dayLastClaimedFor;
        if (voterDayLastClaimedFor[voter] == 0) {
            uint256 firstDayVoted = _getVoterFirstDay(voter);
            if (firstDayVoted == 0) {
                return 0;
            }
            dayLastClaimedFor = firstDayVoted.sub(1);
        } else {
            dayLastClaimedFor = voterDayLastClaimedFor[voter];
        }
        uint256 currentDay = _getCurrentDay();
        uint256 vestingDays = sbController.getVoteCasterVestingDays();
        if (!(currentDay > dayLastClaimedFor.add(vestingDays))) {
            return 0;
        }
        return
            _getVoterRewardsDue(
                currentDay,
                voter,
                dayLastClaimedFor,
                vestingDays
            );
    }

    function getVoterRewardsDueUpTo(uint256 day, address voter)
        public
        view
        returns (uint256)
    {
        uint256 dayLastClaimedFor;
        if (voterDayLastClaimedFor[voter] == 0) {
            uint256 firstDayVoted = _getVoterFirstDay(voter);
            if (firstDayVoted == 0) {
                return 0;
            }
            dayLastClaimedFor = firstDayVoted.sub(1);
        } else {
            dayLastClaimedFor = voterDayLastClaimedFor[voter];
        }
        require(day <= _getCurrentDay(), "invalid day");
        uint256 vestingDays = sbController.getVoteCasterVestingDays();
        if (!(day > dayLastClaimedFor.add(vestingDays))) {
            return 0;
        }
        return _getVoterRewardsDue(day, voter, dayLastClaimedFor, vestingDays);
    }

    function getVoterServicePoolServiceData(
        address voter,
        address servicePool,
        address service,
        uint256 dayNumber
    )
        public
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 day = dayNumber == 0 ? _getCurrentDay() : dayNumber;
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(
            sbGenericServicePoolInterface(servicePool).isServiceAccepted(
                service
            ),
            "invalid service"
        );
        if (!_voterServicePoolServiceExists(voter, servicePool, service)) {
            return (day, 0, 0);
        }
        require(day <= _getCurrentDay(), "invalid day");
        return
            _getVoterServicePoolServiceData(voter, servicePool, service, day);
    }

    function getServiceServicePoolData(
        address service,
        address servicePool,
        uint256 dayNumber
    )
        public
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 day = dayNumber == 0 ? _getCurrentDay() : dayNumber;
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(
            sbGenericServicePoolInterface(servicePool).isServiceAccepted(
                service
            ),
            "invalid service"
        );
        require(day <= _getCurrentDay(), "invalid day");
        return _getServiceServicePoolData(service, servicePool, day);
    }

    function getServicePoolData(address servicePool, uint256 dayNumber)
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 day = dayNumber == 0 ? _getCurrentDay() : dayNumber;
        require(
            sbController.isServicePoolAccepted(servicePool),
            "invalid servicePool"
        );
        require(day <= _getCurrentDay(), "invalid day");
        return _getServicePoolData(servicePool, day);
    }

    function _getVoterServicePoolServiceData(
        address voter,
        address servicePool,
        address service,
        uint256 day
    )
        internal
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {

            uint256[] memory _Days
         = voterServicePoolServiceDays[voter][servicePool][service];


            uint256[] memory _Amounts
         = voterServicePoolServiceAmounts[voter][servicePool][service];


            uint256[] memory _UnitSeconds
         = voterServicePoolServiceVoteSeconds[voter][servicePool][service];
        return _get(_Days, _Amounts, _UnitSeconds, day);
    }

    function _getServiceServicePoolData(
        address service,
        address servicePool,
        uint256 day
    )
        internal
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256[] memory _Days = serviceServicePoolDays[service][servicePool];


            uint256[] memory _Amounts
         = serviceServicePoolAmounts[service][servicePool];


            uint256[] memory _UnitSeconds
         = serviceServicePoolVoteSeconds[service][servicePool];
        return _get(_Days, _Amounts, _UnitSeconds, day);
    }

    function _getServicePoolData(address servicePool, uint256 day)
        internal
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256[] memory _Days = servicePoolDays[servicePool];
        uint256[] memory _Amounts = servicePoolAmounts[servicePool];
        uint256[] memory _UnitSeconds = servicePoolVoteSeconds[servicePool];
        return _get(_Days, _Amounts, _UnitSeconds, day);
    }

    function _updateVoterServicePoolServiceData(
        address voter,
        address servicePool,
        address service,
        uint256 amount,
        bool adding,
        uint256 currentDay
    ) internal {

            uint256[] storage _Days
         = voterServicePoolServiceDays[voter][servicePool][service];


            uint256[] storage _Amounts
         = voterServicePoolServiceAmounts[voter][servicePool][service];


            uint256[] storage _UnitSeconds
         = voterServicePoolServiceVoteSeconds[voter][servicePool][service];
        _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay);
    }

    function _updateServiceServicePoolData(
        address service,
        address servicePool,
        uint256 amount,
        bool adding,
        uint256 currentDay
    ) internal {
        uint256[] storage _Days = serviceServicePoolDays[service][servicePool];


            uint256[] storage _Amounts
         = serviceServicePoolAmounts[service][servicePool];


            uint256[] storage _UnitSeconds
         = serviceServicePoolVoteSeconds[service][servicePool];
        _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay);
    }

    function _updateServicePoolData(
        address servicePool,
        uint256 amount,
        bool adding,
        uint256 currentDay
    ) internal {
        uint256[] storage _Days = servicePoolDays[servicePool];
        uint256[] storage _Amounts = servicePoolAmounts[servicePool];
        uint256[] storage _UnitSeconds = servicePoolVoteSeconds[servicePool];
        _update(_Days, _Amounts, _UnitSeconds, amount, adding, currentDay);
    }

    function _get(
        uint256[] memory _Days,
        uint256[] memory _Amounts,
        uint256[] memory _UnitSeconds,
        uint256 day
    )
        internal
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 len = _Days.length;
        if (len == 0) {
            return (day, 0, 0);
        }
        if (day < _Days[0]) {
            return (day, 0, 0);
        }
        uint256 lastIndex = len.sub(1);
        uint256 lastMinedDay = _Days[lastIndex];
        if (day == lastMinedDay) {
            return (day, _Amounts[lastIndex], _UnitSeconds[lastIndex]);
        } else if (day > lastMinedDay) {
            return (day, _Amounts[lastIndex], _Amounts[lastIndex].mul(1 days));
        }
        return _find(_Days, _Amounts, _UnitSeconds, day);
    }

    function _find(
        uint256[] memory _Days,
        uint256[] memory _Amounts,
        uint256[] memory _UnitSeconds,
        uint256 day
    )
        internal
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 left = 0;
        uint256 right = _Days.length.sub(1);
        uint256 middle = right.add(left).div(2);
        while (left < right) {
            if (_Days[middle] == day) {
                return (day, _Amounts[middle], _UnitSeconds[middle]);
            } else if (_Days[middle] > day) {
                if (middle > 0 && _Days[middle.sub(1)] < day) {
                    return (
                        day,
                        _Amounts[middle.sub(1)],
                        _Amounts[middle.sub(1)].mul(1 days)
                    );
                }
                if (middle == 0) {
                    return (day, 0, 0);
                }
                right = middle.sub(1);
            } else if (_Days[middle] < day) {
                if (
                    middle < _Days.length.sub(1) && _Days[middle.add(1)] > day
                ) {
                    return (
                        day,
                        _Amounts[middle],
                        _Amounts[middle].mul(1 days)
                    );
                }
                left = middle.add(1);
            }
            middle = right.add(left).div(2);
        }
        if (_Days[middle] != day) {
            return (day, 0, 0);
        } else {
            return (day, _Amounts[middle], _UnitSeconds[middle]);
        }
    }

    function _update(
        uint256[] storage _Days,
        uint256[] storage _Amounts,
        uint256[] storage _UnitSeconds,
        uint256 amount,
        bool adding,
        uint256 currentDay
    ) internal {
        uint256 len = _Days.length;
        uint256 secondsInADay = 1 days;
        uint256 secondsSinceStartOfDay = block.timestamp % secondsInADay;
        uint256 secondsUntilEndOfDay = secondsInADay.sub(
            secondsSinceStartOfDay
        );

        if (len == 0) {
            if (adding) {
                _Days.push(currentDay);
                _Amounts.push(amount);
                _UnitSeconds.push(amount.mul(secondsUntilEndOfDay));
            } else {
                require(false, "1: not enough mine");
            }
        } else {
            uint256 lastIndex = len.sub(1);
            uint256 lastMinedDay = _Days[lastIndex];
            uint256 lastMinedAmount = _Amounts[lastIndex];
            uint256 lastUnitSeconds = _UnitSeconds[lastIndex];

            uint256 newAmount;
            uint256 newUnitSeconds;

            if (lastMinedDay == currentDay) {
                if (adding) {
                    newAmount = lastMinedAmount.add(amount);
                    newUnitSeconds = lastUnitSeconds.add(
                        amount.mul(secondsUntilEndOfDay)
                    );
                } else {
                    require(lastMinedAmount >= amount, "2: not enough mine");
                    newAmount = lastMinedAmount.sub(amount);
                    newUnitSeconds = lastUnitSeconds.sub(
                        amount.mul(secondsUntilEndOfDay)
                    );
                }
                _Amounts[lastIndex] = newAmount;
                _UnitSeconds[lastIndex] = newUnitSeconds;
            } else {
                if (adding) {
                    newAmount = lastMinedAmount.add(amount);
                    newUnitSeconds = lastMinedAmount.mul(1 days).add(
                        amount.mul(secondsUntilEndOfDay)
                    );
                } else {
                    require(lastMinedAmount >= amount, "3: not enough mine");
                    newAmount = lastMinedAmount.sub(amount);
                    newUnitSeconds = lastMinedAmount.mul(1 days).sub(
                        amount.mul(secondsUntilEndOfDay)
                    );
                }
                _Days.push(currentDay);
                _Amounts.push(newAmount);
                _UnitSeconds.push(newUnitSeconds);
            }
        }
    }

    function _addVotes(address voter, uint96 amount) internal {
        require(voter != address(0), "zero address");
        balances[voter] = _add96(
            balances[voter],
            amount,
            "vote amount overflows"
        );
        _addDelegates(voter, amount);
        emit AddVotes(voter, amount);
    }

    function _subVotes(address voter, uint96 amount) internal {
        balances[voter] = _sub96(
            balances[voter],
            amount,
            "vote amount exceeds balance"
        );
        _subtactDelegates(voter, amount);
        emit SubVotes(voter, amount);
    }

    function _addDelegates(address staker, uint96 amount) internal {
        if (delegates[staker] == address(0)) {
            delegates[staker] = staker;
        }
        address currentDelegate = delegates[staker];
        _moveDelegates(address(0), currentDelegate, amount);
    }

    function _subtactDelegates(address staker, uint96 amount) internal {
        address currentDelegate = delegates[staker];
        _moveDelegates(currentDelegate, address(0), amount);
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint96 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;
        emit DelegateChanged(delegator, currentDelegate, delegatee);
        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint96 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint96 srcRepOld = srcRepNum > 0
                    ? checkpointsVotes[srcRep][srcRepNum - 1]
                    : 0;
                uint96 srcRepNew = _sub96(
                    srcRepOld,
                    amount,
                    "vote amount underflows"
                );
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }
            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint96 dstRepOld = dstRepNum > 0
                    ? checkpointsVotes[dstRep][dstRepNum - 1]
                    : 0;
                uint96 dstRepNew = _add96(
                    dstRepOld,
                    amount,
                    "vote amount overflows"
                );
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint96 oldVotes,
        uint96 newVotes
    ) internal {
        uint32 blockNumber = _safe32(
            block.number,
            "block number exceeds 32 bits"
        );
        if (
            nCheckpoints > 0 &&
            checkpointsFromBlock[delegatee][nCheckpoints - 1] == blockNumber
        ) {
            checkpointsVotes[delegatee][nCheckpoints - 1] = newVotes;
        } else {
            checkpointsFromBlock[delegatee][nCheckpoints] = blockNumber;
            checkpointsVotes[delegatee][nCheckpoints] = newVotes;
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function _safe32(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint32)
    {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function _safe96(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint96)
    {
        require(n < 2**96, errorMessage);
        return uint96(n);
    }

    function _add96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        uint96 c = a + b;
        require(c >= a, errorMessage);
        return c;
    }

    function _sub96(
        uint96 a,
        uint96 b,
        string memory errorMessage
    ) internal pure returns (uint96) {
        require(b <= a, errorMessage);
        return a - b;
    }

    function _getCurrentProposalVotes(address account)
        internal
        view
        returns (uint96)
    {
        uint32 nCheckpoints = numCheckpoints[account];
        return
            nCheckpoints > 0 ? checkpointsVotes[account][nCheckpoints - 1] : 0;
    }

    function _getAvailableServiceVotes(address account)
        internal
        view
        returns (uint96)
    {
        uint96 proposalVotes = _getCurrentProposalVotes(account);
        return
            proposalVotes == 0
                ? 0
                : proposalVotes -
                    _safe96(
                        voterVotesOut[account],
                        "voterVotesOut exceeds 96 bits"
                    );
    }

    function _voterServicePoolExists(address voter, address servicePool)
        internal
        view
        returns (bool)
    {
        for (uint256 i = 0; i < voterServicePools[voter].length; i++) {
            if (voterServicePools[voter][i] == servicePool) {
                return true;
            }
        }
        return false;
    }

    function _voterServicePoolServiceExists(
        address voter,
        address servicePool,
        address service
    ) internal view returns (bool) {
        for (
            uint256 i = 0;
            i < voterServicePoolServices[voter][servicePool].length;
            i++
        ) {
            if (voterServicePoolServices[voter][servicePool][i] == service) {
                return true;
            }
        }
        return false;
    }

    function _recallAllVotes(address voter) internal {
        uint256 currentDay = _getCurrentDay();
        for (uint256 i = 0; i < voterServicePools[voter].length; i++) {
            address servicePool = voterServicePools[voter][i];


                address[] memory services
             = voterServicePoolServices[voter][servicePool];
            for (uint256 j = 0; j < services.length; j++) {
                address service = services[j];
                (, uint256 amount, ) = _getVoterServicePoolServiceData(
                    voter,
                    servicePool,
                    service,
                    currentDay
                );
                _updateVoterServicePoolServiceData(
                    voter,
                    servicePool,
                    service,
                    amount,
                    false,
                    currentDay
                );
                _updateServiceServicePoolData(
                    service,
                    servicePool,
                    amount,
                    false,
                    currentDay
                );
                _updateServicePoolData(servicePool, amount, false, currentDay);
                voterVotesOut[voter] = voterVotesOut[voter].sub(amount);
            }
        }
    }

    function _serviceClaim(
        uint256 upToDay,
        address servicePool,
        address service,
        uint256 dayLastClaimedFor,
        uint256 vestingDays
    ) internal {
        uint256 rewards = _getServiceRewardsDue(
            upToDay,
            servicePool,
            service,
            dayLastClaimedFor,
            vestingDays
        );
        require(rewards > 0, "no rewards");
        serviceServicePoolDayLastClaimedFor[service][servicePool] = upToDay.sub(
            vestingDays
        );
        sbController.requestRewards(service, rewards);
        emit Claimed(service, rewards, _getCurrentDay());
    }

    function _getServiceRewardsDue(
        uint256 upToDay,
        address servicePool,
        address service,
        uint256 dayLastClaimedFor,
        uint256 vestingDays
    ) internal view returns (uint256) {
        uint256 rewards;
        for (
            uint256 day = dayLastClaimedFor.add(1);
            day <= upToDay.sub(vestingDays);
            day++
        ) {
            (, , uint256 servicePoolVoteSecondsForDay) = _getServicePoolData(
                servicePool,
                day
            );
            if (servicePoolVoteSecondsForDay == 0) {
                continue;
            }
            (, , uint256 serviceVoteSecondsForDay) = _getServiceServicePoolData(
                service,
                servicePool,
                day
            );
            uint256 availableRewards = sbController.getVoteReceiversRewards(
                day
            );
            uint256 amount = availableRewards.mul(serviceVoteSecondsForDay).div(
                servicePoolVoteSecondsForDay
            );
            rewards = rewards.add(amount);
        }
        return rewards;
    }

    function _voterClaim(
        uint256 upToDay,
        address voter,
        uint256 dayLastClaimedFor,
        uint256 vestingDays
    ) internal {
        uint256 rewards = _getVoterRewardsDue(
            upToDay,
            voter,
            dayLastClaimedFor,
            vestingDays
        );
        require(rewards > 0, "no rewards");
        voterDayLastClaimedFor[voter] = upToDay.sub(vestingDays);
        sbController.requestRewards(voter, rewards);
        emit Claimed(voter, rewards, _getCurrentDay());
    }

    function _getVoterRewardsDue(
        uint256 upToDay,
        address voter,
        uint256 dayLastClaimedFor,
        uint256 vestingDays
    ) internal view returns (uint256) {
        uint256 rewards;
        address[] memory servicePools = voterServicePools[voter];
        for (
            uint256 day = dayLastClaimedFor.add(1);
            day <= upToDay.sub(vestingDays);
            day++
        ) {
            for (uint256 i = 0; i < servicePools.length; i++) {
                address servicePool = servicePools[i];
                (
                    ,
                    ,
                    uint256 servicePoolVoteSecondsForDay
                ) = _getServicePoolData(servicePool, day);
                if (servicePoolVoteSecondsForDay == 0) {
                    continue;
                }


                    address[] memory services
                 = voterServicePoolServices[voter][servicePool];
                uint256 voterServicePoolVoteSecondsForDay;
                for (uint256 j = 0; j < services.length; j++) {
                    address service = services[j];
                    (
                        ,
                        ,
                        uint256 voterVoteSeconds
                    ) = _getVoterServicePoolServiceData(
                        voter,
                        servicePool,
                        service,
                        day
                    );
                    voterServicePoolVoteSecondsForDay = voterServicePoolVoteSecondsForDay
                        .add(voterVoteSeconds);
                }
                uint256 availableRewards = sbController.getVoteCastersRewards(
                    day
                );
                uint256 amount = availableRewards
                    .mul(voterServicePoolVoteSecondsForDay)
                    .div(servicePoolVoteSecondsForDay);
                rewards = rewards.add(amount);
            }
        }
        return rewards;
    }

    function _getCurrentDay() internal view returns (uint256) {
        return block.timestamp.div(1 days).add(1);
    }

    function _deleteArrayElement(uint256 index, address[] storage array)
        internal
    {
        if (index == array.length.sub(1)) {
            array.pop();
        } else {
            array[index] = array[array.length.sub(1)];
            array.pop();
        }
    }

    function _findIndexOfAddress(address[] memory array, address element)
        internal
        pure
        returns (uint256)
    {
        uint256 index;
        for (uint256 i = 0; i < array.length; i++) {
            if (array[i] == element) {
                index = i;
            }
        }
        return index;
    }

    function _getVoterFirstDay(address voter) internal view returns (uint256) {
        uint256 firstDay = 0;
        for (uint256 i = 0; i < voterServicePools[voter].length; i++) {
            address servicePool = voterServicePools[voter][i];
            for (
                uint256 j = 0;
                j < voterServicePoolServices[voter][servicePool].length;
                j++
            ) {

                    address service
                 = voterServicePoolServices[voter][servicePool][j];
                if (
                    voterServicePoolServiceDays[voter][servicePool][service]
                        .length != 0
                ) {
                    if (firstDay == 0) {
                        firstDay = voterServicePoolServiceDays[voter][servicePool][service][0];
                    } else if (
                        voterServicePoolServiceDays[voter][servicePool][service][0] <
                        firstDay
                    ) {
                        firstDay = voterServicePoolServiceDays[voter][servicePool][service][0];
                    }
                }
            }
        }
        return firstDay;
    }
}

File 2 of 5: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 3 of 5: sbControllerInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

interface sbControllerInterface {
  function requestRewards(address miner, uint256 amount) external;

  function isValuePoolAccepted(address valuePool) external view returns (bool);

  function getValuePoolRewards(address valuePool, uint256 day) external view returns (uint256);

  function getValuePoolMiningFee(address valuePool) external returns (uint256, uint256);

  function getValuePoolUnminingFee(address valuePool) external returns (uint256, uint256);

  function getValuePoolClaimingFee(address valuePool) external returns (uint256, uint256);

  function isServicePoolAccepted(address servicePool) external view returns (bool);

  function getServicePoolRewards(address servicePool, uint256 day) external view returns (uint256);

  function getServicePoolClaimingFee(address servicePool) external returns (uint256, uint256);

  function getServicePoolRequestFeeInWei(address servicePool) external returns (uint256);

  function getVoteForServicePoolsCount() external view returns (uint256);

  function getVoteForServicesCount() external view returns (uint256);

  function getVoteCastersRewards(uint256 dayNumber) external view returns (uint256);

  function getVoteReceiversRewards(uint256 dayNumber) external view returns (uint256);

  function getMinerMinMineDays() external view returns (uint256);

  function getServiceMinMineDays() external view returns (uint256);

  function getMinerMinMineAmountInWei() external view returns (uint256);

  function getServiceMinMineAmountInWei() external view returns (uint256);

  function getValuePoolVestingDays(address valuePool) external view returns (uint256);

  function getServicePoolVestingDays(address poservicePoolol) external view returns (uint256);

  function getVoteCasterVestingDays() external view returns (uint256);

  function getVoteReceiverVestingDays() external view returns (uint256);
}

File 4 of 5: sbGenericServicePoolInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

interface sbGenericServicePoolInterface {
  function isServiceAccepted(address service) external view returns (bool);
}

File 5 of 5: sbStrongValuePoolInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

interface sbStrongValuePoolInterface {
  function mineFor(address miner, uint256 amount) external;

  function getMinerMineData(address miner, uint256 day)
    external
    view
    returns (
      uint256,
      uint256,
      uint256
    );

  function getMineData(uint256 day)
    external
    view
    returns (
      uint256,
      uint256,
      uint256
    );

  function serviceMinMined(address miner) external view returns (bool);

  function minerMinMined(address miner) external view returns (bool);
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"address","name":"community","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"ServiceDropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SubVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"address","name":"community","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"VoteRecalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"address","name":"community","type":"address"},{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"}],"name":"Voted","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpointsFromBlock","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpointsVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"}],"name":"dropService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAvailableServiceVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentProposalVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"getDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorProposalVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"}],"name":"getServiceDayLastClaimedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"uint256","name":"dayNumber","type":"uint256"}],"name":"getServicePoolData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"}],"name":"getServiceRewardsDueAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getServiceRewardsDueUpTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"service","type":"address"},{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"uint256","name":"dayNumber","type":"uint256"}],"name":"getServiceServicePoolData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterDayLastClaimedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterRewardsDueAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterRewardsDueUpTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"dayNumber","type":"uint256"}],"name":"getVoterServicePoolServiceData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"address","name":"servicePool","type":"address"}],"name":"getVoterServicePoolServices","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sbControllerAddress","type":"address"},{"internalType":"address","name":"sbStrongValuePoolAddress","type":"address"},{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"address","name":"superAdminAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingSuperAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recallAllVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recallVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sbController","outputs":[{"internalType":"contract sbControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sbGenericServicePool","outputs":[{"internalType":"contract sbGenericServicePoolInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sbStrongValuePool","outputs":[{"internalType":"contract sbStrongValuePoolInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"}],"name":"serviceClaimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"serviceClaimUpTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"bool","name":"adding","type":"bool"}],"name":"updateVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"servicePool","type":"address"},{"internalType":"address","name":"service","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voterClaimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"voterClaimUpTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061570b80620000216000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80636fcfff4511610130578063aa40f500116100b8578063ee3e7cd61161007c578063ee3e7cd61461079d578063efa5d431146107d9578063f0d78bf51461080f578063f851a44014610835578063fed0a20e1461083d57610232565b8063aa40f500146106f8578063ab15158a1461071e578063b46377a01461074c578063b5e3ee5014610754578063d32028301461077157610232565b8063879ed33e116100ff578063879ed33e1461060e5780638f288a0914610644578063916c435f146106725780639fb9ec111461069e578063a73e935a146106d257610232565b80636fcfff451461051857806371f7350f1461053e5780637dc8ff3f146105645780638285c7d8146105e257610232565b8063375b4cd4116101be578063544d856411610182578063544d856414610478578063587cde1e1461049e5780635c19a95c146104c457806365a4840d146104ea5780636a33bc13146104f257610232565b8063375b4cd41461039d5780633c77d503146103e857806348028d6314610432578063481e1c3e1461043a57806353bfcd1b1461044257610232565b80632678224711610205578063267822471461032957806327e235e31461033157806329575f6a146103575780632fa41caf1461035f578063360358be1461036757610232565b806306552ff314610237578063090dbba1146102775780630d65d00a146102b757806315ed0514146102db575b600080fd5b6102756004803603608081101561024d57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516610859565b005b6102a56004803603604081101561028d57600080fd5b506001600160a01b0381358116916020013516610903565b60408051918252519081900360200190f35b6102bf6109eb565b604080516001600160a01b039092168252519081900360200190f35b61030d600480360360408110156102f157600080fd5b5080356001600160a01b0316906020013563ffffffff166109fa565b604080516001600160601b039092168252519081900360200190f35b6102bf610a20565b61030d6004803603602081101561034757600080fd5b50356001600160a01b0316610a2f565b6102bf610a4a565b6102bf610a59565b6102756004803603606081101561037d57600080fd5b506001600160a01b03813581169160208101359091169060400135610a68565b6103cf600480360360408110156103b357600080fd5b5080356001600160a01b0316906020013563ffffffff16610d84565b6040805163ffffffff9092168252519081900360200190f35b610414600480360360408110156103fe57600080fd5b506001600160a01b038135169060200135610da7565b60408051938452602084019290925282820152519081900360600190f35b6102bf610edf565b6102bf610eee565b6102a56004803603606081101561045857600080fd5b506001600160a01b03813581169160208101359091169060400135610efd565b6102bf6004803603602081101561048e57600080fd5b50356001600160a01b0316611190565b6102bf600480360360208110156104b457600080fd5b50356001600160a01b03166111b1565b610275600480360360208110156104da57600080fd5b50356001600160a01b03166111cc565b6102756111d9565b6102a56004803603602081101561050857600080fd5b50356001600160a01b0316611346565b6103cf6004803603602081101561052e57600080fd5b50356001600160a01b03166113ae565b6102756004803603602081101561055457600080fd5b50356001600160a01b03166113c6565b6105926004803603604081101561057a57600080fd5b506001600160a01b038135811691602001351661166a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105ce5781810151838201526020016105b6565b505050509050019250505060405180910390f35b610275600480360360408110156105f857600080fd5b506001600160a01b0381351690602001356117ba565b6104146004803603606081101561062457600080fd5b506001600160a01b03813581169160208101359091169060400135611a93565b6102756004803603604081101561065a57600080fd5b506001600160a01b0381358116916020013516611c8a565b61030d6004803603604081101561068857600080fd5b506001600160a01b0381351690602001356120c3565b610275600480360360608110156106b457600080fd5b506001600160a01b03813516906020810135906040013515156122da565b61030d600480360360208110156106e857600080fd5b50356001600160a01b031661245c565b61030d6004803603602081101561070e57600080fd5b50356001600160a01b0316612467565b6102a56004803603604081101561073457600080fd5b506001600160a01b0381358116916020013516612472565b6102756126c8565b6102756004803603602081101561076a57600080fd5b5035612723565b6102a56004803603604081101561078757600080fd5b50803590602001356001600160a01b03166128c9565b610414600480360360808110156107b357600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135612a2b565b610275600480360360608110156107ef57600080fd5b506001600160a01b03813581169160208101359091169060400135612c42565b6102a56004803603602081101561082557600080fd5b50356001600160a01b0316613218565b6102bf613334565b610845613348565b604080519115158252519081900360200190f35b60005460ff161561089d576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b039687161790915560068054821694861694909417909355600080546002805490951692861692909217909355610100600160a81b03191661010091909316029190911760ff19166001179055565b6001600160a01b03808216600090815260136020908152604080832093861683529290529081205480156109df576001600160a01b0380841660009081526016602090815260408083209388168352929052205415610987576001600160a01b038084166000908152601660209081526040808320938816835292905220546109d7565b6001600160a01b038084166000908152601360209081526040808320938816835292905290812080546109d792600192916109be57fe5b906000526020600020015461335190919063ffffffff16565b9150506109e5565b60009150505b92915050565b6004546001600160a01b031681565b600a6020908152600092835260408084209091529082529020546001600160601b031681565b6001546001600160a01b031681565b6007602052600090815260409020546001600160601b031681565b6002546001600160a01b031681565b6006546001600160a01b031681565b60008111610aa6576040805162461bcd60e51b815260206004808301919091526024820152637a65726f60e01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d6020811015610b3257600080fd5b5051610b73576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610bc057600080fd5b505afa158015610bd4573d6000803e3d6000fd5b505050506040513d6020811015610bea57600080fd5b5051610c2f576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b610c3a338484613393565b610c77576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b604482015290519081900360640190fd5b6000610c81613432565b90506000610c9133868685613451565b5091505082811015610cdd576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b610cec338686866000876135f3565b610cfa848685600086613676565b610d0785846000856136db565b33600090815260126020526040902054610d219084613351565b336000818152601260209081526040918290209390935580516001600160a01b03898116825293810187905281518694891693927f1bf72c5c42c48c4dc9c15fe6c006bdaccffcb75f592ff06ab4f54bde7dc23d1f928290030190a45050505050565b600960209081526000928352604080842090915290825290205463ffffffff1681565b60008080808415610db85784610dc0565b610dc0613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d6020811015610e3c57600080fd5b5051610e7d576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b610e85613432565b811115610ec7576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b610ed1868261371b565b935093509350509250925092565b6003546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b03808316600090815260136020908152604080832093871683529290529081205480610f34576000915050611189565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d6020811015610fc057600080fd5b5051611001576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b611009613432565b83111561104b576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6001600160a01b038085166000908152601660209081526040808320938916835292905290812054156110a3576001600160a01b038086166000908152601660209081526040808320938a16835292905220546110da565b6001600160a01b038086166000908152601360209081526040808320938a16835292905290812080546110da92600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d602081101561115657600080fd5b505190506111648282613878565b85116111765760009350505050611189565b61118385888885856138d2565b93505050505b9392505050565b6001600160a01b03808216600090815260086020526040902054165b919050565b6008602052600090815260409020546001600160a01b031681565b6111d633826139d6565b50565b3360009081526011602052604081205461124a5760006111f833613a5a565b905080611237576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b611242816001613351565b91505061125c565b50336000908152601160205260409020545b6000611266613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b857600080fd5b505afa1580156112cc573d6000803e3d6000fd5b505050506040513d60208110156112e257600080fd5b505190506112f08382613878565b8211611335576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134182338584613c61565b505050565b6001600160a01b03811660009081526011602052604081205461139257600061136e83613a5a565b90508061137f5760009150506111ac565b61138a816001613351565b9150506111ac565b506001600160a01b031660009081526011602052604090205490565b600b6020526000908152604090205463ffffffff1681565b3360009081526013602090815260408083206001600160a01b038516845290915290205480611427576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561148957600080fd5b505afa15801561149d573d6000803e3d6000fd5b505050506040513d60208110156114b357600080fd5b50516114f4576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b60006114fe613432565b3360009081526016602090815260408083206001600160a01b03881684529091528120549192509015611554573360009081526016602090815260408083206001600160a01b0388168452909152902054611587565b3360009081526013602090815260408083206001600160a01b03881684529091528120805461158792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d957600080fd5b505afa1580156115ed573d6000803e3d6000fd5b505050506040513d602081101561160357600080fd5b505190506116118282613878565b8311611656576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638386338585613d89565b5050505050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156116ce57600080fd5b505afa1580156116e2573d6000803e3d6000fd5b505050506040513d60208110156116f857600080fd5b5051611739576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d60209081526040808320938616835292815290829020805483518184028101840190945280845290918301828280156117ad57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161178f575b5050505050905092915050565b3360009081526013602090815260408083206001600160a01b03861684529091529020548061181b576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561187d57600080fd5b505afa158015611891573d6000803e3d6000fd5b505050506040513d60208110156118a757600080fd5b50516118e8576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6118f0613432565b821115611932576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b3360009081526016602090815260408083206001600160a01b038716845290915281205415611984573360009081526016602090815260408083206001600160a01b03881684529091529020546119b7565b3360009081526013602090815260408083206001600160a01b0388168452909152812080546119b792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d6020811015611a3357600080fd5b50519050611a418282613878565b8411611a86576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638486338585613d89565b60008080808415611aa45784611aac565b611aac613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d6020811015611b2857600080fd5b5051611b69576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b856001600160a01b031663c84ad2c7886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bb657600080fd5b505afa158015611bca573d6000803e3d6000fd5b505050506040513d6020811015611be057600080fd5b5051611c25576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611c2d613432565b811115611c6f576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b611c7a878783613ec0565b9350935093505093509350939050565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611cec57600080fd5b505afa158015611d00573d6000803e3d6000fd5b505050506040513d6020811015611d1657600080fd5b5051611d57576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b816001600160a01b031663c84ad2c7826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611da457600080fd5b505afa158015611db8573d6000803e3d6000fd5b505050506040513d6020811015611dce57600080fd5b5051611e13576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611e1d3383614043565b611e5d576040805162461bcd60e51b815260206004820152600c60248201526b0c8e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b611e68338383613393565b611ea8576040805162461bcd60e51b815260206004820152600c60248201526b0c4e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b6000611eb2613432565b90506000611ec233858585613451565b50915050611ed5338585846000876135f3565b611ee3838583600086613676565b611ef084826000856136db565b33600090815260126020526040902054611f0a9082613351565b33600090815260126020908152604080832093909355600d81528282206001600160a01b0388168352815282822080548451818402810184019095528085529293611f95939092830182828015611f8a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f6c575b5050505050856140c7565b336000908152600d602090815260408083206001600160a01b038a1684529091529020909150611fc6908290614117565b336000908152600d602090815260408083206001600160a01b038916845290915290205461207857336000908152600c6020908152604080832080548251818502810185019093528083526120599383018282801561204e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612030575b5050505050876140c7565b336000908152600c60205260409020909150612076908290614117565b505b604080516001600160a01b0387811682529151859287169133917f194c3721f48fdddc9ef3098668929b634be03db0fb5eead343224e62a343ba069181900360200190a45050505050565b600043821061210e576040805162461bcd60e51b81526020600482015260126024820152711b9bdd081e595d0819195d195c9b5a5b995960721b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205463ffffffff168061213c5760009150506109e5565b6001600160a01b038416600090815260096020908152604080832063ffffffff6000198601811685529252909120541683106121b1576001600160a01b0384166000908152600a602090815260408083206000199490940163ffffffff16835292905220546001600160601b031690506109e5565b6001600160a01b038416600090815260096020908152604080832083805290915290205463ffffffff168310156121ec5760009150506109e5565b600060001982015b8163ffffffff168163ffffffff16111561229d576001600160a01b0386166000818152600960209081526040808320600263ffffffff888803811691909104870380821680875292855283862054968652600a855283862092865291909352922054919216906001600160601b0316878214156122785795506109e5945050505050565b878263ffffffff16101561228e57829450612295565b6001830393505b5050506121f4565b506001600160a01b0385166000908152600a6020908152604080832063ffffffff909416835292905220546001600160601b031691505092915050565b6006546001600160a01b03163314612331576040805162461bcd60e51b81526020600482015260156024820152741b9bdd081cd894dd1c9bdb99d5985b1d59541bdbdb605a1b604482015290519081900360640190fd5b600061236b8360405180604001604052806016815260200175616d6f756e742065786365656473203936206269747360501b8152506141fe565b905081156123825761237d8482614298565b612456565b6001600160a01b03808516600081815260086020526040902054909116146123e9576040805162461bcd60e51b815260206004820152601560248201527436bab9ba103232b632b3b0ba32903a379039b2b63360591b604482015290519081900360640190fd5b806001600160601b03166123fc856143ce565b6001600160601b0316101561244c576040805162461bcd60e51b81526020600482015260116024820152706d75737420726563616c6c20766f74657360781b604482015290519081900360640190fd5b612456848261445f565b50505050565b60006109e5826143ce565b60006109e582614553565b6001600160a01b038082166000908152601360209081526040808320938616835292905290812054806124a95760009150506109e5565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561250b57600080fd5b505afa15801561251f573d6000803e3d6000fd5b505050506040513d602081101561253557600080fd5b5051612576576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6000612580613432565b6001600160a01b038086166000908152601660209081526040808320938a1683529290529081205491925090156125dc576001600160a01b038086166000908152601660209081526040808320938a1683529290522054612613565b6001600160a01b038086166000908152601360209081526040808320938a168352929052908120805461261392600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d602081101561268f57600080fd5b5051905061269d8282613878565b83116126b05760009450505050506109e5565b6126bd83888885856138d2565b979650505050505050565b33600090815260126020526040902054612718576040805162461bcd60e51b815260206004820152600c60248201526b1b9bc81d9bdd195cc81bdd5d60a21b604482015290519081900360640190fd5b612721336145bd565b565b3360009081526011602052604081205461279457600061274233613a5a565b905080612781576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b61278c816001613351565b9150506127a6565b50336000908152601160205260409020545b6127ae613432565b8211156127f0576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561284057600080fd5b505afa158015612854573d6000803e3d6000fd5b505050506040513d602081101561286a57600080fd5b505190506128788282613878565b83116128bd576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134183338484613c61565b6001600160a01b03811660009081526011602052604081205481906129185760006128f384613a5a565b905080612905576000925050506109e5565b612910816001613351565b915050612933565b506001600160a01b0382166000908152601160205260409020545b61293b613432565b84111561297d576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50519050612a058282613878565b8511612a16576000925050506109e5565b612a228585848461474f565b95945050505050565b60008080808415612a3c5784612a44565b612a44613432565b6004805460408051630428867160e11b81526001600160a01b038c81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015612a9657600080fd5b505afa158015612aaa573d6000803e3d6000fd5b505050506040513d6020811015612ac057600080fd5b5051612b01576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b866001600160a01b031663c84ad2c7876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612b4e57600080fd5b505afa158015612b62573d6000803e3d6000fd5b505050506040513d6020811015612b7857600080fd5b5051612bbd576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b612bc8888888613393565b612bda57925060009150819050612c38565b612be2613432565b811115612c24576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b612c3088888884613451565b935093509350505b9450945094915050565b60008111612c81576040805162461bcd60e51b8152602060048201526007602482015266313a207a65726f60c81b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ce357600080fd5b505afa158015612cf7573d6000803e3d6000fd5b505050506040513d6020811015612d0d57600080fd5b5051612d4e576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d9b57600080fd5b505afa158015612daf573d6000803e3d6000fd5b505050506040513d6020811015612dc557600080fd5b5051612e0a576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b600654604080516376d53d6160e01b81526001600160a01b038581166004830152915191909216916376d53d61916024808301926020929190829003018186803b158015612e5757600080fd5b505afa158015612e6b573d6000803e3d6000fd5b505050506040513d6020811015612e8157600080fd5b5051612ec4576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081b5a5b881b5a5b9959609a1b604482015290519081900360640190fd5b80612ece336143ce565b6001600160601b03161015612f1d576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b612f28338484613393565b613055576004805460408051636031257f60e11b815290516001600160a01b039092169263c0624afe928282019260209290829003018186803b158015612f6e57600080fd5b505afa158015612f82573d6000803e3d6000fd5b505050506040513d6020811015612f9857600080fd5b5051336000908152600d602090815260408083206001600160a01b0388168452909152902054612fc9906001613878565b111561300a576040805162461bcd60e51b815260206004820152600b60248201526a313a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600d602090815260408083206001600160a01b0387811685529083529083208054600181018255908452919092200180546001600160a01b0319169184169190911790555b61305f3384614043565b6131665760048054604080516311d9d79360e21b815290516001600160a01b03909216926347675e4c928282019260209290829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60208110156130cf57600080fd5b5051336000908152600c60205260409020546130ec906001613878565b111561312d576040805162461bcd60e51b815260206004820152600b60248201526a323a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600c602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b6000613170613432565b9050613181338585856001866135f3565b61318f838584600185613676565b61319c84836001846136db565b336000908152601260205260409020546131b69083613878565b336000818152601260209081526040918290209390935580516001600160a01b03888116825293810186905281518594881693927ffac22e5ca1ad9c0e062e405d23fa971f266026b08a9339450a055b848ba742a1928290030190a450505050565b6001600160a01b038116600090815260116020526040812054819061326757600061324284613a5a565b905080613254576000925050506111ac565b61325f816001613351565b915050613282565b506001600160a01b0382166000908152601160205260409020545b600061328c613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132de57600080fd5b505afa1580156132f2573d6000803e3d6000fd5b505050506040513d602081101561330857600080fd5b505190506133168382613878565b821161332857600093505050506111ac565b612a228286858461474f565b60005461010090046001600160a01b031681565b60005460ff1681565b600061118983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506149ba565b6000805b6001600160a01b038086166000908152600d6020908152604080832093881683529290522054811015613427576001600160a01b038581166000908152600d6020908152604080832088851684529091529020805491851691839081106133fa57fe5b6000918252602090912001546001600160a01b0316141561341f576001915050611189565b600101613397565b506000949350505050565b600061344c60016134464262015180614a14565b90613878565b905090565b6001600160a01b038085166000908152600e60209081526040808320878516845282528083209386168352928152828220805484518184028101840190955280855292938493849360609391908301828280156134cd57602002820191906000526020600020905b8154815260200190600101908083116134b9575b5050506001600160a01b03808c166000908152600f602090815260408083208e851684528252808320938d168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561354d57602002820191906000526020600020905b815481526020019060010190808311613539575b5050506001600160a01b03808d1660009081526010602090815260408083208f851684528252808320938e16835292815290829020805483518184028101840190945280845295965060609592945092508301828280156135cd57602002820191906000526020600020905b8154815260200190600101908083116135b9575b505050505090506135e08383838a614a56565b9550955095505050509450945094915050565b6001600160a01b038087166000818152600e602090815260408083208a8616808552908352818420958a16808552958352818420858552600f8452828520828652845282852087865284528285209585526010845282852091855290835281842095845294909152902061366b838383898989614b66565b505050505050505050565b6001600160a01b038086166000818152601360209081526040808320948916808452948252808320848452601483528184208685528352818420948452601583528184209584529490915290206136d1838383898989614b66565b5050505050505050565b6001600160a01b03841660009081526017602090815260408083206018835281842060199093529220613712838383898989614b66565b50505050505050565b6001600160a01b03821660009081526017602090815260408083208054825181850281018501909352808352849384936060939092909183018282801561378157602002820191906000526020600020905b81548152602001906001019080831161376d575b5050506001600160a01b038916600090815260186020908152604091829020805483518184028101840190945280845295965060609592945092508301828280156137eb57602002820191906000526020600020905b8154815260200190600101908083116137d7575b5050506001600160a01b038a166000908152601960209081526040918290208054835181840281018401909452808452959650606095929450925083018282801561385557602002820191906000526020600020905b815481526020019060010190808311613841575b505050505090506138688383838a614a56565b9550955095505050509250925092565b600082820183811015611189576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080806138e1856001613878565b90505b6138ee8885613351565b81116139cb576000613900888361371b565b925050508061390f57506139c3565b600061391c888a85613ec0565b60048054604080516319ce94a160e31b815292830189905251929550600094506001600160a01b0316925063ce74a508916024808301926020929190829003018186803b15801561396c57600080fd5b505afa158015613980573d6000803e3d6000fd5b505050506040513d602081101561399657600080fd5b5051905060006139b0846139aa8486614e97565b90614a14565b90506139bc8682613878565b9550505050505b6001016138e4565b509695505050505050565b6001600160a01b03808316600081815260086020818152604080842080546007845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612456828483614ef0565b600080805b6001600160a01b0384166000908152600c6020526040902054811015613c5a576001600160a01b0384166000908152600c60205260408120805483908110613aa357fe5b60009182526020822001546001600160a01b031691505b6001600160a01b038087166000908152600d6020908152604080832093861683529290522054811015613c50576001600160a01b038087166000908152600d602090815260408083209386168352929052908120805483908110613b1a57fe5b60009182526020808320909101546001600160a01b038a81168452600e83526040808520888316865284528085209190921680855292529091205490915015613c475784613bb0576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613b9e57fe5b90600052602060002001549450613c47565b6001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054879290613bec57fe5b90600052602060002001541015613c47576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613c3957fe5b906000526020600020015494505b50600101613aba565b5050600101613a5f565b5092915050565b6000613c6f8585858561474f565b905060008111613cb3576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613cbd8583613351565b6001600160a01b0380861660008181526011602052604080822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613d2357600080fd5b505af1158015613d37573d6000803e3d6000fd5b50505050613d43613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a35050505050565b6000613d9886868686866138d2565b905060008111613ddc576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613de68683613351565b6001600160a01b0380861660008181526016602090815260408083208b8616845290915280822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613e5957600080fd5b505af1158015613e6d573d6000803e3d6000fd5b50505050613e79613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a3505050505050565b6001600160a01b038084166000908152601360209081526040808320938616835292815282822080548451818402810184019095528085529293849384936060939190830182828015613f3257602002820191906000526020600020905b815481526020019060010190808311613f1e575b5050506001600160a01b03808b166000908152601460209081526040808320938d1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015613fa857602002820191906000526020600020905b815481526020019060010190808311613f94575b5050506001600160a01b03808c166000908152601560209081526040808320938e168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561401e57602002820191906000526020600020905b81548152602001906001019080831161400a575b505050505090506140318383838a614a56565b95509550955050505093509350939050565b6000805b6001600160a01b0384166000908152600c60205260409020548110156140bd576001600160a01b038481166000908152600c602052604090208054918516918390811061409057fe5b6000918252602090912001546001600160a01b031614156140b55760019150506109e5565b600101614047565b5060009392505050565b60008060005b845181101561410f57836001600160a01b03168582815181106140ec57fe5b60200260200101516001600160a01b03161415614107578091505b6001016140cd565b509392505050565b8054614124906001613351565b82141561415c578080548061413557fe5b600082815260209020810160001990810180546001600160a01b03191690550190556141fa565b8054819061416b906001613351565b8154811061417557fe5b9060005260206000200160009054906101000a90046001600160a01b031681838154811061419f57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550808054806141d757fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b5050565b600081600160601b84106142905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561425557818101518382015260200161423d565b50505050905090810190601f1680156142825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509192915050565b6001600160a01b0382166142e2576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b6001600160a01b0382166000908152600760209081526040918290205482518084019093526015835274766f746520616d6f756e74206f766572666c6f777360581b91830191909152614342916001600160601b039091169083906150a7565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b03929092169190911790556143828282615111565b604080516001600160601b038316815290516001600160a01b038416917fbb104626c67690cd9023bde19b0804077126d78eb9bc3eb35de512eda655a311919081900360200190a25050565b6000806143da83614553565b90506001600160601b038116156144565761444f60126000856001600160a01b03166001600160a01b03168152602001908152602001600020546040518060400160405280601d81526020017f766f746572566f7465734f7574206578636565647320393620626974730000008152506141fe565b8103611189565b60009392505050565b6001600160a01b038216600090815260076020908152604091829020548251808401909352601b83527f766f746520616d6f756e7420657863656564732062616c616e63650000000000918301919091526144c7916001600160601b03909116908390615183565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b039290921691909117905561450782826151e8565b604080516001600160601b038316815290516001600160a01b038416917f40b10d9892192657ad11f6c742381c432b492799468ace10b6ffb5842e34b024919081900360200190a25050565b6001600160a01b0381166000908152600b602052604081205463ffffffff168061457e576000611189565b6001600160a01b0383166000908152600a6020908152604080832063ffffffff60001986011684529091529020546001600160601b0316915050919050565b60006145c7613432565b905060005b6001600160a01b0383166000908152600c6020526040902054811015611341576001600160a01b0383166000908152600c6020526040812080548390811061461057fe5b60009182526020808320909101546001600160a01b038781168452600d8352604080852091909216808552908352928190208054825181850281018501909352808352939450606093919290919083018282801561469757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614679575b5050505050905060005b81518110156147445760008282815181106146b857fe5b6020026020010151905060006146d08886848a613451565b509150506146e38886848460008c6135f3565b6146f182868360008b613676565b6146fe858260008a6136db565b6001600160a01b0388166000908152601260205260409020546147219082613351565b6001600160a01b03891660009081526012602052604090205550506001016146a1565b5050506001016145cc565b6001600160a01b0383166000908152600c60209081526040808320805482518185028101850190935280835284936060939291908301828280156147bc57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161479e575b5050505050905060006147d960018761387890919063ffffffff16565b90505b6147e68886613351565b81116149ae5760005b82518110156149a557600083828151811061480657fe5b60200260200101519050600061481c828561371b565b925050508061482c57505061499d565b6001600160a01b03808b166000908152600d602090815260408083209386168352928152908290208054835181840281018401909452808452606093928301828280156148a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614884575b50505050509050600080600090505b82518110156148fc5760008382815181106148c857fe5b6020026020010151905060006148e08f88848c613451565b92506148f0915085905082613878565b935050506001016148b1565b506004805460408051631900020960e21b8152928301899052516000926001600160a01b03909216916364000824916024808301926020929190829003018186803b15801561494a57600080fd5b505afa15801561495e573d6000803e3d6000fd5b505050506040513d602081101561497457600080fd5b505190506000614988856139aa8486614e97565b90506149948a82613878565b99505050505050505b6001016147ef565b506001016147dc565b50909695505050505050565b60008184841115614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b505050900390565b600061118983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615212565b83516000908190819080614a74578460008093509350935050612c38565b87600081518110614a8157fe5b6020026020010151851015614aa0578460008093509350935050612c38565b6000614aad826001613351565b90506000898281518110614abd57fe5b6020026020010151905080871415614b065786898381518110614adc57fe5b6020026020010151898481518110614af057fe5b6020026020010151955095509550505050612c38565b80871115614b5a5786898381518110614b1b57fe5b6020026020010151614b4c620151808c8681518110614b3657fe5b6020026020010151614e9790919063ffffffff16565b955095509550505050612c38565b6135e08a8a8a8a615277565b855462015180428190066000614b7c8383613351565b905083614c21578515614bda57895460018181018c5560008c815260208082209093018890558b549182018c558b8152919091200187905587614bbf8883614e97565b81546001810183556000928352602090922090910155614c1c565b6040805162461bcd60e51b8152602060048201526012602482015271313a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614e8b565b6000614c2e856001613351565b905060008b8281548110614c3e57fe5b9060005260206000200154905060008b8381548110614c5957fe5b9060005260206000200154905060008b8481548110614c7457fe5b906000526020600020015490506000808a851415614d5f578b15614cb957614c9c848e613878565b9150614cb2614cab8e89614e97565b8490613878565b9050614d26565b8c841015614d03576040805162461bcd60e51b8152602060048201526012602482015271323a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614d0d848e613351565b9150614d23614d1c8e89614e97565b8490613351565b90505b818f8781548110614d3357fe5b9060005260206000200181905550808e8781548110614d4e57fe5b600091825260209091200155614e84565b8b15614d9257614d6f848e613878565b9150614d8b614d7e8e89614e97565b6134468662015180614e97565b9050614e0b565b8c841015614ddc576040805162461bcd60e51b8152602060048201526012602482015271333a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614de6848e613351565b9150614e08614df58e89614e97565b614e028662015180614e97565b90613351565b90505b8f8b90806001815401808255809150506001900390600052602060002001600090919091909150558e8290806001815401808255809150506001900390600052602060002001600090919091909150558d8190806001815401808255809150506001900390600052602060002001600090919091909150555b5050505050505b50505050505050505050565b600082614ea6575060006109e5565b82820282848281614eb357fe5b04146111895760405162461bcd60e51b81526004018080602001828103825260218152602001806156b56021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b031614158015614f1b57506000816001600160601b0316115b15611341576001600160a01b03831615614fe2576001600160a01b0383166000908152600b602052604081205463ffffffff169081614f5b576000614f93565b6001600160a01b0385166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000614fd0828560405180604001604052806016815260200175766f746520616d6f756e7420756e646572666c6f777360501b815250615183565b9050614fde86848484615488565b5050505b6001600160a01b03821615611341576001600160a01b0382166000908152600b602052604081205463ffffffff16908161501d576000615055565b6001600160a01b0384166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000615091828560405180604001604052806015815260200174766f746520616d6f756e74206f766572666c6f777360581b8152506150a7565b905061509f85848484615488565b505050505050565b6000838301826001600160601b0380871690831610156151085760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50949350505050565b6001600160a01b038281166000908152600860205260409020541661515a576001600160a01b038216600081815260086020526040902080546001600160a01b03191690911790555b6001600160a01b0380831660009081526008602052604081205490911690611341908284614ef0565b6000836001600160601b0316836001600160601b031611158290614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b6001600160a01b038083166000908152600860205260408120549091169061134190829084614ef0565b600081836152615760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50600083858161526d57fe5b0495945050505050565b60008060008060009050600061529860018a5161335190919063ffffffff16565b905060006152ab60026139aa8486613878565b90505b8183101561544f57868a82815181106152c357fe5b602002602001015114156152f257868982815181106152de57fe5b6020026020010151898381518110614af057fe5b868a82815181106152ff57fe5b602002602001015111156153ac576000811180156153395750868a615325836001613351565b8151811061532f57fe5b6020026020010151105b1561538357868961534b836001613351565b8151811061535557fe5b6020026020010151614b4c620151808c61537960018761335190919063ffffffff16565b81518110614b3657fe5b8061539a5786600080955095509550505050612c38565b6153a5816001613351565b9150615439565b868a82815181106153b957fe5b602002602001015110156154395789516153d4906001613351565b811080156153fe5750868a6153ea836001613878565b815181106153f457fe5b6020026020010151115b1561542b578689828151811061541057fe5b6020026020010151614b4c620151808c8581518110614b3657fe5b615436816001613878565b92505b61544860026139aa8486613878565b90506152ae565b868a828151811061545c57fe5b60200260200101511461547b5786600080955095509550505050612c38565b868982815181106152de57fe5b60006154c9436040518060400160405280601c81526020017f626c6f636b206e756d626572206578636565647320333220626974730000000081525061563e565b905060008463ffffffff1611801561551257506001600160a01b038516600090815260096020908152604080832063ffffffff6000198901811685529252909120548282169116145b15615562576001600160a01b0385166000908152600a60209081526040808320600019880163ffffffff168452909152902080546001600160601b0319166001600160601b0384161790556155ea565b6001600160a01b038516600081815260096020908152604080832063ffffffff898116808652918452828520805463ffffffff1990811689841617909155868652600a855283862092865291845282852080546001600160601b0319166001600160601b038a16179055948452600b9092529091208054909116600187019092169190911790555b604080516001600160601b0380861682528416602082015281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142905760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d56fe696e76616c69642073657276696365506f6f6c00000000000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122098179f4fe2fcb854dc6a1d380a76130dff5414b0d11407aa3f739a2b69783f3664736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c80636fcfff4511610130578063aa40f500116100b8578063ee3e7cd61161007c578063ee3e7cd61461079d578063efa5d431146107d9578063f0d78bf51461080f578063f851a44014610835578063fed0a20e1461083d57610232565b8063aa40f500146106f8578063ab15158a1461071e578063b46377a01461074c578063b5e3ee5014610754578063d32028301461077157610232565b8063879ed33e116100ff578063879ed33e1461060e5780638f288a0914610644578063916c435f146106725780639fb9ec111461069e578063a73e935a146106d257610232565b80636fcfff451461051857806371f7350f1461053e5780637dc8ff3f146105645780638285c7d8146105e257610232565b8063375b4cd4116101be578063544d856411610182578063544d856414610478578063587cde1e1461049e5780635c19a95c146104c457806365a4840d146104ea5780636a33bc13146104f257610232565b8063375b4cd41461039d5780633c77d503146103e857806348028d6314610432578063481e1c3e1461043a57806353bfcd1b1461044257610232565b80632678224711610205578063267822471461032957806327e235e31461033157806329575f6a146103575780632fa41caf1461035f578063360358be1461036757610232565b806306552ff314610237578063090dbba1146102775780630d65d00a146102b757806315ed0514146102db575b600080fd5b6102756004803603608081101561024d57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516610859565b005b6102a56004803603604081101561028d57600080fd5b506001600160a01b0381358116916020013516610903565b60408051918252519081900360200190f35b6102bf6109eb565b604080516001600160a01b039092168252519081900360200190f35b61030d600480360360408110156102f157600080fd5b5080356001600160a01b0316906020013563ffffffff166109fa565b604080516001600160601b039092168252519081900360200190f35b6102bf610a20565b61030d6004803603602081101561034757600080fd5b50356001600160a01b0316610a2f565b6102bf610a4a565b6102bf610a59565b6102756004803603606081101561037d57600080fd5b506001600160a01b03813581169160208101359091169060400135610a68565b6103cf600480360360408110156103b357600080fd5b5080356001600160a01b0316906020013563ffffffff16610d84565b6040805163ffffffff9092168252519081900360200190f35b610414600480360360408110156103fe57600080fd5b506001600160a01b038135169060200135610da7565b60408051938452602084019290925282820152519081900360600190f35b6102bf610edf565b6102bf610eee565b6102a56004803603606081101561045857600080fd5b506001600160a01b03813581169160208101359091169060400135610efd565b6102bf6004803603602081101561048e57600080fd5b50356001600160a01b0316611190565b6102bf600480360360208110156104b457600080fd5b50356001600160a01b03166111b1565b610275600480360360208110156104da57600080fd5b50356001600160a01b03166111cc565b6102756111d9565b6102a56004803603602081101561050857600080fd5b50356001600160a01b0316611346565b6103cf6004803603602081101561052e57600080fd5b50356001600160a01b03166113ae565b6102756004803603602081101561055457600080fd5b50356001600160a01b03166113c6565b6105926004803603604081101561057a57600080fd5b506001600160a01b038135811691602001351661166a565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105ce5781810151838201526020016105b6565b505050509050019250505060405180910390f35b610275600480360360408110156105f857600080fd5b506001600160a01b0381351690602001356117ba565b6104146004803603606081101561062457600080fd5b506001600160a01b03813581169160208101359091169060400135611a93565b6102756004803603604081101561065a57600080fd5b506001600160a01b0381358116916020013516611c8a565b61030d6004803603604081101561068857600080fd5b506001600160a01b0381351690602001356120c3565b610275600480360360608110156106b457600080fd5b506001600160a01b03813516906020810135906040013515156122da565b61030d600480360360208110156106e857600080fd5b50356001600160a01b031661245c565b61030d6004803603602081101561070e57600080fd5b50356001600160a01b0316612467565b6102a56004803603604081101561073457600080fd5b506001600160a01b0381358116916020013516612472565b6102756126c8565b6102756004803603602081101561076a57600080fd5b5035612723565b6102a56004803603604081101561078757600080fd5b50803590602001356001600160a01b03166128c9565b610414600480360360808110156107b357600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135612a2b565b610275600480360360608110156107ef57600080fd5b506001600160a01b03813581169160208101359091169060400135612c42565b6102a56004803603602081101561082557600080fd5b50356001600160a01b0316613218565b6102bf613334565b610845613348565b604080519115158252519081900360200190f35b60005460ff161561089d576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b039687161790915560068054821694861694909417909355600080546002805490951692861692909217909355610100600160a81b03191661010091909316029190911760ff19166001179055565b6001600160a01b03808216600090815260136020908152604080832093861683529290529081205480156109df576001600160a01b0380841660009081526016602090815260408083209388168352929052205415610987576001600160a01b038084166000908152601660209081526040808320938816835292905220546109d7565b6001600160a01b038084166000908152601360209081526040808320938816835292905290812080546109d792600192916109be57fe5b906000526020600020015461335190919063ffffffff16565b9150506109e5565b60009150505b92915050565b6004546001600160a01b031681565b600a6020908152600092835260408084209091529082529020546001600160601b031681565b6001546001600160a01b031681565b6007602052600090815260409020546001600160601b031681565b6002546001600160a01b031681565b6006546001600160a01b031681565b60008111610aa6576040805162461bcd60e51b815260206004808301919091526024820152637a65726f60e01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d6020811015610b3257600080fd5b5051610b73576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610bc057600080fd5b505afa158015610bd4573d6000803e3d6000fd5b505050506040513d6020811015610bea57600080fd5b5051610c2f576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b610c3a338484613393565b610c77576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08199bdd5b9960ba1b604482015290519081900360640190fd5b6000610c81613432565b90506000610c9133868685613451565b5091505082811015610cdd576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b610cec338686866000876135f3565b610cfa848685600086613676565b610d0785846000856136db565b33600090815260126020526040902054610d219084613351565b336000818152601260209081526040918290209390935580516001600160a01b03898116825293810187905281518694891693927f1bf72c5c42c48c4dc9c15fe6c006bdaccffcb75f592ff06ab4f54bde7dc23d1f928290030190a45050505050565b600960209081526000928352604080842090915290825290205463ffffffff1681565b60008080808415610db85784610dc0565b610dc0613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d6020811015610e3c57600080fd5b5051610e7d576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b610e85613432565b811115610ec7576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b610ed1868261371b565b935093509350509250925092565b6003546001600160a01b031681565b6005546001600160a01b031681565b6001600160a01b03808316600090815260136020908152604080832093871683529290529081205480610f34576000915050611189565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d6020811015610fc057600080fd5b5051611001576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b611009613432565b83111561104b576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6001600160a01b038085166000908152601660209081526040808320938916835292905290812054156110a3576001600160a01b038086166000908152601660209081526040808320938a16835292905220546110da565b6001600160a01b038086166000908152601360209081526040808320938a16835292905290812080546110da92600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d602081101561115657600080fd5b505190506111648282613878565b85116111765760009350505050611189565b61118385888885856138d2565b93505050505b9392505050565b6001600160a01b03808216600090815260086020526040902054165b919050565b6008602052600090815260409020546001600160a01b031681565b6111d633826139d6565b50565b3360009081526011602052604081205461124a5760006111f833613a5a565b905080611237576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b611242816001613351565b91505061125c565b50336000908152601160205260409020545b6000611266613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b857600080fd5b505afa1580156112cc573d6000803e3d6000fd5b505050506040513d60208110156112e257600080fd5b505190506112f08382613878565b8211611335576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134182338584613c61565b505050565b6001600160a01b03811660009081526011602052604081205461139257600061136e83613a5a565b90508061137f5760009150506111ac565b61138a816001613351565b9150506111ac565b506001600160a01b031660009081526011602052604090205490565b600b6020526000908152604090205463ffffffff1681565b3360009081526013602090815260408083206001600160a01b038516845290915290205480611427576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561148957600080fd5b505afa15801561149d573d6000803e3d6000fd5b505050506040513d60208110156114b357600080fd5b50516114f4576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b60006114fe613432565b3360009081526016602090815260408083206001600160a01b03881684529091528120549192509015611554573360009081526016602090815260408083206001600160a01b0388168452909152902054611587565b3360009081526013602090815260408083206001600160a01b03881684529091528120805461158792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d957600080fd5b505afa1580156115ed573d6000803e3d6000fd5b505050506040513d602081101561160357600080fd5b505190506116118282613878565b8311611656576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638386338585613d89565b5050505050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156116ce57600080fd5b505afa1580156116e2573d6000803e3d6000fd5b505050506040513d60208110156116f857600080fd5b5051611739576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d60209081526040808320938616835292815290829020805483518184028101840190945280845290918301828280156117ad57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161178f575b5050505050905092915050565b3360009081526013602090815260408083206001600160a01b03861684529091529020548061181b576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561187d57600080fd5b505afa158015611891573d6000803e3d6000fd5b505050506040513d60208110156118a757600080fd5b50516118e8576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6118f0613432565b821115611932576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b3360009081526016602090815260408083206001600160a01b038716845290915281205415611984573360009081526016602090815260408083206001600160a01b03881684529091529020546119b7565b3360009081526013602090815260408083206001600160a01b0388168452909152812080546119b792600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d6020811015611a3357600080fd5b50519050611a418282613878565b8411611a86576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6116638486338585613d89565b60008080808415611aa45784611aac565b611aac613432565b6004805460408051630428867160e11b81526001600160a01b038b81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d6020811015611b2857600080fd5b5051611b69576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b856001600160a01b031663c84ad2c7886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bb657600080fd5b505afa158015611bca573d6000803e3d6000fd5b505050506040513d6020811015611be057600080fd5b5051611c25576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611c2d613432565b811115611c6f576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b611c7a878783613ec0565b9350935093505093509350939050565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611cec57600080fd5b505afa158015611d00573d6000803e3d6000fd5b505050506040513d6020811015611d1657600080fd5b5051611d57576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b816001600160a01b031663c84ad2c7826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611da457600080fd5b505afa158015611db8573d6000803e3d6000fd5b505050506040513d6020811015611dce57600080fd5b5051611e13576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b611e1d3383614043565b611e5d576040805162461bcd60e51b815260206004820152600c60248201526b0c8e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b611e68338383613393565b611ea8576040805162461bcd60e51b815260206004820152600c60248201526b0c4e881b9bdd08199bdd5b9960a21b604482015290519081900360640190fd5b6000611eb2613432565b90506000611ec233858585613451565b50915050611ed5338585846000876135f3565b611ee3838583600086613676565b611ef084826000856136db565b33600090815260126020526040902054611f0a9082613351565b33600090815260126020908152604080832093909355600d81528282206001600160a01b0388168352815282822080548451818402810184019095528085529293611f95939092830182828015611f8a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f6c575b5050505050856140c7565b336000908152600d602090815260408083206001600160a01b038a1684529091529020909150611fc6908290614117565b336000908152600d602090815260408083206001600160a01b038916845290915290205461207857336000908152600c6020908152604080832080548251818502810185019093528083526120599383018282801561204e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612030575b5050505050876140c7565b336000908152600c60205260409020909150612076908290614117565b505b604080516001600160a01b0387811682529151859287169133917f194c3721f48fdddc9ef3098668929b634be03db0fb5eead343224e62a343ba069181900360200190a45050505050565b600043821061210e576040805162461bcd60e51b81526020600482015260126024820152711b9bdd081e595d0819195d195c9b5a5b995960721b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b602052604090205463ffffffff168061213c5760009150506109e5565b6001600160a01b038416600090815260096020908152604080832063ffffffff6000198601811685529252909120541683106121b1576001600160a01b0384166000908152600a602090815260408083206000199490940163ffffffff16835292905220546001600160601b031690506109e5565b6001600160a01b038416600090815260096020908152604080832083805290915290205463ffffffff168310156121ec5760009150506109e5565b600060001982015b8163ffffffff168163ffffffff16111561229d576001600160a01b0386166000818152600960209081526040808320600263ffffffff888803811691909104870380821680875292855283862054968652600a855283862092865291909352922054919216906001600160601b0316878214156122785795506109e5945050505050565b878263ffffffff16101561228e57829450612295565b6001830393505b5050506121f4565b506001600160a01b0385166000908152600a6020908152604080832063ffffffff909416835292905220546001600160601b031691505092915050565b6006546001600160a01b03163314612331576040805162461bcd60e51b81526020600482015260156024820152741b9bdd081cd894dd1c9bdb99d5985b1d59541bdbdb605a1b604482015290519081900360640190fd5b600061236b8360405180604001604052806016815260200175616d6f756e742065786365656473203936206269747360501b8152506141fe565b905081156123825761237d8482614298565b612456565b6001600160a01b03808516600081815260086020526040902054909116146123e9576040805162461bcd60e51b815260206004820152601560248201527436bab9ba103232b632b3b0ba32903a379039b2b63360591b604482015290519081900360640190fd5b806001600160601b03166123fc856143ce565b6001600160601b0316101561244c576040805162461bcd60e51b81526020600482015260116024820152706d75737420726563616c6c20766f74657360781b604482015290519081900360640190fd5b612456848261445f565b50505050565b60006109e5826143ce565b60006109e582614553565b6001600160a01b038082166000908152601360209081526040808320938616835292905290812054806124a95760009150506109e5565b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561250b57600080fd5b505afa15801561251f573d6000803e3d6000fd5b505050506040513d602081101561253557600080fd5b5051612576576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b6000612580613432565b6001600160a01b038086166000908152601660209081526040808320938a1683529290529081205491925090156125dc576001600160a01b038086166000908152601660209081526040808320938a1683529290522054612613565b6001600160a01b038086166000908152601360209081526040808320938a168352929052908120805461261392600192916109be57fe5b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663e19f4be96040518163ffffffff1660e01b815260040160206040518083038186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d602081101561268f57600080fd5b5051905061269d8282613878565b83116126b05760009450505050506109e5565b6126bd83888885856138d2565b979650505050505050565b33600090815260126020526040902054612718576040805162461bcd60e51b815260206004820152600c60248201526b1b9bc81d9bdd195cc81bdd5d60a21b604482015290519081900360640190fd5b612721336145bd565b565b3360009081526011602052604081205461279457600061274233613a5a565b905080612781576040805162461bcd60e51b81526020600482015260086024820152676e6f20766f74657360c01b604482015290519081900360640190fd5b61278c816001613351565b9150506127a6565b50336000908152601160205260409020545b6127ae613432565b8211156127f0576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561284057600080fd5b505afa158015612854573d6000803e3d6000fd5b505050506040513d602081101561286a57600080fd5b505190506128788282613878565b83116128bd576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b61134183338484613c61565b6001600160a01b03811660009081526011602052604081205481906129185760006128f384613a5a565b905080612905576000925050506109e5565b612910816001613351565b915050612933565b506001600160a01b0382166000908152601160205260409020545b61293b613432565b84111561297d576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50519050612a058282613878565b8511612a16576000925050506109e5565b612a228585848461474f565b95945050505050565b60008080808415612a3c5784612a44565b612a44613432565b6004805460408051630428867160e11b81526001600160a01b038c81169482019490945290519394509116916308510ce291602480820192602092909190829003018186803b158015612a9657600080fd5b505afa158015612aaa573d6000803e3d6000fd5b505050506040513d6020811015612ac057600080fd5b5051612b01576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b866001600160a01b031663c84ad2c7876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612b4e57600080fd5b505afa158015612b62573d6000803e3d6000fd5b505050506040513d6020811015612b7857600080fd5b5051612bbd576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b612bc8888888613393565b612bda57925060009150819050612c38565b612be2613432565b811115612c24576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642064617960a81b604482015290519081900360640190fd5b612c3088888884613451565b935093509350505b9450945094915050565b60008111612c81576040805162461bcd60e51b8152602060048201526007602482015266313a207a65726f60c81b604482015290519081900360640190fd5b600460009054906101000a90046001600160a01b03166001600160a01b03166308510ce2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ce357600080fd5b505afa158015612cf7573d6000803e3d6000fd5b505050506040513d6020811015612d0d57600080fd5b5051612d4e576040805162461bcd60e51b81526020600482015260136024820152600080516020615695833981519152604482015290519081900360640190fd5b826001600160a01b031663c84ad2c7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d9b57600080fd5b505afa158015612daf573d6000803e3d6000fd5b505050506040513d6020811015612dc557600080fd5b5051612e0a576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964207365727669636560881b604482015290519081900360640190fd5b600654604080516376d53d6160e01b81526001600160a01b038581166004830152915191909216916376d53d61916024808301926020929190829003018186803b158015612e5757600080fd5b505afa158015612e6b573d6000803e3d6000fd5b505050506040513d6020811015612e8157600080fd5b5051612ec4576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081b5a5b881b5a5b9959609a1b604482015290519081900360640190fd5b80612ece336143ce565b6001600160601b03161015612f1d576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f75676820766f74657360801b604482015290519081900360640190fd5b612f28338484613393565b613055576004805460408051636031257f60e11b815290516001600160a01b039092169263c0624afe928282019260209290829003018186803b158015612f6e57600080fd5b505afa158015612f82573d6000803e3d6000fd5b505050506040513d6020811015612f9857600080fd5b5051336000908152600d602090815260408083206001600160a01b0388168452909152902054612fc9906001613878565b111561300a576040805162461bcd60e51b815260206004820152600b60248201526a313a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600d602090815260408083206001600160a01b0387811685529083529083208054600181018255908452919092200180546001600160a01b0319169184169190911790555b61305f3384614043565b6131665760048054604080516311d9d79360e21b815290516001600160a01b03909216926347675e4c928282019260209290829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60208110156130cf57600080fd5b5051336000908152600c60205260409020546130ec906001613878565b111561312d576040805162461bcd60e51b815260206004820152600b60248201526a323a20746f6f206d616e7960a81b604482015290519081900360640190fd5b336000908152600c602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b6000613170613432565b9050613181338585856001866135f3565b61318f838584600185613676565b61319c84836001846136db565b336000908152601260205260409020546131b69083613878565b336000818152601260209081526040918290209390935580516001600160a01b03888116825293810186905281518594881693927ffac22e5ca1ad9c0e062e405d23fa971f266026b08a9339450a055b848ba742a1928290030190a450505050565b6001600160a01b038116600090815260116020526040812054819061326757600061324284613a5a565b905080613254576000925050506111ac565b61325f816001613351565b915050613282565b506001600160a01b0382166000908152601160205260409020545b600061328c613432565b90506000600460009054906101000a90046001600160a01b03166001600160a01b031663c4947b9b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132de57600080fd5b505afa1580156132f2573d6000803e3d6000fd5b505050506040513d602081101561330857600080fd5b505190506133168382613878565b821161332857600093505050506111ac565b612a228286858461474f565b60005461010090046001600160a01b031681565b60005460ff1681565b600061118983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506149ba565b6000805b6001600160a01b038086166000908152600d6020908152604080832093881683529290522054811015613427576001600160a01b038581166000908152600d6020908152604080832088851684529091529020805491851691839081106133fa57fe5b6000918252602090912001546001600160a01b0316141561341f576001915050611189565b600101613397565b506000949350505050565b600061344c60016134464262015180614a14565b90613878565b905090565b6001600160a01b038085166000908152600e60209081526040808320878516845282528083209386168352928152828220805484518184028101840190955280855292938493849360609391908301828280156134cd57602002820191906000526020600020905b8154815260200190600101908083116134b9575b5050506001600160a01b03808c166000908152600f602090815260408083208e851684528252808320938d168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561354d57602002820191906000526020600020905b815481526020019060010190808311613539575b5050506001600160a01b03808d1660009081526010602090815260408083208f851684528252808320938e16835292815290829020805483518184028101840190945280845295965060609592945092508301828280156135cd57602002820191906000526020600020905b8154815260200190600101908083116135b9575b505050505090506135e08383838a614a56565b9550955095505050509450945094915050565b6001600160a01b038087166000818152600e602090815260408083208a8616808552908352818420958a16808552958352818420858552600f8452828520828652845282852087865284528285209585526010845282852091855290835281842095845294909152902061366b838383898989614b66565b505050505050505050565b6001600160a01b038086166000818152601360209081526040808320948916808452948252808320848452601483528184208685528352818420948452601583528184209584529490915290206136d1838383898989614b66565b5050505050505050565b6001600160a01b03841660009081526017602090815260408083206018835281842060199093529220613712838383898989614b66565b50505050505050565b6001600160a01b03821660009081526017602090815260408083208054825181850281018501909352808352849384936060939092909183018282801561378157602002820191906000526020600020905b81548152602001906001019080831161376d575b5050506001600160a01b038916600090815260186020908152604091829020805483518184028101840190945280845295965060609592945092508301828280156137eb57602002820191906000526020600020905b8154815260200190600101908083116137d7575b5050506001600160a01b038a166000908152601960209081526040918290208054835181840281018401909452808452959650606095929450925083018282801561385557602002820191906000526020600020905b815481526020019060010190808311613841575b505050505090506138688383838a614a56565b9550955095505050509250925092565b600082820183811015611189576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080806138e1856001613878565b90505b6138ee8885613351565b81116139cb576000613900888361371b565b925050508061390f57506139c3565b600061391c888a85613ec0565b60048054604080516319ce94a160e31b815292830189905251929550600094506001600160a01b0316925063ce74a508916024808301926020929190829003018186803b15801561396c57600080fd5b505afa158015613980573d6000803e3d6000fd5b505050506040513d602081101561399657600080fd5b5051905060006139b0846139aa8486614e97565b90614a14565b90506139bc8682613878565b9550505050505b6001016138e4565b509695505050505050565b6001600160a01b03808316600081815260086020818152604080842080546007845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612456828483614ef0565b600080805b6001600160a01b0384166000908152600c6020526040902054811015613c5a576001600160a01b0384166000908152600c60205260408120805483908110613aa357fe5b60009182526020822001546001600160a01b031691505b6001600160a01b038087166000908152600d6020908152604080832093861683529290522054811015613c50576001600160a01b038087166000908152600d602090815260408083209386168352929052908120805483908110613b1a57fe5b60009182526020808320909101546001600160a01b038a81168452600e83526040808520888316865284528085209190921680855292529091205490915015613c475784613bb0576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613b9e57fe5b90600052602060002001549450613c47565b6001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054879290613bec57fe5b90600052602060002001541015613c47576001600160a01b038088166000908152600e602090815260408083208785168452825280832093851683529290529081208054909190613c3957fe5b906000526020600020015494505b50600101613aba565b5050600101613a5f565b5092915050565b6000613c6f8585858561474f565b905060008111613cb3576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613cbd8583613351565b6001600160a01b0380861660008181526011602052604080822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613d2357600080fd5b505af1158015613d37573d6000803e3d6000fd5b50505050613d43613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a35050505050565b6000613d9886868686866138d2565b905060008111613ddc576040805162461bcd60e51b815260206004820152600a6024820152696e6f207265776172647360b01b604482015290519081900360640190fd5b613de68683613351565b6001600160a01b0380861660008181526016602090815260408083208b8616845290915280822094909455600480548551635fe43d2360e11b815291820193909352602481018690529351919092169263bfc87a4692604480830193919282900301818387803b158015613e5957600080fd5b505af1158015613e6d573d6000803e3d6000fd5b50505050613e79613432565b6040805183815290516001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a919081900360200190a3505050505050565b6001600160a01b038084166000908152601360209081526040808320938616835292815282822080548451818402810184019095528085529293849384936060939190830182828015613f3257602002820191906000526020600020905b815481526020019060010190808311613f1e575b5050506001600160a01b03808b166000908152601460209081526040808320938d1683529281529082902080548351818402810184019094528084529596506060959294509250830182828015613fa857602002820191906000526020600020905b815481526020019060010190808311613f94575b5050506001600160a01b03808c166000908152601560209081526040808320938e168352928152908290208054835181840281018401909452808452959650606095929450925083018282801561401e57602002820191906000526020600020905b81548152602001906001019080831161400a575b505050505090506140318383838a614a56565b95509550955050505093509350939050565b6000805b6001600160a01b0384166000908152600c60205260409020548110156140bd576001600160a01b038481166000908152600c602052604090208054918516918390811061409057fe5b6000918252602090912001546001600160a01b031614156140b55760019150506109e5565b600101614047565b5060009392505050565b60008060005b845181101561410f57836001600160a01b03168582815181106140ec57fe5b60200260200101516001600160a01b03161415614107578091505b6001016140cd565b509392505050565b8054614124906001613351565b82141561415c578080548061413557fe5b600082815260209020810160001990810180546001600160a01b03191690550190556141fa565b8054819061416b906001613351565b8154811061417557fe5b9060005260206000200160009054906101000a90046001600160a01b031681838154811061419f57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550808054806141d757fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b5050565b600081600160601b84106142905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561425557818101518382015260200161423d565b50505050905090810190601f1680156142825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509192915050565b6001600160a01b0382166142e2576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b6001600160a01b0382166000908152600760209081526040918290205482518084019093526015835274766f746520616d6f756e74206f766572666c6f777360581b91830191909152614342916001600160601b039091169083906150a7565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b03929092169190911790556143828282615111565b604080516001600160601b038316815290516001600160a01b038416917fbb104626c67690cd9023bde19b0804077126d78eb9bc3eb35de512eda655a311919081900360200190a25050565b6000806143da83614553565b90506001600160601b038116156144565761444f60126000856001600160a01b03166001600160a01b03168152602001908152602001600020546040518060400160405280601d81526020017f766f746572566f7465734f7574206578636565647320393620626974730000008152506141fe565b8103611189565b60009392505050565b6001600160a01b038216600090815260076020908152604091829020548251808401909352601b83527f766f746520616d6f756e7420657863656564732062616c616e63650000000000918301919091526144c7916001600160601b03909116908390615183565b6001600160a01b038316600090815260076020526040902080546001600160601b0319166001600160601b039290921691909117905561450782826151e8565b604080516001600160601b038316815290516001600160a01b038416917f40b10d9892192657ad11f6c742381c432b492799468ace10b6ffb5842e34b024919081900360200190a25050565b6001600160a01b0381166000908152600b602052604081205463ffffffff168061457e576000611189565b6001600160a01b0383166000908152600a6020908152604080832063ffffffff60001986011684529091529020546001600160601b0316915050919050565b60006145c7613432565b905060005b6001600160a01b0383166000908152600c6020526040902054811015611341576001600160a01b0383166000908152600c6020526040812080548390811061461057fe5b60009182526020808320909101546001600160a01b038781168452600d8352604080852091909216808552908352928190208054825181850281018501909352808352939450606093919290919083018282801561469757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614679575b5050505050905060005b81518110156147445760008282815181106146b857fe5b6020026020010151905060006146d08886848a613451565b509150506146e38886848460008c6135f3565b6146f182868360008b613676565b6146fe858260008a6136db565b6001600160a01b0388166000908152601260205260409020546147219082613351565b6001600160a01b03891660009081526012602052604090205550506001016146a1565b5050506001016145cc565b6001600160a01b0383166000908152600c60209081526040808320805482518185028101850190935280835284936060939291908301828280156147bc57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161479e575b5050505050905060006147d960018761387890919063ffffffff16565b90505b6147e68886613351565b81116149ae5760005b82518110156149a557600083828151811061480657fe5b60200260200101519050600061481c828561371b565b925050508061482c57505061499d565b6001600160a01b03808b166000908152600d602090815260408083209386168352928152908290208054835181840281018401909452808452606093928301828280156148a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311614884575b50505050509050600080600090505b82518110156148fc5760008382815181106148c857fe5b6020026020010151905060006148e08f88848c613451565b92506148f0915085905082613878565b935050506001016148b1565b506004805460408051631900020960e21b8152928301899052516000926001600160a01b03909216916364000824916024808301926020929190829003018186803b15801561494a57600080fd5b505afa15801561495e573d6000803e3d6000fd5b505050506040513d602081101561497457600080fd5b505190506000614988856139aa8486614e97565b90506149948a82613878565b99505050505050505b6001016147ef565b506001016147dc565b50909695505050505050565b60008184841115614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b505050900390565b600061118983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615212565b83516000908190819080614a74578460008093509350935050612c38565b87600081518110614a8157fe5b6020026020010151851015614aa0578460008093509350935050612c38565b6000614aad826001613351565b90506000898281518110614abd57fe5b6020026020010151905080871415614b065786898381518110614adc57fe5b6020026020010151898481518110614af057fe5b6020026020010151955095509550505050612c38565b80871115614b5a5786898381518110614b1b57fe5b6020026020010151614b4c620151808c8681518110614b3657fe5b6020026020010151614e9790919063ffffffff16565b955095509550505050612c38565b6135e08a8a8a8a615277565b855462015180428190066000614b7c8383613351565b905083614c21578515614bda57895460018181018c5560008c815260208082209093018890558b549182018c558b8152919091200187905587614bbf8883614e97565b81546001810183556000928352602090922090910155614c1c565b6040805162461bcd60e51b8152602060048201526012602482015271313a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614e8b565b6000614c2e856001613351565b905060008b8281548110614c3e57fe5b9060005260206000200154905060008b8381548110614c5957fe5b9060005260206000200154905060008b8481548110614c7457fe5b906000526020600020015490506000808a851415614d5f578b15614cb957614c9c848e613878565b9150614cb2614cab8e89614e97565b8490613878565b9050614d26565b8c841015614d03576040805162461bcd60e51b8152602060048201526012602482015271323a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614d0d848e613351565b9150614d23614d1c8e89614e97565b8490613351565b90505b818f8781548110614d3357fe5b9060005260206000200181905550808e8781548110614d4e57fe5b600091825260209091200155614e84565b8b15614d9257614d6f848e613878565b9150614d8b614d7e8e89614e97565b6134468662015180614e97565b9050614e0b565b8c841015614ddc576040805162461bcd60e51b8152602060048201526012602482015271333a206e6f7420656e6f756768206d696e6560701b604482015290519081900360640190fd5b614de6848e613351565b9150614e08614df58e89614e97565b614e028662015180614e97565b90613351565b90505b8f8b90806001815401808255809150506001900390600052602060002001600090919091909150558e8290806001815401808255809150506001900390600052602060002001600090919091909150558d8190806001815401808255809150506001900390600052602060002001600090919091909150555b5050505050505b50505050505050505050565b600082614ea6575060006109e5565b82820282848281614eb357fe5b04146111895760405162461bcd60e51b81526004018080602001828103825260218152602001806156b56021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b031614158015614f1b57506000816001600160601b0316115b15611341576001600160a01b03831615614fe2576001600160a01b0383166000908152600b602052604081205463ffffffff169081614f5b576000614f93565b6001600160a01b0385166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000614fd0828560405180604001604052806016815260200175766f746520616d6f756e7420756e646572666c6f777360501b815250615183565b9050614fde86848484615488565b5050505b6001600160a01b03821615611341576001600160a01b0382166000908152600b602052604081205463ffffffff16908161501d576000615055565b6001600160a01b0384166000908152600a6020908152604080832063ffffffff60001987011684529091529020546001600160601b03165b90506000615091828560405180604001604052806015815260200174766f746520616d6f756e74206f766572666c6f777360581b8152506150a7565b905061509f85848484615488565b505050505050565b6000838301826001600160601b0380871690831610156151085760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50949350505050565b6001600160a01b038281166000908152600860205260409020541661515a576001600160a01b038216600081815260086020526040902080546001600160a01b03191690911790555b6001600160a01b0380831660009081526008602052604081205490911690611341908284614ef0565b6000836001600160601b0316836001600160601b031611158290614a0c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b6001600160a01b038083166000908152600860205260408120549091169061134190829084614ef0565b600081836152615760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d565b50600083858161526d57fe5b0495945050505050565b60008060008060009050600061529860018a5161335190919063ffffffff16565b905060006152ab60026139aa8486613878565b90505b8183101561544f57868a82815181106152c357fe5b602002602001015114156152f257868982815181106152de57fe5b6020026020010151898381518110614af057fe5b868a82815181106152ff57fe5b602002602001015111156153ac576000811180156153395750868a615325836001613351565b8151811061532f57fe5b6020026020010151105b1561538357868961534b836001613351565b8151811061535557fe5b6020026020010151614b4c620151808c61537960018761335190919063ffffffff16565b81518110614b3657fe5b8061539a5786600080955095509550505050612c38565b6153a5816001613351565b9150615439565b868a82815181106153b957fe5b602002602001015110156154395789516153d4906001613351565b811080156153fe5750868a6153ea836001613878565b815181106153f457fe5b6020026020010151115b1561542b578689828151811061541057fe5b6020026020010151614b4c620151808c8581518110614b3657fe5b615436816001613878565b92505b61544860026139aa8486613878565b90506152ae565b868a828151811061545c57fe5b60200260200101511461547b5786600080955095509550505050612c38565b868982815181106152de57fe5b60006154c9436040518060400160405280601c81526020017f626c6f636b206e756d626572206578636565647320333220626974730000000081525061563e565b905060008463ffffffff1611801561551257506001600160a01b038516600090815260096020908152604080832063ffffffff6000198901811685529252909120548282169116145b15615562576001600160a01b0385166000908152600a60209081526040808320600019880163ffffffff168452909152902080546001600160601b0319166001600160601b0384161790556155ea565b6001600160a01b038516600081815260096020908152604080832063ffffffff898116808652918452828520805463ffffffff1990811689841617909155868652600a855283862092865291845282852080546001600160601b0319166001600160601b038a16179055948452600b9092529091208054909116600187019092169190911790555b604080516001600160601b0380861682528416602082015281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b60008164010000000084106142905760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561425557818101518382015260200161423d56fe696e76616c69642073657276696365506f6f6c00000000000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122098179f4fe2fcb854dc6a1d380a76130dff5414b0d11407aa3f739a2b69783f3664736f6c634300060c0033

Deployed Bytecode Sourcemap

211:43623:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3112:485;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3112:485:4;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5561:523;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5561:523:4;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1392:41;;;:::i;:::-;;;;-1:-1:-1;;;;;1392:41:4;;;;;;;;;;;;;;1738:69;;;;;;;;;;;;;;;;-1:-1:-1;1738:69:4;;-1:-1:-1;;;;;1738:69:4;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1738:69:4;;;;;;;;;;;;;;1289:27;;;:::i;1560:42::-;;;;;;;;;;;;;;;;-1:-1:-1;1560:42:4;-1:-1:-1;;;;;1560:42:4;;:::i;1322:25::-;;;:::i;1502:51::-;;;:::i;9366:1420::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9366:1420:4;;;;;;;;;;;;;;;;;:::i;1659:73::-;;;;;;;;;;;;;;;;-1:-1:-1;1659:73:4;;-1:-1:-1;;;;;1659:73:4;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21717:502;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21717:502:4;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1353:32;;;:::i;1439:57::-;;;:::i;17283:1086::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17283:1086:4;;;;;;;;;;;;;;;;;:::i;6744:114::-;;;;;;;;;;;;;;;;-1:-1:-1;6744:114:4;-1:-1:-1;;;;;6744:114:4;;:::i;1608:44::-;;;;;;;;;;;;;;;;-1:-1:-1;1608:44:4;-1:-1:-1;;;;;1608:44:4;;:::i;6645:93::-;;;;;;;;;;;;;;;;-1:-1:-1;6645:93:4;-1:-1:-1;;;;;6645:93:4;;:::i;14793:712::-;;;:::i;6090:402::-;;;;;;;;;;;;;;;;-1:-1:-1;6090:402:4;-1:-1:-1;;;;;6090:402:4;;:::i;1813:48::-;;;;;;;;;;;;;;;;-1:-1:-1;1813:48:4;-1:-1:-1;;;;;1813:48:4;;:::i;12877:964::-;;;;;;;;;;;;;;;;-1:-1:-1;12877:964:4;-1:-1:-1;;;;;12877:964:4;;:::i;7036:331::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7036:331:4;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13847:940;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13847:940:4;;;;;;;;:::i;20970:741::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20970:741:4;;;;;;;;;;;;;;;;;:::i;10792:2079::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10792:2079:4;;;;;;;;;;:::i;4413:1142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4413:1142:4;;;;;;;;:::i;3603:632::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3603:632:4;;;;;;;;;;;;;;;:::i;6864:166::-;;;;;;;;;;;;;;;;-1:-1:-1;6864:166:4;-1:-1:-1;;;;;6864:166:4;;:::i;4241:::-;;;;;;;;;;;;;;;;-1:-1:-1;4241:166:4;-1:-1:-1;;;;;4241:166:4;;:::i;16203:1074::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16203:1074:4;;;;;;;;;;:::i;6498:141::-;;;:::i;15511:686::-;;;;;;;;;;;;;;;;-1:-1:-1;15511:686:4;;:::i;19254:793::-;;;;;;;;;;;;;;;;-1:-1:-1;19254:793:4;;;;;;-1:-1:-1;;;;;19254:793:4;;:::i;20053:911::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20053:911:4;;;;;;;;;;;;;;;;;;;;;;:::i;7373:1987::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7373:1987:4;;;;;;;;;;;;;;;;;:::i;18375:873::-;;;;;;;;;;;;;;;;-1:-1:-1;18375:873:4;-1:-1:-1;;;;;18375:873:4;;:::i;1263:20::-;;;:::i;1237:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;3112:485;3302:8;;;;3301:9;3293:31;;;;;-1:-1:-1;;;3293:31:4;;;;;;;;;;;;-1:-1:-1;;;3293:31:4;;;;;;;;;;;;;;;3334:12;:57;;-1:-1:-1;;;;;;3334:57:4;;;-1:-1:-1;;;;;3334:57:4;;;;;;;3401:17;:94;;;;;;;;;;;;;;-1:-1:-1;3505:20:4;;3535:10;:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3505:20:4;3334:57;3505:20;;;;;;;;;-1:-1:-1;;3575:15:4;-1:-1:-1;3575:15:4;;;3112:485::o;5561:523::-;-1:-1:-1;;;;;5718:31:4;;;5681:7;5718:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:51;5783:8;;5779:281;;-1:-1:-1;;;;;5830:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;:62;:219;;-1:-1:-1;;;;;5992:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;5830:219;;;-1:-1:-1;;;;;5915:31:4;;;;;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:47;;:54;;5967:1;;5915:44;:47;;;;;;;;;;;;:51;;:54;;;;:::i;:::-;5807:242;;;;;5779:281;6076:1;6069:8;;;5561:523;;;;;:::o;1392:41::-;;;-1:-1:-1;;;;;1392:41:4;;:::o;1738:69::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1738:69:4;;:::o;1289:27::-;;;-1:-1:-1;;;;;1289:27:4;;:::o;1560:42::-;;;;;;;;;;;;-1:-1:-1;;;;;1560:42:4;;:::o;1322:25::-;;;-1:-1:-1;;;;;1322:25:4;;:::o;1502:51::-;;;-1:-1:-1;;;;;1502:51:4;;:::o;9366:1420::-;9504:1;9495:6;:10;9487:27;;;;;-1:-1:-1;;;9487:27:4;;;;;;;;;;;;;;;-1:-1:-1;;;9487:27:4;;;;;;;;;;;;;;;9545:12;;;;;;;;;-1:-1:-1;;;;;9545:12:4;-1:-1:-1;;;;;9545:34:4;;9580:11;9545:47;;;;;;;;;;;;;-1:-1:-1;;;;;9545:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9545:47:4;9524:113;;;;;-1:-1:-1;;;9524:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9524:113:4;;;;;;;;;;;;;;;9698:11;-1:-1:-1;;;;;9668:60:4;;9746:7;9668:99;;;;;;;;;;;;;-1:-1:-1;;;;;9668:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9668:99:4;9647:161;;;;;-1:-1:-1;;;9647:161:4;;;;;;;;;;;;-1:-1:-1;;;9647:161:4;;;;;;;;;;;;;;;9839:64;9870:10;9882:11;9895:7;9839:30;:64::i;:::-;9818:120;;;;;-1:-1:-1;;;9818:120:4;;;;;;;;;;;;-1:-1:-1;;;9818:120:4;;;;;;;;;;;;;;;9948:18;9969:16;:14;:16::i;:::-;9948:37;;9998:13;10017:135;10062:10;10086:11;10111:7;10132:10;10017:31;:135::i;:::-;9995:157;;;;10179:6;10170:5;:15;;10162:44;;;;;-1:-1:-1;;;10162:44:4;;;;;;;;;;;;-1:-1:-1;;;10162:44:4;;;;;;;;;;;;;;;10216:177;10264:10;10288:11;10313:7;10334:6;10354:5;10373:10;10216:34;:177::i;:::-;10403:148;10446:7;10467:11;10492:6;10512:5;10531:10;10403:29;:148::i;:::-;10561:62;10584:11;10597:6;10605:5;10612:10;10561:22;:62::i;:::-;10675:10;10661:25;;;;:13;:25;;;;;;:37;;10691:6;10661:29;:37::i;:::-;10647:10;10633:25;;;;:13;:25;;;;;;;;;:65;;;;10713:66;;-1:-1:-1;;;;;10713:66:4;;;;;;;;;;;;;10768:10;;10713:66;;;10647:10;10713:66;;;;;;;;9366:1420;;;;;:::o;1659:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21717:502::-;21845:7;;;;21933:14;;:45;;21969:9;21933:45;;;21950:16;:14;:16::i;:::-;22009:12;;;:47;;;-1:-1:-1;;;22009:47:4;;-1:-1:-1;;;;;22009:47:4;;;;;;;;;;;;21919:59;;-1:-1:-1;22009:12:4;;;:34;;:47;;;;;;;;;;;;;;;:12;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22009:47:4;21988:113;;;;;-1:-1:-1;;;21988:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21988:113:4;;;;;;;;;;;;;;;22126:16;:14;:16::i;:::-;22119:3;:23;;22111:47;;;;;-1:-1:-1;;;22111:47:4;;;;;;;;;;;;-1:-1:-1;;;22111:47:4;;;;;;;;;;;;;;;22175:37;22195:11;22208:3;22175:19;:37::i;:::-;22168:44;;;;;;;21717:502;;;;;:::o;1353:32::-;;;-1:-1:-1;;;;;1353:32:4;;:::o;1439:57::-;;;-1:-1:-1;;;;;1439:57:4;;:::o;17283:1086::-;-1:-1:-1;;;;;17452:31:4;;;17419:7;17452:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:51;17517:8;17513:47;;17548:1;17541:8;;;;;17513:47;17590:12;;;;;;;;;-1:-1:-1;;;;;17590:12:4;-1:-1:-1;;;;;17590:34:4;;17625:11;17590:47;;;;;;;;;;;;;-1:-1:-1;;;;;17590:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17590:47:4;17569:113;;;;;-1:-1:-1;;;17569:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17569:113:4;;;;;;;;;;;;;;;17707:16;:14;:16::i;:::-;17700:3;:23;;17692:47;;;;;-1:-1:-1;;;17692:47:4;;;;;;;;;;;;-1:-1:-1;;;17692:47:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;17792:44:4;;;17755:25;17792:44;;;:35;:44;;;;;;;;:57;;;;;;;;;;;;:62;:203;;-1:-1:-1;;;;;17938:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;17792:203;;;-1:-1:-1;;;;;17869:31:4;;;;;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:47;;:54;;17921:1;;17869:44;:47;;;:54;17755:240;;18005:19;18027:12;;;;;;;;;-1:-1:-1;;;;;18027:12:4;-1:-1:-1;;;;;18027:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18027:41:4;;-1:-1:-1;18090:34:4;:17;18027:41;18090:21;:34::i;:::-;18084:3;:40;18078:82;;18148:1;18141:8;;;;;;;18078:82;18188:174;18227:3;18248:11;18277:7;18302:17;18337:11;18188:21;:174::i;:::-;18169:193;;;;;17283:1086;;;;;;:::o;6744:114::-;-1:-1:-1;;;;;6831:20:4;;;6805:7;6831:20;;;:9;:20;;;;;;;6744:114;;;;:::o;1608:44::-;;;;;;;;;;;;-1:-1:-1;;;;;1608:44:4;;:::o;6645:93::-;6699:32;6709:10;6721:9;6699;:32::i;:::-;6645:93;:::o;14793:712::-;14897:10;14835:25;14874:34;;;:22;:34;;;;;;14870:315;;14929:21;14953:29;14971:10;14953:17;:29::i;:::-;14929:53;-1:-1:-1;15004:18:4;14996:39;;;;;-1:-1:-1;;;14996:39:4;;;;;;;;;;;;-1:-1:-1;;;14996:39:4;;;;;;;;;;;;;;;15069:20;:13;15087:1;15069:17;:20::i;:::-;15049:40;;14870:315;;;;-1:-1:-1;15163:10:4;15140:34;;;;:22;:34;;;;;;14870:315;15194:18;15215:16;:14;:16::i;:::-;15194:37;;15241:19;15263:12;;;;;;;;;-1:-1:-1;;;;;15263:12:4;-1:-1:-1;;;;;15263:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15263:39:4;;-1:-1:-1;15346:34:4;:17;15263:39;15346:21;:34::i;:::-;15333:10;:47;15312:109;;;;;-1:-1:-1;;;15312:109:4;;;;;;;;;;;;-1:-1:-1;;;15312:109:4;;;;;;;;;;;;;;;15431:67;15443:10;15455;15467:17;15486:11;15431;:67::i;:::-;14793:712;;;:::o;6090:402::-;-1:-1:-1;;;;;6212:29:4;;6185:7;6212:29;;;:22;:29;;;;;;6208:232;;6262:21;6286:24;6304:5;6286:17;:24::i;:::-;6262:48;-1:-1:-1;6328:18:4;6324:65;;6373:1;6366:8;;;;;6324:65;6409:20;:13;6427:1;6409:17;:20::i;:::-;6402:27;;;;;6208:232;-1:-1:-1;;;;;;6456:29:4;;;;;:22;:29;;;;;;;6090:402::o;1813:48::-;;;;;;;;;;;;;;;:::o;12877:964::-;12977:10;12940:11;12954:34;;;:22;:34;;;;;;;;-1:-1:-1;;;;;12954:47:4;;;;;;;;;:54;13026:8;13018:29;;;;;-1:-1:-1;;;13018:29:4;;;;;;;;;;;;-1:-1:-1;;;13018:29:4;;;;;;;;;;;;;;;13078:12;;;;;;;;;-1:-1:-1;;;;;13078:12:4;-1:-1:-1;;;;;13078:34:4;;13113:11;13078:47;;;;;;;;;;;;;-1:-1:-1;;;;;13078:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13078:47:4;13057:113;;;;;-1:-1:-1;;;13057:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13057:113:4;;;;;;;;;;;;;;;13180:18;13201:16;:14;:16::i;:::-;13291:23;13227:25;13255:60;;;:35;:60;;;;;;;;-1:-1:-1;;;;;13255:73:4;;;;;;;;;;13180:37;;-1:-1:-1;13227:25:4;13255:78;:225;;13456:10;13420:47;;;;:35;:47;;;;;;;;-1:-1:-1;;;;;13420:60:4;;;;;;;;;;13255:225;;;13371:10;13348:34;;;;:22;:34;;;;;;;;-1:-1:-1;;;;;13348:47:4;;;;;;;;;:50;;:57;;13403:1;;13348:47;:50;;;:57;13227:253;;13490:19;13512:12;;;;;;;;;-1:-1:-1;;;;;13512:12:4;-1:-1:-1;;;;;13512:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13512:41:4;;-1:-1:-1;13597:34:4;:17;13512:41;13597:21;:34::i;:::-;13584:10;:47;13563:109;;;;;-1:-1:-1;;;13563:109:4;;;;;;;;;;;;-1:-1:-1;;;13563:109:4;;;;;;;;;;;;;;;13682:152;13709:10;13733:11;13758:10;13782:17;13813:11;13682:13;:152::i;:::-;12877:964;;;;;:::o;7036:331::-;7154:16;7207:12;;;;;;;;;-1:-1:-1;;;;;7207:12:4;-1:-1:-1;;;;;7207:34:4;;7242:11;7207:47;;;;;;;;;;;;;-1:-1:-1;;;;;7207:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7207:47:4;7186:113;;;;;-1:-1:-1;;;7186:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7186:113:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;7316:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;;;;7309:51;;;;;;;;;;;;;;;;;7316:44;;7309:51;;7316:44;7309:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7309:51:4;;;;;;;;;;;;;;;;;;;;;;;7036:331;;;;:::o;13847:940::-;13961:10;13924:11;13938:34;;;:22;:34;;;;;;;;-1:-1:-1;;;;;13938:47:4;;;;;;;;;:54;14010:8;14002:29;;;;;-1:-1:-1;;;14002:29:4;;;;;;;;;;;;-1:-1:-1;;;14002:29:4;;;;;;;;;;;;;;;14062:12;;;;;;;;;-1:-1:-1;;;;;14062:12:4;-1:-1:-1;;;;;14062:34:4;;14097:11;14062:47;;;;;;;;;;;;;-1:-1:-1;;;;;14062:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14062:47:4;14041:113;;;;;-1:-1:-1;;;14041:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14041:113:4;;;;;;;;;;;;;;;14179:16;:14;:16::i;:::-;14172:3;:23;;14164:47;;;;;-1:-1:-1;;;14164:47:4;;;;;;;;;;;;-1:-1:-1;;;14164:47:4;;;;;;;;;;;;;;;14285:23;14221:25;14249:60;;;:35;:60;;;;;;;;-1:-1:-1;;;;;14249:73:4;;;;;;;;;;:78;:225;;14450:10;14414:47;;;;:35;:47;;;;;;;;-1:-1:-1;;;;;14414:60:4;;;;;;;;;;14249:225;;;14365:10;14342:34;;;;:22;:34;;;;;;;;-1:-1:-1;;;;;14342:47:4;;;;;;;;;:50;;:57;;14397:1;;14342:47;:50;;;:57;14221:253;;14484:19;14506:12;;;;;;;;;-1:-1:-1;;;;;14506:12:4;-1:-1:-1;;;;;14506:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14506:41:4;;-1:-1:-1;14571:34:4;:17;14506:41;14571:21;:34::i;:::-;14565:3;:40;14557:68;;;;;-1:-1:-1;;;14557:68:4;;;;;;;;;;;;-1:-1:-1;;;14557:68:4;;;;;;;;;;;;;;;14635:145;14662:3;14679:11;14704:10;14728:17;14759:11;14635:13;:145::i;20970:741::-;21150:7;;;;21238:14;;:45;;21274:9;21238:45;;;21255:16;:14;:16::i;:::-;21314:12;;;:47;;;-1:-1:-1;;;21314:47:4;;-1:-1:-1;;;;;21314:47:4;;;;;;;;;;;;21224:59;;-1:-1:-1;21314:12:4;;;:34;;:47;;;;;;;;;;;;;;;:12;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21314:47:4;21293:113;;;;;-1:-1:-1;;;21293:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21293:113:4;;;;;;;;;;;;;;;21467:11;-1:-1:-1;;;;;21437:60:4;;21515:7;21437:99;;;;;;;;;;;;;-1:-1:-1;;;;;21437:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21437:99:4;21416:161;;;;;-1:-1:-1;;;21416:161:4;;;;;;;;;;;;-1:-1:-1;;;21416:161:4;;;;;;;;;;;;;;;21602:16;:14;:16::i;:::-;21595:3;:23;;21587:47;;;;;-1:-1:-1;;;21587:47:4;;;;;;;;;;;;-1:-1:-1;;;21587:47:4;;;;;;;;;;;;;;;21651:53;21678:7;21687:11;21700:3;21651:26;:53::i;:::-;21644:60;;;;;;;20970:741;;;;;;;:::o;10792:2079::-;10889:12;;;;;;;;;-1:-1:-1;;;;;10889:12:4;-1:-1:-1;;;;;10889:34:4;;10924:11;10889:47;;;;;;;;;;;;;-1:-1:-1;;;;;10889:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10889:47:4;10868:113;;;;;-1:-1:-1;;;10868:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10868:113:4;;;;;;;;;;;;;;;11042:11;-1:-1:-1;;;;;11012:60:4;;11090:7;11012:99;;;;;;;;;;;;;-1:-1:-1;;;;;11012:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11012:99:4;10991:161;;;;;-1:-1:-1;;;10991:161:4;;;;;;;;;;;;-1:-1:-1;;;10991:161:4;;;;;;;;;;;;;;;11183:48;11207:10;11219:11;11183:23;:48::i;:::-;11162:107;;;;;-1:-1:-1;;;11162:107:4;;;;;;;;;;;;-1:-1:-1;;;11162:107:4;;;;;;;;;;;;;;;11300:64;11331:10;11343:11;11356:7;11300:30;:64::i;:::-;11279:123;;;;;-1:-1:-1;;;11279:123:4;;;;;;;;;;;;-1:-1:-1;;;11279:123:4;;;;;;;;;;;;;;;11412:18;11433:16;:14;:16::i;:::-;11412:37;;11462:13;11481:135;11526:10;11550:11;11575:7;11596:10;11481:31;:135::i;:::-;11459:157;;;;11626:176;11674:10;11698:11;11723:7;11744:5;11763;11782:10;11626:34;:176::i;:::-;11812:147;11855:7;11876:11;11901:5;11920;11939:10;11812:29;:147::i;:::-;11969:61;11992:11;12005:5;12012;12019:10;11969:22;:61::i;:::-;12082:10;12068:25;;;;:13;:25;;;;;;:36;;12098:5;12068:29;:36::i;:::-;12054:10;12040:25;;;;:13;:25;;;;;;;;:64;;;;12187:24;:36;;;;;-1:-1:-1;;;;;12187:49:4;;;;;;;;;12154:113;;;;;;;;;;;;;;;;;12040:25;;12154:113;;;;;;12187:49;12154:113;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12154:113:4;;;;;;;;;;;;;;;;;;;;;12250:7;12154:19;:113::i;:::-;12378:10;12353:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;12353:49:4;;;;;;;;;12114:153;;-1:-1:-1;12277:135:4;;12114:153;;12277:19;:135::i;:::-;12451:10;12426:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;12426:49:4;;;;;;;;;:56;12422:368;;12591:10;12503:30;12573:29;;;:17;:29;;;;;;;;12536:109;;;;;;;;;;;;;;;;;;;;;12573:29;12536:109;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12536:109:4;;;;;;;;;;;;;;;;;;;;;12620:11;12536:19;:109::i;:::-;12754:10;12736:29;;;;:17;:29;;;;;12503:142;;-1:-1:-1;12659:120:4;;12503:142;;12659:19;:120::i;:::-;12422:368;;12804:60;;;-1:-1:-1;;;;;12804:60:4;;;;;;;12853:10;;12804:60;;;12819:10;;12804:60;;;;;;;;;10792:2079;;;;;:::o;4413:1142::-;4529:6;4573:12;4559:11;:26;4551:57;;;;;-1:-1:-1;;;4551:57:4;;;;;;;;;;;;-1:-1:-1;;;4551:57:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;4640:23:4;;4618:19;4640:23;;;:14;:23;;;;;;;;4677:17;4673:56;;4717:1;4710:8;;;;;4673:56;-1:-1:-1;;;;;4742:29:4;;;;;;:20;:29;;;;;;;;:47;-1:-1:-1;;4772:16:4;;4742:47;;;;;;;;;;;:62;-1:-1:-1;4738:143:4;;-1:-1:-1;;;;;4827:25:4;;;;;;:16;:25;;;;;;;;-1:-1:-1;;4853:16:4;;;;4827:43;;;;;;;;;-1:-1:-1;;;;;4827:43:4;;-1:-1:-1;4820:50:4;;4738:143;-1:-1:-1;;;;;4894:29:4;;;;;;:20;:29;;;;;;;;:32;;;;;;;;;;;:46;-1:-1:-1;4890:85:4;;;4963:1;4956:8;;;;;4890:85;4984:12;-1:-1:-1;;5025:16:4;;5051:449;5066:5;5058:13;;:5;:13;;;5051:449;;;-1:-1:-1;;;;;5163:29:4;;5087:13;5163:29;;;:20;:29;;;;;;;;5129:1;5111:19;5112:13;;;5111:19;;;;;;5103:27;;5163:37;;;;;;;;;;;;;5229:25;;;:16;:25;;;;;:33;;;;;;;;;;5103:27;;5163:37;;-1:-1:-1;;;;;5229:33:4;5280:24;;;5276:214;;;5331:5;-1:-1:-1;5324:12:4;;-1:-1:-1;;;;;5324:12:4;5276:214;5373:11;5361:9;:23;;;5357:133;;;5412:6;5404:14;;5357:133;;;5474:1;5465:6;:10;5457:18;;5357:133;5051:449;;;;;;-1:-1:-1;;;;;;5516:25:4;;;;;;:16;:25;;;;;;;;:32;;;;;;;;;;;-1:-1:-1;;;;;5516:32:4;;-1:-1:-1;;4413:1142:4;;;;:::o;3603:632::-;3763:17;;-1:-1:-1;;;;;3763:17:4;3741:10;:40;3720:108;;;;;-1:-1:-1;;;3720:108:4;;;;;;;;;;;;-1:-1:-1;;;3720:108:4;;;;;;;;;;;;;;;3838:13;3854:44;3862:9;3854:44;;;;;;;;;;;;;-1:-1:-1;;;3854:44:4;;;:7;:44::i;:::-;3838:60;;3912:6;3908:321;;;3934:24;3944:5;3951:6;3934:9;:24::i;:::-;3908:321;;;-1:-1:-1;;;;;4006:16:4;;;;;;;:9;:16;;;;;;;;;3997:25;3989:59;;;;;-1:-1:-1;;;3989:59:4;;;;;;;;;;;;-1:-1:-1;;;3989:59:4;;;;;;;;;;;;;;;4123:6;-1:-1:-1;;;;;4087:42:4;:32;4113:5;4087:25;:32::i;:::-;-1:-1:-1;;;;;4087:42:4;;;4062:118;;;;;-1:-1:-1;;;4062:118:4;;;;;;;;;;;;-1:-1:-1;;;4062:118:4;;;;;;;;;;;;;;;4194:24;4204:5;4211:6;4194:9;:24::i;:::-;3603:632;;;;:::o;6864:166::-;6960:6;6989:34;7015:7;6989:25;:34::i;4241:166::-;4338:6;4367:33;4392:7;4367:24;:33::i;16203:1074::-;-1:-1:-1;;;;;16356:31:4;;;16319:7;16356:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:51;16421:8;16417:47;;16452:1;16445:8;;;;;16417:47;16494:12;;;;;;;;;-1:-1:-1;;;;;16494:12:4;-1:-1:-1;;;;;16494:34:4;;16529:11;16494:47;;;;;;;;;;;;;-1:-1:-1;;;;;16494:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16494:47:4;16473:113;;;;;-1:-1:-1;;;16473:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16473:113:4;;;;;;;;;;;;;;;16596:18;16617:16;:14;:16::i;:::-;-1:-1:-1;;;;;16686:44:4;;;16649:25;16686:44;;;:35;:44;;;;;;;;:57;;;;;;;;;;;;16596:37;;-1:-1:-1;16649:25:4;16686:62;:203;;-1:-1:-1;;;;;16832:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;16686:203;;;-1:-1:-1;;;;;16763:31:4;;;;;;;:22;:31;;;;;;;;:44;;;;;;;;;;;:47;;:54;;16815:1;;16763:44;:47;;;:54;16649:240;;16899:19;16921:12;;;;;;;;;-1:-1:-1;;;;;16921:12:4;-1:-1:-1;;;;;16921:39:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16921:41:4;;-1:-1:-1;16991:34:4;:17;16921:41;16991:21;:34::i;:::-;16978:10;:47;16972:89;;17049:1;17042:8;;;;;;;;16972:89;17089:181;17128:10;17156:11;17185:7;17210:17;17245:11;17089:21;:181::i;:::-;17070:200;16203:1074;-1:-1:-1;;;;;;;16203:1074:4:o;6498:141::-;6563:10;6577:1;6549:25;;;:13;:25;;;;;;6541:54;;;;;-1:-1:-1;;;6541:54:4;;;;;;;;;;;;-1:-1:-1;;;6541:54:4;;;;;;;;;;;;;;;6605:27;6621:10;6605:15;:27::i;:::-;6498:141::o;15511:686::-;15627:10;15565:25;15604:34;;;:22;:34;;;;;;15600:315;;15659:21;15683:29;15701:10;15683:17;:29::i;:::-;15659:53;-1:-1:-1;15734:18:4;15726:39;;;;;-1:-1:-1;;;15726:39:4;;;;;;;;;;;;-1:-1:-1;;;15726:39:4;;;;;;;;;;;;;;;15799:20;:13;15817:1;15799:17;:20::i;:::-;15779:40;;15600:315;;;;-1:-1:-1;15893:10:4;15870:34;;;;:22;:34;;;;;;15600:315;15939:16;:14;:16::i;:::-;15932:3;:23;;15924:47;;;;;-1:-1:-1;;;15924:47:4;;;;;;;;;;;;-1:-1:-1;;;15924:47:4;;;;;;;;;;;;;;;15981:19;16003:12;;;;;;;;;-1:-1:-1;;;;;16003:12:4;-1:-1:-1;;;;;16003:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16003:39:4;;-1:-1:-1;16066:34:4;:17;16003:39;16066:21;:34::i;:::-;16060:3;:40;16052:68;;;;;-1:-1:-1;;;16052:68:4;;;;;;;;;;;;-1:-1:-1;;;16052:68:4;;;;;;;;;;;;;;;16130:60;16142:3;16147:10;16159:17;16178:11;16130;:60::i;19254:793::-;-1:-1:-1;;;;;19421:29:4;;19359:7;19421:29;;;:22;:29;;;;;;19359:7;;19417:325;;19471:21;19495:24;19513:5;19495:17;:24::i;:::-;19471:48;-1:-1:-1;19537:18:4;19533:65;;19582:1;19575:8;;;;;;19533:65;19631:20;:13;19649:1;19631:17;:20::i;:::-;19611:40;;19417:325;;;;-1:-1:-1;;;;;;19702:29:4;;;;;;:22;:29;;;;;;19417:325;19766:16;:14;:16::i;:::-;19759:3;:23;;19751:47;;;;;-1:-1:-1;;;19751:47:4;;;;;;;;;;;;-1:-1:-1;;;19751:47:4;;;;;;;;;;;;;;;19808:19;19830:12;;;;;;;;;-1:-1:-1;;;;;19830:12:4;-1:-1:-1;;;;;19830:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19830:39:4;;-1:-1:-1;19891:34:4;:17;19830:39;19891:21;:34::i;:::-;19885:3;:40;19879:82;;19949:1;19942:8;;;;;;19879:82;19977:63;19997:3;20002:5;20009:17;20028:11;19977:19;:63::i;:::-;19970:70;19254:793;-1:-1:-1;;;;;19254:793:4:o;20053:911::-;20261:7;;;;20349:14;;:45;;20385:9;20349:45;;;20366:16;:14;:16::i;:::-;20425:12;;;:47;;;-1:-1:-1;;;20425:47:4;;-1:-1:-1;;;;;20425:47:4;;;;;;;;;;;;20335:59;;-1:-1:-1;20425:12:4;;;:34;;:47;;;;;;;;;;;;;;;:12;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20425:47:4;20404:113;;;;;-1:-1:-1;;;20404:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20404:113:4;;;;;;;;;;;;;;;20578:11;-1:-1:-1;;;;;20548:60:4;;20626:7;20548:99;;;;;;;;;;;;;-1:-1:-1;;;;;20548:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20548:99:4;20527:161;;;;;-1:-1:-1;;;20527:161:4;;;;;;;;;;;;-1:-1:-1;;;20527:161:4;;;;;;;;;;;;;;;20703:59;20734:5;20741:11;20754:7;20703:30;:59::i;:::-;20698:109;;20786:3;-1:-1:-1;20791:1:4;;-1:-1:-1;20791:1:4;;-1:-1:-1;20778:18:4;;20698:109;20831:16;:14;:16::i;:::-;20824:3;:23;;20816:47;;;;;-1:-1:-1;;;20816:47:4;;;;;;;;;;;;-1:-1:-1;;;20816:47:4;;;;;;;;;;;;;;;20892:65;20924:5;20931:11;20944:7;20953:3;20892:31;:65::i;:::-;20873:84;;;;;;;20053:911;;;;;;;;;:::o;7373:1987::-;7505:1;7496:6;:10;7488:30;;;;;-1:-1:-1;;;7488:30:4;;;;;;;;;;;;-1:-1:-1;;;7488:30:4;;;;;;;;;;;;;;;7549:12;;;;;;;;;-1:-1:-1;;;;;7549:12:4;-1:-1:-1;;;;;7549:34:4;;7584:11;7549:47;;;;;;;;;;;;;-1:-1:-1;;;;;7549:47:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7549:47:4;7528:113;;;;;-1:-1:-1;;;7528:113:4;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7528:113:4;;;;;;;;;;;;;;;7702:11;-1:-1:-1;;;;;7672:60:4;;7750:7;7672:99;;;;;;;;;;;;;-1:-1:-1;;;;;7672:99:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7672:99:4;7651:161;;;;;-1:-1:-1;;;7651:161:4;;;;;;;;;;;;-1:-1:-1;;;7651:161:4;;;;;;;;;;;;;;;7830:17;;:42;;;-1:-1:-1;;;7830:42:4;;-1:-1:-1;;;;;7830:42:4;;;;;;;;;:17;;;;;:33;;:42;;;;;;;;;;;;;;:17;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7830:42:4;7822:68;;;;;-1:-1:-1;;;7822:68:4;;;;;;;;;;;;-1:-1:-1;;;7822:68:4;;;;;;;;;;;;;;;7971:6;7929:37;7955:10;7929:25;:37::i;:::-;-1:-1:-1;;;;;7921:46:4;:56;;7900:119;;;;;-1:-1:-1;;;7900:119:4;;;;;;;;;;;;-1:-1:-1;;;7900:119:4;;;;;;;;;;;;;;;8034:64;8065:10;8077:11;8090:7;8034:30;:64::i;:::-;8029:386;;8244:12;;;:38;;;-1:-1:-1;;;8244:38:4;;;;-1:-1:-1;;;;;8244:12:4;;;;:36;;:38;;;;;;;;;;;;:12;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8244:38:4;8164:10;8139:36;;;;:24;8244:38;8139:36;;;;;;;-1:-1:-1;;;;;8139:49:4;;;;;;;;;:56;:101;;8221:1;8139:60;:101::i;:::-;:143;;8114:213;;;;;-1:-1:-1;;;8114:213:4;;;;;;;;;;;;-1:-1:-1;;;8114:213:4;;;;;;;;;;;;;;;8366:10;8341:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;8341:49:4;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8341:63:4;;;;;;;;;;8029:386;8429:48;8453:10;8465:11;8429:23;:48::i;:::-;8424:320;;8585:12;;;:42;;;-1:-1:-1;;;8585:42:4;;;;-1:-1:-1;;;;;8585:12:4;;;;:40;;:42;;;;;;;;;;;;:12;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8585:42:4;8536:10;8518:29;;;;:17;8585:42;8518:29;;;;:36;:43;;8559:1;8518:40;:43::i;:::-;:109;;8493:179;;;;;-1:-1:-1;;;8493:179:4;;;;;;;;;;;;-1:-1:-1;;;8493:179:4;;;;;;;;;;;;;;;8704:10;8686:29;;;;:17;:29;;;;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8686:47:4;-1:-1:-1;;;;;8686:47:4;;;;;8424:320;8753:18;8774:16;:14;:16::i;:::-;8753:37;;8800:176;8848:10;8872:11;8897:7;8918:6;8938:4;8956:10;8800:34;:176::i;:::-;8986:147;9029:7;9050:11;9075:6;9095:4;9113:10;8986:29;:147::i;:::-;9143:61;9166:11;9179:6;9187:4;9193:10;9143:22;:61::i;:::-;9256:10;9242:25;;;;:13;:25;;;;;;:37;;9272:6;9242:29;:37::i;:::-;9228:10;9214:25;;;;:13;:25;;;;;;;;;:65;;;;9294:59;;-1:-1:-1;;;;;9294:59:4;;;;;;;;;;;;;9342:10;;9294:59;;;9228:10;9294:59;;;;;;;;7373:1987;;;;:::o;18375:873::-;-1:-1:-1;;;;;18528:29:4;;18466:7;18528:29;;;:22;:29;;;;;;18466:7;;18524:325;;18578:21;18602:24;18620:5;18602:17;:24::i;:::-;18578:48;-1:-1:-1;18644:18:4;18640:65;;18689:1;18682:8;;;;;;18640:65;18738:20;:13;18756:1;18738:17;:20::i;:::-;18718:40;;18524:325;;;;-1:-1:-1;;;;;;18809:29:4;;;;;;:22;:29;;;;;;18524:325;18858:18;18879:16;:14;:16::i;:::-;18858:37;;18905:19;18927:12;;;;;;;;;-1:-1:-1;;;;;18927:12:4;-1:-1:-1;;;;;18927:37:4;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18927:39:4;;-1:-1:-1;18995:34:4;:17;18927:39;18995:21;:34::i;:::-;18982:10;:47;18976:89;;19053:1;19046:8;;;;;;;18976:89;19093:148;19130:10;19158:5;19181:17;19216:11;19093:19;:148::i;1263:20::-;;;;;;-1:-1:-1;;;;;1263:20:4;;:::o;1237:::-;;;;;;:::o;1321:134:0:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;35887:450:4:-;36033:4;;36049:260;-1:-1:-1;;;;;36098:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;:51;36094:55;;36049:260;;;-1:-1:-1;;;;;36195:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;;:47;;:58;;;;36240:1;;36195:47;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36195:47:4;:58;36191:108;;;36280:4;36273:11;;;;;36191:108;36163:3;;36049:260;;;-1:-1:-1;36325:5:4;;35887:450;-1:-1:-1;;;;35887:450:4:o;41939:116::-;41988:7;42014:34;42046:1;42014:27;:15;42034:6;42014:19;:27::i;:::-;:31;;:34::i;:::-;42007:41;;41939:116;:::o;22225:670::-;-1:-1:-1;;;;;22543:34:4;;;22430:7;22543:34;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;22509:90;;;;;;;;;;;;;;;;;22430:7;;;;;;22509:22;;22543:56;22509:90;;;22543:56;22509:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;22652:37:4;;;;;;;:30;:37;;;;;;;;:50;;;;;;;;;;:59;;;;;;;;;;;;22615:96;;;;;;;;;;;;;;;;;22509:90;;-1:-1:-1;22615:25:4;;:96;;-1:-1:-1;22652:59:4;-1:-1:-1;22615:96:4;;22652:59;22615:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;22768:41:4;;;;;;;:34;:41;;;;;;;;:54;;;;;;;;;;:63;;;;;;;;;;;;22727:104;;;;;;;;;;;;;;;;;22615:96;;-1:-1:-1;22727:29:4;;:104;;-1:-1:-1;22768:63:4;-1:-1:-1;22727:104:4;;22768:63;22727:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22848:40;22853:5;22860:8;22870:12;22884:3;22848:4;:40::i;:::-;22841:47;;;;;;;;;22225:670;;;;;;;;:::o;23965:632::-;-1:-1:-1;;;;;24224:34:4;;;24189:23;24224:34;;;:27;:34;;;;;;;;:47;;;;;;;;;;;;:56;;;;;;;;;;;;24334:37;;;:30;:37;;;;;:50;;;;;;;;:59;;;;;;;;24451:41;;;:34;:41;;;;;:54;;;;;;;;;:63;;;;;;;;;24524:66;24224:56;24334:59;24451:63;24563:6;24571;24579:10;24524:7;:66::i;:::-;23965:632;;;;;;;;;:::o;24603:554::-;-1:-1:-1;;;;;24820:31:4;;;24794:23;24820:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;;24918:34;;;:25;:34;;;;;:47;;;;;;;;25023:38;;;:29;:38;;;;;:51;;;;;;;;;25084:66;24820:44;24918:47;25023:51;25123:6;25131;25139:10;25084:7;:66::i;:::-;24603:554;;;;;;;;:::o;25163:444::-;-1:-1:-1;;;;;25348:28:4;;25322:23;25348:28;;;:15;:28;;;;;;;;25415:18;:31;;;;;25489:22;:35;;;;;25534:66;25348:28;25415:31;25489:35;25573:6;25581;25589:10;25534:7;:66::i;:::-;25163:444;;;;;;;:::o;23499:460::-;-1:-1:-1;;;;;23721:28:4;;23622:7;23721:28;;;:15;:28;;;;;;;;23696:53;;;;;;;;;;;;;;;;;23622:7;;;;23696:22;;:53;;23721:28;;23696:53;;23721:28;23696:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23787:31:4;;;;;;:18;:31;;;;;;;;;23759:59;;;;;;;;;;;;;;;;;23696:53;;-1:-1:-1;23759:25:4;;:59;;-1:-1:-1;23787:31:4;-1:-1:-1;23759:59:4;;23787:31;23759:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23860:35:4;;;;;;:22;:35;;;;;;;;;23828:67;;;;;;;;;;;;;;;;;23759:59;;-1:-1:-1;23828:29:4;;:67;;-1:-1:-1;23860:35:4;-1:-1:-1;23828:67:4;;23860:35;23828:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23912:40;23917:5;23924:8;23934:12;23948:3;23912:4;:40::i;:::-;23905:47;;;;;;;;;23499:460;;;;;:::o;874:176:0:-;932:7;963:5;;;986:6;;;;978:46;;;;;-1:-1:-1;;;978:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;38296:1120:4;38499:7;;;38575:24;:17;38597:1;38575:21;:24::i;:::-;38561:38;;38543:843;38620:24;:7;38632:11;38620;:24::i;:::-;38613:3;:31;38543:843;;38693:36;38733:83;38770:11;38799:3;38733:19;:83::i;:::-;38688:128;-1:-1:-1;;;38834:33:4;38830:80;;38887:8;;;38830:80;38928:32;38964:115;39008:7;39033:11;39062:3;38964:26;:115::i;:::-;39120:12;;;:71;;;-1:-1:-1;;;39120:71:4;;;;;;;;;38923:156;;-1:-1:-1;39093:24:4;;-1:-1:-1;;;;;;39120:12:4;;-1:-1:-1;39120:36:4;;:71;;;;;;;;;;;;;;:12;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39120:71:4;;-1:-1:-1;39205:14:4;39222:110;39290:28;39222:46;39120:71;39243:24;39222:20;:46::i;:::-;:50;;:110::i;:::-;39205:127;-1:-1:-1;39356:19:4;:7;39205:127;39356:11;:19::i;:::-;39346:29;;38543:843;;;;;38658:5;;38543:843;;;-1:-1:-1;39402:7:4;38296:1120;-1:-1:-1;;;;;;38296:1120:4:o;31706:365::-;-1:-1:-1;;;;;31808:20:4;;;31782:23;31808:20;;;:9;:20;;;;;;;;;;31864:8;:19;;;;;;31893:20;;;;:32;;;-1:-1:-1;;;;;;31893:32:4;;;;;;;31940:54;;31808:20;;;;;-1:-1:-1;;;;;31864:19:4;;;;31893:32;;31808:20;;;31940:54;;31782:23;31940:54;32004:60;32019:15;32036:9;32047:16;32004:14;:60::i;42671:1161::-;42736:7;;;42785:1016;-1:-1:-1;;;;;42809:24:4;;;;;;:17;:24;;;;;:31;42805:35;;42785:1016;;;-1:-1:-1;;;;;42883:24:4;;42861:19;42883:24;;;:17;:24;;;;;:27;;42908:1;;42883:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;42883:27:4;;-1:-1:-1;42924:867:4;-1:-1:-1;;;;;42981:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;:51;42977:55;;42924:867;;;-1:-1:-1;;;;;43126:31:4;;;43091:15;43126:31;;;:24;:31;;;;;;;;:44;;;;;;;;;;;:47;;43171:1;;43126:47;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43216:34:4;;;;;:27;:34;;;;;;:47;;;;;;;;;;43126;;;;43216:56;;;;;;;;:88;43126:47;;-1:-1:-1;43216:93:4;43191:586;;43354:13;43350:409;;-1:-1:-1;;;;;43406:34:4;;;;;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;:59;;:56;;:34;:59;;;;;;;;;;;;43395:70;;43350:409;;;-1:-1:-1;;;;;43523:34:4;;;;;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;:59;;43609:8;;43523:34;:59;;;;;;;;;;;;:94;43494:265;;;-1:-1:-1;;;;;43677:34:4;;;;;;;:27;:34;;;;;;;;:47;;;;;;;;;;:56;;;;;;;;;;;:59;;:56;;:34;:59;;;;;;;;;;;;43666:70;;43494:265;-1:-1:-1;43050:3:4;;42924:867;;;-1:-1:-1;;42842:3:4;;42785:1016;;;-1:-1:-1;43817:8:4;42671:1161;-1:-1:-1;;42671:1161:4:o;39422:527::-;39580:15;39598:125;39631:7;39652:5;39671:17;39702:11;39598:19;:125::i;:::-;39580:143;;39751:1;39741:7;:11;39733:34;;;;;-1:-1:-1;;;39733:34:4;;;;;;;;;;;;-1:-1:-1;;;39733:34:4;;;;;;;;;;;;;;;39809:24;:7;39821:11;39809;:24::i;:::-;-1:-1:-1;;;;;39777:29:4;;;;;;;:22;:29;;;;;;:56;;;;39843:12;;;:43;;-1:-1:-1;;;39843:43:4;;;;;;;;;;;;;;;;;:12;;;;;:27;;:43;;;;;39777:29;;39843:43;;;;;39777:29;39843:12;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39925:16;:14;:16::i;:::-;39901:41;;;;;;;;-1:-1:-1;;;;;39901:41:4;;;;;;;;;;;;;39422:527;;;;;:::o;37647:643::-;37838:15;37856:154;37891:7;37912:11;37937:7;37958:17;37989:11;37856:21;:154::i;:::-;37838:172;;38038:1;38028:7;:11;38020:34;;;;;-1:-1:-1;;;38020:34:4;;;;;;;;;;;;-1:-1:-1;;;38020:34:4;;;;;;;;;;;;;;;38124:46;:7;38149:11;38124;:46::i;:::-;-1:-1:-1;;;;;38064:44:4;;;;;;;:35;:44;;;;;;;;:57;;;;;;;;;;;:106;;;;38180:12;;;:45;;-1:-1:-1;;;38180:45:4;;;;;;;;;;;;;;;;;:12;;;;;:27;;:45;;;;;38064:44;;38180:45;;;;;38064:44;38180:12;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38266:16;:14;:16::i;:::-;38240:43;;;;;;;;-1:-1:-1;;;;;38240:43:4;;;;;;;;;;;;;37647:643;;;;;;:::o;22901:592::-;-1:-1:-1;;;;;23177:31:4;;;23078:7;23177:31;;;:22;:31;;;;;;;;:44;;;;;;;;;;;23152:69;;;;;;;;;;;;;;;;;23078:7;;;;;;23152:22;;23177:44;23152:69;;;23177:44;23152:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23274:34:4;;;;;;;:25;:34;;;;;;;;:47;;;;;;;;;;;;23237:84;;;;;;;;;;;;;;;;;23152:69;;-1:-1:-1;23237:25:4;;:84;;-1:-1:-1;23274:47:4;-1:-1:-1;23237:84:4;;23274:47;23237:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;23378:38:4;;;;;;;:29;:38;;;;;;;;:51;;;;;;;;;;;;23337:92;;;;;;;;;;;;;;;;;23237:84;;-1:-1:-1;23337:29:4;;:92;;-1:-1:-1;23378:51:4;-1:-1:-1;23337:92:4;;23378:51;23337:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23446:40;23451:5;23458:8;23468:12;23482:3;23446:4;:40::i;:::-;23439:47;;;;;;;;;22901:592;;;;;;;:::o;35539:342::-;35655:4;;35675:178;-1:-1:-1;;;;;35699:24:4;;;;;;:17;:24;;;;;:31;35695:35;;35675:178;;;-1:-1:-1;;;;;35755:24:4;;;;;;;:17;:24;;;;;:27;;:42;;;;35780:1;;35755:27;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35755:27:4;:42;35751:92;;;35824:4;35817:11;;;;;35751:92;35732:3;;35675:178;;;-1:-1:-1;35869:5:4;;35539:342;-1:-1:-1;;;35539:342:4:o;42340:325::-;42457:7;42480:13;42508:9;42503:134;42527:5;:12;42523:1;:16;42503:134;;;42576:7;-1:-1:-1;;;;;42564:19:4;:5;42570:1;42564:8;;;;;;;;;;;;;;-1:-1:-1;;;;;42564:19:4;;42560:67;;;42611:1;42603:9;;42560:67;42541:3;;42503:134;;;-1:-1:-1;42653:5:4;42340:325;-1:-1:-1;;;42340:325:4:o;42061:273::-;42174:12;;:19;;42191:1;42174:16;:19::i;:::-;42165:5;:28;42161:167;;;42209:5;:11;;;;;;;;;;;;;;;;-1:-1:-1;;42209:11:4;;;;;-1:-1:-1;;;;;;42209:11:4;;;;;;42161:167;;;42272:12;;42266:5;;42272:19;;42289:1;42272:16;:19::i;:::-;42266:26;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42266:26:4;42251:5;42257;42251:12;;;;;;;;;;;;;;;;:41;;;;;-1:-1:-1;;;;;42251:41:4;;;;;-1:-1:-1;;;;;42251:41:4;;;;;;42306:5;:11;;;;;;;;;;;;;;;;-1:-1:-1;;42306:11:4;;;;;-1:-1:-1;;;;;;42306:11:4;;;;;;42161:167;42061:273;;:::o;34204:190::-;34307:6;34348:12;-1:-1:-1;;;34337:9:4;;34329:32;;;;-1:-1:-1;;;34329:32:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34385:1:4;;34204:190;-1:-1:-1;;34204:190:4:o;30607:325::-;-1:-1:-1;;;;;30683:19:4;;30675:44;;;;;-1:-1:-1;;;30675:44:4;;;;;;;;;;;;-1:-1:-1;;;30675:44:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;30767:15:4;;;;;;:8;:15;;;;;;;;;;30747:102;;;;;;;;;;;-1:-1:-1;;;30747:102:4;;;;;;;;;-1:-1:-1;;;;;30767:15:4;;;;30796:6;;30747;:102::i;:::-;-1:-1:-1;;;;;30729:15:4;;;;;;:8;:15;;;;;:120;;-1:-1:-1;;;;;;30729:120:4;-1:-1:-1;;;;;30729:120:4;;;;;;;;;;30859:28;30729:15;30880:6;30859:13;:28::i;:::-;30902:23;;;-1:-1:-1;;;;;30902:23:4;;;;;;-1:-1:-1;;;;;30902:23:4;;;;;;;;;;;;;30607:325;;:::o;35093:440::-;35192:6;35214:20;35237:33;35262:7;35237:24;:33::i;:::-;35214:56;-1:-1:-1;;;;;;35299:18:4;;;:227;;35392:134;35425:13;:22;35439:7;-1:-1:-1;;;;;35425:22:4;-1:-1:-1;;;;;35425:22:4;;;;;;;;;;;;;35392:134;;;;;;;;;;;;;;;;;:7;:134::i;:::-;35356:13;:170;35299:227;;;35336:1;35280:246;35093:440;-1:-1:-1;;;35093:440:4:o;30938:281::-;-1:-1:-1;;;;;31044:15:4;;;;;;:8;:15;;;;;;;;;;31024:108;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31044:15:4;;;;31073:6;;31024;:108::i;:::-;-1:-1:-1;;;;;31006:15:4;;;;;;:8;:15;;;;;:126;;-1:-1:-1;;;;;;31006:126:4;-1:-1:-1;;;;;31006:126:4;;;;;;;;;;31142:32;31006:15;31167:6;31142:17;:32::i;:::-;31189:23;;;-1:-1:-1;;;;;31189:23:4;;;;;;-1:-1:-1;;;;;31189:23:4;;;;;;;;;;;;;30938:281;;:::o;34820:267::-;-1:-1:-1;;;;;34962:23:4;;34918:6;34962:23;;;:14;:23;;;;;;;;35014:16;:66;;35079:1;35014:66;;;-1:-1:-1;;;;;35033:25:4;;;;;;:16;:25;;;;;;;;:43;-1:-1:-1;;35059:16:4;;35033:43;;;;;;;;;-1:-1:-1;;;;;35033:43:4;34995:85;;;34820:267;;;:::o;36343:1298::-;36402:18;36423:16;:14;:16::i;:::-;36402:37;;36454:9;36449:1186;-1:-1:-1;;;;;36473:24:4;;;;;;:17;:24;;;;;:31;36469:35;;36449:1186;;;-1:-1:-1;;;;;36547:24:4;;36525:19;36547:24;;;:17;:24;;;;;:27;;36572:1;;36547:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36635:31:4;;;;;:24;:31;;;;;;36547:27;;;;36635:44;;;;;;;;;;36594:85;;;;;;;;;;;;;;;;;36547:27;;-1:-1:-1;36594:25:4;;:85;;36635:44;;36594:85;;;36635:44;36594:85;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36594:85:4;;;;;;;;;;;;;;;;;;;;;;;36698:9;36693:932;36717:8;:15;36713:1;:19;36693:932;;;36757:15;36775:8;36784:1;36775:11;;;;;;;;;;;;;;36757:29;;36807:14;36827:170;36880:5;36907:11;36940:7;36969:10;36827:31;:170::i;:::-;36804:193;;;;37015:228;37071:5;37098:11;37131:7;37160:6;37188:5;37215:10;37015:34;:228::i;:::-;37261:196;37312:7;37341:11;37374:6;37402:5;37429:10;37261:29;:196::i;:::-;37475:62;37498:11;37511:6;37519:5;37526:10;37475:22;:62::i;:::-;-1:-1:-1;;;;;37578:20:4;;;;;;:13;:20;;;;;;:32;;37603:6;37578:24;:32::i;:::-;-1:-1:-1;;;;;37555:20:4;;;;;;:13;:20;;;;;:55;-1:-1:-1;;36734:3:4;;36693:932;;;-1:-1:-1;;;36506:3:4;;36449:1186;;39955:1978;-1:-1:-1;;;;;40201:24:4;;40125:7;40201:24;;;:17;:24;;;;;;;;40169:56;;;;;;;;;;;;;;;;;40125:7;;40169:29;;:56;40201:24;40169:56;;;40201:24;40169:56;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40169:56:4;;;;;;;;;;;;;;;;;;;;;;;40253:11;40267:24;40289:1;40267:17;:21;;:24;;;;:::i;:::-;40253:38;;40235:1668;40312:24;:7;40324:11;40312;:24::i;:::-;40305:3;:31;40235:1668;;40385:9;40380:1513;40404:12;:19;40400:1;:23;40380:1513;;;40448:19;40470:12;40483:1;40470:15;;;;;;;;;;;;;;40448:37;;40569:36;40626:37;40646:11;40659:3;40626:19;:37::i;:::-;40503:160;-1:-1:-1;;;40685:33:4;40681:88;;40742:8;;;;40681:88;-1:-1:-1;;;;;40837:31:4;;;;;;;:24;:31;;;;;;;;:44;;;;;;;;;;;;40792:89;;;;;;;;;;;;;;;;;:25;;:89;;;40837:44;40792:89;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40792:89:4;;;;;;;;;;;;;;;;;;;;;;;40899:41;40963:9;40975:1;40963:13;;40958:586;40982:8;:15;40978:1;:19;40958:586;;;41026:15;41044:8;41053:1;41044:11;;;;;;;;;;;;;;41026:29;;41155:24;41204:183;41261:5;41292:11;41329:7;41362:3;41204:31;:183::i;:::-;41077:310;-1:-1:-1;41445:80:4;;-1:-1:-1;41445:33:4;;-1:-1:-1;41077:310:4;41445:62;:80::i;:::-;41409:116;-1:-1:-1;;;40999:3:4;;40958:586;;;-1:-1:-1;41588:12:4;;;:77;;;-1:-1:-1;;;41588:77:4;;;;;;;;;41561:24;;-1:-1:-1;;;;;41588:12:4;;;;:34;;:77;;;;;;;;;;;;;;:12;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41588:77:4;;-1:-1:-1;41683:14:4;41700:131;41802:28;41700:76;41588:77;41742:33;41700:41;:76::i;:131::-;41683:148;-1:-1:-1;41859:19:4;:7;41683:148;41859:11;:19::i;:::-;41849:29;;40380:1513;;;;;;;40425:3;;40380:1513;;;-1:-1:-1;40350:5:4;;40235:1668;;;-1:-1:-1;41919:7:4;;39955:1978;-1:-1:-1;;;;;;39955:1978:4:o;1746:187:0:-;1832:7;1867:12;1859:6;;;;1851:29;;;;-1:-1:-1;;;1851:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1902:5:0;;;1746:187::o;3101:130::-;3159:7;3185:39;3189:1;3192;3185:39;;;;;;;;;;;;;;;;;:3;:39::i;25613:837:4:-;25908:12;;25820:7;;;;;;25934:8;25930:57;;25966:3;25971:1;25974;25958:18;;;;;;;;;25930:57;26006:5;26012:1;26006:8;;;;;;;;;;;;;;26000:3;:14;25996:63;;;26038:3;26043:1;26046;26030:18;;;;;;;;;25996:63;26068:17;26088:10;:3;26096:1;26088:7;:10::i;:::-;26068:30;;26108:20;26131:5;26137:9;26131:16;;;;;;;;;;;;;;26108:39;;26168:12;26161:3;:19;26157:229;;;26204:3;26209:8;26218:9;26209:19;;;;;;;;;;;;;;26230:12;26243:9;26230:23;;;;;;;;;;;;;;26196:58;;;;;;;;;;;26157:229;26281:12;26275:3;:18;26271:115;;;26317:3;26322:8;26331:9;26322:19;;;;;;;;;;;;;;26343:31;26367:6;26343:8;26352:9;26343:19;;;;;;;;;;;;;;:23;;:31;;;;:::i;:::-;26309:66;;;;;;;;;;;26271:115;26402:41;26408:5;26415:8;26425:12;26439:3;26402:5;:41::i;28080:2521::-;28318:12;;28364:6;28413:15;:31;;;28304:11;28485:63;28364:6;28413:31;28485:17;:63::i;:::-;28454:94;-1:-1:-1;28563:8:4;28559:2036;;28591:6;28587:250;;;28617:22;;;;;;;;-1:-1:-1;28617:22:4;;;;;;;;;;;;;28657:21;;;;;;;;;;;;;;;;;;28696:12;28714:32;28671:6;28725:20;28714:10;:32::i;:::-;28696:51;;;;;;;-1:-1:-1;28696:51:4;;;;;;;;;;;28587:250;;;28786:36;;;-1:-1:-1;;;28786:36:4;;;;;;;;;;;;-1:-1:-1;;;28786:36:4;;;;;;;;;;;;;;;28559:2036;;;28867:17;28887:10;:3;28895:1;28887:7;:10::i;:::-;28867:30;;28911:20;28934:5;28940:9;28934:16;;;;;;;;;;;;;;;;28911:39;;28964:23;28990:8;28999:9;28990:19;;;;;;;;;;;;;;;;28964:45;;29023:23;29049:12;29062:9;29049:23;;;;;;;;;;;;;;;;29023:49;;29087:17;29118:22;29175:10;29159:12;:26;29155:1430;;;29209:6;29205:532;;;29251:27;:15;29271:6;29251:19;:27::i;:::-;29239:39;-1:-1:-1;29317:99:4;29362:32;:6;29373:20;29362:10;:32::i;:::-;29317:15;;:19;:99::i;:::-;29300:116;;29205:532;;;29490:6;29471:15;:25;;29463:56;;;;;-1:-1:-1;;;29463:56:4;;;;;;;;;;;;-1:-1:-1;;;29463:56:4;;;;;;;;;;;;;;;29553:27;:15;29573:6;29553:19;:27::i;:::-;29541:39;-1:-1:-1;29619:99:4;29664:32;:6;29675:20;29664:10;:32::i;:::-;29619:15;;:19;:99::i;:::-;29602:116;;29205:532;29776:9;29754:8;29763:9;29754:19;;;;;;;;;;;;;;;:31;;;;29829:14;29803:12;29816:9;29803:23;;;;;;;;;;;;;;;;;:40;29155:1430;;;29886:6;29882:556;;;29928:27;:15;29948:6;29928:19;:27::i;:::-;29916:39;-1:-1:-1;29994:111:4;30051:32;:6;30062:20;30051:10;:32::i;:::-;29994:27;:15;30014:6;29994:19;:27::i;:111::-;29977:128;;29882:556;;;30179:6;30160:15;:25;;30152:56;;;;;-1:-1:-1;;;30152:56:4;;;;;;;;;;;;-1:-1:-1;;;30152:56:4;;;;;;;;;;;;;;;30242:27;:15;30262:6;30242:19;:27::i;:::-;30230:39;-1:-1:-1;30308:111:4;30365:32;:6;30376:20;30365:10;:32::i;:::-;30308:27;:15;30328:6;30308:19;:27::i;:::-;:31;;:111::i;:::-;30291:128;;29882:556;30455:5;30466:10;30455:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30495:8;30509:9;30495:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30537:12;30555:14;30537:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29155:1430;28559:2036;;;;;;;28080:2521;;;;;;;;;;:::o;2180:459:0:-;2238:7;2479:6;2475:45;;-1:-1:-1;2508:1:0;2501:8;;2475:45;2542:5;;;2546:1;2542;:5;:1;2565:5;;;;;:10;2557:56;;;;-1:-1:-1;;;2557:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32077:1152:4;32211:6;-1:-1:-1;;;;;32201:16:4;:6;-1:-1:-1;;;;;32201:16:4;;;:30;;;;;32230:1;32221:6;-1:-1:-1;;;;;32221:10:4;;32201:30;32197:1026;;;-1:-1:-1;;;;;32251:20:4;;;32247:477;;-1:-1:-1;;;;;32310:22:4;;32291:16;32310:22;;;:14;:22;;;;;;;;;32369:13;:99;;32467:1;32369:99;;;-1:-1:-1;;;;;32405:24:4;;;;;;:16;:24;;;;;;;;:39;-1:-1:-1;;32430:13:4;;32405:39;;;;;;;;;-1:-1:-1;;;;;32405:39:4;32369:99;32350:118;;32486:16;32505:129;32533:9;32564:6;32505:129;;;;;;;;;;;;;-1:-1:-1;;;32505:129:4;;;:6;:129::i;:::-;32486:148;;32652:57;32669:6;32677:9;32688;32699;32652:16;:57::i;:::-;32247:477;;;;-1:-1:-1;;;;;32741:20:4;;;32737:476;;-1:-1:-1;;;;;32800:22:4;;32781:16;32800:22;;;:14;:22;;;;;;;;;32859:13;:99;;32957:1;32859:99;;;-1:-1:-1;;;;;32895:24:4;;;;;;:16;:24;;;;;;;;:39;-1:-1:-1;;32920:13:4;;32895:39;;;;;;;;;-1:-1:-1;;;;;32895:39:4;32859:99;32840:118;;32976:16;32995:128;33023:9;33054:6;32995:128;;;;;;;;;;;;;-1:-1:-1;;;32995:128:4;;;:6;:128::i;:::-;32976:147;;33141:57;33158:6;33166:9;33177;33188;33141:16;:57::i;:::-;32737:476;;;32077:1152;;;:::o;34400:215::-;34517:6;34546:5;;;34577:12;-1:-1:-1;;;;;34569:6:4;;;;;;;;34561:29;;;;-1:-1:-1;;;34561:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34607:1:4;34400:215;-1:-1:-1;;;;34400:215:4:o;31225:281::-;-1:-1:-1;;;;;31302:17:4;;;31331:1;31302:17;;;:9;:17;;;;;;;31298:88;;-1:-1:-1;;;;;31349:17:4;;;;;;:9;:17;;;;;:26;;-1:-1:-1;;;;;;31349:26:4;;;;;;31298:88;-1:-1:-1;;;;;31421:17:4;;;31395:23;31421:17;;;:9;:17;;;;;;;;;;31448:51;;31421:17;31492:6;31448:14;:51::i;34621:193::-;34738:6;34769:1;-1:-1:-1;;;;;34764:6:4;:1;-1:-1:-1;;;;;34764:6:4;;;34772:12;34756:29;;;;;-1:-1:-1;;;34756:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31512:188;-1:-1:-1;;;;;31615:17:4;;;31589:23;31615:17;;;:9;:17;;;;;;;;;;31642:51;;31615:17;;31686:6;31642:14;:51::i;3713:272:0:-;3799:7;3833:12;3826:5;3818:28;;;;-1:-1:-1;;;3818:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3856:9;3872:1;3868;:5;;;;;;;3713:272;-1:-1:-1;;;;;3713:272:0:o;26456:1618:4:-;26664:7;26685;26706;26738:12;26753:1;26738:16;;26764:13;26780:19;26797:1;26780:5;:12;:16;;:19;;;;:::i;:::-;26764:35;-1:-1:-1;26809:14:4;26826:22;26846:1;26826:15;26764:35;26836:4;26826:9;:15::i;:22::-;26809:39;;26858:1049;26872:5;26865:4;:12;26858:1049;;;26914:3;26897:5;26903:6;26897:13;;;;;;;;;;;;;;:20;26893:959;;;26945:3;26950:8;26959:6;26950:16;;;;;;;;;;;;;;26968:12;26981:6;26968:20;;;;;;;26893:959;27030:3;27014:5;27020:6;27014:13;;;;;;;;;;;;;;:19;27010:842;;;27066:1;27057:6;:10;:40;;;;-1:-1:-1;27094:3:4;27071:5;27077:13;:6;27088:1;27077:10;:13::i;:::-;27071:20;;;;;;;;;;;;;;:26;27057:40;27053:255;;;27154:3;27183:8;27192:13;:6;27203:1;27192:10;:13::i;:::-;27183:23;;;;;;;;;;;;;;27232:35;27260:6;27232:8;27241:13;27252:1;27241:6;:10;;:13;;;;:::i;:::-;27232:23;;;;;;;27053:255;27329:11;27325:76;;27372:3;27377:1;27380;27364:18;;;;;;;;;;;27325:76;27426:13;:6;27437:1;27426:10;:13::i;:::-;27418:21;;27010:842;;;27480:3;27464:5;27470:6;27464:13;;;;;;;;;;;;;;:19;27460:392;;;27537:12;;:19;;27554:1;27537:16;:19::i;:::-;27528:6;:28;:58;;;;-1:-1:-1;27583:3:4;27560:5;27566:13;:6;27577:1;27566:10;:13::i;:::-;27560:20;;;;;;;;;;;;;;:26;27528:58;27503:297;;;27660:3;27689:8;27698:6;27689:16;;;;;;;;;;;;;;27731:28;27752:6;27731:8;27740:6;27731:16;;;;;;;27503:297;27824:13;:6;27835:1;27824:10;:13::i;:::-;27817:20;;27460:392;27874:22;27894:1;27874:15;:5;27884:4;27874:9;:15::i;:22::-;27865:31;;26858:1049;;;27937:3;27920:5;27926:6;27920:13;;;;;;;;;;;;;;:20;27916:152;;27964:3;27969:1;27972;27956:18;;;;;;;;;;;27916:152;28013:3;28018:8;28027:6;28018:16;;;;;;;33235:767;33392:18;33413:87;33434:12;33413:87;;;;;;;;;;;;;;;;;:7;:87::i;:::-;33392:108;;33542:1;33527:12;:16;;;:96;;;;-1:-1:-1;;;;;;33559:31:4;;;;;;:20;:31;;;;;;;;:64;-1:-1:-1;;33591:16:4;;33559:49;;;;;;;;;;:64;;;:49;;:64;33527:96;33510:419;;;-1:-1:-1;;;;;33648:27:4;;;;;;:16;:27;;;;;;;;-1:-1:-1;;33676:16:4;;33648:45;;;;;;;;;:56;;-1:-1:-1;;;;;;33648:56:4;-1:-1:-1;;;;;33648:56:4;;;;;33510:419;;;-1:-1:-1;;;;;33735:31:4;;;;;;:20;:31;;;;;;;;:45;;;;;;;;;;;;;:59;;-1:-1:-1;;33735:59:4;;;;;;;;;;33808:27;;;:16;:27;;;;;:41;;;;;;;;;:52;;-1:-1:-1;;;;;;33808:52:4;-1:-1:-1;;;;;33808:52:4;;;;;33874:25;;;:14;:25;;;;;;:44;;;;;-1:-1:-1;33902:16:4;;33874:44;;;;;;;;;33510:419;33944:51;;;-1:-1:-1;;;;;33944:51:4;;;;;;;;;;;;;-1:-1:-1;;;;;33944:51:4;;;;;;;;;;;33235:767;;;;;:::o;34008:190::-;34111:6;34152:12;34145:5;34141:9;;34133:32;;;;-1:-1:-1;;;34133:32:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://98179f4fe2fcb854dc6a1d380a76130dff5414b0d11407aa3f739a2b69783f36

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.