creation_sourcecode: pragma solidity ^0.4.21;
  
  /**
   * @title Proxy
   * @dev Gives the possibility to delegate any call to a foreign implementation.
   */
  contract Proxy {
    /**
    * @dev Tells the address of the implementation where every call will be delegated.
    * @return address of the implementation to which it will be delegated
    */
    function implementation() public view returns (address);
  
    /**
    * @dev Fallback functionß allowing to perform a delegatecall to the given implementation.
    * This function will return whatever the implementation call returns
    */
    function () payable public {
      address _impl = implementation();
      require(_impl != address(0));
  
      assembly {
        let ptr := mload(0x40)
        calldatacopy(ptr, 0, calldatasize)
        let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
        let size := returndatasize
        returndatacopy(ptr, 0, size)
  
        switch result
        case 0 { revert(ptr, size) }
        default { return(ptr, size) }
      }
    }
  }
  
  /**
   * @title UpgradeabilityProxy
   * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded
   */
  contract UpgradeabilityProxy is Proxy {
    /**
     * @dev This event will be emitted every time the implementation gets upgraded
     * @param implementation representing the address of the upgraded implementation
     */
    event Upgraded(address indexed implementation);
  
    // Storage position of the address of the current implementation
    bytes32 private constant implementationPosition = keccak256("org.zeppelinos.proxy.implementation");
  
    /**
     * @dev Constructor function
     */
    function UpgradeabilityProxy() public {}
  
    /**
     * @dev Tells the address of the current implementation
     * @return address of the current implementation
     */
    function implementation() public view returns (address impl) {
      bytes32 position = implementationPosition;
      assembly {
        impl := sload(position)
      }
    }
  
    /**
     * @dev Sets the address of the current implementation
     * @param newImplementation address representing the new implementation to be set
     */
    function setImplementation(address newImplementation) internal {
      bytes32 position = implementationPosition;
      assembly {
        sstore(position, newImplementation)
      }
    }
  
    /**
     * @dev Upgrades the implementation address
     * @param newImplementation representing the address of the new implementation to be set
     */
    function _upgradeTo(address newImplementation) internal {
      address currentImplementation = implementation();
      require(currentImplementation != newImplementation);
      setImplementation(newImplementation);
      emit Upgraded(newImplementation);
    }
  }
  
  /**
   * @title OwnedUpgradeabilityProxy
   * @dev This contract combines an upgradeability proxy with basic authorization control functionalities
   */
  contract OwnedUpgradeabilityProxy is UpgradeabilityProxy {
    /**
    * @dev Event to show ownership has been transferred
    * @param previousOwner representing the address of the previous owner
    * @param newOwner representing the address of the new owner
    */
    event ProxyOwnershipTransferred(address previousOwner, address newOwner);
  
    // Storage position of the owner of the contract
    bytes32 private constant proxyOwnerPosition = keccak256("org.zeppelinos.proxy.owner");
  
    /**
    * @dev the constructor sets the original owner of the contract to the sender account.
    */
    function OwnedUpgradeabilityProxy() public {
      setUpgradeabilityOwner(msg.sender);
    }
  
    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyProxyOwner() {
      require(msg.sender == proxyOwner());
      _;
    }
  
    /**
     * @dev Tells the address of the owner
     * @return the address of the owner
     */
    function proxyOwner() public view returns (address owner) {
      bytes32 position = proxyOwnerPosition;
      assembly {
        owner := sload(position)
      }
    }
  
    /**
     * @dev Sets the address of the owner
     */
    function setUpgradeabilityOwner(address newProxyOwner) internal {
      bytes32 position = proxyOwnerPosition;
      assembly {
        sstore(position, newProxyOwner)
      }
    }
  
    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferProxyOwnership(address newOwner) public onlyProxyOwner {
      require(newOwner != address(0));
      emit ProxyOwnershipTransferred(proxyOwner(), newOwner);
      setUpgradeabilityOwner(newOwner);
    }
  
    /**
     * @dev Allows the proxy owner to upgrade the current version of the proxy.
     * @param implementation representing the address of the new implementation to be set.
     */
    function upgradeTo(address implementation) public onlyProxyOwner {
      _upgradeTo(implementation);
    }
  
    /**
     * @dev Allows the proxy owner to upgrade the current version of the proxy and call the new implementation
     * to initialize whatever is needed through a low level call.
     * @param implementation representing the address of the new implementation to be set.
     * @param data represents the msg.data to bet sent in the low level call. This parameter may include the function
     * signature of the implementation to be called with the needed payload
     */
    function upgradeToAndCall(address implementation, bytes data) payable public onlyProxyOwner {
      upgradeTo(implementation);
      require(this.call.value(msg.value)(data));
    }
  }