false
false
0
Note: Ocean testnet will soon stop being supported, it is being replaced by Horizon testnet. You will be redirected to the new testnet scanner when its live.

Contract Address Details

0x5cF339f6D31dD94Eb94ce9b3417A4EE462926560

Contract Name
RafflePool
Creator
0x09642e–cfda59 at 0xf992d0–781bb3
Balance
0 FTN ( )
Tokens
Fetching tokens...
Transactions
7 Transactions
Transfers
0 Transfers
Gas Used
1,982,476
Last Balance Update
1464145
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
RafflePool




Optimization enabled
false
Compiler version
v0.8.19+commit.7dd6d404




EVM Version
default




Verified at
2024-05-23T09:14:41.645377Z

Constructor Arguments

0000000000000000000000009829d6ac67e49e0b95af2859fff15302151518150000000000000000000000000000000000000000000000000000000000000060000000000000000000000000be1513f5fd788092a8b4ca25a0a0042be183118e000000000000000000000000000000000000000000000000000000000000000e706f6f6c312875696e7432353629000000000000000000000000000000000000

Arg [0] (address) : 0x9829d6ac67e49e0b95af2859fff1530215151815
Arg [1] (string) : pool1(uint256)
Arg [2] (address) : 0xbe1513f5fd788092a8b4ca25a0a0042be183118e

              

contracts/RafflePool.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./RNG/interfaces/IRNG.sol";

contract RafflePool is Ownable {

    struct Payout {
        uint256 from;
        uint256 to;
        uint256 amount;
    }

    struct Pool {
        address poolAddress;
        bytes4 selector;
    }

    Pool public pool;
    uint256[] public places;
    mapping(uint256 => bool) public paidTable;

    uint256 public currentRafflePosition = 0;
    uint256 public currentPayPosition = 0;
    Payout[] public payoutStructure;
    IRNG public rng;

    event Claimed(address indexed user, uint256 indexed index, uint256 amount);

    receive() external payable {}
    fallback() external payable {}

    constructor(address poolAddress_, string memory functionPrototype_, address rng_) {

        pool.poolAddress = poolAddress_;
        pool.selector = bytes4(keccak256(bytes(functionPrototype_)));
        rng = IRNG(rng_);

        (bool success, ) = pool.poolAddress.call(abi.encodeWithSelector(pool.selector, 0));
        require(success, "RafflePool: Invalid pool address or selector");
    }

    function setPayoutStructure(uint256[] calldata payoutStructure_) external onlyOwner() {

        require(0 == payoutStructure.length, "RafflePool: Payout structure already set");

        require(0 != payoutStructure_.length, "RafflePool: Length of payout structure cannot be 0");
        require(0 == payoutStructure_.length % 3, "RafflePool: length % 3 should be 0");
        uint256 pl = payoutStructure_[payoutStructure_.length - 2];

        (bool success, ) = pool.poolAddress.staticcall(abi.encodeWithSelector(pool.selector, pl - 1));
        require(success, "RafflePool: Payout structure not correspond with pool");
        (success, ) = pool.poolAddress.staticcall(abi.encodeWithSelector(pool.selector, pl));
        require(! success, "RafflePool: Payout structure not correspond with pool");

        require(0 == payoutStructure_[0], "RafflePool: Invalid payout structure");
        require(payoutStructure_[0] < payoutStructure_[1], "RafflePool: Invalid payout structure");
        payoutStructure.push(Payout({
            from: payoutStructure_[0],
            to: payoutStructure_[1],
            amount: payoutStructure_[2]
        }));

        for (uint256 i = 3; i < payoutStructure_.length; i += 3) {

            require(payoutStructure_[i] == payoutStructure[payoutStructure.length - 1].to,
                    "RafflePool: Invalid payout structure");
            require(payoutStructure_[i] < payoutStructure_[i + 1], "RafflePool: Invalid payout structure");
            payoutStructure.push(Payout({
                from: payoutStructure_[i],
                to: payoutStructure_[i + 1],
                amount: payoutStructure_[i + 2]
            }));
        }
    }

    function getUserInfo(address user) external view returns(uint256 place, uint256 amount) {
        for (uint256 i = 0; i < places.length; i++) {
            (bool success, bytes memory data) = pool.poolAddress.staticcall(abi.encodeWithSelector(pool.selector, i));
            require(success, "RafflePool: cannot get user address");
            address user_ = _bytesToAddress(data);
            if (user == user_) {
                Payout memory payout;
                for (uint256 j = 0; j < payoutStructure.length; j++) {
                    payout = payoutStructure[j];
                    if (payout.from <= places[i] && payout.to > places[i]) {
                        return (places[i], payout.amount);
                    }
                }
            }
        }
    }

    function getNumber() external onlyOwner() {
        rng.requestRandomWords();
    }

    function rafflePool(uint256 count_) external onlyOwner() {
        
        require(0 != payoutStructure.length, "RafflePool: Payout structure not set");

        uint256 pl = payoutStructure[payoutStructure.length - 1].to;
        require(pl != currentRafflePosition, "RafflePool: Pool already raffled");
        require(0 != count_, "RafflePool: Count must be greater than 0");
        require(currentRafflePosition + count_ - 1 < pl, "RafflePool: Out of index");
        
        uint256 lastRequestId = rng.lastRequestId();
        (bool fulfilled, uint256[] memory numbers) = rng.getRequestStatus(lastRequestId);
        require(fulfilled, "RafflePool: wait for fulfillment");

        bytes32 hash = bytes32(numbers[0]);
        uint256 from = currentRafflePosition;
        currentRafflePosition += count_;
        uint256[] storage places_ = places;
        for (uint256 i = from; i < currentRafflePosition; i++) {
            places_.push(places_.length);
            uint256 n = uint256(hash) % (i + 1);
            uint256 t = places_[n];
            places_[n] = places_[places_.length - 1];
            places_[places_.length - 1] = t;
            hash = keccak256(abi.encodePacked(hash));
        }
    }

    function payWithIndex(uint256 userIndex_) external {
        _pay(userIndex_);
    }

    function payWithCount(uint256 count_) external {

        require(0 != count_, "RafflePool: Count must be greater than 0");
        uint256 pl = payoutStructure[payoutStructure.length - 1].to;
        require(currentPayPosition + count_ <= pl, "RafflePool: Out of index");

        for (uint256 i = 0; i < count_; i++) {
            _pay(currentPayPosition);
            ++currentPayPosition;
        }
    }

    function getPayoutStructure() external view returns (Payout[] memory) {
        return payoutStructure;
    }

    function getPlaces() external view returns (uint256[] memory) {
        return places;
    }

    function withdraw(address _recipient) public onlyOwner() {
        payable(_recipient).transfer(address(this).balance);
    }

    /// Helper member functions

    function _pay(uint256 index_) private {

        uint256 pl = payoutStructure[payoutStructure.length - 1].to;
        require(pl == currentRafflePosition,  "RafflePool: Raffle not ended");
        require(pl > currentPayPosition, "RafflePool: Pool already paid");

        if (paidTable[index_]) {
            return;
        }
        (bool success, bytes memory data) = pool.poolAddress.call(abi.encodeWithSelector(pool.selector, index_));
        require(success, "RafflePool: Pool call failed");
        address ua = _bytesToAddress(data);

        Payout memory payout;
        for (uint256 i = 0; i < payoutStructure.length; i++) {
            payout = payoutStructure[i];
            if (payout.from <= places[index_] && places[index_] < payout.to) {
                paidTable[index_] = true;
                (success,) = payable(ua).call{ value: payout.amount }("");
                require(success, "RafflePool: transfer failed");
                emit Claimed(ua, index_, payout.amount);
                return;
            }
        }
    }

    function _bytesToAddress(bytes memory data) private pure returns (address addr) {
        require(data.length >= 20, "RafflePool: Invalid address data");
        assembly {
            addr := mload(add(data, 0x20))
        }
    }
}
        

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}
          

