Sponsored:   Ubex.com: Top ratings from all agencies. Big partnerships. 70% hard cap reached. Join us!
 Latest 25 txns from a total Of 28 transactions

TxHash Age From To Value [TxFee]
0xec1b4fc739884f0c0430f0b460dd173ed7f7649174aec4a287113fa3b9128e2d5 days 21 hrs ago0x55a49af2c3fa307a474796981734f63bf8462908  IN   TheAbyssPollManagedFund0 Ether0.00045962
0x73ae97845bcba4df97ce4e833af4f7f541fc4db70ecbf7942c1163769e5e1ead5 days 23 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.010527855
0x32d738927a60af137739da1d9c2deb3ed299db6002ecbedb80065f5ab74f2f6a6 days 22 hrs ago0x767c091240b8a3148eba8707cf0223f4f3094480  IN   TheAbyssPollManagedFund0 Ether0.000164335
0x437b92f407f09d054606b9a934dbd9ff99072d0b1ec2d43655441fe08ad7433620 days 11 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.00079564
0x7d6f089fed02ffaa55a5a8ef6cdab6187067295bfd31f765a59fe96b2e5407f025 days 2 hrs ago0xe6fbe6582648dd4dad45cd00392e84bfb179ee6b  IN   TheAbyssPollManagedFund0 Ether0.000115825
0xa67de205c624b6671b1ddcdbef58699613116ad2cf561507fd7162cfae4e9fc232 days 22 hrs ago0xd661ac48af77605b25d42446ab394cd98e1a0747  IN   TheAbyssPollManagedFund0 Ether0.000023045
0x169cbd5233bd656cd628ac2ccd1357f0112e48173ae40a0cbbd6854776a4e4f033 days 1 hr ago0xd661ac48af77605b25d42446ab394cd98e1a0747  IN   TheAbyssPollManagedFund0 Ether0.000032288
0x340c67611832f337f26813dc831e99441210c4710d00a607993d76c54fe742ed35 days 7 hrs ago0x785772f90c4d47eba89f56dc431160090293a82b  IN   TheAbyssPollManagedFund0 Ether0.00023045
0x75724f193ceb931de654e715e663566ce2e08bddaba76d8d1c7ac3a5077086be35 days 23 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.002812008
0x00b3980edabcda430f93d79de2402c14fc08a4b1617c8f684e90b6ccfb11e37644 days 3 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.00059673
0xc99e2a65e3452bdd77c9e8f33562ea59b5f6f5671d083f806322a2d9151e5a8e44 days 3 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.00037182
0x8a6461df29b64dc9142e053075cbc1bf107418c4f29292ea9f54789f8a98606266 days 8 hrs ago0x100c00ddc802e40f969095374b0cc3b3fd0abc0f  IN   TheAbyssPollManagedFund0.01 Ether0.000861
0x322103e6e82a43eb5d015645f4ac4e007b9b5da97e189972434c70eeafc013e787 days 8 hrs ago0x58e47357af4949ba8d5ae5e528f4a6eb719a010f  IN   TheAbyssPollManagedFund0.2 Ether0.001681706937
0x78ba2f5dd1d49928d6f517e9e8e2a6ec162743bf229f1a506075251a64102e8187 days 16 hrs ago0x48b577bef96ff15ca0d02a0c055efdd151526b89  IN   TheAbyssPollManagedFund3 Ether0.000862886
0x2055bad38ca3609fc4f58056bc5048b5fe8545fb06b49f9dd0936ce04751b50887 days 18 hrs ago0x845dbb80bd79d1193c4d3f620dcbf937f54b8064  IN   TheAbyssPollManagedFund0.054598676 Ether0.002083554
0x1d7a78cd6c2dfc884d2be5f8d49a726a49d303c10b9d3bba61e754b4787a601a87 days 20 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.00063138
0xa4e074af7289908023a6550b5ccdfc9f230d0302a51ee95fd569a72bafaebf2887 days 20 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.002083554
0x7d8465f6f2fcc2b986a492129430948cfca081301cfaff04d53858ac30ae3f8687 days 20 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.00063138
0x55ea7385b15c991452dd1a39cf8ce97e37d041bfa7c600f7ecaa2bbb1bf1cc0687 days 20 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund6 Ether0.002083554
0xfc1b408af512bc85638a7f0c8890e4c27ce5f0ded85ef4409cc50dff05f317a287 days 20 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund5 Ether0.002083554
0x39bf94e2c4d6fdd6534820eb6d40abf46864b37048f1b5ff88d08f91b56159a487 days 20 hrs ago0x845dbb80bd79d1193c4d3f620dcbf937f54b8064  IN   TheAbyssPollManagedFund0.062932892 Ether0.002083554
0xde38bcd22d3d2d5aad4b8f8c25c2f4dccfdb92d6fa7b6f6dc20259e93cd6cd4487 days 21 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund1 Ether0.002083554
0x7fb15bdea1b17315aa22d7db9c4188180f77902a174db7d1758f503d88c0fe6f87 days 21 hrs ago0xe09752295780f187266c4b1a210405f6b071a8a6  IN   TheAbyssPollManagedFund1 Ether0.000441966
0x7b3061a7895b3e46a1b5cdf5cfe85bd1b2906ab2328a888b3a543d5f23f53b6087 days 22 hrs ago0x845dbb80bd79d1193c4d3f620dcbf937f54b8064  IN   TheAbyssPollManagedFund0.065016446 Ether0.002083554
0xb7330708b941fb7d181b1be1aa4a6f65d98c3bc570aaabf40591e310130fd7ad88 days 19 hrs ago0x5eaf0a37346ff992199fbc4480c9ccc4137d9c1f  IN   TheAbyssPollManagedFund0 Ether0.00008911
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here to View More View All
ParentTxHash Block Age From To Value
0x73ae97845bcba4df97ce4e833af4f7f541fc4db70ecbf7942c1163769e5e1ead59359395 days 23 hrs ago0x49db6ee4507132d1fdac92318e0e6150bf786728  Contract Creation0 Ether
0x437b92f407f09d054606b9a934dbd9ff99072d0b1ec2d43655441fe08ad74336585150820 days 11 hrs ago0x49db6ee4507132d1fdac92318e0e6150bf7867280xe45f9c10f3e4647ac922b0128e688e8e1f220f5f591.349247685183444253 Ether
0x75724f193ceb931de654e715e663566ce2e08bddaba76d8d1c7ac3a5077086be576166735 days 23 hrs ago0x49db6ee4507132d1fdac92318e0e6150bf786728  Contract Creation0 Ether
0x00b3980edabcda430f93d79de2402c14fc08a4b1617c8f684e90b6ccfb11e376571553944 days 3 hrs ago0x49db6ee4507132d1fdac92318e0e6150bf7867280xe45f9c10f3e4647ac922b0128e688e8e1f220f5f270.600501543209547493 Ether
0xc99e2a65e3452bdd77c9e8f33562ea59b5f6f5671d083f806322a2d9151e5a8e571552644 days 3 hrs ago0x49db6ee4507132d1fdac92318e0e6150bf7867280xe45f9c10f3e4647ac922b0128e688e8e1f220f5f5,769 Ether
0x1359322bfc935d7977317fbbd40bae0bf87a23caf04d8b3b2da0cb5023019fa6562392560 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282 Ether
0x120098be77c26cbda1f84d4a6defe02becaaf521c08ca3c9968e98759c8ac458562392260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282.8983354 Ether
0x655cafb6916b8bc2c452e585c3114e8c2e22aabc6dcaf93448cc6e71b65157b7562392060 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867285 Ether
0x25efc2211ef5405ed9da9ac816c743cddc5fb565b88930f8fb6b1c84c13d9392562391260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf78672817 Ether
0x6692873219d1898894d0e55dd9156487d49c23f4f5cda49e44e3ff76a8a179ea562391260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf78672810 Ether
0x81fab133fcf31da4343818a747d3ea47b2676376c1a9a393d7faa1718e7c2bf2562391260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.35384615 Ether
0x7aa8ddf52d3038487e9534a84e8a34549d96b2c27aeca2ad45c42699b7a67cb0562391060 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.65 Ether
0x5ae49ef7efbea234130c5873bbc39cacb36718d1bbb0b30563782315ceca0a5b562390860 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867281 Ether
0xb582d20f8d7eb32e4c267874f82d7532716fa22eb37089882d3811592d20fb86562390760 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867281.5 Ether
0xf70d61b291b2415ffdb79d0aa6895b36d74b11be490c4d8a3544d417d0e62d6c562390660 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.2 Ether
0x68ac1cb2f597cf43713b3faf0f3fd2787c19741280846c1e22efbcc2c1a973b5562390460 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.32 Ether
0xd6cb72fca32c0c48979b749ccdef63a8e4c58f7476acd9527861cda78aaa8863562390260 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.3 Ether
0xe7fddb0c94c1207ffd7315348436aaca3a1452e90260196da445579d5a524ea2562390160 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.2 Ether
0x80b3e374ac31bacc3627f2a80ef119cb379866fd560659e18274ce08aa9756e9562390160 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.38 Ether
0xee5cf5a310531be5ca8d92dfe48a439010480e2cfbbb3fffa8cc069f5f850cfe562389760 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867286.4 Ether
0x888b561e9cbd8665f5b440402abde9622f0fc72c1d59126f28ca89aaf06e1a22562389660 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.44574183 Ether
0x72036c7635ae7159bb778e4eda46867da3e0c4a8320e5c34b1f2c0f57d29d164562389360 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867280.21 Ether
0xc4f9c7e4a5103b1f08f2140b4b5864ff9a5ac830500a340d54c432515b15aeb4562386060 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867283 Ether
0x3267d736ab587b368810711045d26995039334427cec22545ad059f313a341a0562385660 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867282.2 Ether
0x18eed6638c0216bd6323444cc1664065c68f4a15d30fc480c65bdbc970e893ea562384560 days 9 hrs ago0xb84e224216fec19d8631a0ad187326bc48f91b6b0x49db6ee4507132d1fdac92318e0e6150bf7867285 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact match)
Contract Name: PollManagedFund
Compiler Version: v0.4.21+commit.dfe3193c
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.21;

// File: contracts/DateTime.sol

