Index: node_modules/infer-owner/LICENSE
===================================================================
--- node_modules/infer-owner/LICENSE	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/infer-owner/LICENSE	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) npm, Inc. and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: node_modules/infer-owner/README.md
===================================================================
--- node_modules/infer-owner/README.md	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/infer-owner/README.md	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,41 @@
+# infer-owner
+
+Infer the owner of a path based on the owner of its nearest existing parent
+
+## USAGE
+
+```js
+const inferOwner = require('infer-owner')
+
+inferOwner('/some/cache/folder/file').then(owner => {
+  // owner is {uid, gid} that should be attached to
+  // the /some/cache/folder/file, based on ownership
+  // of /some/cache/folder, /some/cache, /some, or /,
+  // whichever is the first to exist
+})
+
+// same, but not async
+const owner = inferOwner.sync('/some/cache/folder/file')
+
+// results are cached!  to reset the cache (eg, to change
+// permissions for whatever reason), do this:
+inferOwner.clearCache()
+```
+
+This module endeavors to be as performant as possible.  Parallel requests
+for ownership of the same path will only stat the directories one time.
+
+## API
+
+* `inferOwner(path) -> Promise<{ uid, gid }>`
+
+    If the path exists, return its uid and gid.  If it does not, look to
+    its parent, then its grandparent, and so on.
+
+* `inferOwner(path) -> { uid, gid }`
+
+    Sync form of `inferOwner(path)`.
+
+* `inferOwner.clearCache()`
+
+    Delete all cached ownership information and in-flight tracking.
Index: node_modules/infer-owner/index.js
===================================================================
--- node_modules/infer-owner/index.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/infer-owner/index.js	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,71 @@
+const cache = new Map()
+const fs = require('fs')
+const { dirname, resolve } = require('path')
+
+
+const lstat = path => new Promise((res, rej) =>
+  fs.lstat(path, (er, st) => er ? rej(er) : res(st)))
+
+const inferOwner = path => {
+  path = resolve(path)
+  if (cache.has(path))
+    return Promise.resolve(cache.get(path))
+
+  const statThen = st => {
+    const { uid, gid } = st
+    cache.set(path, { uid, gid })
+    return { uid, gid }
+  }
+  const parent = dirname(path)
+  const parentTrap = parent === path ? null : er => {
+    return inferOwner(parent).then((owner) => {
+      cache.set(path, owner)
+      return owner
+    })
+  }
+  return lstat(path).then(statThen, parentTrap)
+}
+
+const inferOwnerSync = path => {
+  path = resolve(path)
+  if (cache.has(path))
+    return cache.get(path)
+
+  const parent = dirname(path)
+
+  // avoid obscuring call site by re-throwing
+  // "catch" the error by returning from a finally,
+  // only if we're not at the root, and the parent call works.
+  let threw = true
+  try {
+    const st = fs.lstatSync(path)
+    threw = false
+    const { uid, gid } = st
+    cache.set(path, { uid, gid })
+    return { uid, gid }
+  } finally {
+    if (threw && parent !== path) {
+      const owner = inferOwnerSync(parent)
+      cache.set(path, owner)
+      return owner // eslint-disable-line no-unsafe-finally
+    }
+  }
+}
+
+const inflight = new Map()
+module.exports = path => {
+  path = resolve(path)
+  if (inflight.has(path))
+    return Promise.resolve(inflight.get(path))
+  const p = inferOwner(path).then(owner => {
+    inflight.delete(path)
+    return owner
+  })
+  inflight.set(path, p)
+  return p
+}
+module.exports.sync = inferOwnerSync
+module.exports.clearCache = () => {
+  cache.clear()
+  inflight.clear()
+}
Index: node_modules/infer-owner/package.json
===================================================================
--- node_modules/infer-owner/package.json	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
+++ node_modules/infer-owner/package.json	(revision 81bc7da776d8cda42939ef4ab350c88d13b4941f)
@@ -0,0 +1,26 @@
+{
+  "name": "infer-owner",
+  "version": "1.0.4",
+  "description": "Infer the owner of a path based on the owner of its nearest existing parent",
+  "author": "Isaac Z. Schlueter <i@izs.me> (https://izs.me)",
+  "license": "ISC",
+  "scripts": {
+    "test": "tap -J test/*.js --100",
+    "snap": "TAP_SNAPSHOT=1 tap -J test/*.js --100",
+    "preversion": "npm test",
+    "postversion": "npm publish",
+    "postpublish": "git push origin --follow-tags"
+  },
+  "devDependencies": {
+    "mutate-fs": "^2.1.1",
+    "tap": "^12.4.2"
+  },
+  "main": "index.js",
+  "repository": "https://github.com/npm/infer-owner",
+  "publishConfig": {
+    "access": "public"
+  },
+  "files": [
+    "index.js"
+  ]
+}
