Latest 11 txns

TxHash Age From To Value [TxFee]
0x5db3586ed36190cd6dfc86e0bec24f5122840ad14e2a5509e1bed24b5815314840 days 7 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.001198494
0x65d5b2c49a2f6fc758a83f7b2e394c8bcf1d5a24445e07d71acd8cd4d998ad0040 days 8 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.001218954
0x3668205eebb6c27358dd3eef7a99bf7d082fdce61df07e53d234de75cee3305f40 days 8 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.001213322
0xdee68f423b79ff82335b49aaf862a63eb8d94287445bca78ab3bd521b1eaadfc40 days 8 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.001213322
0x19e43e3914334c0d514b461b175cd9ec165a98cfe481bcac2f38f562d503552140 days 8 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.001213322
0x17407f06c66cfcc72b6748e3d4a09ce54503f526bc4437057b39a0c56b92846640 days 9 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.000055407
0x914398d573820de966775f442037c21059097502af17d1b28f1600a535b8ff1240 days 9 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.000055407
0xda4908455d304c9ae0c3c648866ceb757da73c10f7de32ce15d16edd524e6dfb40 days 9 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.001213322
0x9daa02f2cc1a36ddede8207db123b0f8a1f775723b7380c304083a49fee28c3840 days 9 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.001220362
0x3af955c1ea2ad4dacce9d867e6cab4fe4c3f30120b8c3a6c3d1864d42d8f8ef340 days 9 hrs ago0x4899c9e222aee9b078d876fc55930690bd92d228  IN   0x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether0.005248606
0xc8cde02895fd931a3d82ecc8f7ecfeca10e6f1e0ac391d01c8efd73a976313e5102 days 26 mins ago0x98e0c47340aa437a1bbd976c69ba686eca996c58  IN    Contract Creation0 Ether0.006257379
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0x9fecae634591b049a61f10768a529193251be2197b2b0506a1969fd7bb53788a104039547 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x9fecae634591b049a61f10768a529193251be2197b2b0506a1969fd7bb53788a104039547 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x14b0fa8020b9ddf0157d62cb2a2fdc569bc5381f061b811257437bf09bfd7ccd104039439 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x7194378703fd708565bc6f8f757f8f05bfc52729df7c1060e14dfc5b5610925d104012109 hrs 30 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x8b660af5c94b6efd2555f0281c956ff8b55d11ff05443c4c5dad13c3e5ef19d3104011369 hrs 45 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x46c9cca0c48853fa0348bfdea888de44a216fffd18c6843a892ec743fd7280be104011229 hrs 48 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xded8f0ad79a3bcc2dcd4b5f523c06ae702ab15449030d36ea6e000d5720b1851104011179 hrs 48 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xded8f0ad79a3bcc2dcd4b5f523c06ae702ab15449030d36ea6e000d5720b1851104011179 hrs 48 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x80d3b2c0746f43778945c589bbf5217263d3cd9085a958ca101da47ebc1310361040099010 hrs 14 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xd06b9d7f8bd2fd9272d4a3f68ba098874f6c04ffdb08bb884408ac05723a83ff1040097710 hrs 17 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x2ad06b79203a3b753f564f7f9072cb19fa6f2294c7890c1868d8759c21336fd41040091910 hrs 28 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x2ad06b79203a3b753f564f7f9072cb19fa6f2294c7890c1868d8759c21336fd41040091910 hrs 28 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x42f5745760e93d41cac63816d35ecf858f56911b251e45aa18b7aea86f327b461040086110 hrs 40 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xe0dabd201d6537455d5d86010183f431602169cc5f4944c88fcd7af116f781851040037412 hrs 18 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xe0dabd201d6537455d5d86010183f431602169cc5f4944c88fcd7af116f781851040037412 hrs 18 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x029cf0bb6ce7dffb15e79465480d76506b7e1398ef2c6c4a9c374406179161541040035612 hrs 22 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x1bc437c63d13dae2222c2bc7c4c5539ce89d66a276c3a05721bf21f1be1383bb1040018512 hrs 57 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x1bc437c63d13dae2222c2bc7c4c5539ce89d66a276c3a05721bf21f1be1383bb1040018512 hrs 57 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xf448ed8a5df67fa7bf294232aa29285a9e23bd952b8f848bd8664c107acef4801040016613 hrs 1 min ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xaca25aeff69552398eba36e7a4d81273db7a166f948a2db63237bb63d4f31d031039887517 hrs 21 mins ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x4cfe2675c3a0f2f0f700676303e536d57328677f149b2e5e90cc3bb4c864b341103963081 day 2 hrs ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xb8ee6b3c1cbe05c8788534d2ffff9c6ee15df4ef5a31c0d18a23d85a63219079103958931 day 3 hrs ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xb8ee6b3c1cbe05c8788534d2ffff9c6ee15df4ef5a31c0d18a23d85a63219079103958931 day 3 hrs ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0xfaf37a58ab3a54aa900f2765df532c40ca22b52ff8802a68e0620901e4754cef103958571 day 4 hrs ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
0x46182acd71be2418e68e46ec12a6036f3065d4fb0ba99776c47398b66c723ce4103957061 day 4 hrs ago0x91110c2f67e2881a8540417be9eadf5bc9f2f2480x2c650ff32fdd8fe97a8427bb9bb3dd71518c69cc0 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: SecurityTokenRegistry
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.24;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting '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;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

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

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
interface IOwnable {
    /**
    * @dev Returns owner
    */
    function owner() external view returns (address);

    /**
    * @dev Allows the current owner to relinquish control of the contract.
    */
    function renounceOwnership() external;

    /**
    * @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) external;

}

/**
 * @title Interface for security token proxy deployment
 */
interface ISTFactory {

    /**
     * @notice Deploys the token and adds default modules like permission manager and transfer manager.
     * Future versions of the proxy can attach different modules or pass some other paramters.
     * @param _name is the name of the Security token
     * @param _symbol is the symbol of the Security Token
     * @param _decimals is the number of decimals of the Security Token
     * @param _tokenDetails is the off-chain data associated with the Security Token
     * @param _issuer is the owner of the Security Token
     * @param _divisible whether the token is divisible or not
     * @param _polymathRegistry is the address of the Polymath Registry contract
     */
    function deployToken(
        string _name,
        string _symbol,
        uint8 _decimals,
        string _tokenDetails,
        address _issuer,
        bool _divisible,
        address _polymathRegistry
    )
        external
        returns (address);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address _owner) external view returns (uint256);
    function allowance(address _owner, address _spender) external view returns (uint256);
    function transfer(address _to, uint256 _value) external returns (bool);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool);
    function approve(address _spender, uint256 _value) external returns (bool);
    function decreaseApproval(address _spender, uint _subtractedValue) external returns (bool);
    function increaseApproval(address _spender, uint _addedValue) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Interface for the Polymath Security Token Registry contract
 */
interface ISecurityTokenRegistry {

   /**
     * @notice Creates a new Security Token and saves it to the registry
     * @param _name Name of the token
     * @param _ticker Ticker ticker of the security token
     * @param _tokenDetails Off-chain details of the token
     * @param _divisible Whether the token is divisible or not
     */
    function generateSecurityToken(string _name, string _ticker, string _tokenDetails, bool _divisible) external;

    /**
     * @notice Adds a new custom Security Token and saves it to the registry. (Token should follow the ISecurityToken interface)
     * @param _name Name of the token
     * @param _ticker Ticker of the security token
     * @param _owner Owner of the token
     * @param _securityToken Address of the securityToken
     * @param _tokenDetails Off-chain details of the token
     * @param _deployedAt Timestamp at which security token comes deployed on the ethereum blockchain
     */
    function modifySecurityToken(
        string _name,
        string _ticker,
        address _owner,
        address _securityToken,
        string _tokenDetails,
        uint256 _deployedAt
    )
        external;

    /**
     * @notice Registers the token ticker for its particular owner
     * @notice once the token ticker is registered to its owner then no other issuer can claim
     * @notice its ownership. If the ticker expires and its issuer hasn't used it, then someone else can take it.
     * @param _owner Address of the owner of the token
     * @param _ticker Token ticker
     * @param _tokenName Name of the token
     */
    function registerTicker(address _owner, string _ticker, string _tokenName) external;

    /**
    * @notice Changes the protocol version and the SecurityToken contract
    * @notice Used only by Polymath to upgrade the SecurityToken contract and add more functionalities to future versions
    * @notice Changing versions does not affect existing tokens.
    * @param _STFactoryAddress Address of the proxy.
    * @param _major Major version of the proxy.
    * @param _minor Minor version of the proxy.
    * @param _patch Patch version of the proxy
    */
    function setProtocolVersion(address _STFactoryAddress, uint8 _major, uint8 _minor, uint8 _patch) external;

    /**
    * @notice Check that Security Token is registered
    * @param _securityToken Address of the Scurity token
    * @return bool
    */
    function isSecurityToken(address _securityToken) external view returns (bool);

    /**
    * @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) external;

    /**
     * @notice Get security token address by ticker name
     * @param _ticker Symbol of the Scurity token
     * @return address
     */
    function getSecurityTokenAddress(string _ticker) external view returns (address);

     /**
     * @notice Get security token data by its address
     * @param _securityToken Address of the Scurity token.
     * @return string Symbol of the Security Token.
     * @return address Address of the issuer of Security Token.
     * @return string Details of the Token.
     * @return uint256 Timestamp at which Security Token get launched on Polymath platform.
     */
    function getSecurityTokenData(address _securityToken) external view returns (string, address, string, uint256);

    /**
     * @notice Get the current STFactory Address
     */
    function getSTFactoryAddress() external view returns(address);

    /**
     * @notice Get Protocol version
     */
    function getProtocolVersion() external view returns(uint8[]);

    /**
     * @notice Used to get the ticker list as per the owner
     * @param _owner Address which owns the list of tickers
     */
    function getTickersByOwner(address _owner) external view returns(bytes32[]);

    /**
     * @notice Returns the list of tokens owned by the selected address
     * @param _owner is the address which owns the list of tickers
     * @dev Intention is that this is called off-chain so block gas limit is not relevant
     */
    function getTokensByOwner(address _owner) external view returns(address[]);

    /**
     * @notice Returns the owner and timestamp for a given ticker
     * @param _ticker ticker
     * @return address
     * @return uint256
     * @return uint256
     * @return string
     * @return bool
     */
    function getTickerDetails(string _ticker) external view returns (address, uint256, uint256, string, bool);

    /**
     * @notice Modifies the ticker details. Only polymath account has the ability
     * to do so. Only allowed to modify the tickers which are not yet deployed
     * @param _owner Owner of the token
     * @param _ticker Token ticker
     * @param _tokenName Name of the token
     * @param _registrationDate Date on which ticker get registered
     * @param _expiryDate Expiry date of the ticker
     * @param _status Token deployed status
     */
    function modifyTicker(
        address _owner,
        string _ticker,
        string _tokenName,
        uint256 _registrationDate,
        uint256 _expiryDate,
        bool _status
    )
        external;

     /**
     * @notice Removes the ticker details and associated ownership & security token mapping
     * @param _ticker Token ticker
     */
    function removeTicker(string _ticker) external;

    /**
     * @notice Transfers the ownership of the ticker
     * @dev _newOwner Address whom ownership to transfer
     * @dev _ticker Ticker
     */
    function transferTickerOwnership(address _newOwner, string _ticker) external;

    /**
     * @notice Changes the expiry time for the token ticker
     * @param _newExpiry New time period for token ticker expiry
     */
    function changeExpiryLimit(uint256 _newExpiry) external;

    /**
    * @notice Sets the ticker registration fee in POLY tokens
    * @param _tickerRegFee Registration fee in POLY tokens (base 18 decimals)
    */
   function changeTickerRegistrationFee(uint256 _tickerRegFee) external;

   /**
    * @notice Sets the ticker registration fee in POLY tokens
    * @param _stLaunchFee Registration fee in POLY tokens (base 18 decimals)
    */
   function changeSecurityLaunchFee(uint256 _stLaunchFee) external;

    /**
     * @notice Change the PolyToken address
     * @param _newAddress Address of the polytoken
     */
    function updatePolyTokenAddress(address _newAddress) external;

    /**
     * @notice Gets the security token launch fee
     * @return Fee amount
     */
    function getSecurityTokenLaunchFee() external view returns(uint256);

    /**
     * @notice Gets the ticker registration fee
     * @return Fee amount
     */
    function getTickerRegistrationFee() external view returns(uint256);

    /**
     * @notice Gets the expiry limit
     * @return Expiry limit
     */
    function getExpiryLimit() external view returns(uint256);

    /**
     * @notice Checks whether the registry is paused or not
     * @return bool
     */
    function isPaused() external view returns(bool);

    /**
     * @notice Gets the owner of the contract
     * @return address owner
     */
    function owner() external view returns(address);

}

