UNPKG

rollup-plugin-import-meta-resolve

Version:
136 lines 17.2 kB
import { lstatSync, realpathSync } from "fs"; import { extname } from "path"; import { fileURLToPath, pathToFileURL } from "url"; import { moduleResolve } from "import-meta-resolve"; /** * A resolver plugin using the import.meta.resolve algorithm provided by * Node.js. * * This plugin is (more-or-less) a drop-in replacement for the * `@rollup/plugin-node-resolve` plugin. * * There are a few differences between this plugin and the Node.js resolver: * * 1. We allow importing modules without an extension. This is a common * practice in Node.js, but it is not allowed in ESM. We allow it here to * maintain compatibility with a large number of modules. * 2. We allow importing directories. This is not allowed in ESM, but it is * common in Node.js. We allow it here to maintain compatibility with a * large number of modules. * 3. We only allow `import` conditions. This is to ensure that ESM-modules are * consumed first. This doesn't imply that CommonJS modules are not consumed * as `default` conditions and packages without `export` conditions may * still resolve to a CommonJS module. * * You can use `strict` to disable (1) and (2) (which is recommended), but * you may need to fix some modules that are not compliant with the ESM spec. * * This plugin is restrictive by default (e.g. no module roots, no `require` * exports, etc.). This ensures projects are up-to-date and compliant across the * board. If you have custom file tree requirements, it's recommended to use * symlinked directories. */ export default function importMetaResolve(options = {}) { const settings = { strict: options.strict ?? false, allowJson: options.allowJson ?? false, allowNode: options.allowNode ?? false, }; const conditions = new Set(["import"]); const extensions = [".mjs", ".js"]; function resolve(source, importer) { try { return fileURLToPath(moduleResolve(source, pathToFileURL(importer), new Set(conditions), true)); } catch (error) { if (lstatSync(importer).isSymbolicLink()) { return resolve(source, realpathSync(importer)); } else { throw error; } } } function handler(source, importer) { try { // Try to resolve an ESM-compliant import. return resolve(source, importer); } catch (error) { if (settings.strict) { return; } // The module is probably broken, but perhaps another resolver can handle // it. if (!isUnsupportedDirImportError(error) && !isUnsupportedEsmImportError(error)) { return; } // At this point, we know the import is not ESM-compliant but may use a // legacy heuristics. In Node.js, this is // // We allow the following heuristics (in order): // // 1. If the import has no extension, we try to guess it. // 2. If the import is a directory, we try to resolve the import with // `index` appended and start over. // if (extname(source) === "") { for (const extension of extensions) { try { const resolved = resolve(`${source}${extension}`, importer); if (resolved !== undefined) { return resolved; } } catch { } } if (settings.allowJson) { try { const resolved = resolve(`${source}.json`, importer); if (resolved !== undefined) { return resolved; } } catch { } } if (settings.allowNode) { try { const resolved = resolve(`${source}.node`, importer); if (resolved !== undefined) { return resolved; } } catch { } } } if (isUnsupportedDirImportError(error)) { return handler(`${source}/index`, importer); } } return undefined; } return { name: "import-meta-resolve", resolveId: { order: "post", handler(source, importer) { // If there is no importer, leave it to the next resolver. if (importer === undefined) { return; } return handler(source, importer); }, }, }; } function isUnsupportedDirImportError(error) { return isErrNoError(error) && error.code === "ERR_UNSUPPORTED_DIR_IMPORT"; } function isUnsupportedEsmImportError(error) { return isErrNoError(error) && error.code === "ERR_UNSUPPORTED_ESM_IMPORT"; } function isErrNoError(error) { return error instanceof Object && "code" in error; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbHVwLXBsdWdpbi1pbXBvcnQtbWV0YS1yZXNvbHZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicm9sbHVwLXBsdWdpbi1pbXBvcnQtbWV0YS1yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFFakQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBZ0NsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxpQkFBaUIsQ0FDdkMsVUFBbUQsRUFBRTtJQUVyRCxNQUFNLFFBQVEsR0FBRztRQUNmLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUs7UUFDL0IsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSztRQUNyQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxLQUFLO0tBQ0csQ0FBQztJQUUzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkMsU0FBUyxPQUFPLENBQUMsTUFBYyxFQUFFLFFBQWdCO1FBQy9DLElBQUksQ0FBQztZQUNILE9BQU8sYUFBYSxDQUNsQixhQUFhLENBQ1gsTUFBTSxFQUNOLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFDdkIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQ25CLElBQUksQ0FDTCxDQUNGLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElB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Q0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUFDLEtBQWM7SUFDakQsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyw0QkFBNEIsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FBQyxLQUFjO0lBQ2pELE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssNEJBQTRCLENBQUM7QUFDNUUsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsT0FBTyxLQUFLLFlBQVksTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bHN0YXRTeW5jLCByZWFscGF0aFN5bmN9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHtleHRuYW1lfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRoLCBwYXRoVG9GaWxlVVJMfSBmcm9tIFwidXJsXCI7XG5cbmltcG9ydCB7bW9kdWxlUmVzb2x2ZX0gZnJvbSBcImltcG9ydC1tZXRhLXJlc29sdmVcIjtcbmltcG9ydCB0eXBlIHtQbHVnaW59IGZyb20gXCJyb2xsdXBcIjtcblxuaW50ZXJmYWNlIEltcG9ydE1ldGFSZXNvbHZlUGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHNob3VsZCBzdHJpY3RseSBmb2xsb3cgTm9kZSByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBVc3VhbGx5IHlvdSB3aWxsIGhhdmUgc29tZSBkZXZpYW50IG1vZHVsZXMgdGhhdCBkbyB1c2Ugc29tZSBsZWdhY3lcbiAgICogcmVzb2x1dGlvbiBhbGdvcml0aG0uIFNpbmNlIHRoaXMgaXMgZ2VuZXJhbGx5IHRoZSBjYXNlLCB0aGlzIGlzIHNldCB0b1xuICAgKiBmYWxzZSwgYnV0IGlmIHlvdSBjYW4gZ2V0IGF3YXkgd2l0aCB0dXJuaW5nIHRoaXMgb24sIHRoZW4ga2VlcCBpdCBvbiBzaW5jZVxuICAgKiB0aGF0IGltcGxpZXMgYWxsIHlvdXIgbW9kdWxlcyBhcmUgY29tcGxpYW50IHdpdGggTm9kZSByZXNvbHV0aW9uIVxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIGBmYWxzZWBcbiAgICovXG4gIHN0cmljdDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgd2Ugc2hvdWxkIGFsbG93IGltcG9ydGluZyBKU09OIGZpbGVzLlxuICAgKlxuICAgKiBXZSBkZWZhdWx0IHRvIGBmYWxzZWAgdG8gZm9sbG93IHRoZSBFU00gc3BlYy4gT25jZSBuYXRpdmUgSlNPTiBtb2R1bGVzIGFyZVxuICAgKiBzdXBwb3J0ZWQsIHRoaXMgbWF5IGNoYW5nZS5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgZmFsc2VgXG4gICAqL1xuICBhbGxvd0pzb246IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlIHNob3VsZCBhbGxvdyBpbXBvcnRpbmcgYC5ub2RlYCBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgZmFsc2VgXG4gICAqL1xuICBhbGxvd05vZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSByZXNvbHZlciBwbHVnaW4gdXNpbmcgdGhlIGltcG9ydC5tZXRhLnJlc29sdmUgYWxnb3JpdGhtIHByb3ZpZGVkIGJ5XG4gKiBOb2RlLmpzLlxuICpcbiAqIFRoaXMgcGx1Z2luIGlzIChtb3JlLW9yLWxlc3MpIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlXG4gKiBgQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlYCBwbHVnaW4uXG4gKlxuICogVGhlcmUgYXJlIGEgZmV3IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyBwbHVnaW4gYW5kIHRoZSBOb2RlLmpzIHJlc29sdmVyOlxuICpcbiAqICAxLiBXZSBhbGxvdyBpbXBvcnRpbmcgbW9kdWxlcyB3aXRob3V0IGFuIGV4dGVuc2lvbi4gVGhpcyBpcyBhIGNvbW1vblxuICogICAgIHByYWN0aWNlIGluIE5vZGUuanMsIGJ1dCBpdCBpcyBub3QgYWxsb3dlZCBpbiBFU00uIFdlIGFsbG93IGl0IGhlcmUgdG9cbiAqICAgICBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggYSBsYXJnZSBudW1iZXIgb2YgbW9kdWxlcy5cbiAqICAyLiBXZSBhbGxvdyBpbXBvcnRpbmcgZGlyZWN0b3JpZXMuIFRoaXMgaXMgbm90IGFsbG93ZWQgaW4gRVNNLCBidXQgaXQgaXNcbiAqICAgICBjb21tb24gaW4gTm9kZS5qcy4gV2UgYWxsb3cgaXQgaGVyZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggYVxuICogICAgIGxhcmdlIG51bWJlciBvZiBtb2R1bGVzLlxuICogIDMuIFdlIG9ubHkgYWxsb3cgYGltcG9ydGAgY29uZGl0aW9ucy4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBFU00tbW9kdWxlcyBhcmVcbiAqICAgICBjb25zdW1lZCBmaXJzdC4gVGhpcyBkb2Vzbid0IGltcGx5IHRoYXQgQ29tbW9uSlMgbW9kdWxlcyBhcmUgbm90IGNvbnN1bWVkXG4gKiAgICAgYXMgYGRlZmF1bHRgIGNvbmRpdGlvbnMgYW5kIHBhY2thZ2VzIHdpdGhvdXQgYGV4cG9ydGAgY29uZGl0aW9ucyBtYXlcbiAqICAgICBzdGlsbCByZXNvbHZlIHRvIGEgQ29tbW9uSlMgbW9kdWxlLlxuICpcbiAqIFlvdSBjYW4gdXNlIGBzdHJpY3RgIHRvIGRpc2FibGUgKDEpIGFuZCAoMikgKHdoaWNoIGlzIHJlY29tbWVuZGVkKSwgYnV0XG4gKiB5b3UgbWF5IG5lZWQgdG8gZml4IHNvbWUgbW9kdWxlcyB0aGF0IGFyZSBub3QgY29tcGxpYW50IHdpdGggdGhlIEVTTSBzcGVjLlxuICpcbiAqIFRoaXMgcGx1Z2luIGlzIHJlc3RyaWN0aXZlIGJ5IGRlZmF1bHQgKGUuZy4gbm8gbW9kdWxlIHJvb3RzLCBubyBgcmVxdWlyZWBcbiAqIGV4cG9ydHMsIGV0Yy4pLiBUaGlzIGVuc3VyZXMgcHJvamVjdHMgYXJlIHVwLXRvLWRhdGUgYW5kIGNvbXBsaWFudCBhY3Jvc3MgdGhlXG4gKiBib2FyZC4gSWYgeW91IGhhdmUgY3VzdG9tIGZpbGUgdHJlZSByZXF1aXJlbWVudHMsIGl0J3MgcmVjb21tZW5kZWQgdG8gdXNlXG4gKiBzeW1saW5rZWQgZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGltcG9ydE1ldGFSZXNvbHZlKFxuICBvcHRpb25zOiBQYXJ0aWFsPEltcG9ydE1ldGFSZXNvbHZlUGx1Z2luT3B0aW9ucz4gPSB7fSxcbik6IFBsdWdpbiB7XG4gIGNvbnN0IHNldHRpbmdzID0ge1xuICAgIHN0cmljdDogb3B0aW9ucy5zdHJpY3QgPz8gZmFsc2UsXG4gICAgYWxsb3dKc29uOiBvcHRpb25zLmFsbG93SnNvbiA/PyBmYWxzZSxcbiAgICBhbGxvd05vZGU6IG9wdGlvbnMuYWxsb3dOb2RlID8/IGZhbHNlLFxuICB9IHNhdGlzZmllcyBJbXBvcnRNZXRhUmVzb2x2ZVBsdWdpbk9wdGlvbnM7XG5cbiAgY29uc3QgY29uZGl0aW9ucyA9IG5ldyBTZXQoW1wiaW1wb3J0XCJdKTtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFtcIi5tanNcIiwgXCIuanNcIl07XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZShzb3VyY2U6IHN0cmluZywgaW1wb3J0ZXI6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZmlsZVVSTFRvUGF0aChcbiAgICAgICAgbW9kdWxlUmVzb2x2ZShcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgcGF0aFRvRmlsZVVSTChpbXBvcnRlciksXG4gICAgICAgICAgbmV3IFNldChjb25kaXRpb25zKSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGxzdGF0U3luYyhpbXBvcnRlcikuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShzb3VyY2UsIHJlYWxwYXRoU3luYyhpbXBvcnRlcikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlcihzb3VyY2U6IHN0cmluZywgaW1wb3J0ZXI6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gcmVzb2x2ZSBhbiBFU00tY29tcGxpYW50IGltcG9ydC5cbiAgICAgIHJldHVybiByZXNvbHZlKHNvdXJjZSwgaW1wb3J0ZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoc2V0dGluZ3Muc3RyaWN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG1vZHVsZSBpcyBwcm9iYWJseSBicm9rZW4sIGJ1dCBwZXJoYXBzIGFub3RoZXIgcmVzb2x2ZXIgY2FuIGhhbmRsZVxuICAgICAgLy8gaXQuXG4gICAgICBpZiAoXG4gICAgICAgICFpc1Vuc3VwcG9ydGVkRGlySW1wb3J0RXJyb3IoZXJyb3IpICYmXG4gICAgICAgICFpc1Vuc3VwcG9ydGVkRXNtSW1wb3J0RXJyb3IoZXJyb3IpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoZSBpbXBvcnQgaXMgbm90IEVTTS1jb21wbGlhbnQgYnV0IG1heSB1c2UgYVxuICAgICAgLy8gbGVnYWN5IGhldXJpc3RpY3MuIEluIE5vZGUuanMsIHRoaXMgaXNcbiAgICAgIC8vXG4gICAgICAvLyBXZSBhbGxvdyB0aGUgZm9sbG93aW5nIGhldXJpc3RpY3MgKGluIG9yZGVyKTpcbiAgICAgIC8vXG4gICAgICAvLyAgMS4gSWYgdGhlIGltcG9ydCBoYXMgbm8gZXh0ZW5zaW9uLCB3ZSB0cnkgdG8gZ3Vlc3MgaXQuXG4gICAgICAvLyAgMi4gSWYgdGhlIGltcG9ydCBpcyBhIGRpcmVjdG9yeSwgd2UgdHJ5IHRvIHJlc29sdmUgdGhlIGltcG9ydCB3aXRoXG4gICAgICAvLyAgICAgYGluZGV4YCBhcHBlbmRlZCBhbmQgc3RhcnQgb3Zlci5cbiAgICAgIC8vXG4gICAgICBpZiAoZXh0bmFtZShzb3VyY2UpID09PSBcIlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGAke3NvdXJjZX0ke2V4dGVuc2lvbn1gLCBpbXBvcnRlcik7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5hbGxvd0pzb24pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGAke3NvdXJjZX0uanNvbmAsIGltcG9ydGVyKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLmFsbG93Tm9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUoYCR7c291cmNlfS5ub2RlYCwgaW1wb3J0ZXIpO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzVW5zdXBwb3J0ZWREaXJJbXBvcnRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIoYCR7c291cmNlfS9pbmRleGAsIGltcG9ydGVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJpbXBvcnQtbWV0YS1yZXNvbHZlXCIsXG4gICAgcmVzb2x2ZUlkOiB7XG4gICAgICBvcmRlcjogXCJwb3N0XCIsXG4gICAgICBoYW5kbGVyKHNvdXJjZSwgaW1wb3J0ZXIpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gaW1wb3J0ZXIsIGxlYXZlIGl0IHRvIHRoZSBuZXh0IHJlc29sdmVyLlxuICAgICAgICBpZiAoaW1wb3J0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlcihzb3VyY2UsIGltcG9ydGVyKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNVbnN1cHBvcnRlZERpckltcG9ydEVycm9yKGVycm9yOiB1bmtub3duKSB7XG4gIHJldHVybiBpc0Vyck5vRXJyb3IoZXJyb3IpICYmIGVycm9yLmNvZGUgPT09IFwiRVJSX1VOU1VQUE9SVEVEX0RJUl9JTVBPUlRcIjtcbn1cblxuZnVuY3Rpb24gaXNVbnN1cHBvcnRlZEVzbUltcG9ydEVycm9yKGVycm9yOiB1bmtub3duKSB7XG4gIHJldHVybiBpc0Vyck5vRXJyb3IoZXJyb3IpICYmIGVycm9yLmNvZGUgPT09IFwiRVJSX1VOU1VQUE9SVEVEX0VTTV9JTVBPUlRcIjtcbn1cblxuZnVuY3Rpb24gaXNFcnJOb0Vycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMge2NvZGU6IHN0cmluZ30ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBPYmplY3QgJiYgXCJjb2RlXCIgaW4gZXJyb3I7XG59XG4iXX0=