X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/0494b8d9b9bb03ab6c22b34dae81261e3cd7e3e6..7a654f8d43fdb43d78b63d90528bed6e86b608cc:/docs/api/Ext.data.proxy.Direct.html diff --git a/docs/api/Ext.data.proxy.Direct.html b/docs/api/Ext.data.proxy.Direct.html new file mode 100644 index 00000000..96e7980c --- /dev/null +++ b/docs/api/Ext.data.proxy.Direct.html @@ -0,0 +1,561 @@ +Ext.data.proxy.Direct | Ext JS 4.0 Documentation +
For up to date documentation and features, visit +http://docs.sencha.com/ext-js/4-0

Sencha Documentation

+ + + + + +

Hierarchy

Mixins

This class is used to send requests to the server using Ext.direct. When a request is made, +the transport mechanism is handed off to the appropriate Provider +to complete the call.

+ +

Specifying the function

+ +

This proxy expects a Direct remoting method to be passed in order to be able to complete requests. +This can be done by specifying the directFn configuration. This will use the same direct +method for all requests. Alternatively, you can provide an api configuration. This +allows you to specify a different remoting method for each CRUD action.

+ +

Paramaters

+ +

This proxy provides options to help configure which parameters will be sent to the server. +By specifying the paramsAsHash option, it will send an object literal containing each +of the passed parameters. The paramOrder option can be used to specify the order in which +the remoting method parameters are passed.

+ +

Example Usage

+ +
Ext.define('User', {
+    extend: 'Ext.data.Model',
+    fields: ['firstName', 'lastName'],
+    proxy: {
+        type: 'direct',
+        directFn: MyApp.getUsers,
+        paramOrder: 'id' // Tells the proxy to pass the id as the first parameter to the remoting method.
+    }
+});
+User.load(1);
+
+
Defined By

Config Options

Other Configs

 

The same as Ext.data.proxy.Server.api, however instead of providing urls, you should provide a direct +function call.

+

The same as Ext.data.proxy.Server.api, however instead of providing urls, you should provide a direct +function call.

+
 

True to batch actions of a particular type when synchronizing the store. +Defaults to true.

+

True to batch actions of a particular type when synchronizing the store. +Defaults to true.

+
 
Comma-separated ordering 'create', 'update' and 'destroy' actions when batching. Override this +to set a different ord...

Comma-separated ordering 'create', 'update' and 'destroy' actions when batching. Override this +to set a different order for the batched CRUD actions to be executed in. Defaults to 'create,update,destroy'

+
 

The name of the cache param added to the url when using noCache (defaults to "_dc")

+

The name of the cache param added to the url when using noCache (defaults to "_dc")

+
 
Function to call when executing a request. directFn is a simple alternative to defining the api configuration-parame...

Function to call when executing a request. directFn is a simple alternative to defining the api configuration-parameter +for Store's which will not implement a full CRUD api.

+
 
The name of the direction parameter to send in a request. This is only used when simpleSortMode is set to true. +Defau...

The name of the direction parameter to send in a request. This is only used when simpleSortMode is set to true. +Defaults to 'dir'.

+
 
Extra parameters that will be included on every read request. Individual requests with params +of the same name will o...

Extra parameters that will be included on every read request. Individual requests with params +of the same name will override these params when they are in conflict.

+
 
The name of the 'filter' parameter to send in a request. Defaults to 'filter'. Set +this to undefined if you don't wan...

The name of the 'filter' parameter to send in a request. Defaults to 'filter'. Set +this to undefined if you don't want to send a filter parameter

+
 
The name of the 'group' parameter to send in a request. Defaults to 'group'. Set this +to undefined if you don't want ...

The name of the 'group' parameter to send in a request. Defaults to 'group'. Set this +to undefined if you don't want to send a group parameter

+
 
The name of the 'limit' parameter to send in a request. Defaults to 'limit'. Set this +to undefined if you don't want ...

The name of the 'limit' parameter to send in a request. Defaults to 'limit'. Set this +to undefined if you don't want to send a limit parameter

+
 
(optional) A config object containing one or more event handlers to be added to this +object during initialization. T...

(optional)

A config object containing one or more event handlers to be added to this +object during initialization. This should be a valid listeners config object as specified in the +addListener example for attaching multiple handlers at once.

+ +

