ETH Price: $3,085.40 (-1.15%)

Token

TenX Token (TENX)
 

Overview

Max Total Supply

134,522,547.089763154246025113 TENX

Holders

5,260

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
246.2839 TENX

Value
$0.00
0x7e6a1061039fb2d92881c1a533f6e5134c393a12
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

TenX connects your blockchain assets for everyday use. TenX’s debit card and banking licence will allow us to be a hub for the blockchain ecosystem to connect for real-world use cases.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TENXToken

Compiler Version
v0.5.4+commit.9549d8ff

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-06-12
*/

// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.2;

/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.2;


/**
 * @title ERC20Detailed token
 * @dev The decimals are only for visualization purposes.
 * All the operations are done using the smallest and indivisible token unit,
 * just as on Ethereum all the operations are done in wei.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @return the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @return the symbol of the token.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @return the number of decimals of the token.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

// File: openzeppelin-solidity/contracts/access/Roles.sol

pragma solidity ^0.5.2;

/**
 * @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(account != address(0));
        require(!has(role, account));

        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        require(has(role, account));

        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));
        return role.bearer[account];
    }
}

// File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol

pragma solidity ^0.5.2;


contract PauserRole {
    using Roles for Roles.Role;

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

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender));
        _;
    }

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

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

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

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

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

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.5.2;


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is PauserRole {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () internal {
        _paused = false;
    }

    /**
     * @return true if the contract is paused, 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);
        _;
    }

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

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

// File: contracts/interfaces/IModerator.sol

pragma solidity 0.5.4;


interface IModerator {
    function verifyIssue(address _tokenHolder, uint256 _value, bytes calldata _data) external view
        returns (bool allowed, byte statusCode, bytes32 applicationCode);

    function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external view 
        returns (bool allowed, byte statusCode, bytes32 applicationCode);

    function verifyTransferFrom(address _from, address _to, address _forwarder, uint256 _amount, bytes calldata _data) external view 
        returns (bool allowed, byte statusCode, bytes32 applicationCode);

    function verifyRedeem(address _sender, uint256 _amount, bytes calldata _data) external view 
        returns (bool allowed, byte statusCode, bytes32 applicationCode);

    function verifyRedeemFrom(address _sender, address _tokenHolder, uint256 _amount, bytes calldata _data) external view
        returns (bool allowed, byte statusCode, bytes32 applicationCode);        

    function verifyControllerTransfer(address _controller, address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external view
        returns (bool allowed, byte statusCode, bytes32 applicationCode);

    function verifyControllerRedeem(address _controller, address _tokenHolder, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external view
        returns (bool allowed, byte statusCode, bytes32 applicationCode);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.2;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     * @notice Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.2;

/**
 * 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;
    }
}

// File: contracts/interfaces/IRewardsUpdatable.sol

pragma solidity 0.5.4;


interface IRewardsUpdatable {
    event NotifierUpdated(address implementation);

    function updateOnTransfer(address from, address to, uint amount) external returns (bool);
    function updateOnBurn(address account, uint amount) external returns (bool);
    function setRewardsNotifier(address notifier) external;
}

// File: contracts/interfaces/IRewardable.sol

pragma solidity 0.5.4;



interface IRewardable {
    event RewardsUpdated(address implementation);

    function setRewards(IRewardsUpdatable rewards) external;
}

// File: contracts/rewards/Rewardable.sol

pragma solidity 0.5.4;







/**
 * @notice A contract with an associated Rewards contract to calculate rewards during token movements.
 */
