UNPKG

@financialforcedev/orizuru-auth

Version:

Salesforce authentication for Heroku Node applications.

102 lines 13.8 kB
"use strict"; /* * Copyright (c) 2019, FinancialForce.com, inc * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the FinancialForce.com, inc nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ Object.defineProperty(exports, "__esModule", { value: true }); const cache_1 = require("../client/cache"); const identity_1 = require("../client/salesforce/identity"); const environment_1 = require("../client/validator/environment"); /** * Returns a function that can obtain a token for the passed user. * * @param env The auth environment parameters. * @returns A function that retrieves the user credentials. */ function getToken(env) { const validatedEnvironment = environment_1.validate(env); return async function getUserCredentials(params, opts) { try { validateUser(params.user); // The TokenGrantorParams interface excludes the grant_type so that it // doesn't have to be set by the caller. Make sure it is set here. const internalParams = Object.assign({}, params); internalParams.grantType = 'urn:ietf:params:oauth:grant-type:jwt-bearer'; const authorizationGrant = await obtainGrant(validatedEnvironment, internalParams, opts); return convertGrantToCredentials(authorizationGrant); } catch (error) { throw new Error(`Failed to obtain grant for user${error.message}.`); } }; } exports.getToken = getToken; /** * Validates that the user contains the correct information. * @param user The user to validate. */ function validateUser(user) { if (!user) { throw new Error('. Caused by: Missing required object parameter: user'); } if (user.username == null) { throw new Error('. Caused by: Missing required string parameter: user[username]'); } if (!user.username.length) { throw new Error('. Caused by: Invalid parameter: user[username] cannot be empty'); } } /** * Obtains a grant for the given user using the OpenID client. * @param env The auth environment parameters. * @param params The parameters required for the JWT grant type. * @param [opts] The grant options to be used. * @returns The access token response. */ async function obtainGrant(env, params, opts) { try { const client = await cache_1.findOrCreateClient(env); return await client.grant(params, opts); } catch (error) { throw new Error(` (${params.user.username}). Caused by: ${error.message}`); } } /** * Converts the access token response to a grant that can be used in tandem with * other NPM modules such as [JSforce])https://github.com/jsforce/jsforce). * @param token - The access token response. * @returns The user credentials. */ function convertGrantToCredentials(token) { if (identity_1.isSalesforceAccessTokenResponse(token)) { return { accessToken: token.access_token, instanceUrl: token.instance_url, userInfo: token.userInfo }; } return { accessToken: token.access_token }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW5kZXgvZ3JhbnQvZ3JhbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7O0FBT0gsMkNBQXFEO0FBQ3JELDREQUEwRjtBQUMxRixpRUFBMkQ7QUFxQjNEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLEdBQWdCO0lBRXhDLE1BQU0sb0JBQW9CLEdBQUcsc0JBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUzQyxPQUFPLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxNQUE4QixFQUFFLElBQW1CO1FBRTNGLElBQUk7WUFFSCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTFCLHNFQUFzRTtZQUN0RSxrRUFBa0U7WUFDbEUsTUFBTSxjQUFjLEdBQTRCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFFLGNBQWMsQ0FBQyxTQUFTLEdBQUcsNkNBQTZDLENBQUM7WUFFekUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxjQUFnQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNHLE9BQU8seUJBQXlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUVyRDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDcEU7SUFFRixDQUFDLENBQUM7QUFFSCxDQUFDO0FBeEJELDRCQXdCQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLElBQVU7SUFFL0IsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUN4RTtJQUVELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0tBQ2xGO0lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztLQUNsRjtBQUVGLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQWdCLEVBQUUsTUFBc0IsRUFBRSxJQUFtQjtJQUV2RixJQUFJO1FBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSwwQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QyxPQUFPLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FFeEM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsaUJBQWlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQzNFO0FBRUYsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxLQUEwQjtJQUU1RCxJQUFJLDBDQUErQixDQUFDLEtBQUssQ0FBQyxFQUFFO1FBRTNDLE9BQU87WUFDTixXQUFXLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDL0IsV0FBVyxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQy9CLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUN4QixDQUFDO0tBRUY7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUU1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSwgRmluYW5jaWFsRm9yY2UuY29tLCBpbmNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbiAqICAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEZpbmFuY2lhbEZvcmNlLmNvbSwgaW5jIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiAgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xuICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMXG4gKiAgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTXG4gKiAgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLyoqXG4gKiBAbW9kdWxlIGdyYW50L2dyYW50XG4gKi9cblxuaW1wb3J0IHsgQWNjZXNzVG9rZW5SZXNwb25zZSwgRW52aXJvbm1lbnQsIEdyYW50T3B0aW9ucywgSnd0R3JhbnRQYXJhbXMsIFVzZXIsIFVzZXJUb2tlbkdyYW50b3IsIFVzZXJUb2tlbkdyYW50b3JQYXJhbXMgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBmaW5kT3JDcmVhdGVDbGllbnQgfSBmcm9tICcuLi9jbGllbnQvY2FjaGUnO1xuaW1wb3J0IHsgaXNTYWxlc2ZvcmNlQWNjZXNzVG9rZW5SZXNwb25zZSwgVXNlckluZm8gfSBmcm9tICcuLi9jbGllbnQvc2FsZXNmb3JjZS9pZGVudGl0eSc7XG5pbXBvcnQgeyB2YWxpZGF0ZSB9IGZyb20gJy4uL2NsaWVudC92YWxpZGF0b3IvZW52aXJvbm1lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50IHtcblxuXHQvKipcblx0ICogVGhlIGFjY2VzcyB0b2tlbiBpc3N1ZWQgYnkgdGhlIGF1dGhvcml6YXRpb24gc2VydmVyLlxuXHQgKi9cblx0YWNjZXNzVG9rZW46IHN0cmluZztcblxuXHQvKipcblx0ICogQSBVUkwgaW5kaWNhdGluZyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHVzZXLigJlzIG9yZy4gRm9yIGV4YW1wbGU6IGh0dHBzOi8veW91ckluc3RhbmNlLnNhbGVzZm9yY2UuY29tLy5cblx0ICovXG5cdGluc3RhbmNlVXJsPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgd2hlbiBwYXJzaW5nIHRoZSBbSWRlbnRpdHkgVVJMXShodHRwczovL2hlbHAuc2FsZXNmb3JjZS5jb20vYXJ0aWNsZVZpZXc/aWQ9cmVtb3RlYWNjZXNzX3VzaW5nX29wZW5pZC5odG0pLlxuXHQgKi9cblx0dXNlckluZm8/OiBVc2VySW5mbztcblxufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBvYnRhaW4gYSB0b2tlbiBmb3IgdGhlIHBhc3NlZCB1c2VyLlxuICpcbiAqIEBwYXJhbSBlbnYgVGhlIGF1dGggZW52aXJvbm1lbnQgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCByZXRyaWV2ZXMgdGhlIHVzZXIgY3JlZGVudGlhbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2tlbihlbnY6IEVudmlyb25tZW50KTogVXNlclRva2VuR3JhbnRvciB7XG5cblx0Y29uc3QgdmFsaWRhdGVkRW52aXJvbm1lbnQgPSB2YWxpZGF0ZShlbnYpO1xuXG5cdHJldHVybiBhc3luYyBmdW5jdGlvbiBnZXRVc2VyQ3JlZGVudGlhbHMocGFyYW1zOiBVc2VyVG9rZW5HcmFudG9yUGFyYW1zLCBvcHRzPzogR3JhbnRPcHRpb25zKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHR2YWxpZGF0ZVVzZXIocGFyYW1zLnVzZXIpO1xuXG5cdFx0XHQvLyBUaGUgVG9rZW5HcmFudG9yUGFyYW1zIGludGVyZmFjZSBleGNsdWRlcyB0aGUgZ3JhbnRfdHlwZSBzbyB0aGF0IGl0XG5cdFx0XHQvLyBkb2Vzbid0IGhhdmUgdG8gYmUgc2V0IGJ5IHRoZSBjYWxsZXIuIE1ha2Ugc3VyZSBpdCBpcyBzZXQgaGVyZS5cblx0XHRcdGNvbnN0IGludGVybmFsUGFyYW1zOiBQYXJ0aWFsPEp3dEdyYW50UGFyYW1zPiA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyk7XG5cdFx0XHRpbnRlcm5hbFBhcmFtcy5ncmFudFR5cGUgPSAndXJuOmlldGY6cGFyYW1zOm9hdXRoOmdyYW50LXR5cGU6and0LWJlYXJlcic7XG5cblx0XHRcdGNvbnN0IGF1dGhvcml6YXRpb25HcmFudCA9IGF3YWl0IG9idGFpbkdyYW50KHZhbGlkYXRlZEVudmlyb25tZW50LCBpbnRlcm5hbFBhcmFtcyBhcyBKd3RHcmFudFBhcmFtcywgb3B0cyk7XG5cdFx0XHRyZXR1cm4gY29udmVydEdyYW50VG9DcmVkZW50aWFscyhhdXRob3JpemF0aW9uR3JhbnQpO1xuXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIG9idGFpbiBncmFudCBmb3IgdXNlciR7ZXJyb3IubWVzc2FnZX0uYCk7XG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdXNlciBjb250YWlucyB0aGUgY29ycmVjdCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIHZhbGlkYXRlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVVzZXIodXNlcjogVXNlcikge1xuXG5cdGlmICghdXNlcikge1xuXHRcdHRocm93IG5ldyBFcnJvcignLiBDYXVzZWQgYnk6IE1pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHBhcmFtZXRlcjogdXNlcicpO1xuXHR9XG5cblx0aWYgKHVzZXIudXNlcm5hbWUgPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignLiBDYXVzZWQgYnk6IE1pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlcjogdXNlclt1c2VybmFtZV0nKTtcblx0fVxuXG5cdGlmICghdXNlci51c2VybmFtZS5sZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJy4gQ2F1c2VkIGJ5OiBJbnZhbGlkIHBhcmFtZXRlcjogdXNlclt1c2VybmFtZV0gY2Fubm90IGJlIGVtcHR5Jyk7XG5cdH1cblxufVxuXG4vKipcbiAqIE9idGFpbnMgYSBncmFudCBmb3IgdGhlIGdpdmVuIHVzZXIgdXNpbmcgdGhlIE9wZW5JRCBjbGllbnQuXG4gKiBAcGFyYW0gZW52IFRoZSBhdXRoIGVudmlyb25tZW50IHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciB0aGUgSldUIGdyYW50IHR5cGUuXG4gKiBAcGFyYW0gW29wdHNdIFRoZSBncmFudCBvcHRpb25zIHRvIGJlIHVzZWQuXG4gKiBAcmV0dXJucyBUaGUgYWNjZXNzIHRva2VuIHJlc3BvbnNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBvYnRhaW5HcmFudChlbnY6IEVudmlyb25tZW50LCBwYXJhbXM6IEp3dEdyYW50UGFyYW1zLCBvcHRzPzogR3JhbnRPcHRpb25zKSB7XG5cblx0dHJ5IHtcblxuXHRcdGNvbnN0IGNsaWVudCA9IGF3YWl0IGZpbmRPckNyZWF0ZUNsaWVudChlbnYpO1xuXHRcdHJldHVybiBhd2FpdCBjbGllbnQuZ3JhbnQocGFyYW1zLCBvcHRzKTtcblxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHRocm93IG5ldyBFcnJvcihgICgke3BhcmFtcy51c2VyLnVzZXJuYW1lfSkuIENhdXNlZCBieTogJHtlcnJvci5tZXNzYWdlfWApO1xuXHR9XG5cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgYWNjZXNzIHRva2VuIHJlc3BvbnNlIHRvIGEgZ3JhbnQgdGhhdCBjYW4gYmUgdXNlZCBpbiB0YW5kZW0gd2l0aFxuICogb3RoZXIgTlBNIG1vZHVsZXMgc3VjaCBhcyBbSlNmb3JjZV0paHR0cHM6Ly9naXRodWIuY29tL2pzZm9yY2UvanNmb3JjZSkuXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgYWNjZXNzIHRva2VuIHJlc3BvbnNlLlxuICogQHJldHVybnMgVGhlIHVzZXIgY3JlZGVudGlhbHMuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRHcmFudFRvQ3JlZGVudGlhbHModG9rZW46IEFjY2Vzc1Rva2VuUmVzcG9uc2UpOiBHcmFudCB7XG5cblx0aWYgKGlzU2FsZXNmb3JjZUFjY2Vzc1Rva2VuUmVzcG9uc2UodG9rZW4pKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YWNjZXNzVG9rZW46IHRva2VuLmFjY2Vzc190b2tlbixcblx0XHRcdGluc3RhbmNlVXJsOiB0b2tlbi5pbnN0YW5jZV91cmwsXG5cdFx0XHR1c2VySW5mbzogdG9rZW4udXNlckluZm9cblx0XHR9O1xuXG5cdH1cblxuXHRyZXR1cm4geyBhY2Nlc3NUb2tlbjogdG9rZW4uYWNjZXNzX3Rva2VuIH07XG5cbn1cbiJdfQ==