contract EternalStorage {

    /// @notice Internal mappings used to store all kinds on data into the contract
    mapping(bytes32 => uint256) internal uintStorage;
    mapping(bytes32 => string) internal stringStorage;
    mapping(bytes32 => address) internal addressStorage;
    mapping(bytes32 => bytes) internal bytesStorage;
    mapping(bytes32 => bool) internal boolStorage;
    mapping(bytes32 => int256) internal intStorage;
    mapping(bytes32 => bytes32) internal bytes32Storage;

    /// @notice Internal mappings used to store arrays of different data types
    mapping(bytes32 => bytes32[]) internal bytes32ArrayStorage;
    mapping(bytes32 => uint256[]) internal uintArrayStorage;
    mapping(bytes32 => address[]) internal addressArrayStorage;
    mapping(bytes32 => string[]) internal stringArrayStorage;

    //////////////////
    //// set functions
    //////////////////
    /// @notice Set the key values using the Overloaded `set` functions
    /// Ex- string version = "0.0.1"; replace to
    /// set(keccak256(abi.encodePacked("version"), "0.0.1");
    /// same for the other variables as well some more example listed below
    /// ex1 - address securityTokenAddress = 0x123; replace to
    /// set(keccak256(abi.encodePacked("securityTokenAddress"), 0x123);
    /// ex2 - bytes32 tokenDetails = "I am ST20"; replace to
    /// set(keccak256(abi.encodePacked("tokenDetails"), "I am ST20");
    /// ex3 - mapping(string => address) ownedToken;
    /// set(keccak256(abi.encodePacked("ownedToken", "Chris")), 0x123);
    /// ex4 - mapping(string => uint) tokenIndex;
    /// tokenIndex["TOKEN"] = 1; replace to set(keccak256(abi.encodePacked("tokenIndex", "TOKEN"), 1);
    /// ex5 - mapping(string => SymbolDetails) registeredSymbols; where SymbolDetails is the structure having different type of values as
    /// {uint256 date, string name, address owner} etc.
    /// registeredSymbols["TOKEN"].name = "MyFristToken"; replace to set(keccak256(abi.encodePacked("registeredSymbols_name", "TOKEN"), "MyFirstToken");
    /// More generalized- set(keccak256(abi.encodePacked("registeredSymbols_<struct variable>", "keyname"), "value");

    function set(bytes32 _key, uint256 _value) internal {
        uintStorage[_key] = _value;
    }

    function set(bytes32 _key, address _value) internal {
        addressStorage[_key] = _value;
    }

    function set(bytes32 _key, bool _value) internal {
        boolStorage[_key] = _value;
    }

    function set(bytes32 _key, bytes32 _value) internal {
        bytes32Storage[_key] = _value;
    }

    function set(bytes32 _key, string _value) internal {
        stringStorage[_key] = _value;
    }

    ////////////////////
    /// get functions
    ////////////////////
    /// @notice Get function use to get the value of the singleton state variables
    /// Ex1- string public version = "0.0.1";
    /// string _version = getString(keccak256(abi.encodePacked("version"));
    /// Ex2 - assert(temp1 == temp2); replace to
    /// assert(getUint(keccak256(abi.encodePacked(temp1)) == getUint(keccak256(abi.encodePacked(temp2));
    /// Ex3 - mapping(string => SymbolDetails) registeredSymbols; where SymbolDetails is the structure having different type of values as
    /// {uint256 date, string name, address owner} etc.
    /// string _name = getString(keccak256(abi.encodePacked("registeredSymbols_name", "TOKEN"));

    function getBool(bytes32 _key) internal view returns (bool) {
        return boolStorage[_key];
    }

    function getUint(bytes32 _key) internal view returns (uint256) {
        return uintStorage[_key];
    }

    function getAddress(bytes32 _key) internal view returns (address) {
        return addressStorage[_key];
    }

    function getString(bytes32 _key) internal view returns (string) {
        return stringStorage[_key];
    }

    function getBytes32(bytes32 _key) internal view returns (bytes32) {
        return bytes32Storage[_key];
    }


    ////////////////////////////
    // deleteArray functions
    ////////////////////////////
    /// @notice Function used to delete the array element.
    /// Ex1- mapping(address => bytes32[]) tokensOwnedByOwner;
    /// For deleting the item from array developers needs to create a funtion for that similarly
    /// in this case we have the helper function deleteArrayBytes32() which will do it for us
    /// deleteArrayBytes32(keccak256(abi.encodePacked("tokensOwnedByOwner", 0x1), 3); -- it will delete the index 3


    //Deletes from mapping (bytes32 => array[]) at index _index
    function deleteArrayAddress(bytes32 _key, uint256 _index) internal {
        address[] storage array = addressArrayStorage[_key];
        require(_index < array.length, "Index should less than length of the array");
        array[_index] = array[array.length - 1];
        array.length = array.length - 1;
    }

    //Deletes from mapping (bytes32 => bytes32[]) at index _index
    function deleteArrayBytes32(bytes32 _key, uint256 _index) internal {
        bytes32[] storage array = bytes32ArrayStorage[_key];
        require(_index < array.length, "Index should less than length of the array");
        array[_index] = array[array.length - 1];
        array.length = array.length - 1;
    }

    //Deletes from mapping (bytes32 => uint[]) at index _index
    function deleteArrayUint(bytes32 _key, uint256 _index) internal {
        uint256[] storage array = uintArrayStorage[_key];
        require(_index < array.length, "Index should less than length of the array");
        array[_index] = array[array.length - 1];
        array.length = array.length - 1;
    }

    //Deletes from mapping (bytes32 => string[]) at index _index
    function deleteArrayString(bytes32 _key, uint256 _index) internal {
        string[] storage array = stringArrayStorage[_key];
        require(_index < array.length, "Index should less than length of the array");
        array[_index] = array[array.length - 1];
        array.length = array.length - 1;
    }

    ////////////////////////////
    //// pushArray functions
    ///////////////////////////
    /// @notice Below are the helper functions to facilitate storing arrays of different data types.
    /// Ex1- mapping(address => bytes32[]) tokensOwnedByTicker;
    /// tokensOwnedByTicker[owner] = tokensOwnedByTicker[owner].push("xyz"); replace with
    /// pushArray(keccak256(abi.encodePacked("tokensOwnedByTicker", owner), "xyz");

    /// @notice use to store the values for the array
    /// @param _key bytes32 type
    /// @param _value [uint256, string, bytes32, address] any of the data type in array
    function pushArray(bytes32 _key, address _value) internal {
        addressArrayStorage[_key].push(_value);
    }

    function pushArray(bytes32 _key, bytes32 _value) internal {
        bytes32ArrayStorage[_key].push(_value);
    }

    function pushArray(bytes32 _key, string _value) internal {
        stringArrayStorage[_key].push(_value);
    }

    function pushArray(bytes32 _key, uint256 _value) internal {
        uintArrayStorage[_key].push(_value);
    }

    /////////////////////////
    //// Set Array functions
    ////////////////////////
    /// @notice used to intialize the array
    /// Ex1- mapping (address => address[]) public reputation;
    /// reputation[0x1] = new address[](0); It can be replaced as
    /// setArray(hash('reputation', 0x1), new address[](0)); 
    
    function setArray(bytes32 _key, address[] _value) internal {
        addressArrayStorage[_key] = _value;
    }

    function setArray(bytes32 _key, uint256[] _value) internal {
        uintArrayStorage[_key] = _value;
    }

    function setArray(bytes32 _key, bytes32[] _value) internal {
        bytes32ArrayStorage[_key] = _value;
    }

    function setArray(bytes32 _key, string[] _value) internal {
        stringArrayStorage[_key] = _value;
    }

    /////////////////////////
    /// getArray functions
    /////////////////////////
    /// @notice Get functions to get the array of the required data type
    /// Ex1- mapping(address => bytes32[]) tokensOwnedByOwner;
    /// getArrayBytes32(keccak256(abi.encodePacked("tokensOwnedByOwner", 0x1)); It return the bytes32 array
    /// Ex2- uint256 _len =  tokensOwnedByOwner[0x1].length; replace with
    /// getArrayBytes32(keccak256(abi.encodePacked("tokensOwnedByOwner", 0x1)).length;

    function getArrayAddress(bytes32 _key) internal view returns(address[]) {
        return addressArrayStorage[_key];
    }

    function getArrayBytes32(bytes32 _key) internal view returns(bytes32[]) {
        return bytes32ArrayStorage[_key];
    }

    function getArrayString(bytes32 _key) internal view returns(string[]) {
        return stringArrayStorage[_key];
    }

    function getArrayUint(bytes32 _key) internal view returns(uint[]) {
        return uintArrayStorage[_key];
    }

    ///////////////////////////////////
    /// setArrayIndexValue() functions
    ///////////////////////////////////
    /// @notice set the value of particular index of the address array
    /// Ex1- mapping(bytes32 => address[]) moduleList;
    /// general way is -- moduleList[moduleType][index] = temp; 
    /// It can be re-write as -- setArrayIndexValue(keccak256(abi.encodePacked('moduleList', moduleType)), index, temp); 

    function setArrayIndexValue(bytes32 _key, uint256 _index, address _value) internal {
        addressArrayStorage[_key][_index] = _value;
    }

    function setArrayIndexValue(bytes32 _key, uint256 _index, uint256 _value) internal {
        uintArrayStorage[_key][_index] = _value;
    }

    function setArrayIndexValue(bytes32 _key, uint256 _index, bytes32 _value) internal {
        bytes32ArrayStorage[_key][_index] = _value;
    }

    function setArrayIndexValue(bytes32 _key, uint256 _index, string _value) internal {
        stringArrayStorage[_key][_index] = _value;
    }

        /////////////////////////////
        /// Public getters functions
        /////////////////////////////

    function getUintValues(bytes32 _variable) public view returns(uint256) {
        return uintStorage[_variable];
    }

    function getBoolValues(bytes32 _variable) public view returns(bool) {
        return boolStorage[_variable];
    }

    function getStringValues(bytes32 _variable) public view returns(string) {
        return stringStorage[_variable];
    }

    function getAddressValues(bytes32 _variable) public view returns(address) {
        return addressStorage[_variable];
    }

    function getBytes32Values(bytes32 _variable) public view returns(bytes32) {
        return bytes32Storage[_variable];
    }

    function getBytesValues(bytes32 _variable) public view returns(bytes) {
        return bytesStorage[_variable];
    }

}

/**
 * @title Utility contract for reusable code
 */
library Util {

   /**
    * @notice Changes a string to upper case
    * @param _base String to change
    */
    function upper(string _base) internal pure returns (string) {
        bytes memory _baseBytes = bytes(_base);
        for (uint i = 0; i < _baseBytes.length; i++) {
            bytes1 b1 = _baseBytes[i];
            if (b1 >= 0x61 && b1 <= 0x7A) {
                b1 = bytes1(uint8(b1)-32);
            }
            _baseBytes[i] = b1;
        }
        return string(_baseBytes);
    }

    /**
     * @notice Changes the string into bytes32
     * @param _source String that need to convert into bytes32
     */
    /// Notice - Maximum Length for _source will be 32 chars otherwise returned bytes32 value will have lossy value.
    function stringToBytes32(string memory _source) internal pure returns (bytes32) {
        return bytesToBytes32(bytes(_source), 0);
    }

    /**
     * @notice Changes bytes into bytes32
     * @param _b Bytes that need to convert into bytes32
     * @param _offset Offset from which to begin conversion
     */
    /// Notice - Maximum length for _source will be 32 chars otherwise returned bytes32 value will have lossy value.
    function bytesToBytes32(bytes _b, uint _offset) internal pure returns (bytes32) {
        bytes32 result;

        for (uint i = 0; i < _b.length; i++) {
            result |= bytes32(_b[_offset + i] & 0xFF) >> (i * 8);
        }
        return result;
    }

    /**
     * @notice Changes the bytes32 into string
     * @param _source that need to convert into string
     */
    function bytes32ToString(bytes32 _source) internal pure returns (string result) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(_source) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

    /**
     * @notice Gets function signature from _data
     * @param _data Passed data
     * @return bytes4 sig
     */
    function getSig(bytes _data) internal pure returns (bytes4 sig) {
        uint len = _data.length < 4 ? _data.length : 4;
        for (uint i = 0; i < len; i++) {
            sig = bytes4(uint(sig) + uint(_data[i]) * (2 ** (8 * (len - 1 - i))));
        }
    }


}

library Encoder {

    function getKey(string _key) internal pure returns (bytes32) {
        return bytes32(keccak256(abi.encodePacked(_key)));
    }

    function getKey(string _key1, address _key2) internal pure returns (bytes32) {
        return bytes32(keccak256(abi.encodePacked(_key1, _key2)));
    }

    function getKey(string _key1, string _key2) internal pure returns (bytes32) {
        return bytes32(keccak256(abi.encodePacked(_key1, _key2)));
    }

    function getKey(string _key1, uint256 _key2) internal pure returns (bytes32) {
        return bytes32(keccak256(abi.encodePacked(_key1, _key2)));
    }

    function getKey(string _key1, bytes32 _key2) internal pure returns (bytes32) {
        return bytes32(keccak256(abi.encodePacked(_key1, _key2)));
    }

    function getKey(string _key1, bool _key2) internal pure returns (bytes32) {
        return bytes32(keccak256(abi.encodePacked(_key1, _key2)));
    }

}

