ETH Price: $2,489.48 (+0.37%)

Contract

0x9138B376D1BC9731d1508dC41fE7154a98BFaec6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RacingArena

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-05-16
*/

pragma solidity ^0.5.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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

contract PauserRole is Context {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(_msgSender());
    }

    modifier onlyPauser() {
        require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role");
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(_msgSender());
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
contract Pausable is Context, PauserRole {
    /**
     * @dev Emitted when the pause is triggered by a pauser (`account`).
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by a pauser (`account`).
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state. Assigns the Pauser role
     * to the deployer.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    /**
     * @dev Called by a pauser to pause, triggers stopped state.
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Called by a pauser to unpause, returns to normal state.
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
contract ReentrancyGuard {
    // counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

contract RacingAdmins is Context {
    using Roles for Roles.Role;

    event AdminAdded(address indexed account);
    event AdminRemoved(address indexed account);

    Roles.Role private _admins;

    constructor () internal {
        _addAdmin(_msgSender());
    }

    modifier onlyAdmin() {
        require(isAdmin(_msgSender()), "AdminRole: caller does not have the Admin role");
        _;
    }

    function isAdmin(address account) public view returns (bool) {
        return _admins.has(account);
    }

    function addAdmin(address account) public onlyAdmin {
        _addAdmin(account);
    }

    function renounceAdmin(address account) public onlyAdmin {
        _removeAdmin(account);
    }

    function _addAdmin(address account) internal {
        _admins.add(account);
        emit AdminAdded(account);
    }

    function _removeAdmin(address account) internal {
        _admins.remove(account);
        emit AdminRemoved(account);
    }
}

contract RacingFeeReceiver is RacingAdmins {
    address payable private _feeWallet;

    event FeeWalletTransferred(address indexed previousFeeWallet, address indexed newFeeWallet);

    /**
     * @dev Returns the address of the current fee receiver.
     */
    function feeWallet() public view returns (address payable) {
        return _feeWallet;
    }

    /**
     * @dev Throws if called by any account other than the fee receiver wallet.
     */
    modifier onlyFeeWallet() {
        require(isFeeWallet(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current fee receiver wallet.
     */
    function isFeeWallet() public view returns (bool) {
        return _msgSender() == _feeWallet;
    }

    /**
     * @dev Leaves the contract without fee receiver wallet.
     *
     * NOTE: Renouncing will leave the contract without an fee receiver wallet.
     * It means that fee will be transferred to the zero address.
     */
    function renounceFeeWallet() public onlyAdmin {
        emit FeeWalletTransferred(_feeWallet, address(0));
        _feeWallet = address(0);
    }

    /**
     * @dev Transfers address of the fee receiver to a new address (`newFeeWallet`).
     * Can only be called by admins.
     */
    function transferFeeWalletOwnership(address payable newFeeWallet) public onlyAdmin {
        _transferFeeWalletOwnership(newFeeWallet);
    }

    /**
     * @dev Transfers address of the fee receiver to a new address (`newFeeWallet`).
     */
    function _transferFeeWalletOwnership(address payable newFeeWallet) internal {
        require(newFeeWallet != address(0), "Ownable: new owner is the zero address");
        emit FeeWalletTransferred(_feeWallet, newFeeWallet);
        _feeWallet = newFeeWallet;
    }
}

contract RacingStorage is RacingFeeReceiver, ReentrancyGuard {
    // --
    // Permanent Storage Variables
    // --

    mapping(bytes32 => Race) public Races; // The race mapping structure.
    mapping(uint256 => address) public Owner_Horse; // Owner of the Horse ID.
    mapping(uint256 => uint256) public Horse_Active_Races; // Number of races the horse is registered for.
    mapping(bytes32 => bool) public ID_Saved; // Returns whether or not the race ID is present on storage already.
    mapping(uint256 => uint256) public Position_To_Payment; // Returns the percentage of the payment depending on horse's position in a race.
    mapping(address => bool) public Is_Authorized; // Returns whether an address is authorized or not.
    mapping(bytes32 => string) public Cancelled_Races; // Returns a cancelled race and its reason to be cancelled.
    mapping(bytes32 => bool) public Has_Zed_Claimed; // Returns whether or not winnings for a race have been claimed for Zed.

    address BB; // Blockchain Brain
    address Core; // Core contract.

    struct Race {
        string Track_Name; // Name of the track or event.
        bytes32 Race_ID; // Key provided for Race ID.
        uint256 Length; // Length of the track (m).
        uint256 Horses_Registered; // Current number of horses registered.
        uint256 Unix_Start; // Timestamp the race starts.
        uint256 Entrance_Fee; // Entrance fee for a particular race (10^18).
        uint256 Prize_Pool; // Total bets in the prize pool (10^18).
        uint256 Horses_Allowed; // Total number of horses allowed for a race.
        uint256[] Horses; // List of Horse IDs on Race.
        State Race_State; // Current state of the race.
        mapping(uint256 => Horse) Lineup; // Mapping of the Horse ID => Horse struct.
        mapping(uint256 => uint256) Gate_To_ID; // Mapping of the Gate # => Horse ID.
        mapping(uint256 => bool) Is_Gate_Taken; // Whether or not a gate number has been taken.
    }

    struct Horse {
        uint256 Gate; // Gate this horse is currently at.
        uint256 Total_Bet; // Total amount bet on this horse.
        uint256 Final_Position; // Final position of the horse (1 to Horses allowed in race).
        mapping(address => uint256) Bet_Placed; // Amount a specific address bet on this horse.
        mapping(address => bool) Bet_Claimed; // Whether or not that specific address claimed their bet.
    }

    enum State {Null, Registration, Betting, Final, Fail_Safe}
}

contract RacingArena is RacingStorage, Pausable {
    using SafeMath for uint256;

    // --
    // Events
    // --

    event BetPlaced(
        bytes32 indexed _raceId,
        address indexed _bettor,
        uint256 _betAmount,
        uint256 indexed _horseID
    );

    event PrizeClaimed(
        bytes32 indexed _raceId,
        address indexed _bettor,
        uint256 _claimAmount,
        uint256 indexed _horseID
    );

    event HorseRegistered(
        bytes32 indexed _raceId,
        address indexed _horseOwner,
        uint256 indexed _horseID,
        uint256 _gateNumber
    );

    event HorseTransferredIn(address indexed _horseOwner, uint256[] _horseIDs);

    event HorseTransferredOut(address indexed _horseOwner, uint256[] _horseIDs);

    event RaceCreated(
        bytes32 indexed _raceId,
        string _name,
        uint256 _length,
        uint256 _registrationFee
    );

    event RaceScheduled(
        bytes32 indexed _raceId,
        uint256 _unixStart,
        string _name
    );

    event RaceFull(bytes32 indexed _raceId);

    event ResultsPosted(
        bytes32 indexed _raceId,
        uint256 _firstPlaceHorseID,
        uint256 _secondPlaceHorseID,
        uint256 _thirdPlaceHorseID
    );

    event RaceCancelled(
        bytes32 indexed _raceId,
        string _reason,
        address _canceller
    );

    // --
    // Admin Functions
    // --

    // Admin creates upcoming races, specifying the track name, the track length, and the entrance fee.
    function createRace(
        bytes32 _raceId,
        string memory _name,
        uint256 _horsesAllowed,
        uint256 _entranceFee,
        uint256 _length
    ) public onlyAdmin() nonReentrant() whenNotPaused() {
        // Pre-check and struct inialization.
        require(_entranceFee > 0, "Entrance fee lower than zero");
        require(!ID_Saved[_raceId], "Race ID exists");

        Race memory race;
        race.Race_ID = _raceId;
        race.Track_Name = _name;
        race.Horses_Allowed = _horsesAllowed;
        race.Entrance_Fee = _entranceFee;
        race.Length = _length;
        race.Race_State = State.Registration;

        Races[_raceId] = race;
        ID_Saved[_raceId] = true;

        // Event trigger.
        emit RaceCreated(_raceId, _name, _length, _entranceFee);
    }

    // Admin can schedule a race when it's full (12 horses).
    function scheduleRace(bytes32 _raceId, uint256 _startTime)
        public
        onlyAdmin()
        nonReentrant()
    {
        // Prechecks.
        Race storage race = Races[_raceId];

        require(
            race.Horses_Registered == race.Horses_Allowed,
            "Not enough horses registered"
        );
        require(
            race.Race_State == State.Registration,
            "Race is not in registration state"
        );
        require(
            _startTime > now + 5 minutes,
            "Start time doesnt meet criteria"
        );

        // State changes.
        race.Unix_Start = _startTime;
        race.Race_State = State.Betting; // State transition from Registration -> Betting.

        emit RaceScheduled(_raceId, _startTime, race.Track_Name);
    }

    function initSetup(address _core, address _bb)
        public
        onlyAdmin()
    {
        Position_To_Payment[1] = 60;
        Position_To_Payment[2] = 20;
        Position_To_Payment[3] = 10;

        BB = _bb;
        Core = _core;
    }

    function setBbAddress(address _bb)
        public
        onlyAdmin()
    {
        BB = _bb;
    }

    // Admin posts the result of the race, enabling bettors to claim their winnings.
    /*
    @dev Receives results for a given race, removes 1 active race from the given horses.
    Transitions race state and sends funds to one of the owner addresses as well.
    @param _raceId Race ID we're going to post the results to.
    @param _results List of of horse IDs that participated on the race in position order.
    */
    function postResults(bytes32 _raceId, uint256[12] memory _results)
        public
        onlyAdmin()
        nonReentrant()
    {
        Race storage race = Races[_raceId];

        // Pre-checks
        require(
            race.Race_State == State.Betting,
            "Race is not on betting state"
        );
        require(race.Unix_Start <= now + 1 minutes, "Mismatch on unix start");

        race.Race_State = State.Final; // State transition from Betting -> Final.

        for (uint256 k = 0; k < race.Horses_Allowed; k++) {
            require(race.Lineup[_results[k]].Gate != 0, "ID not registered");
        }

        // Update the Race struct. Active race reduced.
        for (uint256 j = 0; j < race.Horses_Allowed; j++) {
            race.Lineup[_results[j]].Final_Position = j + 1;
            Horse_Active_Races[_results[j]]--;
        }

        // Duplication post-check.
        for (uint256 i = 0; i < race.Horses_Allowed; i++) {
            require(
                race.Lineup[_results[i]].Final_Position == i + 1,
                "ID not submitted properly"
            );
        }

        // Sends funds to one of Zed's accounts.
        feeWallet().transfer(race.Prize_Pool.mul(10).div(100));

        emit ResultsPosted(_raceId, _results[0], _results[1], _results[2]);
    }

    function cancelRace(bytes32 _raceId, string memory _reason)
        public
        onlyAdmin()
        nonReentrant()
    {
        Race storage race = Races[_raceId];

        // Pre-checks.
        require(
            race.Race_State == State.Registration ||
                race.Race_State == State.Betting,
            "Race not on regs or betting state"
        );

        race.Race_State = State.Fail_Safe;

        Cancelled_Races[_raceId] = _reason;

        // Loops through the IDs on a race by index and removes them out of an active race.
        for (uint256 i = 0; i < race.Horses_Registered; i++) {
            Horse_Active_Races[race.Horses[i]]--;
        }

        emit RaceCancelled(_raceId, _reason, msg.sender);
    }

    // --
    // Public Functions
    // --

    // Bulk transfers horses into race contract.
    // Limit of 15.
    function bulkTransferIn(uint256[] memory _horseIDs) public nonReentrant() {
        require(_horseIDs.length < 16, "Only 15 horses allowed per transfer");

        for (uint8 i = 0; i < _horseIDs.length; i++) {
            Owner_Horse[_horseIDs[i]] = msg.sender;
            ERC721(Core).safeTransferFrom(
                msg.sender,
                address(this),
                _horseIDs[i]
            );
        }

        emit HorseTransferredIn(msg.sender, _horseIDs);
    }

    // Bulk transfers horses out of race contract.
    // Limit of 15.
    function bulkTransferOut(uint256[] memory _horseIDs) public nonReentrant() {
        require(_horseIDs.length < 16, "Only 15 horses allowed per transfer");

        for (uint8 i = 0; i < _horseIDs.length; i++) {
            require(
                Owner_Horse[_horseIDs[i]] == msg.sender,
                "Caller is not the owner."
            );
            require(
                Horse_Active_Races[_horseIDs[i]] == 0,
                "Horse currently active in a race."
            );

            Owner_Horse[_horseIDs[i]] = address(0);

            ERC721(Core).safeTransferFrom(
                address(this),
                msg.sender,
                _horseIDs[i]
            );
        }

        emit HorseTransferredOut(msg.sender, _horseIDs);
    }

    // Registers a horse for the selected race. Enacts transfer of the entrance fee, and transfer of the ERC-721 horse.
    function registerHorse(
        bytes32 _raceId,
        uint256 _horseID,
        uint256 _gateNumber
    ) public payable nonReentrant() whenNotPaused() {
        Race storage race = Races[_raceId];

        // Pre-checks.
        require(msg.value >= race.Entrance_Fee, "Entrance fee not met");
        require(
            race.Race_State == State.Registration,
            "Race not accepting registrations"
        );
        require(
            race.Horses_Registered < race.Horses_Allowed,
            "Max number of horses for race"
        );
        require(_gateNumber >= 1, "Gate number lower than 1.");
        require(
            _gateNumber <= race.Horses_Allowed,
            "Gate number greater than max"
        );
        require(!race.Is_Gate_Taken[_gateNumber], "Gate number already taken");
        require(
            Horse_Active_Races[_horseID] < 3,
            "Horse currently active in 3 races"
        );
        require(
            race.Lineup[_horseID].Gate == 0,
            "Horse already registered for this race"
        );
        require(
            ERC721(Core).ownerOf(_horseID) == address(this),
            "Racing contract not owner of horse."
        );

        // Insert a new Horse struct with the appropriate information.
        Horse_Active_Races[_horseID]++;
        race.Horses_Registered++;
        race.Lineup[_horseID] = Horse(_gateNumber, 0, 0);
        race.Gate_To_ID[_gateNumber] = _horseID;

        // Mark gate number as taken.
        race.Is_Gate_Taken[_gateNumber] = true;

        // Handle accounting of the registration fee as a bet on their horse.
        race.Prize_Pool += race.Entrance_Fee;
        race.Lineup[_horseID].Total_Bet += race.Entrance_Fee;
        race.Lineup[_horseID].Bet_Placed[msg.sender] += race.Entrance_Fee;
        race.Horses.push(_horseID);

        if (race.Horses_Registered == race.Horses_Allowed) {
            emit RaceFull(_raceId);
        }

        emit HorseRegistered(_raceId, msg.sender, _horseID, _gateNumber);
        emit BetPlaced(_raceId, msg.sender, race.Entrance_Fee, _horseID);
    }

    // function placeBet(bytes32 _raceId, uint _horseID, uint _amount) public nonReentrant() {
    //     Race storage race = Races[_raceId];

    //     // Pre-checks.
    //     require(race.Race_State == State.Betting, "Bets are not allowed");
    //     require(race.Unix_Start > now - 5 minutes, "The betting period has ended.");
    //     require(race.Lineup[_horseID].Gate != 0, "Horse not registered for this race.");
    //     require(_amount % 1 ether == 0, "Bet should have no remainder");

    //     // Transfer bet and update Race struct.
    //     require(ERC20(DAI).transferFrom(msg.sender, address(this), _amount), "Caller lacks funds, or contract lacks approval for the bet.");

    //     race.Prize_Pool += _amount;
    //     race.Lineup[_horseID].Total_Bet += _amount;
    //     race.Lineup[_horseID].Bet_Placed[msg.sender] += _amount;

    //     emit BetPlaced(_raceId, msg.sender, _amount, _horseID);
    // }

    /**
     * @dev Method validates, calculates and transfer funds to winner address,
     * regarding to provided _raceId and _horseID results.
     */
    function claimWinningsHelper(bytes32 _raceId, uint256 _horseID)
        external
        nonReentrant()
    {
        _claimRaceWinnings(_raceId, _horseID, _msgSender());
    }


    /**
     * @dev The same meaning as `claimWinningsHelper()` method,
     * but its intended for many races and horses of winner with one transaction.
     * It use 'for-loop' method, and to be protected from 'Out of Gas' issue the sender should limit the length of provided arrays.
     */
    function claimAllWinningsHelper(bytes32[] calldata _raceIds, uint256[] calldata _horseIDs)
        external
        nonReentrant()
    {
        require(_raceIds.length > 0, "claimAllWinningsHelper: raceId array should not be empty.");
        require(_raceIds.length < 125, "claimAllWinningsHelper: raceId array length is bigger than provided limit.");
        require(_raceIds.length == _horseIDs.length, "claimAllWinningsHelper: lengths of raceids and horseids arrays should be equal.");

        for (uint256 i = 0; i < _raceIds.length; i++) {
            _claimRaceWinnings(_raceIds[i], _horseIDs[i], _msgSender());
        }
    }


    // --
    // Private Functions
    // --

    function _claimRaceWinnings(bytes32 _raceId, uint256 _horseID, address payable _winner)
        private
    {
        Race storage race = Races[_raceId];
        address horseOwner = Owner_Horse[_horseID];

        // Pre-checks.
        // For now only the owner is able to claim the winnings for a horse.
        require(_winner == horseOwner, "Not horse owner");
        require(race.Race_State == State.Final, "Race still running");
        require(
            !race.Lineup[_horseID].Bet_Claimed[horseOwner],
            "Winnings have already been claimed"
        );

        race.Lineup[_horseID].Bet_Claimed[horseOwner] = true;

        uint256 horsePosition = race.Lineup[_horseID].Final_Position;

        // Limit is race's prize pool.
        uint256 toTransfer = race
            .Prize_Pool
            .mul(Position_To_Payment[horsePosition])
            .div(100);

        _winner.transfer(toTransfer);

        emit PrizeClaimed(_raceId, horseOwner, toTransfer, _horseID);
    }

    // function reclaimBetHelper(bytes32 _raceId, uint _horseID, address payable _bettor) public nonReentrant() {
    //     Race storage race = Races[_raceId];

    //     // Pre-checks.
    //     require(race.Race_State == State.Fail_Safe, "Contract not in fail safe mode");
    //     require(!race.Lineup[_horseID].Bet_Claimed[_bettor], "Bet already reclaimed");
    //     race.Lineup[_horseID].Bet_Claimed[_bettor] = true;

    //     // Reclaim bet.
    //     uint bet = race.Lineup[_horseID].Bet_Placed[_bettor];

    //     _bettor.transfer(bet);

    //     // ? Add an event.
    // }

    function onERC721Received(address, address, uint256, bytes calldata)
        external
        pure
        returns (bytes4)
    {
        return
            bytes4(
                keccak256("onERC721Received(address,address,uint256,bytes)")
            );
    }

    // Small helper function for retreieving the Horse ID based off Gate # (1 - 12, no 0 element).
    function getHorseID(bytes32 _raceId, uint256 _gate)
        public
        view
        returns (uint256)
    {
        return Races[_raceId].Gate_To_ID[_gate];
    }

    // Small helper function for retreieving more detailed information about a horse (for Retrieval purposes) based off Gate # (1 - 12, no 0 element).
    function getHorseInfo(bytes32 _raceId, uint256 _gate)
        public
        view
        returns (uint256, uint256)
    {
        Race storage race = Races[_raceId];

        return (
            race.Gate_To_ID[_gate],
            race.Lineup[race.Gate_To_ID[_gate]].Final_Position
        );
    }

    // Small helper function for personal bet information based off Gate # (1 - 12, no 0 element).
    function getBetInfo(bytes32 _raceId, uint256 _gate, address _bettor)
        public
        view
        returns (uint256, uint256, uint256, bool, uint256)
    {
        Race storage race = Races[_raceId];

        return (
            race.Prize_Pool,
            race.Lineup[race.Gate_To_ID[_gate]].Total_Bet,
            race.Lineup[race.Gate_To_ID[_gate]].Bet_Placed[_bettor],
            race.Lineup[race.Gate_To_ID[_gate]].Bet_Claimed[_bettor],
            race.Lineup[race.Gate_To_ID[_gate]].Final_Position
        );
    }

    function getHorsesInRace(bytes32 _raceId)
        public
        view
        returns (uint256[] memory)
    {
        Race storage race = Races[_raceId];

        return race.Horses;
    }

    function getCoreAddress()
        public
        view
        returns (address)
    {
        return Core;
    }

    function getBBAddress()
        public
        view
        returns (address)
    {
        return BB;
    }

    /*  RESTRICTED  */
    function changePaymentAllocation(uint256 _position, uint256 _percentage)
        public
        onlyAdmin()
    {
        Position_To_Payment[_position] = _percentage;
    }

    function() external payable {}
}

interface ERC721 {
    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 indexed _tokenId
    );
    event Approval(
        address indexed _owner,
        address indexed _approved,
        uint256 indexed _tokenId
    );
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId)
        external
        payable;
    function transferFrom(address _from, address _to, uint256 _tokenId)
        external
        payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function getApproved(uint256 _tokenId) external view returns (address);
    function setApprovalForAll(address _to, bool _approved) external;
}

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

/**
 * @title Proxy
 * @dev Implements delegation of calls to other contracts, with proper
 * forwarding of return values and bubbling of failures.
 * It defines a fallback function that delegates all calls to the address
 * returned by the abstract _implementation() internal function.
 */
contract Proxy is RacingStorage {
	/**
	 * @dev Fallback function.
	 * Implemented entirely in `_fallback`.
	 */
	function () payable external {
		_fallback();
	}

	/**
	 * @dev fallback implementation.
	 * Extracted to enable manual triggering.
	 */
	function _fallback() internal {
		_willFallback();
		_delegate(_implementation());
	}

	/**
	 * @dev Function that is run as the first thing in the fallback function.
	 * Can be redefined in derived contracts to add functionality.
	 * Redefinitions must call super._willFallback().
	 */
	function _willFallback() internal {}

	/**
	 * @dev Delegates execution to an implementation contract.
	 * This is a low level function that doesn't return to its internal call site.
	 * It will return to the external caller whatever the implementation returns.
	 * @param implementation Address to delegate.
	 */
	function _delegate(address implementation) internal {
		assembly {
			// Copy msg.data. We take full control of memory in this inline assembly
			// block because it will not return to Solidity code. We overwrite the
			// Solidity scratch pad at memory position 0.
			calldatacopy(0, 0, calldatasize)

			// Call the implementation.
			// out and outsize are 0 because we don't know the size yet.
			let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0)

			// Copy the returned data.
			returndatacopy(0, 0, returndatasize)

			switch result
			// delegatecall returns 0 on error.
			case 0 { revert(0, returndatasize) }
			default { return(0, returndatasize) }
		}
  	}

	/**
	 * @return The Address of the implementation.
	 */
	function _implementation() internal view returns (address);
}

/**
 * @title BaseUpgradeabilityProxy
 * @dev This contract implements a proxy that allows to change the
 * implementation address to which it will delegate.
 * Such a change is called an implementation upgrade.
 */
contract BaseUpgradeabilityProxy is Proxy {
	using Address for address;

	/**
	 * @dev The version of current(active) logic contract
	 */
    string internal _version;

	/**
	 * @dev Storage slot with the address of the current implementation.
	 * This is the keccak-256 hash of "org.zeppelinos.proxy.implementation", and is
	 * validated in the constructor.
	 */
	bytes32 internal constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3;

	/**
	 * @dev Emitted when the implementation is upgraded.
	 * @param implementation Address of the new implementation.
	 */
	event Upgraded(address indexed implementation);

	/**
	 * @dev Returns the current implementation.
	 * @return Address of the current implementation
	 */
	function _implementation() internal view returns (address impl) {
		bytes32 slot = IMPLEMENTATION_SLOT;
		assembly {
		    impl := sload(slot)
		}
	}

	/**
	 * @dev Upgrades the proxy to a new implementation.
	 * @param newImplementation Address of the new implementation.
	 * @param newVersion of proxied contract.
	 */
	function _upgradeProxyTo(address newImplementation, string memory newVersion) internal {
		_setProxyImplementation(newImplementation, newVersion);

		emit Upgraded(newImplementation);
	}

	/**
	 * @dev Sets the implementation address of the proxy.
	 * @param newImplementation Address of the new implementation.
	 * @param newVersion of proxied contract.
	 */
	function _setProxyImplementation(address newImplementation, string memory newVersion) internal {
		require(newImplementation.isContract(), "Cannot set a proxy implementation to a non-contract address");

 		_version = newVersion;

		bytes32 slot = IMPLEMENTATION_SLOT;

		assembly {
		    sstore(slot, newImplementation)
		}
	}
}

/**
 * @title UpgradeabilityProxy
 * @dev Extends BaseUpgradeabilityProxy with a constructor for initializing
 * implementation and init data.
 */
contract UpgradeabilityProxy is BaseUpgradeabilityProxy {
	/**
	 * @dev Contract constructor.
	 * @param _logic Address of the initial implementation.
	 */
	constructor(address _logic) public payable {
		assert(IMPLEMENTATION_SLOT == keccak256("org.zeppelinos.proxy.implementation"));
		_setProxyImplementation(_logic, "1.0.0");
	}
}

/**
 * @title BaseAdminUpgradeabilityProxy
 * @dev This contract combines an upgradeability proxy with an authorization
 * mechanism for administrative tasks.
 * All external functions in this contract must be guarded by the
 * `ifProxyAdmin` modifier. See ethereum/solidity#3864 for a Solidity
 * feature proposal that would enable this to be done automatically.
 */
contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy {
	/**
	 * @dev Emitted when the administration has been transferred.
	 * @param previousAdmin Address of the previous admin.
	 * @param newProxyAdmin Address of the new admin.
	 */
	event ProxyAdminChanged(address previousAdmin, address newProxyAdmin);

	/**
	 * @dev Storage slot with the admin of the contract.
	 * This is the keccak-256 hash of "org.zeppelinos.proxy.admin", and is
	 * validated in the constructor.
	 */
  	bytes32 internal constant ADMIN_SLOT = 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b;

  	/**
	 * @dev Modifier to check whether the `msg.sender` is the admin.
	 * If it is, it will run the function. Otherwise, it will delegate the call
	 * to the implementation.
	 */
	modifier ifProxyAdmin() {
		if (msg.sender == _proxyAdmin()) {
		    _;
		} else {
		    _fallback();
		}
	}

	/**
	 * @return The address of the proxy admin.
	 */
	function proxyAdmin() external view returns (address) {
		return _proxyAdmin();
	}

	/**
	 * @return The version of logic contract
	 */
	function proxyVersion() external view returns (string memory) {
		return _version;
	}

	/**
	 * @return The address of the implementation.
	 */
	function proxyImplementation() external view returns (address) {
		return _implementation();
	}

	/**
	 * @dev Changes the admin of the proxy.
	 * Only the current admin can call this function.
	 * @param newProxyAdmin Address to transfer proxy administration to.
	 */
	function changeProxyAdmin(address newProxyAdmin) external ifProxyAdmin {
		require(newProxyAdmin != address(0), "Cannot change the admin of a proxy to the zero address");
		emit ProxyAdminChanged(_proxyAdmin(), newProxyAdmin);
		_setProxyAdmin(newProxyAdmin);
	}

	/**
	 * @dev Upgrade the backing implementation of the proxy.
	 * Only the admin can call this function.
	 * @param newImplementation Address of the new implementation.
	 * @param newVersion of proxied contract.
	 */
	function upgradeProxyTo(address newImplementation, string calldata newVersion) external ifProxyAdmin {
		_upgradeProxyTo(newImplementation, newVersion);
	}

	/**
	 * @dev Upgrade the backing implementation of the proxy and call a function
	 * on the new implementation.
	 * This is useful to initialize the proxied contract.
	 * @param newImplementation Address of the new implementation.
	 * @param newVersion of proxied contract.
	 * @param data Data to send as msg.data in the low level call.
	 * It should include the signature and the parameters of the function to be called, as described in
	 * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
	 */
	function upgradeProxyToAndCall(address newImplementation, string calldata newVersion, bytes calldata data) payable external ifProxyAdmin {
		_upgradeProxyTo(newImplementation, newVersion);
		(bool success,) = newImplementation.delegatecall(data);
		require(success);
	}

	/**
	 * @return The admin slot.
	 */
	function _proxyAdmin() internal view returns (address adm) {
		bytes32 slot = ADMIN_SLOT;
		assembly {
    		adm := sload(slot)
		}
	}

	/**
	 * @dev Sets the address of the proxy admin.
	 * @param newProxyAdmin Address of the new proxy admin.
	 */
	function _setProxyAdmin(address newProxyAdmin) internal {
		bytes32 slot = ADMIN_SLOT;

		assembly {
			sstore(slot, newProxyAdmin)
		}
	}

	/**
	 * @dev Only fall back when the sender is not the admin.
	 */
	function _willFallback() internal {
		require(msg.sender != _proxyAdmin(), "Cannot call fallback function from the proxy admin");
		super._willFallback();
	}
}

/**
 * @title RacingProxy
 * @dev Extends from BaseAdminUpgradeabilityProxy with a constructor for
 * initializing the implementation, admin, and init data.
 */
contract RacingProxy is BaseAdminUpgradeabilityProxy, UpgradeabilityProxy {
	/**
	 * Contract constructor.
	 * @param _logic address of the initial implementation.
	 * @param _admin Address of the proxy administrator.
	 */
	constructor(address _logic, address _admin) UpgradeabilityProxy(_logic) public payable {
		assert(ADMIN_SLOT == keccak256("org.zeppelinos.proxy.admin"));
		_setProxyAdmin(_admin);
	}
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_gate","type":"uint256"}],"name":"getHorseID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horseIDs","type":"uint256[]"}],"name":"bulkTransferOut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_name","type":"string"},{"name":"_horsesAllowed","type":"uint256"},{"name":"_entranceFee","type":"uint256"},{"name":"_length","type":"uint256"}],"name":"createRace","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"}],"name":"getHorsesInRace","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"Cancelled_Races","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCoreAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"ID_Saved","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_bb","type":"address"}],"name":"setBbAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horseIDs","type":"uint256[]"}],"name":"bulkTransferIn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_startTime","type":"uint256"}],"name":"scheduleRace","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"renounceAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_results","type":"uint256[12]"}],"name":"postResults","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_position","type":"uint256"},{"name":"_percentage","type":"uint256"}],"name":"changePaymentAllocation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceFeeWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"Is_Authorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"Races","outputs":[{"name":"Track_Name","type":"string"},{"name":"Race_ID","type":"bytes32"},{"name":"Length","type":"uint256"},{"name":"Horses_Registered","type":"uint256"},{"name":"Unix_Start","type":"uint256"},{"name":"Entrance_Fee","type":"uint256"},{"name":"Prize_Pool","type":"uint256"},{"name":"Horses_Allowed","type":"uint256"},{"name":"Race_State","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_raceIds","type":"bytes32[]"},{"name":"_horseIDs","type":"uint256[]"}],"name":"claimAllWinningsHelper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_horseID","type":"uint256"},{"name":"_gateNumber","type":"uint256"}],"name":"registerHorse","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"isFeeWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_gate","type":"uint256"}],"name":"getHorseInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"Owner_Horse","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBBAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFeeWallet","type":"address"}],"name":"transferFeeWalletOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_reason","type":"string"}],"name":"cancelRace","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_core","type":"address"},{"name":"_bb","type":"address"}],"name":"initSetup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_gate","type":"uint256"},{"name":"_bettor","type":"address"}],"name":"getBetInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"Horse_Active_Races","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"Position_To_Payment","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"Has_Zed_Claimed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_raceId","type":"bytes32"},{"name":"_horseID","type":"uint256"}],"name":"claimWinningsHelper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":true,"name":"_bettor","type":"address"},{"indexed":false,"name":"_betAmount","type":"uint256"},{"indexed":true,"name":"_horseID","type":"uint256"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":true,"name":"_bettor","type":"address"},{"indexed":false,"name":"_claimAmount","type":"uint256"},{"indexed":true,"name":"_horseID","type":"uint256"}],"name":"PrizeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":true,"name":"_horseOwner","type":"address"},{"indexed":true,"name":"_horseID","type":"uint256"},{"indexed":false,"name":"_gateNumber","type":"uint256"}],"name":"HorseRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_horseOwner","type":"address"},{"indexed":false,"name":"_horseIDs","type":"uint256[]"}],"name":"HorseTransferredIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_horseOwner","type":"address"},{"indexed":false,"name":"_horseIDs","type":"uint256[]"}],"name":"HorseTransferredOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_name","type":"string"},{"indexed":false,"name":"_length","type":"uint256"},{"indexed":false,"name":"_registrationFee","type":"uint256"}],"name":"RaceCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_unixStart","type":"uint256"},{"indexed":false,"name":"_name","type":"string"}],"name":"RaceScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"}],"name":"RaceFull","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_firstPlaceHorseID","type":"uint256"},{"indexed":false,"name":"_secondPlaceHorseID","type":"uint256"},{"indexed":false,"name":"_thirdPlaceHorseID","type":"uint256"}],"name":"ResultsPosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_raceId","type":"bytes32"},{"indexed":false,"name":"_reason","type":"string"},{"indexed":false,"name":"_canceller","type":"address"}],"name":"RaceCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousFeeWallet","type":"address"},{"indexed":true,"name":"newFeeWallet","type":"address"}],"name":"FeeWalletTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AdminRemoved","type":"event"}]

