@rangertechnologies/ngnxt
Version:
This library was used for creating dymanic UI based on the input JSON/data
350 lines • 36.3 kB
JavaScript
// AP-11APR25
import { Injectable } from '@angular/core';
import { v4 as uuidv4 } from 'uuid';
import * as i0 from "@angular/core";
export class TemplateService {
templates = [
{
templateId: 1,
templateName: 'Invoice',
content: 'Invoice template with customer details',
elements: [
{
type: 'Text',
questionText: 'Customer Name',
style: { showLabel: true },
size: 12
},
{
type: 'Date',
questionText: 'Invoice Date',
style: { showLabel: true }
},
{
type: 'Table',
questionText: 'Items',
fieldsMeta: JSON.stringify([
{
label: 'Item',
fieldName: 'item',
type: 'Text',
uniqueIdentifier: 'temp1'
},
{
label: 'Quantity',
fieldName: 'qty',
type: 'Number',
uniqueIdentifier: 'temp2'
}
]),
tableConfig: {
isNosIndicator: true,
addInlineRecord: true,
isPagination: true
}
}
]
},
{
templateId: 2,
templateName: 'Registration',
content: 'User registration form template',
elements: [
{
type: 'Text',
questionText: 'Full Name',
style: { showLabel: true },
size: 12
},
{
type: 'Text',
questionText: 'Email Address',
style: { showLabel: true },
size: 12
},
{
type: 'Date',
questionText: 'Date of Birth',
style: { showLabel: true }
}
]
},
{
templateId: 3,
templateName: 'Employee Detail',
content: 'Template to capture employee details',
elements: [
{
type: 'Text',
questionText: 'Employee ID',
style: { showLabel: true },
size: 6
},
{
type: 'Text',
questionText: 'Employee Name',
style: { showLabel: true },
size: 6
},
{
type: 'Table',
questionText: 'Previous Work Experience',
fieldsMeta: JSON.stringify([
{
label: 'Company Name',
fieldName: 'company',
type: 'Text',
uniqueIdentifier: 'emp1'
},
{
label: 'Years Worked',
fieldName: 'years',
type: 'Number',
uniqueIdentifier: 'emp2'
}
]),
tableConfig: {
isNosIndicator: false,
addInlineRecord: true,
isPagination: true
}
}
]
},
{
templateId: 4,
templateName: 'Feedback',
content: 'Feedback form for services or products',
elements: [
{
type: 'Text',
questionText: 'Your Name',
style: { showLabel: true },
size: 12
},
{
type: 'Text',
questionText: 'Feedback',
style: { showLabel: true },
size: 12
},
{
type: 'Table',
questionText: 'Service Ratings',
fieldsMeta: JSON.stringify([
{
label: 'Service',
fieldName: 'service',
type: 'Text',
uniqueIdentifier: 'fb1'
},
{
label: 'Rating (1-5)',
fieldName: 'rating',
type: 'Number',
uniqueIdentifier: 'fb2'
}
]),
tableConfig: {
isNosIndicator: false,
addInlineRecord: true,
isPagination: false
}
}
]
}
];
unique_id;
book;
formElements = [];
constructor() {
this.newBook();
}
getTemplates() {
return this.templates;
}
initializeElementFromTemplate(templateElement, index) {
const unique_id = uuidv4();
const baseElement = {
id: unique_id,
uid: unique_id,
type: templateElement.type,
name: null,
questionText: templateElement.questionText || null,
question: templateElement.question || null,
helpText: null,
errorMessage: null,
isReadOnly: false,
isHidden: false,
required: false,
referenceField: null,
additionalRichContent: null,
groupName: null,
isDateBackward: false,
title: null,
subTitle: null,
size: templateElement.size || 12,
isDateForward: false,
isOptional: false,
isTitle: false,
nextQuestion: null,
allowedFileExtensions: null,
questionNumber: index + 1,
order: index + 1,
style: {
labelClass: null,
labelStyle: null,
labelValueStyle: null,
inputClass: null,
inputStyle: null,
showLabel: templateElement?.style?.showLabel ?? true,
bookStyle: null,
direction: 'ltr',
questionStyle: null,
},
subText: {
endpoint: null,
variable: null,
field: null,
defaultField: null,
sourceQuestionId: null,
valueField: null,
labelField: null,
isDependentField: false,
dependentValue: null,
queryField: null,
queryValue: null,
queryValueReference: null,
uniqueKey: null,
},
imageData: null,
boolean: false,
options: templateElement.options
? this.initializeOptions(templateElement.options)
: null,
imageSize: templateElement.type === 'Image' ? { width: 150, height: 150 } : null,
tableConfig: templateElement.type === 'Table' ? {
isNosIndicator: true,
addInlineRecord: true,
isPagination: true,
actionButton: true,
isDeleteRow: true,
isEditRow: true,
searchBar: true,
isButtons: true,
itemsPerPage: 10,
} : null,
fieldsMeta: templateElement.fieldsMeta
? this.initializeFieldsMeta(templateElement.fieldsMeta)
: null,
};
return { ...baseElement, ...templateElement };
}
initializeOptions(options) {
return options.map(option => ({
...option,
id: uuidv4()
}));
}
initializeFieldsMeta(fieldsMeta) {
try {
const parsed = JSON.parse(fieldsMeta);
return parsed.map((field) => ({
...field,
uniqueIdentifier: uuidv4()
}));
}
catch (e) {
console.error('Error parsing fieldsMeta:', e);
return [];
}
}
// In TemplateService
download() {
if (!this.formElements || !Array.isArray(this.formElements)) {
console.error('Invalid formElements');
return null;
}
// Clean elements for export (same as FormBuilderService)
this.formElements.forEach(element => {
// Remove qbReferenceQuestions for 'book' type
if (element.type === 'book') {
delete element.qbReferenceQuestions;
}
// Process subText to match FormBuilderService's format
if (element.subText) {
try {
// Convert subText to object if string
element.subText = typeof element.subText === 'string'
? JSON.parse(element.subText)
: { ...element.subText };
// Convert field to array if string
if (typeof element.subText.field === 'string') {
element.subText.field = element.subText.field.split(',').map(i => i.trim());
}
// Stringify subText for storage
element.subText = JSON.stringify(element.subText);
}
catch (e) {
console.error('Error processing subText:', e);
element.subText = '{}';
}
}
});
// Update book structure (same as FormBuilderService)
if (!this.book)
this.newBook(); // Ensure book exists
if (this.book.bookQuestionsMap && this.unique_id) {
this.book.bookQuestionsMap[this.unique_id].subQuestions = this.formElements;
}
// Prepare sqOptions (same format as FormBuilderService)
const sqOptions = {};
this.formElements.forEach(element => {
if (['Dropdown', 'Radio', 'Checkbox'].includes(element.type)) {
sqOptions[element.id] = {
...element,
options: element.options?.map(opt => ({
...opt,
// Ensure UUIDs are preserved
id: opt.id || uuidv4(),
uniqueIdentifier: opt.uniqueIdentifier || uuidv4()
})) || []
};
}
});
this.book.sqOptions = sqOptions;
return JSON.parse(JSON.stringify(this.book)); // Return clean copy
}
// Add the newBook() method if missing
newBook() {
this.unique_id = uuidv4();
this.book = {
bookQuestionsMap: {
[this.unique_id]: {
subQuestions: [],
type: 'Book'
}
},
questionbook: {
action: JSON.stringify([
{ name: "Cancel", eventtoemit: "close" },
{ name: "Save", eventtoemit: "submit", method: "POST" }
])
},
records: [{
id: this.unique_id,
title: 'Untitled Template',
subQuestions: []
}]
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7QUFDYixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtwQyxNQUFNLE9BQU8sZUFBZTtJQUMxQixTQUFTLEdBQUc7UUFDVjtZQUNFLFVBQVUsRUFBRSxDQUFDO1lBQ2IsWUFBWSxFQUFFLFNBQVM7WUFDdkIsT0FBTyxFQUFFLHdDQUF3QztZQUNqRCxRQUFRLEVBQUU7Z0JBQ1I7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osWUFBWSxFQUFFLGVBQWU7b0JBQzdCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7b0JBQzFCLElBQUksRUFBRSxFQUFFO2lCQUNUO2dCQUNEO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLFlBQVksRUFBRSxjQUFjO29CQUM1QixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO2lCQUMzQjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBTztvQkFDYixZQUFZLEVBQUUsT0FBTztvQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3pCOzRCQUNFLEtBQUssRUFBRSxNQUFNOzRCQUNiLFNBQVMsRUFBRSxNQUFNOzRCQUNqQixJQUFJLEVBQUUsTUFBTTs0QkFDWixnQkFBZ0IsRUFBRSxPQUFPO3lCQUMxQjt3QkFDRDs0QkFDRSxLQUFLLEVBQUUsVUFBVTs0QkFDakIsU0FBUyxFQUFFLEtBQUs7NEJBQ2hCLElBQUksRUFBRSxRQUFROzRCQUNkLGdCQUFnQixFQUFFLE9BQU87eUJBQzFCO3FCQUNGLENBQUM7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ZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBUC0xMUFQUjI1XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVTZXJ2aWNlIHtcbiAgdGVtcGxhdGVzID0gW1xuICAgIHtcbiAgICAgIHRlbXBsYXRlSWQ6IDEsXG4gICAgICB0ZW1wbGF0ZU5hbWU6ICdJbnZvaWNlJyxcbiAgICAgIGNvbnRlbnQ6ICdJbnZvaWNlIHRlbXBsYXRlIHdpdGggY3VzdG9tZXIgZGV0YWlscycsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7IFxuICAgICAgICAgIHR5cGU6ICdUZXh0JywgXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnQ3VzdG9tZXIgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAgeyBcbiAgICAgICAgICB0eXBlOiAnRGF0ZScsIFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0ludm9pY2UgRGF0ZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUYWJsZScsXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnSXRlbXMnLFxuICAgICAgICAgIGZpZWxkc01ldGE6IEpTT04uc3RyaW5naWZ5KFtcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIGxhYmVsOiAnSXRlbScsIFxuICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdpdGVtJywgXG4gICAgICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ3RlbXAxJyBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnUXVhbnRpdHknLFxuICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdxdHknLFxuICAgICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ3RlbXAyJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHRhYmxlQ29uZmlnOiB7XG4gICAgICAgICAgICBpc05vc0luZGljYXRvcjogdHJ1ZSxcbiAgICAgICAgICAgIGFkZElubGluZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzUGFnaW5hdGlvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgdGVtcGxhdGVJZDogMixcbiAgICAgIHRlbXBsYXRlTmFtZTogJ1JlZ2lzdHJhdGlvbicsXG4gICAgICBjb250ZW50OiAnVXNlciByZWdpc3RyYXRpb24gZm9ybSB0ZW1wbGF0ZScsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0Z1bGwgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICBxdWVzdGlvblRleHQ6ICdFbWFpbCBBZGRyZXNzJyxcbiAgICAgICAgICBzdHlsZTogeyBzaG93TGFiZWw6IHRydWUgfSxcbiAgICAgICAgICBzaXplOiAxMlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ0RhdGUnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0RhdGUgb2YgQmlydGgnLFxuICAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIHRlbXBsYXRlSWQ6IDMsXG4gICAgICB0ZW1wbGF0ZU5hbWU6ICdFbXBsb3llZSBEZXRhaWwnLFxuICAgICAgY29udGVudDogJ1RlbXBsYXRlIHRvIGNhcHR1cmUgZW1wbG95ZWUgZGV0YWlscycsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0VtcGxveWVlIElEJyxcbiAgICAgICAgICBzdHlsZTogeyBzaG93TGFiZWw6IHRydWUgfSxcbiAgICAgICAgICBzaXplOiA2XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnRW1wbG95ZWUgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogNlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RhYmxlJyxcbiAgICAgICAgICBxdWVzdGlvblRleHQ6ICdQcmV2aW91cyBXb3JrIEV4cGVyaWVuY2UnLFxuICAgICAgICAgIGZpZWxkc01ldGE6IEpTT04uc3RyaW5naWZ5KFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdDb21wYW55IE5hbWUnLFxuICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdjb21wYW55JyxcbiAgICAgICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgICAgICB1bmlxdWVJZGVudGlmaWVyOiAnZW1wMSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnWWVhcnMgV29ya2VkJyxcbiAgICAgICAgICAgICAgZmllbGROYW1lOiAneWVhcnMnLFxuICAgICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ2VtcDInXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSksXG4gICAgICAgICAgdGFibGVDb25maWc6IHtcbiAgICAgICAgICAgIGlzTm9zSW5kaWNhdG9yOiBmYWxzZSxcbiAgICAgICAgICAgIGFkZElubGluZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzUGFnaW5hdGlvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgdGVtcGxhdGVJZDogNCxcbiAgICAgIHRlbXBsYXRlTmFtZTogJ0ZlZWRiYWNrJyxcbiAgICAgIGNvbnRlbnQ6ICdGZWVkYmFjayBmb3JtIGZvciBzZXJ2aWNlcyBvciBwcm9kdWN0cycsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ1lvdXIgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICBxdWVzdGlvblRleHQ6ICdGZWVkYmFjaycsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUYWJsZScsXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnU2VydmljZSBSYXRpbmdzJyxcbiAgICAgICAgICBmaWVsZHNNZXRhOiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnU2VydmljZScsXG4gICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3NlcnZpY2UnLFxuICAgICAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgICAgIHVuaXF1ZUlkZW50aWZpZXI6ICdmYjEnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1JhdGluZyAoMS01KScsXG4gICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3JhdGluZycsXG4gICAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgICB1bmlxdWVJZGVudGlmaWVyOiAnZmIyJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHRhYmxlQ29uZmlnOiB7XG4gICAgICAgICAgICBpc05vc0luZGljYXRvcjogZmFsc2UsXG4gICAgICAgICAgICBhZGRJbmxpbmVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBpc1BhZ2luYXRpb246IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICBdO1xuICB1bmlxdWVfaWQ6IGFueTtcbiAgYm9vazogYW55O1xuICBmb3JtRWxlbWVudHM6IGFueVtdID0gW107XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubmV3Qm9vaygpOyBcbiAgfVxuICBnZXRUZW1wbGF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzO1xuICB9XG4gIGluaXRpYWxpemVFbGVtZW50RnJvbVRlbXBsYXRlKHRlbXBsYXRlRWxlbWVudDogYW55LCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB1dWlkdjQoKTtcbiAgICBjb25zdCBiYXNlRWxlbWVudCA9IHtcbiAgICAgIGlkOiB1bmlxdWVfaWQsXG4gICAgICB1aWQ6IHVuaXF1ZV9pZCxcbiAgICAgIHR5cGU6IHRlbXBsYXRlRWxlbWVudC50eXBlLFxuICAgICAgbmFtZTogbnVsbCxcbiAgICAgIHF1ZXN0aW9uVGV4dDogdGVtcGxhdGVFbGVtZW50LnF1ZXN0aW9uVGV4dCB8fCBudWxsLFxuICAgICAgcXVlc3Rpb246IHRlbXBsYXRlRWxlbWVudC5xdWVzdGlvbiB8fCBudWxsLFxuICAgICAgaGVscFRleHQ6IG51bGwsXG4gICAgICBlcnJvck1lc3NhZ2U6IG51bGwsXG4gICAgICBpc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgIGlzSGlkZGVuOiBmYWxzZSxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIHJlZmVyZW5jZUZpZWxkOiBudWxsLFxuICAgICAgYWRkaXRpb25hbFJpY2hDb250ZW50OiBudWxsLFxuICAgICAgZ3JvdXBOYW1lOiBudWxsLFxuICAgICAgaXNEYXRlQmFja3dhcmQ6IGZhbHNlLFxuICAgICAgdGl0bGU6IG51bGwsXG4gICAgICBzdWJUaXRsZTogbnVsbCxcbiAgICAgIHNpemU6IHRlbXBsYXRlRWxlbWVudC5zaXplIHx8IDEyLFxuICAgICAgaXNEYXRlRm9yd2FyZDogZmFsc2UsXG4gICAgICBpc09wdGlvbmFsOiBmYWxzZSxcbiAgICAgIGlzVGl0bGU6IGZhbHNlLFxuICAgICAgbmV4dFF1ZXN0aW9uOiBudWxsLFxuICAgICAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiBudWxsLFxuICAgICAgcXVlc3Rpb25OdW1iZXI6IGluZGV4ICsgMSxcbiAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICBzdHlsZToge1xuICAgICAgICBsYWJlbENsYXNzOiBudWxsLFxuICAgICAgICBsYWJlbFN0eWxlOiBudWxsLFxuICAgICAgICBsYWJlbFZhbHVlU3R5bGU6IG51bGwsXG4gICAgICAgIGlucHV0Q2xhc3M6IG51bGwsXG4gICAgICAgIGlucHV0U3R5bGU6IG51bGwsXG4gICAgICAgIHNob3dMYWJlbDogdGVtcGxhdGVFbGVtZW50Py5zdHlsZT8uc2hvd0xhYmVsID8/IHRydWUsXG4gICAgICAgIGJvb2tTdHlsZTogbnVsbCxcbiAgICAgICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICAgICAgcXVlc3Rpb25TdHlsZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzdWJUZXh0OiB7XG4gICAgICAgIGVuZHBvaW50OiBudWxsLFxuICAgICAgICB2YXJpYWJsZTogbnVsbCxcbiAgICAgICAgZmllbGQ6IG51bGwsXG4gICAgICAgIGRlZmF1bHRGaWVsZDogbnVsbCxcbiAgICAgICAgc291cmNlUXVlc3Rpb25JZDogbnVsbCxcbiAgICAgICAgdmFsdWVGaWVsZDogbnVsbCxcbiAgICAgICAgbGFiZWxGaWVsZDogbnVsbCxcbiAgICAgICAgaXNEZXBlbmRlbnRGaWVsZDogZmFsc2UsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlOiBudWxsLFxuICAgICAgICBxdWVyeUZpZWxkOiBudWxsLFxuICAgICAgICBxdWVyeVZhbHVlOiBudWxsLFxuICAgICAgICBxdWVyeVZhbHVlUmVmZXJlbmNlOiBudWxsLFxuICAgICAgICB1bmlxdWVLZXk6IG51bGwsXG4gICAgICB9LFxuICAgICAgaW1hZ2VEYXRhOiBudWxsLFxuICAgICAgYm9vbGVhbjogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0ZW1wbGF0ZUVsZW1lbnQub3B0aW9uc1xuICAgICAgICA/IHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnModGVtcGxhdGVFbGVtZW50Lm9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGltYWdlU2l6ZTpcbiAgICAgICAgdGVtcGxhdGVFbGVtZW50LnR5cGUgPT09ICdJbWFnZScgPyB7IHdpZHRoOiAxNTAsIGhlaWdodDogMTUwIH0gOiBudWxsLFxuICAgICAgdGFibGVDb25maWc6IHRlbXBsYXRlRWxlbWVudC50eXBlID09PSAnVGFibGUnID8ge1xuICAgICAgICBpc05vc0luZGljYXRvcjogdHJ1ZSxcbiAgICAgICAgYWRkSW5saW5lUmVjb3JkOiB0cnVlLFxuICAgICAgICBpc1BhZ2luYXRpb246IHRydWUsXG4gICAgICAgIGFjdGlvbkJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgaXNEZWxldGVSb3c6IHRydWUsXG4gICAgICAgIGlzRWRpdFJvdzogdHJ1ZSxcbiAgICAgICAgc2VhcmNoQmFyOiB0cnVlLFxuICAgICAgICBpc0J1dHRvbnM6IHRydWUsXG4gICAgICAgIGl0ZW1zUGVyUGFnZTogMTAsXG4gICAgICB9IDogbnVsbCxcbiAgICAgIGZpZWxkc01ldGE6IHRlbXBsYXRlRWxlbWVudC5maWVsZHNNZXRhXG4gICAgICAgID8gdGhpcy5pbml0aWFsaXplRmllbGRzTWV0YSh0ZW1wbGF0ZUVsZW1lbnQuZmllbGRzTWV0YSlcbiAgICAgICAgOiBudWxsLFxuICAgIH07XG5cbiAgICByZXR1cm4geyAuLi5iYXNlRWxlbWVudCwgLi4udGVtcGxhdGVFbGVtZW50IH07XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnM6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIC4uLm9wdGlvbixcbiAgICAgIGlkOiB1dWlkdjQoKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZpZWxkc01ldGEoZmllbGRzTWV0YTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShmaWVsZHNNZXRhKTtcbiAgICAgIHJldHVybiBwYXJzZWQubWFwKChmaWVsZDogYW55KSA9PiAoe1xuICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogdXVpZHY0KClcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4vLyBJbiBUZW1wbGF0ZVNlcnZpY2VcbmRvd25sb2FkKCkge1xuICBpZiAoIXRoaXMuZm9ybUVsZW1lbnRzIHx8ICFBcnJheS5pc0FycmF5KHRoaXMuZm9ybUVsZW1lbnRzKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZm9ybUVsZW1lbnRzJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDbGVhbiBlbGVtZW50cyBmb3IgZXhwb3J0IChzYW1lIGFzIEZvcm1CdWlsZGVyU2VydmljZSlcbiAgdGhpcy5mb3JtRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAvLyBSZW1vdmUgcWJSZWZlcmVuY2VRdWVzdGlvbnMgZm9yICdib29rJyB0eXBlXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2Jvb2snKSB7XG4gICAgICBkZWxldGUgZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIHN1YlRleHQgdG8gbWF0Y2ggRm9ybUJ1aWxkZXJTZXJ2aWNlJ3MgZm9ybWF0XG4gICAgaWYgKGVsZW1lbnQuc3ViVGV4dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ29udmVydCBzdWJUZXh0IHRvIG9iamVjdCBpZiBzdHJpbmdcbiAgICAgICAgZWxlbWVudC5zdWJUZXh0ID0gdHlwZW9mIGVsZW1lbnQuc3ViVGV4dCA9PT0gJ3N0cmluZycgXG4gICAgICAgICAgPyBKU09OLnBhcnNlKGVsZW1lbnQuc3ViVGV4dCkgXG4gICAgICAgICAgOiB7Li4uZWxlbWVudC5zdWJUZXh0fTtcblxuICAgICAgICAvLyBDb252ZXJ0IGZpZWxkIHRvIGFycmF5IGlmIHN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuc3ViVGV4dC5maWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBlbGVtZW50LnN1YlRleHQuZmllbGQgPSBlbGVtZW50LnN1YlRleHQuZmllbGQuc3BsaXQoJywnKS5tYXAoaSA9PiBpLnRyaW0oKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdHJpbmdpZnkgc3ViVGV4dCBmb3Igc3RvcmFnZVxuICAgICAgICBlbGVtZW50LnN1YlRleHQgPSBKU09OLnN0cmluZ2lmeShlbGVtZW50LnN1YlRleHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHN1YlRleHQ6JywgZSk7XG4gICAgICAgIGVsZW1lbnQuc3ViVGV4dCA9ICd7fSc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBVcGRhdGUgYm9vayBzdHJ1Y3R1cmUgKHNhbWUgYXMgRm9ybUJ1aWxkZXJTZXJ2aWNlKVxuICBpZiAoIXRoaXMuYm9vaykgdGhpcy5uZXdCb29rKCk7IC8vIEVuc3VyZSBib29rIGV4aXN0c1xuICBcbiAgaWYgKHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwICYmIHRoaXMudW5pcXVlX2lkKSB7XG4gICAgdGhpcy5ib29rLmJvb2tRdWVzdGlvbnNNYXBbdGhpcy51bmlxdWVfaWRdLnN1YlF1ZXN0aW9ucyA9IHRoaXMuZm9ybUVsZW1lbnRzO1xuICB9XG5cbiAgLy8gUHJlcGFyZSBzcU9wdGlvbnMgKHNhbWUgZm9ybWF0IGFzIEZvcm1CdWlsZGVyU2VydmljZSlcbiAgY29uc3Qgc3FPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIHRoaXMuZm9ybUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgaWYgKFsnRHJvcGRvd24nLCAnUmFkaW8nLCAnQ2hlY2tib3gnXS5pbmNsdWRlcyhlbGVtZW50LnR5cGUpKSB7XG4gICAgICBzcU9wdGlvbnNbZWxlbWVudC5pZF0gPSB7XG4gICAgICAgIC4uLmVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnM6IGVsZW1lbnQub3B0aW9ucz8ubWFwKG9wdCA9PiAoe1xuICAgICAgICAgIC4uLm9wdCxcbiAgICAgICAgICAvLyBFbnN1cmUgVVVJRHMgYXJlIHByZXNlcnZlZFxuICAgICAgICAgIGlkOiBvcHQuaWQgfHwgdXVpZHY0KCksXG4gICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogb3B0LnVuaXF1ZUlkZW50aWZpZXIgfHwgdXVpZHY0KClcbiAgICAgICAgfSkpIHx8IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5ib29rLnNxT3B0aW9ucyA9IHNxT3B0aW9ucztcbiAgXG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuYm9vaykpOyAvLyBSZXR1cm4gY2xlYW4gY29weVxufVxuXG4vLyBBZGQgdGhlIG5ld0Jvb2soKSBtZXRob2QgaWYgbWlzc2luZ1xucHJpdmF0ZSBuZXdCb29rKCkge1xuICB0aGlzLnVuaXF1ZV9pZCA9IHV1aWR2NCgpO1xuICB0aGlzLmJvb2sgPSB7XG4gICAgYm9va1F1ZXN0aW9uc01hcDoge1xuICAgICAgW3RoaXMudW5pcXVlX2lkXToge1xuICAgICAgICBzdWJRdWVzdGlvbnM6IFtdLFxuICAgICAgICB0eXBlOiAnQm9vaydcbiAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXN0aW9uYm9vazoge1xuICAgICAgYWN0aW9uOiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgIHsgbmFtZTogXCJDYW5jZWxcIiwgZXZlbnR0b2VtaXQ6IFwiY2xvc2VcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiU2F2ZVwiLCBldmVudHRvZW1pdDogXCJzdWJtaXRcIiwgbWV0aG9kOiBcIlBPU1RcIiB9XG4gICAgICBdKVxuICAgIH0sXG4gICAgcmVjb3JkczogW3tcbiAgICAgIGlkOiB0aGlzLnVuaXF1ZV9pZCxcbiAgICAgIHRpdGxlOiAnVW50aXRsZWQgVGVtcGxhdGUnLFxuICAgICAgc3ViUXVlc3Rpb25zOiBbXVxuICAgIH1dXG4gIH07XG59XG4gIFxuICBcbn1cbiJdfQ==