/**
 * @title Helper library use to compare or validate the semantic versions
 */

library VersionUtils {

    /**
     * @notice This function is used to validate the version submitted
     * @param _current Array holds the present version of ST
     * @param _new Array holds the latest version of the ST
     * @return bool
     */
    function isValidVersion(uint8[] _current, uint8[] _new) internal pure returns(bool) {
        bool[] memory _temp = new bool[](_current.length);
        uint8 counter = 0;
        for (uint8 i = 0; i < _current.length; i++) {
            if (_current[i] < _new[i])
                _temp[i] = true;
            else
                _temp[i] = false;
        }

        for (i = 0; i < _current.length; i++) {
            if (i == 0) {
                if (_current[i] <= _new[i])
                    if(_temp[0]) {
                        counter = counter + 3;
                        break;
                    } else
                        counter++;
                else
                    return false;
            } else {
                if (_temp[i-1])
                    counter++;
                else if (_current[i] <= _new[i])
                    counter++;
                else
                    return false;
            }
        }
        if (counter == _current.length)
            return true;
    }

    /**
     * @notice Used to compare the lower bound with the latest version
     * @param _version1 Array holds the lower bound of the version
     * @param _version2 Array holds the latest version of the ST
     * @return bool
     */
    function compareLowerBound(uint8[] _version1, uint8[] _version2) internal pure returns(bool) {
        require(_version1.length == _version2.length, "Input length mismatch");
        uint counter = 0;
        for (uint8 j = 0; j < _version1.length; j++) {
            if (_version1[j] == 0)
                counter ++;
        }
        if (counter != _version1.length) {
            counter = 0;
            for (uint8 i = 0; i < _version1.length; i++) {
                if (_version2[i] > _version1[i])
                    return true;
                else if (_version2[i] < _version1[i])
                    return false;
                else
                    counter++;
            }
            if (counter == _version1.length - 1)
                return true;
            else
                return false;
        } else
            return true;
    }

    /**
     * @notice Used to compare the upper bound with the latest version
     * @param _version1 Array holds the upper bound of the version
     * @param _version2 Array holds the latest version of the ST
     * @return bool
     */
    function compareUpperBound(uint8[] _version1, uint8[] _version2) internal pure returns(bool) {
        require(_version1.length == _version2.length, "Input length mismatch");
        uint counter = 0;
        for (uint8 j = 0; j < _version1.length; j++) {
            if (_version1[j] == 0)
                counter ++;
        }
        if (counter != _version1.length) {
            counter = 0;
            for (uint8 i = 0; i < _version1.length; i++) {
                if (_version1[i] > _version2[i])
                    return true;
                else if (_version1[i] < _version2[i])
                    return false;
                else
                    counter++;
            }
            if (counter == _version1.length - 1)
                return true;
            else
                return false;
        } else
            return true;
    }


    /**
     * @notice Used to pack the uint8[] array data into uint24 value
     * @param _major Major version
     * @param _minor Minor version
     * @param _patch Patch version
     */
    function pack(uint8 _major, uint8 _minor, uint8 _patch) internal pure returns(uint24) {
        return (uint24(_major) << 16) | (uint24(_minor) << 8) | uint24(_patch);
    }

    /**
     * @notice Used to convert packed data into uint8 array
     * @param _packedVersion Packed data
     */
    function unpack(uint24 _packedVersion) internal pure returns (uint8[]) {
        uint8[] memory _unpackVersion = new uint8[](3);
        _unpackVersion[0] = uint8(_packedVersion >> 16);
        _unpackVersion[1] = uint8(_packedVersion >> 8);
        _unpackVersion[2] = uint8(_packedVersion);
        return _unpackVersion;
    }


}

/**
 * @title Registry contract for issuers to register their tickers and security tokens
 */