contract DateTime {
        /*
         *  Date and Time utilities for ethereum contracts
         *
         */
        struct _DateTime {
                uint16 year;
                uint8 month;
                uint8 day;
                uint8 hour;
                uint8 minute;
                uint8 second;
                uint8 weekday;
        }

        uint constant DAY_IN_SECONDS = 86400;
        uint constant YEAR_IN_SECONDS = 31536000;
        uint constant LEAP_YEAR_IN_SECONDS = 31622400;

        uint constant HOUR_IN_SECONDS = 3600;
        uint constant MINUTE_IN_SECONDS = 60;

        uint16 constant ORIGIN_YEAR = 1970;

        function isLeapYear(uint16 year) public pure returns (bool) {
                if (year % 4 != 0) {
                        return false;
                }
                if (year % 100 != 0) {
                        return true;
                }
                if (year % 400 != 0) {
                        return false;
                }
                return true;
        }

        function leapYearsBefore(uint year) public pure returns (uint) {
                year -= 1;
                return year / 4 - year / 100 + year / 400;
        }

        function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) {
                if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                        return 31;
                }
                else if (month == 4 || month == 6 || month == 9 || month == 11) {
                        return 30;
                }
                else if (isLeapYear(year)) {
                        return 29;
                }
                else {
                        return 28;
                }
        }

        function parseTimestamp(uint timestamp) internal pure returns (_DateTime dt) {
                uint secondsAccountedFor = 0;
                uint buf;
                uint8 i;

                // Year
                dt.year = getYear(timestamp);
                buf = leapYearsBefore(dt.year) - leapYearsBefore(ORIGIN_YEAR);

                secondsAccountedFor += LEAP_YEAR_IN_SECONDS * buf;
                secondsAccountedFor += YEAR_IN_SECONDS * (dt.year - ORIGIN_YEAR - buf);

                // Month
                uint secondsInMonth;
                for (i = 1; i <= 12; i++) {
                        secondsInMonth = DAY_IN_SECONDS * getDaysInMonth(i, dt.year);
                        if (secondsInMonth + secondsAccountedFor > timestamp) {
                                dt.month = i;
                                break;
                        }
                        secondsAccountedFor += secondsInMonth;
                }

                // Day
                for (i = 1; i <= getDaysInMonth(dt.month, dt.year); i++) {
                        if (DAY_IN_SECONDS + secondsAccountedFor > timestamp) {
                                dt.day = i;
                                break;
                        }
                        secondsAccountedFor += DAY_IN_SECONDS;
                }

                // Hour
                dt.hour = getHour(timestamp);

                // Minute
                dt.minute = getMinute(timestamp);

                // Second
                dt.second = getSecond(timestamp);

                // Day of week.
                dt.weekday = getWeekday(timestamp);
        }

        function getYear(uint timestamp) public pure returns (uint16) {
                uint secondsAccountedFor = 0;
                uint16 year;
                uint numLeapYears;

                // Year
                year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
                numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);

                secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
                secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);

                while (secondsAccountedFor > timestamp) {
                        if (isLeapYear(uint16(year - 1))) {
                                secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
                        }
                        else {
                                secondsAccountedFor -= YEAR_IN_SECONDS;
                        }
                        year -= 1;
                }
                return year;
        }

        function getMonth(uint timestamp) public pure returns (uint8) {
                return parseTimestamp(timestamp).month;
        }

        function getDay(uint timestamp) public pure returns (uint8) {
                return parseTimestamp(timestamp).day;
        }

        function getHour(uint timestamp) public pure returns (uint8) {
                return uint8((timestamp / 60 / 60) % 24);
        }

        function getMinute(uint timestamp) public pure returns (uint8) {
                return uint8((timestamp / 60) % 60);
        }

        function getSecond(uint timestamp) public pure returns (uint8) {
                return uint8(timestamp % 60);
        }

        function getWeekday(uint timestamp) public pure returns (uint8) {
                return uint8((timestamp / DAY_IN_SECONDS + 4) % 7);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day) public pure returns (uint timestamp) {
                return toTimestamp(year, month, day, 0, 0, 0);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour) public pure returns (uint timestamp) {
                return toTimestamp(year, month, day, hour, 0, 0);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute) public pure returns (uint timestamp) {
                return toTimestamp(year, month, day, hour, minute, 0);
        }

        function toTimestamp(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minute, uint8 second) public pure returns (uint timestamp) {
                uint16 i;

                // Year
                for (i = ORIGIN_YEAR; i < year; i++) {
                        if (isLeapYear(i)) {
                                timestamp += LEAP_YEAR_IN_SECONDS;
                        }
                        else {
                                timestamp += YEAR_IN_SECONDS;
                        }
                }

                // Month
                uint8[12] memory monthDayCounts;
                monthDayCounts[0] = 31;
                if (isLeapYear(year)) {
                        monthDayCounts[1] = 29;
                }
                else {
                        monthDayCounts[1] = 28;
                }
                monthDayCounts[2] = 31;
                monthDayCounts[3] = 30;
                monthDayCounts[4] = 31;
                monthDayCounts[5] = 30;
                monthDayCounts[6] = 31;
                monthDayCounts[7] = 31;
                monthDayCounts[8] = 30;
                monthDayCounts[9] = 31;
                monthDayCounts[10] = 30;
                monthDayCounts[11] = 31;

                for (i = 1; i < month; i++) {
                        timestamp += DAY_IN_SECONDS * monthDayCounts[i - 1];
                }

                // Day
                timestamp += DAY_IN_SECONDS * (day - 1);

                // Hour
                timestamp += HOUR_IN_SECONDS * (hour);

                // Minute
                timestamp += MINUTE_IN_SECONDS * (minute);

                // Second
                timestamp += second;

                return timestamp;
        }
}

// File: contracts/ISimpleCrowdsale.sol

interface ISimpleCrowdsale {
    function getSoftCap() external view returns(uint256);
    function isContributorInLists(address contributorAddress) external view returns(bool);
    function processReservationFundContribution(
        address contributor,
        uint256 tokenAmount,
        uint256 tokenBonusAmount
    ) external payable;
}

// File: contracts/fund/ICrowdsaleFund.sol

/**
 * @title ICrowdsaleFund
 * @dev Fund methods used by crowdsale contract
 */
interface ICrowdsaleFund {
    /**
    * @dev Function accepts user`s contributed ether and logs contribution
    * @param contributor Contributor wallet address.
    */
    function processContribution(address contributor) external payable;
    /**
    * @dev Function is called on the end of successful crowdsale
    */
    function onCrowdsaleEnd() external;
    /**
    * @dev Function is called if crowdsale failed to reach soft cap
    */
    function enableCrowdsaleRefund() external;
}

// File: contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
contract SafeMath {
    /**
    * @dev constructor
    */
    function SafeMath() public {
    }

    function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a / b;
        return c;
    }

    function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(a >= b);
        return a - b;
    }

    function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

// File: contracts/ownership/MultiOwnable.sol

/**
 * @title MultiOwnable
 * @dev The MultiOwnable contract has owners addresses and provides basic authorization control
 * functions, this simplifies the implementation of "users permissions".
 */
contract MultiOwnable {
    address public manager; // address used to set owners
    address[] public owners;
    mapping(address => bool) public ownerByAddress;

    event SetOwners(address[] owners);

    modifier onlyOwner() {
        require(ownerByAddress[msg.sender] == true);
        _;
    }

    /**
     * @dev MultiOwnable constructor sets the manager
     */
    function MultiOwnable() public {
        manager = msg.sender;
    }

    /**
     * @dev Function to set owners addresses
     */
    function setOwners(address[] _owners) public {
        require(msg.sender == manager);
        _setOwners(_owners);

    }

    function _setOwners(address[] _owners) internal {
        for(uint256 i = 0; i < owners.length; i++) {
            ownerByAddress[owners[i]] = false;
        }


        for(uint256 j = 0; j < _owners.length; j++) {
            ownerByAddress[_owners[j]] = true;
        }
        owners = _owners;
        SetOwners(_owners);
    }

    function getOwners() public constant returns (address[]) {
        return owners;
    }
}

// File: contracts/token/IERC20Token.sol

/**
 * @title IERC20Token - ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract IERC20Token {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;

    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value)  public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value)  public returns (bool success);
    function approve(address _spender, uint256 _value)  public returns (bool success);
    function allowance(address _owner, address _spender)  public constant returns (uint256 remaining);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

// File: contracts/token/ERC20Token.sol

/**
 * @title ERC20Token - ERC20 base implementation
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20Token is IERC20Token, SafeMath {
    mapping (address => uint256) public balances;
    mapping (address => mapping (address => uint256)) public allowed;

    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(balances[msg.sender] >= _value);

        balances[msg.sender] = safeSub(balances[msg.sender], _value);
        balances[_to] = safeAdd(balances[_to], _value);
        Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value);

        balances[_to] = safeAdd(balances[_to], _value);
        balances[_from] = safeSub(balances[_from], _value);
        allowed[_from][msg.sender] = safeSub(allowed[_from][msg.sender], _value);
        Transfer(_from, _to, _value);
        return true;
    }

    function balanceOf(address _owner) public constant returns (uint256) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) public constant returns (uint256) {
      return allowed[_owner][_spender];
    }
}

// File: contracts/token/ITokenEventListener.sol

/**
 * @title ITokenEventListener
 * @dev Interface which should be implemented by token listener
 */
interface ITokenEventListener {
    /**
     * @dev Function is called after token transfer/transferFrom
     * @param _from Sender address
     * @param _to Receiver address
     * @param _value Amount of tokens
     */
    function onTokenTransfer(address _from, address _to, uint256 _value) external;
}

// File: contracts/token/ManagedToken.sol

/**
 * @title ManagedToken
 * @dev ERC20 compatible token with issue and destroy facilities
 * @dev All transfers can be monitored by token event listener
 */