contract Rewardable is IRewardable, Ownable {
    using SafeMath for uint;

    IRewardsUpdatable public rewards; // The rewards contract

    event RewardsUpdated(address implementation);

    /**
    * @notice Calculates and updates _dampings[address] based on the token movement.
    * @notice This modifier is applied to mint(), transfer(), and transferFrom().
    * @param _from Address of sender
    * @param _to Address of recipient
    * @param _value Amount of tokens
    */
    modifier updatesRewardsOnTransfer(address _from, address _to, uint _value) {
        _;
        require(rewards.updateOnTransfer(_from, _to, _value), "Rewards updateOnTransfer failed."); // [External contract call]
    }

    /**
    * @notice Calculates and updates _dampings[address] based on the token burning.
    * @notice This modifier is applied to burn()
    * @param _account Address of owner
    * @param _value Amount of tokens
    */
    modifier updatesRewardsOnBurn(address _account, uint _value) {
        _;
        require(rewards.updateOnBurn(_account, _value), "Rewards updateOnBurn failed."); // [External contract call]
    }

    /**
    * @notice Links a Rewards contract to this contract.
    * @param _rewards Rewards contract address.
    */
    function setRewards(IRewardsUpdatable _rewards) external onlyOwner {
        require(address(_rewards) != address(0), "Rewards address must not be a zero address.");
        require(Address.isContract(address(_rewards)), "Address must point to a contract.");
        rewards = _rewards;
        emit RewardsUpdated(address(_rewards));
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.2;



/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://eips.ethereum.org/EIPS/eip-20
 * Originally based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 *
 * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for
 * all accounts just by listening to said events. Note that this isn't required by the specification, and other
 * compliant implementations may not do it.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowed;

    uint256 private _totalSupply;

    /**
     * @dev Total number of tokens in existence
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner The address to query the balance of.
     * @return A uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address owner) public view returns (uint256) {
        return _balances[owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowed[owner][spender];
    }

    /**
     * @dev Transfer token to a specified address
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        _transfer(from, to, value);
        _approve(from, msg.sender, _allowed[from][msg.sender].sub(value));
        return true;
    }

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

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when _allowed[msg.sender][spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Transfer token for a specified addresses
     * @param from The address to transfer from.
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function _transfer(address from, address to, uint256 value) internal {
        require(to != address(0));

        _balances[from] = _balances[from].sub(value);
        _balances[to] = _balances[to].add(value);
        emit Transfer(from, to, value);
    }

    /**
     * @dev Internal function that mints an amount of the token and assigns it to
     * an account. This encapsulates the modification of balances such that the
     * proper events are emitted.
     * @param account The account that will receive the created tokens.
     * @param value The amount that will be created.
     */
    function _mint(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.add(value);
        _balances[account] = _balances[account].add(value);
        emit Transfer(address(0), account, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Approve an address to spend another addresses' tokens.
     * @param owner The address that owns the tokens.
     * @param spender The address that will spend the tokens.
     * @param value The number of tokens that can be spent.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(spender != address(0));
        require(owner != address(0));

        _allowed[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burnFrom(address account, uint256 value) internal {
        _burn(account, value);
        _approve(account, msg.sender, _allowed[account][msg.sender].sub(value));
    }
}

// File: contracts/token/ERC20Redeemable.sol

pragma solidity 0.5.4;




contract ERC20Redeemable is ERC20 {
    using SafeMath for uint256;

    uint256 public totalRedeemed;

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account. Overriden to track totalRedeemed.
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burn(address account, uint256 value) internal {
        totalRedeemed = totalRedeemed.add(value); // Keep track of total for Rewards calculation
        super._burn(account, value);
    }
}

// File: contracts/interfaces/IERC1594.sol

pragma solidity 0.5.4;


/// @title IERC1594 Security Token Standard
/// @dev See https://github.com/SecurityTokenStandard/EIP-Spec
interface IERC1594 {
    // Issuance / Redemption Events
    event Issued(address indexed _operator, address indexed _to, uint256 _value, bytes _data);
    event Redeemed(address indexed _operator, address indexed _from, uint256 _value, bytes _data);

    // Transfers
    function transferWithData(address _to, uint256 _value, bytes calldata _data) external;
    function transferFromWithData(address _from, address _to, uint256 _value, bytes calldata _data) external;

    // Token Redemption
    function redeem(uint256 _value, bytes calldata _data) external;
    function redeemFrom(address _tokenHolder, uint256 _value, bytes calldata _data) external;

    // Token Issuance
    function issue(address _tokenHolder, uint256 _value, bytes calldata _data) external;
    function isIssuable() external view returns (bool);

    // Transfer Validity
    function canTransfer(address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32);
    function canTransferFrom(address _from, address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32);
}

// File: contracts/interfaces/IHasIssuership.sol

pragma solidity 0.5.4;


interface IHasIssuership {
    event IssuershipTransferred(address indexed from, address indexed to);

    function transferIssuership(address newIssuer) external;
}

// File: contracts/roles/IssuerRole.sol

pragma solidity 0.5.4;



// @notice Issuers are capable of issuing new TENX tokens from the TENXToken contract.
contract IssuerRole {
    using Roles for Roles.Role;

    event IssuerAdded(address indexed account);
    event IssuerRemoved(address indexed account);

    Roles.Role internal _issuers;

    modifier onlyIssuer() {
        require(isIssuer(msg.sender), "Only Issuers can execute this function.");
        _;
    }

    constructor() internal {
        _addIssuer(msg.sender);
    }

    function isIssuer(address account) public view returns (bool) {
        return _issuers.has(account);
    }

    function addIssuer(address account) public onlyIssuer {
        _addIssuer(account);
    }

    function renounceIssuer() public {
        _removeIssuer(msg.sender);
    }

    function _addIssuer(address account) internal {
        _issuers.add(account);
        emit IssuerAdded(account);
    }

    function _removeIssuer(address account) internal {
        _issuers.remove(account);
        emit IssuerRemoved(account);
    }
}

// File: contracts/roles/ControllerRole.sol

pragma solidity 0.5.4;



// @notice Controllers are capable of performing ERC1644 forced transfers.
contract ControllerRole {
    using Roles for Roles.Role;

    event ControllerAdded(address indexed account);
    event ControllerRemoved(address indexed account);

    Roles.Role internal _controllers;

    modifier onlyController() {
        require(isController(msg.sender), "Only Controllers can execute this function.");
        _;
    }

    constructor() internal {
        _addController(msg.sender);
    }

    function isController(address account) public view returns (bool) {
        return _controllers.has(account);
    }

    function addController(address account) public onlyController {
        _addController(account);
    }

    function renounceController() public {
        _removeController(msg.sender);
    }

    function _addController(address account) internal {
        _controllers.add(account);
        emit ControllerAdded(account);
    }    

    function _removeController(address account) internal {
        _controllers.remove(account);
        emit ControllerRemoved(account);
    }
}

// File: contracts/compliance/Moderated.sol

pragma solidity 0.5.4;





contract Moderated is ControllerRole {
    IModerator public moderator; // External moderator contract

    event ModeratorUpdated(address moderator);

    constructor(IModerator _moderator) public {
        moderator = _moderator;
    }

    /**
    * @notice Links a Moderator contract to this contract.
    * @param _moderator Moderator contract address.
    */
    function setModerator(IModerator _moderator) external onlyController {
        require(address(moderator) != address(0), "Moderator address must not be a zero address.");
        require(Address.isContract(address(_moderator)), "Address must point to a contract.");
        moderator = _moderator;
        emit ModeratorUpdated(address(_moderator));
    }
}

// File: contracts/token/ERC1594.sol

pragma solidity 0.5.4;








contract ERC1594 is IERC1594, IHasIssuership, Moderated, ERC20Redeemable, IssuerRole {
    bool public isIssuable = true;

    event Issued(address indexed operator, address indexed to, uint256 value, bytes data);
    event Redeemed(address indexed operator, address indexed from, uint256 value, bytes data);
    event IssuershipTransferred(address indexed from, address indexed to);
    event IssuanceFinished();

    /**
    * @notice Modifier to check token issuance status
    */
    modifier whenIssuable() {
        require(isIssuable, "Issuance period has ended.");
        _;
    }

    /**
     * @notice Transfer the token's singleton Issuer role to another address.
     */
    function transferIssuership(address _newIssuer) public whenIssuable onlyIssuer {
        require(_newIssuer != address(0), "New Issuer cannot be zero address.");
        require(msg.sender != _newIssuer, "New Issuer cannot have the same address as the old issuer.");
        _addIssuer(_newIssuer);
        _removeIssuer(msg.sender);
        emit IssuershipTransferred(msg.sender, _newIssuer);
    }

    /**
     * @notice End token issuance period permanently.
     */
    function finishIssuance() public whenIssuable onlyIssuer {
        isIssuable = false;
        emit IssuanceFinished();
    }

    function issue(address _tokenHolder, uint256 _value, bytes memory _data) public whenIssuable onlyIssuer {
        bool allowed;
        (allowed, , ) = moderator.verifyIssue(_tokenHolder, _value, _data);
        require(allowed, "Issue is not allowed.");
        _mint(_tokenHolder, _value);
        emit Issued(msg.sender, _tokenHolder, _value, _data);
    }

    function redeem(uint256 _value, bytes memory _data) public {
        bool allowed;
        (allowed, , ) = moderator.verifyRedeem(msg.sender, _value, _data);
        require(allowed, "Redeem is not allowed.");

        _burn(msg.sender, _value);
        emit Redeemed(msg.sender, msg.sender, _value, _data);
    }

    function redeemFrom(address _tokenHolder, uint256 _value, bytes memory _data) public {
        bool allowed;
        (allowed, , ) = moderator.verifyRedeemFrom(msg.sender, _tokenHolder, _value, _data);
        require(allowed, "RedeemFrom is not allowed.");

        _burnFrom(_tokenHolder, _value);
        emit Redeemed(msg.sender, _tokenHolder, _value, _data);
    }

    function transfer(address _to, uint256 _value) public returns (bool success) {
        bool allowed;
        (allowed, , ) = canTransfer(_to, _value, "");
        require(allowed, "Transfer is not allowed.");

        success = super.transfer(_to, _value);
    }

    function transferWithData(address _to, uint256 _value, bytes memory _data) public {
        bool allowed;
        (allowed, , ) = canTransfer(_to, _value, _data);
        require(allowed, "Transfer is not allowed.");

        require(super.transfer(_to, _value), "Transfer failed.");
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        bool allowed;
        (allowed, , ) = canTransferFrom(_from, _to, _value, "");
        require(allowed, "TransferFrom is not allowed.");

        success = super.transferFrom(_from, _to, _value);
    }    

    function transferFromWithData(address _from, address _to, uint256 _value, bytes memory _data) public {
        bool allowed;
        (allowed, , ) = canTransferFrom(_from, _to, _value, _data);
        require(allowed, "TransferFrom is not allowed.");

        require(super.transferFrom(_from, _to, _value), "TransferFrom failed.");
    }

    function canTransfer(address _to, uint256 _value, bytes memory _data) public view 
        returns (bool success, byte statusCode, bytes32 applicationCode) 
    {
        return moderator.verifyTransfer(msg.sender, _to, _value, _data);
    }

    function canTransferFrom(address _from, address _to, uint256 _value, bytes memory _data) public view 
        returns (bool success, byte statusCode, bytes32 applicationCode) 
    {
        return moderator.verifyTransferFrom(_from, _to, msg.sender, _value, _data);
    }
}

// File: contracts/interfaces/IERC1644.sol

pragma solidity 0.5.4;



/// @title IERC1644 Controller Token Operation (part of the ERC1400 Security Token Standards)
/// @dev See https://github.com/SecurityTokenStandard/EIP-Spec
interface IERC1644 {
    // Controller Events
    event ControllerTransfer(
        address _controller,
        address indexed _from,
        address indexed _to,
        uint256 _value,
        bytes _data,
        bytes _operatorData
    );

    event ControllerRedemption(
        address _controller,
        address indexed _tokenHolder,
        uint256 _value,
        bytes _data,
        bytes _operatorData
    );

    // Controller Operation
    function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external;
    function controllerRedeem(address _tokenHolder, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external;
    function isControllable() external view returns (bool);
}

// File: contracts/token/ERC1644.sol

pragma solidity 0.5.4;







contract ERC1644 is IERC1644, Moderated, ERC20Redeemable {
    event ControllerTransfer(
        address controller,
        address indexed from,
        address indexed to,
        uint256 value,
        bytes data,
        bytes operatorData
    );

    event ControllerRedemption(
        address controller,
        address indexed tokenHolder,
        uint256 value,
        bytes data,
        bytes operatorData
    );

    function controllerTransfer(
        address _from,
        address _to,
        uint256 _value,
        bytes memory _data,
        bytes memory _operatorData
    ) public onlyController {
        bool allowed;
        (allowed, , ) = moderator.verifyControllerTransfer(
            msg.sender,
            _from,
            _to,
            _value,
            _data,
            _operatorData
        );
        require(allowed, "controllerTransfer is not allowed.");
        require(_value <= balanceOf(_from), "Insufficient balance.");
        _transfer(_from, _to, _value);
        emit ControllerTransfer(msg.sender, _from, _to, _value, _data, _operatorData);
    }

    function controllerRedeem(
        address _tokenHolder,
        uint256 _value,
        bytes memory _data,
        bytes memory _operatorData
    ) public onlyController {
        bool allowed;
        (allowed, , ) = moderator.verifyControllerRedeem(
            msg.sender,
            _tokenHolder,
            _value,
            _data,
            _operatorData
        );
        require(allowed, "controllerRedeem is not allowed.");
        require(_value <= balanceOf(_tokenHolder), "Insufficient balance.");
        _burn(_tokenHolder, _value);
        emit ControllerRedemption(msg.sender, _tokenHolder, _value, _data, _operatorData);
    }

    function isControllable() public view returns (bool) {
        return true;
    }
}

// File: contracts/token/ERC1400.sol

pragma solidity 0.5.4;





contract ERC1400 is ERC1594, ERC1644 {
    constructor(IModerator _moderator) public Moderated(_moderator) {}
}

// File: contracts/token/ERC20Capped.sol

pragma solidity 0.5.4;




/**
 * @notice Capped ERC20 token
 * @dev ERC20 token with a token cap on mints, to ensure a 1:1 mint ratio of TENX to PAY.
 */
contract ERC20Capped is ERC20 {
    using SafeMath for uint256;

    uint public cap;
    uint public totalMinted;

    constructor (uint _cap) public {
        require(_cap > 0, "Cap must be above zero.");
        cap = _cap;
        totalMinted = 0;
    }

    /**
    * @notice Modifier to check that an operation does not exceed the token cap.
    * @param _newValue Token mint amount
    */
    modifier capped(uint _newValue) {
        require(totalMinted.add(_newValue) <= cap, "Cannot mint beyond cap.");
        _;
    }

    /**
    * @dev Cannot _mint beyond cap.
    */
    function _mint(address _account, uint _value) internal capped(_value) {
        totalMinted = totalMinted.add(_value);
        super._mint(_account, _value);
    }
}

// File: contracts/token/RewardableToken.sol

pragma solidity 0.5.4;







/**
 * @notice RewardableToken
 * @dev ERC1400 token with a token cap and amortized rewards calculations. It's pausable for contract migrations.
 */
contract RewardableToken is ERC1400, ERC20Capped, Rewardable, Pausable {
    constructor(IModerator _moderator, uint _cap) public ERC1400(_moderator) ERC20Capped(_cap) {}

    // ERC20
    function transfer(address _to, uint _value) 
        public 
        whenNotPaused
        updatesRewardsOnTransfer(msg.sender, _to, _value) returns (bool success) 
    {
        success = super.transfer(_to, _value);
    }

    function transferFrom(address _from, address _to, uint _value) 
        public 
        whenNotPaused
        updatesRewardsOnTransfer(_from, _to, _value) returns (bool success) 
    {
        success = super.transferFrom(_from, _to, _value);
    }

    // ERC1400: ERC1594
    function issue(address _tokenHolder, uint256 _value, bytes memory _data) 
        public 
        whenNotPaused
        // No damping updates, uses unallocated rewards
    {
        super.issue(_tokenHolder, _value, _data);
    }

    function redeem(uint256 _value, bytes memory _data) 
        public 
        whenNotPaused
        updatesRewardsOnBurn(msg.sender, _value)
    {
        super.redeem(_value, _data);
    }

    function redeemFrom(address _tokenHolder, uint256 _value, bytes memory _data) 
        public
        whenNotPaused
        updatesRewardsOnBurn(_tokenHolder, _value)
    {
        super.redeemFrom(_tokenHolder, _value, _data);
    }

    // ERC1400: ERC1644
    function controllerTransfer(address _from, address _to, uint256 _value, bytes memory _data, bytes memory _operatorData) 
        public
        updatesRewardsOnTransfer(_from, _to, _value) 
    {
        super.controllerTransfer(_from, _to, _value, _data, _operatorData);
    }

    function controllerRedeem(address _tokenHolder, uint256 _value, bytes memory _data, bytes memory _operatorData) 
        public
        updatesRewardsOnBurn(_tokenHolder, _value)
    {
        super.controllerRedeem(_tokenHolder, _value, _data, _operatorData);
    }
}

// File: contracts/token/TENXToken.sol

pragma solidity 0.5.4;





/**
 * @notice TENXToken
 */
contract TENXToken is RewardableToken, ERC20Detailed("TenX Token", "TENX", 18) {
    constructor(IModerator _moderator, uint _cap) public RewardableToken(_moderator, _cap) {}
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"canTransferFrom","outputs":[{"name":"success","type":"bool"},{"name":"statusCode","type":"bytes1"},{"name":"applicationCode","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"canTransfer","outputs":[{"name":"success","type":"bool"},{"name":"statusCode","type":"bytes1"},{"name":"applicationCode","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferWithData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenHolder","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"controllerRedeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isIssuable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"moderator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"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":true,"inputs":[],"name":"isControllable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"setModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isIssuer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenHolder","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"redeemFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newIssuer","type":"address"}],"name":"transferIssuership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewards","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalMinted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isController","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenHolder","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"issue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishIssuance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"transferFromWithData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"controllerTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalRedeemed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_moderator","type":"address"},{"name":"_cap","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":false,"name":"implementation","type":"address"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"controller","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"ControllerTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"controller","type":"address"},{"indexed":true,"name":"tokenHolder","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"ControllerRedemption","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Issued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"}],"name":"IssuershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"IssuanceFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"IssuerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"IssuerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"moderator","type":"address"}],"name":"ModeratorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"ControllerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"ControllerRemoved","type":"event"}]