DOM events from ExtJs Components

+ + +

While some ExtJs Component classes export selected DOM events (e.g. "click", "mouseover" etc), this + + +

is usually only done when extra value can be added. For example the DataView's +click event passing the node clicked on. To access DOM +events directly from a child element of a Component, we need to specify the element option to +identify the Component property to add a DOM listener to:

+ +
new Ext.panel.Panel({
+    width: 400,
+    height: 200,
+    dockedItems: [{
+        xtype: 'toolbar'
+    }],
+    listeners: {
+        click: {
+            element: 'el', //bind to the underlying el property on the panel
+            fn: function(){ console.log('click el'); }
+        },
+        dblclick: {
+            element: 'body', //bind to the underlying body property on the panel
+            fn: function(){ console.log('dblclick body'); }
+        }
+    }
+});
+
+ + +

+
 
model : String/Ext.data.Model
The name of the Model to tie to this Proxy. Can be either the string name of +the Model, or a reference to the Model c...

The name of the Model to tie to this Proxy. Can be either the string name of +the Model, or a reference to the Model constructor. Required.

+
 

(optional) Defaults to true. Disable caching by adding a unique parameter +name to the request.

+

(optional) Defaults to true. Disable caching by adding a unique parameter +name to the request.

+
 
The name of the 'page' parameter to send in a request. Defaults to 'page'. Set this to +undefined if you don't want to...

The name of the 'page' parameter to send in a request. Defaults to 'page'. Set this to +undefined if you don't want to send a page parameter

+
 
Defaults to undefined. A list of params to be executed +server side. Specify the params in the order in which they mu...

Defaults to undefined. A list of params to be executed +server side. Specify the params in the order in which they must be executed on the server-side +as either (1) an Array of String values, or (2) a String of params delimited by either whitespace, +comma, or pipe. For example, +any of the following would be acceptable:

+ +
paramOrder: ['param1','param2','param3']
+paramOrder: 'param1 param2 param3'
+paramOrder: 'param1,param2,param3'
+paramOrder: 'param1|param2|param'
+     
+ +
 
Send parameters as a collection of named arguments (defaults to true). Providing a +paramOrder nullifies this configur...

Send parameters as a collection of named arguments (defaults to true). Providing a +paramOrder nullifies this configuration.

+
 
reader : Object/String/Ext.data.reader.Reader
The Ext.data.reader.Reader to use to decode the server's response. This can +either be a Reader instance, a config obj...

The Ext.data.reader.Reader to use to decode the server's response. This can +either be a Reader instance, a config object or just a valid Reader type name (e.g. 'json', 'xml').

+
 
Enabling simpleSortMode in conjunction with remoteSort will only send one sort property and a direction when a remote...

Enabling simpleSortMode in conjunction with remoteSort will only send one sort property and a direction when a remote sort is requested. +The directionParam and sortParam will be sent with the property name and either 'ASC' or 'DESC'

+
 
The name of the 'sort' parameter to send in a request. Defaults to 'sort'. Set this +to undefined if you don't want to...

The name of the 'sort' parameter to send in a request. Defaults to 'sort'. Set this +to undefined if you don't want to send a sort parameter

+
 
The name of the 'start' parameter to send in a request. Defaults to 'start'. Set this +to undefined if you don't want ...

The name of the 'start' parameter to send in a request. Defaults to 'start'. Set this +to undefined if you don't want to send a start parameter

+
 

(optional) The number of milliseconds to wait for a response. Defaults to 30 seconds.

+

(optional) The number of milliseconds to wait for a response. Defaults to 30 seconds.

+
 

The URL from which to request the data object.

+

The URL from which to request the data object.

+
 
writer : Object/String/Ext.data.writer.Writer
The Ext.data.writer.Writer to use to encode any request sent to the server. +This can either be a Writer instance, a c...

The Ext.data.writer.Writer to use to encode any request sent to the server. +This can either be a Writer instance, a config object or just a valid Writer type name (e.g. 'json', 'xml').

+
Defined By

Properties

 

Optional callback function which can be used to clean up after a request has been completed.

+

Optional callback function which can be used to clean up after a request has been completed.

+
 

Performs the given create operation.

+

Performs the given create operation.

+
 

Performs the given destroy operation.

+

Performs the given destroy operation.

+
 

