@ruc-lib/org-chart 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/esm2020/index.mjs +4 -0
- package/esm2020/interfaces/org-chart.mjs +2 -0
- package/esm2020/lib/org-chart/org-chart.component.mjs +216 -0
- package/esm2020/lib/ruclib-org-chart.module.mjs +26 -0
- package/esm2020/ruc-lib-org-chart.mjs +5 -0
- package/esm2020/utils/chart-download.util.mjs +182 -0
- package/fesm2015/ruc-lib-org-chart.mjs +416 -0
- package/fesm2015/ruc-lib-org-chart.mjs.map +1 -0
- package/fesm2020/ruc-lib-org-chart.mjs +428 -0
- package/fesm2020/ruc-lib-org-chart.mjs.map +1 -0
- package/index.d.ts +2 -106
- package/interfaces/org-chart.d.ts +41 -0
- package/lib/org-chart/org-chart.component.d.ts +64 -0
- package/lib/ruclib-org-chart.module.d.ts +16 -0
- package/package.json +26 -11
- package/utils/chart-download.util.d.ts +8 -0
- package/fesm2022/ruc-lib-org-chart.mjs +0 -403
- package/fesm2022/ruc-lib-org-chart.mjs.map +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { jsPDF } from 'jspdf';
|
|
2
|
+
import html2canvas from 'html2canvas';
|
|
3
|
+
export const downloadChart = (chartContainer, format) => {
|
|
4
|
+
if (!chartContainer) {
|
|
5
|
+
console.error('Chart container not found!');
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
// Capture the chart container as an image (either PNG or JPEG)
|
|
9
|
+
if (format === 'pdf') {
|
|
10
|
+
createPDF(chartContainer);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
captureElementAsImage(chartContainer, format)
|
|
14
|
+
.then((imgData) => {
|
|
15
|
+
downloadImage(imgData, format); // Download as PNG or JPEG
|
|
16
|
+
})
|
|
17
|
+
.catch(handleCanvasError);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
// Capture the element as an image and return a promise
|
|
21
|
+
export const captureElementAsImage = (element, format) => {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
html2canvas(element, {
|
|
24
|
+
useCORS: true,
|
|
25
|
+
scrollX: 0,
|
|
26
|
+
scrollY: -window.scrollY,
|
|
27
|
+
logging: false,
|
|
28
|
+
backgroundColor: null,
|
|
29
|
+
})
|
|
30
|
+
.then((canvas) => {
|
|
31
|
+
const imgData = canvas.toDataURL(`image/${format}`);
|
|
32
|
+
resolve(imgData);
|
|
33
|
+
})
|
|
34
|
+
.catch((error) => reject(error));
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
// Downloads the org chart as a PDF document.
|
|
38
|
+
export const createPDF = (element) => {
|
|
39
|
+
html2canvas(element, {
|
|
40
|
+
useCORS: true,
|
|
41
|
+
scale: 4,
|
|
42
|
+
scrollX: 0,
|
|
43
|
+
scrollY: -window.scrollY,
|
|
44
|
+
logging: false,
|
|
45
|
+
backgroundColor: null,
|
|
46
|
+
})
|
|
47
|
+
.then((canvas) => {
|
|
48
|
+
const imgData = canvas.toDataURL('image/png'); // Capture as PNG (or you can use JPEG)
|
|
49
|
+
const pdf = new jsPDF('p', 'mm', 'a4'); // Standard A4 page size
|
|
50
|
+
// Get the dimensions of the PDF page
|
|
51
|
+
const pdfWidth = pdf.internal.pageSize.width;
|
|
52
|
+
const pdfHeight = pdf.internal.pageSize.height;
|
|
53
|
+
const canvasWidth = canvas.width;
|
|
54
|
+
const canvasHeight = canvas.height;
|
|
55
|
+
const aspectRatio = canvasWidth / canvasHeight;
|
|
56
|
+
let imgWidth = pdfWidth;
|
|
57
|
+
let imgHeight = pdfWidth / aspectRatio;
|
|
58
|
+
// If the image height exceeds the PDF page height, adjust it
|
|
59
|
+
if (imgHeight > pdfHeight) {
|
|
60
|
+
imgHeight = pdfHeight;
|
|
61
|
+
imgWidth = pdfHeight * aspectRatio;
|
|
62
|
+
}
|
|
63
|
+
// Add the image to the PDF
|
|
64
|
+
pdf.addImage(imgData, 'PNG', 0, 20, imgWidth, imgHeight); // Fit image on PDF page
|
|
65
|
+
pdf.save('organization-chart.pdf'); // Download the PDF
|
|
66
|
+
})
|
|
67
|
+
.catch(handleCanvasError);
|
|
68
|
+
};
|
|
69
|
+
// Download the captured image in the required format (PNG/JPEG)
|
|
70
|
+
export const downloadImage = (imgData, format) => {
|
|
71
|
+
const link = document.createElement('a');
|
|
72
|
+
link.href = imgData;
|
|
73
|
+
link.download = `organization-chart.${format}`;
|
|
74
|
+
link.click();
|
|
75
|
+
};
|
|
76
|
+
// Error handler for any issues during canvas generation or file creation
|
|
77
|
+
export const handleCanvasError = (error) => {
|
|
78
|
+
console.error('Error generating file:', error);
|
|
79
|
+
};
|
|
80
|
+
export const checkPropsType = (props) => {
|
|
81
|
+
if (props.isDisplayHambergerMenu !== undefined && typeof props.isDisplayHambergerMenu !== 'boolean') {
|
|
82
|
+
console.error('Error: isDisplayHambergerMenu should be a boolean.');
|
|
83
|
+
}
|
|
84
|
+
if (props.isDisplaySearchBar !== undefined && typeof props.isDisplaySearchBar !== 'boolean') {
|
|
85
|
+
console.error('Error: isDisplaySearchBar should be a boolean.');
|
|
86
|
+
}
|
|
87
|
+
if (!['portrait', 'triangle', 'landscape'].includes(props.nodeTemplate)) {
|
|
88
|
+
console.error('Error: nodeTemplate should be "portrait", "triangle", or "landscape".');
|
|
89
|
+
}
|
|
90
|
+
if (!Array.isArray(props.hambergerMenuList)) {
|
|
91
|
+
console.error('Error: hambergerMenuList should be an array.');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
props.hambergerMenuList.forEach(item => {
|
|
95
|
+
if (typeof item.label !== 'string') {
|
|
96
|
+
console.error('Error: hambergerMenuList label should be a string.');
|
|
97
|
+
}
|
|
98
|
+
if (typeof item.id !== 'number') {
|
|
99
|
+
console.error('Error: hambergerMenuList id should be a number.');
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Check if greyNodeStyle is of type CustomNodeStyle
|
|
104
|
+
const greyNodeStyle = props.greyNodeStyle;
|
|
105
|
+
if (greyNodeStyle) {
|
|
106
|
+
if (greyNodeStyle.backgroundColor && typeof greyNodeStyle.backgroundColor !== 'string') {
|
|
107
|
+
console.error('Error: greyNodeStyle.backgroundColor should be a string.');
|
|
108
|
+
}
|
|
109
|
+
if (greyNodeStyle.color && typeof greyNodeStyle.color !== 'string') {
|
|
110
|
+
console.error('Error: greyNodeStyle.color should be a string.');
|
|
111
|
+
}
|
|
112
|
+
if (greyNodeStyle.padding && typeof greyNodeStyle.padding !== 'string') {
|
|
113
|
+
console.error('Error: greyNodeStyle.padding should be a string.');
|
|
114
|
+
}
|
|
115
|
+
if (greyNodeStyle.borderRadius && typeof greyNodeStyle.borderRadius !== 'string') {
|
|
116
|
+
console.error('Error: greyNodeStyle.borderRadius should be a string.');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Check if orgData is an array of OrgDataItem objects
|
|
120
|
+
if (!Array.isArray(props.orgData)) {
|
|
121
|
+
console.error('Error: orgData should be an array.');
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
props.orgData.forEach(item => checkOrgDataItem(item));
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
export const checkOrgDataItem = (item) => {
|
|
128
|
+
if (item.label !== undefined && typeof item.label !== 'string') {
|
|
129
|
+
console.error('Error: OrgDataItem label should be a string.');
|
|
130
|
+
}
|
|
131
|
+
if (item.expanded !== undefined && typeof item.expanded !== 'boolean') {
|
|
132
|
+
console.error('Error: OrgDataItem expanded should be a boolean.');
|
|
133
|
+
}
|
|
134
|
+
if (item.description !== undefined && typeof item.description !== 'string') {
|
|
135
|
+
console.error('Error: OrgDataItem description should be a string.');
|
|
136
|
+
}
|
|
137
|
+
if (item.customNodeStyle !== undefined) {
|
|
138
|
+
const customNodeStyle = item.customNodeStyle;
|
|
139
|
+
if (customNodeStyle.backgroundColor && typeof customNodeStyle.backgroundColor !== 'string') {
|
|
140
|
+
console.error('Error: customNodeStyle.backgroundColor should be a string.');
|
|
141
|
+
}
|
|
142
|
+
if (customNodeStyle.color && typeof customNodeStyle.color !== 'string') {
|
|
143
|
+
console.error('Error: customNodeStyle.color should be a string.');
|
|
144
|
+
}
|
|
145
|
+
if (customNodeStyle.padding && typeof customNodeStyle.padding !== 'string') {
|
|
146
|
+
console.error('Error: customNodeStyle.padding should be a string.');
|
|
147
|
+
}
|
|
148
|
+
if (customNodeStyle.borderRadius && typeof customNodeStyle.borderRadius !== 'string') {
|
|
149
|
+
console.error('Error: customNodeStyle.borderRadius should be a string.');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (item.data) {
|
|
153
|
+
if (item.data.image !== undefined && typeof item.data.image !== 'string') {
|
|
154
|
+
console.error('Error: OrgDataItem data.image should be a string.');
|
|
155
|
+
}
|
|
156
|
+
if (item.data.name !== undefined && typeof item.data.name !== 'string') {
|
|
157
|
+
console.error('Error: OrgDataItem data.name should be a string.');
|
|
158
|
+
}
|
|
159
|
+
if (typeof item.data.title !== 'string') {
|
|
160
|
+
console.error('Error: OrgDataItem data.title should be a string.');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (item.children && Array.isArray(item.children)) {
|
|
164
|
+
item.children.forEach(child => checkOrgDataItem(child)); // Recursive call for children
|
|
165
|
+
}
|
|
166
|
+
if (item.originalStyle) {
|
|
167
|
+
const originalStyle = item.originalStyle;
|
|
168
|
+
if (originalStyle.backgroundColor && typeof originalStyle.backgroundColor !== 'string') {
|
|
169
|
+
console.error('Error: originalStyle.backgroundColor should be a string.');
|
|
170
|
+
}
|
|
171
|
+
if (originalStyle.color && typeof originalStyle.color !== 'string') {
|
|
172
|
+
console.error('Error: originalStyle.color should be a string.');
|
|
173
|
+
}
|
|
174
|
+
if (originalStyle.padding && typeof originalStyle.padding !== 'string') {
|
|
175
|
+
console.error('Error: originalStyle.padding should be a string.');
|
|
176
|
+
}
|
|
177
|
+
if (originalStyle.borderRadius && typeof originalStyle.borderRadius !== 'string') {
|
|
178
|
+
console.error('Error: originalStyle.borderRadius should be a string.');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtZG93bmxvYWQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jaGFydC1kb3dubG9hZC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGNBQTJCLEVBQUUsTUFBOEIsRUFBUSxFQUFFO0lBQ2pHLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVDLE9BQU87S0FDUjtJQUVELCtEQUErRDtJQUMvRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7UUFDcEIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQzNCO1NBQU07UUFDTCxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2FBQzFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDLENBQUE7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLE1BQXNCLEVBQW1CLEVBQUU7SUFDckcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztZQUN4QixPQUFPLEVBQUUsS0FBSztZQUNk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YUFBYSxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDaEYsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQ3hFO0tBQ0Y7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqc1BERiB9IGZyb20gJ2pzcGRmJztcclxuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcclxuaW1wb3J0IHsgT3JnRGF0YSwgT3JnRGF0YUl0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL29yZy1jaGFydCc7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkQ2hhcnQgPSAoY2hhcnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnIHwgJ3BkZicpOiB2b2lkID0+IHtcclxuICBpZiAoIWNoYXJ0Q29udGFpbmVyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdDaGFydCBjb250YWluZXIgbm90IGZvdW5kIScpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2FwdHVyZSB0aGUgY2hhcnQgY29udGFpbmVyIGFzIGFuIGltYWdlIChlaXRoZXIgUE5HIG9yIEpQRUcpXHJcbiAgaWYgKGZvcm1hdCA9PT0gJ3BkZicpIHtcclxuICAgIGNyZWF0ZVBERihjaGFydENvbnRhaW5lcik7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNhcHR1cmVFbGVtZW50QXNJbWFnZShjaGFydENvbnRhaW5lciwgZm9ybWF0KVxyXG4gICAgICAudGhlbigoaW1nRGF0YSkgPT4ge1xyXG4gICAgICAgIGRvd25sb2FkSW1hZ2UoaW1nRGF0YSwgZm9ybWF0KTsgLy8gRG93bmxvYWQgYXMgUE5HIG9yIEpQRUdcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGhhbmRsZUNhbnZhc0Vycm9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIENhcHR1cmUgdGhlIGVsZW1lbnQgYXMgYW4gaW1hZ2UgYW5kIHJldHVybiBhIHByb21pc2VcclxuZXhwb3J0IGNvbnN0IGNhcHR1cmVFbGVtZW50QXNJbWFnZSA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZm9ybWF0OiAncG5nJyB8ICdqcGVnJyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGh0bWwyY2FudmFzKGVsZW1lbnQsIHtcclxuICAgICAgdXNlQ09SUzogdHJ1ZSxcclxuICAgICAgc2Nyb2xsWDogMCxcclxuICAgICAgc2Nyb2xsWTogLXdpbmRvdy5zY3JvbGxZLFxyXG4gICAgICBsb2dnaW5nOiBmYWxzZSxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKGNhbnZhcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke2Zvcm1hdH1gKTtcclxuICAgICAgICByZXNvbHZlKGltZ0RhdGEpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8gRG93bmxvYWRzIHRoZSBvcmcgY2hhcnQgYXMgYSBQREYgZG9jdW1lbnQuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVQREYgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcclxuICBodG1sMmNhbnZhcyhlbGVtZW50LCB7XHJcbiAgICB1c2VDT1JTOiB0cnVlLFxyXG4gICAgc2NhbGU6IDQsIFxyXG4gICAgc2Nyb2xsWDogMCxcclxuICAgIHNjcm9sbFk6IC13aW5kb3cuc2Nyb2xsWSxcclxuICAgIGxvZ2dpbmc6IGZhbHNlLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gIH0pXHJcbiAgICAudGhlbigoY2FudmFzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTsgLy8gQ2FwdHVyZSBhcyBQTkcgKG9yIHlvdSBjYW4gdXNlIEpQRUcpXHJcbiAgICAgIGNvbnN0IHBkZiA9IG5ldyBqc1BERigncCcsICdtbScsICdhNCcpOyAvLyBTdGFuZGFyZCBBNCBwYWdlIHNpemVcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUERGIHBhZ2VcclxuICAgICAgY29uc3QgcGRmV2lkdGggPSBwZGYuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XHJcbiAgICAgIGNvbnN0IHBkZkhlaWdodCA9IHBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gY2FudmFzV2lkdGggLyBjYW52YXNIZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgaW1nV2lkdGggPSBwZGZXaWR0aDtcclxuICAgICAgbGV0IGltZ0hlaWdodCA9IHBkZldpZHRoIC8gYXNwZWN0UmF0aW87XHJcblxyXG4gICAgICAvLyBJZiB0aGUgaW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdGhlIFBERiBwYWdlIGhlaWdodCwgYWRqdXN0IGl0XHJcbiAgICAgIGlmIChpbWdIZWlnaHQgPiBwZGZIZWlnaHQpIHtcclxuICAgICAgICBpbWdIZWlnaHQgPSBwZGZIZWlnaHQ7XHJcbiAgICAgICAgaW1nV2lkdGggPSBwZGZIZWlnaHQgKiBhc3BlY3RSYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIHRoZSBpbWFnZSB0byB0aGUgUERGXHJcbiAgICAgIHBkZi5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMCwgMjAsIGltZ1dpZHRoLCBpbWdIZWlnaHQpOyAvLyBGaXQgaW1hZ2Ugb24gUERGIHBhZ2VcclxuICAgICAgcGRmLnNhdmUoJ29yZ2FuaXphdGlvbi1jaGFydC5wZGYnKTsgLy8gRG93bmxvYWQgdGhlIFBERlxyXG4gICAgfSlcclxuICAgIC5jYXRjaChoYW5kbGVDYW52YXNFcnJvcik7XHJcbn1cclxuXHJcbi8vIERvd25sb2FkIHRoZSBjYXB0dXJlZCBpbWFnZSBpbiB0aGUgcmVxdWlyZWQgZm9ybWF0IChQTkcvSlBFRylcclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkSW1hZ2UgPSAoaW1nRGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnKTogdm9pZCA9PiB7XHJcbiAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICBsaW5rLmhyZWYgPSBpbWdEYXRhO1xyXG4gIGxpbmsuZG93bmxvYWQgPSBgb3JnYW5pemF0aW9uLWNoYXJ0LiR7Zm9ybWF0fWA7XHJcbiAgbGluay5jbGljaygpO1xyXG59XHJcblxyXG4vLyBFcnJvciBoYW5kbGVyIGZvciBhbnkgaXNzdWVzIGR1cmluZyBjYW52YXMgZ2VuZXJhdGlvbiBvciBmaWxlIGNyZWF0aW9uXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDYW52YXNFcnJvciA9IChlcnJvcjogYW55KTogdm9pZCA9PiB7XHJcbiAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBmaWxlOicsIGVycm9yKTtcclxufVxyXG5cclxuICBcclxuZXhwb3J0IGNvbnN0IGNoZWNrUHJvcHNUeXBlID0gKHByb3BzOiBPcmdEYXRhKTogdm9pZCA9PiB7XHJcbiAgICBpZiAocHJvcHMuaXNEaXNwbGF5SGFtYmVyZ2VyTWVudSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwcm9wcy5pc0Rpc3BsYXlIYW1iZXJnZXJNZW51ICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheUhhbWJlcmdlck1lbnUgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgIH1cclxuICBcclxuICAgIGlmIChwcm9wcy5pc0Rpc3BsYXlTZWFyY2hCYXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcHMuaXNEaXNwbGF5U2VhcmNoQmFyICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheVNlYXJjaEJhciBzaG91bGQgYmUgYSBib29sZWFuLicpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgaWYgKCFbJ3BvcnRyYWl0JywgJ3RyaWFuZ2xlJywgJ2xhbmRzY2FwZSddLmluY2x1ZGVzKHByb3BzLm5vZGVUZW1wbGF0ZSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG5vZGVUZW1wbGF0ZSBzaG91bGQgYmUgXCJwb3J0cmFpdFwiLCBcInRyaWFuZ2xlXCIsIG9yIFwibGFuZHNjYXBlXCIuJyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcHMuaGFtYmVyZ2VyTWVudUxpc3QpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5oYW1iZXJnZXJNZW51TGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5sYWJlbCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5pZCAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBpZCBzaG91bGQgYmUgYSBudW1iZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIENoZWNrIGlmIGdyZXlOb2RlU3R5bGUgaXMgb2YgdHlwZSBDdXN0b21Ob2RlU3R5bGVcclxuICAgIGNvbnN0IGdyZXlOb2RlU3R5bGUgPSBwcm9wcy5ncmV5Tm9kZVN0eWxlO1xyXG4gICAgaWYgKGdyZXlOb2RlU3R5bGUpIHtcclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmV5Tm9kZVN0eWxlLmNvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBncmV5Tm9kZVN0eWxlLmNvbG9yIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JleU5vZGVTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGdyZXlOb2RlU3R5bGUucGFkZGluZyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBDaGVjayBpZiBvcmdEYXRhIGlzIGFuIGFycmF5IG9mIE9yZ0RhdGFJdGVtIG9iamVjdHNcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wcy5vcmdEYXRhKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JnRGF0YSBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5vcmdEYXRhLmZvckVhY2goaXRlbSA9PiBjaGVja09yZ0RhdGFJdGVtKGl0ZW0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICBleHBvcnQgY29uc3QgY2hlY2tPcmdEYXRhSXRlbSA9IChpdGVtOiBPcmdEYXRhSXRlbSk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5sYWJlbCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmxhYmVsICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBPcmdEYXRhSXRlbSBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmV4cGFuZGVkICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZXhwYW5kZWQgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0uZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRlc2NyaXB0aW9uIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmN1c3RvbU5vZGVTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tTm9kZVN0eWxlID0gaXRlbS5jdXN0b21Ob2RlU3R5bGU7XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXN0b21Ob2RlU3R5bGUuY29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5jb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBjdXN0b21Ob2RlU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VzdG9tTm9kZVN0eWxlLnBhZGRpbmcgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uZGF0YSkge1xyXG4gICAgICAgIGlmIChpdGVtLmRhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLmltYWdlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRhdGEuaW1hZ2Ugc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5kYXRhLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLm5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS5uYW1lIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmRhdGEudGl0bGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS50aXRsZSBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSkge1xyXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGVja09yZ0RhdGFJdGVtKGNoaWxkKSk7IC8vIFJlY3Vyc2l2ZSBjYWxsIGZvciBjaGlsZHJlblxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0ub3JpZ2luYWxTdHlsZSkge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3R5bGUgPSBpdGVtLm9yaWdpbmFsU3R5bGU7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmlnaW5hbFN0eWxlLmNvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG9yaWdpbmFsU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3JpZ2luYWxTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JpZ2luYWxTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiJdfQ==
|