@fdot/angular-dotcodes
Version:
`npm install @fdot/angular-dotcodes --save`
466 lines (453 loc) • 45.3 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common/http'), require('rxjs'), require('rxjs/operators'), require('@angular/common'), require('@angular/forms')) :
typeof define === 'function' && define.amd ? define('@fdot/angular-dotcodes', ['exports', '@angular/core', '@angular/common/http', 'rxjs', 'rxjs/operators', '@angular/common', '@angular/forms'], factory) :
(factory((global.fdot = global.fdot || {}, global.fdot['angular-dotcodes'] = {}),global.ng.core,global.ng.common.http,null,global.Rx.Observable.prototype,global.ng.common,global.ng.forms));
}(this, (function (exports,i0,i1,rxjs,operators,common,forms) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Config = (function () {
function Config(host, apiKey, useDefaultSelect, defaultSelectText) {
this.host = host;
this.apiKey = apiKey;
this.useDefaultSelect = useDefaultSelect;
this.defaultSelectText = defaultSelectText;
}
return Config;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AngularDotcodesService = (function () {
function AngularDotcodesService(http, config) {
this.http = http;
this.config = config;
this.codesCache = new Map();
this.codeCache = new Map();
if (!config) {
throw Error('Call AngularDotcodesService with for root passing in the config object');
}
}
/**
* Method GetCode
* @param {?} column Column name to get Dotcode from
* @param {?} codeValue The code value to retrieve
* @return {?} Full HTTP response as Observable
*/
AngularDotcodesService.prototype.GetCode = /**
* Method GetCode
* @param {?} column Column name to get Dotcode from
* @param {?} codeValue The code value to retrieve
* @return {?} Full HTTP response as Observable
*/
function (column, codeValue) {
var /** @type {?} */ key = column + "-" + codeValue;
if (this.codeCache.get(key)) {
this.codeCache.get(column + "-" + codeValue);
}
else if (this.codesCache.get(column)) {
var /** @type {?} */ codes = this.codesCache.get(column).value;
if (codes) {
var /** @type {?} */ code = codes.filter(function (c) { return c.value === codeValue; });
if (code && code.length === 1) {
if (!this.codeCache.get(key)) {
this.codeCache.set(key, new rxjs.BehaviorSubject(null));
}
this.codeCache.get(key).next(code[0]);
}
else {
this.loadCodes(key, column, codeValue);
}
}
else {
this.loadCodes(key, column, codeValue);
}
}
else {
this.loadCodes(key, column, codeValue);
}
return this.codeCache.get(key);
};
/**
* @param {?} key
* @param {?} column
* @param {?} codeValue
* @return {?}
*/
AngularDotcodesService.prototype.loadCodes = /**
* @param {?} key
* @param {?} column
* @param {?} codeValue
* @return {?}
*/
function (key, column, codeValue) {
var _this = this;
this.codeCache.set(key, new rxjs.BehaviorSubject(null));
var /** @type {?} */ uri = "/GetCode";
var /** @type {?} */ headers = new i1.HttpHeaders();
var /** @type {?} */ params = new i1.HttpParams();
if (column !== undefined && column !== null) {
params = params.set('column', column + '');
}
if (codeValue !== undefined && codeValue !== null) {
params = params.set('codeValue', codeValue + '');
}
this.sendRequest('get', uri, headers, params, null).toPromise().then(function (b) {
if (b && b.body) {
_this.codeCache.get(key).next(b.body);
}
});
};
/**
* Method GetCodes
* @param {?} column Column name to get Dotcode from
* @return {?} Full HTTP response as Observable
*/
AngularDotcodesService.prototype.GetCodes = /**
* Method GetCodes
* @param {?} column Column name to get Dotcode from
* @return {?} Full HTTP response as Observable
*/
function (column) {
var _this = this;
if (this.codesCache.get(column)) {
this.codesCache.get(column);
}
else {
this.codesCache.set(column, new rxjs.BehaviorSubject(null));
var /** @type {?} */ uri = "/GetCodes";
var /** @type {?} */ headers = new i1.HttpHeaders();
var /** @type {?} */ params = new i1.HttpParams();
if (column !== undefined && column !== null) {
params = params.set('column', column + '');
}
this.sendRequest('get', uri, headers, params, null).toPromise().then(function (b) {
if (b && b.body) {
_this.codesCache.get(column).next(b.body);
}
});
}
return this.codesCache.get(column);
};
/**
* Method GetRelatedCodes
* @param {?} column Column name for dotcode
* @param {?} codeValue DotCode value to get related codes for
* @param {?} relatedCode Related Column name to get Related Codes from
* @return {?} Full HTTP response as Observable
*/
AngularDotcodesService.prototype.GetRelatedCodes = /**
* Method GetRelatedCodes
* @param {?} column Column name for dotcode
* @param {?} codeValue DotCode value to get related codes for
* @param {?} relatedCode Related Column name to get Related Codes from
* @return {?} Full HTTP response as Observable
*/
function (column, codeValue, relatedCode) {
var /** @type {?} */ uri = "/GetRelatedCodes";
var /** @type {?} */ headers = new i1.HttpHeaders();
var /** @type {?} */ params = new i1.HttpParams();
if (column !== undefined && column !== null) {
params = params.set('column', column + '');
}
if (codeValue !== undefined && codeValue !== null) {
params = params.set('codeValue', codeValue + '');
}
if (relatedCode !== undefined && relatedCode !== null) {
params = params.set('relatedCode', relatedCode + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(operators.map(function (b) {
if (b && b.body) {
return b.body;
}
}));
};
/**
* @template T
* @param {?} method
* @param {?} uri
* @param {?} headers
* @param {?} params
* @param {?} body
* @return {?}
*/
AngularDotcodesService.prototype.sendRequest = /**
* @template T
* @param {?} method
* @param {?} uri
* @param {?} headers
* @param {?} params
* @param {?} body
* @return {?}
*/
function (method, uri, headers, params, body) {
headers = headers.set('Ocp-Apim-Subscription-Key', this.config.apiKey);
if (method === 'get') {
return this.http.get(this.config.host + uri, { headers: headers.set('Accept', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'put') {
return this.http.put(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'post') {
return this.http.post(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'delete') {
return this.http.delete(this.config.host + uri, { headers: headers, params: params, observe: 'response' });
}
else {
console.error('Unsupported request: ' + method);
return rxjs.Observable.throw('Unsupported request: ' + method);
}
};
AngularDotcodesService.decorators = [
{ type: i0.Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
AngularDotcodesService.ctorParameters = function () {
return [
{ type: i1.HttpClient, },
{ type: Config, decorators: [{ type: i0.Inject, args: ['config',] },] },
];
};
/** @nocollapse */ AngularDotcodesService.ngInjectableDef = i0.defineInjectable({ factory: function AngularDotcodesService_Factory() { return new AngularDotcodesService(i0.inject(i1.HttpClient), i0.inject("config")); }, token: AngularDotcodesService, providedIn: "root" });
return AngularDotcodesService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AngularDotcodesComponent = (function () {
function AngularDotcodesComponent(dotcodeService) {
this.dotcodeService = dotcodeService;
}
/**
* @return {?}
*/
AngularDotcodesComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
console.log('init');
this.dotcodeService.GetCode(this.column, this.value).subscribe(function (code) {
console.log(code);
_this.code = code;
});
};
AngularDotcodesComponent.decorators = [
{ type: i0.Component, args: [{
selector: 'fdot-angular-dotcodes',
template: "\n <span *ngIf=\"code\">\n {{code.description}}\n </span>\n ",
styles: []
},] },
];
/** @nocollapse */
AngularDotcodesComponent.ctorParameters = function () {
return [
{ type: AngularDotcodesService, },
];
};
AngularDotcodesComponent.propDecorators = {
"column": [{ type: i0.Input },],
"value": [{ type: i0.Input },],
};
return AngularDotcodesComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DotcodesSelectComponent = (function () {
function DotcodesSelectComponent(dotCodeService, config) {
this.dotCodeService = dotCodeService;
this.config = config;
this.selectedDotcode = new i0.EventEmitter();
}
Object.defineProperty(DotcodesSelectComponent.prototype, "value", {
get: /**
* @return {?}
*/ function () {
return this._value;
},
set: /**
* @param {?} value
* @return {?}
*/ function (value) {
this._value = value;
this.setSelectedCode();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
DotcodesSelectComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
// tslint:disable-next-line:triple-equals
if (!(this.useDefaultSelect === false || /** @type {?} */ (this.useDefaultSelect) === 'false')
&& this.config != null && this.config.useDefaultSelect) {
this.useDefaultSelect = true;
}
else {
this.useDefaultSelect = false;
}
if (!this.defaultSelectText && this.config != null && this.config.defaultSelectText) {
this.defaultSelectText = this.config.defaultSelectText;
}
this.dotCodeService.GetCodes(this.column).subscribe(function (codes) {
_this.codes = codes;
_this.setSelectedCode();
});
};
/**
* @return {?}
*/
DotcodesSelectComponent.prototype.setSelectedCode = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.codes) {
return;
}
if (this.value) {
var /** @type {?} */ code = this.codes.find(function (c) { return c.value === _this.value; });
if (code) {
this.selectedCode = code;
this.codeChanged();
}
}
};
/**
* @return {?}
*/
DotcodesSelectComponent.prototype.codeChanged = /**
* @return {?}
*/
function () {
this.selectedDotcode.emit(this.selectedCode);
};
DotcodesSelectComponent.decorators = [
{ type: i0.Component, args: [{
selector: 'fdot-dotcodes-select',
template: "<select [(ngModel)]=\"selectedCode\" (change)=\"codeChanged()\" class=\"form-control\" [disabled]=\"disabled\">\n <option *ngIf=\"useDefaultSelect\" value=\"\">\n {{defaultSelectText}}\n </option>\n <option *ngFor=\"let code of codes\" [ngValue]=\"code\">\n {{code.description}}\n </option>\n</select>\n",
styles: [""]
},] },
];
/** @nocollapse */
DotcodesSelectComponent.ctorParameters = function () {
return [
{ type: AngularDotcodesService, },
{ type: Config, decorators: [{ type: i0.Inject, args: ['config',] },] },
];
};
DotcodesSelectComponent.propDecorators = {
"column": [{ type: i0.Input },],
"value": [{ type: i0.Input },],
"disabled": [{ type: i0.Input },],
"selectedDotcode": [{ type: i0.Output },],
"useDefaultSelect": [{ type: i0.Input },],
"defaultSelectText": [{ type: i0.Input },],
};
return DotcodesSelectComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var DotcodePipe = (function () {
function DotcodePipe(dotcodeService) {
this.dotcodeService = dotcodeService;
}
/**
* @param {?} value
* @param {?} column
* @return {?}
*/
DotcodePipe.prototype.transform = /**
* @param {?} value
* @param {?} column
* @return {?}
*/
function (value, column) {
return this.dotcodeService.GetCode(column, value).pipe(operators.map(function (c) {
if (c) {
return c.description;
}
}));
};
DotcodePipe.decorators = [
{ type: i0.Pipe, args: [{
name: 'dotcode',
},] },
];
/** @nocollapse */
DotcodePipe.ctorParameters = function () {
return [
{ type: AngularDotcodesService, },
];
};
return DotcodePipe;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AngularDotcodesModule = (function () {
function AngularDotcodesModule() {
}
/**
* @param {?} config
* @return {?}
*/
AngularDotcodesModule.forRoot = /**
* @param {?} config
* @return {?}
*/
function (config) {
return {
ngModule: AngularDotcodesModule,
providers: [AngularDotcodesService,
{ provide: 'config', useValue: config }
]
};
};
AngularDotcodesModule.decorators = [
{ type: i0.NgModule, args: [{
imports: [i1.HttpClientModule, common.CommonModule, forms.FormsModule
],
declarations: [AngularDotcodesComponent, DotcodesSelectComponent, DotcodePipe],
exports: [AngularDotcodesComponent, DotcodesSelectComponent, DotcodePipe]
},] },
];
return AngularDotcodesModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.AngularDotcodesService = AngularDotcodesService;
exports.AngularDotcodesComponent = AngularDotcodesComponent;
exports.Config = Config;
exports.DotcodesSelectComponent = DotcodesSelectComponent;
exports.AngularDotcodesModule = AngularDotcodesModule;
exports.ɵa = DotcodePipe;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmRvdC1hbmd1bGFyLWRvdGNvZGVzLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvbW9kZWxzL2NvbmZpZy50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvYW5ndWxhci1kb3Rjb2Rlcy5zZXJ2aWNlLnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9hbmd1bGFyLWRvdGNvZGVzLmNvbXBvbmVudC50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvZG90Y29kZXMtc2VsZWN0L2RvdGNvZGVzLXNlbGVjdC5jb21wb25lbnQudHMiLCJuZzovL0BmZG90L2FuZ3VsYXItZG90Y29kZXMvbGliL2RvdGNvZGUucGlwZS50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvYW5ndWxhci1kb3Rjb2Rlcy5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENvbmZpZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaG9zdDogc3RyaW5nLCBwdWJsaWMgYXBpS2V5OiBzdHJpbmcsIHB1YmxpYyB1c2VEZWZhdWx0U2VsZWN0OiBib29sZWFuLFxyXG4gICAgICAgIHB1YmxpYyBkZWZhdWx0U2VsZWN0VGV4dDogc3RyaW5nKSB7XHJcblxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgRG90Q29kZSxcclxuICBSZWxhdGVkQ29kZVxyXG59IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29uZmlnJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgY29kZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8RG90Q29kZVtdPj4oKTtcclxuICBwcml2YXRlIGNvZGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8RG90Q29kZT4+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IENvbmZpZykge1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0NhbGwgQW5ndWxhckRvdGNvZGVzU2VydmljZSB3aXRoIGZvciByb290IHBhc3NpbmcgaW4gdGhlIGNvbmZpZyBvYmplY3QnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldENvZGVcclxuICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uIG5hbWUgdG8gZ2V0IERvdGNvZGUgZnJvbVxyXG4gICogQHBhcmFtIGNvZGVWYWx1ZSBUaGUgY29kZSB2YWx1ZSB0byByZXRyaWV2ZVxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIEdldENvZGUoY29sdW1uOiBzdHJpbmcsIGNvZGVWYWx1ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxEb3RDb2RlPiB7XHJcbiAgICBjb25zdCBrZXkgPSBgJHtjb2x1bW59LSR7Y29kZVZhbHVlfWA7XHJcblxyXG4gICAgaWYgKHRoaXMuY29kZUNhY2hlLmdldChrZXkpKSB7XHJcbiAgICAgIHRoaXMuY29kZUNhY2hlLmdldChgJHtjb2x1bW59LSR7Y29kZVZhbHVlfWApO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbikpIHtcclxuICAgICAgY29uc3QgY29kZXMgPSB0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbikudmFsdWU7XHJcbiAgICAgIGlmIChjb2Rlcykge1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSBjb2Rlcy5maWx0ZXIoYyA9PiBjLnZhbHVlID09PSBjb2RlVmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoY29kZSAmJiBjb2RlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvZGVDYWNoZS5zZXQoa2V5LCBuZXcgQmVoYXZpb3JTdWJqZWN0PERvdENvZGU+KG51bGwpKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KS5uZXh0KGNvZGVbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRDb2RlcyhrZXksIGNvbHVtbiwgY29kZVZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2FkQ29kZXMoa2V5LCBjb2x1bW4sIGNvZGVWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubG9hZENvZGVzKGtleSwgY29sdW1uLCBjb2RlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZENvZGVzKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZywgY29kZVZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY29kZUNhY2hlLnNldChrZXksIG5ldyBCZWhhdmlvclN1YmplY3Q8RG90Q29kZT4obnVsbCkpO1xyXG5cclxuICAgIGNvbnN0IHVyaSA9IGAvR2V0Q29kZWA7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuXHJcbiAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQgJiYgY29sdW1uICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvbHVtbicsIGNvbHVtbiArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChjb2RlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2RlVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29kZVZhbHVlJywgY29kZVZhbHVlICsgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VuZFJlcXVlc3Q8RG90Q29kZT4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS50b1Byb21pc2UoKS50aGVuKGIgPT4ge1xyXG4gICAgICBpZiAoYiAmJiBiLmJvZHkpIHtcclxuICAgICAgICB0aGlzLmNvZGVDYWNoZS5nZXQoa2V5KS5uZXh0KGIuYm9keSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAqIE1ldGhvZCBHZXRDb2Rlc1xyXG4gICogQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFtZSB0byBnZXQgRG90Y29kZSBmcm9tXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0Q29kZXMoY29sdW1uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvdENvZGVbXT4ge1xyXG4gICAgaWYgKHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKSkge1xyXG4gICAgICB0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvZGVzQ2FjaGUuc2V0KGNvbHVtbiwgbmV3IEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlW10+KG51bGwpKTtcclxuXHJcbiAgICAgIGNvbnN0IHVyaSA9IGAvR2V0Q29kZXNgO1xyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQgJiYgY29sdW1uICE9PSBudWxsKSB7XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29sdW1uJywgY29sdW1uICsgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VuZFJlcXVlc3Q8RG90Q29kZVtdPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4oYiA9PiB7XHJcbiAgICAgICAgaWYgKGIgJiYgYi5ib2R5KSB7XHJcbiAgICAgICAgICB0aGlzLmNvZGVzQ2FjaGUuZ2V0KGNvbHVtbikubmV4dChiLmJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldFJlbGF0ZWRDb2Rlc1xyXG4gICogQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFtZSBmb3IgZG90Y29kZVxyXG4gICogQHBhcmFtIGNvZGVWYWx1ZSBEb3RDb2RlIHZhbHVlIHRvIGdldCByZWxhdGVkIGNvZGVzIGZvclxyXG4gICogQHBhcmFtIHJlbGF0ZWRDb2RlIFJlbGF0ZWQgQ29sdW1uIG5hbWUgdG8gZ2V0IFJlbGF0ZWQgQ29kZXMgZnJvbVxyXG4gICogQHJldHVybiBGdWxsIEhUVFAgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZVxyXG4gICovXHJcbiAgcHVibGljIEdldFJlbGF0ZWRDb2Rlcyhjb2x1bW46IHN0cmluZywgY29kZVZhbHVlOiBzdHJpbmcsIHJlbGF0ZWRDb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFJlbGF0ZWRDb2RlW10+IHtcclxuICAgIGNvbnN0IHVyaSA9IGAvR2V0UmVsYXRlZENvZGVzYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGNvbHVtbiAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbiAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb2x1bW4nLCBjb2x1bW4gKyAnJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoY29kZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgY29kZVZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvZGVWYWx1ZScsIGNvZGVWYWx1ZSArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChyZWxhdGVkQ29kZSAhPT0gdW5kZWZpbmVkICYmIHJlbGF0ZWRDb2RlICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ3JlbGF0ZWRDb2RlJywgcmVsYXRlZENvZGUgKyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3Q8UmVsYXRlZENvZGVbXT4oJ2dldCcsIHVyaSwgaGVhZGVycywgcGFyYW1zLCBudWxsKS5waXBlKFxyXG4gICAgICBtYXAoYiA9PiB7XHJcbiAgICAgICAgaWYgKGIgJiYgYi5ib2R5KSB7XHJcbiAgICAgICAgICByZXR1cm4gYi5ib2R5O1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kUmVxdWVzdDxUPihtZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcsIGhlYWRlcnM6IEh0dHBIZWFkZXJzLCBwYXJhbXM6IEh0dHBQYXJhbXMsIGJvZHk6IGFueSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFQ+PiB7XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ09jcC1BcGltLVN1YnNjcmlwdGlvbi1LZXknLCB0aGlzLmNvbmZpZy5hcGlLZXkpO1xyXG4gICAgaWYgKG1ldGhvZCA9PT0gJ2dldCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAncHV0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwb3N0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4odGhpcy5jb25maWcuaG9zdCArIHVyaSwgYm9keSxcclxuICAgICAgICB7IGhlYWRlcnM6IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnZGVsZXRlJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCB7IGhlYWRlcnM6IGhlYWRlcnMsIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgcmVxdWVzdDogJyArIG1ldGhvZCk7XHJcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG90Q29kZSB9IGZyb20gJy4vbW9kZWxzL2RvdGNvZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZmRvdC1hbmd1bGFyLWRvdGNvZGVzJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNwYW4gKm5nSWY9XCJjb2RlXCI+XHJcbiAgICB7e2NvZGUuZGVzY3JpcHRpb259fVxyXG4gICAgPC9zcGFuPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29kZTogRG90Q29kZTtcclxuXHJcbiAgQElucHV0KClcclxuICBjb2x1bW46IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIHZhbHVlOiBzdHJpbmc7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRvdGNvZGVTZXJ2aWNlOiBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnaW5pdCcpO1xyXG4gICAgdGhpcy5kb3Rjb2RlU2VydmljZS5HZXRDb2RlKHRoaXMuY29sdW1uLCB0aGlzLnZhbHVlKS5zdWJzY3JpYmUoY29kZSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGNvZGUpO1xyXG4gICAgICB0aGlzLmNvZGUgPSBjb2RlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLy4uL21vZGVscy9jb25maWcnO1xyXG5pbXBvcnQgeyBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIH0gZnJvbSAnLi8uLi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEb3RDb2RlIH0gZnJvbSAnLi8uLi9tb2RlbHMvZG90Y29kZS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZmRvdC1kb3Rjb2Rlcy1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlOiBgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29kZVwiIChjaGFuZ2UpPVwiY29kZUNoYW5nZWQoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XHJcbiAgPG9wdGlvbiAqbmdJZj1cInVzZURlZmF1bHRTZWxlY3RcIiB2YWx1ZT1cIlwiPlxyXG4gICAge3tkZWZhdWx0U2VsZWN0VGV4dH19XHJcbiAgPC9vcHRpb24+XHJcbiAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29kZSBvZiBjb2Rlc1wiIFtuZ1ZhbHVlXT1cImNvZGVcIj5cclxuICAgIHt7Y29kZS5kZXNjcmlwdGlvbn19XHJcbiAgPC9vcHRpb24+XHJcbjwvc2VsZWN0PlxyXG5gLFxyXG4gIHN0eWxlczogW2BgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG90Y29kZXNTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xyXG4gIGNvZGVzOiBEb3RDb2RlW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29sdW1uOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZhbHVlKHZhbHVlKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5zZXRTZWxlY3RlZENvZGUoKTtcclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkRG90Y29kZSA9IG5ldyBFdmVudEVtaXR0ZXI8RG90Q29kZT4oKTtcclxuICBzZWxlY3RlZENvZGU6IERvdENvZGU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdXNlRGVmYXVsdFNlbGVjdD86IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBkZWZhdWx0U2VsZWN0VGV4dD86IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkb3RDb2RlU2VydmljZTogQW5ndWxhckRvdGNvZGVzU2VydmljZSwgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSBjb25maWc6IENvbmZpZykge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcclxuICAgIGlmICghKHRoaXMudXNlRGVmYXVsdFNlbGVjdCA9PT0gZmFsc2UgfHwgPGFueT50aGlzLnVzZURlZmF1bHRTZWxlY3QgPT09ICdmYWxzZScpXHJcbiAgICAgICYmIHRoaXMuY29uZmlnICE9IG51bGwgJiYgdGhpcy5jb25maWcudXNlRGVmYXVsdFNlbGVjdCkge1xyXG4gICAgICB0aGlzLnVzZURlZmF1bHRTZWxlY3QgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51c2VEZWZhdWx0U2VsZWN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZGVmYXVsdFNlbGVjdFRleHQgJiYgdGhpcy5jb25maWcgIT0gbnVsbCAmJiB0aGlzLmNvbmZpZy5kZWZhdWx0U2VsZWN0VGV4dCkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRTZWxlY3RUZXh0ID0gdGhpcy5jb25maWcuZGVmYXVsdFNlbGVjdFRleHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRvdENvZGVTZXJ2aWNlLkdldENvZGVzKHRoaXMuY29sdW1uKS5zdWJzY3JpYmUoY29kZXMgPT4ge1xyXG4gICAgICB0aGlzLmNvZGVzID0gY29kZXM7XHJcblxyXG4gICAgICB0aGlzLnNldFNlbGVjdGVkQ29kZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGVkQ29kZSgpIHtcclxuICAgIGlmICghdGhpcy5jb2Rlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICBjb25zdCBjb2RlID0gdGhpcy5jb2Rlcy5maW5kKGMgPT4gYy52YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XHJcblxyXG4gICAgICBpZiAoY29kZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2RlID0gY29kZTtcclxuICAgICAgICB0aGlzLmNvZGVDaGFuZ2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb2RlQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREb3Rjb2RlLmVtaXQodGhpcy5zZWxlY3RlZENvZGUpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ2RvdGNvZGUnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG90Y29kZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRvdGNvZGVTZXJ2aWNlOiBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlKSB7IH1cclxuXHJcbiAgdHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmRvdGNvZGVTZXJ2aWNlLkdldENvZGUoY29sdW1uLCB2YWx1ZSkucGlwZShtYXAoYyA9PiB7XHJcbiAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgcmV0dXJuIGMuZGVzY3JpcHRpb247XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc0NvbXBvbmVudCB9IGZyb20gJy4vYW5ndWxhci1kb3Rjb2Rlcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlLCBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBEb3Rjb2Rlc1NlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vZG90Y29kZXMtc2VsZWN0L2RvdGNvZGVzLXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRG90Y29kZVBpcGUgfSBmcm9tICcuL2RvdGNvZGUucGlwZSc7XHJcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vbW9kZWxzL2NvbmZpZyc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlLCBDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtBbmd1bGFyRG90Y29kZXNDb21wb25lbnQsIERvdGNvZGVzU2VsZWN0Q29tcG9uZW50LCBEb3Rjb2RlUGlwZV0sXHJcbiAgZXhwb3J0czogW0FuZ3VsYXJEb3Rjb2Rlc0NvbXBvbmVudCwgRG90Y29kZXNTZWxlY3RDb21wb25lbnQsIERvdGNvZGVQaXBlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckRvdGNvZGVzTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IENvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmdNb2R1bGU6IEFuZ3VsYXJEb3Rjb2Rlc01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbQW5ndWxhckRvdGNvZGVzU2VydmljZSxcclxuICAgICAgICB7IHByb3ZpZGU6ICdjb25maWcnLCB1c2VWYWx1ZTogY29uZmlnIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbIkJlaGF2aW9yU3ViamVjdCIsIkh0dHBIZWFkZXJzIiwiSHR0cFBhcmFtcyIsIm1hcCIsIk9ic2VydmFibGUiLCJJbmplY3RhYmxlIiwiSHR0cENsaWVudCIsIkluamVjdCIsIkNvbXBvbmVudCIsIklucHV0IiwiRXZlbnRFbWl0dGVyIiwiT3V0cHV0IiwiUGlwZSIsIk5nTW9kdWxlIiwiSHR0cENsaWVudE1vZHVsZSIsIkNvbW1vbk1vZHVsZSIsIkZvcm1zTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsUUFBQTtRQUNJLGdCQUFtQixJQUFZLEVBQVMsTUFB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