Performs the given read operation.

+

Performs the given read operation.

+
 

Performs the given update operation.

+

Performs the given update operation.

+
Defined By

Methods

 
Direct( +Object config) + : void

Creates the Proxy

+

Creates the Proxy

+

Parameters

  • config : Object

    Optional config object

    +

Returns

  • void    +
 
addEvents( +Object/String o, String ) + : void

Adds the specified events to the list of events which this Observable may fire.

+

Adds the specified events to the list of events which this Observable may fire.

+

Parameters

  • o : Object/String

    Either an object with event names as properties with a value of true +or the first event name string if multiple event names are being passed as separate parameters.

    +
  • : String

    [additional] Optional additional event names if multiple event names are being passed as separate parameters. +Usage:

    + +
    this.addEvents('storeloaded', 'storecleared');
    +
    + +

Returns

  • void    +
 
addListener( +String eventName, Function handler, [Object scope], [Object options]) + : void

Appends an event handler to this object.

+

Appends an event handler to this object.

+

Parameters

  • eventName : String

    The name of the event to listen for. May also be an object who's property names are event names. See

    +
  • handler : Function

    The method the event invokes.

    +
  • scope : Object

    (optional) The scope (this reference) in which the handler function is executed. +If omitted, defaults to the object which fired the event.

    +
  • options : Object

    (optional) An object containing handler configuration. +properties. This may contain any of the following properties:

      +
    • scope : Object
      The scope (this reference) in which the handler function is executed. +If omitted, defaults to the object which fired the event.
    • +
    • delay : Number
      The number of milliseconds to delay the invocation of the handler after the event fires.
    • +
    • single : Boolean
      True to add a handler to handle just the next firing of the event, and then remove itself.
    • +
    • buffer : Number
      Causes the handler to be scheduled to run in an Ext.util.DelayedTask delayed +by the specified number of milliseconds. If the event fires again within that time, the original +handler is not invoked, but the new handler is scheduled in its place.
    • +
    • target : Observable
      Only call the handler if the event was fired on the target Observable, not +if the event was bubbled up from a child Observable.
    • +
    • element : String
      This option is only valid for listeners bound to Components. +The name of a Component property which references an element to add a listener to.

      + +

      This option is useful during Component construction to add DOM event listeners to elements of Components which +will exist only after the Component is rendered. For example, to add a click listener to a Panel's body: +

      new Ext.panel.Panel({
      +    title: 'The title',
      +    listeners: {
      +        click: this.handlePanelClick,
      +        element: 'body'
      +    }
      +});
      +

      + + +

      When added in this way, the options available are the options applicable to Ext.core.Element.addListener

      + + +

    • +

    + +

    +Combining Options
    +Using the options argument, it is possible to combine different types of listeners:
    +
    +A delayed, one-time listener. +

    myPanel.on('hide', this.handleClick, this, {
    +single: true,
    +delay: 100
    +});
    +

    +Attaching multiple handlers in 1 call
    +The method also allows for a single argument to be passed which is a config object containing properties +which specify multiple events. For example: +

    myGridPanel.on({
    +    cellClick: this.onCellClick,
    +    mouseover: this.onMouseOver,
    +    mouseout: this.onMouseOut,
    +    scope: this // Important. Ensure "this" is correct during handler execution
    +});
    +
    . +

    + +

Returns

  • void    +
 
addManagedListener( +Observable/Element item, Object/String ename, Function fn, Object scope, Object opt) + : void

Adds listeners to any Observable object (or Element) which are automatically removed when this Component +is destroyed. + +

Adds listeners to any Observable object (or Element) which are automatically removed when this Component +is destroyed. + +

Parameters

  • item : Observable/Element

    The item to which to add a listener/listeners.

    +
  • ename : Object/String

    The event name, or an object containing event name properties.

    +
  • fn : Function

    Optional. If the ename parameter was an event name, this +is the handler function.

    +
  • scope : Object

    Optional. If the ename parameter was an event name, this +is the scope (this reference) in which the handler function is executed.

    +
  • opt : Object

    Optional. If the ename parameter was an event name, this +is the addListener options.

    +

Returns

  • void    +
 
batch( +Object operations, Object listeners) + : Ext.data.Batch
Performs a batch of Operations, in the order specified by batchOrder. Used internally by +Ext.data.Store's sync method...

Performs a batch of Operations, in the order specified by batchOrder. Used internally by +Ext.data.Store's sync method. Example usage:

+ +
myProxy.batch({
+    create : [myModel1, myModel2],
+    update : [myModel3],
+    destroy: [myModel4, myModel5]
+});
+
+ + +

Where the myModel* above are Model instances - in this case 1 and 2 are new instances and have not been +saved before, 3 has been saved previously but needs to be updated, and 4 and 5 have already been saved but should now be destroyed.

+

Parameters

  • operations : Object

    Object containing the Model instances to act upon, keyed by action name

    +
  • listeners : Object

    Optional listeners object passed straight through to the Batch - see Ext.data.Batch

    +

Returns

 
buildRequest( +Ext.data.Operation operation) + : Ext.data.Request

Creates and returns an Ext.data.Request object based on the options passed by the Store +that this Proxy is attached to.

+

Creates and returns an Ext.data.Request object based on the options passed by the Store +that this Proxy is attached to.

+

Parameters

  • operation : Ext.data.Operation

    The Operation object to execute

    +

Returns

  • Ext.data.Request   

    The request object

    +
 
buildUrl( +Ext.data.Request request) + : String
Generates a url based on a given Ext.data.Request object. By default, ServerProxy's buildUrl will +add the cache-buste...

Generates a url based on a given Ext.data.Request object. By default, ServerProxy's buildUrl will +add the cache-buster param to the end of the url. Subclasses may need to perform additional modifications +to the url.

+

Parameters

  • request : Ext.data.Request

    The request object

    +

Returns

  • String   

    The url

    +
 
capture( +Observable o, Function fn, [Object scope]) + : void
Starts capture on the specified Observable. All events will be passed +to the supplied function with the event name + ...

Starts capture on the specified Observable. All events will be passed +to the supplied function with the event name + standard signature of the event +before the event is fired. If the supplied function returns false, +the event will not fire.

+

Parameters

  • o : Observable

    The Observable to capture events from.

    +
  • fn : Function

    The function to call when an event is fired.

    +
  • scope : Object

    (optional) The scope (this reference) in which the function is executed. Defaults to the Observable firing the event.

    +

Returns

  • void    +
 

Removes all listeners for this object including the managed listeners

+

Removes all listeners for this object including the managed listeners

+

Returns

  • void    +
 

Removes all managed listeners for this object.

+

Removes all managed listeners for this object.

+

Returns

  • void    +
 
doRequest( +Ext.data.Operation operation, Function callback, Object scope) + : void
In ServerProxy subclasses, the create, read, update and destroy methods all pass +through to doRequest. Each ServerPro...

In ServerProxy subclasses, the create, read, update and destroy methods all pass +through to doRequest. Each ServerProxy subclass must implement the doRequest method - see Ext.data.proxy.JsonP +and Ext.data.proxy.Ajax for examples. This method carries the same signature as each of the methods that delegate to it.

+

Parameters

  • operation : Ext.data.Operation

    The Ext.data.Operation object

    +
  • callback : Function

    The callback function to call when the Operation has completed

    +
  • scope : Object

    The scope in which to execute the callback

    +

Returns

  • void    +
 
enableBubble( +String/Array events) + : void
Enables events fired by this Observable to bubble up an owner hierarchy by calling +this.getBubbleTarget() if present....

Enables events fired by this Observable to bubble up an owner hierarchy by calling +this.getBubbleTarget() if present. There is no implementation in the Observable base class.

+ + +

This is commonly used by Ext.Components to bubble events to owner Containers. See Ext.Component.getBubbleTarget. The default +implementation in Ext.Component returns the Component's immediate owner. But if a known target is required, this can be overridden to +access the required target more quickly.

+ + +

Example:

+ + +
Ext.override(Ext.form.field.Base, {
+//  Add functionality to Field's initComponent to enable the change event to bubble
+initComponent : Ext.Function.createSequence(Ext.form.field.Base.prototype.initComponent, function() {
+    this.enableBubble('change');
+}),
+
+//  We know that we want Field's events to bubble directly to the FormPanel.
+getBubbleTarget : function() {
+    if (!this.formPanel) {
+        this.formPanel = this.findParentByType('form');
+    }
+    return this.formPanel;
+}
+});
+
+var myForm = new Ext.formPanel({
+title: 'User Details',
+items: [{
+    ...
+}],
+listeners: {
+    change: function() {
+        // Title goes red if form has been modified.
+        myForm.header.setStyle('color', 'red');
+    }
+}
+});
+
+ +

Parameters

  • events : String/Array

    The event name to bubble, or an Array of event names.

    +

Returns

  • void    +
 
Encodes the array of Ext.util.Filter objects into a string to be sent in the request url. By default, +this simply JSO...

Encodes the array of Ext.util.Filter objects into a string to be sent in the request url. By default, +this simply JSON-encodes the filter data

+

Parameters

  • sorters : Array

    The array of Filter objects

    +

Returns

  • String   

    The encoded filters

    +
 
Encodes the array of Ext.util.Sorter objects into a string to be sent in the request url. By default, +this simply JSO...

Encodes the array of Ext.util.Sorter objects into a string to be sent in the request url. By default, +this simply JSON-encodes the sorter data

+

Parameters

  • sorters : Array

    The array of Sorter objects

    +

Returns

  • String   

    The encoded sorters

    +
 
fireEvent( +String eventName, Object... args) + : Boolean
Fires the specified event with the passed parameters (minus the event name). + + +An event may be set to bubble up an Ob...

Fires the specified event with the passed parameters (minus the event name).

+ + +

An event may be set to bubble up an Observable parent hierarchy (See Ext.Component.getBubbleTarget) +by calling enableBubble.

+ +

Parameters

  • eventName : String

    The name of the event to fire.

    +
  • args : Object...

    Variable number of parameters are passed to handlers.

    +

Returns

  • Boolean   

    returns false if any of the handlers return false otherwise it returns true.

    +
 

Returns the model attached to this Proxy

+

Returns the model attached to this Proxy

+

Returns

  • Ext.data.Model   

    The model

    +
 

Returns the reader currently attached to this proxy instance

+

Returns the reader currently attached to this proxy instance

+

Returns

  • Ext.data.reader.Reader   

    The Reader instance

    +
 

Returns the writer currently attached to this proxy instance

+

Returns the writer currently attached to this proxy instance

+

Returns

  • Ext.data.writer.Writer   

    The Writer instance

    +
 
hasListener( +String eventName) + : Boolean

Checks to see if this object has any listeners for a specified event

+

Checks to see if this object has any listeners for a specified event

+

Parameters

  • eventName : String

    The name of the event to check for

    +

Returns

  • Boolean   

    True if the event is being listened for, else false

    +
 
observe( +Function c, Object listeners) + : void
Sets observability on the passed class constructor. + +This makes any event fired on any instance of the passed class a...

Sets observability on the passed class constructor.

+ +

This makes any event fired on any instance of the passed class also fire a single event through +the class allowing for central handling of events on many instances at once.

+ +

Usage:

+ +
Ext.util.Observable.observe(Ext.data.Connection);
+Ext.data.Connection.on('beforerequest', function(con, options) {
+    console.log('Ajax request made to ' + options.url);
+});
+
+

Parameters

  • c : Function

    The class constructor to make observable.

    +
  • listeners : Object

    An object containing a series of listeners to add. See addListener.

    +

Returns

  • void    +
 
on( +String eventName, Function handler, [Object scope], [Object options]) + : void

Appends an event handler to this object (shorthand for addListener.)

+

Appends an event handler to this object (shorthand for addListener.)

+

Parameters

  • eventName : String

    The type of event to listen for

    +
  • handler : Function

    The method the event invokes

    +
  • scope : Object

    (optional) The scope (this reference) in which the handler function is executed. +If omitted, defaults to the object which fired the event.

    +
  • options : Object

    (optional) An object containing handler configuration.

    +

Returns

  • void    +
 
processResponse( +Object success, Object operation, Object request, Object response, Object callback, Object scope) + : void

 

+

Parameters

  • success : Object
    +
  • operation : Object
    +
  • request : Object
    +
  • response : Object
    +
  • callback : Object
    +
  • scope : Object
    +

Returns

  • void    +
 
relayEvents( +Object origin, Array events, Object prefix) + : void

Relays selected events from the specified Observable as if the events were fired by this.

+

Relays selected events from the specified Observable as if the events were fired by this.

+

