acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
223 lines (222 loc) • 30.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable, Inject } from '@angular/core';
import { Template } from '../../../core/models/template.model';
import { Metadata } from '../../../core/metadata/models/metadata-model';
import { DiagramService } from './diagram.service';
import { CreationServiceInjectorToken } from '../../constants';
import { ArrayCheckerService } from './array-checker.service';
import { DecisionPointsCreationService } from './decision-points-creation.service';
import { Rules } from '../../../core/rules/models/rules.model';
import { TemplatePartial } from '../../../core/endpoint/template-partial';
export class TemplateManagerService {
/**
* @param {?} diagramService
* @param {?} elememtcreationService
* @param {?} arrayCheckerService
* @param {?} decisionPointsCreationService
*/
constructor(diagramService, elememtcreationService, arrayCheckerService, decisionPointsCreationService) {
this.diagramService = diagramService;
this.elememtcreationService = elememtcreationService;
this.arrayCheckerService = arrayCheckerService;
this.decisionPointsCreationService = decisionPointsCreationService;
this.endPointXMLString = [];
this.stringParser = require('string');
}
/**
* @param {?} templateContent
* @return {?}
*/
getTemplate(templateContent) {
const /** @type {?} */ template = new Template();
let /** @type {?} */ templateContentAsJSON;
templateContentAsJSON = this.parseToJson(templateContent);
if (template === undefined) {
throw new Error('Unable to parse the template');
}
template.metadata = this.getMetaData(templateContentAsJSON.Metadata);
template.dataElements = this.getDataElements(templateContentAsJSON.DataElements);
if (templateContentAsJSON.Rules) {
template.rules = new Rules();
template.rules.decisionPoints = this.decisionPointsCreationService.
createDecisionPoints(templateContentAsJSON.Rules.DecisionPoint);
}
template.templatePartial = this.returnEndpoints(templateContent);
template.endPointsString = this.endPointXMLString;
template.xmlContent = templateContent;
// console.log(template.templatePartial);
//console.log(template.endPointsString);
return template;
}
/**
* @param {?} templatePartialJSON
* @return {?}
*/
getTemplatePartial(templatePartialJSON) {
const /** @type {?} */ templatePartial = new TemplatePartial;
templatePartial.id = templatePartialJSON.Attr.Id;
templatePartial.sectionIfNotValue = templatePartialJSON.SectionIfValueNot;
templatePartial.sectionIfValues = templatePartialJSON.SectionIfValue;
return templatePartial;
}
/**
* @param {?} content
* @param {?} startToken
* @param {?} endToken
* @return {?}
*/
returnEndPointContents(content, startToken, endToken) {
const /** @type {?} */ contents = new Array();
let /** @type {?} */ templateSearchIndexPosition = 0;
while (true) {
const /** @type {?} */ contentStartPosition = content.indexOf(startToken, templateSearchIndexPosition);
const /** @type {?} */ contentEndPosition = content.indexOf(endToken, templateSearchIndexPosition);
if (contentStartPosition >= 0 && contentEndPosition >= 0) {
const /** @type {?} */ endPosition = contentEndPosition + endToken.length;
const /** @type {?} */ contentData = content.substring(contentStartPosition, endPosition);
contents.push(contentData);
templateSearchIndexPosition = endPosition + 1;
}
else {
break;
}
}
return contents;
}
/**
* @param {?} templatePartialArray
* @return {?}
*/
returnTemplatePartials(templatePartialArray) {
const /** @type {?} */ templatePartials = new Array();
for (const /** @type {?} */ arrayItem of templatePartialArray) {
const /** @type {?} */ templatePartial = new TemplatePartial();
const /** @type {?} */ templatePartialAsJSON = this.parseToJson(arrayItem);
templatePartial.id = templatePartialAsJSON.Attr.Id;
}
return templatePartials;
}
/**
* @param {?} xmlData
* @return {?}
*/
returnEndpoints(xmlData) {
const /** @type {?} */ endPointStartToken = '<EndPoints>';
const /** @type {?} */ endPointEndToken = '</EndPoints>';
const /** @type {?} */ endPointStartTokenPosition = xmlData.indexOf(endPointStartToken);
const /** @type {?} */ endPointEndTokenPosition = xmlData.indexOf(endPointEndToken);
if (endPointStartTokenPosition >= 0 && endPointEndTokenPosition >= 0) {
const /** @type {?} */ contentStartPosition = (endPointStartTokenPosition + endPointStartToken.length);
const /** @type {?} */ endPointContent = xmlData.substring(contentStartPosition, endPointEndTokenPosition);
if (endPointContent.length > 0) {
const /** @type {?} */ templatePartials = this.returnEndPointContents(endPointContent, '<TemplatePartial', '</TemplatePartial>');
this.endPointXMLString = this.returnEndPointContents(endPointContent, '<EndPoint', '</EndPoint>');
return templatePartials;
}
}
}
/**
* @param {?} xmlData
* @return {?}
*/
parseToJson(xmlData) {
let /** @type {?} */ jsonResult;
const /** @type {?} */ parseString = require('xml2js').parseString;
parseString(xmlData, { explicitRoot: false, explicitArray: false, attrkey: 'Attr' }, function (err, result) {
jsonResult = result;
});
return jsonResult;
}
/**
* @param {?} metadataJSON
* @return {?}
*/
getMetaData(metadataJSON) {
const /** @type {?} */ metadata = new Metadata();
metadata.label = metadataJSON.Label;
metadata.id = metadataJSON.ID;
metadata.schemaVersion = metadataJSON.SchemaVersion;
metadata.ruleVersion = metadataJSON.RuleVersion;
const /** @type {?} */ diagramsAsJSON = metadataJSON.Info.Diagrams.Diagram;
metadata.diagrams = this.diagramService.returnDiagrams(diagramsAsJSON);
metadata.approvedBy = metadataJSON.ApprovedBy;
metadata.createdDate = metadataJSON.CreatedDate;
metadata.lastModifiedDate = metadataJSON.LastModifiedDate;
metadata.reviewedBy = metadataJSON.ReviewedBy;
metadata.developedBy = metadataJSON.DevelopedBy;
metadata.radElementSetID = metadataJSON.RadElementSetID;
return metadata;
}
/**
* @param {?} elementType
* @param {?} dataElementsJSON
* @return {?}
*/
returnDataElement(elementType, dataElementsJSON) {
const /** @type {?} */ dataElements = new Array();
let /** @type {?} */ dataElementCreationServiceInstance;
for (const /** @type {?} */ dataElementCreationService of this.elememtcreationService) {
if (dataElementCreationService.elementType === elementType) {
dataElementCreationServiceInstance = dataElementCreationService;
break;
}
}
if (dataElementCreationServiceInstance !== undefined && dataElementsJSON !== undefined) {
if (this.arrayCheckerService.isArray(dataElementsJSON)) {
for (const /** @type {?} */ dataElementJSON of dataElementsJSON) {
const /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementJSON);
dataElements.push(dataElement);
}
}
else {
const /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementsJSON);
dataElements.push(dataElement);
}
}
return dataElements;
}
/**
* @param {?} dataElementsJSON
* @return {?}
*/
getDataElements(dataElementsJSON) {
let /** @type {?} */ dataElements = new Array();
dataElements = dataElements.concat(this.returnDataElement('ChoiceDataElement', dataElementsJSON.ChoiceDataElement));
dataElements = dataElements.concat(this.returnDataElement('MultiChoiceDataElement', dataElementsJSON.MultiChoiceDataElement));
dataElements = dataElements.concat(this.returnDataElement('NumericDataElement', dataElementsJSON.NumericDataElement));
dataElements = dataElements.concat(this.returnDataElement('GlobalValue', dataElementsJSON.GlobalValue));
dataElements = dataElements.concat(this.returnDataElement('ComputedDataElement', dataElementsJSON.ComputedDataElement));
dataElements = dataElements.concat(this.returnDataElement('IntegerDataElement', dataElementsJSON.IntegerDataElement));
dataElements = dataElements.concat(this.returnDataElement('DateTimeDataElement', dataElementsJSON.DateTimeDataElement));
dataElements = dataElements.concat(this.returnDataElement('DurationDataElement', dataElementsJSON.TimeSpanDataElement));
return dataElements;
}
}
TemplateManagerService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
TemplateManagerService.ctorParameters = () => [
{ type: DiagramService },
{ type: Array, decorators: [{ type: Inject, args: [CreationServiceInjectorToken,] }] },
{ type: ArrayCheckerService },
{ type: DecisionPointsCreationService }
];
function TemplateManagerService_tsickle_Closure_declarations() {
/** @type {?} */
TemplateManagerService.prototype.endPointXMLString;
/** @type {?} */
TemplateManagerService.prototype.stringParser;
/** @type {?} */
TemplateManagerService.prototype.diagramService;
/** @type {?} */
TemplateManagerService.prototype.elememtcreationService;
/** @type {?} */
TemplateManagerService.prototype.arrayCheckerService;
/** @type {?} */
TemplateManagerService.prototype.decisionPointsCreationService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtbWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy90ZW1wbGF0ZS1tYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUcsTUFBTSxFQUFHLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFPMUUsTUFBTTs7Ozs7OztJQUtKLFlBQXFCLGNBQThCLEVBQ0gsc0JBQXdELEVBQzlGLHFCQUFtRCw2QkFBNEQ7UUFGcEcsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ0gsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFrQztRQUM5Rix3QkFBbUIsR0FBbkIsbUJBQW1CO1FBQWdDLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBK0I7aUNBTm5GLEVBQUU7NEJBRVosT0FBTyxDQUFDLFFBQVEsQ0FBQztLQUlpRjs7Ozs7SUFFOUgsV0FBVyxDQUFDLGVBQXVCO1FBQ2xDLHVCQUFNLFFBQVEsR0FBRyxJQUFJ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NEI7WUFqQi9CLG1CQUFtQjtZQUNuQiw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlICwgSW5qZWN0ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1RlbXBsYXRlfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy90ZW1wbGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tZXRhZGF0YS9tb2RlbHMvbWV0YWRhdGEtbW9kZWwnO1xyXG5pbXBvcnQgeyBEaWFncmFtIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZGlhZ3JhbS5tb2RlbCc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHtEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2V9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RlY2lzaW9uLXBvaW50cy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUnVsZXMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL21vZGVscy9ydWxlcy5tb2RlbCc7XHJcbmltcG9ydCB7IGZhaWwgfSBmcm9tICdhc3NlcnQnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBhcnRpYWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3RlbXBsYXRlLXBhcnRpYWwnO1xyXG5pbXBvcnQgeyBTZWN0aW9uSWZWYWx1ZU5vdENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW5kcG9pbnQvc2VjdGlvbi1pZi12YWx1ZS1ub3QtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3NlY3Rpb24taWYtdmFsdWUtY29uZGl0aW9uJztcclxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlTWFuYWdlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgZW5kUG9pbnRYTUxTdHJpbmc6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgc3RyaW5nUGFyc2VyOiBhbnkgPSByZXF1aXJlKCdzdHJpbmcnKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSAgZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlICxcclxuICAgIEBJbmplY3QoQ3JlYXRpb25TZXJ2aWNlSW5qZWN0b3JUb2tlbikgcHJpdmF0ZSBlbGVtZW10Y3JlYXRpb25TZXJ2aWNlOiBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2VbXSAsXHJcbiAgICBwcml2YXRlIGFycmF5Q2hlY2tlclNlcnZpY2U6IEFycmF5Q2hlY2tlclNlcnZpY2UgLCBwcml2YXRlIGRlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlOiBEZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZSkgeyB9XHJcblxyXG4gIGdldFRlbXBsYXRlKHRlbXBsYXRlQ29udGVudDogc3RyaW5nKTogVGVtcGxhdGUgIHtcclxuICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoKTtcclxuICAgbGV0IHRlbXBsYXRlQ29udGVudEFzSlNPTjogYW55O1xyXG4gICB0ZW1wbGF0ZUNvbnRlbnRBc0pTT04gPSB0aGlzLnBhcnNlVG9Kc29uKHRlbXBsYXRlQ29udGVudCk7XHJcbiAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aHJvdyAgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgdGhlIHRlbXBsYXRlJyk7XHJcbiAgIH1cclxuICAgdGVtcGxhdGUubWV0YWRhdGEgPSB0aGlzLmdldE1ldGFEYXRhKHRlbXBsYXRlQ29udGVudEFzSlNPTi5NZXRhZGF0YSk7XHJcbiAgIHRlbXBsYXRlLmRhdGFFbGVtZW50cyA9IHRoaXMuZ2V0RGF0YUVsZW1lbnRzKHRlbXBsYXRlQ29udGVudEFzSlNPTi5EYXRhRWxlbWVudHMpO1xyXG4gICBpZiAodGVtcGxhdGVDb250ZW50QXNKU09OLlJ1bGVzKSB7XHJcbiAgICB0ZW1wbGF0ZS5ydWxlcyAgPSBuZXcgUnVsZXMoKTtcclxuICAgIHRlbXBsYXRlLnJ1bGVzLmRlY2lzaW9uUG9pbnRzID0gdGhpcy5kZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWNpc2lvblBvaW50cyh0ZW1wbGF0ZUNvbnRlbnRBc0pTT04uUnVsZXMuRGVjaXNpb25Qb2ludCk7XHJcbiAgfVxyXG4gICAgdGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsID0gdGhpcy5yZXR1cm5FbmRwb2ludHModGVtcGxhdGVDb250ZW50KTtcclxuICAgIHRlbXBsYXRlLmVuZFBvaW50c1N0cmluZyA9IHRoaXMuZW5kUG9pbnRYTUxTdHJpbmc7XHJcbiAgICB0ZW1wbGF0ZS54bWxDb250ZW50ID0gdGVtcGxhdGVDb250ZW50O1xyXG5cclxuLy8gY29uc29sZS5sb2codGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsKTtcclxuLy9jb25zb2xlLmxvZyh0ZW1wbGF0ZS5lbmRQb2ludHNTdHJpbmcpO1xyXG5cclxuICAgIHJldHVybiB0ZW1wbGF0ZTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRlbXBsYXRlUGFydGlhbCh0ZW1wbGF0ZVBhcnRpYWxKU09OOiBhbnkpOiBUZW1wbGF0ZVBhcnRpYWwge1xyXG4gICAgY29uc3QgdGVtcGxhdGVQYXJ0aWFsID0gbmV3IFRlbXBsYXRlUGFydGlhbDtcclxuICAgIHRlbXBsYXRlUGFydGlhbC5pZCA9IHRlbXBsYXRlUGFydGlhbEpTT04uQXR0ci5JZDtcclxuICAgIHRlbXBsYXRlUGFydGlhbC5zZWN0aW9uSWZOb3RWYWx1ZSA9IHRlbXBsYXRlUGFydGlhbEpTT04uU2VjdGlvbklmVmFsdWVOb3Q7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWwuc2VjdGlvbklmVmFsdWVzID0gdGVtcGxhdGVQYXJ0aWFsSlNPTi5TZWN0aW9uSWZWYWx1ZTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVBhcnRpYWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldHVybkVuZFBvaW50Q29udGVudHMoY29udGVudDogc3RyaW5nLCBzdGFydFRva2VuOiBzdHJpbmcsIGVuZFRva2VuOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBjb250ZW50cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdGVtcGxhdGVTZWFyY2hJbmRleFBvc2l0aW9uID0gMDtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRTdGFydFBvc2l0aW9uID0gY29udGVudC5pbmRleE9mKHN0YXJ0VG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRFbmRQb3NpdGlvbiAgPSBjb250ZW50LmluZGV4T2YoZW5kVG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcblxyXG4gICAgICAgICBpZiAoY29udGVudFN0YXJ0UG9zaXRpb24gPj0gMCAgJiYgY29udGVudEVuZFBvc2l0aW9uID49IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBjb250ZW50RW5kUG9zaXRpb24gKyBlbmRUb2tlbi5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREYXRhID0gY29udGVudC5zdWJzdHJpbmcoY29udGVudFN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgY29udGVudHMucHVzaChjb250ZW50RGF0YSk7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IGVuZFBvc2l0aW9uICsgMTtcclxuICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGNvbnRlbnRzO1xyXG4gIH1cclxuXHJcbnByaXZhdGUgcmV0dXJuVGVtcGxhdGVQYXJ0aWFscyh0ZW1wbGF0ZVBhcnRpYWxBcnJheTogc3RyaW5nW10pOiBUZW1wbGF0ZVBhcnRpYWxbXSB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbHMgPSBuZXcgQXJyYXk8VGVtcGxhdGVQYXJ0aWFsPigpO1xyXG4gICAgICBmb3IgKGNvbnN0IGFycmF5SXRlbSBvZiB0ZW1wbGF0ZVBhcnRpYWxBcnJheSkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbCA9IG5ldyBUZW1wbGF0ZVBhcnRpYWwoKTtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWxBc0pTT04gPSB0aGlzLnBhcnNlVG9Kc29uKGFycmF5SXRlbSk7XHJcbiAgICAgICAgdGVtcGxhdGVQYXJ0aWFsLmlkID0gdGVtcGxhdGVQYXJ0aWFsQXNKU09OLkF0dHIuSWQ7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGVtcGxhdGVQYXJ0aWFscztcclxufVxyXG5cclxuICBwcml2YXRlIHJldHVybkVuZHBvaW50cyh4bWxEYXRhOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBlbmRQb2ludFN0YXJ0VG9rZW4gPSAnPEVuZFBvaW50cz4nO1xyXG4gICAgY29uc3QgZW5kUG9pbnRFbmRUb2tlbiA9ICc8L0VuZFBvaW50cz4nO1xyXG5cclxuICAgIGNvbnN0IGVuZFBvaW50U3RhcnRUb2tlblBvc2l0aW9uID0geG1sRGF0YS5pbmRleE9mKGVuZFBvaW50U3RhcnRUb2tlbik7XHJcbiAgICBjb25zdCBlbmRQb2ludEVuZFRva2VuUG9zaXRpb24gPSB4bWxEYXRhLmluZGV4T2YoZW5kUG9pbnRFbmRUb2tlbik7XHJcbiAgICBpZiAoZW5kUG9pbnRTdGFydFRva2VuUG9zaXRpb24gPj0gMCAgJiYgZW5kUG9pbnRFbmRUb2tlblBvc2l0aW9uID49IDAgKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRTdGFydFBvc2l0aW9uID0gIChlbmRQb2ludFN0YXJ0VG9rZW5Qb3NpdGlvbiArIGVuZFBvaW50U3RhcnRUb2tlbi5sZW5ndGgpO1xyXG4gICAgICBjb25zdCBlbmRQb2ludENvbnRlbnQgPSB4bWxEYXRhLnN1YnN0cmluZyhjb250ZW50U3RhcnRQb3NpdGlvbiAsIGVuZFBvaW50RW5kVG9rZW5Qb3NpdGlvbik7XHJcbiAgICBpZiAoZW5kUG9pbnRDb250ZW50Lmxlbmd0aCA+IDAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbHMgPSB0aGlzLnJldHVybkVuZFBvaW50Q29udGVudHMoZW5kUG9pbnRDb250ZW50LCAnPFRlbXBsYXRlUGFydGlhbCcgLCAnPC9UZW1wbGF0ZVBhcnRpYWw+Jyk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kUG9pbnRYTUxTdHJpbmcgPSB0aGlzLnJldHVybkVuZFBvaW50Q29udGVudHMoZW5kUG9pbnRDb250ZW50LCAnPEVuZFBvaW50JyAsICc8L0VuZFBvaW50PicpO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlUGFydGlhbHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5wcml2YXRlIHBhcnNlVG9Kc29uKHhtbERhdGE6IHN0cmluZyk6IGFueSB7XHJcbiAgICBsZXQganNvblJlc3VsdDogSlNPTjtcclxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gIHJlcXVpcmUoJ3htbDJqcycpLnBhcnNlU3RyaW5nO1xyXG4gICAgcGFyc2VTdHJpbmcoeG1sRGF0YSwge2V4cGxpY2l0Um9vdCA6IGZhbHNlLCBleHBsaWNpdEFycmF5IDogZmFsc2UsIGF0dHJrZXkgOiAnQXR0cid9ICwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XHJcbiAgICAgICAganNvblJlc3VsdCAgPSByZXN1bHQ7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGpzb25SZXN1bHQ7XHJcbiB9XHJcblxyXG4gcHJpdmF0ZSBnZXRNZXRhRGF0YShtZXRhZGF0YUpTT046IGFueSk6IE1ldGFkYXRhIHtcclxuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7XHJcbiAgICBtZXRhZGF0YS5sYWJlbCA9IG1ldGFkYXRhSlNPTi5MYWJlbDtcclxuICAgIG1ldGFkYXRhLmlkID0gbWV0YWRhdGFKU09OLklEO1xyXG4gICAgbWV0YWRhdGEuc2NoZW1hVmVyc2lvbiA9IG1ldGFkYXRhSlNPTi5TY2hlbWFWZXJzaW9uO1xyXG4gICAgbWV0YWRhdGEucnVsZVZlcnNpb24gPSBtZXRhZGF0YUpTT04uUnVsZVZlcnNpb247XHJcbiAgICBjb25zdCBkaWFncmFtc0FzSlNPTiA9IG1ldGFkYXRhSlNPTi5JbmZvLkRpYWdyYW1zLkRpYWdyYW07XHJcbiAgICBtZXRhZGF0YS5kaWFncmFtcyA9IHRoaXMuZGlhZ3JhbVNlcnZpY2UucmV0dXJuRGlhZ3JhbXMoZGlhZ3JhbXNBc0pTT04pO1xyXG5cclxuICAgIG1ldGFkYXRhLmFwcHJvdmVkQnkgPSBtZXRhZGF0YUpTT04uQXBwcm92ZWRCeTtcclxuICAgIG1ldGFkYXRhLmNyZWF0ZWREYXRlID0gbWV0YWRhdGFKU09OLkNyZWF0ZWREYXRlO1xyXG4gICAgbWV0YWRhdGEubGFzdE1vZGlmaWVkRGF0ZSA9IG1ldGFkYXRhSlNPTi5MYXN0TW9kaWZpZWREYXRlO1xyXG4gICAgbWV0YWRhdGEucmV2aWV3ZWRCeSA9IG1ldGFkYXRhSlNPTi5SZXZpZXdlZEJ5O1xyXG4gICAgbWV0YWRhdGEuZGV2ZWxvcGVkQnkgPSBtZXRhZGF0YUpTT04uRGV2ZWxvcGVkQnk7XHJcbiAgICBtZXRhZGF0YS5yYWRFbGVtZW50U2V0SUQgPSBtZXRhZGF0YUpTT04uUmFkRWxlbWVudFNldElEO1xyXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xyXG4gfVxyXG5cclxuIHByaXZhdGUgIHJldHVybkRhdGFFbGVtZW50IChlbGVtZW50VHlwZTogc3RyaW5nLCBkYXRhRWxlbWVudHNKU09OOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnRbXSB7XHJcbiAgICBjb25zdCAgZGF0YUVsZW1lbnRzID0gbmV3IEFycmF5PEJhc2VEYXRhRWxlbWVudD4oKTtcclxuICAgIGxldCBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlOiBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2U7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIG9mIHRoaXMuZWxlbWVtdGNyZWF0aW9uU2VydmljZSkge1xyXG4gICAgICAgICAgaWYgKGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSkge1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlID0gZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgZGF0YUVsZW1lbnRzSlNPTiAhPT0gdW5kZWZpbmVkKSAge1xyXG4gICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGRhdGFFbGVtZW50c0pTT04pKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkYXRhRWxlbWVudEpTT04gb2YgZGF0YUVsZW1lbnRzSlNPTikge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhRWxlbWVudCA9IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlSW5zdGFuY2UuY3JlYXRlRWxlbWVudChkYXRhRWxlbWVudEpTT04pO1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudHMucHVzaChkYXRhRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGRhdGFFbGVtZW50ID0gZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZS5jcmVhdGVFbGVtZW50KGRhdGFFbGVtZW50c0pTT04pO1xyXG4gICAgICAgIGRhdGFFbGVtZW50cy5wdXNoKGRhdGFFbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50cztcclxuIH1cclxuXHJcbiBwcml2YXRlIGdldERhdGFFbGVtZW50cyhkYXRhRWxlbWVudHNKU09OOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnRbXSB7XHJcbiAgIGxldCAgZGF0YUVsZW1lbnRzID0gbmV3IEFycmF5PEJhc2VEYXRhRWxlbWVudD4oKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdDaG9pY2VEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uQ2hvaWNlRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdNdWx0aUNob2ljZURhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5NdWx0aUNob2ljZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnTnVtZXJpY0RhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5OdW1lcmljRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdHbG9iYWxWYWx1ZScsIGRhdGFFbGVtZW50c0pTT04uR2xvYmFsVmFsdWUpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdDb21wdXRlZERhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5Db21wdXRlZERhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnSW50ZWdlckRhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5JbnRlZ2VyRGF0YUVsZW1lbnQpKTtcclxuICAgZGF0YUVsZW1lbnRzID0gZGF0YUVsZW1lbnRzLmNvbmNhdCh0aGlzLnJldHVybkRhdGFFbGVtZW50KCdEYXRlVGltZURhdGFFbGVtZW50JywgZGF0YUVsZW1lbnRzSlNPTi5EYXRlVGltZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnRHVyYXRpb25EYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uVGltZVNwYW5EYXRhRWxlbWVudCkpO1xyXG4gICByZXR1cm4gZGF0YUVsZW1lbnRzO1xyXG4gfVxyXG59XHJcbiJdfQ==