{
  "fieldDBtype": "ComputationalLinguisticsDatum",
  "_id": "request",
  "dateCreated": 1594648244935,
  "version": "v5.121.19-rc0",
  "tempId": "request",
  "stats": {
    "characters": {
      "unigrams": {
        "0": 24,
        "1": 16,
        "2": 17,
        "3": 8,
        "4": 8,
        "5": 2,
        "6": 7,
        "8": 1,
        "9": 1,
        "/": 132,
        "*": 305,
        "!": 18,
        "\n": 516,
        " ": 1992,
        "e": 986,
        "x": 64,
        "p": 301,
        "r": 700,
        "s": 521,
        "C": 27,
        "o": 394,
        "y": 115,
        "i": 407,
        "g": 147,
        "h": 276,
        "t": 755,
        "(": 140,
        "c": 286,
        ")": 140,
        "-": 42,
        "T": 24,
        "J": 1,
        "H": 9,
        "l": 205,
        "w": 45,
        "a": 557,
        "u": 275,
        "k": 20,
        "R": 18,
        "m": 161,
        "n": 483,
        "S": 25,
        "D": 4,
        "W": 9,
        "M": 11,
        "I": 12,
        "L": 13,
        "d": 230,
        "'": 167,
        ";": 116,
        ".": 195,
        "@": 54,
        "v": 67,
        "=": 104,
        "q": 96,
        "P": 12,
        "f": 164,
        "b": 98,
        "O": 9,
        "j": 31,
        "`": 52,
        ",": 106,
        "E": 20,
        ":": 39,
        ">": 15,
        "\"": 108,
        "A": 23,
        "{": 66,
        "}": 66,
        "|": 26,
        "[": 22,
        "]": 22,
        "N": 5,
        "_": 6,
        "B": 6,
        "U": 6,
        "z": 5,
        "&": 7,
        "V": 4,
        "?": 6,
        "+": 6,
        "<": 2,
        "X": 7,
        "F": 8,
        "G": 14,
        "\\": 2
      },
      "bigrams": {}
    },
    "words": {
      "unigrams": {
        "1": 2,
        "4": 1,
        "200": 1,
        "304": 2,
        "406": 3,
        "2013": 1,
        "/*!": 1,
        "*": 230,
        "express": 1,
        "Copyright(c)": 3,
        "2009-2013": 1,
        "TJ": 1,
        "Holowaychuk": 1,
        "Roman": 1,
        "Shtylman": 1,
        "2014-2015": 1,
        "Douglas": 1,
        "Christopher": 1,
        "Wilson": 1,
        "MIT": 1,
        "Licensed": 1,
        "*/": 23,
        "'use": 1,
        "strict';": 1,
        "/**": 22,
        "Module": 2,
        "dependencies.": 1,
        "@private": 2,
        "var": 37,
        "accepts": 1,
        "=": 55,
        "require('accepts');": 1,
        "deprecate": 1,
        "require('depd')('express');": 1,
        "isIP": 1,
        "require('net').isIP;": 1,
        "typeis": 1,
        "require('type-is');": 1,
        "http": 1,
        "require('http');": 1,
        "fresh": 1,
        "require('fresh');": 1,
        "parseRange": 1,
        "require('range-parser');": 1,
        "parse": 1,
        "require('parseurl');": 1,
        "proxyaddr": 1,
        "require('proxy-addr');": 1,
        "Request": 1,
        "prototype.": 1,
        "@public": 20,
        "req": 2,
        "Object.create(http.IncomingMessage.prototype)": 1,
        "exports.": 1,
        "module.exports": 1,
        "Return": 5,
        "request": 6,
        "header.": 1,
        "The": 4,
        "`Referrer`": 2,
        "header": 7,
        "field": 5,
        "is": 26,
        "special-cased,": 1,
        "both": 1,
        "and": 10,
        "`Referer`": 1,
        "are": 7,
        "interchangeable.": 1,
        "Examples:": 3,
        "req.get('Content-Type');": 1,
        "//": 28,
        "=>": 13,
        "\"text/plain\"": 2,
        "req.get('content-type');": 1,
        "req.get('Something');": 1,
        "undefined": 2,
        "Aliased": 1,
        "as": 8,
        "`req.header()`.": 1,
        "@param": 14,
        "{String}": 12,
        "name": 5,
        "@return": 18,
        "req.get": 1,
        "req.header": 1,
        "function": 15,
        "header(name)": 1,
        "{": 18,
        "if": 25,
        "(!name)": 1,
        "throw": 2,
        "new": 3,
        "TypeError('name": 2,
        "argument": 2,
        "required": 2,
        "to": 8,
        "req.get');": 2,
        "}": 9,
        "(typeof": 1,
        "!==": 4,
        "'string')": 1,
        "must": 1,
        "be": 12,
        "a": 12,
        "string": 4,
        "lc": 1,
        "name.toLowerCase();": 1,
        "switch": 1,
        "(lc)": 1,
        "case": 4,
        "'referer':": 1,
        "'referrer':": 1,
        "return": 28,
        "this.headers.referrer": 1,
        "||": 8,
        "this.headers.referer;": 1,
        "default:": 1,
        "this.headers[lc];": 1,
        "};": 8,
        "To": 2,
        "do:": 1,
        "update": 1,
        "docs.": 1,
        "Check": 8,
        "the": 50,
        "given": 6,
        "`type(s)`": 1,
        "acceptable,": 3,
        "returning": 1,
        "best": 1,
        "match": 1,
        "when": 6,
        "true,": 3,
        "otherwise": 3,
        "`undefined`,": 1,
        "in": 2,
        "which": 2,
        "you": 5,
        "should": 5,
        "respond": 4,
        "with": 6,
        "\"Not": 3,
        "Acceptable\".": 3,
        "`type`": 1,
        "value": 3,
        "may": 2,
        "single": 3,
        "MIME": 1,
        "type": 2,
        "such": 5,
        "\"application/json\",": 1,
        "an": 8,
        "extension": 1,
        "\"json\",": 1,
        "comma-delimited": 1,
        "list": 3,
        "\"json,": 1,
        "html,": 1,
        "text/plain\",": 1,
        "`\"json\",": 1,
        "\"html\",": 2,
        "\"text/plain\"`,": 1,
        "or": 8,
        "array": 5,
        "`[\"json\",": 1,
        "\"text/plain\"]`.": 1,
        "When": 6,
        "given,": 1,
        "_best_": 1,
        "match,": 1,
        "any": 1,
        "returned.": 1,
        "Accept:": 4,
        "text/html": 1,
        "req.accepts('html');": 2,
        "\"html\"": 2,
        "text/*,": 2,
        "application/json": 4,
        "req.accepts('text/html');": 1,
        "\"text/html\"": 1,
        "req.accepts('json,": 1,
        "text');": 1,
        "\"json\"": 2,
        "req.accepts('application/json');": 1,
        "\"application/json\"": 1,
        "req.accepts('image/png');": 1,
        "req.accepts('png');": 1,
        "text/*;q=.5,": 1,
        "req.accepts(['html',": 1,
        "'json']);": 1,
        "req.accepts('html',": 1,
        "'json');": 1,
        "req.accepts('html,": 1,
        "json');": 1,
        "{String|Array}": 5,
        "type(s)": 1,
        "{String|Array|Boolean}": 1,
        "req.accepts": 1,
        "function(){": 5,
        "accept": 4,
        "accepts(this);": 4,
        "accept.types.apply(accept,": 1,
        "arguments);": 4,
        "`encoding`s": 1,
        "accepted.": 1,
        "...encoding": 1,
        "req.acceptsEncodings": 1,
        "accept.encodings.apply(accept,": 1,
        "req.acceptsEncoding": 1,
        "deprecate.function(req.acceptsEncodings,": 1,
        "'req.acceptsEncoding:": 1,
        "Use": 5,
        "acceptsEncodings": 1,
        "instead');": 4,
        "`charset`s": 1,
        "...charset": 1,
        "req.acceptsCharsets": 1,
        "accept.charsets.apply(accept,": 1,
        "req.acceptsCharset": 1,
        "deprecate.function(req.acceptsCharsets,": 1,
        "'req.acceptsCharset:": 1,
        "acceptsCharsets": 1,
        "`lang`s": 1,
        "...lang": 1,
        "req.acceptsLanguages": 1,
        "accept.languages.apply(accept,": 1,
        "req.acceptsLanguage": 1,
        "deprecate.function(req.acceptsLanguages,": 1,
        "'req.acceptsLanguage:": 1,
        "acceptsLanguages": 1,
        "Parse": 2,
        "Range": 2,
        "field,": 2,
        "capping": 1,
        "`size`.": 1,
        "Unspecified": 1,
        "ranges": 4,
        "\"0-\"": 1,
        "require": 1,
        "knowledge": 1,
        "of": 11,
        "your": 1,
        "resource": 2,
        "length.": 1,
        "In": 1,
        "byte": 1,
        "range": 3,
        "this": 3,
        "course": 1,
        "total": 1,
        "number": 1,
        "bytes.": 1,
        "If": 4,
        "not": 3,
        "`undefined`": 1,
        "returned,": 2,
        "`-1`": 1,
        "unsatisfiable,": 1,
        "`-2`": 1,
        "syntactically": 1,
        "invalid.": 1,
        "has": 2,
        "\"type\"": 1,
        "property": 2,
        "that": 3,
        "(most": 1,
        "commonly,": 1,
        "\"bytes\").": 1,
        "Each": 1,
        "element": 1,
        "object": 1,
        "\"start\"": 1,
        "\"end\"": 1,
        "for": 8,
        "portion": 1,
        "range.": 2,
        "\"combine\"": 1,
        "option": 1,
        "can": 3,
        "set": 1,
        "`true`": 1,
        "overlapping": 1,
        "&": 1,
        "adjacent": 1,
        "will": 3,
        "combined": 1,
        "into": 1,
        "NOTE:": 1,
        "remember": 1,
        "inclusive,": 1,
        "so": 1,
        "example": 2,
        "\"Range:": 1,
        "users=0-3\"": 1,
        "users": 1,
        "available,": 1,
        "3.": 1,
        "{number}": 1,
        "size": 1,
        "{object}": 1,
        "[options]": 1,
        "{boolean}": 1,
        "[options.combine=false]": 1,
        "{number|array}": 1,
        "req.range": 1,
        "range(size,": 1,
        "options)": 1,
        "this.get('Range');": 1,
        "(!range)": 1,
        "return;": 2,
        "parseRange(size,": 1,
        "range,": 1,
        "options);": 1,
        "param": 1,
        "`name`": 1,
        "present": 1,
        "`defaultValue`.": 1,
        "-": 3,
        "Checks": 3,
        "route": 1,
        "placeholders,": 1,
        "ex:": 3,
        "_/user/:id_": 1,
        "body": 2,
        "params,": 2,
        "id=12,": 1,
        "{\"id\":12}": 1,
        "query": 2,
        "?id=12": 1,
        "utilize": 1,
        "bodies,": 1,
        "`req.body`": 1,
        "object.": 2,
        "This": 2,
        "done": 1,
        "by": 2,
        "using": 1,
        "`bodyParser()`": 1,
        "middleware.": 1,
        "{Mixed}": 1,
        "[defaultValue]": 1,
        "req.param": 1,
        "param(name,": 1,
        "defaultValue)": 1,
        "params": 1,
        "this.params": 1,
        "{};": 3,
        "this.body": 1,
        "this.query": 1,
        "args": 2,
        "arguments.length": 1,
        "===": 6,
        "?": 5,
        "'name'": 1,
        ":": 5,
        "'name,": 1,
        "default';": 1,
        "deprecate('req.param('": 1,
        "+": 4,
        "'):": 1,
        "req.params,": 1,
        "req.body,": 1,
        "req.query": 1,
        "(null": 3,
        "!=": 3,
        "params[name]": 1,
        "&&": 3,
        "params.hasOwnProperty(name))": 1,
        "params[name];": 1,
        "body[name])": 1,
        "body[name];": 1,
        "query[name])": 1,
        "query[name];": 1,
        "defaultValue;": 1,
        "incoming": 1,
        "contains": 2,
        "\"Content-Type\"": 1,
        "it": 1,
        "give": 1,
        "mime": 1,
        "`type`.": 1,
        "With": 1,
        "Content-Type:": 1,
        "text/html;": 1,
        "charset=utf-8": 1,
        "req.is('html');": 2,
        "req.is('text/html');": 1,
        "req.is('text/*');": 1,
        "true": 2,
        "Content-Type": 1,
        "req.is('json');": 1,
        "req.is('application/json');": 1,
        "req.is('application/*');": 1,
        "false": 1,
        "types...": 1,
        "{String|false|null}": 1,
        "req.is": 1,
        "is(types)": 1,
        "arr": 2,
        "types;": 1,
        "support": 2,
        "flattened": 1,
        "arguments": 1,
        "(!Array.isArray(types))": 1,
        "Array(arguments.length);": 1,
        "(var": 1,
        "i": 2,
        "0;": 2,
        "<": 2,
        "arr.length;": 1,
        "i++)": 1,
        "arr[i]": 1,
        "arguments[i];": 1,
        "typeis(this,": 1,
        "arr);": 1,
        "protocol": 1,
        "\"http\"": 1,
        "\"https\"": 1,
        "requested": 1,
        "TLS.": 1,
        "\"trust": 4,
        "proxy\"": 4,
        "setting": 3,
        "trusts": 2,
        "socket": 4,
        "address,": 2,
        "\"X-Forwarded-Proto\"": 1,
        "trusted": 3,
        "used": 1,
        "present.": 1,
        "you're": 1,
        "running": 1,
        "behind": 1,
        "reverse": 2,
        "proxy": 6,
        "supplies": 1,
        "https": 1,
        "enabled.": 1,
        "defineGetter(req,": 11,
        "'protocol',": 1,
        "protocol(){": 1,
        "proto": 2,
        "this.connection.encrypted": 1,
        "'https'": 2,
        "'http';": 1,
        "trust": 4,
        "this.app.get('trust": 4,
        "fn');": 4,
        "(!trust(this.connection.remoteAddress,": 1,
        "0))": 2,
        "proto;": 2,
        "Note:": 1,
        "X-Forwarded-Proto": 1,
        "normally": 1,
        "only": 2,
        "ever": 1,
        "value,": 1,
        "but": 1,
        "safe.": 1,
        "this.get('X-Forwarded-Proto')": 1,
        "proto.split(/\\s*,\\s*/)[0];": 1,
        "});": 11,
        "Short-hand": 2,
        "for:": 1,
        "req.protocol": 1,
        "{Boolean}": 4,
        "'secure',": 1,
        "secure(){": 1,
        "this.protocol": 1,
        "'https';": 1,
        "remote": 2,
        "address": 3,
        "from": 1,
        "proxy.": 1,
        "on": 2,
        "unless": 1,
        "set.": 1,
        "'ip',": 1,
        "ip(){": 1,
        "proxyaddr(this,": 1,
        "trust);": 2,
        "set,": 2,
        "addresses": 1,
        "client.": 1,
        "For": 2,
        "were": 2,
        "\"client,": 1,
        "proxy1,": 1,
        "proxy2\"": 1,
        "would": 1,
        "receive": 1,
        "`[\"client\",": 1,
        "\"proxy1\",": 1,
        "\"proxy2\"]`": 1,
        "where": 1,
        "\"proxy2\"": 2,
        "furthest": 1,
        "down-stream": 1,
        "\"proxy1\"": 1,
        "trusted.": 2,
        "{Array}": 2,
        "'ips',": 1,
        "ips()": 1,
        "addrs": 2,
        "proxyaddr.all(this,": 1,
        "order": 1,
        "(to": 1,
        "farthest": 1,
        "->": 1,
        "closest)": 1,
        "remove": 1,
        "addrs.reverse().pop()": 1,
        "subdomains": 2,
        "array.": 1,
        "Subdomains": 1,
        "dot-separated": 1,
        "parts": 2,
        "host": 4,
        "before": 1,
        "main": 1,
        "domain": 3,
        "app.": 1,
        "By": 1,
        "default,": 1,
        "app": 1,
        "assumed": 1,
        "last": 1,
        "two": 1,
        "host.": 1,
        "changed": 1,
        "\"subdomain": 3,
        "offset\".": 1,
        "example,": 1,
        "\"tobi.ferrets.example.com\":": 1,
        "offset\"": 2,
        "req.subdomains": 2,
        "`[\"ferrets\",": 1,
        "\"tobi\"]`.": 1,
        "3,": 1,
        "`[\"tobi\"]`.": 1,
        "'subdomains',": 1,
        "subdomains()": 1,
        "hostname": 1,
        "this.hostname;": 2,
        "(!hostname)": 1,
        "[];": 1,
        "offset": 2,
        "this.app.get('subdomain": 1,
        "offset');": 1,
        "!isIP(hostname)": 1,
        "hostname.split('.').reverse()": 1,
        "[hostname];": 1,
        "subdomains.slice(offset);": 1,
        "`url.parse(req.url).pathname`.": 1,
        "'path',": 1,
        "path()": 1,
        "parse(this).pathname;": 1,
        "\"Host\"": 1,
        "hostname.": 1,
        "\"X-Forwarded-Host\"": 1,
        "'hostname',": 1,
        "hostname(){": 1,
        "this.get('X-Forwarded-Host');": 1,
        "(!host": 1,
        "!trust(this.connection.remoteAddress,": 1,
        "this.get('Host');": 1,
        "(!host)": 1,
        "IPv6": 1,
        "literal": 1,
        "host[0]": 1,
        "'['": 1,
        "host.indexOf(']')": 1,
        "index": 2,
        "host.indexOf(':',": 1,
        "offset);": 1,
        "-1": 1,
        "host.substring(0,": 1,
        "index)": 1,
        "host;": 1,
        "TODO:": 1,
        "change": 1,
        "req.host": 1,
        "next": 1,
        "major": 1,
        "'host',": 1,
        "deprecate.function(function": 1,
        "host(){": 1,
        "},": 1,
        "'req.host:": 1,
        "req.hostname": 1,
        "instead'));": 1,
        "fresh,": 1,
        "aka": 2,
        "Last-Modified": 1,
        "and/or": 1,
        "ETag": 1,
        "still": 1,
        "match.": 1,
        "'fresh',": 1,
        "method": 2,
        "this.method;": 1,
        "res": 1,
        "this.res": 1,
        "status": 2,
        "res.statusCode": 1,
        "GET": 1,
        "HEAD": 1,
        "weak": 1,
        "freshness": 1,
        "validation": 1,
        "('GET'": 1,
        "'HEAD'": 1,
        "method)": 1,
        "false;": 2,
        "2xx": 1,
        "per": 1,
        "rfc2616": 1,
        "14.26": 1,
        "((status": 1,
        ">=": 1,
        "300)": 1,
        "status)": 1,
        "fresh(this.headers,": 1,
        "'etag':": 1,
        "res.get('ETag'),": 1,
        "'last-modified':": 1,
        "res.get('Last-Modified')": 1,
        "})": 1,
        "stale,": 1,
        "\"Last-Modified\"": 1,
        "/": 1,
        "\"ETag\"": 1,
        "changed.": 1,
        "'stale',": 1,
        "stale(){": 1,
        "!this.fresh;": 1,
        "was": 1,
        "_XMLHttpRequest_.": 1,
        "'xhr',": 1,
        "xhr(){": 1,
        "val": 1,
        "this.get('X-Requested-With')": 1,
        "'';": 1,
        "val.toLowerCase()": 1,
        "'xmlhttprequest';": 1,
        "Helper": 1,
        "creating": 1,
        "getter": 3,
        "{Object}": 1,
        "obj": 1,
        "{Function}": 1,
        "defineGetter(obj,": 1,
        "name,": 2,
        "getter)": 1,
        "Object.defineProperty(obj,": 1,
        "configurable:": 1,
        "enumerable:": 1,
        "get:": 1
      },
      "bigrams": {}
    },
    "tokens": {
      "characters": {
        "unigrams": 12212,
        "bigrams": {}
      },
      "words": {
        "unigrams": 1703,
        "bigrams": {}
      }
    },
    "types": {
      "characters": 86,
      "words": 659
    }
  },
  "api": "datums",
  "datumFields": [
    {
      "fieldDBtype": "DatumField",
      "id": "orthography",
      "type": "DatumField",
      "version": "v5.121.19-rc0",
      "labelFieldLinguists": "Orthography",
      "value": "/*!\n * express\n * Copyright(c) 2009-2013 TJ Holowaychuk\n * Copyright(c) 2013 Roman Shtylman\n * Copyright(c) 2014-2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module dependencies.\n * @private\n */\n\nvar accepts = require('accepts');\nvar deprecate = require('depd')('express');\nvar isIP = require('net').isIP;\nvar typeis = require('type-is');\nvar http = require('http');\nvar fresh = require('fresh');\nvar parseRange = require('range-parser');\nvar parse = require('parseurl');\nvar proxyaddr = require('proxy-addr');\n\n/**\n * Request prototype.\n * @public\n */\n\nvar req = Object.create(http.IncomingMessage.prototype)\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = req\n\n/**\n * Return request header.\n *\n * The `Referrer` header field is special-cased,\n * both `Referrer` and `Referer` are interchangeable.\n *\n * Examples:\n *\n *     req.get('Content-Type');\n *     // => \"text/plain\"\n *\n *     req.get('content-type');\n *     // => \"text/plain\"\n *\n *     req.get('Something');\n *     // => undefined\n *\n * Aliased as `req.header()`.\n *\n * @param {String} name\n * @return {String}\n * @public\n */\n\nreq.get =\nreq.header = function header(name) {\n  if (!name) {\n    throw new TypeError('name argument is required to req.get');\n  }\n\n  if (typeof name !== 'string') {\n    throw new TypeError('name must be a string to req.get');\n  }\n\n  var lc = name.toLowerCase();\n\n  switch (lc) {\n    case 'referer':\n    case 'referrer':\n      return this.headers.referrer\n        || this.headers.referer;\n    default:\n      return this.headers[lc];\n  }\n};\n\n/**\n * To do: update docs.\n *\n * Check if the given `type(s)` is acceptable, returning\n * the best match when true, otherwise `undefined`, in which\n * case you should respond with 406 \"Not Acceptable\".\n *\n * The `type` value may be a single MIME type string\n * such as \"application/json\", an extension name\n * such as \"json\", a comma-delimited list such as \"json, html, text/plain\",\n * an argument list such as `\"json\", \"html\", \"text/plain\"`,\n * or an array `[\"json\", \"html\", \"text/plain\"]`. When a list\n * or array is given, the _best_ match, if any is returned.\n *\n * Examples:\n *\n *     // Accept: text/html\n *     req.accepts('html');\n *     // => \"html\"\n *\n *     // Accept: text/*, application/json\n *     req.accepts('html');\n *     // => \"html\"\n *     req.accepts('text/html');\n *     // => \"text/html\"\n *     req.accepts('json, text');\n *     // => \"json\"\n *     req.accepts('application/json');\n *     // => \"application/json\"\n *\n *     // Accept: text/*, application/json\n *     req.accepts('image/png');\n *     req.accepts('png');\n *     // => undefined\n *\n *     // Accept: text/*;q=.5, application/json\n *     req.accepts(['html', 'json']);\n *     req.accepts('html', 'json');\n *     req.accepts('html, json');\n *     // => \"json\"\n *\n * @param {String|Array} type(s)\n * @return {String|Array|Boolean}\n * @public\n */\n\nreq.accepts = function(){\n  var accept = accepts(this);\n  return accept.types.apply(accept, arguments);\n};\n\n/**\n * Check if the given `encoding`s are accepted.\n *\n * @param {String} ...encoding\n * @return {String|Array}\n * @public\n */\n\nreq.acceptsEncodings = function(){\n  var accept = accepts(this);\n  return accept.encodings.apply(accept, arguments);\n};\n\nreq.acceptsEncoding = deprecate.function(req.acceptsEncodings,\n  'req.acceptsEncoding: Use acceptsEncodings instead');\n\n/**\n * Check if the given `charset`s are acceptable,\n * otherwise you should respond with 406 \"Not Acceptable\".\n *\n * @param {String} ...charset\n * @return {String|Array}\n * @public\n */\n\nreq.acceptsCharsets = function(){\n  var accept = accepts(this);\n  return accept.charsets.apply(accept, arguments);\n};\n\nreq.acceptsCharset = deprecate.function(req.acceptsCharsets,\n  'req.acceptsCharset: Use acceptsCharsets instead');\n\n/**\n * Check if the given `lang`s are acceptable,\n * otherwise you should respond with 406 \"Not Acceptable\".\n *\n * @param {String} ...lang\n * @return {String|Array}\n * @public\n */\n\nreq.acceptsLanguages = function(){\n  var accept = accepts(this);\n  return accept.languages.apply(accept, arguments);\n};\n\nreq.acceptsLanguage = deprecate.function(req.acceptsLanguages,\n  'req.acceptsLanguage: Use acceptsLanguages instead');\n\n/**\n * Parse Range header field, capping to the given `size`.\n *\n * Unspecified ranges such as \"0-\" require knowledge of your resource length. In\n * the case of a byte range this is of course the total number of bytes. If the\n * Range header field is not given `undefined` is returned, `-1` when unsatisfiable,\n * and `-2` when syntactically invalid.\n *\n * When ranges are returned, the array has a \"type\" property which is the type of\n * range that is required (most commonly, \"bytes\"). Each array element is an object\n * with a \"start\" and \"end\" property for the portion of the range.\n *\n * The \"combine\" option can be set to `true` and overlapping & adjacent ranges\n * will be combined into a single range.\n *\n * NOTE: remember that ranges are inclusive, so for example \"Range: users=0-3\"\n * should respond with 4 users when available, not 3.\n *\n * @param {number} size\n * @param {object} [options]\n * @param {boolean} [options.combine=false]\n * @return {number|array}\n * @public\n */\n\nreq.range = function range(size, options) {\n  var range = this.get('Range');\n  if (!range) return;\n  return parseRange(size, range, options);\n};\n\n/**\n * Return the value of param `name` when present or `defaultValue`.\n *\n *  - Checks route placeholders, ex: _/user/:id_\n *  - Checks body params, ex: id=12, {\"id\":12}\n *  - Checks query string params, ex: ?id=12\n *\n * To utilize request bodies, `req.body`\n * should be an object. This can be done by using\n * the `bodyParser()` middleware.\n *\n * @param {String} name\n * @param {Mixed} [defaultValue]\n * @return {String}\n * @public\n */\n\nreq.param = function param(name, defaultValue) {\n  var params = this.params || {};\n  var body = this.body || {};\n  var query = this.query || {};\n\n  var args = arguments.length === 1\n    ? 'name'\n    : 'name, default';\n  deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead');\n\n  if (null != params[name] && params.hasOwnProperty(name)) return params[name];\n  if (null != body[name]) return body[name];\n  if (null != query[name]) return query[name];\n\n  return defaultValue;\n};\n\n/**\n * Check if the incoming request contains the \"Content-Type\"\n * header field, and it contains the give mime `type`.\n *\n * Examples:\n *\n *      // With Content-Type: text/html; charset=utf-8\n *      req.is('html');\n *      req.is('text/html');\n *      req.is('text/*');\n *      // => true\n *\n *      // When Content-Type is application/json\n *      req.is('json');\n *      req.is('application/json');\n *      req.is('application/*');\n *      // => true\n *\n *      req.is('html');\n *      // => false\n *\n * @param {String|Array} types...\n * @return {String|false|null}\n * @public\n */\n\nreq.is = function is(types) {\n  var arr = types;\n\n  // support flattened arguments\n  if (!Array.isArray(types)) {\n    arr = new Array(arguments.length);\n    for (var i = 0; i < arr.length; i++) {\n      arr[i] = arguments[i];\n    }\n  }\n\n  return typeis(this, arr);\n};\n\n/**\n * Return the protocol string \"http\" or \"https\"\n * when requested with TLS. When the \"trust proxy\"\n * setting trusts the socket address, the\n * \"X-Forwarded-Proto\" header field will be trusted\n * and used if present.\n *\n * If you're running behind a reverse proxy that\n * supplies https for you this may be enabled.\n *\n * @return {String}\n * @public\n */\n\ndefineGetter(req, 'protocol', function protocol(){\n  var proto = this.connection.encrypted\n    ? 'https'\n    : 'http';\n  var trust = this.app.get('trust proxy fn');\n\n  if (!trust(this.connection.remoteAddress, 0)) {\n    return proto;\n  }\n\n  // Note: X-Forwarded-Proto is normally only ever a\n  //       single value, but this is to be safe.\n  proto = this.get('X-Forwarded-Proto') || proto;\n  return proto.split(/\\s*,\\s*/)[0];\n});\n\n/**\n * Short-hand for:\n *\n *    req.protocol === 'https'\n *\n * @return {Boolean}\n * @public\n */\n\ndefineGetter(req, 'secure', function secure(){\n  return this.protocol === 'https';\n});\n\n/**\n * Return the remote address from the trusted proxy.\n *\n * The is the remote address on the socket unless\n * \"trust proxy\" is set.\n *\n * @return {String}\n * @public\n */\n\ndefineGetter(req, 'ip', function ip(){\n  var trust = this.app.get('trust proxy fn');\n  return proxyaddr(this, trust);\n});\n\n/**\n * When \"trust proxy\" is set, trusted proxy addresses + client.\n *\n * For example if the value were \"client, proxy1, proxy2\"\n * you would receive the array `[\"client\", \"proxy1\", \"proxy2\"]`\n * where \"proxy2\" is the furthest down-stream and \"proxy1\" and\n * \"proxy2\" were trusted.\n *\n * @return {Array}\n * @public\n */\n\ndefineGetter(req, 'ips', function ips() {\n  var trust = this.app.get('trust proxy fn');\n  var addrs = proxyaddr.all(this, trust);\n\n  // reverse the order (to farthest -> closest)\n  // and remove socket address\n  addrs.reverse().pop()\n\n  return addrs\n});\n\n/**\n * Return subdomains as an array.\n *\n * Subdomains are the dot-separated parts of the host before the main domain of\n * the app. By default, the domain of the app is assumed to be the last two\n * parts of the host. This can be changed by setting \"subdomain offset\".\n *\n * For example, if the domain is \"tobi.ferrets.example.com\":\n * If \"subdomain offset\" is not set, req.subdomains is `[\"ferrets\", \"tobi\"]`.\n * If \"subdomain offset\" is 3, req.subdomains is `[\"tobi\"]`.\n *\n * @return {Array}\n * @public\n */\n\ndefineGetter(req, 'subdomains', function subdomains() {\n  var hostname = this.hostname;\n\n  if (!hostname) return [];\n\n  var offset = this.app.get('subdomain offset');\n  var subdomains = !isIP(hostname)\n    ? hostname.split('.').reverse()\n    : [hostname];\n\n  return subdomains.slice(offset);\n});\n\n/**\n * Short-hand for `url.parse(req.url).pathname`.\n *\n * @return {String}\n * @public\n */\n\ndefineGetter(req, 'path', function path() {\n  return parse(this).pathname;\n});\n\n/**\n * Parse the \"Host\" header field to a hostname.\n *\n * When the \"trust proxy\" setting trusts the socket\n * address, the \"X-Forwarded-Host\" header field will\n * be trusted.\n *\n * @return {String}\n * @public\n */\n\ndefineGetter(req, 'hostname', function hostname(){\n  var trust = this.app.get('trust proxy fn');\n  var host = this.get('X-Forwarded-Host');\n\n  if (!host || !trust(this.connection.remoteAddress, 0)) {\n    host = this.get('Host');\n  }\n\n  if (!host) return;\n\n  // IPv6 literal support\n  var offset = host[0] === '['\n    ? host.indexOf(']') + 1\n    : 0;\n  var index = host.indexOf(':', offset);\n\n  return index !== -1\n    ? host.substring(0, index)\n    : host;\n});\n\n// TODO: change req.host to return host in next major\n\ndefineGetter(req, 'host', deprecate.function(function host(){\n  return this.hostname;\n}, 'req.host: Use req.hostname instead'));\n\n/**\n * Check if the request is fresh, aka\n * Last-Modified and/or the ETag\n * still match.\n *\n * @return {Boolean}\n * @public\n */\n\ndefineGetter(req, 'fresh', function(){\n  var method = this.method;\n  var res = this.res\n  var status = res.statusCode\n\n  // GET or HEAD for weak freshness validation only\n  if ('GET' !== method && 'HEAD' !== method) return false;\n\n  // 2xx or 304 as per rfc2616 14.26\n  if ((status >= 200 && status < 300) || 304 === status) {\n    return fresh(this.headers, {\n      'etag': res.get('ETag'),\n      'last-modified': res.get('Last-Modified')\n    })\n  }\n\n  return false;\n});\n\n/**\n * Check if the request is stale, aka\n * \"Last-Modified\" and / or the \"ETag\" for the\n * resource has changed.\n *\n * @return {Boolean}\n * @public\n */\n\ndefineGetter(req, 'stale', function stale(){\n  return !this.fresh;\n});\n\n/**\n * Check if the request was an _XMLHttpRequest_.\n *\n * @return {Boolean}\n * @public\n */\n\ndefineGetter(req, 'xhr', function xhr(){\n  var val = this.get('X-Requested-With') || '';\n  return val.toLowerCase() === 'xmlhttprequest';\n});\n\n/**\n * Helper function for creating a getter on an object.\n *\n * @param {Object} obj\n * @param {String} name\n * @param {Function} getter\n * @private\n */\nfunction defineGetter(obj, name, getter) {\n  Object.defineProperty(obj, name, {\n    configurable: true,\n    enumerable: true,\n    get: getter\n  });\n}",
      "label": "orthography"
    }
  ],
  "audioVideo": [],
  "comments": []
}