text: # -*- coding: utf-8 -*-
  # Copyright (c) 2008-2013 Erik Svensson <erik.public@gmail.com>
  # Licensed under the MIT license.
  
  import logging
  from six import iteritems
  
  LOGGER = logging.getLogger('transmissionrpc')
  LOGGER.setLevel(logging.ERROR)
  
  def mirror_dict(source):
      """
      Creates a dictionary with all values as keys and all keys as values.
      """
      source.update(dict((value, key) for key, value in iteritems(source)))
      return source
  
  DEFAULT_PORT = 9091
  
  DEFAULT_TIMEOUT = 30.0
  
  TR_PRI_LOW    = -1
  TR_PRI_NORMAL =  0
  TR_PRI_HIGH   =  1
  
  PRIORITY = mirror_dict({
      'low'    : TR_PRI_LOW,
      'normal' : TR_PRI_NORMAL,
      'high'   : TR_PRI_HIGH
  })
  
  TR_RATIOLIMIT_GLOBAL    = 0 # follow the global settings
  TR_RATIOLIMIT_SINGLE    = 1 # override the global settings, seeding until a certain ratio
  TR_RATIOLIMIT_UNLIMITED = 2 # override the global settings, seeding regardless of ratio
  
  RATIO_LIMIT = mirror_dict({
      'global'    : TR_RATIOLIMIT_GLOBAL,
      'single'    : TR_RATIOLIMIT_SINGLE,
      'unlimited' : TR_RATIOLIMIT_UNLIMITED
  })
  
  TR_IDLELIMIT_GLOBAL     = 0 # follow the global settings
  TR_IDLELIMIT_SINGLE     = 1 # override the global settings, seeding until a certain idle time
  TR_IDLELIMIT_UNLIMITED  = 2 # override the global settings, seeding regardless of activity
  
  IDLE_LIMIT = mirror_dict({
      'global'    : TR_RATIOLIMIT_GLOBAL,
      'single'    : TR_RATIOLIMIT_SINGLE,
      'unlimited' : TR_RATIOLIMIT_UNLIMITED
  })
  
  # A note on argument maps
  # These maps are used to verify *-set methods. The information is structured in
  # a tree.
  # set +- <argument1> - [<type>, <added version>, <removed version>, <previous argument name>, <next argument name>, <description>]
  #  |  +- <argument2> - [<type>, <added version>, <removed version>, <previous argument name>, <next argument name>, <description>]
  #  |
  # get +- <argument1> - [<type>, <added version>, <removed version>, <previous argument name>, <next argument name>, <description>]
  #     +- <argument2> - [<type>, <added version>, <removed version>, <previous argument name>, <next argument name>, <description>]
  
  # Arguments for torrent methods
  TORRENT_ARGS = {
      'get' : {
          'activityDate':                 ('number', 1, None, None, None, 'Last time of upload or download activity.'),
          'addedDate':                    ('number', 1, None, None, None, 'The date when this torrent was first added.'),
          'announceResponse':             ('string', 1, 7, None, None, 'The announce message from the tracker.'),
          'announceURL':                  ('string', 1, 7, None, None, 'Current announce URL.'),
          'bandwidthPriority':            ('number', 5, None, None, None, 'Bandwidth priority. Low (-1), Normal (0) or High (1).'),
          'comment':                      ('string', 1, None, None, None, 'Torrent comment.'),
          'corruptEver':                  ('number', 1, None, None, None, 'Number of bytes of corrupt data downloaded.'),
          'creator':                      ('string', 1, None, None, None, 'Torrent creator.'),
          'dateCreated':                  ('number', 1, None, None, None, 'Torrent creation date.'),
          'desiredAvailable':             ('number', 1, None, None, None, 'Number of bytes avalable and left to be downloaded.'),
          'doneDate':                     ('number', 1, None, None, None, 'The date when the torrent finished downloading.'),
          'downloadDir':                  ('string', 4, None, None, None, 'The directory path where the torrent is downloaded to.'),
          'downloadedEver':               ('number', 1, None, None, None, 'Number of bytes of good data downloaded.'),
          'downloaders':                  ('number', 4, 7, None, None, 'Number of downloaders.'),
          'downloadLimit':                ('number', 1, None, None, None, 'Download limit in Kbps.'),
          'downloadLimited':              ('boolean', 5, None, None, None, 'Download limit is enabled'),
          'downloadLimitMode':            ('number', 1, 5, None, None, 'Download limit mode. 0 means global, 1 means signle, 2 unlimited.'),
          'error':                        ('number', 1, None, None, None, 'Kind of error. 0 means OK, 1 means tracker warning, 2 means tracker error, 3 means local error.'),
          'errorString':                  ('number', 1, None, None, None, 'Error message.'),
          'eta':                          ('number', 1, None, None, None, 'Estimated number of seconds left when downloading or seeding. -1 means not available and -2 means unknown.'),
          'etaIdle':                      ('number', 15, None, None, None, 'Estimated number of seconds left until the idle time limit is reached. -1 means not available and -2 means unknown.'),        
          'files':                        ('array', 1, None, None, None, 'Array of file object containing key, bytesCompleted, length and name.'),
          'fileStats':                    ('array', 5, None, None, None, 'Aray of file statistics containing bytesCompleted, wanted and priority.'),
          'hashString':                   ('string', 1, None, None, None, 'Hashstring unique for the torrent even between sessions.'),
          'haveUnchecked':                ('number', 1, None, None, None, 'Number of bytes of partial pieces.'),
          'haveValid':                    ('number', 1, None, None, None, 'Number of bytes of checksum verified data.'),
          'honorsSessionLimits':          ('boolean', 5, None, None, None, 'True if session upload limits are honored'),
          'id':                           ('number', 1, None, None, None, 'Session unique torrent id.'),
          'isFinished':                   ('boolean', 9, None, None, None, 'True if the torrent is finished. Downloaded and seeded.'),
          'isPrivate':                    ('boolean', 1, None, None, None, 'True if the torrent is private.'),
          'isStalled':                    ('boolean', 14, None, None, None, 'True if the torrent has stalled (been idle for a long time).'),
          'lastAnnounceTime':             ('number', 1, 7, None, None, 'The time of the last announcement.'),
          'lastScrapeTime':               ('number', 1, 7, None, None, 'The time af the last successful scrape.'),
          'leechers':                     ('number', 1, 7, None, None, 'Number of leechers.'),
          'leftUntilDone':                ('number', 1, None, None, None, 'Number of bytes left until the download is done.'),
          'magnetLink':                   ('string', 7, None, None, None, 'The magnet link for this torrent.'),
          'manualAnnounceTime':           ('number', 1, None, None, None, 'The time until you manually ask for more peers.'),
          'maxConnectedPeers':            ('number', 1, None, None, None, 'Maximum of connected peers.'),
          'metadataPercentComplete':      ('number', 7, None, None, None, 'Download progress of metadata. 0.0 to 1.0.'),
          'name':                         ('string', 1, None, None, None, 'Torrent name.'),
          'nextAnnounceTime':             ('number', 1, 7, None, None, 'Next announce time.'),
          'nextScrapeTime':               ('number', 1, 7, None, None, 'Next scrape time.'),
          'peer-limit':                   ('number', 5, None, None, None, 'Maximum number of peers.'),
          'peers':                        ('array', 2, None, None, None, 'Array of peer objects.'),
          'peersConnected':               ('number', 1, None, None, None, 'Number of peers we are connected to.'),
          'peersFrom':                    ('object', 1, None, None, None, 'Object containing download peers counts for different peer types.'),
          'peersGettingFromUs':           ('number', 1, None, None, None, 'Number of peers we are sending data to.'),
          'peersKnown':                   ('number', 1, 13, None, None, 'Number of peers that the tracker knows.'),
          'peersSendingToUs':             ('number', 1, None, None, None, 'Number of peers sending to us'),
          'percentDone':                  ('double', 5, None, None, None, 'Download progress of selected files. 0.0 to 1.0.'),
          'pieces':                       ('string', 5, None, None, None, 'String with base64 encoded bitfield indicating finished pieces.'),
          'pieceCount':                   ('number', 1, None, None, None, 'Number of pieces.'),
          'pieceSize':                    ('number', 1, None, None, None, 'Number of bytes in a piece.'),
          'priorities':                   ('array', 1, None, None, None, 'Array of file priorities.'),
          'queuePosition':                ('number', 14, None, None, None, 'The queue position.'),
          'rateDownload':                 ('number', 1, None, None, None, 'Download rate in bps.'),
          'rateUpload':                   ('number', 1, None, None, None, 'Upload rate in bps.'),
          'recheckProgress':              ('double', 1, None, None, None, 'Progress of recheck. 0.0 to 1.0.'),
          'secondsDownloading':           ('number', 15, None, None, None, ''),
          'secondsSeeding':               ('number', 15, None, None, None, ''),
          'scrapeResponse':               ('string', 1, 7, None, None, 'Scrape response message.'),
          'scrapeURL':                    ('string', 1, 7, None, None, 'Current scrape URL'),
          'seeders':                      ('number', 1, 7, None, None, 'Number of seeders reported by the tracker.'),
          'seedIdleLimit':                ('number', 10, None, None, None, 'Idle limit in minutes.'),
          'seedIdleMode':                 ('number', 10, None, None, None, 'Use global (0), torrent (1), or unlimited (2) limit.'),
          'seedRatioLimit':               ('double', 5, None, None, None, 'Seed ratio limit.'),
          'seedRatioMode':                ('number', 5, None, None, None, 'Use global (0), torrent (1), or unlimited (2) limit.'),
          'sizeWhenDone':                 ('number', 1, None, None, None, 'Size of the torrent download in bytes.'),
          'startDate':                    ('number', 1, None, None, None, 'The date when the torrent was last started.'),
          'status':                       ('number', 1, None, None, None, 'Current status, see source'),
          'swarmSpeed':                   ('number', 1, 7, None, None, 'Estimated speed in Kbps in the swarm.'),
          'timesCompleted':               ('number', 1, 7, None, None, 'Number of successful downloads reported by the tracker.'),
          'trackers':                     ('array', 1, None, None, None, 'Array of tracker objects.'),
          'trackerStats':                 ('object', 7, None, None, None, 'Array of object containing tracker statistics.'),
          'totalSize':                    ('number', 1, None, None, None, 'Total size of the torrent in bytes'),
          'torrentFile':                  ('string', 5, None, None, None, 'Path to .torrent file.'),
          'uploadedEver':                 ('number', 1, None, None, None, 'Number of bytes uploaded, ever.'),
          'uploadLimit':                  ('number', 1, None, None, None, 'Upload limit in Kbps'),
          'uploadLimitMode':              ('number', 1, 5, None, None, 'Upload limit mode. 0 means global, 1 means signle, 2 unlimited.'),
          'uploadLimited':                ('boolean', 5, None, None, None, 'Upload limit enabled.'),
          'uploadRatio':                  ('double', 1, None, None, None, 'Seed ratio.'),
          'wanted':                       ('array', 1, None, None, None, 'Array of booleans indicated wanted files.'),
          'webseeds':                     ('array', 1, None, None, None, 'Array of webseeds objects'),
          'webseedsSendingToUs':          ('number', 1, None, None, None, 'Number of webseeds seeding to us.'),
      },
      'set': {
          'bandwidthPriority':            ('number', 5, None, None, None, 'Priority for this transfer.'),
          'downloadLimit':                ('number', 5, None, 'speed-limit-down', None, 'Set the speed limit for download in Kib/s.'),
          'downloadLimited':              ('boolean', 5, None, 'speed-limit-down-enabled', None, 'Enable download speed limiter.'),
          'files-wanted':                 ('array', 1, None, None, None, "A list of file id's that should be downloaded."),
          'files-unwanted':               ('array', 1, None, None, None, "A list of file id's that shouldn't be downloaded."),
          'honorsSessionLimits':          ('boolean', 5, None, None, None, "Enables or disables the transfer to honour the upload limit set in the session."),
          'location':                     ('array', 1, None, None, None, 'Local download location.'),
          'peer-limit':                   ('number', 1, None, None, None, 'The peer limit for the torrents.'),
          'priority-high':                ('array', 1, None, None, None, "A list of file id's that should have high priority."),
          'priority-low':                 ('array', 1, None, None, None, "A list of file id's that should have normal priority."),
          'priority-normal':              ('array', 1, None, None, None, "A list of file id's that should have low priority."),
          'queuePosition':                ('number', 14, None, None, None, 'Position of this transfer in its queue.'),
          'seedIdleLimit':                ('number', 10, None, None, None, 'Seed inactivity limit in minutes.'),
          'seedIdleMode':                 ('number', 10, None, None, None, 'Seed inactivity mode. 0 = Use session limit, 1 = Use transfer limit, 2 = Disable limit.'),
          'seedRatioLimit':               ('double', 5, None, None, None, 'Seeding ratio.'),
          'seedRatioMode':                ('number', 5, None, None, None, 'Which ratio to use. 0 = Use session limit, 1 = Use transfer limit, 2 = Disable limit.'),
          'speed-limit-down':             ('number', 1, 5, None, 'downloadLimit', 'Set the speed limit for download in Kib/s.'),
          'speed-limit-down-enabled':     ('boolean', 1, 5, None, 'downloadLimited', 'Enable download speed limiter.'),
          'speed-limit-up':               ('number', 1, 5, None, 'uploadLimit', 'Set the speed limit for upload in Kib/s.'),
          'speed-limit-up-enabled':       ('boolean', 1, 5, None, 'uploadLimited', 'Enable upload speed limiter.'),
          'trackerAdd':                   ('array', 10, None, None, None, 'Array of string with announce URLs to add.'),
          'trackerRemove':                ('array', 10, None, None, None, 'Array of ids of trackers to remove.'),
          'trackerReplace':               ('array', 10, None, None, None, 'Array of (id, url) tuples where the announce URL should be replaced.'),
          'uploadLimit':                  ('number', 5, None, 'speed-limit-up', None, 'Set the speed limit for upload in Kib/s.'),
          'uploadLimited':                ('boolean', 5, None, 'speed-limit-up-enabled', None, 'Enable upload speed limiter.'),
      },
      'add': {
          'bandwidthPriority':            ('number', 8, None, None, None, 'Priority for this transfer.'),
          'download-dir':                 ('string', 1, None, None, None, 'The directory where the downloaded contents will be saved in.'),
          'cookies':                      ('string', 13, None, None, None, 'One or more HTTP cookie(s).'),
          'filename':                     ('string', 1, None, None, None, "A file path or URL to a torrent file or a magnet link."),
          'files-wanted':                 ('array', 1, None, None, None, "A list of file id's that should be downloaded."),
          'files-unwanted':               ('array', 1, None, None, None, "A list of file id's that shouldn't be downloaded."),
          'metainfo':                     ('string', 1, None, None, None, 'The content of a torrent file, base64 encoded.'),
          'paused':                       ('boolean', 1, None, None, None, 'If True, does not start the transfer when added.'),
          'peer-limit':                   ('number', 1, None, None, None, 'Maximum number of peers allowed.'),
          'priority-high':                ('array', 1, None, None, None, "A list of file id's that should have high priority."),
          'priority-low':                 ('array', 1, None, None, None, "A list of file id's that should have low priority."),
          'priority-normal':              ('array', 1, None, None, None, "A list of file id's that should have normal priority."),
      }
  }
  
  # Arguments for session methods
  SESSION_ARGS = {
      'get': {
          "alt-speed-down":               ('number', 5, None, None, None, 'Alternate session download speed limit (in Kib/s).'),
          "alt-speed-enabled":            ('boolean', 5, None, None, None, 'True if alternate global download speed limiter is ebabled.'),
          "alt-speed-time-begin":         ('number', 5, None, None, None, 'Time when alternate speeds should be enabled. Minutes after midnight.'),
          "alt-speed-time-enabled":       ('boolean', 5, None, None, None, 'True if alternate speeds scheduling is enabled.'),
          "alt-speed-time-end":           ('number', 5, None, None, None, 'Time when alternate speeds should be disabled. Minutes after midnight.'),
          "alt-speed-time-day":           ('number', 5, None, None, None, 'Days alternate speeds scheduling is enabled.'),
          "alt-speed-up":                 ('number', 5, None, None, None, 'Alternate session upload speed limit (in Kib/s)'),
          "blocklist-enabled":            ('boolean', 5, None, None, None, 'True when blocklist is enabled.'),
          "blocklist-size":               ('number', 5, None, None, None, 'Number of rules in the blocklist'),
          "blocklist-url":                ('string', 11, None, None, None, 'Location of the block list. Updated with blocklist-update.'),
          "cache-size-mb":                ('number', 10, None, None, None, 'The maximum size of the disk cache in MB'),
          "config-dir":                   ('string', 8, None, None, None, 'location of transmissions configuration directory'),
          "dht-enabled":                  ('boolean', 6, None, None, None, 'True if DHT enabled.'),
          "download-dir":                 ('string', 1, None, None, None, 'The download directory.'),
          "download-dir-free-space":      ('number', 12, None, None, None, 'Free space in the download directory, in bytes'),
          "download-queue-size":          ('number', 14, None, None, None, 'Number of slots in the download queue.'),
          "download-queue-enabled":       ('boolean', 14, None, None, None, 'True if the download queue is enabled.'),
          "encryption":                   ('string', 1, None, None, None, 'Encryption mode, one of ``required``, ``preferred`` or ``tolerated``.'),
          "idle-seeding-limit":           ('number', 10, None, None, None, 'Seed inactivity limit in minutes.'),
          "idle-seeding-limit-enabled":   ('boolean', 10, None, None, None, 'True if the seed activity limit is enabled.'),
          "incomplete-dir":               ('string', 7, None, None, None, 'The path to the directory for incomplete torrent transfer data.'),
          "incomplete-dir-enabled":       ('boolean', 7, None, None, None, 'True if the incomplete dir is enabled.'),
          "lpd-enabled":                  ('boolean', 9, None, None, None, 'True if local peer discovery is enabled.'),
          "peer-limit":                   ('number', 1, 5, None, 'peer-limit-global', 'Maximum number of peers.'),
          "peer-limit-global":            ('number', 5, None, 'peer-limit', None, 'Maximum number of peers.'),
          "peer-limit-per-torrent":       ('number', 5, None, None, None, 'Maximum number of peers per transfer.'),
          "pex-allowed":                  ('boolean', 1, 5, None, 'pex-enabled', 'True if PEX is allowed.'),
          "pex-enabled":                  ('boolean', 5, None, 'pex-allowed', None, 'True if PEX is enabled.'),
          "port":                         ('number', 1, 5, None, 'peer-port', 'Peer port.'),
          "peer-port":                    ('number', 5, None, 'port', None, 'Peer port.'),
          "peer-port-random-on-start":    ('boolean', 5, None, None, None, 'Enables randomized peer port on start of Transmission.'),
          "port-forwarding-enabled":      ('boolean', 1, None, None, None, 'True if port forwarding is enabled.'),
          "queue-stalled-minutes":        ('number', 14, None, None, None, 'Number of minutes of idle that marks a transfer as stalled.'),
          "queue-stalled-enabled":        ('boolean', 14, None, None, None, 'True if stalled tracking of transfers is enabled.'),
          "rename-partial-files":         ('boolean', 8, None, None, None, 'True if ".part" is appended to incomplete files'),
          "rpc-version":                  ('number', 4, None, None, None, 'Transmission RPC API Version.'),
          "rpc-version-minimum":          ('number', 4, None, None, None, 'Minimum accepted RPC API Version.'),
          "script-torrent-done-enabled":  ('boolean', 9, None, None, None, 'True if the done script is enabled.'),
          "script-torrent-done-filename": ('string', 9, None, None, None, 'Filename of the script to run when the transfer is done.'),
          "seedRatioLimit":               ('double', 5, None, None, None, 'Seed ratio limit. 1.0 means 1:1 download and upload ratio.'),
          "seedRatioLimited":             ('boolean', 5, None, None, None, 'True if seed ration limit is enabled.'),
          "seed-queue-size":              ('number', 14, None, None, None, 'Number of slots in the upload queue.'),
          "seed-queue-enabled":           ('boolean', 14, None, None, None, 'True if upload queue is enabled.'),
          "speed-limit-down":             ('number', 1, None, None, None, 'Download speed limit (in Kib/s).'),
          "speed-limit-down-enabled":     ('boolean', 1, None, None, None, 'True if the download speed is limited.'),
          "speed-limit-up":               ('number', 1, None, None, None, 'Upload speed limit (in Kib/s).'),
          "speed-limit-up-enabled":       ('boolean', 1, None, None, None, 'True if the upload speed is limited.'),
          "start-added-torrents":         ('boolean', 9, None, None, None, 'When true uploaded torrents will start right away.'),
          "trash-original-torrent-files": ('boolean', 9, None, None, None, 'When true added .torrent files will be deleted.'),
          'units':                        ('object', 10, None, None, None, 'An object containing units for size and speed.'),
          'utp-enabled':                  ('boolean', 13, None, None, None, 'True if Micro Transport Protocol (UTP) is enabled.'),
          "version":                      ('string', 3, None, None, None, 'Transmission version.'),
      },
      'set': {
          "alt-speed-down":               ('number', 5, None, None, None, 'Alternate session download speed limit (in Kib/s).'),
          "alt-speed-enabled":            ('boolean', 5, None, None, None, 'Enables alternate global download speed limiter.'),
          "alt-speed-time-begin":         ('number', 5, None, None, None, 'Time when alternate speeds should be enabled. Minutes after midnight.'),
          "alt-speed-time-enabled":       ('boolean', 5, None, None, None, 'Enables alternate speeds scheduling.'),
          "alt-speed-time-end":           ('number', 5, None, None, None, 'Time when alternate speeds should be disabled. Minutes after midnight.'),
          "alt-speed-time-day":           ('number', 5, None, None, None, 'Enables alternate speeds scheduling these days.'),
          "alt-speed-up":                 ('number', 5, None, None, None, 'Alternate session upload speed limit (in Kib/s).'),
          "blocklist-enabled":            ('boolean', 5, None, None, None, 'Enables the block list'),
          "blocklist-url":                ('string', 11, None, None, None, 'Location of the block list. Updated with blocklist-update.'),
          "cache-size-mb":                ('number', 10, None, None, None, 'The maximum size of the disk cache in MB'),
          "dht-enabled":                  ('boolean', 6, None, None, None, 'Enables DHT.'),
          "download-dir":                 ('string', 1, None, None, None, 'Set the session download directory.'),
          "download-queue-size":          ('number', 14, None, None, None, 'Number of slots in the download queue.'),
          "download-queue-enabled":       ('boolean', 14, None, None, None, 'Enables download queue.'),
          "encryption":                   ('string', 1, None, None, None, 'Set the session encryption mode, one of ``required``, ``preferred`` or ``tolerated``.'),
          "idle-seeding-limit":           ('number', 10, None, None, None, 'The default seed inactivity limit in minutes.'),
          "idle-seeding-limit-enabled":   ('boolean', 10, None, None, None, 'Enables the default seed inactivity limit'),
          "incomplete-dir":               ('string', 7, None, None, None, 'The path to the directory of incomplete transfer data.'),
          "incomplete-dir-enabled":       ('boolean', 7, None, None, None, 'Enables the incomplete transfer data directory. Otherwise data for incomplete transfers are stored in the download target.'),
          "lpd-enabled":                  ('boolean', 9, None, None, None, 'Enables local peer discovery for public torrents.'),
          "peer-limit":                   ('number', 1, 5, None, 'peer-limit-global', 'Maximum number of peers.'),
          "peer-limit-global":            ('number', 5, None, 'peer-limit', None, 'Maximum number of peers.'),
          "peer-limit-per-torrent":       ('number', 5, None, None, None, 'Maximum number of peers per transfer.'),
          "pex-allowed":                  ('boolean', 1, 5, None, 'pex-enabled', 'Allowing PEX in public torrents.'),
          "pex-enabled":                  ('boolean', 5, None, 'pex-allowed', None, 'Allowing PEX in public torrents.'),
          "port":                         ('number', 1, 5, None, 'peer-port', 'Peer port.'),
          "peer-port":                    ('number', 5, None, 'port', None, 'Peer port.'),
          "peer-port-random-on-start":    ('boolean', 5, None, None, None, 'Enables randomized peer port on start of Transmission.'),
          "port-forwarding-enabled":      ('boolean', 1, None, None, None, 'Enables port forwarding.'),
          "rename-partial-files":         ('boolean', 8, None, None, None, 'Appends ".part" to incomplete files'),
          "queue-stalled-minutes":        ('number', 14, None, None, None, 'Number of minutes of idle that marks a transfer as stalled.'),
          "queue-stalled-enabled":        ('boolean', 14, None, None, None, 'Enable tracking of stalled transfers.'),
          "script-torrent-done-enabled":  ('boolean', 9, None, None, None, 'Whether or not to call the "done" script.'),
          "script-torrent-done-filename": ('string', 9, None, None, None, 'Filename of the script to run when the transfer is done.'),
          "seed-queue-size":              ('number', 14, None, None, None, 'Number of slots in the upload queue.'),
          "seed-queue-enabled":           ('boolean', 14, None, None, None, 'Enables upload queue.'),
          "seedRatioLimit":               ('double', 5, None, None, None, 'Seed ratio limit. 1.0 means 1:1 download and upload ratio.'),
          "seedRatioLimited":             ('boolean', 5, None, None, None, 'Enables seed ration limit.'),
          "speed-limit-down":             ('number', 1, None, None, None, 'Download speed limit (in Kib/s).'),
          "speed-limit-down-enabled":     ('boolean', 1, None, None, None, 'Enables download speed limiting.'),
          "speed-limit-up":               ('number', 1, None, None, None, 'Upload speed limit (in Kib/s).'),
          "speed-limit-up-enabled":       ('boolean', 1, None, None, None, 'Enables upload speed limiting.'),
          "start-added-torrents":         ('boolean', 9, None, None, None, 'Added torrents will be started right away.'),
          "trash-original-torrent-files": ('boolean', 9, None, None, None, 'The .torrent file of added torrents will be deleted.'),
          'utp-enabled':                  ('boolean', 13, None, None, None, 'Enables Micro Transport Protocol (UTP).'),
      },
  }
  