60806040526007805460ff191660011790553480156200001e57600080fd5b5060405160408062003f8f833981018060405260408110156200004057600080fd5b508051602091820151604080518082018252600a81527f54656e5820546f6b656e00000000000000000000000000000000000000000000818601528151808301909252600482527f54454e5800000000000000000000000000000000000000000000000000000000948201949094529192909160128484808280620000ce3364010000000062000232810204565b60018054600160a060020a031916600160a060020a0392909216919091179055620001023364010000000062000284810204565b50600081116200017357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436170206d7573742062652061626f7665207a65726f2e000000000000000000604482015290519081900360640190fd5b60085560006009819055600a8054600160a060020a031916331790819055604051600160a060020a039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3620001db33640100000000620002d6810204565b5050600d805460ff191690558251620001fc90600e906020860190620003bb565b5081516200021290600f906020850190620003bb565b506010805460ff191660ff92909216919091179055506200046092505050565b6200024d600082640100000000620035f26200032882021704565b604051600160a060020a038216907f0a8bb31534c0ed46f380cb867bd5c803a189ced9a764e30b3a4991a9901d747490600090a250565b6200029f600682640100000000620035f26200032882021704565b604051600160a060020a038216907f05e7c881d716bee8cb7ed92293133ba156704252439e5c502c277448f04e20c290600090a250565b620002f1600c82640100000000620035f26200032882021704565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b600160a060020a03811615156200033e57600080fd5b62000353828264010000000062000383810204565b156200035e57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000600160a060020a03821615156200039b57600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003fe57805160ff19168380011785556200042e565b828001600101855582156200042e579182015b828111156200042e57825182559160200191906001019062000411565b506200043c92915062000440565b5090565b6200045d91905b808211156200043c576000815560010162000447565b90565b613b1f80620004706000396000f3fe608060405234801561001057600080fd5b50600436106102995760003560e060020a9004806382dc1ec41161016b578063a7fc7a07116100d2578063e77c646d1161008b578063e77c646d14610bac578063ec38a86214610c59578063ee532f3114610c7f578063f282527a14610d45578063f2fde38b14610e92578063f35dad4014610eb857610299565b8063a7fc7a0714610a43578063a9059cbb14610a69578063b429afeb14610a95578063bb3acde914610abb578063c422293b14610b76578063dd62ed3e14610b7e57610299565b806395d89b411161012457806395d89b411461091e5780639675193c146109265780639d89cdde146109e15780639ec5a89414610a07578063a2309ff814610a0f578063a457c2d714610a1757610299565b806382dc1ec4146108b25780638456cb59146108d8578063877b9a67146108e05780638da5cb5b146109065780638f32d59b1461090e578063938050e11461091657610299565b8063355274ea1161020f5780635c975abb116101c85780635c975abb1461084657806366ac3b681461084e5780636ef8d66d1461085657806370a082311461085e578063715018a61461088457806375bba1891461088c57610299565b8063355274ea146107b857806338743904146107c057806339509351146107e45780633f4ba83a1461081057806346fbf68e146108185780634c783bf51461083e57610299565b806320694db01161026157806320694db01461053757806323b872dd1461055f5780632535f762146105955780632bc6acc3146106505780632f1cae8514610792578063313ce5671461079a57610299565b806306fdde031461029e578063095ea7b31461031b578063122eb5751461035b57806318160ddd146104625780631badb25c1461047c575b600080fd5b6102a6610ec0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e05781810151838201526020016102c8565b50505050905090810190601f16801561030d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103476004803603604081101561033157600080fd5b50600160a060020a038135169060200135610f56565b604080519115158252519081900360200190f35b6104216004803603608081101561037157600080fd5b600160a060020a038235811692602081013590911691604082013591908101906080810160608201356401000000008111156103ac57600080fd5b8201836020820111156103be57600080fd5b803590602001918460018302840111640100000000831117156103e057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f6c945050505050565b6040805193151584527fff00000000000000000000000000000000000000000000000000000000000000909216602084015282820152519081900360600190f35b61046a6110a9565b60408051918252519081900360200190f35b6104216004803603606081101561049257600080fd5b600160a060020a03823516916020810135918101906060810160408201356401000000008111156104c257600080fd5b8201836020820111156104d457600080fd5b803590602001918460018302840111640100000000831117156104f657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506110af945050505050565b61055d6004803603602081101561054d57600080fd5b5035600160a060020a03166111df565b005b6103476004803603606081101561057557600080fd5b50600160a060020a03813581169160208101359091169060400135611234565b61055d600480360360608110156105ab57600080fd5b600160a060020a03823516916020810135918101906060810160408201356401000000008111156105db57600080fd5b8201836020820111156105ed57600080fd5b8035906020019184600183028401116401000000008311171561060f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061135a945050505050565b61055d6004803603608081101561066657600080fd5b600160a060020a038235169160208101359181019060608101604082013564010000000081111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460018302840111640100000000831117156106ca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561071d57600080fd5b82018360208201111561072f57600080fd5b8035906020019184600183028401116401000000008311171561075157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611429945050505050565b610347611530565b6107a2611539565b6040805160ff9092168252519081900360200190f35b61046a611542565b6107c8611548565b60408051600160a060020a039092168252519081900360200190f35b610347600480360360408110156107fa57600080fd5b50600160a060020a038135169060200135611557565b61055d611598565b6103476004803603602081101561082e57600080fd5b5035600160a060020a03166115fc565b610347611615565b61034761161a565b61055d611623565b61055d61162e565b61046a6004803603602081101561087457600080fd5b5035600160a060020a0316611637565b61055d611652565b61055d600480360360208110156108a257600080fd5b5035600160a060020a03166116bc565b61055d600480360360208110156108c857600080fd5b5035600160a060020a03166117fb565b61055d611818565b610347600480360360208110156108f657600080fd5b5035600160a060020a031661187e565b6107c8611891565b6103476118a0565b61055d6118b1565b6102a66118ba565b61055d6004803603606081101561093c57600080fd5b600160a060020a038235169160208101359181019060608101604082013564010000000081111561096c57600080fd5b82018360208201111561097e57600080fd5b803590602001918460018302840111640100000000831117156109a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061191b945050505050565b61055d600480360360208110156109f757600080fd5b5035600160a060020a0316611a30565b6107c8611bb5565b61046a611bc4565b61034760048036036040811015610a2d57600080fd5b50600160a060020a038135169060200135611bca565b61055d60048036036020811015610a5957600080fd5b5035600160a060020a0316611c06565b61034760048036036040811015610a7f57600080fd5b50600160a060020a038135169060200135611c58565b61034760048036036020811015610aab57600080fd5b5035600160a060020a0316611d7c565b61055d60048036036060811015610ad157600080fd5b600160a060020a0382351691602081013591810190606081016040820135640100000000811115610b0157600080fd5b820183602082011115610b1357600080fd5b80359060200191846001830284011164010000000083111715610b3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d8e945050505050565b61055d611dae565b61046a60048036036040811015610b9457600080fd5b50600160a060020a0381358116916020013516611e88565b61055d60048036036040811015610bc257600080fd5b81359190810190604081016020820135640100000000811115610be457600080fd5b820183602082011115610bf657600080fd5b80359060200191846001830284011164010000000083111715610c1857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611eb3945050505050565b61055d60048036036020811015610c6f57600080fd5b5035600160a060020a0316611fc0565b61055d60048036036080811015610c9557600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610cd057600080fd5b820183602082011115610ce257600080fd5b80359060200191846001830284011164010000000083111715610d0457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120c7945050505050565b61055d600480360360a0811015610d5b57600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610d9657600080fd5b820183602082011115610da857600080fd5b80359060200191846001830284011164010000000083111715610dca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610e1d57600080fd5b820183602082011115610e2f57600080fd5b80359060200191846001830284011164010000000083111715610e5157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612192945050505050565b61055d60048036036020811015610ea857600080fd5b5035600160a060020a03166122a5565b61046a6122c1565b600e8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b820191906000526020600020905b815481529060010190602001808311610f2f57829003601f168201915b5050505050905090565b6000610f633384846122c7565b50600192915050565b6001546040517f3fbae206000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301908152868216602484015233604484018190526064840187905260a060848501908152865160a486015286516000968796879690911694633fbae206948d948d9491938d938d9390929160c4019060208501908083838f5b83811015611014578181015183820152602001610ffc565b50505050905090810190601f1680156110415780820380516001836020036101000a031916815260200191505b50965050505050505060606040518083038186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d606081101561108c57600080fd5b508051602082015160409092015190999198509650945050505050565b60045490565b6001546040517ff1d74b0f0000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a0387811660248501526044840187905260806064850190815286516084860152865160009687968796949091169463f1d74b0f94938c938c938c93929160a49091019060208501908083838e5b8381101561114c578181015183820152602001611134565b50505050905090810190601f1680156111795780820380516001836020036101000a031916815260200191505b509550505050505060606040518083038186803b15801561119957600080fd5b505afa1580156111ad573d6000803e3d6000fd5b505050506040513d60608110156111c357600080fd5b5080516020820151604090920151909891975095509350505050565b6111e83361187e565b15156112285760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b61123181612353565b50565b600d5460009060ff161561124757600080fd5b83838361125587878761239b565b600b54604080517f43f34f9c000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015286811660248301526044820186905291519397509116916343f34f9c916064808201926020929091908290030181600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506040513d60208110156112f857600080fd5b50511515611350576040805160e560020a62461bcd02815260206004820181905260248201527f52657761726473207570646174654f6e5472616e73666572206661696c65642e604482015290519081900360640190fd5b5050509392505050565b60006113678484846110af565b50909150508015156113c3576040805160e560020a62461bcd02815260206004820152601860248201527f5472616e73666572206973206e6f7420616c6c6f7765642e0000000000000000604482015290519081900360640190fd5b6113cd848461242a565b1515611423576040805160e560020a62461bcd02815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b50505050565b838361143786868686612437565b600b54604080517f84733163000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163847331639160448083019260209291908290030181600087803b1580156114a657600080fd5b505af11580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b50511515611528576040805160e560020a62461bcd02815260206004820152601c60248201527f52657761726473207570646174654f6e4275726e206661696c65642e00000000604482015290519081900360640190fd5b505050505050565b60075460ff1681565b60105460ff1690565b60085481565b600154600160a060020a031681565b336000818152600360209081526040808320600160a060020a03871684529091528120549091610f63918590611593908663ffffffff61280516565b6122c7565b6115a1336115fc565b15156115ac57600080fd5b600d5460ff1615156115bd57600080fd5b600d805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b600061160f600c8363ffffffff61281e16565b92915050565b600190565b600d5460ff1690565b61162c33612855565b565b61162c3361289d565b600160a060020a031660009081526002602052604090205490565b61165a6118a0565b151561166557600080fd5b600a54604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a805473ffffffffffffffffffffffffffffffffffffffff19169055565b6116c533611d7c565b15156117055760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b600154600160a060020a031615156117515760405160e560020a62461bcd02815260040180806020018281038252602d815260200180613a31602d913960400191505060405180910390fd5b61175a816128e5565b151561179a5760405160e560020a62461bcd028152600401808060200182810382526021815260200180613a106021913960400191505060405180910390fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f74ad00f42c7567187f818b7401d2b03eae8dc59f390e590b0bbdf9048c53d2549181900360200190a150565b611804336115fc565b151561180f57600080fd5b611231816128ed565b611821336115fc565b151561182c57600080fd5b600d5460ff161561183c57600080fd5b600d805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b600061160f60068363ffffffff61281e16565b600a54600160a060020a031690565b600a54600160a060020a0316331490565b61162c33612935565b600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b600d5460ff161561192b57600080fd5b828261193885858561297d565b600b54604080517f84733163000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163847331639160448083019260209291908290030181600087803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b505050506040513d60208110156119d157600080fd5b50511515611a29576040805160e560020a62461bcd02815260206004820152601c60248201527f52657761726473207570646174654f6e4275726e206661696c65642e00000000604482015290519081900360640190fd5b5050505050565b60075460ff161515611a8c576040805160e560020a62461bcd02815260206004820152601a60248201527f49737375616e636520706572696f642068617320656e6465642e000000000000604482015290519081900360640190fd5b611a953361187e565b1515611ad55760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b600160a060020a0381161515611b1f5760405160e560020a62461bcd028152600401808060200182810382526022815260200180613ad26022913960400191505060405180910390fd5b33600160a060020a0382161415611b6a5760405160e560020a62461bcd02815260040180806020018281038252603a8152602001806139d6603a913960400191505060405180910390fd5b611b7381612353565b611b7c33612935565b604051600160a060020a0382169033907ff660028353db429d08dc90729f6902d6823d2da41ed8733e06768beef5e01ddf90600090a350565b600b54600160a060020a031681565b60095481565b336000818152600360209081526040808320600160a060020a03871684529091528120549091610f63918590611593908663ffffffff612bad16565b611c0f33611d7c565b1515611c4f5760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b61123181612bc2565b600d5460009060ff1615611c6b57600080fd5b338383611c788686612c0a565b600b54604080517f43f34f9c000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015286811660248301526044820186905291519397509116916343f34f9c916064808201926020929091908290030181600087803b158015611cf157600080fd5b505af1158015611d05573d6000803e3d6000fd5b505050506040513d6020811015611d1b57600080fd5b50511515611d73576040805160e560020a62461bcd02815260206004820181905260248201527f52657761726473207570646174654f6e5472616e73666572206661696c65642e604482015290519081900360640190fd5b50505092915050565b600061160f818363ffffffff61281e16565b600d5460ff1615611d9e57600080fd5b611da9838383612c96565b505050565b60075460ff161515611e0a576040805160e560020a62461bcd02815260206004820152601a60248201527f49737375616e636520706572696f642068617320656e6465642e000000000000604482015290519081900360640190fd5b611e133361187e565b1515611e535760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b6007805460ff191690556040517f29fe76cc5ca143e91eadf7242fda487fcef09318c1237900f958abe1e2c5beff90600090a1565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600d5460ff1615611ec357600080fd5b3382611ecf8484612f21565b600b54604080517f84733163000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163847331639160448083019260209291908290030181600087803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b505050506040513d6020811015611f6857600080fd5b50511515611423576040805160e560020a62461bcd02815260206004820152601c60248201527f52657761726473207570646174654f6e4275726e206661696c65642e00000000604482015290519081900360640190fd5b611fc86118a0565b1515611fd357600080fd5b600160a060020a038116151561201d5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180613a5e602b913960400191505060405180910390fd5b612026816128e5565b15156120665760405160e560020a62461bcd028152600401808060200182810382526021815260200180613a106021913960400191505060405180910390fd5b600b8054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9181900360200190a150565b60006120d585858585610f6c565b5090915050801515612131576040805160e560020a62461bcd02815260206004820152601c60248201527f5472616e7366657246726f6d206973206e6f7420616c6c6f7765642e00000000604482015290519081900360640190fd5b61213c858585613144565b1515611a29576040805160e560020a62461bcd02815260206004820152601460248201527f5472616e7366657246726f6d206661696c65642e000000000000000000000000604482015290519081900360640190fd5b8484846121a28888888888613196565b600b54604080517f43f34f9c000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152858116602483015260448201859052915191909216916343f34f9c9160648083019260209291908290030181600087803b15801561221957600080fd5b505af115801561222d573d6000803e3d6000fd5b505050506040513d602081101561224357600080fd5b5051151561229b576040805160e560020a62461bcd02815260206004820181905260248201527f52657761726473207570646174654f6e5472616e73666572206661696c65642e604482015290519081900360640190fd5b5050505050505050565b6122ad6118a0565b15156122b857600080fd5b61123181613574565b60055481565b600160a060020a03821615156122dc57600080fd5b600160a060020a03831615156122f157600080fd5b600160a060020a03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b61236460068263ffffffff6135f216565b604051600160a060020a038216907f05e7c881d716bee8cb7ed92293133ba156704252439e5c502c277448f04e20c290600090a250565b6000806123ba8585856020604051908101604052806000815250610f6c565b5090915050801515612416576040805160e560020a62461bcd02815260206004820152601c60248201527f5472616e7366657246726f6d206973206e6f7420616c6c6f7765642e00000000604482015290519081900360640190fd5b612421858585613144565b95945050505050565b6000610f63338484613640565b61244033611d7c565b15156124805760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b6000600160009054906101000a9004600160a060020a0316600160a060020a0316638639ccaa33878787876040518663ffffffff1660e060020a0281526004018086600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561253457818101518382015260200161251c565b50505050905090810190601f1680156125615780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561259457818101518382015260200161257c565b50505050905090810190601f1680156125c15780820380516001836020036101000a031916815260200191505b5097505050505050505060606040518083038186803b1580156125e357600080fd5b505afa1580156125f7573d6000803e3d6000fd5b505050506040513d606081101561260d57600080fd5b50519050801515612668576040805160e560020a62461bcd02815260206004820181905260248201527f636f6e74726f6c6c657252656465656d206973206e6f7420616c6c6f7765642e604482015290519081900360640190fd5b61267185611637565b8411156126c8576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b6126d2858561370f565b84600160a060020a03167f876b7cb47aa150b3a5516188b19ed308752ad4d0ae9a702543353b78163f7589338686866040518085600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612760578181015183820152602001612748565b50505050905090810190601f16801561278d5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156127c05781810151838201526020016127a8565b50505050905090810190601f1680156127ed5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a25050505050565b60008282018381101561281757600080fd5b9392505050565b6000600160a060020a038216151561283557600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b61286660008263ffffffff61373316565b604051600160a060020a038216907f33d83959be2573f5453b12eb9d43b3499bc57d96bd2f067ba44803c859e8111390600090a250565b6128ae600c8263ffffffff61373316565b604051600160a060020a038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b6000903b1190565b6128fe600c8263ffffffff6135f216565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b61294660068263ffffffff61373316565b604051600160a060020a038216907faf66545c919a3be306ee446d8f42a9558b5b022620df880517bc9593ec0f2d5290600090a250565b6001546040517f45c6909b0000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a0387811660248501526044840187905260806064850190815286516084860152865160009692909216946345c6909b94938a938a938a93909160a49091019060208501908083838e5b83811015612a165781810151838201526020016129fe565b50505050905090810190601f168015612a435780820380516001836020036101000a031916815260200191505b509550505050505060606040518083038186803b158015612a6357600080fd5b505afa158015612a77573d6000803e3d6000fd5b505050506040513d6060811015612a8d57600080fd5b50519050801515612ae8576040805160e560020a62461bcd02815260206004820152601a60248201527f52656465656d46726f6d206973206e6f7420616c6c6f7765642e000000000000604482015290519081900360640190fd5b612af2848461377f565b83600160a060020a031633600160a060020a03167fb7d0d6b60740753e9f16692a2f479472a1385aec2420fa43225b02f2ffa1afe785856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612b6c578181015183820152602001612b54565b50505050905090810190601f168015612b995780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b600082821115612bbc57600080fd5b50900390565b612bd360008263ffffffff6135f216565b604051600160a060020a038216907f0a8bb31534c0ed46f380cb867bd5c803a189ced9a764e30b3a4991a9901d747490600090a250565b600080612c28848460206040519081016040528060008152506110af565b5090915050801515612c84576040805160e560020a62461bcd02815260206004820152601860248201527f5472616e73666572206973206e6f7420616c6c6f7765642e0000000000000000604482015290519081900360640190fd5b612c8e848461242a565b949350505050565b60075460ff161515612cf2576040805160e560020a62461bcd02815260206004820152601a60248201527f49737375616e636520706572696f642068617320656e6465642e000000000000604482015290519081900360640190fd5b612cfb3361187e565b1515612d3b5760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b6001546040517f10992719000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301908152602483018690526060604484019081528551606485015285516000959390931693631099271993899389938993919290916084019060208501908083838d5b83811015612dcd578181015183820152602001612db5565b50505050905090810190601f168015612dfa5780820380516001836020036101000a031916815260200191505b5094505050505060606040518083038186803b158015612e1957600080fd5b505afa158015612e2d573d6000803e3d6000fd5b505050506040513d6060811015612e4357600080fd5b50519050801515612e9e576040805160e560020a62461bcd02815260206004820152601560248201527f4973737565206973206e6f7420616c6c6f7765642e0000000000000000000000604482015290519081900360640190fd5b612ea884846137c4565b83600160a060020a031633600160a060020a03167f0e9905d62635f049c2f4e11678ebf9dc3d1f8c4a653e290759b772e47ba00d00858560405180838152602001806020018281038252838181518152602001915080519060200190808383600083811015612b6c578181015183820152602001612b54565b6001546040517f9809705d000000000000000000000000000000000000000000000000000000008152336004820181815260248301869052606060448401908152855160648501528551600095600160a060020a031694639809705d9493899389939192909160849091019060208501908083838d5b83811015612faf578181015183820152602001612f97565b50505050905090810190601f168015612fdc5780820380516001836020036101000a031916815260200191505b5094505050505060606040518083038186803b158015612ffb57600080fd5b505afa15801561300f573d6000803e3d6000fd5b505050506040513d606081101561302557600080fd5b50519050801515613080576040805160e560020a62461bcd02815260206004820152601660248201527f52656465656d206973206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b61308a338461370f565b33600160a060020a031633600160a060020a03167fb7d0d6b60740753e9f16692a2f479472a1385aec2420fa43225b02f2ffa1afe785856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131045781810151838201526020016130ec565b50505050905090810190601f1680156131315780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3505050565b6000613151848484613640565b600160a060020a03841660009081526003602090815260408083203380855292529091205461318c918691611593908663ffffffff612bad16565b5060019392505050565b61319f33611d7c565b15156131df5760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b6000600160009054906101000a9004600160a060020a0316600160a060020a031663f269feff3388888888886040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156132ac578181015183820152602001613294565b50505050905090810190601f1680156132d95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561330c5781810151838201526020016132f4565b50505050905090810190601f1680156133395780820380516001836020036101000a031916815260200191505b509850505050505050505060606040518083038186803b15801561335c57600080fd5b505afa158015613370573d6000803e3d6000fd5b505050506040513d606081101561338657600080fd5b505190508015156133cb5760405160e560020a62461bcd028152600401808060200182810382526022815260200180613ab06022913960400191505060405180910390fd5b6133d486611637565b84111561342b576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b613436868686613640565b84600160a060020a031686600160a060020a03167f6bf62b4b9c7b768275122bf70d429efc398a056d669b1efdf6c3976346246d7d338787876040518085600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156134ce5781810151838201526020016134b6565b50505050905090810190601f1680156134fb5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561352e578181015183820152602001613516565b50505050905090810190601f16801561355b5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a3505050505050565b600160a060020a038116151561358957600080fd5b600a54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a038116151561360757600080fd5b613611828261281e565b1561361b57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b600160a060020a038216151561365557600080fd5b600160a060020a03831660009081526002602052604090205461367e908263ffffffff612bad16565b600160a060020a0380851660009081526002602052604080822093909355908416815220546136b3908263ffffffff61280516565b600160a060020a0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600554613722908263ffffffff61280516565b60055561372f8282613853565b5050565b600160a060020a038116151561374857600080fd5b613752828261281e565b151561375d57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19169055565b613789828261370f565b600160a060020a03821660009081526003602090815260408083203380855292529091205461372f918491611593908563ffffffff612bad16565b806008546137dd8260095461280590919063ffffffff16565b1115613833576040805160e560020a62461bcd02815260206004820152601760248201527f43616e6e6f74206d696e74206265796f6e64206361702e000000000000000000604482015290519081900360640190fd5b600954613846908363ffffffff61280516565b600955611da983836138fe565b600160a060020a038216151561386857600080fd5b60045461387b908263ffffffff612bad16565b600455600160a060020a0382166000908152600260205260409020546138a7908263ffffffff612bad16565b600160a060020a0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600160a060020a038216151561391357600080fd5b600454613926908263ffffffff61280516565b600455600160a060020a038216600090815260026020526040902054613952908263ffffffff61280516565b600160a060020a03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe4f6e6c7920436f6e74726f6c6c6572732063616e206578656375746520746869732066756e6374696f6e2e4e6577204973737565722063616e6e6f742068617665207468652073616d65206164647265737320617320746865206f6c64206973737565722e41646472657373206d75737420706f696e7420746f206120636f6e74726163742e4d6f64657261746f722061646472657373206d757374206e6f742062652061207a65726f20616464726573732e526577617264732061646472657373206d757374206e6f742062652061207a65726f20616464726573732e4f6e6c7920497373756572732063616e206578656375746520746869732066756e6374696f6e2e636f6e74726f6c6c65725472616e73666572206973206e6f7420616c6c6f7765642e4e6577204973737565722063616e6e6f74206265207a65726f20616464726573732ea165627a7a7230582047019c3539fcedb634408cd6c43e8a5e4e651bf313ec9ff2ef8acd2213417f0d0029000000000000000000000000d41f5a9bf9ff2aed4497f39bb3ccb5ef58346aff000000000000000000000000000000000000000000a9c0a7f258183071078b8f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102995760003560e060020a9004806382dc1ec41161016b578063a7fc7a07116100d2578063e77c646d1161008b578063e77c646d14610bac578063ec38a86214610c59578063ee532f3114610c7f578063f282527a14610d45578063f2fde38b14610e92578063f35dad4014610eb857610299565b8063a7fc7a0714610a43578063a9059cbb14610a69578063b429afeb14610a95578063bb3acde914610abb578063c422293b14610b76578063dd62ed3e14610b7e57610299565b806395d89b411161012457806395d89b411461091e5780639675193c146109265780639d89cdde146109e15780639ec5a89414610a07578063a2309ff814610a0f578063a457c2d714610a1757610299565b806382dc1ec4146108b25780638456cb59146108d8578063877b9a67146108e05780638da5cb5b146109065780638f32d59b1461090e578063938050e11461091657610299565b8063355274ea1161020f5780635c975abb116101c85780635c975abb1461084657806366ac3b681461084e5780636ef8d66d1461085657806370a082311461085e578063715018a61461088457806375bba1891461088c57610299565b8063355274ea146107b857806338743904146107c057806339509351146107e45780633f4ba83a1461081057806346fbf68e146108185780634c783bf51461083e57610299565b806320694db01161026157806320694db01461053757806323b872dd1461055f5780632535f762146105955780632bc6acc3146106505780632f1cae8514610792578063313ce5671461079a57610299565b806306fdde031461029e578063095ea7b31461031b578063122eb5751461035b57806318160ddd146104625780631badb25c1461047c575b600080fd5b6102a6610ec0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102e05781810151838201526020016102c8565b50505050905090810190601f16801561030d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103476004803603604081101561033157600080fd5b50600160a060020a038135169060200135610f56565b604080519115158252519081900360200190f35b6104216004803603608081101561037157600080fd5b600160a060020a038235811692602081013590911691604082013591908101906080810160608201356401000000008111156103ac57600080fd5b8201836020820111156103be57600080fd5b803590602001918460018302840111640100000000831117156103e057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f6c945050505050565b6040805193151584527fff00000000000000000000000000000000000000000000000000000000000000909216602084015282820152519081900360600190f35b61046a6110a9565b60408051918252519081900360200190f35b6104216004803603606081101561049257600080fd5b600160a060020a03823516916020810135918101906060810160408201356401000000008111156104c257600080fd5b8201836020820111156104d457600080fd5b803590602001918460018302840111640100000000831117156104f657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506110af945050505050565b61055d6004803603602081101561054d57600080fd5b5035600160a060020a03166111df565b005b6103476004803603606081101561057557600080fd5b50600160a060020a03813581169160208101359091169060400135611234565b61055d600480360360608110156105ab57600080fd5b600160a060020a03823516916020810135918101906060810160408201356401000000008111156105db57600080fd5b8201836020820111156105ed57600080fd5b8035906020019184600183028401116401000000008311171561060f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061135a945050505050565b61055d6004803603608081101561066657600080fd5b600160a060020a038235169160208101359181019060608101604082013564010000000081111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460018302840111640100000000831117156106ca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561071d57600080fd5b82018360208201111561072f57600080fd5b8035906020019184600183028401116401000000008311171561075157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611429945050505050565b610347611530565b6107a2611539565b6040805160ff9092168252519081900360200190f35b61046a611542565b6107c8611548565b60408051600160a060020a039092168252519081900360200190f35b610347600480360360408110156107fa57600080fd5b50600160a060020a038135169060200135611557565b61055d611598565b6103476004803603602081101561082e57600080fd5b5035600160a060020a03166115fc565b610347611615565b61034761161a565b61055d611623565b61055d61162e565b61046a6004803603602081101561087457600080fd5b5035600160a060020a0316611637565b61055d611652565b61055d600480360360208110156108a257600080fd5b5035600160a060020a03166116bc565b61055d600480360360208110156108c857600080fd5b5035600160a060020a03166117fb565b61055d611818565b610347600480360360208110156108f657600080fd5b5035600160a060020a031661187e565b6107c8611891565b6103476118a0565b61055d6118b1565b6102a66118ba565b61055d6004803603606081101561093c57600080fd5b600160a060020a038235169160208101359181019060608101604082013564010000000081111561096c57600080fd5b82018360208201111561097e57600080fd5b803590602001918460018302840111640100000000831117156109a057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061191b945050505050565b61055d600480360360208110156109f757600080fd5b5035600160a060020a0316611a30565b6107c8611bb5565b61046a611bc4565b61034760048036036040811015610a2d57600080fd5b50600160a060020a038135169060200135611bca565b61055d60048036036020811015610a5957600080fd5b5035600160a060020a0316611c06565b61034760048036036040811015610a7f57600080fd5b50600160a060020a038135169060200135611c58565b61034760048036036020811015610aab57600080fd5b5035600160a060020a0316611d7c565b61055d60048036036060811015610ad157600080fd5b600160a060020a0382351691602081013591810190606081016040820135640100000000811115610b0157600080fd5b820183602082011115610b1357600080fd5b80359060200191846001830284011164010000000083111715610b3557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d8e945050505050565b61055d611dae565b61046a60048036036040811015610b9457600080fd5b50600160a060020a0381358116916020013516611e88565b61055d60048036036040811015610bc257600080fd5b81359190810190604081016020820135640100000000811115610be457600080fd5b820183602082011115610bf657600080fd5b80359060200191846001830284011164010000000083111715610c1857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611eb3945050505050565b61055d60048036036020811015610c6f57600080fd5b5035600160a060020a0316611fc0565b61055d60048036036080811015610c9557600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610cd057600080fd5b820183602082011115610ce257600080fd5b80359060200191846001830284011164010000000083111715610d0457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120c7945050505050565b61055d600480360360a0811015610d5b57600080fd5b600160a060020a03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610d9657600080fd5b820183602082011115610da857600080fd5b80359060200191846001830284011164010000000083111715610dca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610e1d57600080fd5b820183602082011115610e2f57600080fd5b80359060200191846001830284011164010000000083111715610e5157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612192945050505050565b61055d60048036036020811015610ea857600080fd5b5035600160a060020a03166122a5565b61046a6122c1565b600e8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b820191906000526020600020905b815481529060010190602001808311610f2f57829003601f168201915b5050505050905090565b6000610f633384846122c7565b50600192915050565b6001546040517f3fbae206000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301908152868216602484015233604484018190526064840187905260a060848501908152865160a486015286516000968796879690911694633fbae206948d948d9491938d938d9390929160c4019060208501908083838f5b83811015611014578181015183820152602001610ffc565b50505050905090810190601f1680156110415780820380516001836020036101000a031916815260200191505b50965050505050505060606040518083038186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d606081101561108c57600080fd5b508051602082015160409092015190999198509650945050505050565b60045490565b6001546040517ff1d74b0f0000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a0387811660248501526044840187905260806064850190815286516084860152865160009687968796949091169463f1d74b0f94938c938c938c93929160a49091019060208501908083838e5b8381101561114c578181015183820152602001611134565b50505050905090810190601f1680156111795780820380516001836020036101000a031916815260200191505b509550505050505060606040518083038186803b15801561119957600080fd5b505afa1580156111ad573d6000803e3d6000fd5b505050506040513d60608110156111c357600080fd5b5080516020820151604090920151909891975095509350505050565b6111e83361187e565b15156112285760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b61123181612353565b50565b600d5460009060ff161561124757600080fd5b83838361125587878761239b565b600b54604080517f43f34f9c000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015286811660248301526044820186905291519397509116916343f34f9c916064808201926020929091908290030181600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506040513d60208110156112f857600080fd5b50511515611350576040805160e560020a62461bcd02815260206004820181905260248201527f52657761726473207570646174654f6e5472616e73666572206661696c65642e604482015290519081900360640190fd5b5050509392505050565b60006113678484846110af565b50909150508015156113c3576040805160e560020a62461bcd02815260206004820152601860248201527f5472616e73666572206973206e6f7420616c6c6f7765642e0000000000000000604482015290519081900360640190fd5b6113cd848461242a565b1515611423576040805160e560020a62461bcd02815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b50505050565b838361143786868686612437565b600b54604080517f84733163000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163847331639160448083019260209291908290030181600087803b1580156114a657600080fd5b505af11580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b50511515611528576040805160e560020a62461bcd02815260206004820152601c60248201527f52657761726473207570646174654f6e4275726e206661696c65642e00000000604482015290519081900360640190fd5b505050505050565b60075460ff1681565b60105460ff1690565b60085481565b600154600160a060020a031681565b336000818152600360209081526040808320600160a060020a03871684529091528120549091610f63918590611593908663ffffffff61280516565b6122c7565b6115a1336115fc565b15156115ac57600080fd5b600d5460ff1615156115bd57600080fd5b600d805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b600061160f600c8363ffffffff61281e16565b92915050565b600190565b600d5460ff1690565b61162c33612855565b565b61162c3361289d565b600160a060020a031660009081526002602052604090205490565b61165a6118a0565b151561166557600080fd5b600a54604051600091600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a805473ffffffffffffffffffffffffffffffffffffffff19169055565b6116c533611d7c565b15156117055760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b600154600160a060020a031615156117515760405160e560020a62461bcd02815260040180806020018281038252602d815260200180613a31602d913960400191505060405180910390fd5b61175a816128e5565b151561179a5760405160e560020a62461bcd028152600401808060200182810382526021815260200180613a106021913960400191505060405180910390fd5b60018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f74ad00f42c7567187f818b7401d2b03eae8dc59f390e590b0bbdf9048c53d2549181900360200190a150565b611804336115fc565b151561180f57600080fd5b611231816128ed565b611821336115fc565b151561182c57600080fd5b600d5460ff161561183c57600080fd5b600d805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b600061160f60068363ffffffff61281e16565b600a54600160a060020a031690565b600a54600160a060020a0316331490565b61162c33612935565b600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b600d5460ff161561192b57600080fd5b828261193885858561297d565b600b54604080517f84733163000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163847331639160448083019260209291908290030181600087803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b505050506040513d60208110156119d157600080fd5b50511515611a29576040805160e560020a62461bcd02815260206004820152601c60248201527f52657761726473207570646174654f6e4275726e206661696c65642e00000000604482015290519081900360640190fd5b5050505050565b60075460ff161515611a8c576040805160e560020a62461bcd02815260206004820152601a60248201527f49737375616e636520706572696f642068617320656e6465642e000000000000604482015290519081900360640190fd5b611a953361187e565b1515611ad55760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b600160a060020a0381161515611b1f5760405160e560020a62461bcd028152600401808060200182810382526022815260200180613ad26022913960400191505060405180910390fd5b33600160a060020a0382161415611b6a5760405160e560020a62461bcd02815260040180806020018281038252603a8152602001806139d6603a913960400191505060405180910390fd5b611b7381612353565b611b7c33612935565b604051600160a060020a0382169033907ff660028353db429d08dc90729f6902d6823d2da41ed8733e06768beef5e01ddf90600090a350565b600b54600160a060020a031681565b60095481565b336000818152600360209081526040808320600160a060020a03871684529091528120549091610f63918590611593908663ffffffff612bad16565b611c0f33611d7c565b1515611c4f5760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b61123181612bc2565b600d5460009060ff1615611c6b57600080fd5b338383611c788686612c0a565b600b54604080517f43f34f9c000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015286811660248301526044820186905291519397509116916343f34f9c916064808201926020929091908290030181600087803b158015611cf157600080fd5b505af1158015611d05573d6000803e3d6000fd5b505050506040513d6020811015611d1b57600080fd5b50511515611d73576040805160e560020a62461bcd02815260206004820181905260248201527f52657761726473207570646174654f6e5472616e73666572206661696c65642e604482015290519081900360640190fd5b50505092915050565b600061160f818363ffffffff61281e16565b600d5460ff1615611d9e57600080fd5b611da9838383612c96565b505050565b60075460ff161515611e0a576040805160e560020a62461bcd02815260206004820152601a60248201527f49737375616e636520706572696f642068617320656e6465642e000000000000604482015290519081900360640190fd5b611e133361187e565b1515611e535760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b6007805460ff191690556040517f29fe76cc5ca143e91eadf7242fda487fcef09318c1237900f958abe1e2c5beff90600090a1565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600d5460ff1615611ec357600080fd5b3382611ecf8484612f21565b600b54604080517f84733163000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163847331639160448083019260209291908290030181600087803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b505050506040513d6020811015611f6857600080fd5b50511515611423576040805160e560020a62461bcd02815260206004820152601c60248201527f52657761726473207570646174654f6e4275726e206661696c65642e00000000604482015290519081900360640190fd5b611fc86118a0565b1515611fd357600080fd5b600160a060020a038116151561201d5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180613a5e602b913960400191505060405180910390fd5b612026816128e5565b15156120665760405160e560020a62461bcd028152600401808060200182810382526021815260200180613a106021913960400191505060405180910390fd5b600b8054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f05f3326e0527f309d4015dee3bc3f36e650b53fc823bab69c99847814acfafdf9181900360200190a150565b60006120d585858585610f6c565b5090915050801515612131576040805160e560020a62461bcd02815260206004820152601c60248201527f5472616e7366657246726f6d206973206e6f7420616c6c6f7765642e00000000604482015290519081900360640190fd5b61213c858585613144565b1515611a29576040805160e560020a62461bcd02815260206004820152601460248201527f5472616e7366657246726f6d206661696c65642e000000000000000000000000604482015290519081900360640190fd5b8484846121a28888888888613196565b600b54604080517f43f34f9c000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152858116602483015260448201859052915191909216916343f34f9c9160648083019260209291908290030181600087803b15801561221957600080fd5b505af115801561222d573d6000803e3d6000fd5b505050506040513d602081101561224357600080fd5b5051151561229b576040805160e560020a62461bcd02815260206004820181905260248201527f52657761726473207570646174654f6e5472616e73666572206661696c65642e604482015290519081900360640190fd5b5050505050505050565b6122ad6118a0565b15156122b857600080fd5b61123181613574565b60055481565b600160a060020a03821615156122dc57600080fd5b600160a060020a03831615156122f157600080fd5b600160a060020a03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b61236460068263ffffffff6135f216565b604051600160a060020a038216907f05e7c881d716bee8cb7ed92293133ba156704252439e5c502c277448f04e20c290600090a250565b6000806123ba8585856020604051908101604052806000815250610f6c565b5090915050801515612416576040805160e560020a62461bcd02815260206004820152601c60248201527f5472616e7366657246726f6d206973206e6f7420616c6c6f7765642e00000000604482015290519081900360640190fd5b612421858585613144565b95945050505050565b6000610f63338484613640565b61244033611d7c565b15156124805760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b6000600160009054906101000a9004600160a060020a0316600160a060020a0316638639ccaa33878787876040518663ffffffff1660e060020a0281526004018086600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561253457818101518382015260200161251c565b50505050905090810190601f1680156125615780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561259457818101518382015260200161257c565b50505050905090810190601f1680156125c15780820380516001836020036101000a031916815260200191505b5097505050505050505060606040518083038186803b1580156125e357600080fd5b505afa1580156125f7573d6000803e3d6000fd5b505050506040513d606081101561260d57600080fd5b50519050801515612668576040805160e560020a62461bcd02815260206004820181905260248201527f636f6e74726f6c6c657252656465656d206973206e6f7420616c6c6f7765642e604482015290519081900360640190fd5b61267185611637565b8411156126c8576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b6126d2858561370f565b84600160a060020a03167f876b7cb47aa150b3a5516188b19ed308752ad4d0ae9a702543353b78163f7589338686866040518085600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612760578181015183820152602001612748565b50505050905090810190601f16801561278d5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156127c05781810151838201526020016127a8565b50505050905090810190601f1680156127ed5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a25050505050565b60008282018381101561281757600080fd5b9392505050565b6000600160a060020a038216151561283557600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b61286660008263ffffffff61373316565b604051600160a060020a038216907f33d83959be2573f5453b12eb9d43b3499bc57d96bd2f067ba44803c859e8111390600090a250565b6128ae600c8263ffffffff61373316565b604051600160a060020a038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b6000903b1190565b6128fe600c8263ffffffff6135f216565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b61294660068263ffffffff61373316565b604051600160a060020a038216907faf66545c919a3be306ee446d8f42a9558b5b022620df880517bc9593ec0f2d5290600090a250565b6001546040517f45c6909b0000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a0387811660248501526044840187905260806064850190815286516084860152865160009692909216946345c6909b94938a938a938a93909160a49091019060208501908083838e5b83811015612a165781810151838201526020016129fe565b50505050905090810190601f168015612a435780820380516001836020036101000a031916815260200191505b509550505050505060606040518083038186803b158015612a6357600080fd5b505afa158015612a77573d6000803e3d6000fd5b505050506040513d6060811015612a8d57600080fd5b50519050801515612ae8576040805160e560020a62461bcd02815260206004820152601a60248201527f52656465656d46726f6d206973206e6f7420616c6c6f7765642e000000000000604482015290519081900360640190fd5b612af2848461377f565b83600160a060020a031633600160a060020a03167fb7d0d6b60740753e9f16692a2f479472a1385aec2420fa43225b02f2ffa1afe785856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612b6c578181015183820152602001612b54565b50505050905090810190601f168015612b995780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050565b600082821115612bbc57600080fd5b50900390565b612bd360008263ffffffff6135f216565b604051600160a060020a038216907f0a8bb31534c0ed46f380cb867bd5c803a189ced9a764e30b3a4991a9901d747490600090a250565b600080612c28848460206040519081016040528060008152506110af565b5090915050801515612c84576040805160e560020a62461bcd02815260206004820152601860248201527f5472616e73666572206973206e6f7420616c6c6f7765642e0000000000000000604482015290519081900360640190fd5b612c8e848461242a565b949350505050565b60075460ff161515612cf2576040805160e560020a62461bcd02815260206004820152601a60248201527f49737375616e636520706572696f642068617320656e6465642e000000000000604482015290519081900360640190fd5b612cfb3361187e565b1515612d3b5760405160e560020a62461bcd028152600401808060200182810382526027815260200180613a896027913960400191505060405180910390fd5b6001546040517f10992719000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301908152602483018690526060604484019081528551606485015285516000959390931693631099271993899389938993919290916084019060208501908083838d5b83811015612dcd578181015183820152602001612db5565b50505050905090810190601f168015612dfa5780820380516001836020036101000a031916815260200191505b5094505050505060606040518083038186803b158015612e1957600080fd5b505afa158015612e2d573d6000803e3d6000fd5b505050506040513d6060811015612e4357600080fd5b50519050801515612e9e576040805160e560020a62461bcd02815260206004820152601560248201527f4973737565206973206e6f7420616c6c6f7765642e0000000000000000000000604482015290519081900360640190fd5b612ea884846137c4565b83600160a060020a031633600160a060020a03167f0e9905d62635f049c2f4e11678ebf9dc3d1f8c4a653e290759b772e47ba00d00858560405180838152602001806020018281038252838181518152602001915080519060200190808383600083811015612b6c578181015183820152602001612b54565b6001546040517f9809705d000000000000000000000000000000000000000000000000000000008152336004820181815260248301869052606060448401908152855160648501528551600095600160a060020a031694639809705d9493899389939192909160849091019060208501908083838d5b83811015612faf578181015183820152602001612f97565b50505050905090810190601f168015612fdc5780820380516001836020036101000a031916815260200191505b5094505050505060606040518083038186803b158015612ffb57600080fd5b505afa15801561300f573d6000803e3d6000fd5b505050506040513d606081101561302557600080fd5b50519050801515613080576040805160e560020a62461bcd02815260206004820152601660248201527f52656465656d206973206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b61308a338461370f565b33600160a060020a031633600160a060020a03167fb7d0d6b60740753e9f16692a2f479472a1385aec2420fa43225b02f2ffa1afe785856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131045781810151838201526020016130ec565b50505050905090810190601f1680156131315780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3505050565b6000613151848484613640565b600160a060020a03841660009081526003602090815260408083203380855292529091205461318c918691611593908663ffffffff612bad16565b5060019392505050565b61319f33611d7c565b15156131df5760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806139ab602b913960400191505060405180910390fd5b6000600160009054906101000a9004600160a060020a0316600160a060020a031663f269feff3388888888886040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156132ac578181015183820152602001613294565b50505050905090810190601f1680156132d95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561330c5781810151838201526020016132f4565b50505050905090810190601f1680156133395780820380516001836020036101000a031916815260200191505b509850505050505050505060606040518083038186803b15801561335c57600080fd5b505afa158015613370573d6000803e3d6000fd5b505050506040513d606081101561338657600080fd5b505190508015156133cb5760405160e560020a62461bcd028152600401808060200182810382526022815260200180613ab06022913960400191505060405180910390fd5b6133d486611637565b84111561342b576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b613436868686613640565b84600160a060020a031686600160a060020a03167f6bf62b4b9c7b768275122bf70d429efc398a056d669b1efdf6c3976346246d7d338787876040518085600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156134ce5781810151838201526020016134b6565b50505050905090810190601f1680156134fb5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561352e578181015183820152602001613516565b50505050905090810190601f16801561355b5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a3505050505050565b600160a060020a038116151561358957600080fd5b600a54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a038116151561360757600080fd5b613611828261281e565b1561361b57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b600160a060020a038216151561365557600080fd5b600160a060020a03831660009081526002602052604090205461367e908263ffffffff612bad16565b600160a060020a0380851660009081526002602052604080822093909355908416815220546136b3908263ffffffff61280516565b600160a060020a0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600554613722908263ffffffff61280516565b60055561372f8282613853565b5050565b600160a060020a038116151561374857600080fd5b613752828261281e565b151561375d57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19169055565b613789828261370f565b600160a060020a03821660009081526003602090815260408083203380855292529091205461372f918491611593908563ffffffff612bad16565b806008546137dd8260095461280590919063ffffffff16565b1115613833576040805160e560020a62461bcd02815260206004820152601760248201527f43616e6e6f74206d696e74206265796f6e64206361702e000000000000000000604482015290519081900360640190fd5b600954613846908363ffffffff61280516565b600955611da983836138fe565b600160a060020a038216151561386857600080fd5b60045461387b908263ffffffff612bad16565b600455600160a060020a0382166000908152600260205260409020546138a7908263ffffffff612bad16565b600160a060020a0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600160a060020a038216151561391357600080fd5b600454613926908263ffffffff61280516565b600455600160a060020a038216600090815260026020526040902054613952908263ffffffff61280516565b600160a060020a03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505056fe4f6e6c7920436f6e74726f6c6c6572732063616e206578656375746520746869732066756e6374696f6e2e4e6577204973737565722063616e6e6f742068617665207468652073616d65206164647265737320617320746865206f6c64206973737565722e41646472657373206d75737420706f696e7420746f206120636f6e74726163742e4d6f64657261746f722061646472657373206d757374206e6f742062652061207a65726f20616464726573732e526577617264732061646472657373206d757374206e6f742062652061207a65726f20616464726573732e4f6e6c7920497373756572732063616e206578656375746520746869732066756e6374696f6e2e636f6e74726f6c6c65725472616e73666572206973206e6f7420616c6c6f7765642e4e6577204973737565722063616e6e6f74206265207a65726f20616464726573732ea165627a7a7230582047019c3539fcedb634408cd6c43e8a5e4e651bf313ec9ff2ef8acd2213417f0d0029

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