contract SecurityTokenRegistry is ISecurityTokenRegistry, EternalStorage {

    /**
     * @notice state variables

       address public polyToken;
       uint256 public stLaunchFee;
       uint256 public tickerRegFee;
       uint256 public expiryLimit;
       uint256 public latestProtocolVersion;
       bool public paused;
       address public owner;
       address public polymathRegistry;

       address[] public activeUsers;
       mapping(address => bool) public seenUsers;

       mapping(address => bytes32[]) userToTickers;
       mapping(string => address) tickerToSecurityToken;
       mapping(string => uint) tickerIndex;
       mapping(string => TickerDetails) registeredTickers;
       mapping(address => SecurityTokenData) securityTokens;
       mapping(bytes32 => address) protocolVersionST;
       mapping(uint256 => ProtocolVersion) versionData;

       struct ProtocolVersion {
           uint8 major;
           uint8 minor;
           uint8 patch;
       }

       struct TickerDetails {
           address owner;
           uint256 registrationDate;
           uint256 expiryDate;
           string tokenName;
           bool status;
       }

       struct SecurityTokenData {
           string ticker;
           string tokenDetails;
           uint256 deployedAt;
       }

     */

    using SafeMath for uint256;

    bytes32 constant INITIALIZE = 0x9ef7257c3339b099aacf96e55122ee78fb65a36bd2a6c19249882be9c98633bf;
    bytes32 constant POLYTOKEN = 0xacf8fbd51bb4b83ba426cdb12f63be74db97c412515797993d2a385542e311d7;
    bytes32 constant STLAUNCHFEE = 0xd677304bb45536bb7fdfa6b9e47a3c58fe413f9e8f01474b0a4b9c6e0275baf2;
    bytes32 constant TICKERREGFEE = 0x2fcc69711628630fb5a42566c68bd1092bc4aa26826736293969fddcd11cb2d2;
    bytes32 constant EXPIRYLIMIT = 0x604268e9a73dfd777dcecb8a614493dd65c638bad2f5e7d709d378bd2fb0baee;
    bytes32 constant PAUSED = 0xee35723ac350a69d2a92d3703f17439cbaadf2f093a21ba5bf5f1a53eb2a14d9;
    bytes32 constant OWNER = 0x02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0;
    bytes32 constant POLYMATHREGISTRY = 0x90eeab7c36075577c7cc5ff366e389fefa8a18289b949bab3529ab4471139d4d;

    // Emit when network becomes paused
    event Pause(uint256 _timestammp);
     // Emit when network becomes unpaused
    event Unpause(uint256 _timestamp);
    // Emit when the ticker is removed from the registry
    event TickerRemoved(string _ticker, uint256 _removedAt, address _removedBy);
    // Emit when the token ticker expiry is changed
    event ChangeExpiryLimit(uint256 _oldExpiry, uint256 _newExpiry);
     // Emit when changeSecurityLaunchFee is called
    event ChangeSecurityLaunchFee(uint256 _oldFee, uint256 _newFee);
    // Emit when changeTickerRegistrationFee is called
    event ChangeTickerRegistrationFee(uint256 _oldFee, uint256 _newFee);
    // Emit when ownership gets transferred
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    // Emit when ownership of the ticker gets changed
    event ChangeTickerOwnership(string _ticker, address indexed _oldOwner, address indexed _newOwner);
    // Emit at the time of launching a new security token
    event NewSecurityToken(
        string _ticker,
        string _name,
        address indexed _securityTokenAddress,
        address indexed _owner,
        uint256 _addedAt,
        address _registrant,
        bool _fromAdmin,
        uint256 _registrationFee
    );
    // Emit after ticker registration
    event RegisterTicker(
        address indexed _owner,
        string _ticker,
        string _name,
        uint256 indexed _registrationDate,
        uint256 indexed _expiryDate,
        bool _fromAdmin,
        uint256 _registrationFee
    );

    /////////////////////////////
    // Modifiers
    /////////////////////////////

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner(),"sender must be owner");
        _;
    }

    /**
     * @notice Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPausedOrOwner() {
        if (msg.sender == owner())
            _;
        else {
            require(!isPaused(), "Already paused");
            _;
        }
    }

    /**
     * @notice Modifier to make a function callable only when the contract is not paused and ignore is msg.sender is owner.
     */
    modifier whenNotPaused() {
        require(!isPaused(), "Already paused");
        _;
    }


    /**
     * @notice Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(isPaused(), "Should not be paused");
        _;
    }


    /////////////////////////////
    // Initialization
    /////////////////////////////

    /**
     * @notice Initializes instance of STR
     * @param _polymathRegistry is the address of the Polymath Registry
     * @param _STFactory is the address of the Proxy contract for Security Tokens
     * @param _stLaunchFee is the fee in POLY required to launch a token
     * @param _tickerRegFee is the fee in POLY required to register a ticker
     * @param _polyToken is the address of the POLY ERC20 token
     * @param _owner is the owner of the STR
     */
    function initialize(
        address _polymathRegistry,
        address _STFactory,
        uint256 _stLaunchFee,
        uint256 _tickerRegFee,
        address _polyToken,
        address _owner
    )
        external
        payable
    {
        require(!getBool(INITIALIZE),"already initialized");
        require(
            _STFactory != address(0) && _polyToken != address(0) && _owner != address(0) && _polymathRegistry != address(0),
            "Invalid address"
        );
        require(_stLaunchFee != 0 && _tickerRegFee != 0, "Fees should not be 0");
        set(POLYTOKEN, _polyToken);
        set(STLAUNCHFEE, _stLaunchFee);
        set(TICKERREGFEE, _tickerRegFee);
        set(EXPIRYLIMIT, uint256(60 * 1 days));
        set(PAUSED, false);
        set(OWNER, _owner);
        set(POLYMATHREGISTRY, _polymathRegistry);
        _setProtocolVersion(_STFactory, uint8(2), uint8(0), uint8(0));
        set(INITIALIZE, true);
    }

    /////////////////////////////
    // Token Ticker Management
    /////////////////////////////

    /**
     * @notice Registers the token ticker to the selected owner
     * @notice Once the token ticker is registered to its owner then no other issuer can claim
     * @notice its ownership. If the ticker expires and its issuer hasn't used it, then someone else can take it.
     * @param _owner is address of the owner of the token
     * @param _ticker is unique token ticker
     * @param _tokenName is the name of the token
     */
    function registerTicker(address _owner, string _ticker, string _tokenName) external whenNotPausedOrOwner {
        require(_owner != address(0), "Owner should not be 0x");
        require(bytes(_ticker).length > 0 && bytes(_ticker).length <= 10, "Ticker length range (0,10]");
        // Attempt to charge the reg fee if it is > 0 POLY
        uint256 tickerFee = getTickerRegistrationFee();
        if (tickerFee > 0)
            require(IERC20(getAddress(POLYTOKEN)).transferFrom(msg.sender, address(this), tickerFee), "Insufficent allowance");
        string memory ticker = Util.upper(_ticker);
        require(_tickerAvailable(ticker), "Ticker is reserved");
        // Check whether ticker was previously registered (and expired)
        address previousOwner = _tickerOwner(ticker);
        if (previousOwner != address(0)) {
            _deleteTickerOwnership(previousOwner, ticker);
        }
        /*solium-disable-next-line security/no-block-members*/
        _addTicker(_owner, ticker, _tokenName, now, now.add(getExpiryLimit()), false, false, tickerFee);
    }

    /**
     * @notice Internal - Sets the details of the ticker
     */
    function _addTicker(
        address _owner, 
        string _ticker, 
        string _tokenName, 
        uint256 _registrationDate, 
        uint256 _expiryDate, 
        bool _status, 
        bool _fromAdmin, 
        uint256 _fee
        ) internal {
        _setTickerOwnership(_owner, _ticker);
        _storeTickerDetails(_ticker, _owner, _registrationDate, _expiryDate, _tokenName, _status);
        emit RegisterTicker(_owner, _ticker, _tokenName, _registrationDate, _expiryDate, _fromAdmin, _fee);
    }

    /**
     * @notice Modifies the ticker details. Only Polymath has the ability to do so.
     * @notice Only allowed to modify the tickers which are not yet deployed.
     * @param _owner is the owner of the token
     * @param _ticker is the token ticker
     * @param _tokenName is the name of the token
     * @param _registrationDate is the date at which ticker is registered
     * @param _expiryDate is the expiry date for the ticker
     * @param _status is the token deployment status
     */
    function modifyTicker(
        address _owner,
        string _ticker,
        string _tokenName,
        uint256 _registrationDate,
        uint256 _expiryDate,
        bool _status
        ) external onlyOwner {
        require(bytes(_ticker).length > 0 && bytes(_ticker).length <= 10, "Ticker length range (0,10]");
        require(_expiryDate != 0 && _registrationDate != 0, "Dates should not be 0");
        require(_registrationDate <= _expiryDate, "Registration date should < expiry date");
        require(_owner != address(0), "Invalid address");
        string memory ticker = Util.upper(_ticker);
        _modifyTicker(_owner, ticker, _tokenName, _registrationDate, _expiryDate, _status);
    }

    /**
     * @notice Internal -- Modifies the ticker details.
     */
    function _modifyTicker(
        address _owner,
        string _ticker,
        string _tokenName,
        uint256 _registrationDate,
        uint256 _expiryDate,
        bool _status
        ) internal {
        address currentOwner = _tickerOwner(_ticker);
        if (currentOwner != address(0)) {
            _deleteTickerOwnership(currentOwner, _ticker);
        }
        if (_tickerStatus(_ticker) && !_status) {
            set(Encoder.getKey("tickerToSecurityToken", _ticker), address(0));
        }
        // If status is true, there must be a security token linked to the ticker already
        if (_status) {
            require(getAddress(Encoder.getKey("tickerToSecurityToken", _ticker)) != address(0), "Token not registered");
        }
        _addTicker(_owner, _ticker, _tokenName, _registrationDate, _expiryDate, _status, true, uint256(0));
    }

    function _tickerOwner(string _ticker) internal view returns(address) {
        return getAddress(Encoder.getKey("registeredTickers_owner", _ticker));
    }

    /**
     * @notice Removes the ticker details, associated ownership & security token mapping
     * @param _ticker is the token ticker
     */
    function removeTicker(string _ticker) external onlyOwner {
        string memory ticker = Util.upper(_ticker);
        address owner = _tickerOwner(ticker);
        require(owner != address(0), "Ticker doesn't exist");
        _deleteTickerOwnership(owner, ticker);
        set(Encoder.getKey("tickerToSecurityToken", ticker), address(0));
        _storeTickerDetails(ticker, address(0), 0, 0, "", false);
        /*solium-disable-next-line security/no-block-members*/
        emit TickerRemoved(ticker, now, msg.sender);
    }

    /**
     * @notice Internal - Checks if the entered ticker is registered and has not expired
     * @param _ticker is the token ticker
     * @return bool
     */
    function _tickerAvailable(string _ticker) internal view returns(bool) {
        if (_tickerOwner(_ticker) != address(0)) {
            /*solium-disable-next-line security/no-block-members*/
            if ((now > getUint(Encoder.getKey("registeredTickers_expiryDate", _ticker))) && !_tickerStatus(_ticker)) {
                return true;
            } else
                return false;
        }
        return true;
    }

    function _tickerStatus(string _ticker) internal view returns(bool) {
        return getBool(Encoder.getKey("registeredTickers_status", _ticker));
    }

    /**
     * @notice Internal - Sets the ticker owner
     * @param _owner is the address of the owner of the ticker
     * @param _ticker is the ticker symbol
     */
    function _setTickerOwnership(address _owner, string _ticker) internal {
        bytes32 _ownerKey = Encoder.getKey("userToTickers", _owner);
        uint256 length = uint256(getArrayBytes32(_ownerKey).length);
        pushArray(_ownerKey, Util.stringToBytes32(_ticker));
        set(Encoder.getKey("tickerIndex", _ticker), length);
        bytes32 seenKey = Encoder.getKey("seenUsers", _owner);
        if (!getBool(seenKey)) {
            pushArray(Encoder.getKey("activeUsers"), _owner);
            set(seenKey, true);
        }
    }

    /**
     * @notice Internal - Stores the ticker details
     */
    function _storeTickerDetails(
        string _ticker,
        address _owner,
        uint256 _registrationDate,
        uint256 _expiryDate,
        string _tokenName,
        bool _status
        ) internal {
        bytes32 key = Encoder.getKey("registeredTickers_owner", _ticker);
        if (getAddress(key) != _owner)
            set(key, _owner);
        key = Encoder.getKey("registeredTickers_registrationDate", _ticker);
        if (getUint(key) != _registrationDate)
            set(key, _registrationDate);
        key = Encoder.getKey("registeredTickers_expiryDate", _ticker);
        if (getUint(key) != _expiryDate)
            set(key, _expiryDate);
        key = Encoder.getKey("registeredTickers_tokenName", _ticker);
        if (Encoder.getKey(getString(key)) != Encoder.getKey(_tokenName))
            set(key, _tokenName);
        key = Encoder.getKey("registeredTickers_status", _ticker);
        if (getBool(key) != _status)
            set(key, _status);
    }

    /**
     * @notice Transfers the ownership of the ticker
     * @param _newOwner is the address of the new owner of the ticker
     * @param _ticker is the ticker symbol
     */
    function transferTickerOwnership(address _newOwner, string _ticker) external whenNotPausedOrOwner {
        string memory ticker = Util.upper(_ticker);
        require(_newOwner != address(0), "Invalid address");
        bytes32 ownerKey = Encoder.getKey("registeredTickers_owner", ticker);
        require(getAddress(ownerKey) == msg.sender, "Not authorised");
        if (_tickerStatus(ticker))
            require(IOwnable(getAddress(Encoder.getKey("tickerToSecurityToken", ticker))).owner() == _newOwner, "New owner does not match token owner");
        _deleteTickerOwnership(msg.sender, ticker);
        _setTickerOwnership(_newOwner, ticker);
        set(ownerKey, _newOwner);
        emit ChangeTickerOwnership(ticker, msg.sender, _newOwner);
    }

    /**
     * @notice Internal - Removes the owner of a ticker
     */
    function _deleteTickerOwnership(address _owner, string _ticker) internal {
        uint256 index = uint256(getUint(Encoder.getKey("tickerIndex", _ticker)));
        bytes32 ownerKey = Encoder.getKey("userToTickers", _owner);
        bytes32[] memory tickers = getArrayBytes32(ownerKey);
        assert(index < tickers.length);
        assert(_tickerOwner(_ticker) == _owner);
        deleteArrayBytes32(ownerKey, index);
        if (getArrayBytes32(ownerKey).length > index) {
            bytes32 switchedTicker = getArrayBytes32(ownerKey)[index];
            set(Encoder.getKey("tickerIndex", Util.bytes32ToString(switchedTicker)), index);
        }
    }

    /**
     * @notice Changes the expiry time for the token ticker. Only available to Polymath.
     * @param _newExpiry is the new expiry for newly generated tickers
     */
    function changeExpiryLimit(uint256 _newExpiry) external onlyOwner {
        require(_newExpiry >= 1 days, "Expiry should >= 1 day");
        emit ChangeExpiryLimit(getUint(EXPIRYLIMIT), _newExpiry);
        set(EXPIRYLIMIT, _newExpiry);
    }

    /**
     * @notice Returns the list of tickers owned by the selected address
     * @param _owner is the address which owns the list of tickers
     */
    function getTickersByOwner(address _owner) external view returns(bytes32[]) {
        uint counter = 0;
        // accessing the data structure userTotickers[_owner].length
        bytes32[] memory tickers = getArrayBytes32(Encoder.getKey("userToTickers", _owner));
        for (uint i = 0; i < tickers.length; i++) {
            string memory ticker = Util.bytes32ToString(tickers[i]);
            /*solium-disable-next-line security/no-block-members*/
            if (getUint(Encoder.getKey("registeredTickers_expiryDate", ticker)) >= now || _tickerStatus(ticker)) {
                counter ++;
            }
        }
        bytes32[] memory tempList = new bytes32[](counter);
        counter = 0;
        for (i = 0; i < tickers.length; i++) {
            ticker = Util.bytes32ToString(tickers[i]);
            /*solium-disable-next-line security/no-block-members*/
            if (getUint(Encoder.getKey("registeredTickers_expiryDate", ticker)) >= now || _tickerStatus(ticker)) {
                tempList[counter] = tickers[i];
                counter ++;
            }
        }
        return tempList;
    }

    /**
     * @notice Returns the list of tokens owned by the selected address
     * @param _owner is the address which owns the list of tickers
     * @dev Intention is that this is called off-chain so block gas limit is not relevant
     */
    function getTokensByOwner(address _owner) external view returns(address[]) {
        // Loop over all active users, then all associated tickers of those users
        // This ensures we find tokens, even if their owner has been modified
        address[] memory activeUsers = getArrayAddress(Encoder.getKey("activeUsers"));
        bytes32[] memory tickers;
        address token;
        uint256 count = 0;
        uint256 i = 0;
        uint256 j = 0;
        for (i = 0; i < activeUsers.length; i++) {
            tickers = getArrayBytes32(Encoder.getKey("userToTickers", activeUsers[i]));
            for (j = 0; j < tickers.length; j++) {
                token = getAddress(Encoder.getKey("tickerToSecurityToken", Util.bytes32ToString(tickers[j])));
                if (token != address(0)) {
                    if (IOwnable(token).owner() == _owner) {
                        count = count + 1;
                    }
                }
            }
        }
        uint256 index = 0;
        address[] memory result = new address[](count);
        for (i = 0; i < activeUsers.length; i++) {
            tickers = getArrayBytes32(Encoder.getKey("userToTickers", activeUsers[i]));
            for (j = 0; j < tickers.length; j++) {
                token = getAddress(Encoder.getKey("tickerToSecurityToken", Util.bytes32ToString(tickers[j])));
                if (token != address(0)) {
                    if (IOwnable(token).owner() == _owner) {
                        result[index] = token;
                        index = index + 1;
                    }
                }
            }
        }
        return result;
    }

    /**
     * @notice Returns the owner and timestamp for a given ticker
     * @param _ticker is the ticker symbol
     * @return address
     * @return uint256
     * @return uint256
     * @return string
     * @return bool
     */
    function getTickerDetails(string _ticker) external view returns (address, uint256, uint256, string, bool) {
        string memory ticker = Util.upper(_ticker);
        bool tickerStatus = _tickerStatus(ticker);
        uint256 expiryDate = getUint(Encoder.getKey("registeredTickers_expiryDate", ticker));
        /*solium-disable-next-line security/no-block-members*/
        if ((tickerStatus == true) || (expiryDate > now)) {
            return
            (
                _tickerOwner(ticker),
                getUint(Encoder.getKey("registeredTickers_registrationDate", ticker)),
                expiryDate,
                getString(Encoder.getKey("registeredTickers_tokenName", ticker)),
                tickerStatus
            );
        } else
            return (address(0), uint256(0), uint256(0), "", false);
    }

    /////////////////////////////
    // Security Token Management
    /////////////////////////////

    /**
     * @notice Deploys an instance of a new Security Token and records it to the registry
     * @param _name is the name of the token
     * @param _ticker is the ticker symbol of the security token
     * @param _tokenDetails is the off-chain details of the token
     * @param _divisible is whether or not the token is divisible
     */
    function generateSecurityToken(string _name, string _ticker, string _tokenDetails, bool _divisible) external whenNotPausedOrOwner {
        require(bytes(_name).length > 0 && bytes(_ticker).length > 0, "Ticker length > 0");
        string memory ticker = Util.upper(_ticker);
        bytes32 statusKey = Encoder.getKey("registeredTickers_status", ticker);
        require(!getBool(statusKey), "Already deployed");
        set(statusKey, true);
        require(_tickerOwner(ticker) == msg.sender, "Not authorised");
        /*solium-disable-next-line security/no-block-members*/
        require(getUint(Encoder.getKey("registeredTickers_expiryDate", ticker)) >= now, "Ticker gets expired");

        uint256 launchFee = getSecurityTokenLaunchFee();
        if (launchFee > 0)
            require(IERC20(getAddress(POLYTOKEN)).transferFrom(msg.sender, address(this), launchFee), "Insufficient allowance");

        address newSecurityTokenAddress = ISTFactory(getSTFactoryAddress()).deployToken(
            _name,
            ticker,
            18,
            _tokenDetails,
            msg.sender,
            _divisible,
            getAddress(POLYMATHREGISTRY)
        );

        /*solium-disable-next-line security/no-block-members*/
        _storeSecurityTokenData(newSecurityTokenAddress, ticker, _tokenDetails, now);
        set(Encoder.getKey("tickerToSecurityToken", ticker), newSecurityTokenAddress);
        /*solium-disable-next-line security/no-block-members*/
        emit NewSecurityToken(ticker, _name, newSecurityTokenAddress, msg.sender, now, msg.sender, false, launchFee);
    }

    /**
     * @notice Adds a new custom Security Token and saves it to the registry. (Token should follow the ISecurityToken interface)
     * @param _name is the name of the token
     * @param _ticker is the ticker symbol of the security token
     * @param _owner is the owner of the token
     * @param _securityToken is the address of the securityToken
     * @param _tokenDetails is the off-chain details of the token
     * @param _deployedAt is the timestamp at which the security token is deployed
     */
    function modifySecurityToken(
        string _name,
        string _ticker,
        address _owner,
        address _securityToken,
        string _tokenDetails,
        uint256 _deployedAt
    )
        external
        onlyOwner
    {
        require(bytes(_name).length > 0 && bytes(_ticker).length > 0, "String length > 0");
        require(bytes(_ticker).length <= 10, "Ticker length range (0,10]");
        require(_deployedAt != 0 && _owner != address(0), "0 value params not allowed");
        string memory ticker = Util.upper(_ticker);
        require(_securityToken != address(0), "ST address is 0x");
        uint256 registrationTime = getUint(Encoder.getKey("registeredTickers_registrationDate", ticker));
        uint256 expiryTime = getUint(Encoder.getKey("registeredTickers_expiryDate", ticker));
        if (registrationTime == 0) {
            /*solium-disable-next-line security/no-block-members*/
            registrationTime = now;
            expiryTime = registrationTime.add(getExpiryLimit());
        }
        set(Encoder.getKey("tickerToSecurityToken", ticker), _securityToken);
        _modifyTicker(_owner, ticker, _name, registrationTime, expiryTime, true);
        _storeSecurityTokenData(_securityToken, ticker, _tokenDetails, _deployedAt);
        emit NewSecurityToken(ticker, _name, _securityToken, _owner, _deployedAt, msg.sender, true, getSecurityTokenLaunchFee());
    }

    /**
     * @notice Internal - Stores the security token details
     */
    function _storeSecurityTokenData(address _securityToken, string _ticker, string _tokenDetails, uint256 _deployedAt) internal {
        set(Encoder.getKey("securityTokens_ticker", _securityToken), _ticker);
        set(Encoder.getKey("securityTokens_tokenDetails", _securityToken), _tokenDetails);
        set(Encoder.getKey("securityTokens_deployedAt", _securityToken), _deployedAt);
    }

    /**
    * @notice Checks that Security Token is registered
    * @param _securityToken is the address of the security token
    * @return bool
    */
    function isSecurityToken(address _securityToken) external view returns (bool) {
        return (keccak256(bytes(getString(Encoder.getKey("securityTokens_ticker", _securityToken)))) != keccak256(""));
    }

    /**
     * @notice Returns the security token address by ticker symbol
     * @param _ticker is the ticker of the security token
     * @return address
     */
    function getSecurityTokenAddress(string _ticker) external view returns (address) {
        string memory ticker = Util.upper(_ticker);
        return getAddress(Encoder.getKey("tickerToSecurityToken", ticker));
    }

     /**
     * @notice Returns the security token data by address
     * @param _securityToken is the address of the security token.
     * @return string is the ticker of the security Token.
     * @return address is the issuer of the security Token.
     * @return string is the details of the security token.
     * @return uint256 is the timestamp at which security Token was deployed.
     */
    function getSecurityTokenData(address _securityToken) external view returns (string, address, string, uint256) {
        return (
            getString(Encoder.getKey("securityTokens_ticker", _securityToken)),
            IOwnable(_securityToken).owner(),
            getString(Encoder.getKey("securityTokens_tokenDetails", _securityToken)),
            getUint(Encoder.getKey("securityTokens_deployedAt", _securityToken))
        );
    }

    /////////////////////////////
    // Ownership, lifecycle & Utility
    /////////////////////////////

    /**
    * @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) external onlyOwner {
        require(_newOwner != address(0), "Invalid address");
        emit OwnershipTransferred(getAddress(OWNER), _newOwner);
        set(OWNER, _newOwner);
    }

    /**
    * @notice Called by the owner to pause, triggers stopped state
    */
    function pause() external whenNotPaused onlyOwner {
        set(PAUSED, true);
        /*solium-disable-next-line security/no-block-members*/
        emit Pause(now);
    }

    /**
    * @notice Called by the owner to unpause, returns to normal state
    */
    function unpause() external whenPaused onlyOwner {
        set(PAUSED, false);
        /*solium-disable-next-line security/no-block-members*/
        emit Unpause(now);
    }

    /**
    * @notice Sets the ticker registration fee in POLY tokens. Only Polymath.
    * @param _tickerRegFee is the registration fee in POLY tokens (base 18 decimals)
    */
    function changeTickerRegistrationFee(uint256 _tickerRegFee) external onlyOwner {
        uint256 fee = getUint(TICKERREGFEE);
        require(fee != _tickerRegFee, "Fee not changed");
        emit ChangeTickerRegistrationFee(fee, _tickerRegFee);
        set(TICKERREGFEE, _tickerRegFee);
    }

   /**
    * @notice Sets the ticker registration fee in POLY tokens. Only Polymath.
    * @param _stLaunchFee is the registration fee in POLY tokens (base 18 decimals)
    */
    function changeSecurityLaunchFee(uint256 _stLaunchFee) external onlyOwner {
        uint256 fee = getUint(STLAUNCHFEE);
        require(fee != _stLaunchFee, "Fee not changed");
        emit ChangeSecurityLaunchFee(fee, _stLaunchFee);
        set(STLAUNCHFEE, _stLaunchFee);
    }

    /**
    * @notice Reclaims all ERC20Basic compatible tokens
    * @param _tokenContract is the address of the token contract
    */
    function reclaimERC20(address _tokenContract) external onlyOwner {
        require(_tokenContract != address(0), "Invalid address");
        IERC20 token = IERC20(_tokenContract);
        uint256 balance = token.balanceOf(address(this));
        require(token.transfer(owner(), balance), "Transfer failed");
    }

    /**
    * @notice Changes the protocol version and the SecurityToken contract
    * @notice Used only by Polymath to upgrade the SecurityToken contract and add more functionalities to future versions
    * @notice Changing versions does not affect existing tokens.
    * @param _STFactoryAddress is the address of the proxy.
    * @param _major Major version of the proxy.
    * @param _minor Minor version of the proxy.
    * @param _patch Patch version of the proxy
    */
    function setProtocolVersion(address _STFactoryAddress, uint8 _major, uint8 _minor, uint8 _patch) external onlyOwner {
        require(_STFactoryAddress != address(0), "0x address is not allowed");
        _setProtocolVersion(_STFactoryAddress, _major, _minor, _patch);
    }

    /**
    * @notice Internal - Changes the protocol version and the SecurityToken contract
    */
    function _setProtocolVersion(address _STFactoryAddress, uint8 _major, uint8 _minor, uint8 _patch) internal {
        uint8[] memory _version = new uint8[](3);
        _version[0] = _major;
        _version[1] = _minor;
        _version[2] = _patch;
        uint24 _packedVersion = VersionUtils.pack(_major, _minor, _patch);
        require(VersionUtils.isValidVersion(getProtocolVersion(), _version),"In-valid version");
        set(Encoder.getKey("latestVersion"), uint256(_packedVersion));
        set(Encoder.getKey("protocolVersionST", getUint(Encoder.getKey("latestVersion"))), _STFactoryAddress);
    }

    /**
     * @notice Returns the current STFactory Address
     */
    function getSTFactoryAddress() public view returns(address) {
        return getAddress(Encoder.getKey("protocolVersionST", getUint(Encoder.getKey("latestVersion"))));
    }

    /**
     * @notice Gets Protocol version
     */
    function getProtocolVersion() public view returns(uint8[]) {
        return VersionUtils.unpack(uint24(getUint(Encoder.getKey("latestVersion"))));
    }

    /**
     * @notice Changes the PolyToken address. Only Polymath.
     * @param _newAddress is the address of the polytoken.
     */
    function updatePolyTokenAddress(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "Invalid address");
        set(POLYTOKEN, _newAddress);
    }

    /**
     * @notice Gets the security token launch fee
     * @return Fee amount
     */
    function getSecurityTokenLaunchFee() public view returns(uint256) {
        return getUint(STLAUNCHFEE);
    }

    /**
     * @notice Gets the ticker registration fee
     * @return Fee amount
     */
    function getTickerRegistrationFee() public view returns(uint256) {
        return getUint(TICKERREGFEE);
    }

    /**
     * @notice Gets the expiry limit
     * @return Expiry limit
     */
    function getExpiryLimit() public view returns(uint256) {
        return getUint(EXPIRYLIMIT);
    }

    /**
     * @notice Check whether the registry is paused or not
     * @return bool
     */
    function isPaused() public view returns(bool) {
        return getBool(PAUSED);
    }

    /**
     * @notice Gets the owner of the contract
     * @return address owner
     */
    function owner() public view returns(address) {
        return getAddress(OWNER);
    }

}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"getExpiryLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_variable","type":"bytes32"}],"name":"getBoolValues","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newExpiry","type":"uint256"}],"name":"changeExpiryLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getTickersByOwner","outputs":[{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_variable","type":"bytes32"}],"name":"getUintValues","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_ticker","type":"string"},{"name":"_tokenName","type":"string"}],"name":"registerTicker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getProtocolVersion","outputs":[{"name":"","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getTokensByOwner","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stLaunchFee","type":"uint256"}],"name":"changeSecurityLaunchFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_ticker","type":"string"}],"name":"getTickerDetails","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_ticker","type":"string"},{"name":"_owner","type":"address"},{"name":"_securityToken","type":"address"},{"name":"_tokenDetails","type":"string"},{"name":"_deployedAt","type":"uint256"}],"name":"modifySecurityToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_variable","type":"bytes32"}],"name":"getStringValues","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"}],"name":"reclaimERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_securityToken","type":"address"}],"name":"getSecurityTokenData","outputs":[{"name":"","type":"string"},{"name":"","type":"address"},{"name":"","type":"string"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_ticker","type":"string"},{"name":"_tokenName","type":"string"},{"name":"_registrationDate","type":"uint256"},{"name":"_expiryDate","type":"uint256"},{"name":"_status","type":"bool"}],"name":"modifyTicker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tickerRegFee","type":"uint256"}],"name":"changeTickerRegistrationFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ticker","type":"string"}],"name":"removeTicker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_variable","type":"bytes32"}],"name":"getBytes32Values","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_variable","type":"bytes32"}],"name":"getAddressValues","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_ticker","type":"string"},{"name":"_tokenDetails","type":"string"},{"name":"_divisible","type":"bool"}],"name":"generateSecurityToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_variable","type":"bytes32"}],"name":"getBytesValues","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSecurityTokenLaunchFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"},{"name":"_ticker","type":"string"}],"name":"transferTickerOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_polymathRegistry","type":"address"},{"name":"_STFactory","type":"address"},{"name":"_stLaunchFee","type":"uint256"},{"name":"_tickerRegFee","type":"uint256"},{"name":"_polyToken","type":"address"},{"name":"_owner","type":"address"}],"name":"initialize","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_securityToken","type":"address"}],"name":"isSecurityToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_STFactoryAddress","type":"address"},{"name":"_major","type":"uint8"},{"name":"_minor","type":"uint8"},{"name":"_patch","type":"uint8"}],"name":"setProtocolVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTickerRegistrationFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"updatePolyTokenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getSTFactoryAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_ticker","type":"string"}],"name":"getSecurityTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestammp","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_ticker","type":"string"},{"indexed":false,"name":"_removedAt","type":"uint256"},{"indexed":false,"name":"_removedBy","type":"address"}],"name":"TickerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldExpiry","type":"uint256"},{"indexed":false,"name":"_newExpiry","type":"uint256"}],"name":"ChangeExpiryLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldFee","type":"uint256"},{"indexed":false,"name":"_newFee","type":"uint256"}],"name":"ChangeSecurityLaunchFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldFee","type":"uint256"},{"indexed":false,"name":"_newFee","type":"uint256"}],"name":"ChangeTickerRegistrationFee","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":"_ticker","type":"string"},{"indexed":true,"name":"_oldOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"ChangeTickerOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_ticker","type":"string"},{"indexed":false,"name":"_name","type":"string"},{"indexed":true,"name":"_securityTokenAddress","type":"address"},{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_addedAt","type":"uint256"},{"indexed":false,"name":"_registrant","type":"address"},{"indexed":false,"name":"_fromAdmin","type":"bool"},{"indexed":false,"name":"_registrationFee","type":"uint256"}],"name":"NewSecurityToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_ticker","type":"string"},{"indexed":false,"name":"_name","type":"string"},{"indexed":true,"name":"_registrationDate","type":"uint256"},{"indexed":true,"name":"_expiryDate","type":"uint256"},{"indexed":false,"name":"_fromAdmin","type":"bool"},{"indexed":false,"name":"_registrationFee","type":"uint256"}],"name":"RegisterTicker","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405234801561001057600080fd5b50615ba780620000216000396000f30060806040526004361061019d5763ffffffff60e060020a600035041663165e694a81146101a25780631d8acf1b146101c9578063208b080f146101f557806321c8ad0e1461020f57806326839e5314610280578063321dff171461029857806333ce93fe146102d15780633f4ba83a146102e657806340398d67146102fb57806342c2e5511461031c57806363808bcb146103345780636658076c146103fe57806369ba0fe91461044e5780638456cb59146104db5780638905fd4f146104f05780638da5cb5b146105115780638f9bbf161461054257806392042aee14610621578063959346ae14610665578063972b3ab51461067d578063b187bd261461069d578063b3447ac9146106b2578063baed8bb1146106ca578063c37792b5146106e2578063c6cb7ab81461071f578063c75948f514610737578063d0f6fe421461074c578063d2d1016214610779578063d300a968146107a7578063d3623f98146107c8578063e1ecae9e146107fb578063e6ff950b14610810578063ea47075814610831578063f2fde38b14610846578063fb621f1414610867575b600080fd5b3480156101ae57600080fd5b506101b7610887565b60408051918252519081900360200190f35b3480156101d557600080fd5b506101e16004356108a6565b604080519115158252519081900360200190f35b34801561020157600080fd5b5061020d6004356108be565b005b34801561021b57600080fd5b50610230600160a060020a03600435166109d8565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561026c578181015183820152602001610254565b505050509050019250505060405180910390f35b34801561028c57600080fd5b506101b7600435610b91565b3480156102a457600080fd5b5061020d60048035600160a060020a03169060248035808201929081013591604435908101910135610ba3565b3480156102dd57600080fd5b506102306111b6565b3480156102f257600080fd5b5061020d6111ef565b34801561030757600080fd5b50610230600160a060020a03600435166112f0565b34801561032857600080fd5b5061020d60043561164e565b34801561034057600080fd5b50610354600480356024810191013561176d565b6040518086600160a060020a0316600160a060020a031681526020018581526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b838110156103bf5781810151838201526020016103a7565b50505050905090810190601f1680156103ec5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b34801561040a57600080fd5b5061020d6024600480358281019290820135918135808301929082013591600160a060020a036044358116926064359091169160843591820191013560a4356118fd565b34801561045a57600080fd5b50610466600435611d8d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104a0578181015183820152602001610488565b50505050905090810190601f1680156104cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e757600080fd5b5061020d611e30565b3480156104fc57600080fd5b5061020d600160a060020a0360043516611f1e565b34801561051d57600080fd5b50610526612147565b60408051600160a060020a039092168252519081900360200190f35b34801561054e57600080fd5b50610563600160a060020a0360043516612160565b604051808060200185600160a060020a0316600160a060020a0316815260200180602001848152602001838103835287818151815260200191508051906020019080838360005b838110156105c25781810151838201526020016105aa565b50505050905090810190601f1680156105ef5780820380516001836020036101000a031916815260200191505b5083810382528551815285516020918201918701908083836000838110156103bf5781810151838201526020016103a7565b34801561062d57600080fd5b5061020d60048035600160a060020a0316906024803580820192908101359160443590810191013560643560843560a43515156122a7565b34801561067157600080fd5b5061020d600435612509565b34801561068957600080fd5b5061020d6004803560248101910135612624565b3480156106a957600080fd5b506101e1612846565b3480156106be57600080fd5b506101b760043561285f565b3480156106d657600080fd5b50610526600435612871565b3480156106ee57600080fd5b5061020d6024600480358281019290820135918135808301929082013591604435918201910135606435151561288c565b34801561072b57600080fd5b50610466600435613528565b34801561074357600080fd5b506101b7613592565b34801561075857600080fd5b5061020d60048035600160a060020a031690602480359081019101356135ab565b61020d600160a060020a03600435811690602435811690604435906064359060843581169060a43516613c42565b3480156107b357600080fd5b506101e1600160a060020a0360043516613eaf565b3480156107d457600080fd5b5061020d600160a060020a036004351660ff60243581169060443581169060643516613f7c565b34801561080757600080fd5b506101b7614043565b34801561081c57600080fd5b5061020d600160a060020a036004351661405c565b34801561083d57600080fd5b50610526614117565b34801561085257600080fd5b5061020d600160a060020a0360043516614189565b34801561087357600080fd5b50610526600480356024810191013561429a565b60006108a06000805160206159bc833981519152610b91565b90505b90565b60008181526004602052604090205460ff165b919050565b6108c6612147565b600160a060020a03163314610913576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b6201518081101561096e576040805160e560020a62461bcd02815260206004820152601660248201527f4578706972792073686f756c64203e3d20312064617900000000000000000000604482015290519081900360640190fd5b7f7e1cc0e69ee3b84fb62bbb71687d2565bbb8ad1771bb3e3cd15cbed424c833c86109a66000805160206159bc833981519152610b91565b60408051918252602082018490528051918290030190a16109d56000805160206159bc83398151915282614311565b50565b606060006060600060608060009450610a1c610a176040805190810160405280600d8152602001600080516020615a9c83398151915281525089614323565b614417565b9350600092505b8351831015610aac57610a4c8484815181101515610a3d57fe5b90602001906020020151614479565b915042610a84610a7f6040805190810160405280601c8152602001600080516020615afc833981519152815250856145cd565b610b91565b101580610a955750610a95826146ae565b15610aa1576001909401935b600190920191610a23565b84604051908082528060200260200182016040528015610ad6578160200160208202803883390190505b50905060009450600092505b8351831015610b8757610afc8484815181101515610a3d57fe5b915042610b2f610a7f6040805190810160405280601c8152602001600080516020615afc833981519152815250856145cd565b101580610b405750610b40826146ae565b15610b7c578383815181101515610b5357fe5b906020019060200201518186815181101515610b6b57fe5b602090810290910101526001909401935b600190920191610ae2565b9695505050505050565b60009081526020819052604090205490565b600060606000610bb1612147565b600160a060020a031633600160a060020a03161415610ea357600160a060020a0388161515610c2a576040805160e560020a62461bcd02815260206004820152601660248201527f4f776e65722073686f756c64206e6f7420626520307800000000000000000000604482015290519081900360640190fd5b600086118015610c3b5750600a8611155b1515610c7f576040805160e560020a62461bcd02815260206004820152601a6024820152600080516020615b1c833981519152604482015290519081900360640190fd5b610c87614043565b92506000831115610d8657610ca9600080516020615abc833981519152612871565b6040805160e060020a6323b872dd028152336004820152306024820152604481018690529051600160a060020a0392909216916323b872dd916064808201926020929091908290030181600087803b158015610d0457600080fd5b505af1158015610d18573d6000803e3d6000fd5b505050506040513d6020811015610d2e57600080fd5b50511515610d86576040805160e560020a62461bcd02815260206004820152601560248201527f496e737566666963656e7420616c6c6f77616e63650000000000000000000000604482015290519081900360640190fd5b610dbf87878080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b9150610dca826147e5565b1515610e20576040805160e560020a62461bcd02815260206004820152601260248201527f5469636b65722069732072657365727665640000000000000000000000000000604482015290519081900360640190fd5b610e2982614860565b9050600160a060020a03811615610e4457610e448183614892565b610e9e888387878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505042610e95610e88610887565b429063ffffffff6149cc16565b6000808a6149d9565b6111ac565b610eab612846565b15610eee576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b3c833981519152604482015290519081900360640190fd5b600160a060020a0388161515610f4e576040805160e560020a62461bcd02815260206004820152601660248201527f4f776e65722073686f756c64206e6f7420626520307800000000000000000000604482015290519081900360640190fd5b600086118015610f5f5750600a8611155b1515610fa3576040805160e560020a62461bcd02815260206004820152601a6024820152600080516020615b1c833981519152604482015290519081900360640190fd5b610fab614043565b925060008311156110aa57610fcd600080516020615abc833981519152612871565b6040805160e060020a6323b872dd028152336004820152306024820152604481018690529051600160a060020a0392909216916323b872dd916064808201926020929091908290030181600087803b15801561102857600080fd5b505af115801561103c573d6000803e3d6000fd5b505050506040513d602081101561105257600080fd5b505115156110aa576040805160e560020a62461bcd02815260206004820152601560248201527f496e737566666963656e7420616c6c6f77616e63650000000000000000000000604482015290519081900360640190fd5b6110e387878080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b91506110ee826147e5565b1515611144576040805160e560020a62461bcd02815260206004820152601260248201527f5469636b65722069732072657365727665640000000000000000000000000000604482015290519081900360640190fd5b61114d82614860565b9050600160a060020a03811615611168576111688183614892565b6111ac888387878080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505042610e95610e88610887565b5050505050505050565b60606108a06111ea610a7f6040805190810160405280600d815260200160008051602061599c833981519152815250614b1b565b614be5565b6111f7612846565b151561124d576040805160e560020a62461bcd02815260206004820152601460248201527f53686f756c64206e6f7420626520706175736564000000000000000000000000604482015290519081900360640190fd5b611255612147565b600160a060020a031633146112a2576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b6112bb60008051602061595c8339815191526000614c8a565b6040805142815290517faaa520fdd7d2c83061d632fa017b0432407e798818af63ea908589fceda39ab79181900360200190a1565b6060806060600080600080600060606113456113406040805190810160405280600b81526020017f6163746976655573657273000000000000000000000000000000000000000000815250614b1b565b614caa565b9750600094508493508392505b87518410156114a8576113a2610a176040805190810160405280600d8152602001600080516020615a9c8339815191528152508a8781518110151561139357fe5b90602001906020020151614323565b9650600092505b865183101561149d576113f76113f2604080519081016040528060158152602001600080516020615adc8339815191528152506113ed8a87815181101515610a3d57fe5b6145cd565b612871565b9550600160a060020a038616156114925789600160a060020a031686600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561145057600080fd5b505af1158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b5051600160a060020a03161415611492578460010194505b6001909201916113a9565b600190930192611352565b60009150846040519080825280602002602001820160405280156114d6578160200160208202803883390190505b509050600093505b87518410156116415761151f610a176040805190810160405280600d8152602001600080516020615a9c8339815191528152508a8781518110151561139357fe5b9650600092505b86518310156116365761156a6113f2604080519081016040528060158152602001600080516020615adc8339815191528152506113ed8a87815181101515610a3d57fe5b9550600160a060020a0386161561162b5789600160a060020a031686600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156115c357600080fd5b505af11580156115d7573d6000803e3d6000fd5b505050506040513d60208110156115ed57600080fd5b5051600160a060020a0316141561162b5785818381518110151561160d57fe5b600160a060020a039092166020928302909101909101526001909101905b600190920191611526565b6001909301926114de565b9998505050505050505050565b6000611658612147565b600160a060020a031633146116a5576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b6116bc6000805160206159dc833981519152610b91565b905081811415611716576040805160e560020a62461bcd02815260206004820152600f60248201527f466565206e6f74206368616e6765640000000000000000000000000000000000604482015290519081900360640190fd5b604080518281526020810184905281517f082ce758ae1784abd031015a0eac6700b941db0797e890ae7c4d326a5f8255c0929181900390910190a16117696000805160206159dc83398151915283614311565b5050565b60008060006060600060606000806117b48a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b92506117bf836146ae565b91506117f1610a7f6040805190810160405280601c8152602001600080516020615afc833981519152815250856145cd565b90506001821515148061180357504281115b156118d25761181183614860565b61187a610a7f606060405190810160405280602281526020017f726567697374657265645469636b6572735f726567697374726174696f6e446181526020017f7465000000000000000000000000000000000000000000000000000000000000815250866145cd565b826118c26118bd6040805190810160405280601b81526020017f726567697374657265645469636b6572735f746f6b656e4e616d650000000000815250886145cd565b611d8d565b85975097509750975097506118f0565b60408051602081019091526000808252985088975087965094508593505b5050509295509295909350565b606060008061190a612147565b600160a060020a03163314611957576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b60008b1180156119675750600089115b15156119bd576040805160e560020a62461bcd02815260206004820152601160248201527f537472696e67206c656e677468203e2030000000000000000000000000000000604482015290519081900360640190fd5b600a891115611a04576040805160e560020a62461bcd02815260206004820152601a6024820152600080516020615b1c833981519152604482015290519081900360640190fd5b8315801590611a1b5750600160a060020a03881615155b1515611a71576040805160e560020a62461bcd02815260206004820152601a60248201527f302076616c756520706172616d73206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b611aaa8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b9250600160a060020a0387161515611b0c576040805160e560020a62461bcd02815260206004820152601060248201527f5354206164647265737320697320307800000000000000000000000000000000604482015290519081900360640190fd5b611b75610a7f606060405190810160405280602281526020017f726567697374657265645469636b6572735f726567697374726174696f6e446181526020017f7465000000000000000000000000000000000000000000000000000000000000815250856145cd565b9150611ba7610a7f6040805190810160405280601c8152602001600080516020615afc833981519152815250856145cd565b9050811515611bce57429150611bcb611bbe610887565b839063ffffffff6149cc16565b90505b611c04611bfe604080519081016040528060158152602001600080516020615adc833981519152815250856145cd565b88614d15565b611c4588848e8e8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505085856001614d50565b611c82878488888080601f016020809104026020016040519081016040528093929190818152602001838380828437508c9450614e799350505050565b87600160a060020a031687600160a060020a03167f63d9fb58b25a396dc2ebc591bec9115d1eb9c722dd6cdfcc9be4144d39dc2c26858f8f89336001611cc6613592565b60408051908101859052600160a060020a0384166060820152821515608082015260a0810182905260c08082528851908201528751819060208083019160e08401918c019080838360005b83811015611d29578181015183820152602001611d11565b50505050905090810190601f168015611d565780820380516001836020036101000a031916815260200191505b50838103825288815260200189898082843760405192018290039b50909950505050505050505050a3505050505050505050505050565b60008181526001602081815260409283902080548451600260001995831615610100029590950190911693909304601f81018390048302840183019094528383526060939091830182828015611e245780601f10611df957610100808354040283529160200191611e24565b820191906000526020600020905b815481529060010190602001808311611e0757829003601f168201915b50505050509050919050565b611e38612846565b15611e7b576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b3c833981519152604482015290519081900360640190fd5b611e83612147565b600160a060020a03163314611ed0576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b611ee960008051602061595c8339815191526001614c8a565b6040805142815290517f68b095021b1f40fe513109f513c66692f0b3219aee674a69f4efc57badb8201d9181900360200190a1565b600080611f29612147565b600160a060020a03163314611f76576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b600160a060020a0383161515611fc4576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206159fc833981519152604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051849350600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561202857600080fd5b505af115801561203c573d6000803e3d6000fd5b505050506040513d602081101561205257600080fd5b50519050600160a060020a03821663a9059cbb61206d612147565b836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156120c057600080fd5b505af11580156120d4573d6000803e3d6000fd5b505050506040513d60208110156120ea57600080fd5b50511515612142576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b505050565b60006108a0600080516020615a7c833981519152612871565b60606000606060006121aa6118bd6040805190810160405280601581526020017f7365637572697479546f6b656e735f7469636b6572000000000000000000000081525087614323565b85600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156121e857600080fd5b505af11580156121fc573d6000803e3d6000fd5b505050506040513d602081101561221257600080fd5b505160408051808201909152601b81527f7365637572697479546f6b656e735f746f6b656e44657461696c7300000000006020820152612256906118bd9089614323565b612298610a7f6040805190810160405280601981526020017f7365637572697479546f6b656e735f6465706c6f7965644174000000000000008152508a614323565b93509350935093509193509193565b60606122b1612147565b600160a060020a031633146122fe576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b60008711801561230f5750600a8711155b1515612353576040805160e560020a62461bcd02815260206004820152601a6024820152600080516020615b1c833981519152604482015290519081900360640190fd5b821580159061236157508315155b15156123b7576040805160e560020a62461bcd02815260206004820152601560248201527f44617465732073686f756c64206e6f7420626520300000000000000000000000604482015290519081900360640190fd5b82841115612435576040805160e560020a62461bcd02815260206004820152602660248201527f526567697374726174696f6e20646174652073686f756c64203c20657870697260448201527f7920646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0389161515612483576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206159fc833981519152604482015290519081900360640190fd5b6124bc88888080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b90506124fe898288888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050878787614d50565b505050505050505050565b6000612513612147565b600160a060020a03163314612560576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b61257760008051602061597c833981519152610b91565b9050818114156125d1576040805160e560020a62461bcd02815260206004820152600f60248201527f466565206e6f74206368616e6765640000000000000000000000000000000000604482015290519081900360640190fd5b604080518281526020810184905281517f788dceb058391de5648d0deb9187656f8c46d3ee285c1077579adf642793f1f6929181900390910190a161176960008051602061597c83398151915283614311565b60606000612630612147565b600160a060020a0316331461267d576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b6126b684848080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b91506126c182614860565b9050600160a060020a0381161515612723576040805160e560020a62461bcd02815260206004820152601460248201527f5469636b657220646f65736e2774206578697374000000000000000000000000604482015290519081900360640190fd5b61272d8183614892565b61276461275d604080519081016040528060158152602001600080516020615adc833981519152815250846145cd565b6000614d15565b61278582600080600060206040519081016040528060008152506000614f51565b7f5854c55b609f5180d42245ffca3efcee6c5db8e73ea96e693d8667e0bcb4d470824233604051808060200184815260200183600160a060020a0316600160a060020a03168152602001828103825285818151815260200191508051906020019080838360005b838110156128045781810151838201526020016127ec565b50505050905090810190601f1680156128315780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150505050565b60006108a060008051602061595c8339815191526108a6565b60009081526006602052604090205490565b600090815260026020526040902054600160a060020a031690565b6060600080600061289b612147565b600160a060020a031633600160a060020a03161415612ec75760008a1180156128c45750600088115b151561291a576040805160e560020a62461bcd02815260206004820152601160248201527f5469636b6572206c656e677468203e2030000000000000000000000000000000604482015290519081900360640190fd5b61295389898080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b9350612982604080519081016040528060188152602001600080516020615a5c833981519152815250856145cd565b925061298d836108a6565b156129e2576040805160e560020a62461bcd02815260206004820152601060248201527f416c7265616479206465706c6f79656400000000000000000000000000000000604482015290519081900360640190fd5b6129ed836001614c8a565b336129f785614860565b600160a060020a031614612a43576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b5c833981519152604482015290519081900360640190fd5b42612a74610a7f6040805190810160405280601c8152602001600080516020615afc833981519152815250876145cd565b1015612aca576040805160e560020a62461bcd02815260206004820152601360248201527f5469636b65722067657473206578706972656400000000000000000000000000604482015290519081900360640190fd5b612ad2613592565b91506000821115612bd157612af4600080516020615abc833981519152612871565b6040805160e060020a6323b872dd028152336004820152306024820152604481018590529051600160a060020a0392909216916323b872dd916064808201926020929091908290030181600087803b158015612b4f57600080fd5b505af1158015612b63573d6000803e3d6000fd5b505050506040513d6020811015612b7957600080fd5b50511515612bd1576040805160e560020a62461bcd02815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e636500000000000000000000604482015290519081900360640190fd5b612bd9614117565b600160a060020a031663c85fd4f88c8c8760128c8c338d612c197f90eeab7c36075577c7cc5ff366e389fefa8a18289b949bab3529ab4471139d4d612871565b60405160e060020a63ffffffff8c1602815260ff87166044820152600160a060020a03808516608483015283151560a4830152821660c482015260e06004820190815260e482018a905290819060248101906064810190610104018d8d8082843790910185810384528c5181528c5160209182019250908d019080838360005b83811015612cb1578181015183820152602001612c99565b50505050905090810190601f168015612cde5780820380516001836020036101000a031916815260200191505b50848103825288815260200189898082843782019150509c50505050505050505050505050602060405180830381600087803b158015612d1d57600080fd5b505af1158015612d31573d6000803e3d6000fd5b505050506040513d6020811015612d4757600080fd5b5051604080516020601f8a01819004810282018101909252888152919250612d8a9183918791908b908b908190840183828082843750429450614e799350505050565b612dc0612dba604080519081016040528060158152602001600080516020615adc833981519152815250866145cd565b82614d15565b33600160a060020a031681600160a060020a03167f63d9fb58b25a396dc2ebc591bec9115d1eb9c722dd6cdfcc9be4144d39dc2c26868e8e423360008a60405180806020018060200187815260200186600160a060020a0316600160a060020a031681526020018515151515815260200184815260200183810383528a818151815260200191508051906020019080838360005b83811015612e6c578181015183820152602001612e54565b50505050905090810190601f168015612e995780820380516001836020036101000a031916815260200191505b50838103825288815260200189898082843760405192018290039b50909950505050505050505050a361351b565b612ecf612846565b15612f12576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b3c833981519152604482015290519081900360640190fd5b60008a118015612f225750600088115b1515612f78576040805160e560020a62461bcd02815260206004820152601160248201527f5469636b6572206c656e677468203e2030000000000000000000000000000000604482015290519081900360640190fd5b612fb189898080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b9350612fe0604080519081016040528060188152602001600080516020615a5c833981519152815250856145cd565b9250612feb836108a6565b15613040576040805160e560020a62461bcd02815260206004820152601060248201527f416c7265616479206465706c6f79656400000000000000000000000000000000604482015290519081900360640190fd5b61304b836001614c8a565b3361305585614860565b600160a060020a0316146130a1576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b5c833981519152604482015290519081900360640190fd5b426130d2610a7f6040805190810160405280601c8152602001600080516020615afc833981519152815250876145cd565b1015613128576040805160e560020a62461bcd02815260206004820152601360248201527f5469636b65722067657473206578706972656400000000000000000000000000604482015290519081900360640190fd5b613130613592565b9150600082111561322f57613152600080516020615abc833981519152612871565b6040805160e060020a6323b872dd028152336004820152306024820152604481018590529051600160a060020a0392909216916323b872dd916064808201926020929091908290030181600087803b1580156131ad57600080fd5b505af11580156131c1573d6000803e3d6000fd5b505050506040513d60208110156131d757600080fd5b5051151561322f576040805160e560020a62461bcd02815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e636500000000000000000000604482015290519081900360640190fd5b613237614117565b600160a060020a031663c85fd4f88c8c8760128c8c338d6132777f90eeab7c36075577c7cc5ff366e389fefa8a18289b949bab3529ab4471139d4d612871565b60405160e060020a63ffffffff8c1602815260ff87166044820152600160a060020a03808516608483015283151560a4830152821660c482015260e06004820190815260e482018a905290819060248101906064810190610104018d8d8082843790910185810384528c5181528c5160209182019250908d019080838360005b8381101561330f5781810151838201526020016132f7565b50505050905090810190601f16801561333c5780820380516001836020036101000a031916815260200191505b50848103825288815260200189898082843782019150509c50505050505050505050505050602060405180830381600087803b15801561337b57600080fd5b505af115801561338f573d6000803e3d6000fd5b505050506040513d60208110156133a557600080fd5b5051604080516020601f8a018190048102820181019092528881529192506133e89183918791908b908b908190840183828082843750429450614e799350505050565b613418612dba604080519081016040528060158152602001600080516020615adc833981519152815250866145cd565b33600160a060020a031681600160a060020a03167f63d9fb58b25a396dc2ebc591bec9115d1eb9c722dd6cdfcc9be4144d39dc2c26868e8e423360008a60405180806020018060200187815260200186600160a060020a0316600160a060020a031681526020018515151515815260200184815260200183810383528a818151815260200191508051906020019080838360005b838110156134c45781810151838201526020016134ac565b50505050905090810190601f1680156134f15780820380516001836020036101000a031916815260200191505b50838103825288815260200189898082843760405192018290039b50909950505050505050505050a35b5050505050505050505050565b60008181526003602090815260409182902080548351601f6002610100600185161502600019019093169290920491820184900484028101840190945280845260609392830182828015611e245780601f10611df957610100808354040283529160200191611e24565b60006108a06000805160206159dc833981519152610b91565b606060006135b7612147565b600160a060020a031633600160a060020a031614156138e25761360984848080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b9150600160a060020a0385161515613659576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206159fc833981519152604482015290519081900360640190fd5b613686604080519081016040528060178152602001600080516020615a1c833981519152815250836145cd565b90503361369282612871565b600160a060020a0316146136de576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b5c833981519152604482015290519081900360640190fd5b6136e7826146ae565b156138125784600160a060020a03166137266113f2604080519081016040528060158152602001600080516020615adc833981519152815250856145cd565b600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561376357600080fd5b505af1158015613777573d6000803e3d6000fd5b505050506040513d602081101561378d57600080fd5b5051600160a060020a031614613812576040805160e560020a62461bcd028152602060048201526024808201527f4e6577206f776e657220646f6573206e6f74206d6174636820746f6b656e206f60448201527f776e657200000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61381c3383614892565b613826858361512c565b6138308186614d15565b84600160a060020a031633600160a060020a03167f44ee9de70a04c2a46889521de8968f79b4ae423f078fbaec8c492d821154729c846040518080602001828103825283818151815260200191508051906020019080838360005b838110156138a357818101518382015260200161388b565b50505050905090810190601f1680156138d05780820380516001836020036101000a031916815260200191505b509250505060405180910390a3613c3b565b6138ea612846565b1561392d576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b3c833981519152604482015290519081900360640190fd5b61396684848080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b9150600160a060020a03851615156139b6576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206159fc833981519152604482015290519081900360640190fd5b6139e3604080519081016040528060178152602001600080516020615a1c833981519152815250836145cd565b9050336139ef82612871565b600160a060020a031614613a3b576040805160e560020a62461bcd02815260206004820152600e6024820152600080516020615b5c833981519152604482015290519081900360640190fd5b613a44826146ae565b15613b6f5784600160a060020a0316613a836113f2604080519081016040528060158152602001600080516020615adc833981519152815250856145cd565b600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613ac057600080fd5b505af1158015613ad4573d6000803e3d6000fd5b505050506040513d6020811015613aea57600080fd5b5051600160a060020a031614613b6f576040805160e560020a62461bcd028152602060048201526024808201527f4e6577206f776e657220646f6573206e6f74206d6174636820746f6b656e206f60448201527f776e657200000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b613b793383614892565b613b83858361512c565b613b8d8186614d15565b84600160a060020a031633600160a060020a03167f44ee9de70a04c2a46889521de8968f79b4ae423f078fbaec8c492d821154729c846040518080602001828103825283818151815260200191508051906020019080838360005b83811015613c00578181015183820152602001613be8565b50505050905090810190601f168015613c2d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a35b5050505050565b613c6b7f9ef7257c3339b099aacf96e55122ee78fb65a36bd2a6c19249882be9c98633bf6108a6565b15613cc0576040805160e560020a62461bcd02815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b600160a060020a03851615801590613ce05750600160a060020a03821615155b8015613cf45750600160a060020a03811615155b8015613d085750600160a060020a03861615155b1515613d4c576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206159fc833981519152604482015290519081900360640190fd5b8315801590613d5a57508215155b1515613db0576040805160e560020a62461bcd02815260206004820152601460248201527f466565732073686f756c64206e6f742062652030000000000000000000000000604482015290519081900360640190fd5b613dc8600080516020615abc83398151915283614d15565b613de06000805160206159dc83398151915285614311565b613df860008051602061597c83398151915284614311565b613e136000805160206159bc833981519152624f1a00614311565b613e2c60008051602061595c8339815191526000614c8a565b613e44600080516020615a7c83398151915282614d15565b613e6e7f90eeab7c36075577c7cc5ff366e389fefa8a18289b949bab3529ab4471139d4d87614d15565b613e7c856002600080615268565b613ea77f9ef7257c3339b099aacf96e55122ee78fb65a36bd2a6c19249882be9c98633bf6001614c8a565b505050505050565b60408051808201909152601581527f7365637572697479546f6b656e735f7469636b6572000000000000000000000060208201526000907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090613f16906118bd9085614323565b6040518082805190602001908083835b60208310613f455780518252601f199092019160209182019101613f26565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120939093141595945050505050565b613f84612147565b600160a060020a03163314613fd1576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b600160a060020a0384161515614031576040805160e560020a62461bcd02815260206004820152601960248201527f30782061646472657373206973206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b61403d84848484615268565b50505050565b60006108a060008051602061597c833981519152610b91565b614064612147565b600160a060020a031633146140b1576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b600160a060020a03811615156140ff576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206159fc833981519152604482015290519081900360640190fd5b6109d5600080516020615abc83398151915282614d15565b60006108a06113f26040805190810160405280601181526020017f70726f746f636f6c56657273696f6e5354000000000000000000000000000000815250614184610a7f6040805190810160405280600d815260200160008051602061599c833981519152815250614b1b565b615412565b614191612147565b600160a060020a031633146141de576040805160e560020a62461bcd0281526020600482015260146024820152600080516020615a3c833981519152604482015290519081900360640190fd5b600160a060020a038116151561422c576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206159fc833981519152604482015290519081900360640190fd5b600160a060020a03811661424d600080516020615a7c833981519152612871565b600160a060020a03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36109d5600080516020615a7c83398151915282614d15565b600060606142d784848080601f016020809104026020016040519081016040528093929190818152602001838380828437506146eb945050505050565b90506143096113f2604080519081016040528060158152602001600080516020615adc833981519152815250836145cd565b949350505050565b60009182526020829052604090912055565b600082826040516020018083805190602001908083835b602083106143595780518252601f19909201916020918201910161433a565b6001836020036101000a03801982511681845116808217855250505050505090500182600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401925050506040516020818303038152906040526040518082805190602001908083835b602083106143e45780518252601f1990920191602091820191016143c5565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209695505050505050565b600081815260076020908152604091829020805483518184028101840190945280845260609392830182828015611e2457602002820191906000526020600020905b815481526001909101906020018083116144595750505050509050919050565b6040805160208082528183019092526060918291600091829182918591908082016104008038833901905050945060009350600092505b6020831015614525576008830260020a87029150600160f860020a031982161561451a578185858151811015156144e357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b6001909201916144b0565b836040519080825280601f01601f191660200182016040528015614553578160200160208202803883390190505b509050600092505b83831015610b8757848381518110151561457157fe5b90602001015160f860020a900460f860020a02818481518110151561459257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019161455b565b600082826040516020018083805190602001908083835b602083106146035780518252601f1990920191602091820191016145e4565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061464b5780518252601f19909201916020918201910161462c565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052604051808280519060200190808383602083106143e45780518252601f1990920191602091820191016143c5565b60006146e56146e0604080519081016040528060188152602001600080516020615a5c833981519152815250846145cd565b6108a6565b92915050565b6060816000805b82518210156147dc57828281518110151561470957fe5b016020015160f860020a908190040290507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a031982161080159061477e57507f7a00000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b1561479257601f1960f860020a9182900401025b8083838151811015156147a157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909101906146f2565b50909392505050565b6000806147f183614860565b600160a060020a0316146148585761482f610a7f6040805190810160405280601c8152602001600080516020615afc833981519152815250846145cd565b421180156148435750614841826146ae565b155b15614850575060016108b9565b5060006108b9565b506001919050565b60006146e56113f2604080519081016040528060178152602001600080516020615a1c833981519152815250846145cd565b600080606060006148db610a7f6040805190810160405280600b81526020017f7469636b6572496e646578000000000000000000000000000000000000000000815250876145cd565b935061490a6040805190810160405280600d8152602001600080516020615a9c83398151915281525087614323565b925061491583614417565b8051909250841061492257fe5b85600160a060020a031661493586614860565b600160a060020a03161461494557fe5b61494f83856154a9565b8361495984614417565b511115613ea75761496983614417565b80518590811061497557fe5b906020019060200201519050613ea76149c66040805190810160405280600b81526020017f7469636b6572496e6465780000000000000000000000000000000000000000008152506113ed84614479565b85614311565b818101828110156146e557fe5b6149e3888861512c565b6149f1878987878a88614f51565b838589600160a060020a03167f2de60ed106ca2007f575a4a2ff327cdde9bf801386463689ccb784d8bd4685628a8a878760405180806020018060200185151515158152602001848152602001838103835287818151815260200191508051906020019080838360005b83811015614a73578181015183820152602001614a5b565b50505050905090810190601f168015614aa05780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015614ad3578181015183820152602001614abb565b50505050905090810190601f168015614b005780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a45050505050505050565b6000816040516020018082805190602001908083835b60208310614b505780518252601f199092019160209182019101614b31565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310614bb35780518252601f199092019160209182019101614b94565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b6040805160038082526080820190925260609182919060208201838038833950508151919250506201000062ffffff8516049082906000908110614c2557fe5b60ff909216602092830290910190910152805161010062ffffff8516049082906001908110614c5057fe5b60ff9092166020928302909101909101528051839082906002908110614c7257fe5b60ff9092166020928302909101909101529050919050565b600091825260046020526040909120805460ff1916911515919091179055565b600081815260096020908152604091829020805483518184028101840190945280845260609392830182828015611e2457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311614cec5750505050509050919050565b600091825260026020526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b6000614d5b86614860565b9050600160a060020a03811615614d7657614d768187614892565b614d7f866146ae565b8015614d89575081155b15614dbe57614dbe61275d604080519081016040528060158152602001600080516020615adc833981519152815250886145cd565b8115614e5e576000600160a060020a0316614dff6113f2604080519081016040528060158152602001600080516020615adc833981519152815250896145cd565b600160a060020a03161415614e5e576040805160e560020a62461bcd02815260206004820152601460248201527f546f6b656e206e6f742072656769737465726564000000000000000000000000604482015290519081900360640190fd5b614e70878787878787600160006149d9565b50505050505050565b614ec1614ebb6040805190810160405280601581526020017f7365637572697479546f6b656e735f7469636b6572000000000000000000000081525086614323565b8461557c565b614f09614f036040805190810160405280601b81526020017f7365637572697479546f6b656e735f746f6b656e44657461696c73000000000081525086614323565b8361557c565b61403d614f4b6040805190810160405280601981526020017f7365637572697479546f6b656e735f6465706c6f79656441740000000000000081525086614323565b82614311565b6000614f80604080519081016040528060178152602001600080516020615a1c833981519152815250886145cd565b905085600160a060020a0316614f9582612871565b600160a060020a031614614fad57614fad8187614d15565b615013606060405190810160405280602281526020017f726567697374657265645469636b6572735f726567697374726174696f6e446181526020017f7465000000000000000000000000000000000000000000000000000000000000815250886145cd565b90508461501f82610b91565b1461502e5761502e8186614311565b61505b6040805190810160405280601c8152602001600080516020615afc833981519152815250886145cd565b90508361506782610b91565b14615076576150768185614311565b6150b56040805190810160405280601b81526020017f726567697374657265645469636b6572735f746f6b656e4e616d650000000000815250886145cd565b90506150c083614b1b565b6150d16150cc83611d8d565b614b1b565b146150e0576150e0818461557c565b61510d604080519081016040528060188152602001600080516020615a5c833981519152815250886145cd565b905081151561511b826108a6565b151514614e7057614e708183614c8a565b600080600061515e6040805190810160405280600d8152602001600080516020615a9c83398151915281525086614323565b925061516983614417565b51915061517e836151798661559b565b6155a8565b6151c66151c06040805190810160405280600b81526020017f7469636b6572496e646578000000000000000000000000000000000000000000815250866145cd565b83614311565b6152056040805190810160405280600981526020017f7365656e5573657273000000000000000000000000000000000000000000000081525086614323565b9050615210816108a6565b1515613c3b5761525d6152576040805190810160405280600b81526020017f6163746976655573657273000000000000000000000000000000000000000000815250614b1b565b866155cb565b613c3b816001614c8a565b60408051600380825260808201909252606091600091906020820184803883390190505091508482600081518110151561529e57fe5b60ff90921660209283029091019091015281518490839060019081106152c057fe5b60ff90921660209283029091019091015281518390839060029081106152e257fe5b60ff9092166020928302909101909101526152fe858585615617565b905061531161530b6111b6565b83615632565b1515615367576040805160e560020a62461bcd02815260206004820152601060248201527f496e2d76616c69642076657273696f6e00000000000000000000000000000000604482015290519081900360640190fd5b6153a16153966040805190810160405280600d815260200160008051602061599c833981519152815250614b1b565b8262ffffff16614311565b613ea761540c6040805190810160405280601181526020017f70726f746f636f6c56657273696f6e5354000000000000000000000000000000815250614184610a7f6040805190810160405280600d815260200160008051602061599c833981519152815250614b1b565b87614d15565b600082826040516020018083805190602001908083835b602083106154485780518252601f199092019160209182019101615429565b51815160001960209485036101000a019081169019919091161790529201938452506040805180850381529382019081905283519394509283925090840190808383602083106143e45780518252601f1990920191602091820191016143c5565b600082815260076020526040902080548210615535576040805160e560020a62461bcd02815260206004820152602a60248201527f496e6465782073686f756c64206c657373207468616e206c656e677468206f6660448201527f2074686520617272617900000000000000000000000000000000000000000000606482015290519081900360840190fd5b80548190600019810190811061554757fe5b9060005260206000200154818381548110151561556057fe5b60009182526020909120015580546000190161403d828261589f565b60008281526001602090815260409091208251612142928401906158c3565b60006146e5826000615845565b600091825260076020908152604083208054600181018255908452922090910155565b6000918252600960209081526040832080546001810182559084529220909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60ff9081169181166101000292166201000002919091171790565b600060606000808551604051908082528060200260200182016040528015615664578160200160208202803883390190505b50925060009150600090505b85518160ff16101561571057848160ff1681518110151561568d57fe5b9060200190602002015160ff16868260ff168151811015156156ab57fe5b9060200190602002015160ff1610156156e5576001838260ff168151811015156156d157fe5b911515602092830290910190910152615708565b6000838260ff168151811015156156f857fe5b9115156020928302909101909101525b600101615670565b5060005b85518160ff16101561582b5760ff811615156157ad57848160ff1681518110151561573b57fe5b9060200190602002015160ff16868260ff1681518110151561575957fe5b6020908102909101015160ff161161579f5782600081518110151561577a57fe5b90602001906020020151156157945781600301915061582b565b6001909101906157a8565b6000935061583c565b615823565b826001820360ff168151811015156157c157fe5b90602001906020020151156157db57600190910190615823565b848160ff168151811015156157ec57fe5b9060200190602002015160ff16868260ff1681518110151561580a57fe5b6020908102909101015160ff161161579f576001909101905b600101615714565b85518260ff16141561583c57600193505b50505092915050565b600080805b845181101561589757806008028582860181518110151561586757fe5b60209101015160029190910a60f860020a91829004909102600160f860020a03191604919091179060010161584a565b509392505050565b81548183558181111561214257600083815260209020612142918101908301615941565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061590457805160ff1916838001178555615931565b82800160010185558215615931579182015b82811115615931578251825591602001919060010190615916565b5061593d929150615941565b5090565b6108a391905b8082111561593d57600081556001016159475600ee35723ac350a69d2a92d3703f17439cbaadf2f093a21ba5bf5f1a53eb2a14d92fcc69711628630fb5a42566c68bd1092bc4aa26826736293969fddcd11cb2d26c617465737456657273696f6e00000000000000000000000000000000000000604268e9a73dfd777dcecb8a614493dd65c638bad2f5e7d709d378bd2fb0baeed677304bb45536bb7fdfa6b9e47a3c58fe413f9e8f01474b0a4b9c6e0275baf2496e76616c696420616464726573730000000000000000000000000000000000726567697374657265645469636b6572735f6f776e657200000000000000000073656e646572206d757374206265206f776e6572000000000000000000000000726567697374657265645469636b6572735f737461747573000000000000000002016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c075736572546f5469636b65727300000000000000000000000000000000000000acf8fbd51bb4b83ba426cdb12f63be74db97c412515797993d2a385542e311d77469636b6572546f5365637572697479546f6b656e0000000000000000000000726567697374657265645469636b6572735f65787069727944617465000000005469636b6572206c656e6774682072616e67652028302c31305d000000000000416c7265616479207061757365640000000000000000000000000000000000004e6f7420617574686f7269736564000000000000000000000000000000000000a165627a7a723058201661bc9c0b9d5e2e2f12f694801c7a699c05b20b3770fc53d81dcd1ae0818f8a0029

   Swarm Source:
bzzr://1661bc9c0b9d5e2e2f12f694801c7a699c05b20b3770fc53d81dcd1ae0818f8a

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward