DNN User Files - Documentation

About DNN Permissions

In DNN, there are many types of permissions: Page, Module, Folders, etc. Having view or edit permissions over a page or module does not grant permission over folders.
You must grant folder permissions to the roles (and/or users) of your choice over the folders according to your needs. This is, who (roles and/or users) can see and/or download (open) and/or modify items in a folder.

DNN Folder Permissions

  • Browse: The user can list the items in the folder.. I.e. see the items (files and folders) in the folder.
  • Open: The user can open / download files in the folder.
  • Write: The user can create sub-folders, upload new files, delete, rename, etc. (if the module handling these folders has enabled the required settings, as DNNUserFiles does).

You can edit DNN Folder Permissions from the DNN File Manager (Site Assets) or using DNNUserFiles, accessing the folder(s) properties page.
In DNNUserFiles, editors can also view and update the configured root folder's permissions.

Example:

DNNUserFiles Module Permissions

  • Upload: Upload files.
  • Download: Download files (and folders, if "Allow Folder Download" is enabled).
  • Create Folders: Add subfolders.
  • Refresh Folders: Synchronize the folder and its child folders.
  • Edit Properties: Edit files and folder's name (rename), title, description, and/or tags.
  • Delete: Delete files and folders.
  • Downloads Report: Access the Download report.
  • Manage Shared URLs: Access the Shared URLs reports. Module's editors will be also able to delete shared URLs.