000000000000000000000000d41f5a9bf9ff2aed4497f39bb3ccb5ef58346aff000000000000000000000000000000000000000000a9c0a7f258183071078b8f

-----Decoded View---------------
Arg [0] : _moderator (address): 0xD41F5A9bF9FF2Aed4497F39bB3cCb5EF58346AFF
Arg [1] : _cap (uint256): 205218255948577763364408207

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d41f5a9bf9ff2aed4497f39bb3ccb5ef58346aff
Arg [1] : 000000000000000000000000000000000000000000a9c0a7f258183071078b8f


Deployed Bytecode Sourcemap

39048:178:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39048:178:0;;;;;;;;-1:-1:-1;;;39048:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1552:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1552:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17724:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17724:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32193:275;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;32193:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;32193:275:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32193:275: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;32193:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;32193:275:0;;-1:-1:-1;32193:275:0;;-1:-1:-1;;;;;32193:275:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15877:91;;;:::i;:::-;;;;;;;;;;;;;;;;31940:245;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;31940:245:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;31940:245:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31940:245: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;31940:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31940:245:0;;-1:-1:-1;31940:245:0;;-1:-1:-1;;;;;31940:245:0:i;25691:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25691:92:0;-1:-1:-1;;;;;25691:92:0;;:::i;:::-;;37368:254;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37368:254:0;;;;;;;;;;;;;;;;;:::i;30960:295::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;30960:295:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30960:295:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30960:295: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;30960:295:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30960:295:0;;-1:-1:-1;30960:295:0;;-1:-1:-1;;;;;30960:295:0:i;38662:271::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38662:271:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38662:271:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38662: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;38662:271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38662:271:0;;;;;;;;-1:-1:-1;38662:271:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;38662:271:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38662: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;38662:271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38662:271:0;;-1:-1:-1;38662:271:0;;-1:-1:-1;;;;;38662:271:0:i;28361:29::-;;;:::i;1868:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35988:15;;;:::i;27484:27::-;;;:::i;:::-;;;;-1:-1:-1;;;;;27484:27:0;;;;;;;;;;;;;;19099:203;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19099:203:0;;;;;;;;:::i;5298:118::-;;;:::i;3476:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3476:109:0;-1:-1:-1;;;;;3476:109:0;;:::i;35427:83::-;;;:::i;4551:78::-;;;:::i;26971:85::-;;;:::i;3693:77::-;;;:::i;16187:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16187:106:0;-1:-1:-1;;;;;16187:106:0;;:::i;10503:140::-;;;:::i;27822:360::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27822:360:0;-1:-1:-1;;;;;27822:360:0;;:::i;3593:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3593:92:0;-1:-1:-1;;;;;3593:92:0;;:::i;5087:116::-;;;:::i;25574:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25574:109:0;-1:-1:-1;;;;;25574:109:0;;:::i;9713:79::-;;;:::i;10048:92::-;;;:::i;25791:77::-;;;:::i;1702:87::-;;;:::i;38100:239::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;38100:239:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38100:239:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38100:239: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;38100:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38100:239:0;;-1:-1:-1;38100:239:0;;-1:-1:-1;;;;;38100:239:0:i;28977:405::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28977:405:0;-1:-1:-1;;;;;28977:405:0;;:::i;13360:32::-;;;:::i;36010:23::-;;;:::i;19833:213::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19833:213:0;;;;;;;;:::i;26859:104::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26859:104:0;-1:-1:-1;;;;;26859:104:0;;:::i;37131:229::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37131:229:0;;;;;;;;:::i;26734:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26734:117:0;-1:-1:-1;;;;;26734:117:0;;:::i;37655:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;37655:235:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;37655:235:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37655:235: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;37655:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37655:235:0;;-1:-1:-1;37655:235:0;;-1:-1:-1;;;;;37655:235:0:i;29463:128::-;;;:::i;16632:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16632:131:0;;;;;;;;;;:::i;37898:194::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37898:194:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;37898:194:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37898:194: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;37898:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37898:194:0;;-1:-1:-1;37898:194:0;;-1:-1:-1;;;;;37898:194:0:i;14571:345::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14571:345:0;-1:-1:-1;;;;;14571:345:0;;:::i;31588:344::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;31588:344:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;31588:344:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31588:344: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;31588:344:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31588:344:0;;-1:-1:-1;31588:344:0;;-1:-1:-1;;;;;31588:344:0:i;38372:282::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38372:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;38372:282:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38372:282: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;38372:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38372:282:0;;;;;;;;-1:-1:-1;38372:282:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;38372:282:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38372:282: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;38372:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38372:282:0;;-1:-1:-1;38372:282:0;;-1:-1:-1;;;;;38372:282:0:i;10820:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10820:109:0;-1:-1:-1;;;;;10820:109:0;;:::i;22930:28::-;;;:::i;1552:83::-;1622:5;1615:12;;;;;;;;-1:-1:-1;;1615:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1589:13;;1615:12;;1622:5;;1615:12;;1622:5;1615:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1552:83;:::o;17724:148::-;17789:4;17806:36;17815:10;17827:7;17836:5;17806:8;:36::i;:::-;-1:-1:-1;17860:4:0;17724:148;;;;:::o;32193:275::-;32393:9;;:67;;;;;-1:-1:-1;;;;;32393:67:0;;;;;;;;;;;;;;;;32434:10;32393:67;;;;;;;;;;;;;;;;;;;;;;;;;;;32313:12;;;;;;32393:9;;;;:28;;32422:5;;32429:3;;32434:10;;32446:6;;32454:5;;32393:67;;;;;;;;;;;;;32313:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32393:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32393:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32393:67:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32393:67:0;;;;;;;;;;;;;;;-1:-1:-1;32393:67:0;-1:-1:-1;32193:275:0;-1:-1:-1;;;;;32193:275:0:o;15877:91::-;15948:12;;15877:91;:::o;31940:245::-;32121:9;;:56;;;;;32146:10;32121:56;;;;;;-1:-1:-1;;;;;32121:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32041:12;;;;;;32121:9;;;;;:24;;32146:10;32158:3;;32163:6;;32171:5;;32121:56;;;;;;;;;;;;;;32041:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32121:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32121:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32121:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32121:56:0;;;;;;;;;;;;;;;-1:-1:-1;32121:56:0;-1:-1:-1;31940:245:0;-1:-1:-1;;;;31940:245:0:o;25691:92::-;25410:20;25419:10;25410:8;:20::i;:::-;25402:72;;;;;;-1:-1:-1;;;;;25402:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25756:19;25767:7;25756:10;:19::i;:::-;25691:92;:::o;37368:254::-;4788:7;;37535:12;;4788:7;;4787:8;4779:17;;;;;;37506:5;37513:3;37518:6;37576:38;37595:5;37602:3;37607:6;37576:18;:38::i;:::-;13885:7;;:44;;;;;;-1:-1:-1;;;;;13885:44:0;;;;;;;;;;;;;;;;;;;;;;37566:48;;-1:-1:-1;13885:7:0;;;:24;;:44;;;;;;;;;;;;;;;:7;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;13885:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13885:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13885:44:0;13877:89;;;;;;;-1:-1:-1;;;;;13877:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4807:1;;;37368:254;;;;;:::o;30960:295::-;31053:12;31092:31;31104:3;31109:6;31117:5;31092:11;:31::i;:::-;-1:-1:-1;31076:47:0;;-1:-1:-1;;31134:44:0;;;;;;;;-1:-1:-1;;;;;31134:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31199:27;31214:3;31219:6;31199:14;:27::i;:::-;31191:56;;;;;;;-1:-1:-1;;;;;31191:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30960:295;;;;:::o;38662:271::-;38821:12;38835:6;38859:66;38882:12;38896:6;38904:5;38911:13;38859:22;:66::i;:::-;14332:7;;:38;;;;;;-1:-1:-1;;;;;14332:38:0;;;;;;;;;;;;;;;:7;;;;;:20;;:38;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;14332:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14332:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14332:38:0;14324:79;;;;;;;-1:-1:-1;;;;;14324:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38662:271;;;;;;:::o;28361:29::-;;;;;;:::o;1868:83::-;1934:9;;;;1868:83;:::o;35988:15::-;;;;:::o;27484:27::-;;;-1:-1:-1;;;;;27484:27:0;;:::o;19099:203::-;19205:10;19179:4;19226:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;19226:29:0;;;;;;;;;;19179:4;;19196:76;;19217:7;;19226:45;;19260:10;19226:45;:33;:45;:::i;:::-;19196:8;:76::i;5298:118::-;3427:20;3436:10;3427:8;:20::i;:::-;3419:29;;;;;;;;4967:7;;;;4959:16;;;;;;;;5357:7;:15;;-1:-1:-1;;5357:15:0;;;5388:20;;;5397:10;5388:20;;;;;;;;;;;;;5298:118::o;3476:109::-;3532:4;3556:21;:8;3569:7;3556:21;:12;:21;:::i;:::-;3549:28;3476:109;-1:-1:-1;;3476:109:0:o;35427:83::-;35498:4;35427:83;:::o;4551:78::-;4614:7;;;;4551:78;:::o;26971:85::-;27019:29;27037:10;27019:17;:29::i;:::-;26971:85::o;3693:77::-;3737:25;3751:10;3737:13;:25::i;16187:106::-;-1:-1:-1;;;;;16269:16:0;16242:7;16269:16;;;:9;:16;;;;;;;16187:106::o;10503:140::-;9925:9;:7;:9::i;:::-;9917:18;;;;;;;;10586:6;;10565:40;;10602:1;;-1:-1:-1;;;;;10586:6:0;;10565:40;;10602:1;;10565:40;10616:6;:19;;-1:-1:-1;;10616:19:0;;;10503:140::o;27822:360::-;26558:24;26571:10;26558:12;:24::i;:::-;26550:80;;;;;;-1:-1:-1;;;;;26550:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27918:9;;-1:-1:-1;;;;;27918:9:0;27910:32;;27902:90;;;;-1:-1:-1;;;;;27902:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28011:39;28038:10;28011:18;:39::i;:::-;28003:85;;;;;;-1:-1:-1;;;;;28003:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28099:9;:22;;-1:-1:-1;;;;;28099:22:0;;-1:-1:-1;;28099:22:0;;;;;;;;28137:37;;;;;;;;;;;;;;;;27822:360;:::o;3593:92::-;3427:20;3436:10;3427:8;:20::i;:::-;3419:29;;;;;;;;3658:19;3669:7;3658:10;:19::i;5087:116::-;3427:20;3436:10;3427:8;:20::i;:::-;3419:29;;;;;;;;4788:7;;;;4787:8;4779:17;;;;;;5147:7;:14;;-1:-1:-1;;5147:14:0;5157:4;5147:14;;;5177:18;;;5184:10;5177:18;;;;;;;;;;;;;5087:116::o;25574:109::-;25630:4;25654:21;:8;25667:7;25654:21;:12;:21;:::i;9713:79::-;9778:6;;-1:-1:-1;;;;;9778:6:0;9713:79;:::o;10048:92::-;10126:6;;-1:-1:-1;;;;;10126:6:0;10112:10;:20;;10048:92::o;25791:77::-;25835:25;25849:10;25835:13;:25::i;1702:87::-;1774:7;1767:14;;;;;;;;-1:-1:-1;;1767:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1741:13;;1767:14;;1774:7;;1767:14;;1774:7;1767:14;;;;;;;;;;;;;;;;;;;;;;;;38100:239;4788:7;;;;4787:8;4779:17;;;;;;38248:12;38262:6;38286:45;38303:12;38317:6;38325:5;38286:16;:45::i;:::-;14332:7;;:38;;;;;;-1:-1:-1;;;;;14332:38:0;;;;;;;;;;;;;;;:7;;;;;:20;;:38;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;14332:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14332:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14332:38:0;14324:79;;;;;;;-1:-1:-1;;;;;14324:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4807:1;;38100:239;;;:::o;28977:405::-;28811:10;;;;28803:49;;;;;;;-1:-1:-1;;;;;28803:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25410:20;25419:10;25410:8;:20::i;:::-;25402:72;;;;;;-1:-1:-1;;;;;25402:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29075:24:0;;;;29067:71;;;;-1:-1:-1;;;;;29067:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29157:10;-1:-1:-1;;;;;29157:24:0;;;;29149:95;;;;-1:-1:-1;;;;;29149:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29255:22;29266:10;29255;:22::i;:::-;29288:25;29302:10;29288:13;:25::i;:::-;29329:45;;-1:-1:-1;;;;;29329:45:0;;;29351:10;;29329:45;;;;;28977:405;:::o;13360:32::-;;;-1:-1:-1;;;;;13360:32:0;;:::o;36010:23::-;;;;:::o;19833:213::-;19944:10;19918:4;19965:20;;;:8;:20;;;;;;;;-1:-1:-1;;;;;19965:29:0;;;;;;;;;;19918:4;;19935:81;;19956:7;;19965:50;;19999:15;19965:50;:33;:50;:::i;26859:104::-;26558:24;26571:10;26558:12;:24::i;:::-;26550:80;;;;;;-1:-1:-1;;;;;26550:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26932:23;26947:7;26932:14;:23::i;37131:229::-;4788:7;;37284:12;;4788:7;;4787:8;4779:17;;;;;;37250:10;37262:3;37267:6;37325:27;37340:3;37345:6;37325:14;:27::i;:::-;13885:7;;:44;;;;;;-1:-1:-1;;;;;13885:44:0;;;;;;;;;;;;;;;;;;;;;;37315:37;;-1:-1:-1;13885:7:0;;;:24;;:44;;;;;;;;;;;;;;;:7;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;13885:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13885:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13885:44:0;13877:89;;;;;;;-1:-1:-1;;;;;13877:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4807:1;;;37131:229;;;;:::o;26734:117::-;26794:4;26818:25;26794:4;26835:7;26818:25;:16;:25;:::i;37655:235::-;4788:7;;;;4787:8;4779:17;;;;;;37842:40;37854:12;37868:6;37876:5;37842:11;:40::i;:::-;37655:235;;;:::o;29463:128::-;28811:10;;;;28803:49;;;;;;;-1:-1:-1;;;;;28803:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25410:20;25419:10;25410:8;:20::i;:::-;25402:72;;;;;;-1:-1:-1;;;;;25402:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29531:10;:18;;-1:-1:-1;;29531:18:0;;;29565;;;;29544:5;;29565:18;29463:128::o;16632:131::-;-1:-1:-1;;;;;16731:15:0;;;16704:7;16731:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;16632:131::o;37898:194::-;4788:7;;;;4787:8;4779:17;;;;;;38021:10;38033:6;38057:27;38070:6;38078:5;38057:12;:27::i;:::-;14332:7;;:38;;;;;;-1:-1:-1;;;;;14332:38:0;;;;;;;;;;;;;;;:7;;;;;:20;;:38;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;14332:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14332:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14332:38:0;14324:79;;;;;;;-1:-1:-1;;;;;14324:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14571:345;9925:9;:7;:9::i;:::-;9917:18;;;;;;;;-1:-1:-1;;;;;14657:31:0;;;;14649:87;;;;-1:-1:-1;;;;;14649:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14755:37;14782:8;14755:18;:37::i;:::-;14747:83;;;;;;-1:-1:-1;;;;;14747:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14841:7;:18;;-1:-1:-1;;;;;14841:18:0;;-1:-1:-1;;14841:18:0;;;;;;;;14875:33;;;;;;;;;;;;;;;;14571:345;:::o;31588:344::-;31700:12;31739:42;31755:5;31762:3;31767:6;31775:5;31739:15;:42::i;:::-;-1:-1:-1;31723:58:0;;-1:-1:-1;;31792:48:0;;;;;;;;-1:-1:-1;;;;;31792:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31861:38;31880:5;31887:3;31892:6;31861:18;:38::i;:::-;31853:71;;;;;;;-1:-1:-1;;;;;31853:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;38372:282;38543:5;38550:3;38555:6;38580:66;38605:5;38612:3;38617:6;38625:5;38632:13;38580:24;:66::i;:::-;13885:7;;:44;;;;;;-1:-1:-1;;;;;13885:44:0;;;;;;;;;;;;;;;;;;;;;;:7;;;;;:24;;:44;;;;;;;;;;;;;;:7;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;13885:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13885:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13885:44:0;13877:89;;;;;;;-1:-1:-1;;;;;13877:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38372:282;;;;;;;;:::o;10820:109::-;9925:9;:7;:9::i;:::-;9917:18;;;;;;;;10893:28;10912:8;10893:18;:28::i;22930:::-;;;;:::o;21932:254::-;-1:-1:-1;;;;;22025:21:0;;;;22017:30;;;;;;-1:-1:-1;;;;;22066:19:0;;;;22058:28;;;;;;-1:-1:-1;;;;;22099:15:0;;;;;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;;:32;;;22147:31;;;;;;;;;;;;;;;;;21932:254;;;:::o;25876:122::-;25933:21;:8;25946:7;25933:21;:12;:21;:::i;:::-;25970:20;;-1:-1:-1;;;;;25970:20:0;;;;;;;;25876:122;:::o;31263:313::-;31345:12;31370;31409:39;31425:5;31432:3;31437:6;31409:39;;;;;;;;;;;;;:15;:39::i;:::-;-1:-1:-1;31393:55:0;;-1:-1:-1;;31459:48:0;;;;;;;;-1:-1:-1;;;;;31459:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31530:38;31549:5;31556:3;31561:6;31530:18;:38::i;:::-;31520:48;31263:313;-1:-1:-1;;;;;31263:313:0:o;16937:140::-;16998:4;17015:32;17025:10;17037:2;17041:5;17015:9;:32::i;34749:670::-;26558:24;26571:10;26558:12;:24::i;:::-;26550:80;;;;;;-1:-1:-1;;;;;26550:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34937:12;34976:9;;;;;;;;;-1:-1:-1;;;;;34976:9:0;-1:-1:-1;;;;;34976:32:0;;35023:10;35048:12;35075:6;35096:5;35116:13;34976:164;;;;;-1:-1:-1;;;34976:164:0;;;;;;;-1:-1:-1;;;;;34976:164:0;-1:-1:-1;;;;;34976:164:0;;;;;;-1:-1:-1;;;;;34976:164:0;-1:-1:-1;;;;;34976:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34976:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34976:164:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34976:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34976:164:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34976:164:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34976:164:0;;-1:-1:-1;35151:52:0;;;;;;;;-1:-1:-1;;;;;35151:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35232:23;35242:12;35232:9;:23::i;:::-;35222:33;;;35214:67;;;;;-1:-1:-1;;;;;35214:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35292:27;35298:12;35312:6;35292:5;:27::i;:::-;35368:12;-1:-1:-1;;;;;35335:76:0;;35356:10;35382:6;35390:5;35397:13;35335:76;;;;-1:-1:-1;;;;;35335:76:0;-1:-1:-1;;;;;35335:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35335:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35335:76:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35335:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26641:1;34749:670;;;;:::o;8522:150::-;8580:7;8612:5;;;8636:6;;;;8628:15;;;;;;8663:1;8522:150;-1:-1:-1;;;8522:150:0:o;2840:165::-;2912:4;-1:-1:-1;;;;;2937:21:0;;;;2929:30;;;;;;-1:-1:-1;;;;;;2977:20:0;:11;:20;;;;;;;;;;;;;;;2840:165::o;27210:142::-;27274:28;:12;27294:7;27274:28;:19;:28;:::i;:::-;27318:26;;-1:-1:-1;;;;;27318:26:0;;;;;;;;27210:142;:::o;3908:130::-;3968:24;:8;3984:7;3968:24;:15;:24;:::i;:::-;4008:22;;-1:-1:-1;;;;;4008:22:0;;;;;;;;3908:130;:::o;11811:627::-;11871:4;12383:20;;12422:8;;11811:627::o;3778:122::-;3835:21;:8;3848:7;3835:21;:12;:21;:::i;:::-;3872:20;;-1:-1:-1;;;;;3872:20:0;;;;;;;;3778:122;:::o;26006:130::-;26066:24;:8;26082:7;26066:24;:15;:24;:::i;:::-;26106:22;;-1:-1:-1;;;;;26106:22:0;;;;;;;;26006:130;:::o;30300:376::-;30435:9;;:67;;;;;30462:10;30435:67;;;;;;-1:-1:-1;;;;;30435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30396:12;;30435:9;;;;;:26;;30462:10;30474:12;;30488:6;;30496:5;;30435:67;;;;;;;;;;;;;;30396:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30435:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30435:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30435:67:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30435:67:0;;-1:-1:-1;30513:46:0;;;;;;;;-1:-1:-1;;;;;30513:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30572:31;30582:12;30596:6;30572:9;:31::i;:::-;30640:12;-1:-1:-1;;;;;30619:49:0;30628:10;-1:-1:-1;;;;;30619:49:0;;30654:6;30662:5;30619:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30619:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30300:376;;;;:::o;8284:150::-;8342:7;8370:6;;;;8362:15;;;;;;-1:-1:-1;8400:5:0;;;8284:150::o;27064:134::-;27125:25;:12;27142:7;27125:25;:16;:25;:::i;:::-;27166:24;;-1:-1:-1;;;;;27166:24:0;;;;;;;;27064:134;:::o;30684:268::-;30747:12;30772;30811:28;30823:3;30828:6;30811:28;;;;;;;;;;;;;:11;:28::i;:::-;-1:-1:-1;30795:44:0;;-1:-1:-1;;30850:44:0;;;;;;;;-1:-1:-1;;;;;30850:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30917:27;30932:3;30937:6;30917:14;:27::i;:::-;30907:37;30684:268;-1:-1:-1;;;;30684:268:0:o;29599:365::-;28811:10;;;;28803:49;;;;;;;-1:-1:-1;;;;;28803:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25410:20;25419:10;25410:8;:20::i;:::-;25402:72;;;;;;-1:-1:-1;;;;;25402:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29753:9;;:50;;;;;-1:-1:-1;;;;;29753:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29714:12;;29753:9;;;;;:21;;29775:12;;29789:6;;29797:5;;29753:50;;;;;;;;;;;;;;29714:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29753:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29753:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29753:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29753:50:0;;-1:-1:-1;29814:41:0;;;;;;;;-1:-1:-1;;;;;29814:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29866:27;29872:12;29886:6;29866:5;:27::i;:::-;29928:12;-1:-1:-1;;;;;29909:47:0;29916:10;-1:-1:-1;;;;;29909:47:0;;29942:6;29950:5;29909:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;29972:320:0;30081:9;;:49;;;;;30104:10;30081:49;;;;;;;;;;;;;;;;;;;;;;;;;;;30042:12;;-1:-1:-1;;;;;30081:9:0;;:22;;30104:10;30116:6;;30124:5;;30081:49;;;;;;;;;;;;;;;;30042:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30081:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30081:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30081:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30081:49:0;;-1:-1:-1;30141:42:0;;;;;;;;-1:-1:-1;;;;;30141:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30196:25;30202:10;30214:6;30196:5;:25::i;:::-;30258:10;-1:-1:-1;;;;;30237:47:0;30246:10;-1:-1:-1;;;;;30237:47:0;;30270:6;30278:5;30237:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30237:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29972:320;;;:::o;18345:228::-;18424:4;18441:26;18451:4;18457:2;18461:5;18441:9;:26::i;:::-;-1:-1:-1;;;;;18505:14:0;;;;;;:8;:14;;;;;;;;18493:10;18505:26;;;;;;;;;18478:65;;18487:4;;18505:37;;18536:5;18505:37;:30;:37;:::i;18478:65::-;-1:-1:-1;18561:4:0;18345:228;;;;;:::o;34048:693::-;26558:24;26571:10;26558:12;:24::i;:::-;26550:80;;;;;;-1:-1:-1;;;;;26550:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34253:12;34292:9;;;;;;;;;-1:-1:-1;;;;;34292:9:0;-1:-1:-1;;;;;34292:34:0;;34341:10;34366:5;34386:3;34404:6;34425:5;34445:13;34292:177;;;;;-1:-1:-1;;;34292:177:0;;;;;;;-1:-1:-1;;;;;34292:177:0;-1:-1:-1;;;;;34292:177:0;;;;;;-1:-1:-1;;;;;34292:177:0;-1:-1:-1;;;;;34292:177:0;;;;;;-1:-1:-1;;;;;34292:177:0;-1:-1:-1;;;;;34292:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34292:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34292:177:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34292:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34292:177:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34292:177:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34292:177:0;;-1:-1:-1;34480:54:0;;;;;;;-1:-1:-1;;;;;34480:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34563:16;34573:5;34563:9;:16::i;:::-;34553:26;;;34545:60;;;;;-1:-1:-1;;;;;34545:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34616:29;34626:5;34633:3;34638:6;34616:9;:29::i;:::-;34699:3;-1:-1:-1;;;;;34661:72:0;34692:5;-1:-1:-1;;;;;34661:72:0;;34680:10;34704:6;34712:5;34719:13;34661:72;;;;-1:-1:-1;;;;;34661:72:0;-1:-1:-1;;;;;34661:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34661:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34661:72:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34661:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26641:1;34048:693;;;;;:::o;11079:187::-;-1:-1:-1;;;;;11153:22:0;;;;11145:31;;;;;;11213:6;;11192:38;;-1:-1:-1;;;;;11192:38:0;;;;11213:6;;11192:38;;11213:6;;11192:38;11241:6;:17;;-1:-1:-1;;11241:17:0;-1:-1:-1;;;;;11241:17:0;;;;;;;;;;11079:187::o;2292:186::-;-1:-1:-1;;;;;2369:21:0;;;;2361:30;;;;;;2411:18;2415:4;2421:7;2411:3;:18::i;:::-;2410:19;2402:28;;;;;;-1:-1:-1;;;;;2443:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;2443:27:0;2466:4;2443:27;;;2292:186::o;20273:262::-;-1:-1:-1;;;;;20361:16:0;;;;20353:25;;;;;;-1:-1:-1;;;;;20409:15:0;;;;;;:9;:15;;;;;;:26;;20429:5;20409:26;:19;:26;:::i;:::-;-1:-1:-1;;;;;20391:15:0;;;;;;;:9;:15;;;;;;:44;;;;20462:13;;;;;;;:24;;20480:5;20462:24;:17;:24;:::i;:::-;-1:-1:-1;;;;;20446:13:0;;;;;;;:9;:13;;;;;;;;;:40;;;;20502:25;;;;;;;20446:13;;20502:25;;;;;;;;;;;;;20273:262;;;:::o;23227:200::-;23310:13;;:24;;23328:5;23310:24;:17;:24;:::i;:::-;23294:13;:40;23392:27;23404:7;23413:5;23392:11;:27::i;:::-;23227:200;;:::o;2557:189::-;-1:-1:-1;;;;;2637:21:0;;;;2629:30;;;;;;2678:18;2682:4;2688:7;2678:3;:18::i;:::-;2670:27;;;;;;;;-1:-1:-1;;;;;2710:20:0;2733:5;2710:20;;;;;;;;;;;:28;;-1:-1:-1;;2710:28:0;;;2557:189::o;22585:182::-;22656:21;22662:7;22671:5;22656;:21::i;:::-;-1:-1:-1;;;;;22718:17:0;;;;;;:8;:17;;;;;;;;22706:10;22718:29;;;;;;;;;22688:71;;22697:7;;22718:40;;22752:5;22718:40;:33;:40;:::i;36526:166::-;36588:6;36413:3;;36383:26;36399:9;36383:11;;:15;;:26;;;;:::i;:::-;:33;;36375:69;;;;;-1:-1:-1;;;;;36375:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36621:11;;:23;;36637:6;36621:23;:15;:23;:::i;:::-;36607:11;:37;36655:29;36667:8;36677:6;36655:11;:29::i;21390:269::-;-1:-1:-1;;;;;21465:21:0;;;;21457:30;;;;;;21515:12;;:23;;21532:5;21515:23;:16;:23;:::i;:::-;21500:12;:38;-1:-1:-1;;;;;21570:18:0;;;;;;:9;:18;;;;;;:29;;21593:5;21570:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;21549:18:0;;;;;;:9;:18;;;;;;;;:50;;;;21615:36;;;;;;;21549:18;;21615:36;;;;;;;;;;;21390:269;;:::o;20887:::-;-1:-1:-1;;;;;20962:21:0;;;;20954:30;;;;;;21012:12;;:23;;21029:5;21012:23;:16;:23;:::i;:::-;20997:12;:38;-1:-1:-1;;;;;21067:18:0;;;;;;:9;:18;;;;;;:29;;21090:5;21067:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;21046:18:0;;;;;;:9;:18;;;;;;;;:50;;;;21112:36;;;;;;;21046:18;;;;21112:36;;;;;;;;;;20887:269;;:::o

Swarm Source

bzzr://47019c3539fcedb634408cd6c43e8a5e4e651bf313ec9ff2ef8acd2213417f0d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.