@financialforcedev/orizuru-auth
Version:
Salesforce authentication for Heroku Node applications.
92 lines • 16.4 kB
JavaScript
;
/*
* 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 oauth2_1 = require("./oauth2");
const jwt_1 = require("./oauth2Jwt/jwt");
/**
* An OAuth 2.0 client that implements the [JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants](https://tools.ietf.org/html/rfc7523)
* specification.
*/
class OAuth2JWTClient extends oauth2_1.OAuth2Client {
/**
* Creates a new OpenID client with the given environment.
*
* @param env The OAuth2 environment parameters.
*/
constructor(env) {
super(env);
this.clientType = 'OAuth2JWT';
}
/**
* @inheritdoc
*/
async grant(params, opts) {
return super.grant(params, opts);
}
/**
* @inheritdoc
*/
async handleClientAuthentication(params, internalParams, internalOpts) {
if (params.grantType === 'urn:ietf:params:oauth:grant-type:jwt-bearer') {
const assertion = await jwt_1.createJwtBearerGrantAssertion(this.env, params);
internalParams.assertion = assertion;
internalParams.grant_type = 'urn:ietf:params:oauth:grant-type:jwt-bearer';
}
else {
if (!params.clientId) {
throw new Error('Missing required string parameter: clientId');
}
internalParams.client_id = params.clientId;
if (internalOpts.signingSecret) {
internalParams.client_assertion_type = 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer';
internalParams.client_assertion = await jwt_1.createJwtBearerClientAssertion(params, internalOpts.signingSecret, this.tokenEndpoint);
}
else {
if (!internalOpts.clientSecret) {
throw new Error('Missing required string parameter: clientSecret');
}
internalParams.client_secret = internalOpts.clientSecret;
}
}
}
/**
* @inheritdoc
*/
validateGrantParameters(params) {
super.validateGrantParameters(params);
if (params.grantType === 'urn:ietf:params:oauth:grant-type:jwt-bearer') {
if (!params.signingSecret) {
throw new Error('Missing required object parameter: signingSecret.');
}
if (!params.user) {
throw new Error('Missing required object parameter: user.');
}
}
}
}
exports.OAuth2JWTClient = OAuth2JWTClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgySnd0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2luZGV4L2NsaWVudC9vYXV0aDJKd3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7O0FBU0gscUNBQXlJO0FBQ3pJLHlDQUFnRztBQTRIaEc7OztHQUdHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLHFCQUFZO0lBRWhEOzs7O09BSUc7SUFDSCxZQUFZLEdBQWdCO1FBQzNCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBbUIsRUFBRSxJQUFzQjtRQUM3RCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNPLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxNQUFtQixFQUFFLGNBQXFDLEVBQUUsWUFBNkI7UUFFbkksSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLDZDQUE2QyxFQUFFO1lBRXZFLE1BQU0sU0FBUyxHQUFHLE1BQU0sbUNBQTZCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4RSxjQUFjLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUNyQyxjQUFjLENBQUMsVUFBVSxHQUFHLDZDQUE2QyxDQUFDO1NBRTFFO2FBQU07WUFFTixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2FBQy9EO1lBRUQsY0FBYyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBRTNDLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRTtnQkFDL0IsY0FBYyxDQUFDLHFCQUFxQixHQUFHLHdEQUF3RCxDQUFDO2dCQUNoRyxjQUFjLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxvQ0FBOEIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYyxDQUFDLENBQUM7YUFDaEk7aUJBQU07Z0JBRU4sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUU7b0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztpQkFDbkU7Z0JBRUQsY0FBYyxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO2FBRXpEO1NBQ0Q7SUFFRixDQUFDO0lBRUQ7O09BRUc7SUFDTyx1QkFBdUIsQ0FBQyxNQUFtQjtRQUVwRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLDZDQUE2QyxFQUFFO1lBRXZFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzVEO1NBQ0Q7SUFFRixDQUFDO0NBRUQ7QUExRUQsMENBMEVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSwgRmluYW5jaWFsRm9yY2UuY29tLCBpbmNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbiAqICAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEZpbmFuY2lhbEZvcmNlLmNvbSwgaW5jIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiAgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xuICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMXG4gKiAgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTXG4gKiAgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuLyoqXG4gKiBAbW9kdWxlIGNsaWVudC9vYXV0aDJKd3RcbiAqL1xuXG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tICdqc29ud2VidG9rZW4nO1xuXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4vY2FjaGUnO1xuaW1wb3J0IHsgQWNjZXNzVG9rZW5SZXNwb25zZSwgQXV0aENsaWVudEdyYW50UGFyYW1zLCBHcmFudFBhcmFtcywgT0F1dGgyQ2xpZW50LCBPQXV0aDJHcmFudE9wdGlvbnMsIFRva2VuR3JhbnRvclBhcmFtcyB9IGZyb20gJy4vb2F1dGgyJztcbmltcG9ydCB7IGNyZWF0ZUp3dEJlYXJlckNsaWVudEFzc2VydGlvbiwgY3JlYXRlSnd0QmVhcmVyR3JhbnRBc3NlcnRpb24gfSBmcm9tICcuL29hdXRoMkp3dC9qd3QnO1xuXG4vKipcbiAqIEEgW0pTT04gV2ViIFRva2VuXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUxOSkgdGhhdCBmdWxmaWxzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlXG4gKiBbSlNPTiBXZWIgVG9rZW4gKEpXVCkgUHJvZmlsZSBmb3IgT0F1dGggMi4wIENsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgQXV0aG9yaXphdGlvbiBHcmFudHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTIzKSBzcGVjaWZpY2F0aW9uLlxuICpcbiAqIEFsbCBmaWVsZHMgYXJlIG1hcmtlZCBhcyBvcHRpb25hbC9yZXF1aXJlZCBhY2NvcmRpbmcgdG8gdGhlIFtKV1QgcmVxdWlyZW1lbnRzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzUyMyNzZWN0aW9uLTMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpXVCB7XG5cblx0LyoqXG5cdCAqIFRoZSBKV1QgbWF5IGNvbnRhaW4gW290aGVyIGNsYWltc10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MjMjc2VjdGlvbi0zKS5cblx0ICovXG5cdFtpbmRleDogc3RyaW5nXTogYm9vbGVhbiB8IG51bWJlciB8IG9iamVjdCB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFtBdWRpZW5jZSBDbGFpbV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTkjc2VjdGlvbi00LjEuMylcblx0ICpcblx0ICogVGhlIGF1ZGllbmNlIGNsYWltIGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudHMgdGhhdCB0aGUgSldUIGlzIGludGVuZGVkIGZvci5cblx0ICovXG5cdGF1ZD86IHN0cmluZztcblxuXHQvKipcblx0ICogW0V4cGlyYXRpb24gVGltZSBDbGFpbV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTkjc2VjdGlvbi00LjEuNClcblx0ICpcblx0ICogVGhlIGV4cGlyYXRpb24gdGltZSBjbGFpbSBpZGVudGlmaWVzIHRoZSBleHBpcmF0aW9uIHRpbWUgb24gb3IgYWZ0ZXIgd2hpY2ggdGhlIEpXVFxuXHQgKiBtdXN0IG5vdCBiZSBhY2NlcHRlZCBmb3IgcHJvY2Vzc2luZy5cblx0ICovXG5cdGV4cD86IG51bWJlcjtcblxuXHQvKipcblx0ICogW0lzc3VlZCBBdCBDbGFpbV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTkjc2VjdGlvbi00LjEuNilcblx0ICpcblx0ICogIFRoZSBpc3N1ZWQgYXQgY2xhaW0gaWRlbnRpZmllcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgSldUIHdhcyBpc3N1ZWQuXG5cdCAqL1xuXHRpYXQ/OiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFtJc3N1ZXIgQ2xhaW1dKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE5I3NlY3Rpb24tNC4xLjEpXG5cdCAqXG5cdCAqIFRoZSBpc3N1ZXIgY2xhaW0gaWRlbnRpZmllcyB0aGUgcHJpbmNpcGFsIHRoYXQgaXNzdWVkIHRoZSBKV1QuXG5cdCAqL1xuXHRpc3M6IHN0cmluZztcblxuXHQvKipcblx0ICogW0pXVCBJRCBDbGFpbV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTkjc2VjdGlvbi00LjEuNylcblx0ICpcblx0ICogVGhlIEpXVCBJRCBjbGFpbSBwcm92aWRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgSldULlxuXHQgKi9cblx0anRpPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBbTm90IEJlZm9yZSBDbGFpbV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTkjc2VjdGlvbi00LjEuNSlcblx0ICpcblx0ICogVGhlIG5vdCBiZWZvcmUgY2xhaW0gaWRlbnRpZmllcyB0aGUgdGltZSBiZWZvcmUgd2hpY2ggdGhlIEpXVCBtdXN0IG5vdCBiZSBhY2NlcHRlZFxuXHQgKiBmb3IgcHJvY2Vzc2luZy5cblx0ICovXG5cdG5iZj86IHN0cmluZztcblxuXHQvKipcblx0ICogW1N1YmplY3QgQ2xhaW1dKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTE5I3NlY3Rpb24tNC4xLjIpXG5cdCAqXG5cdCAqIFRoZSBzdWJqZWN0IGNsYWltIGlkZW50aWZpZXMgdGhlIHByaW5jaXBhbCB0aGF0IGlzIHRoZSBzdWJqZWN0IG9mIHRoZSBKV1QuXG5cdCAqL1xuXHRzdWI/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHVzZWQgd2hlbiByZXF1ZXN0aW5nIGdyYW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKd3RHcmFudE9wdGlvbnMgZXh0ZW5kcyBPQXV0aDJHcmFudE9wdGlvbnMge1xuXG5cdC8qKlxuXHQgKiBUaGUgcHJpdmF0ZSBrZXkgdXNlZCBmb3Igc2lnbmluZyBncmFudCBhc3NlcnRpb25zIGFzIHBhcnQgb2YgdGhlIFtPQXV0aCAyLjAgSldUIEJlYXJlciBUb2tlbiBGbG93XShodHRwczovL2hlbHAuc2FsZXNmb3JjZS5jb20vYXJ0aWNsZVZpZXc/aWQ9cmVtb3RlYWNjZXNzX29hdXRoX2p3dF9mbG93Lmh0bSkuXG5cdCAqXG5cdCAqIEVpdGhlciB0aGlzIHZhbHVlIG9yIHRoZSBzaWduaW5nU2VjcmV0IHNob3VsZCBiZSBzZXQgZm9yIHRoZSBhdXRob3JpemF0aW9uIGNvZGUgb3IgcmVmcmVzaCBmbG93cy5cblx0ICovXG5cdHNpZ25pbmdTZWNyZXQ/OiBTZWNyZXQ7XG5cbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciB0aGUgSldUIGdyYW50IHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnd0R3JhbnRQYXJhbXMgZXh0ZW5kcyBVc2VyVG9rZW5HcmFudG9yUGFyYW1zIHtcblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGlzIGdyYW50IHR5cGUuXG5cdCAqL1xuXHRncmFudFR5cGU6ICd1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTpqd3QtYmVhcmVyJztcblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEp3dFRva2VuR3JhbnRvclBhcmFtcyBleHRlbmRzIFRva2VuR3JhbnRvclBhcmFtcyB7XG5cblx0LyoqXG5cdCAqIFRoZSBwcml2YXRlIGtleSB1c2VkIGZvciBzaWduaW5nIGdyYW50IGFzc2VydGlvbnMgYXMgcGFydCBvZiB0aGUgW09BdXRoIDIuMCBKV1QgQmVhcmVyIFRva2VuIEZsb3ddKGh0dHBzOi8vaGVscC5zYWxlc2ZvcmNlLmNvbS9hcnRpY2xlVmlldz9pZD1yZW1vdGVhY2Nlc3Nfb2F1dGhfand0X2Zsb3cuaHRtKS5cblx0ICovXG5cdHNpZ25pbmdTZWNyZXQ6IFNlY3JldDtcblxufVxuXG4vKipcbiAqIFRoZSBVc2VyIGNyZWRlbnRpYWxzIHJlcXVpcmVkIHRvIGluaXRpYWxpc2UgdGhlIEpXVCBmbG93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBuYW1lLlxuXHQgKi9cblx0dXNlcm5hbWU6IHN0cmluZztcblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUb2tlbkdyYW50b3JQYXJhbXMgZXh0ZW5kcyBKd3RUb2tlbkdyYW50b3JQYXJhbXMge1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciB0aGF0IGlzIHJlcXVlc3RpbmcgYWNjZXNzLlxuXHQgKi9cblx0dXNlcjogVXNlcjtcblxufVxuXG4vKipcbiAqIEFuIE9BdXRoIDIuMCBjbGllbnQgdGhhdCBpbXBsZW1lbnRzIHRoZSBbSlNPTiBXZWIgVG9rZW4gKEpXVCkgUHJvZmlsZSBmb3IgT0F1dGggMi4wIENsaWVudCBBdXRoZW50aWNhdGlvbiBhbmQgQXV0aG9yaXphdGlvbiBHcmFudHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTIzKVxuICogc3BlY2lmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoMkpXVENsaWVudCBleHRlbmRzIE9BdXRoMkNsaWVudCB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgT3BlbklEIGNsaWVudCB3aXRoIHRoZSBnaXZlbiBlbnZpcm9ubWVudC5cblx0ICpcblx0ICogQHBhcmFtIGVudiBUaGUgT0F1dGgyIGVudmlyb25tZW50IHBhcmFtZXRlcnMuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihlbnY6IEVudmlyb25tZW50KSB7XG5cdFx0c3VwZXIoZW52KTtcblx0XHR0aGlzLmNsaWVudFR5cGUgPSAnT0F1dGgySldUJztcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdGRvY1xuXHQgKi9cblx0cHVibGljIGFzeW5jIGdyYW50KHBhcmFtczogR3JhbnRQYXJhbXMsIG9wdHM/OiBKd3RHcmFudE9wdGlvbnMpOiBQcm9taXNlPEFjY2Vzc1Rva2VuUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gc3VwZXIuZ3JhbnQocGFyYW1zLCBvcHRzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdGRvY1xuXHQgKi9cblx0cHJvdGVjdGVkIGFzeW5jIGhhbmRsZUNsaWVudEF1dGhlbnRpY2F0aW9uKHBhcmFtczogR3JhbnRQYXJhbXMsIGludGVybmFsUGFyYW1zOiBBdXRoQ2xpZW50R3JhbnRQYXJhbXMsIGludGVybmFsT3B0czogSnd0R3JhbnRPcHRpb25zKSB7XG5cblx0XHRpZiAocGFyYW1zLmdyYW50VHlwZSA9PT0gJ3VybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOmp3dC1iZWFyZXInKSB7XG5cblx0XHRcdGNvbnN0IGFzc2VydGlvbiA9IGF3YWl0IGNyZWF0ZUp3dEJlYXJlckdyYW50QXNzZXJ0aW9uKHRoaXMuZW52LCBwYXJhbXMpO1xuXHRcdFx0aW50ZXJuYWxQYXJhbXMuYXNzZXJ0aW9uID0gYXNzZXJ0aW9uO1xuXHRcdFx0aW50ZXJuYWxQYXJhbXMuZ3JhbnRfdHlwZSA9ICd1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTpqd3QtYmVhcmVyJztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICghcGFyYW1zLmNsaWVudElkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyOiBjbGllbnRJZCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpbnRlcm5hbFBhcmFtcy5jbGllbnRfaWQgPSBwYXJhbXMuY2xpZW50SWQ7XG5cblx0XHRcdGlmIChpbnRlcm5hbE9wdHMuc2lnbmluZ1NlY3JldCkge1xuXHRcdFx0XHRpbnRlcm5hbFBhcmFtcy5jbGllbnRfYXNzZXJ0aW9uX3R5cGUgPSAndXJuOmlldGY6cGFyYW1zOm9hdXRoOmNsaWVudC1hc3NlcnRpb24tdHlwZTpqd3QtYmVhcmVyJztcblx0XHRcdFx0aW50ZXJuYWxQYXJhbXMuY2xpZW50X2Fzc2VydGlvbiA9IGF3YWl0IGNyZWF0ZUp3dEJlYXJlckNsaWVudEFzc2VydGlvbihwYXJhbXMsIGludGVybmFsT3B0cy5zaWduaW5nU2VjcmV0LCB0aGlzLnRva2VuRW5kcG9pbnQhKTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCFpbnRlcm5hbE9wdHMuY2xpZW50U2VjcmV0KSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXI6IGNsaWVudFNlY3JldCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW50ZXJuYWxQYXJhbXMuY2xpZW50X3NlY3JldCA9IGludGVybmFsT3B0cy5jbGllbnRTZWNyZXQ7XG5cblx0XHRcdH1cblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdGRvY1xuXHQgKi9cblx0cHJvdGVjdGVkIHZhbGlkYXRlR3JhbnRQYXJhbWV0ZXJzKHBhcmFtczogR3JhbnRQYXJhbXMpIHtcblxuXHRcdHN1cGVyLnZhbGlkYXRlR3JhbnRQYXJhbWV0ZXJzKHBhcmFtcyk7XG5cblx0XHRpZiAocGFyYW1zLmdyYW50VHlwZSA9PT0gJ3VybjppZXRmOnBhcmFtczpvYXV0aDpncmFudC10eXBlOmp3dC1iZWFyZXInKSB7XG5cblx0XHRcdGlmICghcGFyYW1zLnNpZ25pbmdTZWNyZXQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIG9iamVjdCBwYXJhbWV0ZXI6IHNpZ25pbmdTZWNyZXQuJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghcGFyYW1zLnVzZXIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIG9iamVjdCBwYXJhbWV0ZXI6IHVzZXIuJyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH1cblxufVxuIl19