Usually, setting the proper Folder Permissions is enough and you don't need to change these default module's permissions (module's settings - "Permissions" tab).

The module's permissions allows you refine in a particular module the permissions inherited from the folder without affecting these global DNN folder permissions.

Let's say you have a role with 'Write' permissions in a folder, but you want the user being able to only upload files. No renaming, deleting, or setting titles and descriptions.

For example, you can have a folder where Registered Users can list and download files (which are usually the default permissions set by DNN), but you may want to disallow downloads in a particular DNNUserFiles module's instance.

Or, in another example, you can have a folder where certain role can write (which implies upload, delete, rename, etc.) and restrict what the role can or cannot do denying some permissions in the DNNUserFile module's settings. For example, it is OK to upload but you don't want the user being able to edit descriptions, rename files or update tags.

Example: Default Module Permissions

Example: Customized Module Permissions

DNNUserFiles module on/off switches

Turning a feature on will work if folder and module's permissions are granted. However, when you turn a feature off, it will stay disabled even if the user has folder and module permissions.

For many use cases, instead of customizing folder and/or module's permissions you can simply turn on or off features.

In the module's settings ("UserFiles Settings" tab) you can enable or disable many features such as upload, download, rename, delete, tagging, managing titles and descriptions, etc.

It doesn't matter if the user has 'write' access in the folder and 'upload' permission in the module, if you disable the module's Allow Upload' settings, uploads will be disabled in the module for all users.

Combining on/off switches with folder and module's permissions, you can for example enable the "Refresh" (synchronize) folder action only for a particular user or role.

Some examples

So, now you know the answer to these kind of problems:

Why can't I see a folder?

Why can't I upload new files?

  • The user will be able to see a folder's contents if he/she has "Browse Files in Folder" permission in the folder.
  • The user will be able to delete files if "Allow Delete?" is enabled in DNNUserFiles's settings, the user has "Write to Folder" permission in the folder, and "Delete" permission in the module.
  • The user will be able to upload files if "Allow Upload?" is enabled in DNNUserFiles's settings, the user has "Write to Folder" permission in the folder, and "Upload" permission in the module.
  • The user will be able to download files if "Allow Download?" is enabled in DNNUserFiles's settings, the user has "Open Files in Folder"permission in the current folder, and "Download" permission in the module.
  • The user will be able to change a file's title if "Allow Title editing" in DNNUserFiles's settings, the user has "Write to Folder" permission in the folder, and "Edit Item's properties" permission in the module.

DNN User Files module: Quick Guide

Last Updated: Jul 31, 2019

Templates

Built-in templates are shipped with the product. They are saved under \DesktopModules\Evotiva-UserFiles\Templates.

User (Custom) templates are expected to be under \Portals\_default\Evotiva-UserFiles\Templates.

In any case, each subfolder of any of these roots is a template, and typically will include the files you can see now under in the default template (\DesktopModules\Evotiva-UserFiles\Templates\Default).

Some files are optional (ItemSelected.html, Template.js), and subfolders such as \Images are specific to each template (they may on may not exist, depending on each template).

Template Files

Template.html

This is the actual template, which includes everything but the list of items (files and folders) that will be displayed. You can see examples of this in the Default template.

Item.html

Defines how each item (files and folders) will be rendered. You can see examples of this in the Default template.

ItemAlt.html

Defines an alternate view to list items. The token [UserFiles:SwitchView] renders a button that switches between Item.html and ItemAlt.html.

ItemSelected.html

Defines how an item will be presented when it is 'selected' (for example, when the user clicks on it).

It is optional. When not found, "Item.html" will be utilized.

TemplateNoItems.html

This will be rendered instead of "Item.html" when no items are found.

Template.css

CSS styles that applies to the template.

In the default template you can see classes named like ".evotiva-userfiles-..." and other named like ".evotivaUserFiles...". The first represent classes that are just in the template file(s). The second type  (".evotivaUserFiles...") represent classes that are injected by Tokens.

Template.js

Optional file for custom JS code relative to the template.

An optional OnEvotivaUserFilesDataBound(sender) function that can be implemented in this (template.js) JavaScript code file. It will be called on every data page update.

Simple example usage, to hide some content when the details are about a folder instead of a file:

Within Template.js:

function eufHideIf(hide) {
    if (hide===true) return "display: none;";
    return "";
}

Within ItemSelected.html:

    <tr style="#= eufHideIf(IsFolder) #">
        <td class="evotiva-userfiles-filedetails-label">[UserFiles:RESX|Size.Item]:</td>
        <td class="evotiva-userfiles-filedetails-text">[UserFiles:ItemSize] ([UserFiles:ItemSizeBytes] bytes)</td>
   </tr>

Another (a bit more elaborate) example:

    <div style="#=eufHideIf(IsFolder ||[UserFiles:DescriptionEditingDisabled]|| ItemDescription == null)#">
	    <span class="evotiva-userfiles-filedetails-label">[UserFiles:RESX|ItemDescription.Item]:</span><br/>
	    <span class="evotiva-userfiles-filedetails-text">[UserFiles:ItemDescription]</span>
    </div>

 

Advanced usage, embedding JS code directly in the template:

    <tr style="#= IsFolder ? 'display: none;' : 'display: block;' #">
        <td class="evotiva-userfiles-filedetails-label">[UserFiles:RESX|Size.Item]:</td>
        <td class="evotiva-userfiles-filedetails-text">[UserFiles:ItemSize] ([UserFiles:ItemSizeBytes] bytes)</td>
   </tr>

 

Template.resx

Optional file, for texts localization. (see 'Template Localization' below).

Template Localization

There are two ways to localize templates.

1. have a folder for each language. At run-time the module will pick one, with the same criteria that applies to DNN's RESX files.

For example, you can have  \MyTemplate, \MyTemplate.es-UY, \MyTemplate.es-UY.Host, \MyTemplate.es-UY.Portal-0, etc.

(see http://www.dnnsoftware.com/wiki/page/how-to-customize-edit-a-modules-language-pack)

2. keep a single \MyTemplate, and rely on its Template.resx for text localization. The same standard DNN logic applies for this Template.resx file. You can have (in the same folder) localized version such as Template.es-UY.resx, etc.

Note: Of course, if you don't need to worry about localization, you can hardcode text in the template files.

Template Tokens

Notes:

- It supports all the standard DNN tokens (see http://www.dnnsoftware.com/wiki/page/tokens)

- The tokens are not case sensitive (they can can be written in any combination of upper and lower case).

- Besides the standard DNN notation ([Object:Property],  [Object:Property|Format]), the DNN UserFiles module support the following notation:   [Object:Property|RESX:Format]. This will get the 'format' text from the active Template.resx file.

Example: [UserFiles:AddFolder|RESX:AddFolder].
You can see more examples of this in the Default template.

The tokens specific to this module (for which usage examples are available in the built-in default template files) are: 

Tokens can be also partially localized. Example:

[UserFiles:Delete|<i class="fa fa-trash fa-lg"></i> RESX:Delete]

Tokens relative to items' properties

[UserFiles:ModuleId], [UserFiles:ParentFolderId], [UserFiles:FolderMappingId], [UserFiles:ItemIsFolder] or [UserFiles:IsFolder] (obsolete), [UserFiles:ItemId], [UserFiles:ItemName], [UserFiles:ItemTitle], [UserFiles:ItemDescription], [UserFiles:EncodedItemDescription], [UserFiles:ItemSize] or [UserFiles:Size] (obsolete), [UserFiles:ItemSizeBytes] or [UserFiles:SizeBytes] (obsolete), [UserFiles:ItemType] or [UserFiles:ItemExtension] or [UserFiles:Type] (obsolete), [UserFiles:ItemContentType], [UserFiles:ItemMappedType] or [UserFiles:MappedType] (obsolete), [UserFiles:ItemUrl] (requires a module's setting to be enabled), [UserFiles:ItemViewUrl] (requires DNNGlobalStorage 4.5+), [UserFiles:ItemThumbUrl] or [UserFiles:ThumbUrl] (obsolete), [UserFiles:ItemLastModifiedBy] or [UserFiles:LastModifiedBy] (obsolete), [UserFiles:ItemCreatedBy] or [UserFiles:CreatedBy] (obsolete), [UserFiles:ItemLastModifiedOnDate] or [UserFiles:LastModifiedOnDate] (obsolete), [UserFiles:ItemCreatedOnDate] or [UserFiles:CreatedOnDate] (obsolete), [UserFiles:ItemFriendlyCreatedOnDate] or [UserFiles:FriendlyCreatedOnDate] (obsolete), [UserFiles:ItemFriendlyLastModifiedOnDate] or [UserFiles:FriendlyLastModifiedOnDate] (obsolete), [UserFiles:ItemDownloadCount] or [UserFiles:DownloadCount] (obsolete), [UserFiles:ItemTags] or [UserFiles:Tags] (obsolete), [UserFiles:EncodedItemTags] , [UserFiles:ItemTagsRaw], [UserFiles:ItemFolderPath] or [UserFiles:FolderPath] (obsolete), [UserFiles:ItemPermissions] or [UserFiles:Permissions] (obsolete), [UserFiles:ItemBreadCrumbs], [UserFiles:ItemIconUrl] or [UserFiles:IconUrl] (obsolete), [UserFiles:ItemIconImage] or [UserFiles:IconImage] (obsolete), [UserFiles:ItemThumbImage] or [UserFiles:ThumbImage] (obsolete), [UserFiles:ItemComments]

About 'raw' data values

Besides these tokens, in JavaScript expressions you can reference raw data values directly. This could be useful for some advances usages. For example, to implement some functionality related with the file's permissions, etc.

The following data values are available: IsFolder, ItemID, ItemName, ParentFolderID, FolderMappingID, FolderProviderType, FolderPath, LastModifiedByUserID, CreatedByUserID, LastModifiedByUserName, CreatedByUserName, LastModifiedOnDate, CreatedOnDate, FriendlyLastModifiedOnDate, FriendlyCreatedOnDate, Size, SizeBytes, Type, Permissions, IconUrl, ThumbUrl, BreadCrumbs

About [UserFiles:ItemThumbImage] and [UserFiles:ItemThumbUrl] tokens

The module ships with extension icons for most common file extensions. They will displayed instead of the file's actual thumbnail in case it cannot be generated.
Note: Currently the module can generate thumbnails for images and PDF files.

You can use your own extension images, saving them under Portals/_default/Evotiva-UserFiles/Images/

About date tokens

Date fields can accept the following formats: d, D, F, g, G, M, m, t, T, s, u, Y, y

Example output of each format:
  d = 10/6/2000
  D = Monday, November 06, 2000
  F = Monday, November 06, 2000 12:00:00 AM
  g = 11/6/2000 12:00 AM
  G = 11/6/2000 12:00:00 AM
  m = November 06
  M = November 06
  t = 2:30 PM
  T = 2:30:45 PM
  s = 2000-11-06 00:00:00
  u = 2000-11-06 00:00:00Z
  Y = November, 2000
  y = November, 2000

Building a custom date-time format

You can also specify a custom format. For example: [UserFiles:LastModifiedOnDate|dd MMMM yyyy hh:mm tt]

Specifier Result
"d" Renders the day of the month, from 1 through 31.
"dd" The day of the month, from 01 through 31.
"ddd" The abbreviated name of the day of the week.
"dddd" The full name of the day of the week.
"f" The tenths of a second in a date and time value.
"ff" The hundredths of a second in a date and time value.
"fff" The milliseconds in a date and time value.
"M" The month, from 1 through 12.
"MM" The month, from 01 through 12.
"MMM" The abbreviated name of the month.
"MMMM" The full name of the month.
"h" The hour, using a 12-hour clock from 1 to 12.
"hh" The hour, using a 12-hour clock from 01 to 12.
"H" The hour, using a 24-hour clock from 1 to 23.
"HH" The hour, using a 24-hour clock from 01 to 23.
"m" The minute, from 0 through 59.
"mm" The minute, from 00 through 59.
"s" The second, from 0 through 59.
"ss" The second, from 00 through 59.
"tt" The AM/PM designator.
"yy" The last two characters from the year value.
"yyyy" The year full value.
"zzz" The local timezone when using formats to parse UTC date strings.

The 'encoded' flavor of a token will html encode the value.

The 'friendly' flavor of a token will render a human-friendly relative date, such as "just now", "yesterday", "2 weeks ago", etc. These texts are localized in the template's "Template.resx" file.

The "ItemSize" is also friendly, providing texts such as "10 KB", "4 GB", etc.; while the "SizeBites" provides the raw file's size expressed in bytes.

About the 'MappedType' token

It is ideal to simplify and optimize (minimize) the requests sent to the server, mapping multiple file types to fewer definitions, which can be utilized, for example, as the name for a CSS class related with an image. Example (from the default template):

[UserFiles:ItemMappedType|default=file;null=folder;jpg,jpeg,gif,png,tif,tiff,bmp,ico=image;avi,mpg,mpeg,mov,mp4,3gp,divx,fla,flv,swf,Rmvb,wmv,vob=file-video;mp3,aif,aiff,arm,wav,mid,midi,wma,ogg,rm=file-audio;zip,rar,arj,ace,7z,cab,gz,jar,iso,tgz=file-archive;pdf=file-pdf;doc,docx=file-word;xls,xlsx=file-excel;ppt,pptx,pps,ppsx=file-powerpoint;rtf,txt,xml=file-alt]

It means: 

Unless a specific match is found, use 'file' (i.e., it is the default value).

Use 'image' for the file types jpg, jpeg, gif, png, tif, tiff, bmp, and ico

Use 'video' for the file types avi, mpg, mpeg, mov, mp4, 3gp, divx, fla, flv, swf, rmvb, wmv, and vob

etc. (it does the same for 'audio', 'archive', and 'document'.

Please notice this is just an example. You can use this token in any other way and defining whatever 'categories' you want to be utilized in any way (even from javascript code in the template's "Template.js" file.)

Tokens relative to items' sorting links

[UserFiles:ItemIdSortLink], [UserFiles:ItemNameSortLink], [UserFiles:ItemTitleSortLink], [UserFiles:ItemLastModifiedOnDateSortLink] or [UserFiles:LastModifiedOnDateSortLink] (obsolete), [UserFiles:ItemLastModifiedBySortLink] or [UserFiles:LastModifiedBySortLink] (obsolete), [UserFiles:ItemCreatedOnDateSortLink] or [UserFiles:CreatedOnDateSortLink] (obsolete), [UserFiles:ItemCreatedBySortLink] or [UserFiles:CreatedBySortLink] (obsolete), [UserFiles:ItemSizeSortLink] or [UserFiles:SizeSortLink] (obsolete), [UserFiles:ItemTypeSortLink] or [UserFiles:TypeSortLink] (obsolete)

Flag Tokens

[UserFiles:TagsDisabled], [UserFiles:TitleEditingDisabled], [UserFiles:DesciptionEditingDisabled], [UserFiles:DownloadingDisabled], [UserFiles:TrackDownloadsDisabled], [UserFiles:RefreshDisabled]

Obsolete (valid only for UserFiles version 2) Paging Tokens

[UserFiles:PageFirst], [UserFiles:PagePrev], [UserFiles:PageLast], [UserFiles:PageNext], [UserFiles:NumericPager], [UserFiles:PageCount], [UserFiles:PageSize]

An example, when combined with the RESX option: [UserFiles:RefreshFolder|RESX:RefreshFolder]

Important: In UserFiles version 3, all of these tokens were replaced by [UserFiles:Pager]

General Tokens

[UserFiles:RESX:|key] gets a text from the template's "Template.resx" file or the module's SharedResources.resx file. Example: [UserFiles:RESX|ItemName.Item]

[UserFiles:QueryString|element] gets the element's value from the url query string

[UserFiles:NoItems] defines in Template.html the placeholder for the 'no items found'.

[UserFiles:Items] defines in Template.html the placeholder for the items.

[UserFiles:Pager] defines in Template.html the placeholder for the pager.

Feature Tokens

[UserFiles:FoldersTree]: Renders a tree including the current folder's child folders.

[UserFiles:SearchBox], [UserFiles:Breadcumbs], [UserFiles:Subscriptions]

Current Folder Actions Tokens

[UserFiles:RefreshFolder] or [UserFiles:Refresh], [UserFiles:Upload], [UserFiles:AddFolder], [UserFiles:SwitchView], [UserFiles:ToggleFoldersTree]

Action Tokens

[UserFiles:ItemDownload] or [UserFiles:DownloadItem] or [UserFiles:Download], [UserFiles:ItemHardDownload], [UserFiles:ItemView] (requires DNNGlobalStorage 4.5+)

[UserFiles:ItemGetUrl] or [UserFiles:GetUrl] (obsolete), [UserFiles:ItemOpen], [UserFiles:ItemDelete] or [UserFiles:Delete] (obsolete), [UserFiles:ItemRename] or [UserFiles:ItemEditName] or [UserFiles:EditName], [UserFiles:ItemEditTitle] or [UserFiles:EditTitle], [UserFiles:ItemEditDescription] or [UserFiles:EditDescription], [UserFiles:ItemProperties] or [UserFiles:Properties], [UserFiles:ItemEditDate] or [UserFiles:EditDate], [UserFiles:ItemEditTags] or [UserFiles:EditTags],

There is a variation available for the [UserFiles:ItemDownload] token: [UserFiles:ItemDownload|ITEM:xxx]
xxx can be any of the supported properties. ItemId, ItemName, ItemTitle, FolderPath, Size, SizeBytes, Type
This means that you can turn any of these properties a download URL.

Some examples of the possible variations of the download token:

    <div class="eg-gall-dw">[UserFiles:ItemDownload]</div>
    <div>[UserFiles:ItemDownload|Download File]</div>
    <div>[UserFiles:ItemDownload|RESX:FileDownload]</div>
    <div>[UserFiles:ItemDownload|ITEM:ItemName]</div>

The first example, is utilized in the default template. The CSS class will show an image users can click to download the file.
The 2nd. example, uses the hardcoded 'Download File' text for the download link.
The 3rd. example instead of a hardcoded text utilized localized text (found in the template's Template.resx file).
The 4th. example uses the File's Name for the download link.

Using the Module

- As Host or Admin some additional settings will be available on its settings page.

- If a 'pattern' was configured, the module will create at run-time all the missing folders. They will inherit their permissions form its parent folder.

One exception to this is when 'enable uploads' is active. In this case, the final (lower level) folder will not include permissions for 'all users', and will include read and write permissions specific for the current user. This is ideal when the pattern is utilized to create user-specific folders (example pattern: "[Module:FriendlyName]/[User:Username]") . This behavior ensures that only the user (besides host and admins) will have access to their own folder.
Notice that from the DNN File Manager you can always change the folder's permissions in the way you like.

About the "Root Folder Pattern" Setting

In this setting, you can define additional items (static and dynamic) that will be added 'at runtime' to the root folder that was defined. It supports tokens, such as [User:...], [Profile:...], [Module:...], [Tab:...], etc.

For user's Profile properties to work properly, when defining the property (in DNN Admin > Site Settings > User Account Settings > Profile Settings), remember to make it visible to the user. Otherwise, at runtime the token cannot be solved by DNN.Besides, please notice these DNN profile properties does not work for "host" accounts.

Advanced Search

When enabled, you'll be able to search by content, besides the file's basic properties. Search by Tags will be also enabled (Note: since UserFiles version 3, search by tags is enabled even when Advanced Search is disabled.

Textual extensions like html and txt are parsed directly. Docx files are natively parsed, without needing any external component. Binary files (pdf, doc, dot, rtf, csv, xlt, xls, xlsx, ppt, pptx, etc.) are parsed via IFilters. Therefore, the proper IFilter parser needs to be installed on the web server.

Search Criteria

One or more words can be specified if intended to obtain search results containing Files with either the first term or any of the other terms.

If a complete word is not know or more than one File containing certain information needs to be found, an asterisk (*) wild card can be used to match words starting with a specific sub-string. Wild card and non-wild card terms can be mixed in the same search.

Phrases can also be specified using double quoted text. Quoted and non-quoted terms can be used in the same search.

Some examples:

Query Explanation
conference Search for word "conference".
"conference room" Search for phrase "conference room".
conf* Search for any word that starts with "conf".
conference room Contains the word conference or room, or both.
conference OR room Contains the word conference or room, or both. NOTE: OR must be in uppercase.
+conference +room Contains both conference and room.
conference AND room Contains both conference and room. NOTE: AND must be in uppercase.
+conference -room Contains the word "conference" and not "room".

 

When adding Tags to the search query, the matching files will have all the specified tags and all the specified term expressions.

You can also search by tags only, leaving blank the terms textbox. Furthermore, in you template you can the terms search text box, and/or the tags search text box, or even none of them.

In addition, in the module's Settings Page you can specify pre-filters by tags, file extensions, and other criteria.

IFilter Prerequisites

Creating and Managing Shared URLs

When enabled (Module's Settings > Advanced > 'Enable URL Sharing?'), 'Shared URLs' creation and management will be available in any file's 'Get URL' dialog.

The shared URL will be ruled by the restrictions set when configuring it. It doesn't matter where the shared file physically is (local to the web server, or remote, handled by any folder provider such as S3, UNC, FTP, Box, OneDrive, SharePoint, Azure, DropBox, etc. included in DNNGlobalStorage or any other folder provider)

Configuration options for Share URLs:

  • Anyone can download the file, or registered users only.
  • The URL can be password-protected. In this case, the password can be provided directly in the shared URL adding '&password=the-right-password-goes-here', or it will be requested by the system if it is invalid or missing from the URL.
  • An 'Expiry Date' can be set. The link will work up to the configured date
  • It can be defined how many times the URL can be utilized. For example, you can create a URL valid for a single time, or 10 times, etc.
  • Any of these options can be combined.

From the 'Manage Shared URLs' button, a page where all the URLs created for a file and its detailed usage is displayed.

Remarks:

  • Even when an URL created with this tool is supposed to be valid (i.e. none of the possible limitations set (if any) are active), the Shared URL will not work if in the module 'Downloads' are disabled or 'Enable URL Sharing?' is disabled.
  • 'Shared URLs' will bypass DNN permissions set in the web site on pages, modules and/or folders. That's the point of this kind of share.
  • The single exception to the previous rule applies when 'Allow Anonymous Downloads' is disabled. In this case, the URL will redirect the user to the portal's login page. The download will work for any registered user.
  • Users with permission to 'Get URL' (except unregistered users) and with 'write' permissions in the folder, are able to create shared URLs and manage only their own file's shares.
  • Module's editors with 'Get URL' permissions can see and manage any user's shares.

Getting the latest version of the Module

The latest version of the module is always available for download at http://www.evotiva.com/Downloads.

Installing the Module

Install the module on your DNN portal as any other standard module, from Host > Extensions.
In the http://www.evotiva.com/Products/DNNUserFiles/Demo-Videos page, you can find a demo video showing how install the module and apply your license key.

Installing the the License Key

Manual Process

Request the License

Before installing the license key, you have to email us to licensing at evotiva.com requesting your key.
Please use the "Activation" link available on the module's Settings page, and don't forget to include your invoice number in the request.

Install the License Key

Once you get the license from us, please install your it by visiting the module's settings page.
In the http://www.evotiva.com/Products/DNNUserFiles/Demo-Videos page, you can find a demo video showing how install the module and apply your license key.

Auto-Install the License Key

Optionally, you can rename your license key (sent as a TXT file) as Evotiva.DNNUserFiles.LicenseKey.resources, and save it in the /Portals/_default folder.
The key will be auto-installed the next time you visit the page where the module is. You can verify it if was installed visiting the module's Settings page, and reviewing the License Settings section.

What people are saying...