Parameters

  • origin : Object

    The Observable whose events this object is to relay.

    +
  • events : Array

    Array of event names to relay.

    +
  • prefix : Object
    +

Returns

  • void    +
 

Removes all added captures from the Observable.

+

Removes all added captures from the Observable.

+

Parameters

  • o : Observable

    The Observable to release

    +

Returns

  • void    +
 
removeListener( +String eventName, Function handler, [Object scope]) + : void

Removes an event handler.

+

Removes an event handler.

+

Parameters

  • eventName : String

    The type of event the handler was associated with.

    +
  • handler : Function

    The handler to remove. This must be a reference to the function passed into the addListener call.

    +
  • scope : Object

    (optional) The scope originally specified for the handler.

    +

Returns

  • void    +
 
removeManagedListener( +Observable|Element item, Object|String ename, Function fn, Object scope) + : void

Removes listeners that were added by the mon method.

+

Removes listeners that were added by the mon method.

+

Parameters

  • item : Observable|Element

    The item from which to remove a listener/listeners.

    +
  • ename : Object|String

    The event name, or an object containing event name properties.

    +
  • fn : Function

    Optional. If the ename parameter was an event name, this +is the handler function.

    +
  • scope : Object

    Optional. If the ename parameter was an event name, this +is the scope (this reference) in which the handler function is executed.

    +

Returns

  • void    +
 
Resume firing events. (see suspendEvents) +If events were suspended using the queueSuspended parameter, then all +event...

Resume firing events. (see suspendEvents) +If events were suspended using the queueSuspended parameter, then all +events fired during event suspension will be sent to any listeners now.

+

Returns

  • void    +
 
setModel( +String|Ext.data.Model model, Boolean setOnStore) + : void

Sets the model associated with this proxy. This will only usually be called by a Store

+

Sets the model associated with this proxy. This will only usually be called by a Store

+

Parameters

  • model : String|Ext.data.Model

    The new model. Can be either the model name string, +or a reference to the model's constructor

    +
  • setOnStore : Boolean

    Sets the new model on the associated Store, if one is present

    +

Returns

  • void    +
 
setReader( +String|Object|Ext.data.reader.Reader reader) + : Ext.data.reader.Reader

Sets the Proxy's Reader by string, config object or Reader instance

+

Sets the Proxy's Reader by string, config object or Reader instance

+

Parameters

  • reader : String|Object|Ext.data.reader.Reader

    The new Reader, which can be either a type string, a configuration object +or an Ext.data.reader.Reader instance

    +

Returns

  • Ext.data.reader.Reader   

    The attached Reader object

    +
 
setWriter( +String|Object|Ext.data.writer.Writer writer) + : Ext.data.writer.Writer

Sets the Proxy's Writer by string, config object or Writer instance

+

Sets the Proxy's Writer by string, config object or Writer instance

+

Parameters

  • writer : String|Object|Ext.data.writer.Writer

    The new Writer, which can be either a type string, a configuration object +or an Ext.data.writer.Writer instance

    +

Returns

  • Ext.data.writer.Writer   

    The attached Writer object

    +
 
suspendEvents( +Boolean queueSuspended) + : void

Suspend the firing of all events. (see resumeEvents)

+

Suspend the firing of all events. (see resumeEvents)

+

Parameters

  • queueSuspended : Boolean

    Pass as true to queue up suspended events to be fired +after the resumeEvents call instead of discarding all suspended events;

    +

Returns

  • void    +
 
un( +String eventName, Function handler, [Object scope]) + : void

Removes an event handler (shorthand for removeListener.)

+

Removes an event handler (shorthand for removeListener.)

+

Parameters

  • eventName : String

    The type of event the handler was associated with.

    +
  • handler : Function

    The handler to remove. This must be a reference to the function passed into the addListener call.

    +
  • scope : Object

    (optional) The scope originally specified for the handler.

    +

Returns

  • void    +
Defined By

Events

 
exception( +Ext.data.proxy.Proxy this, Object response, Ext.data.Operation operation) +

Fires when the server returns an exception

+

Fires when the server returns an exception

+

Parameters

  • this : Ext.data.proxy.Proxy
    +
  • response : Object

    The response from the AJAX request

    +
  • operation : Ext.data.Operation

    The operation that triggered request

    +
\ No newline at end of file