contracts/RNG/interfaces/IRNG.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IRNG {

    function lastRequestId() external returns(uint256);
    function requestRandomWords() external;
    function getRequestStatus(uint256) external view returns (bool, uint256[] memory);
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":false},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"poolAddress_","internalType":"address"},{"type":"string","name":"functionPrototype_","internalType":"string"},{"type":"address","name":"rng_","internalType":"address"}]},{"type":"event","name":"Claimed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"index","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentPayPosition","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentRafflePosition","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"getNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct RafflePool.Payout[]","components":[{"type":"uint256","name":"from","internalType":"uint256"},{"type":"uint256","name":"to","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}]}],"name":"getPayoutStructure","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getPlaces","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"place","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"getUserInfo","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paidTable","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"payWithCount","inputs":[{"type":"uint256","name":"count_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"payWithIndex","inputs":[{"type":"uint256","name":"userIndex_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"from","internalType":"uint256"},{"type":"uint256","name":"to","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"payoutStructure","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"places","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"poolAddress","internalType":"address"},{"type":"bytes4","name":"selector","internalType":"bytes4"}],"name":"pool","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rafflePool","inputs":[{"type":"uint256","name":"count_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRNG"}],"name":"rng","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPayoutStructure","inputs":[{"type":"uint256[]","name":"payoutStructure_","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_recipient","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x6080604052600060045560006005553480156200001b57600080fd5b506040516200381d3803806200381d833981810160405281019062000041919062000538565b62000061620000556200027460201b60201c565b6200027c60201b60201c565b82600160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508180519060200120600160000160146101000a81548163ffffffff021916908360e01c021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b60006040516024016200017391906200060d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620001df919062000677565b6000604051808303816000865af19150503d80600081146200021e576040519150601f19603f3d011682016040523d82523d6000602084013e62000223565b606091505b50509050806200026a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002619062000717565b60405180910390fd5b5050505062000739565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003818262000354565b9050919050565b620003938162000374565b81146200039f57600080fd5b50565b600081519050620003b38162000388565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200040e82620003c3565b810181811067ffffffffffffffff8211171562000430576200042f620003d4565b5b80604052505050565b60006200044562000340565b905062000453828262000403565b919050565b600067ffffffffffffffff821115620004765762000475620003d4565b5b6200048182620003c3565b9050602081019050919050565b60005b83811015620004ae57808201518184015260208101905062000491565b60008484015250505050565b6000620004d1620004cb8462000458565b62000439565b905082815260208101848484011115620004f057620004ef620003be565b5b620004fd8482856200048e565b509392505050565b600082601f8301126200051d576200051c620003b9565b5b81516200052f848260208601620004ba565b91505092915050565b6000806000606084860312156200055457620005536200034a565b5b60006200056486828701620003a2565b935050602084015167ffffffffffffffff8111156200058857620005876200034f565b5b620005968682870162000505565b9250506040620005a986828701620003a2565b9150509250925092565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000620005f5620005ef620005e984620005b3565b620005ca565b620005bd565b9050919050565b6200060781620005d4565b82525050565b6000602082019050620006246000830184620005fc565b92915050565b600081519050919050565b600081905092915050565b60006200064d826200062a565b62000659818562000635565b93506200066b8185602086016200048e565b80840191505092915050565b600062000685828462000640565b915081905092915050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20496e76616c696420706f6f6c206164647265737360008201527f206f722073656c6563746f720000000000000000000000000000000000000000602082015250565b6000620006ff602c8362000690565b91506200070c82620006a1565b604082019050919050565b600060208201905081810360008301526200073281620006f0565b9050919050565b6130d480620007496000396000f3fe6080604052600436106101185760003560e01c80639c2d2d8e116100a0578063d605787b11610064578063d605787b14610383578063e557bb4e146103ae578063f289eaa5146103eb578063f2c9ecd81461042a578063f2fde38b146104415761011f565b80639c2d2d8e1461029e578063a980e79f146102c9578063bc23f848146102f2578063c7634a791461031b578063cc5ee365146103585761011f565b806351cff8d9116100e757806351cff8d9146101cc5780636386c1c7146101f5578063715018a6146102335780638da5cb5b1461024a5780639494582d146102755761011f565b806308d62b03146101215780630cff68271461014a57806316f0115b146101755780633b0e84de146101a15761011f565b3661011f57005b005b34801561012d57600080fd5b5061014860048036038101906101439190611dea565b61046a565b005b34801561015657600080fd5b5061015f61057c565b60405161016c9190611e26565b60405180910390f35b34801561018157600080fd5b5061018a610582565b604051610198929190611ebd565b60405180910390f35b3480156101ad57600080fd5b506101b66105c1565b6040516101c39190611fa4565b60405180910390f35b3480156101d857600080fd5b506101f360048036038101906101ee9190611ff2565b610619565b005b34801561020157600080fd5b5061021c60048036038101906102179190611ff2565b61066b565b60405161022a92919061201f565b60405180910390f35b34801561023f57600080fd5b50610248610933565b005b34801561025657600080fd5b5061025f610947565b60405161026c9190612048565b60405180910390f35b34801561028157600080fd5b5061029c600480360381019061029791906120c8565b610970565b005b3480156102aa57600080fd5b506102b36110c0565b6040516102c09190612206565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190611dea565b61113d565b005b3480156102fe57600080fd5b5061031960048036038101906103149190611dea565b6115b9565b005b34801561032757600080fd5b50610342600480360381019061033d9190611dea565b6115c5565b60405161034f9190612243565b60405180910390f35b34801561036457600080fd5b5061036d6115e5565b60405161037a9190611e26565b60405180910390f35b34801561038f57600080fd5b506103986115eb565b6040516103a591906122bd565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190611dea565b611611565b6040516103e29190611e26565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190611dea565b611635565b604051610421939291906122d8565b60405180910390f35b34801561043657600080fd5b5061043f61166f565b005b34801561044d57600080fd5b5061046860048036038101906104639190611ff2565b6116fb565b005b806000036104ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a490612392565b60405180910390fd5b6000600660016006805490506104c391906123e1565b815481106104d4576104d3612415565b5b906000526020600020906003020160010154905080826005546104f79190612444565b1115610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052f906124c4565b60405180910390fd5b60005b828110156105775761054e60055461177e565b60056000815461055d906124e4565b91905081905550808061056f906124e4565b91505061053b565b505050565b60045481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561060f57602002820191906000526020600020905b8154815260200190600101908083116105fb575b5050505050905090565b610621611be2565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610667573d6000803e3d6000fd5b5050565b60008060005b60028054905081101561092c57600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b846040516024016106e19190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161074b919061259d565b600060405180830381855afa9150503d8060008114610786576040519150601f19603f3d011682016040523d82523d6000602084013e61078b565b606091505b5091509150816107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c790612626565b60405180910390fd5b60006107db82611c60565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361091657610818611d7f565b60005b600680549050811015610913576006818154811061083c5761083b612415565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505091506002868154811061088957610888612415565b5b90600052602060002001548260000151111580156108c85750600286815481106108b6576108b5612415565b5b90600052602060002001548260200151115b1561090057600286815481106108e1576108e0612415565b5b906000526020600020015482604001519750975050505050505061092e565b808061090b906124e4565b91505061081b565b50505b5050508080610924906124e4565b915050610671565b505b915091565b61093b611be2565b6109456000611cb3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610978611be2565b6006805490506000146109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b7906126b8565b60405180910390fd5b81819050600003610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd9061274a565b60405180910390fd5b600382829050610a169190612799565b600014610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061283c565b60405180910390fd5b60008282600285859050610a6c91906123e1565b818110610a7c57610a7b612415565b5b9050602002013590506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b600184610ae391906123e1565b604051602401610af39190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b5d919061259d565b600060405180830381855afa9150503d8060008114610b98576040519150601f19603f3d011682016040523d82523d6000602084013e610b9d565b606091505b5050905080610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd8906128ce565b60405180910390fd5b600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b83604051602401610c419190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610cab919061259d565b600060405180830381855afa9150503d8060008114610ce6576040519150601f19603f3d011682016040523d82523d6000602084013e610ceb565b606091505b5050809150508015610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d29906128ce565b60405180910390fd5b83836000818110610d4657610d45612415565b5b90506020020135600014610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690612960565b60405180910390fd5b83836001818110610da357610da2612415565b5b9050602002013584846000818110610dbe57610dbd612415565b5b9050602002013510610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90612960565b60405180910390fd5b6006604051806060016040528086866000818110610e2657610e25612415565b5b90506020020135815260200186866001818110610e4657610e45612415565b5b90506020020135815260200186866002818110610e6657610e65612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506000600390505b848490508110156110b95760066001600680549050610edf91906123e1565b81548110610ef057610eef612415565b5b906000526020600020906003020160010154858583818110610f1557610f14612415565b5b9050602002013514610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612960565b60405180910390fd5b8484600183610f6b9190612444565b818110610f7b57610f7a612415565b5b90506020020135858583818110610f9557610f94612415565b5b9050602002013510610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390612960565b60405180910390fd5b60066040518060600160405280878785818110610ffc57610ffb612415565b5b90506020020135815260200187876001866110179190612444565b81811061102757611026612415565b5b90506020020135815260200187876002866110429190612444565b81811061105257611051612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506003816110b29190612444565b9050610ec0565b5050505050565b60606006805480602002602001604051908101604052809291908181526020016000905b8282101561113457838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906110e4565b50505050905090565b611145611be2565b60068054905060000361118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906129f2565b60405180910390fd5b6000600660016006805490506111a391906123e1565b815481106111b4576111b3612415565b5b9060005260206000209060030201600101549050600454810361120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390612a5e565b60405180910390fd5b8160000361124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690612392565b60405180910390fd5b806001836004546112609190612444565b61126a91906123e1565b106112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906124c4565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612a93565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b815260040161139f9190611e26565b600060405180830381865afa1580156113bc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e59190612c3b565b9150915081611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612ce3565b60405180910390fd5b60008160008151811061143f5761143e612415565b5b602002602001015160001b90506000600454905086600460008282546114659190612444565b9250508190555060006002905060008290505b6004548110156115ae57818280549050908060018154018082558091505060019003906000526020600020016000909190919091505560006001826114bd9190612444565b8560001c6114cb9190612799565b905060008382815481106114e2576114e1612415565b5b90600052602060002001549050836001858054905061150191906123e1565b8154811061151257611511612415565b5b90600052602060002001548483815481106115305761152f612415565b5b906000526020600020018190555080846001868054905061155191906123e1565b8154811061156257611561612415565b5b9060005260206000200181905550856040516020016115819190612d2e565b604051602081830303815290604052805190602001209550505080806115a6906124e4565b915050611478565b505050505050505050565b6115c28161177e565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60055481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002818154811061162157600080fd5b906000526020600020016000915090505481565b6006818154811061164557600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b611677611be2565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b50505050565b611703611be2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990612dbb565b60405180910390fd5b61177b81611cb3565b50565b60006006600160068054905061179491906123e1565b815481106117a5576117a4612415565b5b906000526020600020906003020160010154905060045481146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490612e27565b60405180910390fd5b6005548111611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890612e93565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900460ff161561186d5750611bdf565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b856040516024016118d09190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161193a919061259d565b6000604051808303816000865af19150503d8060008114611977576040519150601f19603f3d011682016040523d82523d6000602084013e61197c565b606091505b5091509150816119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890612eff565b60405180910390fd5b60006119cc82611c60565b90506119d6611d7f565b60005b600680549050811015611bd857600681815481106119fa576119f9612415565b5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050915060028781548110611a4757611a46612415565b5b9060005260206000200154826000015111158015611a865750816020015160028881548110611a7957611a78612415565b5b9060005260206000200154105b15611bc55760016003600089815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168260400151604051611adf90612f45565b60006040518083038185875af1925050503d8060008114611b1c576040519150601f19603f3d011682016040523d82523d6000602084013e611b21565b606091505b50508095505084611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90612fa6565b60405180910390fd5b868373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8460400151604051611bb29190611e26565b60405180910390a3505050505050611bdf565b8080611bd0906124e4565b9150506119d9565b5050505050505b50565b611bea611d77565b73ffffffffffffffffffffffffffffffffffffffff16611c08610947565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613012565b60405180910390fd5b565b6000601482511015611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e9061307e565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611dc781611db4565b8114611dd257600080fd5b50565b600081359050611de481611dbe565b92915050565b600060208284031215611e0057611dff611daa565b5b6000611e0e84828501611dd5565b91505092915050565b611e2081611db4565b82525050565b6000602082019050611e3b6000830184611e17565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e6c82611e41565b9050919050565b611e7c81611e61565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb781611e82565b82525050565b6000604082019050611ed26000830185611e73565b611edf6020830184611eae565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611f1b81611db4565b82525050565b6000611f2d8383611f12565b60208301905092915050565b6000602082019050919050565b6000611f5182611ee6565b611f5b8185611ef1565b9350611f6683611f02565b8060005b83811015611f97578151611f7e8882611f21565b9750611f8983611f39565b925050600181019050611f6a565b5085935050505092915050565b60006020820190508181036000830152611fbe8184611f46565b905092915050565b611fcf81611e61565b8114611fda57600080fd5b50565b600081359050611fec81611fc6565b92915050565b60006020828403121561200857612007611daa565b5b600061201684828501611fdd565b91505092915050565b60006040820190506120346000830185611e17565b6120416020830184611e17565b9392505050565b600060208201905061205d6000830184611e73565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261208857612087612063565b5b8235905067ffffffffffffffff8111156120a5576120a4612068565b5b6020830191508360208202830111156120c1576120c061206d565b5b9250929050565b600080602083850312156120df576120de611daa565b5b600083013567ffffffffffffffff8111156120fd576120fc611daf565b5b61210985828601612072565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6060820160008201516121576000850182611f12565b50602082015161216a6020850182611f12565b50604082015161217d6040850182611f12565b50505050565b600061218f8383612141565b60608301905092915050565b6000602082019050919050565b60006121b382612115565b6121bd8185612120565b93506121c883612131565b8060005b838110156121f95781516121e08882612183565b97506121eb8361219b565b9250506001810190506121cc565b5085935050505092915050565b6000602082019050818103600083015261222081846121a8565b905092915050565b60008115159050919050565b61223d81612228565b82525050565b60006020820190506122586000830184612234565b92915050565b6000819050919050565b600061228361227e61227984611e41565b61225e565b611e41565b9050919050565b600061229582612268565b9050919050565b60006122a78261228a565b9050919050565b6122b78161229c565b82525050565b60006020820190506122d260008301846122ae565b92915050565b60006060820190506122ed6000830186611e17565b6122fa6020830185611e17565b6123076040830184611e17565b949350505050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061237c60288361230f565b915061238782612320565b604082019050919050565b600060208201905081810360008301526123ab8161236f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006123ec82611db4565b91506123f783611db4565b925082820390508181111561240f5761240e6123b2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061244f82611db4565b915061245a83611db4565b9250828201905080821115612472576124716123b2565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b60006124ae60188361230f565b91506124b982612478565b602082019050919050565b600060208201905081810360008301526124dd816124a1565b9050919050565b60006124ef82611db4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612521576125206123b2565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015612560578082015181840152602081019050612545565b60008484015250505050565b60006125778261252c565b6125818185612537565b9350612591818560208601612542565b80840191505092915050565b60006125a9828461256c565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061261060238361230f565b915061261b826125b4565b604082019050919050565b6000602082019050818103600083015261263f81612603565b9050919050565b7f526166666c65506f6f6c3a205061796f75742073747275637475726520616c7260008201527f6561647920736574000000000000000000000000000000000000000000000000602082015250565b60006126a260288361230f565b91506126ad82612646565b604082019050919050565b600060208201905081810360008301526126d181612695565b9050919050565b7f526166666c65506f6f6c3a204c656e677468206f66207061796f75742073747260008201527f7563747572652063616e6e6f7420626520300000000000000000000000000000602082015250565b600061273460328361230f565b915061273f826126d8565b604082019050919050565b6000602082019050818103600083015261276381612727565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127a482611db4565b91506127af83611db4565b9250826127bf576127be61276a565b5b828206905092915050565b7f526166666c65506f6f6c3a206c656e677468202520332073686f756c6420626560008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b600061282660228361230f565b9150612831826127ca565b604082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f20636f72726573706f6e64207769746820706f6f6c0000000000000000000000602082015250565b60006128b860358361230f565b91506128c38261285c565b604082019050919050565b600060208201905081810360008301526128e7816128ab565b9050919050565b7f526166666c65506f6f6c3a20496e76616c6964207061796f757420737472756360008201527f7475726500000000000000000000000000000000000000000000000000000000602082015250565b600061294a60248361230f565b9150612955826128ee565b604082019050919050565b600060208201905081810360008301526129798161293d565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b60006129dc60248361230f565b91506129e782612980565b604082019050919050565b60006020820190508181036000830152612a0b816129cf565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b6000612a4860208361230f565b9150612a5382612a12565b602082019050919050565b60006020820190508181036000830152612a7781612a3b565b9050919050565b600081519050612a8d81611dbe565b92915050565b600060208284031215612aa957612aa8611daa565b5b6000612ab784828501612a7e565b91505092915050565b612ac981612228565b8114612ad457600080fd5b50565b600081519050612ae681612ac0565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b3582612aec565b810181811067ffffffffffffffff82111715612b5457612b53612afd565b5b80604052505050565b6000612b67611da0565b9050612b738282612b2c565b919050565b600067ffffffffffffffff821115612b9357612b92612afd565b5b602082029050602081019050919050565b6000612bb7612bb284612b78565b612b5d565b90508083825260208201905060208402830185811115612bda57612bd961206d565b5b835b81811015612c035780612bef8882612a7e565b845260208401935050602081019050612bdc565b5050509392505050565b600082601f830112612c2257612c21612063565b5b8151612c32848260208601612ba4565b91505092915050565b60008060408385031215612c5257612c51611daa565b5b6000612c6085828601612ad7565b925050602083015167ffffffffffffffff811115612c8157612c80611daf565b5b612c8d85828601612c0d565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b6000612ccd60208361230f565b9150612cd882612c97565b602082019050919050565b60006020820190508181036000830152612cfc81612cc0565b9050919050565b6000819050919050565b6000819050919050565b612d28612d2382612d03565b612d0d565b82525050565b6000612d3a8284612d17565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612da560268361230f565b9150612db082612d49565b604082019050919050565b60006020820190508181036000830152612dd481612d98565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612e11601c8361230f565b9150612e1c82612ddb565b602082019050919050565b60006020820190508181036000830152612e4081612e04565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b6000612e7d601d8361230f565b9150612e8882612e47565b602082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b6000612ee9601c8361230f565b9150612ef482612eb3565b602082019050919050565b60006020820190508181036000830152612f1881612edc565b9050919050565b50565b6000612f2f600083612537565b9150612f3a82612f1f565b600082019050919050565b6000612f5082612f22565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b6000612f90601b8361230f565b9150612f9b82612f5a565b602082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ffc60208361230f565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b600061306860208361230f565b915061307382613032565b602082019050919050565b600060208201905081810360008301526130978161305b565b905091905056fea2646970667358221220cb03d8d41da183ed4875181f727dfe6f60d3bdb5ecd782fa1ec1c7798cfb3e7064736f6c634300081300330000000000000000000000009829d6ac67e49e0b95af2859fff15302151518150000000000000000000000000000000000000000000000000000000000000060000000000000000000000000be1513f5fd788092a8b4ca25a0a0042be183118e000000000000000000000000000000000000000000000000000000000000000e706f6f6c312875696e7432353629000000000000000000000000000000000000

Deployed ByteCode

0x6080604052600436106101185760003560e01c80639c2d2d8e116100a0578063d605787b11610064578063d605787b14610383578063e557bb4e146103ae578063f289eaa5146103eb578063f2c9ecd81461042a578063f2fde38b146104415761011f565b80639c2d2d8e1461029e578063a980e79f146102c9578063bc23f848146102f2578063c7634a791461031b578063cc5ee365146103585761011f565b806351cff8d9116100e757806351cff8d9146101cc5780636386c1c7146101f5578063715018a6146102335780638da5cb5b1461024a5780639494582d146102755761011f565b806308d62b03146101215780630cff68271461014a57806316f0115b146101755780633b0e84de146101a15761011f565b3661011f57005b005b34801561012d57600080fd5b5061014860048036038101906101439190611dea565b61046a565b005b34801561015657600080fd5b5061015f61057c565b60405161016c9190611e26565b60405180910390f35b34801561018157600080fd5b5061018a610582565b604051610198929190611ebd565b60405180910390f35b3480156101ad57600080fd5b506101b66105c1565b6040516101c39190611fa4565b60405180910390f35b3480156101d857600080fd5b506101f360048036038101906101ee9190611ff2565b610619565b005b34801561020157600080fd5b5061021c60048036038101906102179190611ff2565b61066b565b60405161022a92919061201f565b60405180910390f35b34801561023f57600080fd5b50610248610933565b005b34801561025657600080fd5b5061025f610947565b60405161026c9190612048565b60405180910390f35b34801561028157600080fd5b5061029c600480360381019061029791906120c8565b610970565b005b3480156102aa57600080fd5b506102b36110c0565b6040516102c09190612206565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190611dea565b61113d565b005b3480156102fe57600080fd5b5061031960048036038101906103149190611dea565b6115b9565b005b34801561032757600080fd5b50610342600480360381019061033d9190611dea565b6115c5565b60405161034f9190612243565b60405180910390f35b34801561036457600080fd5b5061036d6115e5565b60405161037a9190611e26565b60405180910390f35b34801561038f57600080fd5b506103986115eb565b6040516103a591906122bd565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190611dea565b611611565b6040516103e29190611e26565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190611dea565b611635565b604051610421939291906122d8565b60405180910390f35b34801561043657600080fd5b5061043f61166f565b005b34801561044d57600080fd5b5061046860048036038101906104639190611ff2565b6116fb565b005b806000036104ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a490612392565b60405180910390fd5b6000600660016006805490506104c391906123e1565b815481106104d4576104d3612415565b5b906000526020600020906003020160010154905080826005546104f79190612444565b1115610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052f906124c4565b60405180910390fd5b60005b828110156105775761054e60055461177e565b60056000815461055d906124e4565b91905081905550808061056f906124e4565b91505061053b565b505050565b60045481565b60018060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460e01b905082565b6060600280548060200260200160405190810160405280929190818152602001828054801561060f57602002820191906000526020600020905b8154815260200190600101908083116105fb575b5050505050905090565b610621611be2565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610667573d6000803e3d6000fd5b5050565b60008060005b60028054905081101561092c57600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b846040516024016106e19190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161074b919061259d565b600060405180830381855afa9150503d8060008114610786576040519150601f19603f3d011682016040523d82523d6000602084013e61078b565b606091505b5091509150816107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c790612626565b60405180910390fd5b60006107db82611c60565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff160361091657610818611d7f565b60005b600680549050811015610913576006818154811061083c5761083b612415565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505091506002868154811061088957610888612415565b5b90600052602060002001548260000151111580156108c85750600286815481106108b6576108b5612415565b5b90600052602060002001548260200151115b1561090057600286815481106108e1576108e0612415565b5b906000526020600020015482604001519750975050505050505061092e565b808061090b906124e4565b91505061081b565b50505b5050508080610924906124e4565b915050610671565b505b915091565b61093b611be2565b6109456000611cb3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610978611be2565b6006805490506000146109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b7906126b8565b60405180910390fd5b81819050600003610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd9061274a565b60405180910390fd5b600382829050610a169190612799565b600014610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061283c565b60405180910390fd5b60008282600285859050610a6c91906123e1565b818110610a7c57610a7b612415565b5b9050602002013590506000600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b600184610ae391906123e1565b604051602401610af39190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b5d919061259d565b600060405180830381855afa9150503d8060008114610b98576040519150601f19603f3d011682016040523d82523d6000602084013e610b9d565b606091505b5050905080610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd8906128ce565b60405180910390fd5b600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b83604051602401610c419190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610cab919061259d565b600060405180830381855afa9150503d8060008114610ce6576040519150601f19603f3d011682016040523d82523d6000602084013e610ceb565b606091505b5050809150508015610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d29906128ce565b60405180910390fd5b83836000818110610d4657610d45612415565b5b90506020020135600014610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690612960565b60405180910390fd5b83836001818110610da357610da2612415565b5b9050602002013584846000818110610dbe57610dbd612415565b5b9050602002013510610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90612960565b60405180910390fd5b6006604051806060016040528086866000818110610e2657610e25612415565b5b90506020020135815260200186866001818110610e4657610e45612415565b5b90506020020135815260200186866002818110610e6657610e65612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506000600390505b848490508110156110b95760066001600680549050610edf91906123e1565b81548110610ef057610eef612415565b5b906000526020600020906003020160010154858583818110610f1557610f14612415565b5b9050602002013514610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612960565b60405180910390fd5b8484600183610f6b9190612444565b818110610f7b57610f7a612415565b5b90506020020135858583818110610f9557610f94612415565b5b9050602002013510610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390612960565b60405180910390fd5b60066040518060600160405280878785818110610ffc57610ffb612415565b5b90506020020135815260200187876001866110179190612444565b81811061102757611026612415565b5b90506020020135815260200187876002866110429190612444565b81811061105257611051612415565b5b90506020020135815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506003816110b29190612444565b9050610ec0565b5050505050565b60606006805480602002602001604051908101604052809291908181526020016000905b8282101561113457838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906110e4565b50505050905090565b611145611be2565b60068054905060000361118d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611184906129f2565b60405180910390fd5b6000600660016006805490506111a391906123e1565b815481106111b4576111b3612415565b5b9060005260206000209060030201600101549050600454810361120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390612a5e565b60405180910390fd5b8160000361124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690612392565b60405180910390fd5b806001836004546112609190612444565b61126a91906123e1565b106112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906124c4565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc2a88c36040518163ffffffff1660e01b81526004016020604051808303816000875af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612a93565b9050600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d8a4676f846040518263ffffffff1660e01b815260040161139f9190611e26565b600060405180830381865afa1580156113bc573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e59190612c3b565b9150915081611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090612ce3565b60405180910390fd5b60008160008151811061143f5761143e612415565b5b602002602001015160001b90506000600454905086600460008282546114659190612444565b9250508190555060006002905060008290505b6004548110156115ae57818280549050908060018154018082558091505060019003906000526020600020016000909190919091505560006001826114bd9190612444565b8560001c6114cb9190612799565b905060008382815481106114e2576114e1612415565b5b90600052602060002001549050836001858054905061150191906123e1565b8154811061151257611511612415565b5b90600052602060002001548483815481106115305761152f612415565b5b906000526020600020018190555080846001868054905061155191906123e1565b8154811061156257611561612415565b5b9060005260206000200181905550856040516020016115819190612d2e565b604051602081830303815290604052805190602001209550505080806115a6906124e4565b915050611478565b505050505050505050565b6115c28161177e565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60055481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002818154811061162157600080fd5b906000526020600020016000915090505481565b6006818154811061164557600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b611677611be2565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e0c862896040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b50505050565b611703611be2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990612dbb565b60405180910390fd5b61177b81611cb3565b50565b60006006600160068054905061179491906123e1565b815481106117a5576117a4612415565b5b906000526020600020906003020160010154905060045481146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f490612e27565b60405180910390fd5b6005548111611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890612e93565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900460ff161561186d5750611bdf565b600080600160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600160000160149054906101000a900460e01b856040516024016118d09190611e26565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161193a919061259d565b6000604051808303816000865af19150503d8060008114611977576040519150601f19603f3d011682016040523d82523d6000602084013e61197c565b606091505b5091509150816119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890612eff565b60405180910390fd5b60006119cc82611c60565b90506119d6611d7f565b60005b600680549050811015611bd857600681815481106119fa576119f9612415565b5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050915060028781548110611a4757611a46612415565b5b9060005260206000200154826000015111158015611a865750816020015160028881548110611a7957611a78612415565b5b9060005260206000200154105b15611bc55760016003600089815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168260400151604051611adf90612f45565b60006040518083038185875af1925050503d8060008114611b1c576040519150601f19603f3d011682016040523d82523d6000602084013e611b21565b606091505b50508095505084611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90612fa6565b60405180910390fd5b868373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8460400151604051611bb29190611e26565b60405180910390a3505050505050611bdf565b8080611bd0906124e4565b9150506119d9565b5050505050505b50565b611bea611d77565b73ffffffffffffffffffffffffffffffffffffffff16611c08610947565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590613012565b60405180910390fd5b565b6000601482511015611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e9061307e565b60405180910390fd5b60208201519050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611dc781611db4565b8114611dd257600080fd5b50565b600081359050611de481611dbe565b92915050565b600060208284031215611e0057611dff611daa565b5b6000611e0e84828501611dd5565b91505092915050565b611e2081611db4565b82525050565b6000602082019050611e3b6000830184611e17565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e6c82611e41565b9050919050565b611e7c81611e61565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611eb781611e82565b82525050565b6000604082019050611ed26000830185611e73565b611edf6020830184611eae565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611f1b81611db4565b82525050565b6000611f2d8383611f12565b60208301905092915050565b6000602082019050919050565b6000611f5182611ee6565b611f5b8185611ef1565b9350611f6683611f02565b8060005b83811015611f97578151611f7e8882611f21565b9750611f8983611f39565b925050600181019050611f6a565b5085935050505092915050565b60006020820190508181036000830152611fbe8184611f46565b905092915050565b611fcf81611e61565b8114611fda57600080fd5b50565b600081359050611fec81611fc6565b92915050565b60006020828403121561200857612007611daa565b5b600061201684828501611fdd565b91505092915050565b60006040820190506120346000830185611e17565b6120416020830184611e17565b9392505050565b600060208201905061205d6000830184611e73565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261208857612087612063565b5b8235905067ffffffffffffffff8111156120a5576120a4612068565b5b6020830191508360208202830111156120c1576120c061206d565b5b9250929050565b600080602083850312156120df576120de611daa565b5b600083013567ffffffffffffffff8111156120fd576120fc611daf565b5b61210985828601612072565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6060820160008201516121576000850182611f12565b50602082015161216a6020850182611f12565b50604082015161217d6040850182611f12565b50505050565b600061218f8383612141565b60608301905092915050565b6000602082019050919050565b60006121b382612115565b6121bd8185612120565b93506121c883612131565b8060005b838110156121f95781516121e08882612183565b97506121eb8361219b565b9250506001810190506121cc565b5085935050505092915050565b6000602082019050818103600083015261222081846121a8565b905092915050565b60008115159050919050565b61223d81612228565b82525050565b60006020820190506122586000830184612234565b92915050565b6000819050919050565b600061228361227e61227984611e41565b61225e565b611e41565b9050919050565b600061229582612268565b9050919050565b60006122a78261228a565b9050919050565b6122b78161229c565b82525050565b60006020820190506122d260008301846122ae565b92915050565b60006060820190506122ed6000830186611e17565b6122fa6020830185611e17565b6123076040830184611e17565b949350505050565b600082825260208201905092915050565b7f526166666c65506f6f6c3a20436f756e74206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061237c60288361230f565b915061238782612320565b604082019050919050565b600060208201905081810360008301526123ab8161236f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006123ec82611db4565b91506123f783611db4565b925082820390508181111561240f5761240e6123b2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061244f82611db4565b915061245a83611db4565b9250828201905080821115612472576124716123b2565b5b92915050565b7f526166666c65506f6f6c3a204f7574206f6620696e6465780000000000000000600082015250565b60006124ae60188361230f565b91506124b982612478565b602082019050919050565b600060208201905081810360008301526124dd816124a1565b9050919050565b60006124ef82611db4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612521576125206123b2565b5b600182019050919050565b600081519050919050565b600081905092915050565b60005b83811015612560578082015181840152602081019050612545565b60008484015250505050565b60006125778261252c565b6125818185612537565b9350612591818560208601612542565b80840191505092915050565b60006125a9828461256c565b915081905092915050565b7f526166666c65506f6f6c3a2063616e6e6f74206765742075736572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061261060238361230f565b915061261b826125b4565b604082019050919050565b6000602082019050818103600083015261263f81612603565b9050919050565b7f526166666c65506f6f6c3a205061796f75742073747275637475726520616c7260008201527f6561647920736574000000000000000000000000000000000000000000000000602082015250565b60006126a260288361230f565b91506126ad82612646565b604082019050919050565b600060208201905081810360008301526126d181612695565b9050919050565b7f526166666c65506f6f6c3a204c656e677468206f66207061796f75742073747260008201527f7563747572652063616e6e6f7420626520300000000000000000000000000000602082015250565b600061273460328361230f565b915061273f826126d8565b604082019050919050565b6000602082019050818103600083015261276381612727565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127a482611db4565b91506127af83611db4565b9250826127bf576127be61276a565b5b828206905092915050565b7f526166666c65506f6f6c3a206c656e677468202520332073686f756c6420626560008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b600061282660228361230f565b9150612831826127ca565b604082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f20636f72726573706f6e64207769746820706f6f6c0000000000000000000000602082015250565b60006128b860358361230f565b91506128c38261285c565b604082019050919050565b600060208201905081810360008301526128e7816128ab565b9050919050565b7f526166666c65506f6f6c3a20496e76616c6964207061796f757420737472756360008201527f7475726500000000000000000000000000000000000000000000000000000000602082015250565b600061294a60248361230f565b9150612955826128ee565b604082019050919050565b600060208201905081810360008301526129798161293d565b9050919050565b7f526166666c65506f6f6c3a205061796f757420737472756374757265206e6f7460008201527f2073657400000000000000000000000000000000000000000000000000000000602082015250565b60006129dc60248361230f565b91506129e782612980565b604082019050919050565b60006020820190508181036000830152612a0b816129cf565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c726561647920726166666c6564600082015250565b6000612a4860208361230f565b9150612a5382612a12565b602082019050919050565b60006020820190508181036000830152612a7781612a3b565b9050919050565b600081519050612a8d81611dbe565b92915050565b600060208284031215612aa957612aa8611daa565b5b6000612ab784828501612a7e565b91505092915050565b612ac981612228565b8114612ad457600080fd5b50565b600081519050612ae681612ac0565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b3582612aec565b810181811067ffffffffffffffff82111715612b5457612b53612afd565b5b80604052505050565b6000612b67611da0565b9050612b738282612b2c565b919050565b600067ffffffffffffffff821115612b9357612b92612afd565b5b602082029050602081019050919050565b6000612bb7612bb284612b78565b612b5d565b90508083825260208201905060208402830185811115612bda57612bd961206d565b5b835b81811015612c035780612bef8882612a7e565b845260208401935050602081019050612bdc565b5050509392505050565b600082601f830112612c2257612c21612063565b5b8151612c32848260208601612ba4565b91505092915050565b60008060408385031215612c5257612c51611daa565b5b6000612c6085828601612ad7565b925050602083015167ffffffffffffffff811115612c8157612c80611daf565b5b612c8d85828601612c0d565b9150509250929050565b7f526166666c65506f6f6c3a207761697420666f722066756c66696c6c6d656e74600082015250565b6000612ccd60208361230f565b9150612cd882612c97565b602082019050919050565b60006020820190508181036000830152612cfc81612cc0565b9050919050565b6000819050919050565b6000819050919050565b612d28612d2382612d03565b612d0d565b82525050565b6000612d3a8284612d17565b60208201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612da560268361230f565b9150612db082612d49565b604082019050919050565b60006020820190508181036000830152612dd481612d98565b9050919050565b7f526166666c65506f6f6c3a20526166666c65206e6f7420656e64656400000000600082015250565b6000612e11601c8361230f565b9150612e1c82612ddb565b602082019050919050565b60006020820190508181036000830152612e4081612e04565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c20616c72656164792070616964000000600082015250565b6000612e7d601d8361230f565b9150612e8882612e47565b602082019050919050565b60006020820190508181036000830152612eac81612e70565b9050919050565b7f526166666c65506f6f6c3a20506f6f6c2063616c6c206661696c656400000000600082015250565b6000612ee9601c8361230f565b9150612ef482612eb3565b602082019050919050565b60006020820190508181036000830152612f1881612edc565b9050919050565b50565b6000612f2f600083612537565b9150612f3a82612f1f565b600082019050919050565b6000612f5082612f22565b9150819050919050565b7f526166666c65506f6f6c3a207472616e73666572206661696c65640000000000600082015250565b6000612f90601b8361230f565b9150612f9b82612f5a565b602082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ffc60208361230f565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b7f526166666c65506f6f6c3a20496e76616c696420616464726573732064617461600082015250565b600061306860208361230f565b915061307382613032565b602082019050919050565b600060208201905081810360008301526130978161305b565b905091905056fea2646970667358221220cb03d8d41da183ed4875181f727dfe6f60d3bdb5ecd782fa1ec1c7798cfb3e7064736f6c63430008130033