608060405262000024620000186200006d60201b60201c565b6200007560201b60201c565b60016002819055506200004c620000406200006d60201b60201c565b620000d660201b60201c565b6000600e60006101000a81548160ff021916908315150217905550620002fb565b600033905090565b620000908160006200013760201b62004f121790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b620000f181600d6200013760201b62004f121790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b6200014982826200021b60201b60201c565b15620001bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002a4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620057f26022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6154e7806200030b6000396000f3fe60806040526004361061023b5760003560e01c806370a34c7c1161012e578063d1db212c116100ab578063f2136f231161006f578063f2136f23146111d7578063f25f4b5614611226578063f9114c931461127d578063fb80f303146112cc578063fd643a7b1461131f5761023b565b8063d1db212c14610f53578063d23587d714610faa578063e4e8210514610ffb578063eadeeab1146110cd578063ef1f46611461113e5761023b565b8063951d52f9116100f2578063951d52f914610d2c578063a2b0c86114610e07578063aeab1c6814610e49578063b0a0c2e714610e78578063c548e08214610ed85761023b565b806370a34c7c14610b4a57806380c965a514610b6157806382dc1ec414610bca5780638456cb5914610c1b5780638467536014610c325761023b565b80633f4ba83a116101bc5780635e1fab0f116101805780635e1fab0f146109ce5780636ef8d66d14610a1f5780636f00f0d714610a365780636fdebbef14610ab45780637048027514610af95761023b565b80633f4ba83a1461081557806346fbf68e1461082c5780634f942b8c1461089557806359c5f27b1461095a5780635c975abb1461099f5761023b565b80631e27daf0116102035780631e27daf0146105fd5780632096b768146106b157806324d7806c1461070857806325c719d6146107715780633992429b146107c45761023b565b80630aa407561461023d578063114ee35114610296578063150b7a021461035b57806315468f1e1461047d578063181cb85c1461056d575b005b34801561024957600080fd5b506102806004803603604081101561026057600080fd5b810190808035906020019092919080359060200190929190505050611364565b6040518082815260200191505060405180910390f35b3480156102a257600080fd5b50610359600480360360208110156102b957600080fd5b81019080803590602001906401000000008111156102d657600080fd5b8201836020820111156102e857600080fd5b8035906020019184602083028401116401000000008311171561030a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611396565b005b34801561036757600080fd5b506104296004803603608081101561037e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103e557600080fd5b8201836020820111156103f757600080fd5b8035906020019184600183028401116401000000008311171561041957600080fd5b9091929391929390505050611812565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561048957600080fd5b5061056b600480360360a08110156104a057600080fd5b8101908080359060200190929190803590602001906401000000008111156104c757600080fd5b8201836020820111156104d957600080fd5b803590602001918460018302840111640100000000831117156104fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190505050611838565b005b34801561057957600080fd5b506105a66004803603602081101561059057600080fd5b8101908080359060200190929190505050611cba565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105e95780820151818401526020810190506105ce565b505050509050019250505060405180910390f35b34801561060957600080fd5b506106366004803603602081101561062057600080fd5b8101908080359060200190929190505050611d2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561067657808201518184015260208101905061065b565b50505050905090810190601f1680156106a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106bd57600080fd5b506106c6611dde565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561071457600080fd5b506107576004803603602081101561072b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e08565b604051808215151515815260200191505060405180910390f35b34801561077d57600080fd5b506107aa6004803603602081101561079457600080fd5b8101908080359060200190929190505050611e25565b604051808215151515815260200191505060405180910390f35b3480156107d057600080fd5b50610813600480360360208110156107e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e45565b005b34801561082157600080fd5b5061082a611eee565b005b34801561083857600080fd5b5061087b6004803603602081101561084f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061205c565b604051808215151515815260200191505060405180910390f35b3480156108a157600080fd5b50610958600480360360208110156108b857600080fd5b81019080803590602001906401000000008111156108d557600080fd5b8201836020820111156108e757600080fd5b8035906020019184602083028401116401000000008311171561090957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612079565b005b34801561096657600080fd5b5061099d6004803603604081101561097d57600080fd5b810190808035906020019092919080359060200190929190505050612388565b005b3480156109ab57600080fd5b506109b4612703565b604051808215151515815260200191505060405180910390f35b3480156109da57600080fd5b50610a1d600480360360208110156109f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061271a565b005b348015610a2b57600080fd5b50610a3461278b565b005b348015610a4257600080fd5b50610ab260048036036101a0811015610a5a57600080fd5b8101908080359060200190929190806101800190600c806020026040519081016040528092919082600c60200280828437600081840152601f19601f820116905080830192505050505050919291929050505061279d565b005b348015610ac057600080fd5b50610af760048036036040811015610ad757600080fd5b810190808035906020019092919080359060200190929190505050612ce4565b005b348015610b0557600080fd5b50610b4860048036036020811015610b1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d65565b005b348015610b5657600080fd5b50610b5f612dd6565b005b348015610b6d57600080fd5b50610bb060048036036020811015610b8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612efc565b604051808215151515815260200191505060405180910390f35b348015610bd657600080fd5b50610c1960048036036020811015610bed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f1c565b005b348015610c2757600080fd5b50610c30612f8d565b005b348015610c3e57600080fd5b50610c6b60048036036020811015610c5557600080fd5b81019080803590602001909291905050506130fc565b60405180806020018a8152602001898152602001888152602001878152602001868152602001858152602001848152602001836004811115610ca957fe5b60ff16815260200182810382528b818151815260200191508051906020019080838360005b83811015610ce9578082015181840152602081019050610cce565b50505050905090810190601f168015610d165780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610d3857600080fd5b50610e0560048036036040811015610d4f57600080fd5b8101908080359060200190640100000000811115610d6c57600080fd5b820183602082011115610d7e57600080fd5b80359060200191846020830284011164010000000083111715610da057600080fd5b909192939192939080359060200190640100000000811115610dc157600080fd5b820183602082011115610dd357600080fd5b80359060200191846020830284011164010000000083111715610df557600080fd5b90919293919293905050506131ef565b005b610e4760048036036060811015610e1d57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506133f0565b005b348015610e5557600080fd5b50610e5e613cd2565b604051808215151515815260200191505060405180910390f35b348015610e8457600080fd5b50610ebb60048036036040811015610e9b57600080fd5b810190808035906020019092919080359060200190929190505050613d31565b604051808381526020018281526020019250505060405180910390f35b348015610ee457600080fd5b50610f1160048036036020811015610efb57600080fd5b8101908080359060200190929190505050613d9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f5f57600080fd5b50610f68613dce565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610fb657600080fd5b50610ff960048036036020811015610fcd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613df8565b005b34801561100757600080fd5b506110cb6004803603604081101561101e57600080fd5b81019080803590602001909291908035906020019064010000000081111561104557600080fd5b82018360208201111561105757600080fd5b8035906020019184600183028401116401000000008311171561107957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613e69565b005b3480156110d957600080fd5b5061113c600480360360408110156110f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141a8565b005b34801561114a57600080fd5b506111a16004803603606081101561116157600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506142e1565b60405180868152602001858152602001848152602001831515151581526020018281526020019550505050505060405180910390f35b3480156111e357600080fd5b50611210600480360360208110156111fa57600080fd5b8101908080359060200190929190505050614459565b6040518082815260200191505060405180910390f35b34801561123257600080fd5b5061123b614471565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561128957600080fd5b506112b6600480360360208110156112a057600080fd5b810190808035906020019092919050505061449b565b6040518082815260200191505060405180910390f35b3480156112d857600080fd5b50611305600480360360208110156112ef57600080fd5b81019080803590602001909291905050506144b3565b604051808215151515815260200191505060405180910390f35b34801561132b57600080fd5b506113626004803603604081101561134257600080fd5b8101908080359060200190929190803590602001909291905050506144d3565b005b600060036000848152602001908152602001600020600b01600083815260200190815260200160002054905092915050565b6001600260008282540192505081905550600060025490506010825110611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff161015611707573373ffffffffffffffffffffffffffffffffffffffff1660046000858460ff168151811061144457fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616c6c6572206973206e6f7420746865206f776e65722e000000000000000081525060200191505060405180910390fd5b600060056000858460ff168151811061151957fe5b602002602001015181526020019081526020016000205414611586576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153a06021913960400191505060405180910390fd5b600060046000858460ff168151811061159b57fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033868560ff168151811061163e57fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156116e257600080fd5b505af11580156116f6573d6000803e3d6000fd5b50505050808060010191505061140e565b503373ffffffffffffffffffffffffffffffffffffffff167f3d3dec951aa841e2a58e264722acb6b140278cf0bd892255283d364ce3862f45836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611784578082015181840152602081019050611769565b505050509050019250505060405180910390a2600254811461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b60006040518080615267602f9139602f0190506040518091039020905095945050505050565b611848611843614579565b611e08565b61189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff1615611938576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600083116119ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f456e7472616e636520666565206c6f776572207468616e207a65726f0000000081525060200191505060405180910390fd5b6006600087815260200190815260200160002060009054906101000a900460ff1615611a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f526163652049442065786973747300000000000000000000000000000000000081525060200191505060405180910390fd5b611a4a614fed565b86816020018181525050858160000181905250848160e0018181525050838160a00181815250508281604001818152505060018161012001906004811115611a8e57fe5b90816004811115611a9b57fe5b8152505080600360008981526020019081526020016000206000820151816000019080519060200190611acf92919061504e565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008019080519060200190611b339291906150ce565b506101208201518160090160006101000a81548160ff02191690836004811115611b5957fe5b021790555090505060016006600089815260200190815260200160002060006101000a81548160ff021916908315150217905550867f90e52d31327868049927e468ffc978cc0f845f271e577f2d2566536cd6836dc68785876040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611bfe578082015181840152602081019050611be3565b50505050905090810190601f168015611c2b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2506002548114611cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050505050565b6060600060036000848152602001908152602001600020905080600801805480602002602001604051908101604052809291908181526020018280548015611d2157602002820191906000526020600020905b815481526020019060010190808311611d0d575b5050505050915050919050565b60096020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd65780601f10611dab57610100808354040283529160200191611dd6565b820191906000526020600020905b815481529060010190602001808311611db957829003601f168201915b505050505081565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e1e82600061458190919063ffffffff16565b9050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b611e55611e50614579565b611e08565b611eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611efe611ef9614579565b61205c565b611f53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff16611fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612019614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061207282600d61458190919063ffffffff16565b9050919050565b60016002600082825401925050819055506000600254905060108251106120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff16101561227d573360046000858460ff168151811061211157fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330868560ff16815181106121b457fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561225857600080fd5b505af115801561226c573d6000803e3d6000fd5b5050505080806001019150506120f1565b503373ffffffffffffffffffffffffffffffffffffffff167f3dcf5b35d176866ac652249eab93a0572716225202eb5ab57935766fbe59eab0836040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156122fa5780820151818401526020810190506122df565b505050509050019250505060405180910390a26002548114612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b612398612393614579565b611e08565b6123ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090508060070154816003015414612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f7420656e6f75676820686f7273657320726567697374657265640000000081525060200191505060405180910390fd5b600160048111156124a657fe5b8160090160009054906101000a900460ff1660048111156124c357fe5b14612519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061549b6021913960400191505060405180910390fd5b61012c42018311612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53746172742074696d6520646f65736e74206d6565742063726974657269610081525060200191505060405180910390fd5b82816004018190555060028160090160006101000a81548160ff021916908360048111156125bc57fe5b0217905550837fef3df935b4473f7535b7036b7355247b10ecc7d6182af68e7a0578c8adfc5ee9848360000160405180838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156126775780601f1061264c57610100808354040283529160200191612677565b820191906000526020600020905b81548152906001019060200180831161265a57829003601f168201915b5050935050505060405180910390a25060025481146126fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6000600e60009054906101000a900460ff16905090565b61272a612725614579565b611e08565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b6127888161465f565b50565b61279b612796614579565b6146b9565b565b6127ad6127a8614579565b611e08565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090506002600481111561283e57fe5b8160090160009054906101000a900460ff16600481111561285b57fe5b146128ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f52616365206973206e6f74206f6e2062657474696e672073746174650000000081525060200191505060405180910390fd5b603c42018160040154111561294b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d69736d61746368206f6e20756e69782073746172740000000000000000000081525060200191505060405180910390fd5b60038160090160006101000a81548160ff0219169083600481111561296c57fe5b021790555060008090505b8160070154811015612a2f57600082600a0160008684600c811061299757fe5b60200201518152602001908152602001600020600001541415612a22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4944206e6f74207265676973746572656400000000000000000000000000000081525060200191505060405180910390fd5b8080600101915050612977565b5060008090505b8160070154811015612ab3576001810182600a0160008684600c8110612a5857fe5b6020020151815260200190815260200160002060020181905550600560008583600c8110612a8257fe5b6020020151815260200190815260200160002060008154809291906001900391905055508080600101915050612a36565b5060008090505b8160070154811015612b73576001810182600a0160008684600c8110612adc57fe5b602002015181526020019081526020016000206002015414612b66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4944206e6f74207375626d69747465642070726f7065726c790000000000000081525060200191505060405180910390fd5b8080600101915050612aba565b50612b7c614471565b73ffffffffffffffffffffffffffffffffffffffff166108fc612bc06064612bb2600a866006015461471390919063ffffffff16565b61479990919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015612beb573d6000803e3d6000fd5b50837fd1f7e3b7d720f0eef8ee86bf688d0bfdfcd66ac0e224b423e7dfc1761999727a846000600c8110612c1b57fe5b6020020151856001600c8110612c2d57fe5b6020020151866002600c8110612c3f57fe5b602002015160405180848152602001838152602001828152602001935050505060405180910390a2506002548114612cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b612cf4612cef614579565b611e08565b612d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b8060076000848152602001908152602001600020819055505050565b612d75612d70614579565b611e08565b612dca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b612dd3816147e3565b50565b612de6612de1614579565b611e08565b612e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60086020528060005260406000206000915054906101000a900460ff1681565b612f2c612f27614579565b61205c565b612f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b612f8a8161483d565b50565b612f9d612f98614579565b61205c565b612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615613075576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130b9614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6003602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131a85780601f1061317d576101008083540402835291602001916131a8565b820191906000526020600020905b81548152906001019060200180831161318b57829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060090160009054906101000a900460ff16905089565b60016002600082825401925050819055506000600254905060008585905011613263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806151c16039913960400191505060405180910390fd5b607d85859050106132bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001806151fa604a913960600191505060405180910390fd5b82829050858590501461331d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180615351604f913960600191505060405180910390fd5b60008090505b858590508110156133715761336486868381811061333d57fe5b9050602002013585858481811061335057fe5b9050602002013561335f614579565b614897565b8080600101915050613323565b5060025481146133e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050505050565b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff161561348b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6000600360008681526020019081526020016000209050806005015434101561351c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e7472616e636520666565206e6f74206d657400000000000000000000000081525060200191505060405180910390fd5b6001600481111561352957fe5b8160090160009054906101000a900460ff16600481111561354657fe5b146135b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f52616365206e6f7420616363657074696e6720726567697374726174696f6e7381525060200191505060405180910390fd5b8060070154816003015410613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6178206e756d626572206f6620686f7273657320666f72207261636500000081525060200191505060405180910390fd5b60018310156136ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d626572206c6f776572207468616e20312e0000000000000081525060200191505060405180910390fd5b8060070154831115613727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f47617465206e756d6265722067726561746572207468616e206d61780000000081525060200191505060405180910390fd5b80600c01600084815260200190815260200160002060009054906101000a900460ff16156137bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d62657220616c72656164792074616b656e0000000000000081525060200191505060405180910390fd5b6003600560008681526020019081526020016000205410613829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154546021913960400191505060405180910390fd5b600081600a016000868152602001908152602001600020600001541461389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154756026913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561392457600080fd5b505afa158015613938573d6000803e3d6000fd5b505050506040513d602081101561394e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146139cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152ec6023913960400191505060405180910390fd5b60056000858152602001908152602001600020600081548092919060010191905055508060030160008154809291906001019190505550604051806060016040528084815260200160008152602001600081525081600a0160008681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508381600b01600085815260200190815260200160002081905550600181600c01600085815260200190815260200160002060006101000a81548160ff02191690831515021790555080600501548160060160008282540192505081905550806005015481600a01600086815260200190815260200160002060010160008282540192505081905550806005015481600a01600086815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600801849080600181540180825580915050906001820390600052602060002001600090919290919091505550806007015481600301541415613bb057847f62473fbb9326dcad400e9fd91026768dbcf6dad189f4b397db633765489b380260405160405180910390a25b833373ffffffffffffffffffffffffffffffffffffffff16867ff658eab36be8f9e91803a03670bd82fe4dc102503be52a6d901f6b044db50dc5866040518082815260200191505060405180910390a4833373ffffffffffffffffffffffffffffffffffffffff16867fc9621b1db612fa52c8213099eb7c450b407922963a8c63ee6bfe963404f4599784600501546040518082815260200191505060405180910390a4506002548114613ccc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d15614579565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600080600060036000868152602001908152602001600020905080600b0160008581526020019081526020016000205481600a01600083600b0160008881526020019081526020016000205481526020019081526020016000206002015492509250509250929050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613e08613e03614579565b611e08565b613e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b613e6681614c49565b50565b613e79613e74614579565b611e08565b613ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600060036000858152602001908152602001600020905060016004811115613f0a57fe5b8160090160009054906101000a900460ff166004811115613f2757fe5b1480613f5a575060026004811115613f3b57fe5b8160090160009054906101000a900460ff166004811115613f5857fe5b145b613faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153306021913960400191505060405180910390fd5b60048160090160006101000a81548160ff02191690836004811115613fd057fe5b021790555082600960008681526020019081526020016000209080519060200190613ffc92919061511b565b5060008090505b8160030154811015614059576005600083600801838154811061402257fe5b9060005260206000200154815260200190815260200160002060008154809291906001900391905055508080600101915050614003565b50837fa6facd5724e022e7a663091abdf8d4f70d89f969fab200adedea42a41fcebaa8843360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156140f05780820151818401526020810190506140d5565b50505050905090810190601f16801561411d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060025481146141a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6141b86141b3614579565b611e08565b61420d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b603c6007600060018152602001908152602001600020819055506014600760006002815260200190815260200160002081905550600a60076000600381526020019081526020016000208190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600080600080600080600360008a81526020019081526020016000209050806006015481600a01600083600b0160008c81526020019081526020016000205481526020019081526020016000206001015482600a01600084600b0160008d815260200190815260200160002054815260200190815260200160002060030160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483600a01600085600b0160008e815260200190815260200160002054815260200190815260200160002060040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1684600a01600086600b0160008f8152602001908152602001600020548152602001908152602001600020600201549550955095509550955050939792965093509350565b60056020528060005260406000206000915090505481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60076020528060005260406000206000915090505481565b600a6020528060005260406000206000915054906101000a900460ff1681565b6001600260008282540192505081905550600060025490506144fd83836144f8614579565b614897565b6002548114614574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153e26022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b614673816000614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f60405160405180910390a250565b6146cd81600d614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b6000808314156147265760009050614793565b600082840290508284828161473757fe5b041461478e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153c16021913960400191505060405180910390fd5b809150505b92915050565b60006147db83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614e4c565b905092915050565b6147f7816000614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b61485181600d614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b600060036000858152602001908152602001600020905060006004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420686f727365206f776e6572000000000000000000000000000000000081525060200191505060405180910390fd5b6003600481111561499457fe5b8260090160009054906101000a900460ff1660048111156149b157fe5b14614a24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f52616365207374696c6c2072756e6e696e67000000000000000000000000000081525060200191505060405180910390fd5b81600a01600085815260200190815260200160002060040160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614add576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154326022913960400191505060405180910390fd5b600182600a01600086815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600082600a0160008681526020019081526020016000206002015490506000614ba76064614b996007600086815260200190815260200160002054876006015461471390919063ffffffff16565b61479990919063ffffffff16565b90508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614bef573d6000803e3d6000fd5b50858373ffffffffffffffffffffffffffffffffffffffff16887fa3dd4a1386669cfcc372819ceaee69df2c1c14eb82976d79bd15c856666cb650846040518082815260200191505060405180910390a450505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614ccf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152c66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614d998282614581565b614dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061530f6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614ef8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ebd578082015181840152602081019050614ea2565b50505050905090810190601f168015614eea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614f0457fe5b049050809150509392505050565b614f1c8282614581565b15614f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6040518061014001604052806060815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016000600481111561504857fe5b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061508f57805160ff19168380011785556150bd565b828001600101855582156150bd579182015b828111156150bc5782518255916020019190600101906150a1565b5b5090506150ca919061519b565b5090565b82805482825590600052602060002090810192821561510a579160200282015b828111156151095782518255916020019190600101906150ee565b5b509050615117919061519b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061515c57805160ff191683800117855561518a565b8280016001018555821561518a579182015b8281111561518957825182559160200191906001019061516e565b5b509050615197919061519b565b5090565b6151bd91905b808211156151b95760008160009055506001016151a1565b5090565b9056fe636c61696d416c6c57696e6e696e677348656c7065723a207261636549642061727261792073686f756c64206e6f7420626520656d7074792e636c61696d416c6c57696e6e696e677348656c7065723a20726163654964206172726179206c656e67746820697320626967676572207468616e2070726f7669646564206c696d69742e4f6e6c7920313520686f7273657320616c6c6f77656420706572207472616e736665726f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c627974657329506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526163696e6720636f6e7472616374206e6f74206f776e6572206f6620686f7273652e526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6552616365206e6f74206f6e2072656773206f722062657474696e67207374617465636c61696d416c6c57696e6e696e677348656c7065723a206c656e67746873206f66207261636569647320616e6420686f727365696473206172726179732073686f756c6420626520657175616c2e486f7273652063757272656e746c792061637469766520696e206120726163652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737341646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652041646d696e20726f6c6557696e6e696e6773206861766520616c7265616479206265656e20636c61696d6564486f7273652063757272656e746c792061637469766520696e2033207261636573486f72736520616c7265616479207265676973746572656420666f722074686973207261636552616365206973206e6f7420696e20726567697374726174696f6e207374617465a165627a7a723058206bf9b18135615c64d28842945084edc2ef3d9fe787080f9cbfdbf0f22a688a6d0029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a34c7c1161012e578063d1db212c116100ab578063f2136f231161006f578063f2136f23146111d7578063f25f4b5614611226578063f9114c931461127d578063fb80f303146112cc578063fd643a7b1461131f5761023b565b8063d1db212c14610f53578063d23587d714610faa578063e4e8210514610ffb578063eadeeab1146110cd578063ef1f46611461113e5761023b565b8063951d52f9116100f2578063951d52f914610d2c578063a2b0c86114610e07578063aeab1c6814610e49578063b0a0c2e714610e78578063c548e08214610ed85761023b565b806370a34c7c14610b4a57806380c965a514610b6157806382dc1ec414610bca5780638456cb5914610c1b5780638467536014610c325761023b565b80633f4ba83a116101bc5780635e1fab0f116101805780635e1fab0f146109ce5780636ef8d66d14610a1f5780636f00f0d714610a365780636fdebbef14610ab45780637048027514610af95761023b565b80633f4ba83a1461081557806346fbf68e1461082c5780634f942b8c1461089557806359c5f27b1461095a5780635c975abb1461099f5761023b565b80631e27daf0116102035780631e27daf0146105fd5780632096b768146106b157806324d7806c1461070857806325c719d6146107715780633992429b146107c45761023b565b80630aa407561461023d578063114ee35114610296578063150b7a021461035b57806315468f1e1461047d578063181cb85c1461056d575b005b34801561024957600080fd5b506102806004803603604081101561026057600080fd5b810190808035906020019092919080359060200190929190505050611364565b6040518082815260200191505060405180910390f35b3480156102a257600080fd5b50610359600480360360208110156102b957600080fd5b81019080803590602001906401000000008111156102d657600080fd5b8201836020820111156102e857600080fd5b8035906020019184602083028401116401000000008311171561030a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611396565b005b34801561036757600080fd5b506104296004803603608081101561037e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156103e557600080fd5b8201836020820111156103f757600080fd5b8035906020019184600183028401116401000000008311171561041957600080fd5b9091929391929390505050611812565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561048957600080fd5b5061056b600480360360a08110156104a057600080fd5b8101908080359060200190929190803590602001906401000000008111156104c757600080fd5b8201836020820111156104d957600080fd5b803590602001918460018302840111640100000000831117156104fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190505050611838565b005b34801561057957600080fd5b506105a66004803603602081101561059057600080fd5b8101908080359060200190929190505050611cba565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105e95780820151818401526020810190506105ce565b505050509050019250505060405180910390f35b34801561060957600080fd5b506106366004803603602081101561062057600080fd5b8101908080359060200190929190505050611d2e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561067657808201518184015260208101905061065b565b50505050905090810190601f1680156106a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106bd57600080fd5b506106c6611dde565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561071457600080fd5b506107576004803603602081101561072b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e08565b604051808215151515815260200191505060405180910390f35b34801561077d57600080fd5b506107aa6004803603602081101561079457600080fd5b8101908080359060200190929190505050611e25565b604051808215151515815260200191505060405180910390f35b3480156107d057600080fd5b50610813600480360360208110156107e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e45565b005b34801561082157600080fd5b5061082a611eee565b005b34801561083857600080fd5b5061087b6004803603602081101561084f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061205c565b604051808215151515815260200191505060405180910390f35b3480156108a157600080fd5b50610958600480360360208110156108b857600080fd5b81019080803590602001906401000000008111156108d557600080fd5b8201836020820111156108e757600080fd5b8035906020019184602083028401116401000000008311171561090957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050612079565b005b34801561096657600080fd5b5061099d6004803603604081101561097d57600080fd5b810190808035906020019092919080359060200190929190505050612388565b005b3480156109ab57600080fd5b506109b4612703565b604051808215151515815260200191505060405180910390f35b3480156109da57600080fd5b50610a1d600480360360208110156109f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061271a565b005b348015610a2b57600080fd5b50610a3461278b565b005b348015610a4257600080fd5b50610ab260048036036101a0811015610a5a57600080fd5b8101908080359060200190929190806101800190600c806020026040519081016040528092919082600c60200280828437600081840152601f19601f820116905080830192505050505050919291929050505061279d565b005b348015610ac057600080fd5b50610af760048036036040811015610ad757600080fd5b810190808035906020019092919080359060200190929190505050612ce4565b005b348015610b0557600080fd5b50610b4860048036036020811015610b1c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d65565b005b348015610b5657600080fd5b50610b5f612dd6565b005b348015610b6d57600080fd5b50610bb060048036036020811015610b8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612efc565b604051808215151515815260200191505060405180910390f35b348015610bd657600080fd5b50610c1960048036036020811015610bed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f1c565b005b348015610c2757600080fd5b50610c30612f8d565b005b348015610c3e57600080fd5b50610c6b60048036036020811015610c5557600080fd5b81019080803590602001909291905050506130fc565b60405180806020018a8152602001898152602001888152602001878152602001868152602001858152602001848152602001836004811115610ca957fe5b60ff16815260200182810382528b818151815260200191508051906020019080838360005b83811015610ce9578082015181840152602081019050610cce565b50505050905090810190601f168015610d165780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610d3857600080fd5b50610e0560048036036040811015610d4f57600080fd5b8101908080359060200190640100000000811115610d6c57600080fd5b820183602082011115610d7e57600080fd5b80359060200191846020830284011164010000000083111715610da057600080fd5b909192939192939080359060200190640100000000811115610dc157600080fd5b820183602082011115610dd357600080fd5b80359060200191846020830284011164010000000083111715610df557600080fd5b90919293919293905050506131ef565b005b610e4760048036036060811015610e1d57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506133f0565b005b348015610e5557600080fd5b50610e5e613cd2565b604051808215151515815260200191505060405180910390f35b348015610e8457600080fd5b50610ebb60048036036040811015610e9b57600080fd5b810190808035906020019092919080359060200190929190505050613d31565b604051808381526020018281526020019250505060405180910390f35b348015610ee457600080fd5b50610f1160048036036020811015610efb57600080fd5b8101908080359060200190929190505050613d9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f5f57600080fd5b50610f68613dce565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610fb657600080fd5b50610ff960048036036020811015610fcd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613df8565b005b34801561100757600080fd5b506110cb6004803603604081101561101e57600080fd5b81019080803590602001909291908035906020019064010000000081111561104557600080fd5b82018360208201111561105757600080fd5b8035906020019184600183028401116401000000008311171561107957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613e69565b005b3480156110d957600080fd5b5061113c600480360360408110156110f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506141a8565b005b34801561114a57600080fd5b506111a16004803603606081101561116157600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506142e1565b60405180868152602001858152602001848152602001831515151581526020018281526020019550505050505060405180910390f35b3480156111e357600080fd5b50611210600480360360208110156111fa57600080fd5b8101908080359060200190929190505050614459565b6040518082815260200191505060405180910390f35b34801561123257600080fd5b5061123b614471565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561128957600080fd5b506112b6600480360360208110156112a057600080fd5b810190808035906020019092919050505061449b565b6040518082815260200191505060405180910390f35b3480156112d857600080fd5b50611305600480360360208110156112ef57600080fd5b81019080803590602001909291905050506144b3565b604051808215151515815260200191505060405180910390f35b34801561132b57600080fd5b506113626004803603604081101561134257600080fd5b8101908080359060200190929190803590602001909291905050506144d3565b005b600060036000848152602001908152602001600020600b01600083815260200190815260200160002054905092915050565b6001600260008282540192505081905550600060025490506010825110611408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff161015611707573373ffffffffffffffffffffffffffffffffffffffff1660046000858460ff168151811061144457fe5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616c6c6572206973206e6f7420746865206f776e65722e000000000000000081525060200191505060405180910390fd5b600060056000858460ff168151811061151957fe5b602002602001015181526020019081526020016000205414611586576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153a06021913960400191505060405180910390fd5b600060046000858460ff168151811061159b57fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033868560ff168151811061163e57fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156116e257600080fd5b505af11580156116f6573d6000803e3d6000fd5b50505050808060010191505061140e565b503373ffffffffffffffffffffffffffffffffffffffff167f3d3dec951aa841e2a58e264722acb6b140278cf0bd892255283d364ce3862f45836040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611784578082015181840152602081019050611769565b505050509050019250505060405180910390a2600254811461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b60006040518080615267602f9139602f0190506040518091039020905095945050505050565b611848611843614579565b611e08565b61189d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff1615611938576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b600083116119ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f456e7472616e636520666565206c6f776572207468616e207a65726f0000000081525060200191505060405180910390fd5b6006600087815260200190815260200160002060009054906101000a900460ff1615611a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f526163652049442065786973747300000000000000000000000000000000000081525060200191505060405180910390fd5b611a4a614fed565b86816020018181525050858160000181905250848160e0018181525050838160a00181815250508281604001818152505060018161012001906004811115611a8e57fe5b90816004811115611a9b57fe5b8152505080600360008981526020019081526020016000206000820151816000019080519060200190611acf92919061504e565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008019080519060200190611b339291906150ce565b506101208201518160090160006101000a81548160ff02191690836004811115611b5957fe5b021790555090505060016006600089815260200190815260200160002060006101000a81548160ff021916908315150217905550867f90e52d31327868049927e468ffc978cc0f845f271e577f2d2566536cd6836dc68785876040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611bfe578082015181840152602081019050611be3565b50505050905090810190601f168015611c2b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2506002548114611cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050505050565b6060600060036000848152602001908152602001600020905080600801805480602002602001604051908101604052809291908181526020018280548015611d2157602002820191906000526020600020905b815481526020019060010190808311611d0d575b5050505050915050919050565b60096020528060005260406000206000915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dd65780601f10611dab57610100808354040283529160200191611dd6565b820191906000526020600020905b815481529060010190602001808311611db957829003601f168201915b505050505081565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e1e82600061458190919063ffffffff16565b9050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b611e55611e50614579565b611e08565b611eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611efe611ef9614579565b61205c565b611f53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff16611fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612019614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600061207282600d61458190919063ffffffff16565b9050919050565b60016002600082825401925050819055506000600254905060108251106120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152446023913960400191505060405180910390fd5b60008090505b82518160ff16101561227d573360046000858460ff168151811061211157fe5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330868560ff16815181106121b457fe5b60200260200101516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561225857600080fd5b505af115801561226c573d6000803e3d6000fd5b5050505080806001019150506120f1565b503373ffffffffffffffffffffffffffffffffffffffff167f3dcf5b35d176866ac652249eab93a0572716225202eb5ab57935766fbe59eab0836040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156122fa5780820151818401526020810190506122df565b505050509050019250505060405180910390a26002548114612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050565b612398612393614579565b611e08565b6123ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090508060070154816003015414612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6f7420656e6f75676820686f7273657320726567697374657265640000000081525060200191505060405180910390fd5b600160048111156124a657fe5b8160090160009054906101000a900460ff1660048111156124c357fe5b14612519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061549b6021913960400191505060405180910390fd5b61012c42018311612592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53746172742074696d6520646f65736e74206d6565742063726974657269610081525060200191505060405180910390fd5b82816004018190555060028160090160006101000a81548160ff021916908360048111156125bc57fe5b0217905550837fef3df935b4473f7535b7036b7355247b10ecc7d6182af68e7a0578c8adfc5ee9848360000160405180838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156126775780601f1061264c57610100808354040283529160200191612677565b820191906000526020600020905b81548152906001019060200180831161265a57829003601f168201915b5050935050505060405180910390a25060025481146126fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6000600e60009054906101000a900460ff16905090565b61272a612725614579565b611e08565b61277f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b6127888161465f565b50565b61279b612796614579565b6146b9565b565b6127ad6127a8614579565b611e08565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b60016002600082825401925050819055506000600254905060006003600085815260200190815260200160002090506002600481111561283e57fe5b8160090160009054906101000a900460ff16600481111561285b57fe5b146128ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f52616365206973206e6f74206f6e2062657474696e672073746174650000000081525060200191505060405180910390fd5b603c42018160040154111561294b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d69736d61746368206f6e20756e69782073746172740000000000000000000081525060200191505060405180910390fd5b60038160090160006101000a81548160ff0219169083600481111561296c57fe5b021790555060008090505b8160070154811015612a2f57600082600a0160008684600c811061299757fe5b60200201518152602001908152602001600020600001541415612a22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4944206e6f74207265676973746572656400000000000000000000000000000081525060200191505060405180910390fd5b8080600101915050612977565b5060008090505b8160070154811015612ab3576001810182600a0160008684600c8110612a5857fe5b6020020151815260200190815260200160002060020181905550600560008583600c8110612a8257fe5b6020020151815260200190815260200160002060008154809291906001900391905055508080600101915050612a36565b5060008090505b8160070154811015612b73576001810182600a0160008684600c8110612adc57fe5b602002015181526020019081526020016000206002015414612b66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4944206e6f74207375626d69747465642070726f7065726c790000000000000081525060200191505060405180910390fd5b8080600101915050612aba565b50612b7c614471565b73ffffffffffffffffffffffffffffffffffffffff166108fc612bc06064612bb2600a866006015461471390919063ffffffff16565b61479990919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015612beb573d6000803e3d6000fd5b50837fd1f7e3b7d720f0eef8ee86bf688d0bfdfcd66ac0e224b423e7dfc1761999727a846000600c8110612c1b57fe5b6020020151856001600c8110612c2d57fe5b6020020151866002600c8110612c3f57fe5b602002015160405180848152602001838152602001828152602001935050505060405180910390a2506002548114612cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b612cf4612cef614579565b611e08565b612d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b8060076000848152602001908152602001600020819055505050565b612d75612d70614579565b611e08565b612dca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b612dd3816147e3565b50565b612de6612de1614579565b611e08565b612e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60086020528060005260406000206000915054906101000a900460ff1681565b612f2c612f27614579565b61205c565b612f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b612f8a8161483d565b50565b612f9d612f98614579565b61205c565b612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806152966030913960400191505060405180910390fd5b600e60009054906101000a900460ff1615613075576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130b9614579565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6003602052806000526040600020600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131a85780601f1061317d576101008083540402835291602001916131a8565b820191906000526020600020905b81548152906001019060200180831161318b57829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060090160009054906101000a900460ff16905089565b60016002600082825401925050819055506000600254905060008585905011613263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806151c16039913960400191505060405180910390fd5b607d85859050106132bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001806151fa604a913960600191505060405180910390fd5b82829050858590501461331d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604f815260200180615351604f913960600191505060405180910390fd5b60008090505b858590508110156133715761336486868381811061333d57fe5b9050602002013585858481811061335057fe5b9050602002013561335f614579565b614897565b8080600101915050613323565b5060025481146133e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b5050505050565b600160026000828254019250508190555060006002549050600e60009054906101000a900460ff161561348b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6000600360008681526020019081526020016000209050806005015434101561351c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e7472616e636520666565206e6f74206d657400000000000000000000000081525060200191505060405180910390fd5b6001600481111561352957fe5b8160090160009054906101000a900460ff16600481111561354657fe5b146135b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f52616365206e6f7420616363657074696e6720726567697374726174696f6e7381525060200191505060405180910390fd5b8060070154816003015410613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6178206e756d626572206f6620686f7273657320666f72207261636500000081525060200191505060405180910390fd5b60018310156136ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d626572206c6f776572207468616e20312e0000000000000081525060200191505060405180910390fd5b8060070154831115613727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f47617465206e756d6265722067726561746572207468616e206d61780000000081525060200191505060405180910390fd5b80600c01600084815260200190815260200160002060009054906101000a900460ff16156137bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f47617465206e756d62657220616c72656164792074616b656e0000000000000081525060200191505060405180910390fd5b6003600560008681526020019081526020016000205410613829576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154546021913960400191505060405180910390fd5b600081600a016000868152602001908152602001600020600001541461389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154756026913960400191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561392457600080fd5b505afa158015613938573d6000803e3d6000fd5b505050506040513d602081101561394e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146139cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152ec6023913960400191505060405180910390fd5b60056000858152602001908152602001600020600081548092919060010191905055508060030160008154809291906001019190505550604051806060016040528084815260200160008152602001600081525081600a0160008681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508381600b01600085815260200190815260200160002081905550600181600c01600085815260200190815260200160002060006101000a81548160ff02191690831515021790555080600501548160060160008282540192505081905550806005015481600a01600086815260200190815260200160002060010160008282540192505081905550806005015481600a01600086815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600801849080600181540180825580915050906001820390600052602060002001600090919290919091505550806007015481600301541415613bb057847f62473fbb9326dcad400e9fd91026768dbcf6dad189f4b397db633765489b380260405160405180910390a25b833373ffffffffffffffffffffffffffffffffffffffff16867ff658eab36be8f9e91803a03670bd82fe4dc102503be52a6d901f6b044db50dc5866040518082815260200191505060405180910390a4833373ffffffffffffffffffffffffffffffffffffffff16867fc9621b1db612fa52c8213099eb7c450b407922963a8c63ee6bfe963404f4599784600501546040518082815260200191505060405180910390a4506002548114613ccc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d15614579565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600080600060036000868152602001908152602001600020905080600b0160008581526020019081526020016000205481600a01600083600b0160008881526020019081526020016000205481526020019081526020016000206002015492509250509250929050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613e08613e03614579565b611e08565b613e5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b613e6681614c49565b50565b613e79613e74614579565b611e08565b613ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b600160026000828254019250508190555060006002549050600060036000858152602001908152602001600020905060016004811115613f0a57fe5b8160090160009054906101000a900460ff166004811115613f2757fe5b1480613f5a575060026004811115613f3b57fe5b8160090160009054906101000a900460ff166004811115613f5857fe5b145b613faf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153306021913960400191505060405180910390fd5b60048160090160006101000a81548160ff02191690836004811115613fd057fe5b021790555082600960008681526020019081526020016000209080519060200190613ffc92919061511b565b5060008090505b8160030154811015614059576005600083600801838154811061402257fe5b9060005260206000200154815260200190815260200160002060008154809291906001900391905055508080600101915050614003565b50837fa6facd5724e022e7a663091abdf8d4f70d89f969fab200adedea42a41fcebaa8843360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156140f05780820151818401526020810190506140d5565b50505050905090810190601f16801561411d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060025481146141a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b6141b86141b3614579565b611e08565b61420d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615404602e913960400191505060405180910390fd5b603c6007600060018152602001908152602001600020819055506014600760006002815260200190815260200160002081905550600a60076000600381526020019081526020016000208190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600080600080600080600360008a81526020019081526020016000209050806006015481600a01600083600b0160008c81526020019081526020016000205481526020019081526020016000206001015482600a01600084600b0160008d815260200190815260200160002054815260200190815260200160002060030160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483600a01600085600b0160008e815260200190815260200160002054815260200190815260200160002060040160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1684600a01600086600b0160008f8152602001908152602001600020548152602001908152602001600020600201549550955095509550955050939792965093509350565b60056020528060005260406000206000915090505481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60076020528060005260406000206000915090505481565b600a6020528060005260406000206000915054906101000a900460ff1681565b6001600260008282540192505081905550600060025490506144fd83836144f8614579565b614897565b6002548114614574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b505050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153e26022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b614673816000614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f60405160405180910390a250565b6146cd81600d614d8f90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e60405160405180910390a250565b6000808314156147265760009050614793565b600082840290508284828161473757fe5b041461478e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153c16021913960400191505060405180910390fd5b809150505b92915050565b60006147db83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614e4c565b905092915050565b6147f7816000614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b61485181600d614f1290919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f860405160405180910390a250565b600060036000858152602001908152602001600020905060006004600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4e6f7420686f727365206f776e6572000000000000000000000000000000000081525060200191505060405180910390fd5b6003600481111561499457fe5b8260090160009054906101000a900460ff1660048111156149b157fe5b14614a24576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f52616365207374696c6c2072756e6e696e67000000000000000000000000000081525060200191505060405180910390fd5b81600a01600085815260200190815260200160002060040160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614add576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154326022913960400191505060405180910390fd5b600182600a01600086815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600082600a0160008681526020019081526020016000206002015490506000614ba76064614b996007600086815260200190815260200160002054876006015461471390919063ffffffff16565b61479990919063ffffffff16565b90508473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614bef573d6000803e3d6000fd5b50858373ffffffffffffffffffffffffffffffffffffffff16887fa3dd4a1386669cfcc372819ceaee69df2c1c14eb82976d79bd15c856666cb650846040518082815260200191505060405180910390a450505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614ccf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806152c66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f84c9efad00ae50fa2cbd9c51134e8a8454b889ed600dc5e5833df6ecdcc80d4f60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b614d998282614581565b614dee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061530f6021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008083118290614ef8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ebd578082015181840152602081019050614ea2565b50505050905090810190601f168015614eea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614f0457fe5b049050809150509392505050565b614f1c8282614581565b15614f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6040518061014001604052806060815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016000600481111561504857fe5b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061508f57805160ff19168380011785556150bd565b828001600101855582156150bd579182015b828111156150bc5782518255916020019190600101906150a1565b5b5090506150ca919061519b565b5090565b82805482825590600052602060002090810192821561510a579160200282015b828111156151095782518255916020019190600101906150ee565b5b509050615117919061519b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061515c57805160ff191683800117855561518a565b8280016001018555821561518a579182015b8281111561518957825182559160200191906001019061516e565b5b509050615197919061519b565b5090565b6151bd91905b808211156151b95760008160009055506001016151a1565b5090565b9056fe636c61696d416c6c57696e6e696e677348656c7065723a207261636549642061727261792073686f756c64206e6f7420626520656d7074792e636c61696d416c6c57696e6e696e677348656c7065723a20726163654964206172726179206c656e67746820697320626967676572207468616e2070726f7669646564206c696d69742e4f6e6c7920313520686f7273657320616c6c6f77656420706572207472616e736665726f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c627974657329506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526163696e6720636f6e7472616374206e6f74206f776e6572206f6620686f7273652e526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6552616365206e6f74206f6e2072656773206f722062657474696e67207374617465636c61696d416c6c57696e6e696e677348656c7065723a206c656e67746873206f66207261636569647320616e6420686f727365696473206172726179732073686f756c6420626520657175616c2e486f7273652063757272656e746c792061637469766520696e206120726163652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526f6c65733a206163636f756e7420697320746865207a65726f206164647265737341646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652041646d696e20726f6c6557696e6e696e6773206861766520616c7265616479206265656e20636c61696d6564486f7273652063757272656e746c792061637469766520696e2033207261636573486f72736520616c7265616479207265676973746572656420666f722074686973207261636552616365206973206e6f7420696e20726567697374726174696f6e207374617465a165627a7a723058206bf9b18135615c64d28842945084edc2ef3d9fe787080f9cbfdbf0f22a688a6d0029

