breeze-client
Version:
Breeze data management for JavaScript clients
135 lines • 18.4 kB
JavaScript
import { config, core } from 'breeze-client';
import { appendQueryStringParameter, encodeParams } from './adapter-core';
export class AjaxAngularjsAdapter {
name;
defaultSettings;
requestInterceptor;
$http;
$rootScope;
constructor() {
this.name = "angularjs";
this.defaultSettings = {};
this.requestInterceptor = undefined;
// Will set:
// this.$http;
// this.$rootScope;
}
static register(breezeConfig) {
breezeConfig = breezeConfig || config;
breezeConfig.registerAdapter("ajax", AjaxAngularjsAdapter);
return breezeConfig.initializeAdapterInstance("ajax", "angularjs", true);
}
initialize() {
let ng = core.requireLib("angular");
if (ng) {
let $injector = ng.injector(['ng']);
let http, rootScope;
$injector.invoke(['$http', '$rootScope', function ($http, $rootScope) {
http = $http;
rootScope = $rootScope;
}]);
this.$http = http;
this.$rootScope = rootScope;
}
}
setHttp(http) {
this.$http = http;
this.$rootScope = null; // to suppress $rootScope.digest
}
ajax(config) {
if (!this.$http) {
throw new Error("Unable to locate angularjs for ajax adapter");
}
let ngConfig = {
method: config.type,
url: config.url,
dataType: config.dataType,
contentType: config.contentType,
crossDomain: config.crossDomain,
headers: config.headers || {},
data: undefined
};
if (config.params) {
// Hack: because of the way that Angular handles writing parameters out to the url.
// so this approach takes over the url param writing completely.
// See: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
ngConfig.url = appendQueryStringParameter(ngConfig.url, encodeParams(config.params));
}
if (config.data) {
ngConfig.data = config.data;
}
if (!core.isEmpty(this.defaultSettings)) {
let compositeConfig = core.extend({}, this.defaultSettings);
ngConfig = core.extend(compositeConfig, ngConfig);
// extend is shallow; extend headers separately
let headers = core.extend({}, this.defaultSettings.headers); // copy default headers 1st
ngConfig.headers = core.extend(headers, ngConfig.headers);
}
let requestInfo = {
adapter: this,
config: ngConfig,
dsaConfig: config,
success: successFn,
error: errorFn,
responseSuccess: responseSuccessFn,
responseError: responseErrorFn // adapter's error callback (ng 1.6+)
};
if (core.isFunction(this.requestInterceptor)) {
let ri = this.requestInterceptor;
ri(requestInfo);
if (ri.oneTime) {
this.requestInterceptor = undefined;
}
}
if (requestInfo.config) { // exists unless requestInterceptor killed it.
let prom = this.$http(requestInfo.config);
if (prom.success) {
// response for ng < 1.6
prom.success(requestInfo.success).error(requestInfo.error);
}
else {
// response for ng 1.6+
prom.then(requestInfo.responseSuccess).catch(requestInfo.responseError);
}
this.$rootScope && this.$rootScope.$digest();
}
function responseSuccessFn(response) {
return successFn(response.data, response.status, response.headers, response.config, response.statusText);
}
function successFn(data, status, headers, xconfig, statusText) {
// HACK: because $http returns a server side null as a string containing "null" - this is WRONG.
if (data === "null")
data = null;
let httpResponse = {
config: config,
data: data,
getHeaders: headers,
ngConfig: xconfig,
status: status,
statusText: statusText
};
config.success(httpResponse);
}
function responseErrorFn(response) {
return errorFn(response.data, response.status, response.headers, response.config, response.statusText);
}
function errorFn(data, status, headers, xconfig, statusText) {
// Timeout appears as an error with status===0 and no data.
// Make it better
if (status === 0 && data == null) {
data = 'timeout';
}
let httpResponse = {
config: config,
data: data,
getHeaders: headers,
ngConfig: xconfig,
status: status,
statusText: statusText
};
config.error(httpResponse);
}
}
}
config.registerAdapter("ajax", AjaxAngularjsAdapter);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWFuZ3VsYXJqcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVyLWFqYXgtYW5ndWxhcmpzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixJQUFJLENBQVM7SUFDYixlQUFlLENBQTJDO0lBQzFELGtCQUFrQixDQUEwQjtJQUM1QyxLQUFLLENBQU07SUFDWCxVQUFVLENBQU07SUFDaEI7UUFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIscUJBQXFCO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQTJCO1FBQ3pDLFlBQVksR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDO1FBQ3RDLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDM0QsT0FBTyxZQUFZLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQXlCLENBQUM7SUFDbkcsQ0FBQztJQUVELFVBQVU7UUFFUixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksRUFBRSxFQUFFO1lBQ04sSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxJQUFTLEVBQUUsU0FBYyxDQUFDO1lBQzlC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QWE7WUFDcEMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLElBQVMsRUFBRSxNQUFXLEVBQUUsT0FBWSxFQUFFLE9BQVksRUFBRSxVQUFrQjtZQUNyRiwyREFBMkQ7WUFDM0QsaUJBQWlCO1lBQ2pCLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUNoQyxJQUFJLEdBQUcsU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxZQUFZLEdBQUc7Z0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJO2dCQUNWLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFLFVBQVU7YUFDdkIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBamF4QWRhcHRlciwgQWpheFJlcXVlc3RJbnRlcmNlcHRvciwgQnJlZXplQ29uZmlnLCBjb25maWcsIGNvcmUgfSBmcm9tICdicmVlemUtY2xpZW50JztcclxuaW1wb3J0IHsgYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIsIGVuY29kZVBhcmFtcyB9IGZyb20gJy4vYWRhcHRlci1jb3JlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBBamF4QW5ndWxhcmpzQWRhcHRlciBpbXBsZW1lbnRzIEFqYXhBZGFwdGVyIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVmYXVsdFNldHRpbmdzOiB7IGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSB9O1xyXG4gIHJlcXVlc3RJbnRlcmNlcHRvcj86IEFqYXhSZXF1ZXN0SW50ZXJjZXB0b3I7XHJcbiAgJGh0dHA6IGFueTtcclxuICAkcm9vdFNjb3BlOiBhbnk7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLm5hbWUgPSBcImFuZ3VsYXJqc1wiO1xyXG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB7fTtcclxuICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gV2lsbCBzZXQ6XHJcbiAgICAvLyAgIHRoaXMuJGh0dHA7XHJcbiAgICAvLyAgIHRoaXMuJHJvb3RTY29wZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZWdpc3RlcihicmVlemVDb25maWc/OiBCcmVlemVDb25maWcpIHtcclxuICAgIGJyZWV6ZUNvbmZpZyA9IGJyZWV6ZUNvbmZpZyB8fCBjb25maWc7XHJcbiAgICBicmVlemVDb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiYWpheFwiLCBBamF4QW5ndWxhcmpzQWRhcHRlcik7XHJcbiAgICByZXR1cm4gYnJlZXplQ29uZmlnLmluaXRpYWxpemVBZGFwdGVySW5zdGFuY2UoXCJhamF4XCIsIFwiYW5ndWxhcmpzXCIsIHRydWUpIGFzIEFqYXhBbmd1bGFyanNBZGFwdGVyO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICBsZXQgbmcgPSBjb3JlLnJlcXVpcmVMaWIoXCJhbmd1bGFyXCIpO1xyXG4gICAgaWYgKG5nKSB7XHJcbiAgICAgIGxldCAkaW5qZWN0b3IgPSBuZy5pbmplY3RvcihbJ25nJ10pO1xyXG4gICAgICBsZXQgaHR0cDogYW55LCByb290U2NvcGU6IGFueTtcclxuICAgICAgJGluamVjdG9yLmludm9rZShbJyRodHRwJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbiAoJGh0dHA6IGFueSwgJHJvb3RTY29wZTogYW55KSB7XHJcbiAgICAgICAgaHR0cCA9ICRodHRwO1xyXG4gICAgICAgIHJvb3RTY29wZSA9ICRyb290U2NvcGU7XHJcbiAgICAgIH1dKTtcclxuICAgICAgdGhpcy4kaHR0cCA9IGh0dHA7XHJcbiAgICAgIHRoaXMuJHJvb3RTY29wZSA9IHJvb3RTY29wZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXRIdHRwKGh0dHA6IGFueSkge1xyXG4gICAgdGhpcy4kaHR0cCA9IGh0dHA7XHJcbiAgICB0aGlzLiRyb290U2NvcGUgPSBudWxsOyAvLyB0byBzdXBwcmVzcyAkcm9vdFNjb3BlLmRpZ2VzdFxyXG4gIH1cclxuXHJcblxyXG4gIGFqYXgoY29uZmlnOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy4kaHR0cCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gbG9jYXRlIGFuZ3VsYXJqcyBmb3IgYWpheCBhZGFwdGVyXCIpO1xyXG4gICAgfVxyXG4gICAgbGV0IG5nQ29uZmlnID0ge1xyXG4gICAgICBtZXRob2Q6IGNvbmZpZy50eXBlLFxyXG4gICAgICB1cmw6IGNvbmZpZy51cmwsXHJcbiAgICAgIGRhdGFUeXBlOiBjb25maWcuZGF0YVR5cGUsXHJcbiAgICAgIGNvbnRlbnRUeXBlOiBjb25maWcuY29udGVudFR5cGUsXHJcbiAgICAgIGNyb3NzRG9tYWluOiBjb25maWcuY3Jvc3NEb21haW4sXHJcbiAgICAgIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzIHx8IHt9LFxyXG4gICAgICBkYXRhOiB1bmRlZmluZWQgYXMgYW55XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb25maWcucGFyYW1zKSB7XHJcbiAgICAgIC8vIEhhY2s6IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGF0IEFuZ3VsYXIgaGFuZGxlcyB3cml0aW5nIHBhcmFtZXRlcnMgb3V0IHRvIHRoZSB1cmwuXHJcbiAgICAgIC8vIHNvIHRoaXMgYXBwcm9hY2ggdGFrZXMgb3ZlciB0aGUgdXJsIHBhcmFtIHdyaXRpbmcgY29tcGxldGVseS5cclxuICAgICAgLy8gU2VlOiBodHRwOi8vdmljdG9yYmxvZy5jb20vMjAxMi8xMi8yMC9tYWtlLWFuZ3VsYXJqcy1odHRwLXNlcnZpY2UtYmVoYXZlLWxpa2UtanF1ZXJ5LWFqYXgvXHJcbiAgICAgIG5nQ29uZmlnLnVybCA9IGFwcGVuZFF1ZXJ5U3RyaW5nUGFyYW1ldGVyKG5nQ29uZmlnLnVybCwgZW5jb2RlUGFyYW1zKGNvbmZpZy5wYXJhbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLmRhdGEpIHtcclxuICAgICAgbmdDb25maWcuZGF0YSA9IGNvbmZpZy5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAgbmdDb25maWcgPSBjb3JlLmV4dGVuZChjb21wb3NpdGVDb25maWcsIG5nQ29uZmlnKSBhcyBhbnk7XHJcbiAgICAgIC8vIGV4dGVuZCBpcyBzaGFsbG93OyBleHRlbmQgaGVhZGVycyBzZXBhcmF0ZWx5XHJcbiAgICAgIGxldCBoZWFkZXJzID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzLmhlYWRlcnMpOyAvLyBjb3B5IGRlZmF1bHQgaGVhZGVycyAxc3RcclxuICAgICAgbmdDb25maWcuaGVhZGVycyA9IGNvcmUuZXh0ZW5kKGhlYWRlcnMsIG5nQ29uZmlnLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXF1ZXN0SW5mbyA9IHtcclxuICAgICAgYWRhcHRlcjogdGhpcywgICAgICAvLyB0aGlzIGFkYXB0ZXJcclxuICAgICAgY29uZmlnOiBuZ0NvbmZpZywgICAvLyBhbmd1bGFyJ3MgJGh0dHAgY29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgICAgZHNhQ29uZmlnOiBjb25maWcsICAvLyB0aGUgY29uZmlnIGFyZyBmcm9tIHRoZSBjYWxsaW5nIEJyZWV6ZSBEYXRhU2VydmljZUFkYXB0ZXJcclxuICAgICAgc3VjY2Vzczogc3VjY2Vzc0ZuLCAvLyBhZGFwdGVyJ3Mgc3VjY2VzcyBjYWxsYmFja1xyXG4gICAgICBlcnJvcjogZXJyb3JGbiwgICAgICAvLyBhZGFwdGVyJ3MgZXJyb3IgY2FsbGJhY2tcclxuICAgICAgcmVzcG9uc2VTdWNjZXNzOiByZXNwb25zZVN1Y2Nlc3NGbiwgLy8gYWRhcHRlcidzIHN1Y2Nlc3MgY2FsbGJhY2sgKG5nIDEuNispXHJcbiAgICAgIHJlc3BvbnNlRXJyb3I6IHJlc3BvbnNlRXJyb3JGbiAgICAgIC8vIGFkYXB0ZXIncyBlcnJvciBjYWxsYmFjayAobmcgMS42KylcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGNvcmUuaXNGdW5jdGlvbih0aGlzLnJlcXVlc3RJbnRlcmNlcHRvcikpIHtcclxuICAgICAgbGV0IHJpID0gdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgYXMgYW55O1xyXG4gICAgICByaShyZXF1ZXN0SW5mbyk7XHJcbiAgICAgIGlmIChyaS5vbmVUaW1lKSB7XHJcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVxdWVzdEluZm8uY29uZmlnKSB7IC8vIGV4aXN0cyB1bmxlc3MgcmVxdWVzdEludGVyY2VwdG9yIGtpbGxlZCBpdC5cclxuICAgICAgbGV0IHByb20gPSB0aGlzLiRodHRwKHJlcXVlc3RJbmZvLmNvbmZpZyk7XHJcbiAgICAgIGlmIChwcm9tLnN1Y2Nlc3MpIHtcclxuICAgICAgICAvLyByZXNwb25zZSBmb3IgbmcgPCAxLjYgICAgICAgIFxyXG4gICAgICAgIHByb20uc3VjY2VzcyhyZXF1ZXN0SW5mby5zdWNjZXNzKS5lcnJvcihyZXF1ZXN0SW5mby5lcnJvcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gcmVzcG9uc2UgZm9yIG5nIDEuNitcclxuICAgICAgICBwcm9tLnRoZW4ocmVxdWVzdEluZm8ucmVzcG9uc2VTdWNjZXNzKS5jYXRjaChyZXF1ZXN0SW5mby5yZXNwb25zZUVycm9yKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiRyb290U2NvcGUgJiYgdGhpcy4kcm9vdFNjb3BlLiRkaWdlc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXNwb25zZVN1Y2Nlc3NGbihyZXNwb25zZTogYW55KSB7XHJcbiAgICAgIHJldHVybiBzdWNjZXNzRm4ocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5jb25maWcsIHJlc3BvbnNlLnN0YXR1c1RleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN1Y2Nlc3NGbihkYXRhOiBhbnksIHN0YXR1czogYW55LCBoZWFkZXJzOiBhbnksIHhjb25maWc6IGFueSwgc3RhdHVzVGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIC8vIEhBQ0s6IGJlY2F1c2UgJGh0dHAgcmV0dXJucyBhIHNlcnZlciBzaWRlIG51bGwgYXMgYSBzdHJpbmcgY29udGFpbmluZyBcIm51bGxcIiAtIHRoaXMgaXMgV1JPTkcuXHJcbiAgICAgIGlmIChkYXRhID09PSBcIm51bGxcIikgZGF0YSA9IG51bGw7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICBnZXRIZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgIG5nQ29uZmlnOiB4Y29uZmlnLFxyXG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLnN1Y2Nlc3MoaHR0cFJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXNwb25zZUVycm9yRm4ocmVzcG9uc2U6IGFueSkge1xyXG4gICAgICByZXR1cm4gZXJyb3JGbihyZXNwb25zZS5kYXRhLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLmNvbmZpZywgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZXJyb3JGbihkYXRhOiBhbnksIHN0YXR1czogYW55LCBoZWFkZXJzOiBhbnksIHhjb25maWc6IGFueSwgc3RhdHVzVGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIC8vIFRpbWVvdXQgYXBwZWFycyBhcyBhbiBlcnJvciB3aXRoIHN0YXR1cz09PTAgYW5kIG5vIGRhdGEuXHJcbiAgICAgIC8vIE1ha2UgaXQgYmV0dGVyXHJcbiAgICAgIGlmIChzdGF0dXMgPT09IDAgJiYgZGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgZGF0YSA9ICd0aW1lb3V0JztcclxuICAgICAgfVxyXG4gICAgICBsZXQgaHR0cFJlc3BvbnNlID0ge1xyXG4gICAgICAgIGNvbmZpZzogY29uZmlnLFxyXG4gICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgZ2V0SGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICBuZ0NvbmZpZzogeGNvbmZpZyxcclxuICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbmZpZy5lcnJvcihodHRwUmVzcG9uc2UpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuY29uZmlnLnJlZ2lzdGVyQWRhcHRlcihcImFqYXhcIiwgQWpheEFuZ3VsYXJqc0FkYXB0ZXIpO1xyXG4iXX0=