@ariyana/appauth
Version:
A general purpose OAuth client.
161 lines • 22.6 kB
JavaScript
;
/*
* Copyright 2017 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.App = void 0;
// Represents the test web app that uses the AppAuthJS library.
var authorization_request_1 = require("../authorization_request");
var authorization_request_handler_1 = require("../authorization_request_handler");
var authorization_service_configuration_1 = require("../authorization_service_configuration");
var logger_1 = require("../logger");
var redirect_based_handler_1 = require("../redirect_based_handler");
var token_request_1 = require("../token_request");
var token_request_handler_1 = require("../token_request_handler");
/* an example open id connect provider */
var openIdConnectUrl = 'https://accounts.google.com';
/* example client configuration */
var clientId = '511828570984-7nmej36h9j2tebiqmpqh835naet4vci4.apps.googleusercontent.com';
var redirectUri = 'http://localhost:8000/app/redirect.html';
var scope = 'openid';
/**
* The Test application.
*/
var App = /** @class */ (function () {
function App(snackbar) {
var _this = this;
this.snackbar = snackbar;
this.notifier = new authorization_request_handler_1.AuthorizationNotifier();
this.authorizationHandler = new redirect_based_handler_1.RedirectRequestHandler();
this.tokenHandler = new token_request_handler_1.BaseTokenRequestHandler();
// set notifier to deliver responses
this.authorizationHandler.setAuthorizationNotifier(this.notifier);
// set a listener to listen for authorization responses
this.notifier.setAuthorizationListener(function (request, response, error) {
logger_1.log('Authorization request complete ', request, response, error);
if (response) {
_this.request = request;
_this.response = response;
_this.code = response.code;
_this.showMessage("Authorization Code " + response.code);
}
});
}
App.prototype.showMessage = function (message) {
var snackbar = this.snackbar['MaterialSnackbar'];
snackbar.showSnackbar({ message: message });
};
App.prototype.fetchServiceConfiguration = function () {
var _this = this;
authorization_service_configuration_1.AuthorizationServiceConfiguration.fetchFromIssuer(openIdConnectUrl)
.then(function (response) {
logger_1.log('Fetched service configuration', response);
_this.configuration = response;
_this.showMessage('Completed fetching configuration');
})
.catch(function (error) {
logger_1.log('Something bad happened', error);
_this.showMessage("Something bad happened " + error);
});
};
App.prototype.makeAuthorizationRequest = function () {
// create a request
var request = new authorization_request_1.AuthorizationRequest({
client_id: clientId,
redirect_uri: redirectUri,
scope: scope,
response_type: authorization_request_1.AuthorizationRequest.RESPONSE_TYPE_CODE,
state: undefined,
extras: { 'prompt': 'consent', 'access_type': 'offline' }
});
if (this.configuration) {
this.authorizationHandler.performAuthorizationRequest(this.configuration, request);
}
else {
this.showMessage('Fetch Authorization Service configuration, before you make the authorization request.');
}
};
App.prototype.makeTokenRequest = function () {
var _this = this;
if (!this.configuration) {
this.showMessage('Please fetch service configuration.');
return;
}
var request = null;
if (this.code) {
var extras = undefined;
if (this.request && this.request.internal) {
extras = {};
extras['code_verifier'] = this.request.internal['code_verifier'];
}
// use the code to make the token request.
request = new token_request_1.TokenRequest({
client_id: clientId,
redirect_uri: redirectUri,
grant_type: token_request_1.GRANT_TYPE_AUTHORIZATION_CODE,
code: this.code,
refresh_token: undefined,
extras: extras
});
}
else if (this.tokenResponse) {
// use the token response to make a request for an access token
request = new token_request_1.TokenRequest({
client_id: clientId,
redirect_uri: redirectUri,
grant_type: token_request_1.GRANT_TYPE_REFRESH_TOKEN,
code: undefined,
refresh_token: this.tokenResponse.refreshToken,
extras: undefined
});
}
if (request) {
this.tokenHandler.performTokenRequest(this.configuration, request)
.then(function (response) {
var isFirstRequest = false;
if (_this.tokenResponse) {
// copy over new fields
_this.tokenResponse.accessToken = response.accessToken;
_this.tokenResponse.issuedAt = response.issuedAt;
_this.tokenResponse.expiresIn = response.expiresIn;
_this.tokenResponse.tokenType = response.tokenType;
_this.tokenResponse.scope = response.scope;
}
else {
isFirstRequest = true;
_this.tokenResponse = response;
}
// unset code, so we can do refresh token exchanges subsequently
_this.code = undefined;
if (isFirstRequest) {
_this.showMessage("Obtained a refresh token " + response.refreshToken);
}
else {
_this.showMessage("Obtained an access token " + response.accessToken + ".");
}
})
.catch(function (error) {
logger_1.log('Something bad happened', error);
_this.showMessage("Something bad happened " + error);
});
}
};
App.prototype.checkForAuthorizationResponse = function () {
this.authorizationHandler.completeAuthorizationRequestIfPossible();
};
return App;
}());
exports.App = App;
// export App
window['App'] = App;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUVILCtEQUErRDtBQUUvRCxrRUFBOEQ7QUFDOUQsa0ZBQW9HO0FBQ3BHLDhGQUF5RjtBQUN6RixvQ0FBOEI7QUFDOUIsb0VBQWlFO0FBQ2pFLGtEQUF1RztBQUN2RyxrRUFBc0Y7QUFzQnRGLHlDQUF5QztBQUN6QyxJQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxJQUFNLFFBQVEsR0FBRywwRUFBMEUsQ0FBQztBQUM1RixJQUFNLFdBQVcsR0FBRyx5Q0FBeUMsQ0FBQztBQUM5RCxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUM7QUFFdkI7O0dBRUc7QUFDSDtJQVlFLGFBQW1CLFFBQWlCO1FBQXBDLGlCQWdCQztRQWhCa0IsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUkscURBQXFCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSwrQ0FBc0IsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSwrQ0FBdUIsRUFBRSxDQUFDO1FBQ2xELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLFVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLO1lBQzlELFlBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pFLElBQUksUUFBUSxFQUFFO2dCQUNaLEtBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixL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LENBQUMsV0FBVyxDQUFDLDhCQUE0QixRQUFRLENBQUMsV0FBVyxNQUFHLENBQUMsQ0FBQztpQkFDdkU7WUFDSCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLFVBQUEsS0FBSztnQkFDVixZQUFHLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLEtBQUksQ0FBQyxXQUFXLENBQUMsNEJBQTBCLEtBQU8sQ0FBQyxDQUFBO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1NBQ1I7SUFDSCxDQUFDO0lBRUQsMkNBQTZCLEdBQTdCO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHNDQUFzQyxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUNILFVBQUM7QUFBRCxDQUFDLEFBdklELElBdUlDO0FBdklZLGtCQUFHO0FBeUloQixhQUFhO0FBQ1osTUFBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0XHJcbiAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZVxyXG4gKiBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlclxyXG4gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5cclxuLy8gUmVwcmVzZW50cyB0aGUgdGVzdCB3ZWIgYXBwIHRoYXQgdXNlcyB0aGUgQXBwQXV0aEpTIGxpYnJhcnkuXHJcblxyXG5pbXBvcnQge0F1dGhvcml6YXRpb25SZXF1ZXN0fSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3JlcXVlc3QnO1xyXG5pbXBvcnQge0F1dGhvcml6YXRpb25Ob3RpZmllciwgQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyfSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3JlcXVlc3RfaGFuZGxlcic7XHJcbmltcG9ydCB7QXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9ufSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3NlcnZpY2VfY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7bG9nfSBmcm9tICcuLi9sb2dnZXInO1xyXG5pbXBvcnQge1JlZGlyZWN0UmVxdWVzdEhhbmRsZXJ9IGZyb20gJy4uL3JlZGlyZWN0X2Jhc2VkX2hhbmRsZXInO1xyXG5pbXBvcnQge0dSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLCBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sIFRva2VuUmVxdWVzdH0gZnJvbSAnLi4vdG9rZW5fcmVxdWVzdCc7XHJcbmltcG9ydCB7QmFzZVRva2VuUmVxdWVzdEhhbmRsZXIsIFRva2VuUmVxdWVzdEhhbmRsZXJ9IGZyb20gJy4uL3Rva2VuX3JlcXVlc3RfaGFuZGxlcic7XHJcbmltcG9ydCB7VG9rZW5SZXNwb25zZX0gZnJvbSAnLi4vdG9rZW5fcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9hdXRob3JpemF0aW9uX3Jlc3BvbnNlJztcclxuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLyogU29tZSBpbnRlcmZhY2UgZGVjbGFyYXRpb25zIGZvciBNYXRlcmlhbCBkZXNpZ24gbGl0ZS4gKi9cclxuXHJcbi8qKlxyXG4gKiBTbmFja2JhciBvcHRpb25zLlxyXG4gKi9cclxuZGVjbGFyZSBpbnRlcmZhY2UgU25hY2tCYXJPcHRpb25zIHtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgdGltZW91dD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSB0aGF0IGRlZmluZXMgdGhlIE1ETCBNYXRlcmlhbCBTbmFjayBCYXIgQVBJLlxyXG4gKi9cclxuZGVjbGFyZSBpbnRlcmZhY2UgTWF0ZXJpYWxTbmFja0JhciB7XHJcbiAgc2hvd1NuYWNrYmFyOiAob3B0aW9uczogU25hY2tCYXJPcHRpb25zKSA9PiB2b2lkO1xyXG59XHJcblxyXG4vKiBhbiBleGFtcGxlIG9wZW4gaWQgY29ubmVjdCBwcm92aWRlciAqL1xyXG5jb25zdCBvcGVuSWRDb25uZWN0VXJsID0gJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSc7XHJcblxyXG4vKiBleGFtcGxlIGNsaWVudCBjb25maWd1cmF0aW9uICovXHJcbmNvbnN0IGNsaWVudElkID0gJzUxMTgyODU3MDk4NC03bm1lajM2aDlqMnRlYmlxbXBxaDgzNW5hZXQ0dmNpNC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSc7XHJcbmNvbnN0IHJlZGlyZWN0VXJpID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9hcHAvcmVkaXJlY3QuaHRtbCc7XHJcbmNvbnN0IHNjb3BlID0gJ29wZW5pZCc7XHJcblxyXG4vKipcclxuICogVGhlIFRlc3QgYXBwbGljYXRpb24uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQXBwIHtcclxuICBwcml2YXRlIG5vdGlmaWVyOiBBdXRob3JpemF0aW9uTm90aWZpZXI7XHJcbiAgcHJpdmF0ZSBhdXRob3JpemF0aW9uSGFuZGxlcjogQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyO1xyXG4gIHByaXZhdGUgdG9rZW5IYW5kbGVyOiBUb2tlblJlcXVlc3RIYW5kbGVyO1xyXG5cclxuICAvLyBzdGF0ZVxyXG4gIHByaXZhdGUgY29uZmlndXJhdGlvbjogQXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9ufHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlcXVlc3Q6IEF1dGhvcml6YXRpb25SZXF1ZXN0fHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHJlc3BvbnNlOiBBdXRob3JpemF0aW9uUmVzcG9uc2V8dW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY29kZTogc3RyaW5nfHVuZGVmaW5lZDtcclxuICBwcml2YXRlIHRva2VuUmVzcG9uc2U6IFRva2VuUmVzcG9uc2V8dW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc25hY2tiYXI6IEVsZW1lbnQpIHtcclxuICAgIHRoaXMubm90aWZpZXIgPSBuZXcgQXV0aG9yaXphdGlvbk5vdGlmaWVyKCk7XHJcbiAgICB0aGlzLmF1dGhvcml6YXRpb25IYW5kbGVyID0gbmV3IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIoKTtcclxuICAgIHRoaXMudG9rZW5IYW5kbGVyID0gbmV3IEJhc2VUb2tlblJlcXVlc3RIYW5kbGVyKCk7XHJcbiAgICAvLyBzZXQgbm90aWZpZXIgdG8gZGVsaXZlciByZXNwb25zZXNcclxuICAgIHRoaXMuYXV0aG9yaXphdGlvbkhhbmRsZXIuc2V0QXV0aG9yaXphdGlvbk5vdGlmaWVyKHRoaXMubm90aWZpZXIpO1xyXG4gICAgLy8gc2V0IGEgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBhdXRob3JpemF0aW9uIHJlc3BvbnNlc1xyXG4gICAgdGhpcy5ub3RpZmllci5zZXRBdXRob3JpemF0aW9uTGlzdGVuZXIoKHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvcikgPT4ge1xyXG4gICAgICBsb2coJ0F1dGhvcml6YXRpb24gcmVxdWVzdCBjb21wbGV0ZSAnLCByZXF1ZXN0LCByZXNwb25zZSwgZXJyb3IpO1xyXG4gICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmNvZGUgPSByZXNwb25zZS5jb2RlO1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoYEF1dGhvcml6YXRpb24gQ29kZSAke3Jlc3BvbnNlLmNvZGV9YCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvd01lc3NhZ2UobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBzbmFja2JhciA9ICh0aGlzLnNuYWNrYmFyIGFzIGFueSlbJ01hdGVyaWFsU25hY2tiYXInXSBhcyBNYXRlcmlhbFNuYWNrQmFyO1xyXG4gICAgc25hY2tiYXIuc2hvd1NuYWNrYmFyKHttZXNzYWdlOiBtZXNzYWdlfSk7XHJcbiAgfVxyXG5cclxuICBmZXRjaFNlcnZpY2VDb25maWd1cmF0aW9uKCkge1xyXG4gICAgQXV0aG9yaXphdGlvblNlcnZpY2VDb25maWd1cmF0aW9uLmZldGNoRnJvbUlzc3VlcihvcGVuSWRDb25uZWN0VXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIGxvZygnRmV0Y2hlZCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24nLCByZXNwb25zZSk7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSByZXNwb25zZTtcclxuICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoJ0NvbXBsZXRlZCBmZXRjaGluZyBjb25maWd1cmF0aW9uJyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgbG9nKCdTb21ldGhpbmcgYmFkIGhhcHBlbmVkJywgZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAke2Vycm9yfWApXHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBtYWtlQXV0aG9yaXphdGlvblJlcXVlc3QoKSB7XHJcbiAgICAvLyBjcmVhdGUgYSByZXF1ZXN0XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBBdXRob3JpemF0aW9uUmVxdWVzdCh7XHJcbiAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXHJcbiAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgIHNjb3BlOiBzY29wZSxcclxuICAgICAgcmVzcG9uc2VfdHlwZTogQXV0aG9yaXphdGlvblJlcXVlc3QuUkVTUE9OU0VfVFlQRV9DT0RFLFxyXG4gICAgICBzdGF0ZTogdW5kZWZpbmVkLFxyXG4gICAgICBleHRyYXM6IHsncHJvbXB0JzogJ2NvbnNlbnQnLCAnYWNjZXNzX3R5cGUnOiAnb2ZmbGluZSd9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuYXV0aG9yaXphdGlvbkhhbmRsZXIucGVyZm9ybUF1dGhvcml6YXRpb25SZXF1ZXN0KHRoaXMuY29uZmlndXJhdGlvbiwgcmVxdWVzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgJ0ZldGNoIEF1dGhvcml6YXRpb24gU2VydmljZSBjb25maWd1cmF0aW9uLCBiZWZvcmUgeW91IG1ha2UgdGhlIGF1dGhvcml6YXRpb24gcmVxdWVzdC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1ha2VUb2tlblJlcXVlc3QoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbikge1xyXG4gICAgICB0aGlzLnNob3dNZXNzYWdlKCdQbGVhc2UgZmV0Y2ggc2VydmljZSBjb25maWd1cmF0aW9uLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlcXVlc3Q6IFRva2VuUmVxdWVzdHxudWxsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmNvZGUpIHtcclxuICAgICAgbGV0IGV4dHJhczogU3RyaW5nTWFwfHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHRoaXMucmVxdWVzdCAmJiB0aGlzLnJlcXVlc3QuaW50ZXJuYWwpIHtcclxuICAgICAgICBleHRyYXMgPSB7fTtcclxuICAgICAgICBleHRyYXNbJ2NvZGVfdmVyaWZpZXInXSA9IHRoaXMucmVxdWVzdC5pbnRlcm5hbFsnY29kZV92ZXJpZmllciddO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHVzZSB0aGUgY29kZSB0byBtYWtlIHRoZSB0b2tlbiByZXF1ZXN0LlxyXG4gICAgICByZXF1ZXN0ID0gbmV3IFRva2VuUmVxdWVzdCh7XHJcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcclxuICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICAgIGdyYW50X3R5cGU6IEdSQU5UX1RZUEVfQVVUSE9SSVpBVElPTl9DT0RFLFxyXG4gICAgICAgIGNvZGU6IHRoaXMuY29kZSxcclxuICAgICAgICByZWZyZXNoX3Rva2VuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZXh0cmFzOiBleHRyYXNcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMudG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAvLyB1c2UgdGhlIHRva2VuIHJlc3BvbnNlIHRvIG1ha2UgYSByZXF1ZXN0IGZvciBhbiBhY2Nlc3MgdG9rZW5cclxuICAgICAgcmVxdWVzdCA9IG5ldyBUb2tlblJlcXVlc3Qoe1xyXG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXHJcbiAgICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSxcclxuICAgICAgICBncmFudF90eXBlOiBHUkFOVF9UWVBFX1JFRlJFU0hfVE9LRU4sXHJcbiAgICAgICAgY29kZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMudG9rZW5SZXNwb25zZS5yZWZyZXNoVG9rZW4sXHJcbiAgICAgICAgZXh0cmFzOiB1bmRlZmluZWRcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3QpIHtcclxuICAgICAgdGhpcy50b2tlbkhhbmRsZXIucGVyZm9ybVRva2VuUmVxdWVzdCh0aGlzLmNvbmZpZ3VyYXRpb24sIHJlcXVlc3QpXHJcbiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0ZpcnN0UmVxdWVzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgLy8gY29weSBvdmVyIG5ldyBmaWVsZHNcclxuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UuYWNjZXNzVG9rZW4gPSByZXNwb25zZS5hY2Nlc3NUb2tlbjtcclxuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UuaXNzdWVkQXQgPSByZXNwb25zZS5pc3N1ZWRBdDtcclxuICAgICAgICAgICAgICB0aGlzLnRva2VuUmVzcG9uc2UuZXhwaXJlc0luID0gcmVzcG9uc2UuZXhwaXJlc0luO1xyXG4gICAgICAgICAgICAgIHRoaXMudG9rZW5SZXNwb25zZS50b2tlblR5cGUgPSByZXNwb25zZS50b2tlblR5cGU7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2tlblJlc3BvbnNlLnNjb3BlID0gcmVzcG9uc2Uuc2NvcGU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaXNGaXJzdFJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMudG9rZW5SZXNwb25zZSA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB1bnNldCBjb2RlLCBzbyB3ZSBjYW4gZG8gcmVmcmVzaCB0b2tlbiBleGNoYW5nZXMgc3Vic2VxdWVudGx5XHJcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKGlzRmlyc3RSZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgT2J0YWluZWQgYSByZWZyZXNoIHRva2VuICR7cmVzcG9uc2UucmVmcmVzaFRva2VufWApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoYE9idGFpbmVkIGFuIGFjY2VzcyB0b2tlbiAke3Jlc3BvbnNlLmFjY2Vzc1Rva2VufS5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGxvZygnU29tZXRoaW5nIGJhZCBoYXBwZW5lZCcsIGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShgU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAke2Vycm9yfWApXHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrRm9yQXV0aG9yaXphdGlvblJlc3BvbnNlKCkge1xyXG4gICAgdGhpcy5hdXRob3JpemF0aW9uSGFuZGxlci5jb21wbGV0ZUF1dGhvcml6YXRpb25SZXF1ZXN0SWZQb3NzaWJsZSgpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gZXhwb3J0IEFwcFxyXG4od2luZG93IGFzIGFueSlbJ0FwcCddID0gQXBwO1xyXG4iXX0=