contract ManagedToken is ERC20Token, MultiOwnable {
    bool public allowTransfers = false;
    bool public issuanceFinished = false;

    ITokenEventListener public eventListener;

    event AllowTransfersChanged(bool _newState);
    event Issue(address indexed _to, uint256 _value);
    event Destroy(address indexed _from, uint256 _value);
    event IssuanceFinished();

    modifier transfersAllowed() {
        require(allowTransfers);
        _;
    }

    modifier canIssue() {
        require(!issuanceFinished);
        _;
    }

    /**
     * @dev ManagedToken constructor
     * @param _listener Token listener(address can be 0x0)
     * @param _owners Owners list
     */
    function ManagedToken(address _listener, address[] _owners) public {
        if(_listener != address(0)) {
            eventListener = ITokenEventListener(_listener);
        }
        _setOwners(_owners);
    }

    /**
     * @dev Enable/disable token transfers. Can be called only by owners
     * @param _allowTransfers True - allow False - disable
     */
    function setAllowTransfers(bool _allowTransfers) external onlyOwner {
        allowTransfers = _allowTransfers;
        AllowTransfersChanged(_allowTransfers);
    }

    /**
     * @dev Set/remove token event listener
     * @param _listener Listener address (Contract must implement ITokenEventListener interface)
     */
    function setListener(address _listener) public onlyOwner {
        if(_listener != address(0)) {
            eventListener = ITokenEventListener(_listener);
        } else {
            delete eventListener;
        }
    }

    function transfer(address _to, uint256 _value) public transfersAllowed returns (bool) {
        bool success = super.transfer(_to, _value);
        if(hasListener() && success) {
            eventListener.onTokenTransfer(msg.sender, _to, _value);
        }
        return success;
    }

    function transferFrom(address _from, address _to, uint256 _value) public transfersAllowed returns (bool) {
        bool success = super.transferFrom(_from, _to, _value);
        if(hasListener() && success) {
            eventListener.onTokenTransfer(_from, _to, _value);
        }
        return success;
    }

    function hasListener() internal view returns(bool) {
        if(eventListener == address(0)) {
            return false;
        }
        return true;
    }

    /**
     * @dev Issue tokens to specified wallet
     * @param _to Wallet address
     * @param _value Amount of tokens
     */
    function issue(address _to, uint256 _value) external onlyOwner canIssue {
        totalSupply = safeAdd(totalSupply, _value);
        balances[_to] = safeAdd(balances[_to], _value);
        Issue(_to, _value);
        Transfer(address(0), _to, _value);
    }

    /**
     * @dev Destroy tokens on specified address (Called by owner or token holder)
     * @dev Fund contract address must be in the list of owners to burn token during refund
     * @param _from Wallet address
     * @param _value Amount of tokens to destroy
     */
    function destroy(address _from, uint256 _value) external {
        require(ownerByAddress[msg.sender] || msg.sender == _from);
        require(balances[_from] >= _value);
        totalSupply = safeSub(totalSupply, _value);
        balances[_from] = safeSub(balances[_from], _value);
        Transfer(_from, address(0), _value);
        Destroy(_from, _value);
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From OpenZeppelin StandardToken.sol
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     */
    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = safeAdd(allowed[msg.sender][_spender], _addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From OpenZeppelin StandardToken.sol
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = safeSub(oldValue, _subtractedValue);
        }
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Finish token issuance
     * @return True if success
     */
    function finishIssuance() public onlyOwner returns (bool) {
        issuanceFinished = true;
        IssuanceFinished();
        return true;
    }
}

// File: contracts/Fund.sol

contract Fund is ICrowdsaleFund, SafeMath, MultiOwnable {
    enum FundState {
        Crowdsale,
        CrowdsaleRefund,
        TeamWithdraw,
        Refund
    }

    FundState public state = FundState.Crowdsale;
    ManagedToken public token;

    uint256 public constant INITIAL_TAP = 192901234567901; // (wei/sec) == 500 ether/month

    address public teamWallet;
    uint256 public crowdsaleEndDate;

    address public referralTokenWallet;
    address public foundationTokenWallet;
    address public reserveTokenWallet;
    address public bountyTokenWallet;
    address public companyTokenWallet;
    address public advisorTokenWallet;
    address public lockedTokenAddress;
    address public refundManager;

    uint256 public tap;
    uint256 public lastWithdrawTime = 0;
    uint256 public firstWithdrawAmount = 0;

    address public crowdsaleAddress;
    mapping(address => uint256) public contributions;

    event RefundContributor(address tokenHolder, uint256 amountWei, uint256 timestamp);
    event RefundHolder(address tokenHolder, uint256 amountWei, uint256 tokenAmount, uint256 timestamp);
    event Withdraw(uint256 amountWei, uint256 timestamp);
    event RefundEnabled(address initiatorAddress);

    /**
     * @dev Fund constructor
     * @param _teamWallet Withdraw functions transfers ether to this address
     * @param _referralTokenWallet Referral wallet address
     * @param _companyTokenWallet Company wallet address
     * @param _reserveTokenWallet Reserve wallet address
     * @param _bountyTokenWallet Bounty wallet address
     * @param _advisorTokenWallet Advisor wallet address
     * @param _owners Contract owners
     */
    function Fund(
        address _teamWallet,
        address _referralTokenWallet,
        address _foundationTokenWallet,
        address _companyTokenWallet,
        address _reserveTokenWallet,
        address _bountyTokenWallet,
        address _advisorTokenWallet,
        address _refundManager,
        address[] _owners
    ) public
    {
        teamWallet = _teamWallet;
        referralTokenWallet = _referralTokenWallet;
        foundationTokenWallet = _foundationTokenWallet;
        companyTokenWallet = _companyTokenWallet;
        reserveTokenWallet = _reserveTokenWallet;
        bountyTokenWallet = _bountyTokenWallet;
        advisorTokenWallet = _advisorTokenWallet;
        refundManager = _refundManager;
        _setOwners(_owners);
    }

    modifier withdrawEnabled() {
        require(canWithdraw());
        _;
    }

    modifier onlyCrowdsale() {
        require(msg.sender == crowdsaleAddress);
        _;
    }

    function canWithdraw() public returns(bool);

    function setCrowdsaleAddress(address _crowdsaleAddress) public onlyOwner {
        require(crowdsaleAddress == address(0));
        crowdsaleAddress = _crowdsaleAddress;
    }

    function setTokenAddress(address _tokenAddress) public onlyOwner {
        require(address(token) == address(0));
        token = ManagedToken(_tokenAddress);
    }

    function setLockedTokenAddress(address _lockedTokenAddress) public onlyOwner {
        require(address(lockedTokenAddress) == address(0));
        lockedTokenAddress = _lockedTokenAddress;
    }

    /**
     * @dev Process crowdsale contribution
     */
    function processContribution(address contributor) external payable onlyCrowdsale {
        require(state == FundState.Crowdsale);
        uint256 totalContribution = safeAdd(contributions[contributor], msg.value);
        contributions[contributor] = totalContribution;
    }

    /**
     * @dev Callback is called after crowdsale finalization if soft cap is reached
     */
    function onCrowdsaleEnd() external onlyCrowdsale {
        state = FundState.TeamWithdraw;
        ISimpleCrowdsale crowdsale = ISimpleCrowdsale(crowdsaleAddress);
        firstWithdrawAmount = safeDiv(crowdsale.getSoftCap(), 2);
        lastWithdrawTime = now;
        tap = INITIAL_TAP;
        crowdsaleEndDate = now;
    }

    /**
     * @dev Callback is called after crowdsale finalization if soft cap is not reached
     */
    function enableCrowdsaleRefund() external onlyCrowdsale {
        require(state == FundState.Crowdsale);
        state = FundState.CrowdsaleRefund;
    }

    /**
    * @dev Function is called by contributor to refund payments if crowdsale failed to reach soft cap
    */
    function refundCrowdsaleContributor() external {
        require(state == FundState.CrowdsaleRefund);
        require(contributions[msg.sender] > 0);

        uint256 refundAmount = contributions[msg.sender];
        contributions[msg.sender] = 0;
        token.destroy(msg.sender, token.balanceOf(msg.sender));
        msg.sender.transfer(refundAmount);
        RefundContributor(msg.sender, refundAmount, now);
    }

    /**
    * @dev Function is called by owner to refund payments if crowdsale failed to reach soft cap
    */
    function autoRefundCrowdsaleContributor(address contributorAddress) external {
        require(ownerByAddress[msg.sender] == true || msg.sender == refundManager);
        require(state == FundState.CrowdsaleRefund);
        require(contributions[contributorAddress] > 0);

        uint256 refundAmount = contributions[contributorAddress];
        contributions[contributorAddress] = 0;
        token.destroy(contributorAddress, token.balanceOf(contributorAddress));
        contributorAddress.transfer(refundAmount);
        RefundContributor(contributorAddress, refundAmount, now);
    }

    /**
     * @dev Decrease tap amount
     * @param _tap New tap value
     */
    function decTap(uint256 _tap) external onlyOwner {
        require(state == FundState.TeamWithdraw);
        require(_tap < tap);
        tap = _tap;
    }

    function getCurrentTapAmount() public constant returns(uint256) {
        if(state != FundState.TeamWithdraw) {
            return 0;
        }
        return calcTapAmount();
    }

    function calcTapAmount() internal view returns(uint256) {
        uint256 amount = safeMul(safeSub(now, lastWithdrawTime), tap);
        if(address(this).balance < amount) {
            amount = address(this).balance;
        }
        return amount;
    }

    function firstWithdraw() public onlyOwner withdrawEnabled {
        require(firstWithdrawAmount > 0);
        uint256 amount = firstWithdrawAmount;
        firstWithdrawAmount = 0;
        teamWallet.transfer(amount);
        Withdraw(amount, now);
    }

    /**
     * @dev Withdraw tap amount
     */
    function withdraw() public onlyOwner withdrawEnabled {
        require(state == FundState.TeamWithdraw);
        uint256 amount = calcTapAmount();
        lastWithdrawTime = now;
        teamWallet.transfer(amount);
        Withdraw(amount, now);
    }

    // Refund
    /**
     * @dev Called to start refunding
     */
    function enableRefund() internal {
        require(state == FundState.TeamWithdraw);
        state = FundState.Refund;
        token.destroy(lockedTokenAddress, token.balanceOf(lockedTokenAddress));
        token.destroy(companyTokenWallet, token.balanceOf(companyTokenWallet));
        token.destroy(reserveTokenWallet, token.balanceOf(reserveTokenWallet));
        token.destroy(foundationTokenWallet, token.balanceOf(foundationTokenWallet));
        token.destroy(bountyTokenWallet, token.balanceOf(bountyTokenWallet));
        token.destroy(referralTokenWallet, token.balanceOf(referralTokenWallet));
        token.destroy(advisorTokenWallet, token.balanceOf(advisorTokenWallet));
        RefundEnabled(msg.sender);
    }

    /**
    * @dev Function is called by contributor to refund
    * Buy user tokens for refundTokenPrice and destroy them
    */
    function refundTokenHolder() public {
        require(state == FundState.Refund);

        uint256 tokenBalance = token.balanceOf(msg.sender);
        require(tokenBalance > 0);
        uint256 refundAmount = safeDiv(safeMul(tokenBalance, address(this).balance), token.totalSupply());
        require(refundAmount > 0);

        token.destroy(msg.sender, tokenBalance);
        msg.sender.transfer(refundAmount);

        RefundHolder(msg.sender, refundAmount, tokenBalance, now);
    }
}

// File: contracts/fund/IPollManagedFund.sol

/**
 * @title IPollManagedFund
 * @dev Fund callbacks used by polling contracts
 */
interface IPollManagedFund {
    /**
     * @dev TapPoll callback
     * @param agree True if new tap value is accepted by majority of contributors
     * @param _tap New tap value
     */
    function onTapPollFinish(bool agree, uint256 _tap) external;

    /**
     * @dev RefundPoll callback
     * @param agree True if contributors decided to allow refunding
     */
    function onRefundPollFinish(bool agree) external;
}

// File: contracts/poll/BasePoll.sol

/**
 * @title BasePoll
 * @dev Abstract base class for polling contracts
 */
contract BasePoll is SafeMath {
    struct Vote {
        uint256 time;
        uint256 weight;
        bool agree;
    }

    uint256 public constant MAX_TOKENS_WEIGHT_DENOM = 1000;

    IERC20Token public token;
    address public fundAddress;

    uint256 public startTime;
    uint256 public endTime;
    bool checkTransfersAfterEnd;

    uint256 public yesCounter = 0;
    uint256 public noCounter = 0;
    uint256 public totalVoted = 0;

    bool public finalized;
    mapping(address => Vote) public votesByAddress;

    modifier checkTime() {
        require(now >= startTime && now <= endTime);
        _;
    }

    modifier notFinalized() {
        require(!finalized);
        _;
    }

    /**
     * @dev BasePoll constructor
     * @param _tokenAddress ERC20 compatible token contract address
     * @param _fundAddress Fund contract address
     * @param _startTime Poll start time
     * @param _endTime Poll end time
     */
    function BasePoll(address _tokenAddress, address _fundAddress, uint256 _startTime, uint256 _endTime, bool _checkTransfersAfterEnd) public {
        require(_tokenAddress != address(0));
        require(_startTime >= now && _endTime > _startTime);

        token = IERC20Token(_tokenAddress);
        fundAddress = _fundAddress;
        startTime = _startTime;
        endTime = _endTime;
        finalized = false;
        checkTransfersAfterEnd = _checkTransfersAfterEnd;
    }

    /**
     * @dev Process user`s vote
     * @param agree True if user endorses the proposal else False
     */
    function vote(bool agree) public checkTime {
        require(votesByAddress[msg.sender].time == 0);

        uint256 voiceWeight = token.balanceOf(msg.sender);
        uint256 maxVoiceWeight = safeDiv(token.totalSupply(), MAX_TOKENS_WEIGHT_DENOM);
        voiceWeight =  voiceWeight <= maxVoiceWeight ? voiceWeight : maxVoiceWeight;

        if(agree) {
            yesCounter = safeAdd(yesCounter, voiceWeight);
        } else {
            noCounter = safeAdd(noCounter, voiceWeight);

        }

        votesByAddress[msg.sender].time = now;
        votesByAddress[msg.sender].weight = voiceWeight;
        votesByAddress[msg.sender].agree = agree;

        totalVoted = safeAdd(totalVoted, 1);
    }

    /**
     * @dev Revoke user`s vote
     */
    function revokeVote() public checkTime {
        require(votesByAddress[msg.sender].time > 0);

        uint256 voiceWeight = votesByAddress[msg.sender].weight;
        bool agree = votesByAddress[msg.sender].agree;

        votesByAddress[msg.sender].time = 0;
        votesByAddress[msg.sender].weight = 0;
        votesByAddress[msg.sender].agree = false;

        totalVoted = safeSub(totalVoted, 1);
        if(agree) {
            yesCounter = safeSub(yesCounter, voiceWeight);
        } else {
            noCounter = safeSub(noCounter, voiceWeight);
        }
    }

    /**
     * @dev Function is called after token transfer from user`s wallet to check and correct user`s vote
     *
     */
    function onTokenTransfer(address tokenHolder, uint256 amount) public {
        require(msg.sender == fundAddress);
        if(votesByAddress[tokenHolder].time == 0) {
            return;
        }
        if(!checkTransfersAfterEnd) {
             if(finalized || (now < startTime || now > endTime)) {
                 return;
             }
        }

        if(token.balanceOf(tokenHolder) >= votesByAddress[tokenHolder].weight) {
            return;
        }
        uint256 voiceWeight = amount;
        if(amount > votesByAddress[tokenHolder].weight) {
            voiceWeight = votesByAddress[tokenHolder].weight;
        }

        if(votesByAddress[tokenHolder].agree) {
            yesCounter = safeSub(yesCounter, voiceWeight);
        } else {
            noCounter = safeSub(noCounter, voiceWeight);
        }
        votesByAddress[tokenHolder].weight = safeSub(votesByAddress[tokenHolder].weight, voiceWeight);
    }

    /**
     * Finalize poll and call onPollFinish callback with result
     */
    function tryToFinalize() public notFinalized returns(bool) {
        if(now < endTime) {
            return false;
        }
        finalized = true;
        onPollFinish(isSubjectApproved());
        return true;
    }

    function isNowApproved() public view returns(bool) {
        return isSubjectApproved();
    }

    function isSubjectApproved() internal view returns(bool) {
        return yesCounter > noCounter;
    }

    /**
     * @dev callback called after poll finalization
     */
    function onPollFinish(bool agree) internal;
}

// File: contracts/RefundPoll.sol

/**
 * @title RefundPoll
 * @dev Enables fund refund mode
 */
contract RefundPoll is BasePoll {
    uint256 public holdEndTime = 0;

    /**
     * RefundPoll constructor
     * @param _tokenAddress ERC20 compatible token contract address
     * @param _fundAddress Fund contract address
     * @param _startTime Poll start time
     * @param _endTime Poll end time
     */
    function RefundPoll(
        address _tokenAddress,
        address _fundAddress,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _holdEndTime,
        bool _checkTransfersAfterEnd
    ) public
        BasePoll(_tokenAddress, _fundAddress, _startTime, _endTime, _checkTransfersAfterEnd)
    {
        holdEndTime = _holdEndTime;
    }

    function tryToFinalize() public returns(bool) {
        if(holdEndTime > 0 && holdEndTime > endTime) {
            require(now >= holdEndTime);
        } else {
            require(now >= endTime);
        }

        finalized = true;
        onPollFinish(isSubjectApproved());
        return true;
    }

    function isSubjectApproved() internal view returns(bool) {
        return yesCounter > noCounter && yesCounter >= safeDiv(token.totalSupply(), 3);
    }

    function onPollFinish(bool agree) internal {
        IPollManagedFund fund = IPollManagedFund(fundAddress);
        fund.onRefundPollFinish(agree);
    }

}

// File: contracts/TapPoll.sol

/**
 * @title TapPoll
 * @dev Poll to increase tap amount
 */
contract TapPoll is BasePoll {
    uint256 public tap;
    uint256 public minTokensPerc = 0;

    /**
     * TapPoll constructor
     * @param _tap New tap value
     * @param _tokenAddress ERC20 compatible token contract address
     * @param _fundAddress Fund contract address
     * @param _startTime Poll start time
     * @param _endTime Poll end time
     * @param _minTokensPerc - Min percent of tokens from totalSupply where poll is considered to be fulfilled
     */
    function TapPoll(
        uint256 _tap,
        address _tokenAddress,
        address _fundAddress,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _minTokensPerc
    ) public
        BasePoll(_tokenAddress, _fundAddress, _startTime, _endTime, false)
    {
        tap = _tap;
        minTokensPerc = _minTokensPerc;
    }

    function onPollFinish(bool agree) internal {
        IPollManagedFund fund = IPollManagedFund(fundAddress);
        fund.onTapPollFinish(agree, tap);
    }

    function getVotedTokensPerc() public view returns(uint256) {
        return safeDiv(safeMul(safeAdd(yesCounter, noCounter), 100), token.totalSupply());
    }

    function isSubjectApproved() internal view returns(bool) {
        return yesCounter > noCounter && getVotedTokensPerc() >= minTokensPerc;
    }
}

// File: contracts/PollManagedFund.sol

/**
 * @title PollManagedFund
 * @dev Fund controlled by users
 */
contract PollManagedFund is Fund, DateTime, ITokenEventListener {
    uint256 public constant TAP_POLL_DURATION = 3 days;
    uint256 public constant REFUND_POLL_DURATION = 7 days;
    uint256 public constant MAX_VOTED_TOKEN_PERC = 10;

    TapPoll public tapPoll;
    RefundPoll public refundPoll;

    uint256 public minVotedTokensPerc = 0;
    uint256 public secondRefundPollDate = 0;
    bool public isWithdrawEnabled = true;

    uint256[] public refundPollDates = [
        1530403200, // 01.07.2018
        1538352000, // 01.10.2018
        1546300800, // 01.01.2019
        1554076800, // 01.04.2019
        1561939200, // 01.07.2019
        1569888000, // 01.10.2019
        1577836800, // 01.01.2020
        1585699200  // 01.04.2020
    ];

    modifier onlyTokenHolder() {
        require(token.balanceOf(msg.sender) > 0);
        _;
    }

    event TapPollCreated();
    event TapPollFinished(bool approved, uint256 _tap);
    event RefundPollCreated();
    event RefundPollFinished(bool approved);

    /**
     * @dev PollManagedFund constructor
     * params - see Fund constructor
     */
    function PollManagedFund(
        address _teamWallet,
        address _referralTokenWallet,
        address _foundationTokenWallet,
        address _companyTokenWallet,
        address _reserveTokenWallet,
        address _bountyTokenWallet,
        address _advisorTokenWallet,
        address _refundManager,
        address[] _owners
        ) public
    Fund(_teamWallet, _referralTokenWallet, _foundationTokenWallet, _companyTokenWallet, _reserveTokenWallet, _bountyTokenWallet, _advisorTokenWallet, _refundManager, _owners)
    {
    }

    function canWithdraw() public returns(bool) {
        if(
            address(refundPoll) != address(0) &&
            !refundPoll.finalized() &&
            refundPoll.holdEndTime() > 0 &&
            now >= refundPoll.holdEndTime() &&
            refundPoll.isNowApproved()
        ) {
            return false;
        }
        return isWithdrawEnabled;
    }

    /**
     * @dev ITokenEventListener implementation. Notify active poll contracts about token transfers
     */
    function onTokenTransfer(address _from, address /*_to*/, uint256 _value) external {
        require(msg.sender == address(token));
        if(address(tapPoll) != address(0) && !tapPoll.finalized()) {
            tapPoll.onTokenTransfer(_from, _value);
        }
         if(address(refundPoll) != address(0) && !refundPoll.finalized()) {
            refundPoll.onTokenTransfer(_from, _value);
        }
    }

    /**
     * @dev Update minVotedTokensPerc value after tap poll.
     * Set new value == 50% from current voted tokens amount
     */
    function updateMinVotedTokens(uint256 _minVotedTokensPerc) internal {
        uint256 newPerc = safeDiv(_minVotedTokensPerc, 2);
        if(newPerc > MAX_VOTED_TOKEN_PERC) {
            minVotedTokensPerc = MAX_VOTED_TOKEN_PERC;
            return;
        }
        minVotedTokensPerc = newPerc;
    }

    // Tap poll
    function createTapPoll(uint8 tapIncPerc) public onlyOwner {
        require(state == FundState.TeamWithdraw);
        require(tapPoll == address(0));
        require(getDay(now) == 10);
        require(tapIncPerc <= 50);
        uint256 _tap = safeAdd(tap, safeDiv(safeMul(tap, tapIncPerc), 100));
        uint256 startTime = now;
        uint256 endTime = startTime + TAP_POLL_DURATION;
        tapPoll = new TapPoll(_tap, token, this, startTime, endTime, minVotedTokensPerc);
        TapPollCreated();
    }

    function onTapPollFinish(bool agree, uint256 _tap) external {
        require(msg.sender == address(tapPoll) && tapPoll.finalized());
        if(agree) {
            tap = _tap;
        }
        updateMinVotedTokens(tapPoll.getVotedTokensPerc());
        TapPollFinished(agree, _tap);
        delete tapPoll;
    }

    // Refund poll
    function checkRefundPollDate() internal view returns(bool) {
        if(secondRefundPollDate > 0 && now >= secondRefundPollDate && now <= safeAdd(secondRefundPollDate, 1 days)) {
            return true;
        }

        for(uint i; i < refundPollDates.length; i++) {
            if(now >= refundPollDates[i] && now <= safeAdd(refundPollDates[i], 1 days)) {
                return true;
            }
        }
        return false;
    }

    function createRefundPoll() public onlyTokenHolder {
        require(state == FundState.TeamWithdraw);
        require(address(refundPoll) == address(0));
        require(checkRefundPollDate());

        if(secondRefundPollDate > 0 && now > safeAdd(secondRefundPollDate, 1 days)) {
            secondRefundPollDate = 0;
        }

        uint256 startTime = now;
        uint256 endTime = startTime + REFUND_POLL_DURATION;
        bool isFirstRefund = secondRefundPollDate == 0;
        uint256 holdEndTime = 0;

        if(isFirstRefund) {
            holdEndTime = toTimestamp(
                getYear(startTime),
                getMonth(startTime) + 1,
                1
            );
        }
        refundPoll = new RefundPoll(token, this, startTime, endTime, holdEndTime, isFirstRefund);
        RefundPollCreated();
    }

    function onRefundPollFinish(bool agree) external {
        require(msg.sender == address(refundPoll) && refundPoll.finalized());
        if(agree) {
            if(secondRefundPollDate > 0) {
                enableRefund();
            } else {
                uint256 startTime = refundPoll.startTime();
                secondRefundPollDate = toTimestamp(
                    getYear(startTime),
                    getMonth(startTime) + 2,
                    1
                );
                isWithdrawEnabled = false;
            }
        } else {
            secondRefundPollDate = 0;
            isWithdrawEnabled = true;
        }
        RefundPollFinished(agree);

        delete refundPoll;
    }

    function forceRefund() public {
        require(msg.sender == refundManager);
        enableRefund();
    }
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"owners","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tapIncPerc","type":"uint8"}],"name":"createTapPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TAP_POLL_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REFUND_POLL_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crowdsaleEndDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_crowdsaleAddress","type":"address"}],"name":"setCrowdsaleAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"firstWithdrawAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agree","type":"bool"},{"name":"_tap","type":"uint256"}],"name":"onTapPollFinish","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"crowdsaleAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tap","type":"uint256"}],"name":"decTap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"enableCrowdsaleRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getHour","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"createRefundPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"contributions","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getWeekday","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"teamWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"refundPollDates","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"onCrowdsaleEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"},{"name":"hour","type":"uint8"},{"name":"minute","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getDay","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"","type":"address"},{"name":"_value","type":"uint256"}],"name":"onTokenTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTapAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lockedTokenAddress","type":"address"}],"name":"setLockedTokenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"},{"name":"hour","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"minVotedTokensPerc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"refundManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isWithdrawEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agree","type":"bool"}],"name":"onRefundPollFinish","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getSecond","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"foundationTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_TAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"},{"name":"month","type":"uint8"},{"name":"day","type":"uint8"},{"name":"hour","type":"uint8"},{"name":"minute","type":"uint8"},{"name":"second","type":"uint8"}],"name":"toTimestamp","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"reserveTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getYear","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"MAX_VOTED_TOKEN_PERC","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getMonth","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"lockedTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint16"}],"name":"isLeapYear","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"contributor","type":"address"}],"name":"processContribution","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"lastWithdrawTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"year","type":"uint256"}],"name":"leapYearsBefore","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"month","type":"uint8"},{"name":"year","type":"uint16"}],"name":"getDaysInMonth","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"secondRefundPollDate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"canWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"forceRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"advisorTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tapPoll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referralTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bountyTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"refundPoll","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contributorAddress","type":"address"}],"name":"autoRefundCrowdsaleContributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"firstWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ownerByAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"companyTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"}],"name":"setOwners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"getMinute","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"refundTokenHolder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refundCrowdsaleContributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_teamWallet","type":"address"},{"name":"_referralTokenWallet","type":"address"},{"name":"_foundationTokenWallet","type":"address"},{"name":"_companyTokenWallet","type":"address"},{"name":"_reserveTokenWallet","type":"address"},{"name":"_bountyTokenWallet","type":"address"},{"name":"_advisorTokenWallet","type":"address"},{"name":"_refundManager","type":"address"},{"name":"_owners","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"TapPollCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"approved","type":"bool"},{"indexed":false,"name":"_tap","type":"uint256"}],"name":"TapPollFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"RefundPollCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"approved","type":"bool"}],"name":"RefundPollFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenHolder","type":"address"},{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"RefundContributor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenHolder","type":"address"},{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"RefundHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amountWei","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"initiatorAddress","type":"address"}],"name":"RefundEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owners","type":"address[]"}],"name":"SetOwners","type":"event"}]

  Contract Creation Code Switch To Opcodes View
606060409081526003805460ff199081169091556000600f8190556010819055601581905560165560178054909116600117905561010090519081016040908152635b3819808252635bb163806020830152635c2aad8090820152635ca154806060820152635d194d006080820152635d92970060a0820152635e0be10060c0820152635e83d98060e08201526200009c90601890600862000313565b503415620000a957600080fd5b60405162004a7038038062004a7083398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805160008054600160a060020a031990811633600160a060020a03908116919091179092556004805482168e84161790556006805482168d84161790556007805482168c8416179055600a805482168b84161790556008805482168a8416179055600980548216898416179055600b80548216888416179055600d8054909116918616919091179055919091019050888888888888888888620001a881640100000000620001c0810262002f521704565b5050505050505050505050505050505050506200041a565b6000805b6001548210156200022657600060026000600185815481101515620001e557fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff191691151591909117905560019190910190620001c4565b5060005b825181101562000282576001600260008584815181106200024757fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790556001016200022a565b6001838051620002979291602001906200036b565b507f9465cd279c2de393c5568ae444599e3644e3d1864ca2c05ced8a654df2aea3cb8360405160208082528190810183818151815260200191508051906020019060200280838360005b83811015620002fb578082015183820152602001620002e1565b505050509050019250505060405180910390a1505050565b82805482825590600052602060002090810192821562000359579160200282015b8281111562000359578251829063ffffffff1690559160200191906001019062000334565b5062000367929150620003d3565b5090565b828054828255906000526020600020908101928215620003c5579160200282015b82811115620003c55782518254600160a060020a031916600160a060020a0391909116178255602092909201916001909101906200038c565b5062000367929150620003f3565b620003f091905b80821115620003675760008155600101620003da565b90565b620003f091905b8082111562000367578054600160a060020a0319168155600101620003fa565b614646806200042a6000396000f300606060405260043610620003355763ffffffff60e060020a600035041663025e7c2781146200033a578063026eca12146200036f57806302fc28c4146200038d57806308867fc214620003b5578063192f107614620003cb5780631f35bc4014620003e157806326a4e8d2146200040357806326b52faf146200042557806329c90b63146200043b57806331d2f891146200045957806336e61cf7146200046f5780633b64e77e14620004885780633ccfd60b146200049e5780633e239e1a14620004b457806340e6b00a14620004e357806342e94c9014620004f9578063481c6a75146200051b5780634ac1ad78146200053157806359927044146200054a5780635f58384614620005605780636252c127146200057957806362ba9687146200058f57806365c7284014620005c4578063677ba3d314620005dd578063774a97cf14620006085780637ddbf0ed146200061e5780637f791833146200064057806384219204146200066f57806387174c3e1462000685578063880dc4e6146200069b57806389ea2cb714620006c55780638aa001fc14620006e05780638c8d98a014620006f9578063903171ae14620007225780639054bbb614620007385780639054bdec146200074e57806392a0fd64146200078957806392d66313146200079f578063962c9c8d14620007cf578063a0e67e2b14620007e5578063a324ad241462000850578063a666ff3c1462000869578063a6f0e577146200087f578063a78a651a146200089c578063ab23151114620008b2578063b199993714620008c8578063b238ad0e14620008e1578063b465e52f1462000904578063b51459fe146200091a578063bd7427f81462000930578063c19d93fb1462000946578063c5f5ce211462000981578063cae6b9c51462000997578063cc96019f14620009ad578063d0e6cfec14620009c3578063d66f146d14620009d9578063e2d2a86814620009ef578063e9b5a2f71462000a11578063eb6b192f1462000a27578063f190a7931462000a49578063fa4d36981462000a5f578063fa93f8831462000ab1578063fbbfe8301462000aca578063fc0c546a1462000ae0578063fd2210311462000af6578063ff01ffa81462000b0c575b600080fd5b34156200034657600080fd5b6200035360043562000b22565b604051600160a060020a03909116815260200160405180910390f35b34156200037b57600080fd5b6200038b60ff6004351662000b4b565b005b34156200039957600080fd5b620003a362000cdf565b60405190815260200160405180910390f35b3415620003c157600080fd5b620003a362000ce6565b3415620003d757600080fd5b620003a362000ced565b3415620003ed57600080fd5b6200038b600160a060020a036004351662000cf3565b34156200040f57600080fd5b6200038b600160a060020a036004351662000d57565b34156200043157600080fd5b620003a362000dd3565b34156200044757600080fd5b6200038b600435151560243562000dd9565b34156200046557600080fd5b6200035362000f18565b34156200047b57600080fd5b6200038b60043562000f27565b34156200049457600080fd5b6200038b62000f85565b3415620004aa57600080fd5b6200038b62000fcf565b3415620004c057600080fd5b620004cd600435620010b1565b60405160ff909116815260200160405180910390f35b3415620004ef57600080fd5b6200038b620010cf565b34156200050557600080fd5b620003a3600160a060020a0360043516620012db565b34156200052757600080fd5b62000353620012ed565b34156200053d57600080fd5b620004cd600435620012fc565b34156200055657600080fd5b620003536200130f565b34156200056c57600080fd5b620003a36004356200131e565b34156200058557600080fd5b6200038b6200133e565b34156200059b57600080fd5b620003a361ffff6004351660ff60243581169060443581169060643581169060843516620013e9565b3415620005d057600080fd5b620004cd60043562001406565b3415620005e957600080fd5b6200038b600160a060020a03600435811690602435166044356200141d565b34156200061457600080fd5b620003a362001601565b34156200062a57600080fd5b6200038b600160a060020a036004351662001636565b34156200064c57600080fd5b620003a361ffff6004351660ff602435811690604435811690606435166200169a565b34156200067b57600080fd5b620003a3620016b6565b34156200069157600080fd5b62000353620016bc565b3415620006a757600080fd5b620006b1620016cb565b604051901515815260200160405180910390f35b3415620006d157600080fd5b6200038b6004351515620016d4565b3415620006ec57600080fd5b620004cd60043562001868565b34156200070557600080fd5b620003a361ffff6004351660ff6024358116906044351662001873565b34156200072e57600080fd5b620003536200188f565b34156200074457600080fd5b620003a36200189e565b34156200075a57600080fd5b620003a361ffff6004351660ff60243581169060443581169060643581169060843581169060a43516620018a8565b34156200079557600080fd5b62000353620019fd565b3415620007ab57600080fd5b620007b860043562001a0c565b60405161ffff909116815260200160405180910390f35b3415620007db57600080fd5b620003a362001aa6565b3415620007f157600080fd5b620007fb62001aab565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156200083c57808201518382015260200162000822565b505050509050019250505060405180910390f35b34156200085c57600080fd5b620004cd60043562001b17565b34156200087557600080fd5b6200035362001b2e565b34156200088b57600080fd5b620006b161ffff6004351662001b3d565b6200038b600160a060020a036004351662001b91565b3415620008be57600080fd5b620003a362001c14565b3415620008d457600080fd5b620003a360043562001c1a565b3415620008ed57600080fd5b620004cd60ff6004351661ffff6024351662001c35565b34156200091057600080fd5b620003a362001d0e565b34156200092657600080fd5b620006b162001d14565b34156200093c57600080fd5b6200038b62001eca565b34156200095257600080fd5b6200095c62001ef2565b604051808260038111156200096d57fe5b60ff16815260200191505060405180910390f35b34156200098d57600080fd5b6200035362001efb565b3415620009a357600080fd5b6200035362001f0a565b3415620009b957600080fd5b6200035362001f19565b3415620009cf57600080fd5b6200035362001f28565b3415620009e557600080fd5b6200035362001f37565b3415620009fb57600080fd5b6200038b600160a060020a036004351662001f46565b341562000a1d57600080fd5b6200038b6200214a565b341562000a3357600080fd5b620006b1600160a060020a0360043516620021da565b341562000a5557600080fd5b62000353620021ef565b341562000a6b57600080fd5b6200038b6004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650620021fe95505050505050565b341562000abd57600080fd5b620004cd60043562002228565b341562000ad657600080fd5b6200038b62002234565b341562000aec57600080fd5b6200035362002464565b341562000b0257600080fd5b620003a362002478565b341562000b1857600080fd5b6200038b6200247e565b600180548290811062000b3157fe5b600091825260209091200154600160a060020a0316905081565b600160a060020a0333166000908152600260205260408120548190819060ff16151560011462000b7a57600080fd5b60026003805460ff169081111562000b8e57fe5b1462000b9957600080fd5b601354600160a060020a03161562000bb057600080fd5b62000bbb4262001406565b60ff16600a14151562000bcd57600080fd5b603260ff8516111562000bdf57600080fd5b62000c09600e5462000c0362000bfb600e548860ff166200263c565b60646200266a565b62002682565b92504291506203f4808201905082600360019054906101000a9004600160a060020a031630848460155462000c3d620030b8565b958652600160a060020a039485166020870152929093166040808601919091526060850191909152608084019290925260a083015260c09091019051809103906000f080151562000c8d57600080fd5b60138054600160a060020a031916600160a060020a03929092169190911790557f330d2f37998c8839fca77205925adc69e2c4aa616175f8b357f42f84d06c454960405160405180910390a150505050565b6203f48081565b62093a8081565b60055481565b600160a060020a03331660009081526002602052604090205460ff16151560011462000d1e57600080fd5b601154600160a060020a03161562000d3557600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a03331660009081526002602052604090205460ff16151560011462000d8257600080fd5b6003546101009004600160a060020a03161562000d9e57600080fd5b60038054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b60105481565b60135433600160a060020a03908116911614801562000e4c5750601354600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000e3357600080fd5b5af1151562000e4157600080fd5b505050604051805190505b151562000e5857600080fd5b811562000e6557600e8190555b60135462000ec890600160a060020a0316632c24909c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562000eaa57600080fd5b5af1151562000eb857600080fd5b5050506040518051905062002692565b7fecb94f7dd81b39de2b8d95fa8a4d9f0a8723d7a974187fef4fa5305ca5d162488282604051911515825260208201526040908101905180910390a1505060138054600160a060020a0319169055565b601154600160a060020a031681565b600160a060020a03331660009081526002602052604090205460ff16151560011462000f5257600080fd5b60026003805460ff169081111562000f6657fe5b1462000f7157600080fd5b600e54811062000f8057600080fd5b600e55565b60115433600160a060020a0390811691161462000fa157600080fd5b60006003805460ff169081111562000fb557fe5b1462000fc057600080fd5b6003805460ff19166001179055565b600160a060020a03331660009081526002602052604081205460ff16151560011462000ffa57600080fd5b6200100462001d14565b15156200101057600080fd5b60026003805460ff16908111156200102457fe5b146200102f57600080fd5b62001039620026c2565b42600f55600454909150600160a060020a031681156108fc0282604051600060405180830381858888f1935050505015156200107457600080fd5b7f56ca301a9219608c91e7bcee90e083c19671d2cdcc96752c7af291cee5f9c8c8814260405191825260208201526040908101905180910390a150565b60006018603c8084045b04811515620010c657fe5b0690505b919050565b6000806000806000600360019054906101000a9004600160a060020a0316600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200113b57600080fd5b5af115156200114957600080fd5b505050604051805190501115156200116057600080fd5b60026003805460ff16908111156200117457fe5b146200117f57600080fd5b601454600160a060020a0316156200119657600080fd5b620011a06200270a565b1515620011ac57600080fd5b6000601654118015620011ce5750620011cb6016546201518062002682565b42115b15620011da5760006016555b505060165442925062093a808301915015600081156200121c5762001219620012038562001a0c565b6200120e8662001b17565b600101600162001873565b90505b6003546101009004600160a060020a031630858584866200123c620030c9565b600160a060020a0396871681529490951660208501526040808501939093526060840191909152608083015291151560a082015260c0019051809103906000f08015156200128957600080fd5b60148054600160a060020a031916600160a060020a03929092169190911790557fd1a79c97f023d07d5c5533b0887300f81e113759deeb9531a541b93341ceab7f60405160405180910390a150505050565b60126020526000908152604090205481565b600054600160a060020a031681565b60006007600462015180840401620010c6565b600454600160a060020a031681565b60188054829081106200132d57fe5b600091825260209091200154905081565b60115460009033600160a060020a039081169116146200135d57600080fd5b506003805460ff19166002179055601154600160a060020a0316620013d081634d52a5126040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620013b057600080fd5b5af11515620013be57600080fd5b5050506040518051905060026200266a565b6010555042600f81905565af7151902add600e55600555565b6000620013fc86868686866000620018a8565b9695505050505050565b60006200141382620027cf565b6040015192915050565b60035433600160a060020a0390811661010090920416146200143e57600080fd5b601354600160a060020a031615801590620014ae5750601354600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200149457600080fd5b5af11515620014a257600080fd5b50505060405180519050155b156200151d57601354600160a060020a031663c734f917848360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156200150b57600080fd5b5af115156200151957600080fd5b5050505b601454600160a060020a0316158015906200158d5750601454600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200157357600080fd5b5af115156200158157600080fd5b50505060405180519050155b15620015fc57601454600160a060020a031663c734f917848360405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620015ea57600080fd5b5af11515620015f857600080fd5b5050505b505050565b600060026003805460ff16908111156200161757fe5b14620016265750600062001633565b62001630620026c2565b90505b90565b600160a060020a03331660009081526002602052604090205460ff1615156001146200166157600080fd5b600c54600160a060020a0316156200167857600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b6000620016ad85858585600080620018a8565b95945050505050565b60155481565b600d54600160a060020a031681565b60175460ff1681565b60145460009033600160a060020a0390811691161480156200174a5750601454600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200173157600080fd5b5af115156200173f57600080fd5b505050604051805190505b15156200175657600080fd5b81156200180c576000601654111562001779576200177362002932565b62001806565b601454600160a060020a03166378e979256040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515620017b957600080fd5b5af11515620017c757600080fd5b505050604051805190509050620017f8620017e28262001a0c565b620017ed8362001b17565b600201600162001873565b6016556017805460ff191690555b6200181f565b60006016556017805460ff191660011790555b7f9ab7d9b3f53fbde0442a57f23d2eca52d14cd437e392cf8896a96f3647dff6db82604051901515815260200160405180910390a1505060148054600160a060020a0319169055565b6000603c82620010c6565b6000620018878484846000806000620018a8565b949350505050565b600754600160a060020a031681565b65af7151902add81565b600080620018b5620030da565b6107b291505b8861ffff168261ffff1610156200190257620018d78262001b3d565b15620018ec576301e2850083019250620018f6565b6301e13380830192505b600190910190620018bb565b601f8152620019118962001b3d565b156200192457601d60208201526200192c565b601c60208201525b601f60408201819052601e606083018190526080830182905260a0830181905260c0830182905260e0830182905261010083018190526101208301829052610140830152610160820152600191505b8760ff168261ffff161015620019bf578061ffff600019840116600c8110620019a057fe5b602002015160ff1662015180028301925081806001019250506200197b565b6001870360ff166201518002830192508560ff16610e1002830192508460ff16603c02830192508360ff168301925082925050509695505050505050565b600854600160a060020a031681565b6000806107b26301e133808404810190829062001a299062001c1a565b62001a388361ffff1662001c1a565b039050806301e285000283019250806107b2830361ffff16036301e1338002830192505b8483111562001a9e5762001a736001830362001b3d565b1562001a88576301e285008303925062001a92565b6301e13380830392505b60018203915062001a5c565b509392505050565b600a81565b62001ab562003104565b600180548060200260200160405190810160405280929190818152602001828054801562001b0d57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831162001aee575b5050505050905090565b600062001b2482620027cf565b6020015192915050565b600c54600160a060020a031681565b6000600382161562001b5257506000620010ca565b606461ffff83160661ffff161562001b6d57506001620010ca565b61019061ffff83160661ffff161562001b8957506000620010ca565b506001919050565b60115460009033600160a060020a0390811691161462001bb057600080fd5b60006003805460ff169081111562001bc457fe5b1462001bcf57600080fd5b600160a060020a03821660009081526012602052604090205462001bf4903462002682565b600160a060020a0390921660009081526012602052604090209190915550565b600f5481565b60001901600061019082046064830460048404030192915050565b60008260ff166001148062001c4d57508260ff166003145b8062001c5c57508260ff166005145b8062001c6b57508260ff166007145b8062001c7a57508260ff166008145b8062001c8957508260ff16600a145b8062001c9857508260ff16600c145b1562001ca75750601f62001d08565b8260ff166004148062001cbd57508260ff166006145b8062001ccc57508260ff166009145b8062001cdb57508260ff16600b145b1562001cea5750601e62001d08565b62001cf58262001b3d565b1562001d045750601d62001d08565b50601c5b92915050565b60165481565b601454600090600160a060020a03161580159062001d875750601454600160a060020a031663b3f05b976040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001d6d57600080fd5b5af1151562001d7b57600080fd5b50505060405180519050155b801562001dec5750601454600090600160a060020a031663728b482b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001dd257600080fd5b5af1151562001de057600080fd5b50505060405180519050115b801562001e505750601454600160a060020a031663728b482b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e3457600080fd5b5af1151562001e4257600080fd5b505050604051805190504210155b801562001eb15750601454600160a060020a03166380322cbd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151562001e9857600080fd5b5af1151562001ea657600080fd5b505050604051805190505b1562001ec05750600062001633565b5060175460ff1690565b600d5433600160a060020a0390811691161462001ee657600080fd5b62001ef062002932565b565b60035460ff1681565b600b54600160a060020a031681565b601354600160a060020a031681565b600654600160a060020a031681565b600954600160a060020a031681565b601454600160a060020a031681565b600160a060020a03331660009081526002602052604081205460ff1615156001148062001f815750600d5433600160a060020a039081169116145b151562001f8d57600080fd5b60016003805460ff169081111562001fa157fe5b1462001fac57600080fd5b600160a060020a0382166000908152601260205260408120541162001fd057600080fd5b50600160a060020a03808216600090815260126020526040808220805492905560035491926101009092049091169063a24835d190849083906370a082319083905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200204e57600080fd5b5af115156200205c57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620020aa57600080fd5b5af11515620020b857600080fd5b505050600160a060020a0382166108fc82150282604051600060405180830381858888f193505050501515620020ed57600080fd5b7fec44c8b7c9108bd9d48e9a929c78d5a448562d61b1113d016ba7fd99d7dc3c7c8282426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a15050565b600160a060020a03331660009081526002602052604081205460ff1615156001146200217557600080fd5b6200217f62001d14565b15156200218b57600080fd5b601054600090116200219c57600080fd5b50601080546000909155600454600160a060020a031681156108fc0282604051600060405180830381858888f1935050505015156200107457600080fd5b60026020526000908152604090205460ff1681565b600a54600160a060020a031681565b60005433600160a060020a039081169116146200221a57600080fd5b620022258162002f52565b50565b6000603c8083620010bb565b600080600380805460ff16908111156200224a57fe5b146200225557600080fd5b6003546101009004600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620022ab57600080fd5b5af11515620022b957600080fd5b505050604051805192505060008211620022d257600080fd5b6200234f620022ec8330600160a060020a0316316200263c565b6003546101009004600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156200233157600080fd5b5af115156200233f57600080fd5b505050604051805190506200266a565b9050600081116200235f57600080fd5b6003546101009004600160a060020a031663a24835d1338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515620023bb57600080fd5b5af11515620023c957600080fd5b5050600160a060020a033316905081156108fc0282604051600060405180830381858888f193505050501515620023ff57600080fd5b7f2fe53133356d775fd6784d23de274186e0721e0d93074ae2392acb8968bb2e51338284426040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6003546101009004600160a060020a031681565b600e5481565b600060016003805460ff16908111156200249457fe5b146200249f57600080fd5b600160a060020a03331660009081526012602052604081205411620024c357600080fd5b50600160a060020a0333818116600090815260126020526040808220805492905560035491936101009092049091169163a24835d19183906370a082319083905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156200254057600080fd5b5af115156200254e57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156200259c57600080fd5b5af11515620025aa57600080fd5b5050600160a060020a033316905081156108fc0282604051600060405180830381858888f193505050501515620025e057600080fd5b7fec44c8b7c9108bd9d48e9a929c78d5a448562d61b1113d016ba7fd99d7dc3c7c3382426040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a150565b60008282028315806200265a57508284828115156200265757fe5b04145b15156200266357fe5b9392505050565b60008082848115156200267957fe5b04949350505050565b6000828201838110156200266357fe5b6000620026a18260026200266a565b9050600a811115620026b857600a601555620026be565b60158190555b5050565b600080620026e0620026d742600f54620030a5565b600e546200263c565b90508030600160a060020a0316311015620027025750600160a060020a033016315b8091505b5090565b60008060006016541180156200272257506016544210155b80156200273f57506200273b6016546201518062002682565b4211155b156200274f576001915062002706565b601854811015620027c75760188054829081106200276957fe5b9060005260206000209001544210158015620027ae5750620027aa6018828154811015156200279457fe5b9060005260206000209001546201518062002682565b4211155b15620027be576001915062002706565b6001016200274f565b600091505090565b620027d962003116565b6000808080620027e98662001a0c565b61ffff168552620027fc6107b262001c1a565b6200280c865161ffff1662001c1a565b039250826301e285000284019350826107b286600001510361ffff16036301e133800284019350600191505b600c60ff83161162002885576200285182865162001c35565b60ff1662015180029050858482011115620028755760ff8216602086015262002885565b9283019260019091019062002838565b600191505b6200289b8560200151865162001c35565b60ff168260ff16111515620028dc57858462015180011115620028c75760ff82166040860152620028dc565b6201518093909301926001909101906200288a565b620028e786620010b1565b60ff166060860152620028fa8662002228565b60ff1660808601526200290d8662001868565b60ff1660a08601526200292086620012fc565b60ff1660c08601525092949350505050565b60026003805460ff16908111156200294657fe5b146200295157600080fd5b6003805460ff1916811790819055600c54600160a060020a0361010090920482169163a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515620029c057600080fd5b5af11515620029ce57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002a1c57600080fd5b5af1151562002a2a57600080fd5b5050600354600a54600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002a9157600080fd5b5af1151562002a9f57600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002aed57600080fd5b5af1151562002afb57600080fd5b5050600354600854600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002b6257600080fd5b5af1151562002b7057600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002bbe57600080fd5b5af1151562002bcc57600080fd5b5050600354600754600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002c3357600080fd5b5af1151562002c4157600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002c8f57600080fd5b5af1151562002c9d57600080fd5b5050600354600954600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002d0457600080fd5b5af1151562002d1257600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002d6057600080fd5b5af1151562002d6e57600080fd5b5050600354600654600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002dd557600080fd5b5af1151562002de357600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002e3157600080fd5b5af1151562002e3f57600080fd5b5050600354600b54600160a060020a036101009092048216925063a24835d19116826370a082318260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562002ea657600080fd5b5af1151562002eb457600080fd5b5050506040518051905060405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151562002f0257600080fd5b5af1151562002f1057600080fd5b5050507f32a9af620b9010e46c598870c64620a9c1b65816b3140fbd73ea13f2e50cdb2333604051600160a060020a03909116815260200160405180910390a1565b6000805b60015482101562002fb85760006002600060018581548110151562002f7757fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff19169115159190911790556001919091019062002f56565b5060005b8251811015620030145760016002600085848151811062002fd957fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff191691151591909117905560010162002fbc565b60018380516200302992916020019062003152565b507f9465cd279c2de393c5568ae444599e3644e3d1864ca2c05ced8a654df2aea3cb8360405160208082528190810183818151815260200191508051906020019060200280838360005b838110156200308d57808201518382015260200162003073565b505050509050019250505060405180910390a1505050565b600081831015620030b257fe5b50900390565b604051610a6280620031db83390190565b6040516109de8062003c3d83390190565b610180604051908101604052600c815b600081526000199091019060200181620030ea5790505090565b60206040519081016040526000815290565b60e06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c082015290565b828054828255906000526020600020908101928215620031ac579160200282015b82811115620031ac5782518254600160a060020a031916600160a060020a03919091161782556020929092019160019091019062003173565b506200270692620016339250905b8082111562002706578054600160a060020a0319168155600101620031ba560060606040526000600555600060065560006007556000600b55341561002357600080fd5b60405160c080610a6283398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191508590508484846000600160a060020a038516151561007857600080fd5b42831015801561008757508282115b151561009257600080fd5b60008054600160a060020a03968716600160a060020a03199182161790915560018054959096169416939093179093556002556003919091556008805460ff199081169091556004805492151592909116919091179055600a95909555505050600b919091555061095a806101086000396000f3006060604052600436106100e25763ffffffff60e060020a6000350416632c24909c81146100e75780633197cbb61461010c578063361810261461011f57806341fdade61461014657806343c14b22146101595780634b9f5c981461016e57806364a90292146101865780636f6a97621461019957806378e97925146101ac57806380322cbd146101bf578063a7491b48146101d2578063b3a2273f14610217578063b3f05b971461022a578063c734f9171461023d578063d74689e41461025f578063e82bef2914610272578063fc0c546a146102a1578063fd221031146102b4575b600080fd5b34156100f257600080fd5b6100fa6102c7565b60405190815260200160405180910390f35b341561011757600080fd5b6100fa610345565b341561012a57600080fd5b61013261034b565b604051901515815260200160405180910390f35b341561015157600080fd5b6100fa610393565b341561016457600080fd5b61016c610399565b005b341561017957600080fd5b61016c6004351515610458565b341561019157600080fd5b6100fa6105ee565b34156101a457600080fd5b6100fa6105f4565b34156101b757600080fd5b6100fa6105fa565b34156101ca57600080fd5b610132610600565b34156101dd57600080fd5b6101f1600160a060020a036004351661060a565b604051928352602083019190915215156040808301919091526060909101905180910390f35b341561022257600080fd5b6100fa61062e565b341561023557600080fd5b610132610634565b341561024857600080fd5b61016c600160a060020a036004351660243561063d565b341561026a57600080fd5b6100fa610814565b341561027d57600080fd5b61028561081a565b604051600160a060020a03909116815260200160405180910390f35b34156102ac57600080fd5b610285610829565b34156102bf57600080fd5b6100fa610838565b600061033f6102e46102dd60055460065461083e565b6064610854565b600054600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561032357600080fd5b5af1151561033057600080fd5b50505060405180519050610878565b90505b90565b60035481565b60085460009060ff161561035e57600080fd5b60035442101561037057506000610342565b6008805460ff1916600117905561038d61038861088f565b6108b1565b50600190565b6103e881565b60008060025442101580156103b057506003544211155b15156103bb57600080fd5b600160a060020a033316600090815260096020526040812054116103de57600080fd5b5050600160a060020a033316600090815260096020526040812060018082018054600284018054948690559490915560ff19831690935560075460ff909216916104279161091c565b60075580156104445761043c6005548361091c565b600555610454565b6104506006548361091c565b6006555b5050565b600080600254421015801561046f57506003544211155b151561047a57600080fd5b600160a060020a0333166000908152600960205260409020541561049d57600080fd5b600054600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156104ed57600080fd5b5af115156104fa57600080fd5b50505060405180516000549093506105689150600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561054957600080fd5b5af1151561055657600080fd5b505050604051805190506103e8610878565b905080821115610578578061057a565b815b915082156105965761058e6005548361083e565b6005556105a6565b6105a26006548361083e565b6006555b33600160a060020a0316600090815260096020526040902042815560018082018490556002909101805460ff19168515151790556007546105e69161083e565b600755505050565b60065481565b600b5481565b60025481565b600061033f61088f565b60096020526000908152604090208054600182015460029092015490919060ff1683565b60075481565b60085460ff1681565b60015460009033600160a060020a0390811691161461065b57600080fd5b600160a060020a038316600090815260096020526040902054151561067f5761080f565b60045460ff1615156106b25760085460ff16806106a857506002544210806106a8575060035442115b156106b25761080f565b600160a060020a03808416600090815260096020526040808220600101549154919291909116906370a082319086905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561071d57600080fd5b5af1151561072a57600080fd5b505050604051805190501015156107405761080f565b50600160a060020a03821660009081526009602052604090206001015481908111156107845750600160a060020a0382166000908152600960205260409020600101545b600160a060020a03831660009081526009602052604090206002015460ff16156107bc576107b46005548261091c565b6005556107cc565b6107c86006548261091c565b6006555b600160a060020a0383166000908152600960205260409020600101546107f2908261091c565b600160a060020a0384166000908152600960205260409020600101555b505050565b60055481565b600154600160a060020a031681565b600054600160a060020a031681565b600a5481565b60008282018381101561084d57fe5b9392505050565b6000828202831580610870575082848281151561086d57fe5b04145b151561084d57fe5b600080828481151561088657fe5b04949350505050565b600060065460055411801561033f5750600b546108aa6102c7565b1015905090565b600154600a54600160a060020a039091169081906329c90b6390849060405160e060020a63ffffffff851602815291151560048301526024820152604401600060405180830381600087803b151561090857600080fd5b5af1151561091557600080fd5b5050505050565b60008183101561092857fe5b509003905600a165627a7a7230582059b9e61e8cd64d75d9fd9707882faf208afa8c2a4a99bc7f4ed6dd90ad40be26002960606040526000600555600060065560006007556000600a55341561002357600080fd5b60405160c0806109de833981016040528080519190602001805191906020018051919060200180519190602001805191906020018051915086905085858584600160a060020a038516151561007757600080fd5b42831015801561008657508282115b151561009157600080fd5b60008054600160a060020a03968716600160a060020a03199182161790915560018054959096169416939093179093556002556003919091556008805460ff19908116909155600480549215159290911691909117905550600a55505050506108df806100ff6000396000f3006060604052600436106100cc5763ffffffff60e060020a6000350416633197cbb681146100d157806336181026146100f657806341fdade61461011d57806343c14b22146101305780634b9f5c981461014557806364a902921461015d578063728b482b1461017057806378e979251461018357806380322cbd14610196578063a7491b48146101a9578063b3a2273f146101ee578063b3f05b9714610201578063c734f91714610214578063d74689e414610236578063e82bef2914610249578063fc0c546a14610278575b600080fd5b34156100dc57600080fd5b6100e461028b565b60405190815260200160405180910390f35b341561010157600080fd5b610109610291565b604051901515815260200160405180910390f35b341561012857600080fd5b6100e46102f2565b341561013b57600080fd5b6101436102f8565b005b341561015057600080fd5b61014360043515156103b7565b341561016857600080fd5b6100e461054d565b341561017b57600080fd5b6100e4610553565b341561018e57600080fd5b6100e4610559565b34156101a157600080fd5b61010961055f565b34156101b457600080fd5b6101c8600160a060020a036004351661056e565b604051928352602083019190915215156040808301919091526060909101905180910390f35b34156101f957600080fd5b6100e4610592565b341561020c57600080fd5b610109610598565b341561021f57600080fd5b610143600160a060020a03600435166024356105a1565b341561024157600080fd5b6100e4610778565b341561025457600080fd5b61025c61077e565b604051600160a060020a03909116815260200160405180910390f35b341561028357600080fd5b61025c61078d565b60035481565b600080600a541180156102a75750600354600a54115b156102c057600a544210156102bb57600080fd5b6102cf565b6003544210156102cf57600080fd5b6008805460ff191660011790556102ec6102e761079c565b610817565b50600190565b6103e881565b600080600254421015801561030f57506003544211155b151561031a57600080fd5b600160a060020a0333166000908152600960205260408120541161033d57600080fd5b5050600160a060020a033316600090815260096020526040812060018082018054600284018054948690559490915560ff19831690935560075460ff9092169161038691610874565b60075580156103a35761039b60055483610874565b6005556103b3565b6103af60065483610874565b6006555b5050565b60008060025442101580156103ce57506003544211155b15156103d957600080fd5b600160a060020a033316600090815260096020526040902054156103fc57600080fd5b600054600160a060020a03166370a082313360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561044c57600080fd5b5af1151561045957600080fd5b50505060405180516000549093506104c79150600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156104a857600080fd5b5af115156104b557600080fd5b505050604051805190506103e8610886565b9050808211156104d757806104d9565b815b915082156104f5576104ed6005548361089d565b600555610505565b6105016006548361089d565b6006555b33600160a060020a0316600090815260096020526040902042815560018082018490556002909101805460ff19168515151790556007546105459161089d565b600755505050565b60065481565b600a5481565b60025481565b600061056961079c565b905090565b60096020526000908152604090208054600182015460029092015490919060ff1683565b60075481565b60085460ff1681565b60015460009033600160a060020a039081169116146105bf57600080fd5b600160a060020a03831660009081526009602052604090205415156105e357610773565b60045460ff1615156106165760085460ff168061060c575060025442108061060c575060035442115b1561061657610773565b600160a060020a03808416600090815260096020526040808220600101549154919291909116906370a082319086905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561068157600080fd5b5af1151561068e57600080fd5b505050604051805190501015156106a457610773565b50600160a060020a03821660009081526009602052604090206001015481908111156106e85750600160a060020a0382166000908152600960205260409020600101545b600160a060020a03831660009081526009602052604090206002015460ff16156107205761071860055482610874565b600555610730565b61072c60065482610874565b6006555b600160a060020a0383166000908152600960205260409020600101546107569082610874565b600160a060020a0384166000908152600960205260409020600101555b505050565b60055481565b600154600160a060020a031681565b600054600160a060020a031681565b6000600654600554118015610569575060005461080d90600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156107ef57600080fd5b5af115156107fc57600080fd5b505050604051805190506003610886565b6005541015905090565b600154600160a060020a0316806389ea2cb78360405160e060020a63ffffffff84160281529015156004820152602401600060405180830381600087803b151561086057600080fd5b5af1151561086d57600080fd5b5050505050565b60008183101561088057fe5b50900390565b600080828481151561089457fe5b04949350505050565b6000828201838110156108ac57fe5b93925050505600a165627a7a7230582008913de14f0f24c71050379b6997cb6e8d4ff163e3e8f3e73edbd6069a08d95f0029a165627a7a72305820933a469c477da45183c7ccef2cc51e8cce1c9f6715277e653a22eb77386679c70029000000000000000000000000e45f9c10f3e4647ac922b0128e688e8e1f220f5f000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c30000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f30000000000000000000000005686508abbff20db6a582643280601ef53b58ddf000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b8760400000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b90000000000000000000000002d2edbfa6c22c276263dacf1252eb0611bde751d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f

    Constructor Arguments (ABI-encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e45f9c10f3e4647ac922b0128e688e8e1f220f5f000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c30000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f30000000000000000000000005686508abbff20db6a582643280601ef53b58ddf000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b8760400000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b90000000000000000000000002d2edbfa6c22c276263dacf1252eb0611bde751d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f

-----Decoded View---------------
Found 11 constructor arguments :
Arg [0] : 000000000000000000000000e45f9c10f3e4647ac922b0128e688e8e1f220f5f
Arg [1] : 000000000000000000000000f759cae90459c72bb3668fcd8e674f9e1eb9c2c3
Arg [2] : 0000000000000000000000009496dbbb9bc9fd78d4735b954569a54fe2a0d9f3
Arg [3] : 0000000000000000000000005686508abbff20db6a582643280601ef53b58ddf
Arg [4] : 000000000000000000000000a1568c501e650c83337f8119b6276c0de4aabb0f
Arg [5] : 00000000000000000000000073c2d67e4181ad1926b4b47b56d3d2c198b87604
Arg [6] : 00000000000000000000000011f21536f888def8c7d2c4785f3f70b3ddbca1b9
Arg [7] : 0000000000000000000000002d2edbfa6c22c276263dacf1252eb0611bde751d
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000005eaf0a37346ff992199fbc4480c9ccc4137d9c1f


   Swarm Source:
bzzr://933a469c477da45183c7ccef2cc51e8cce1c9f6715277e653a22eb77386679c7

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.