Deployed Bytecode Sourcemap

17430:16356:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31787:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31787:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31787:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24361:787;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24361:787:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24361:787:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;24361:787:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24361:787:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24361:787:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;24361:787:0;;;;;;;;;;;;;;;:::i;:::-;;31408:271;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31408:271:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;31408:271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;31408:271:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31408:271:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;31408:271:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19008:831;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19008:831:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;19008:831:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19008:831:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19008:831:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19008:831:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;19008:831:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33090:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33090:197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33090:197:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33090:197:0;;;;;;;;;;;;;;;;;15653:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15653:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15653:49:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15653:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33295:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33295:118:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12455:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12455:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12455:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15290:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15290:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15290:40:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20997:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20997:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20997:104:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;4998:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4998:120:0;;;:::i;:::-;;2567:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2567:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2567:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23786:494;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23786:494:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23786:494:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;23786:494:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23786:494:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;23786:494:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;23786:494:0;;;;;;;;;;;;;;;:::i;:::-;;19909:817;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19909:817:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19909:817:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4205:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4205:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12667:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12667:97:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12667:97:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;2784:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2784:79:0;;;:::i;:::-;;21539:1347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21539:1347:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;21539:1347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;21539:1347:0;;;;;;;;;;;;;;:::i;:::-;;33567:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33567:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33567:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12570:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12570:89:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12570:89:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;14070:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14070:148:0;;;:::i;:::-;;15549:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15549:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15549:45:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2684:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2684:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2684:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;4785:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4785:118:0;;;:::i;:::-;;15028:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15028:37:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15028:37:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15028:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29053:647;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29053:647:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29053:647:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;29053:647:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29053:647:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29053:647:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;29053:647:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29053:647:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29053:647:0;;;;;;;;;;;;:::i;:::-;;25277:2161;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25277:2161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13724:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13724:102:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32119:311;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32119:311:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32119:311:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;15103:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15103:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15103:46:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33421:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33421:114:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14368:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14368:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14368:143:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;22894:764;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22894:764:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22894:764:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22894:764:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22894:764:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22894:764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;22894:764:0;;;;;;;;;;;;;;;:::i;:::-;;20734:255;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20734:255:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20734:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32538:544;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32538:544:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32538:544:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15182:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15182:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15182:53:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13306:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13306:95:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15406:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15406:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15406:54:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15769:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15769:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15769:47:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28563:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28563:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28563:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31787:172;31887:7;31919:5;:14;31925:7;31919:14;;;;;;;;;;;:25;;:32;31945:5;31919:32;;;;;;;;;;;;31912:39;;31787:172;;;;:::o;24361:787::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;24474:2;24455:9;:16;:21;24447:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24534:7;24544:1;24534:11;;24529:552;24551:9;:16;24547:1;:20;;;24529:552;;;24644:10;24615:39;;:11;:25;24627:9;24637:1;24627:12;;;;;;;;;;;;;;;;24615:25;;;;;;;;;;;;;;;;;;;;;:39;;;24589:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24791:1;24755:18;:32;24774:9;24784:1;24774:12;;;;;;;;;;;;;;;;24755:32;;;;;;;;;;;;:37;24729:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24914:1;24878:11;:25;24890:9;24900:1;24890:12;;;;;;;;;;;;;;;;24878:25;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;24940:4;;;;;;;;;;;24933:29;;;24989:4;25013:10;25042:9;25052:1;25042:12;;;;;;;;;;;;;;;;24933:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24933:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24933:136:0;;;;24569:3;;;;;;;24529:552;;;;25118:10;25098:42;;;25130:9;25098:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25098:42:0;;;;;;;;;;;;;;;;;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24361:787;;:::o;31408:271::-;31527:6;31596:60;;;;;;;;;;;;;;;;;;;31551:120;;31408:271;;;;;;;:::o;19008:831::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;4442:7;;;;;;;;;;;4441:8;4433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19312:1;19297:12;:16;19289:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19366:8;:17;19375:7;19366:17;;;;;;;;;;;;;;;;;;;;;19365:18;19357:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19415:16;;:::i;:::-;19457:7;19442:4;:12;;:22;;;;;19493:5;19475:4;:15;;:23;;;;19531:14;19509:4;:19;;:36;;;;;19576:12;19556:4;:17;;:32;;;;;19613:7;19599:4;:11;;:21;;;;;19649:18;19631:4;:15;;:36;;;;;;;;;;;;;;;;;;;;;;;19697:4;19680:5;:14;19686:7;19680:14;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19732:4;19712:8;:17;19721:7;19712:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;19793:7;19781:50;19802:5;19809:7;19818:12;19781:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19781:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4481:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;19008:831;;;;;:::o;33090:197::-;33180:16;33214:17;33234:5;:14;33240:7;33234:14;;;;;;;;;;;33214:34;;33268:4;:11;;33261:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33090:197;;;:::o;15653:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33295:118::-;33369:7;33401:4;;;;;;;;;;;33394:11;;33295:118;:::o;12455:107::-;12510:4;12534:20;12546:7;12534;:11;;:20;;;;:::i;:::-;12527:27;;12455:107;;;:::o;15290:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;20997:104::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21090:3;21085:2;;:8;;;;;;;;;;;;;;;;;;20997:104;:::o;4998:120::-;2464:22;2473:12;:10;:12::i;:::-;2464:8;:22::i;:::-;2456:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4641:7;;;;;;;;;;;4633:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5067:5;5057:7;;:15;;;;;;;;;;;;;;;;;;5088:22;5097:12;:10;:12::i;:::-;5088:22;;;;;;;;;;;;;;;;;;;;;;4998:120::o;2567:109::-;2623:4;2647:21;2660:7;2647:8;:12;;:21;;;;:::i;:::-;2640:28;;2567:109;;;:::o;23786:494::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;23898:2;23879:9;:16;:21;23871:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23958:7;23968:1;23958:11;;23953:261;23975:9;:16;23971:1;:20;;;23953:261;;;24041:10;24013:11;:25;24025:9;24035:1;24025:12;;;;;;;;;;;;;;;;24013:25;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;24073:4;;;;;;;;;;;24066:29;;;24114:10;24151:4;24175:9;24185:1;24175:12;;;;;;;;;;;;;;;;24066:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24066:136:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24066:136:0;;;;23993:3;;;;;;;23953:261;;;;24250:10;24231:41;;;24262:9;24231:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;24231:41:0;;;;;;;;;;;;;;;;;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23786:494;;:::o;19909:817::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;20068:17;20088:5;:14;20094:7;20088:14;;;;;;;;;;;20068:34;;20163:4;:19;;;20137:4;:22;;;:45;20115:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20290:18;20271:37;;;;;;;;:4;:15;;;;;;;;;;;;:37;;;;;;;;;20249:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20421:9;20415:3;:15;20402:10;:28;20380:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20547:10;20529:4;:15;;:28;;;;20586:13;20568:4;:15;;;:31;;;;;;;;;;;;;;;;;;;;;;;;20681:7;20667:51;20690:10;20702:4;:15;;20667:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11931:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;19909:817;;:::o;4205:78::-;4244:4;4268:7;;;;;;;;;;;4261:14;;4205:78;:::o;12667:97::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12735:21;12748:7;12735:12;:21::i;:::-;12667:97;:::o;2784:79::-;2828:27;2842:12;:10;:12::i;:::-;2828:13;:27::i;:::-;2784:79::o;21539:1347::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;21683:17;21703:5;:14;21709:7;21703:14;;;;;;;;;;;21683:34;;21794:13;21775:32;;;;;;;;:4;:15;;;;;;;;;;;;:32;;;;;;;;;21753:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21907:9;21901:3;:15;21882:4;:15;;;:34;;21874:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21974:11;21956:4;:15;;;:29;;;;;;;;;;;;;;;;;;;;;;;;22046:9;22058:1;22046:13;;22041:141;22065:4;:19;;;22061:1;:23;22041:141;;;22147:1;22114:4;:11;;:24;22126:8;22135:1;22126:11;;;;;;;;;;;22114:24;;;;;;;;;;;:29;;;:34;;22106:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22086:3;;;;;;;22041:141;;;;22256:9;22268:1;22256:13;;22251:172;22275:4;:19;;;22271:1;:23;22251:172;;;22362:1;22358;:5;22316:4;:11;;:24;22328:8;22337:1;22328:11;;;;;;;;;;;22316:24;;;;;;;;;;;:39;;:47;;;;22378:18;:31;22397:8;22406:1;22397:11;;;;;;;;;;;22378:31;;;;;;;;;;;;:33;;;;;;;;;;;;;;22296:3;;;;;;;22251:172;;;;22476:9;22488:1;22476:13;;22471:212;22495:4;:19;;;22491:1;:23;22471:212;;;22609:1;22605;:5;22562:4;:11;;:24;22574:8;22583:1;22574:11;;;;;;;;;;;22562:24;;;;;;;;;;;:39;;;:48;22536:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22516:3;;;;;;;22471:212;;;;22745:11;:9;:11::i;:::-;:20;;:54;22766:32;22794:3;22766:23;22786:2;22766:4;:15;;;:19;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;22745:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22745:54:0;22831:7;22817:61;22840:8;22849:1;22840:11;;;;;;;;;;;22853:8;22862:1;22853:11;;;;;;;;;;;22866:8;22875:1;22866:11;;;;;;;;;;;22817:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11931:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;21539:1347;;:::o;33567:178::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33726:11;33693:19;:30;33713:9;33693:30;;;;;;;;;;;:44;;;;33567:178;;:::o;12570:89::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12633:18;12643:7;12633:9;:18::i;:::-;12570:89;:::o;14070:148::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14173:1;14132:44;;14153:10;;;;;;;;;;;14132:44;;;;;;;;;;;;14208:1;14187:10;;:23;;;;;;;;;;;;;;;;;;14070:148::o;15549:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;2684:92::-;2464:22;2473:12;:10;:12::i;:::-;2464:8;:22::i;:::-;2456:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2749:19;2760:7;2749:10;:19::i;:::-;2684:92;:::o;4785:118::-;2464:22;2473:12;:10;:12::i;:::-;2464:8;:22::i;:::-;2456:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4442:7;;;;;;;;;;;4441:8;4433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4855:4;4845:7;;:14;;;;;;;;;;;;;;;;;;4875:20;4882:12;:10;:12::i;:::-;4875:20;;;;;;;;;;;;;;;;;;;;;;4785:118::o;15028:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29053:647::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;29228:1;29210:8;;:15;;:19;29202:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29328:3;29310:8;;:15;;:21;29302:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29448:9;;:16;;29429:8;;:15;;:35;29421:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29566:9;29578:1;29566:13;;29561:132;29585:8;;:15;;29581:1;:19;29561:132;;;29622:59;29641:8;;29650:1;29641:11;;;;;;;;;;;;;29654:9;;29664:1;29654:12;;;;;;;;;;;;;29668;:10;:12::i;:::-;29622:18;:59::i;:::-;29602:3;;;;;;;29561:132;;;;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29053:647;;;;;:::o;25277:2161::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;4442:7;;;;;;;;;;;4441:8;4433:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:17;25467:5;:14;25473:7;25467:14;;;;;;;;;;;25447:34;;25539:4;:17;;;25526:9;:30;;25518:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25633:18;25614:37;;;;;;;;:4;:15;;;;;;;;;;;;:37;;;;;;;;;25592:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25769:4;:19;;;25744:4;:22;;;:44;25722:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25879:1;25864:11;:16;;25856:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25958:4;:19;;;25943:11;:34;;25921:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26053:4;:18;;:31;26072:11;26053:31;;;;;;;;;;;;;;;;;;;;;26052:32;26044:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26178:1;26147:18;:28;26166:8;26147:28;;;;;;;;;;;;:32;26125:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26303:1;26273:4;:11;;:21;26285:8;26273:21;;;;;;;;;;;:26;;;:31;26251:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26445:4;26403:47;;26410:4;;;;;;;;;;;26403:20;;;26424:8;26403:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26403:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26403:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26403:30:0;;;;;;;;;;;;;;;;:47;;;26381:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26598:18;:28;26617:8;26598:28;;;;;;;;;;;;:30;;;;;;;;;;;;;26639:4;:22;;;:24;;;;;;;;;;;;;26698;;;;;;;;26704:11;26698:24;;;;26717:1;26698:24;;;;26720:1;26698:24;;;26674:4;:11;;:21;26686:8;26674:21;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;26764:8;26733:4;:15;;:28;26749:11;26733:28;;;;;;;;;;;:39;;;;26858:4;26824;:18;;:31;26843:11;26824:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;26973:4;:17;;;26954:4;:15;;;:36;;;;;;;;;;;27036:4;:17;;;27001:4;:11;;:21;27013:8;27001:21;;;;;;;;;;;:31;;;:52;;;;;;;;;;;27112:4;:17;;;27064:4;:11;;:21;27076:8;27064:21;;;;;;;;;;;:32;;:44;27097:10;27064:44;;;;;;;;;;;;;;;;:65;;;;;;;;;;;27140:4;:11;;27157:8;27140:26;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27140:26:0;;;;;;;;;;;;;;;;;;;;;;27209:4;:19;;;27183:4;:22;;;:45;27179:100;;;27259:7;27250:17;;;;;;;;;;27179:100;27333:8;27321:10;27296:59;;27312:7;27296:59;27343:11;27296:59;;;;;;;;;;;;;;;;;;27421:8;27390:10;27371:59;;27381:7;27371:59;27402:4;:17;;;27371:59;;;;;;;;;;;;;;;;;;4481:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25277:2161;;;;:::o;13724:102::-;13768:4;13808:10;;;;;;;;;;;13792:26;;:12;:10;:12::i;:::-;:26;;;13785:33;;13724:102;:::o;32119:311::-;32221:7;32230;32255:17;32275:5;:14;32281:7;32275:14;;;;;;;;;;;32255:34;;32324:4;:15;;:22;32340:5;32324:22;;;;;;;;;;;;32361:4;:11;;:35;32373:4;:15;;:22;32389:5;32373:22;;;;;;;;;;;;32361:35;;;;;;;;;;;:50;;;32302:120;;;;;32119:311;;;;;:::o;15103:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;33421:114::-;33493:7;33525:2;;;;;;;;;;;33518:9;;33421:114;:::o;14368:143::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14462:41;14490:12;14462:27;:41::i;:::-;14368:143;:::o;22894:764::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;23031:17;23051:5;:14;23057:7;23051:14;;;;;;;;;;;23031:34;;23143:18;23124:37;;;;;;;;:4;:15;;;;;;;;;;;;:37;;;;;;;;;:90;;;;23201:13;23182:32;;;;;;;;:4;:15;;;;;;;;;;;;:32;;;;;;;;;23124:90;23102:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23306:15;23288:4;:15;;;:33;;;;;;;;;;;;;;;;;;;;;;;;23361:7;23334:15;:24;23350:7;23334:24;;;;;;;;;;;:34;;;;;;;;;;;;:::i;:::-;;23479:9;23491:1;23479:13;;23474:116;23498:4;:22;;;23494:1;:26;23474:116;;;23542:18;:34;23561:4;:11;;23573:1;23561:14;;;;;;;;;;;;;;;;23542:34;;;;;;;;;;;;:36;;;;;;;;;;;;;;23522:3;;;;;;;23474:116;;;;23621:7;23607:43;23630:7;23639:10;23607:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23607:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11931:1;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12438:1;22894:764;;:::o;20734:255::-;12355:21;12363:12;:10;:12::i;:::-;12355:7;:21::i;:::-;12347:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20859:2;20834:19;:22;20854:1;20834:22;;;;;;;;;;;:27;;;;20897:2;20872:19;:22;20892:1;20872:22;;;;;;;;;;;:27;;;;20935:2;20910:19;:22;20930:1;20910:22;;;;;;;;;;;:27;;;;20955:3;20950:2;;:8;;;;;;;;;;;;;;;;;;20976:5;20969:4;;:12;;;;;;;;;;;;;;;;;;20734:255;;:::o;32538:544::-;32655:7;32664;32673;32682:4;32688:7;32713:17;32733:5;:14;32739:7;32733:14;;;;;;;;;;;32713:34;;32782:4;:15;;;32812:4;:11;;:35;32824:4;:15;;:22;32840:5;32824:22;;;;;;;;;;;;32812:35;;;;;;;;;;;:45;;;32872:4;:11;;:35;32884:4;:15;;:22;32900:5;32884:22;;;;;;;;;;;;32872:35;;;;;;;;;;;:46;;:55;32919:7;32872:55;;;;;;;;;;;;;;;;32942:4;:11;;:35;32954:4;:15;;:22;32970:5;32954:22;;;;;;;;;;;;32942:35;;;;;;;;;;;:47;;:56;32990:7;32942:56;;;;;;;;;;;;;;;;;;;;;;;;;33013:4;:11;;:35;33025:4;:15;;:22;33041:5;33025:22;;;;;;;;;;;;33013:35;;;;;;;;;;;:50;;;32760:314;;;;;;;;;;;32538:544;;;;;;;;;:::o;15182:53::-;;;;;;;;;;;;;;;;;:::o;13306:95::-;13348:15;13383:10;;;;;;;;;;;13376:17;;13306:95;:::o;15406:54::-;;;;;;;;;;;;;;;;;:::o;15769:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;28563:181::-;11872:1;11855:13;;:18;;;;;;;;;;;11884:20;11907:13;;11884:36;;28685:51;28704:7;28713:8;28723:12;:10;:12::i;:::-;28685:18;:51::i;:::-;11967:13;;11951:12;:29;11943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28563:181;;;:::o;806:98::-;851:15;886:10;879:17;;806:98;:::o;1927:203::-;1999:4;2043:1;2024:21;;:7;:21;;;;2016:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2102:4;:11;;:20;2114:7;2102:20;;;;;;;;;;;;;;;;;;;;;;;;;2095:27;;1927:203;;;;:::o;12899:127::-;12958:23;12973:7;12958;:14;;:23;;;;:::i;:::-;13010:7;12997:21;;;;;;;;;;;;12899:127;:::o;3001:130::-;3061:24;3077:7;3061:8;:15;;:24;;;;:::i;:::-;3115:7;3101:22;;;;;;;;;;;;3001:130;:::o;7329:471::-;7387:7;7637:1;7632;:6;7628:47;;;7662:1;7655:8;;;;7628:47;7687:9;7703:1;7699;:5;7687:17;;7732:1;7727;7723;:5;;;;;;:10;7715:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7791:1;7784:8;;;7329:471;;;;;:::o;8268:132::-;8326:7;8353:39;8357:1;8360;8353:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8346:46;;8268:132;;;;:::o;12772:119::-;12828:20;12840:7;12828;:11;;:20;;;;:::i;:::-;12875:7;12864:19;;;;;;;;;;;;12772:119;:::o;2871:122::-;2928:21;2941:7;2928:8;:12;;:21;;;;:::i;:::-;2977:7;2965:20;;;;;;;;;;;;2871:122;:::o;29760:1025::-;29881:17;29901:5;:14;29907:7;29901:14;;;;;;;;;;;29881:34;;29926:18;29947:11;:21;29959:8;29947:21;;;;;;;;;;;;;;;;;;;;;29926:42;;30102:10;30091:21;;:7;:21;;;30083:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30170:11;30151:30;;;;;;;;:4;:15;;;;;;;;;;;;:30;;;;;;;;;30143:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30238:4;:11;;:21;30250:8;30238:21;;;;;;;;;;;:33;;:45;30272:10;30238:45;;;;;;;;;;;;;;;;;;;;;;;;;30237:46;30215:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30406:4;30358;:11;;:21;30370:8;30358:21;;;;;;;;;;;:33;;:45;30392:10;30358:45;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;30423:21;30447:4;:11;;:21;30459:8;30447:21;;;;;;;;;;;:36;;;30423:60;;30536:18;30557:106;30659:3;30557:83;30605:19;:34;30625:13;30605:34;;;;;;;;;;;;30557:4;:29;;;:47;;:83;;;;:::i;:::-;:101;;:106;;;;:::i;:::-;30536:127;;30676:7;:16;;:28;30693:10;30676:28;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30676:28:0;30768:8;30744:10;30722:55;;30735:7;30722:55;30756:10;30722:55;;;;;;;;;;;;;;;;;;29760:1025;;;;;;;:::o;14623:270::-;14742:1;14718:26;;:12;:26;;;;14710:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14836:12;14803:46;;14824:10;;;;;;;;;;;14803:46;;;;;;;;;;;;14873:12;14860:10;;:25;;;;;;;;;;;;;;;;;;14623:270;:::o;1649:183::-;1729:18;1733:4;1739:7;1729:3;:18::i;:::-;1721:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1819:5;1796:4;:11;;:20;1808:7;1796:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;1649:183;;:::o;8930:345::-;9016:7;9115:1;9111;:5;9118:12;9103:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9103:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9142:9;9158:1;9154;:5;;;;;;9142:17;;9266:1;9259:8;;;8930:345;;;;;:::o;1391:178::-;1469:18;1473:4;1479:7;1469:3;:18::i;:::-;1468:19;1460:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1557:4;1534;:11;;:20;1546:7;1534:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;1391:178;;:::o;17430:16356::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://6bf9b18135615c64d28842945084edc2ef3d9fe787080f9cbfdbf0f22a688a6d

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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