@esfaenza/extensions 15.2.28 → 15.2.30
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/esm2020/lib/services/extensions.exports.service.mjs +21 -38
- package/fesm2015/esfaenza-extensions.mjs +20 -37
- package/fesm2015/esfaenza-extensions.mjs.map +1 -1
- package/fesm2020/esfaenza-extensions.mjs +20 -37
- package/fesm2020/esfaenza-extensions.mjs.map +1 -1
- package/lib/services/extensions.exports.service.d.ts +3 -4
- package/package.json +1 -1
|
@@ -156,13 +156,13 @@ export const ExportList = (order, headernavigator, valuenavigator, valueformat =
|
|
|
156
156
|
* partendo da un oggetto iniziale { Valore { A: 1, B: 2, C: 3 } }
|
|
157
157
|
*
|
|
158
158
|
* @param {number} order Ordine di esportazione. Più piccolo è, prima appare il valore
|
|
159
|
-
* @param {string}
|
|
160
|
-
* @param {string}
|
|
159
|
+
* @param {string} headerprefix Prefisso per l'header
|
|
160
|
+
* @param {string} valueprefix Prefisso per il valore
|
|
161
161
|
*/
|
|
162
|
-
export const ExportDictionary = (order,
|
|
162
|
+
export const ExportDictionary = (order, headerprefix, valueprefix) => (target, propertyKey) => {
|
|
163
163
|
Object.defineProperty(target, propertyKey + csvOrdPrefix, { value: order, writable: false });
|
|
164
|
-
Object.defineProperty(target, propertyKey + dictionaryCsvValPrefix, { value:
|
|
165
|
-
Object.defineProperty(target, propertyKey + dictionaryCsvHdrPrefix, { value:
|
|
164
|
+
Object.defineProperty(target, propertyKey + dictionaryCsvValPrefix, { value: valueprefix, writable: false });
|
|
165
|
+
Object.defineProperty(target, propertyKey + dictionaryCsvHdrPrefix, { value: headerprefix, writable: false });
|
|
166
166
|
if (target[exportList])
|
|
167
167
|
target[exportList].push(propertyKey + dictionaryCsvHdrPrefix);
|
|
168
168
|
else
|
|
@@ -394,7 +394,7 @@ export class ExportService {
|
|
|
394
394
|
//Salto 1 > diventa obj
|
|
395
395
|
//Salto 2 > diventa obj.subobj
|
|
396
396
|
//ecc...
|
|
397
|
-
jmps.forEach(pp => { clone = clone[pp]; });
|
|
397
|
+
jmps.forEach(pp => { clone = clone?.[pp]; });
|
|
398
398
|
//Valore finale :D
|
|
399
399
|
let value = clone;
|
|
400
400
|
let text = obj[prop + csvHdrPrefix];
|
|
@@ -487,39 +487,22 @@ export class ExportService {
|
|
|
487
487
|
* @param {any} obj Oggetto di cui esportare la proprietà **prop**
|
|
488
488
|
* @param {string} prop Proprietà da esportare
|
|
489
489
|
* @param {CsvHeaders} headers Contenitore degli header, verrà riempito da questa funzione
|
|
490
|
-
* @param {LocalizationService} loc Servizio di localizzazione che traduce tutti i nomi che può
|
|
491
490
|
*/
|
|
492
|
-
parseDictionary(obj, prop, headers, columnsSelection
|
|
493
|
-
let
|
|
494
|
-
let
|
|
491
|
+
parseDictionary(obj, prop, headers, columnsSelection) {
|
|
492
|
+
let headerprefix = obj[prop + dictionaryCsvHdrPrefix];
|
|
493
|
+
let valueprefix = obj[prop + dictionaryCsvValPrefix];
|
|
495
494
|
let order = obj[prop + csvOrdPrefix];
|
|
496
|
-
var
|
|
497
|
-
|
|
498
|
-
for (
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
label = !!loc ? loc.loc(tmpRes) : tmpRes;
|
|
508
|
-
else
|
|
509
|
-
label += " " + !!loc ? loc.loc(tmpRes) : tmpRes;
|
|
510
|
-
});
|
|
511
|
-
var valuesplit = valuenavigator.split(",");
|
|
512
|
-
valuesplit.forEach((t, idxinternal) => {
|
|
513
|
-
var navig = t.split("-")[1];
|
|
514
|
-
var desc = t.split("-")[0];
|
|
515
|
-
jumps = navig.split(".");
|
|
516
|
-
tmpRes = JSON.parse(JSON.stringify(listitem));
|
|
517
|
-
jumps.forEach(pp => { tmpRes = tmpRes[pp]; });
|
|
518
|
-
let value = tmpRes;
|
|
519
|
-
let propname = prop + idx.toString() + idxinternal.toString();
|
|
520
|
-
Object.defineProperty(obj, propname, { value: value ?? "", writable: false });
|
|
521
|
-
headers.push({ label: label + " " + !!loc ? loc.loc(desc) : desc, key: propname, order: order + idx, type: 'string', propKey: null });
|
|
522
|
-
});
|
|
495
|
+
var object = obj[prop];
|
|
496
|
+
let idx = 0;
|
|
497
|
+
for (const [key, val] of Object.entries(object)) {
|
|
498
|
+
// Ignoro tutti i cmapi che non fanno parte della selezione delle colonne
|
|
499
|
+
if (columnsSelection && !columnsSelection[key])
|
|
500
|
+
continue;
|
|
501
|
+
let propname = prop + "_" + key;
|
|
502
|
+
let value = valueprefix ? valueprefix + " " + val : val;
|
|
503
|
+
let label = headerprefix ? headerprefix + " " + key : key;
|
|
504
|
+
Object.defineProperty(obj, propname, { value: value ?? "", writable: false });
|
|
505
|
+
headers.push({ label: label, key: propname, order: order + idx++, type: 'string', propKey: null });
|
|
523
506
|
}
|
|
524
507
|
}
|
|
525
508
|
/**
|
|
@@ -625,4 +608,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
625
608
|
type: Injectable,
|
|
626
609
|
args: [{ providedIn: "root" }]
|
|
627
610
|
}], ctorParameters: function () { return [{ type: i1.DateService }, { type: i2.UtilityService }, { type: i3.LocalizationService }]; } });
|
|
628
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLakQsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBUS9ROzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUE4QjtJQUMvRCxPQUFPLFNBQVMsWUFBWSxDQUF3QyxXQUFjO1FBQ2hGLE9BQU8sS0FBTSxTQUFRLFdBQVc7WUFBekI7O2dCQUE0QixZQUFPLEdBQUcsR0FBRyxDQUFDO1lBQUMsQ0FBQztTQUFBLENBQUM7SUFDdEQsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQWlCLElBQUksRUFBRSxVQUFrQixJQUFJLEVBQUUsRUFBRSxDQUNyRyxDQUFDLE1BQWMsRUFBRSxXQUFtQixFQUFFLEVBQUU7SUFDdEMsSUFBSSxNQUFNO1FBQ1IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUss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QUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDcEcsQ0FBQzs7MEdBMWZVLGFBQWE7OEdBQWIsYUFBYSxjQURBLE1BQU07MkZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzZmFlbnphXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcblxyXG5pbXBvcnQgeyBleHBvcnRMaXN0LCBjc3ZGb3JtYXRQcmVmaXgsIGNzdkhkclByZWZpeCwgY3N2T3JkUHJlZml4LCBjc3ZWYWx1ZU5hdmlnYXRvciwgY3N2VmlzUHJlZml4LCBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4LCBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4LCBsaXN0Q3N2SGRyUHJlZml4LCBsaXN0Q3N2VmFsRm9ybWF0LCBsaXN0Q3N2VmFsUHJlZml4LCBjc3ZQcm9wS2V5LCBsb2NQcm9wZXJ0eSwgY3N2VmFsdWVUeXBlIH0gZnJvbSBcIi4uL21vZGVscy9FeHBvcnRDb25zdHNcIjtcclxuaW1wb3J0IHsgRGF0ZVNlcnZpY2UgfSBmcm9tICcuL2V4dGVuc2lvbnMuZGF0ZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIi4vZXh0ZW5zaW9ucy51dGlsaXRpZXMuc2VydmljZVwiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBDc3ZIZWFkZXJzIH0gZnJvbSBcIi4uL21vZGVscy9Dc3ZIZWFkZXJzXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9HZW5lcmljSXRlbVwiO1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgY2hlIGZvcm5pc2NlIGxhIGNsYXNzZSBkaSBsb2NhbGl6emF6aW9uZSBwZXIgdHV0dGUgbGUgcHJvcHJpZXTDoCBlc3BvcnRhdGUgY29uIEBFeHBvcnQgZSBxdWFsc2lhc2kgYWx0cm8gdGFnIGNoZSByaWNoaWVkYSBsb2NhbGl6emF6aW9uaS5cclxuICogXHJcbiAqIFNvc3RhbnppbGFtZW50ZSBhZ2dpdW5nZSBsYSBwcm9wcmlldMOgICoqX19sb2NfXyoqIGFsbCdvZ2dldHRvIGNyZWF0byBkYWxsYSBjbGFzc2UgY29ycmVudGUgYXNzZWduYW5kb2dsaSBjb21lIHZhbG9yZSBpbCB0aXBvIGRlbCBMb2NhbGl6YXRpb25TZXJ2aWNlIGRhIHVzYXJlIHBlciBsYSB0cmFkdXppb25lXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1R5cGU8TG9jYWxpemF0aW9uU2VydmljZT59IGxvYyBUaXBvIGVyZWRpdGF0byBkYWwgTG9jYWxpemF0aW9uU2VydmljZSBjaGUgcHXDsiBlc3NlcmUgY3JlYXRvIGEgcnVudGltZSBzb3R0byBjb250ZXN0byBkZWxsYSBESSBkaSBBbmd1bGFyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gRXhwb3J0TG9jYWxpemF0aW9uKGxvYzogVHlwZTxMb2NhbGl6YXRpb25TZXJ2aWNlPikge1xyXG4gIHJldHVybiBmdW5jdGlvbiBpbnRlZ3JhdGVMb2M8VCBleHRlbmRzIHsgbmV3KC4uLmFyZ3M6IGFueVtdKToge30gfT4oY29uc3RydWN0b3I6IFQpIHtcclxuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGNvbnN0cnVjdG9yIHsgX19sb2NfXyA9IGxvYzsgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIHByb3ByaWV0w6Agc2luZ29sYS4gXHJcbiAqIFZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBcclxuICogQWQgZXNlbXBpbywgZGEgcXVlc3RhIGNvbmZpZ3VyYXppb25lOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIEBFeHBvcnQodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIGNpYW86IHN0cmluZztcclxuICogY2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCJcclxuICogYGBgXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXIgVGl0b2xvIGRlbGxhIGNvbG9ubmEgbmVsIGZpbGUgQ1NWIGVzcG9ydGF0b1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IEZvcm1hdG8gZGkgZXNwb3J0YXppb25lLiBQdcOyIGVzc2VyZSB1biBmb3JtYXRvIGRhdGEgcGVyIGkgY2FtcGkgZGF0YSBvICdGJyBwZXIgaSBjYW1waSBmbG9hdGluZyBwb2ludFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXI6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSBudWxsLCB0YWJsZWlkOiBzdHJpbmcgPSBudWxsKSA9PlxyXG4gICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGZvcm1hdClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogISFoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIGlmICh0YWJsZWlkKVxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdlByb3BLZXksIHsgdmFsdWU6IHRhYmxlaWQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIGNzdlZpc1ByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1biBvZ2dldHRvLiBcclxuICogUGVyIG9nbmkgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKS4gXHJcbiAqIFBlciBlc3NlcmUgZXNwb3J0YXRlLCBsZSBwcm9wcmlldMOgIGRlbGwnb2dnZXR0byBkZXZvbm8gZXNzZXJlIG1hcmNhdGUgY29uIGkgRGVjb3JhdG9yaSBkaSBlc3BvcnRhemlvbmVcclxuICogXHJcbiAqIEFkIGVzZW1waW8sIGRhIHF1ZXN0YSBjb25maWd1cmF6aW9uZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBNeU9iaiB7XHJcbiAqICAgICBARXhwb3J0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogICAgIGNpYW86IHN0cmluZztcclxuICogfVxyXG4gKiBcclxuICogQEV4cG9ydE9iamVjdCh0cnVlLCBcIk15SGVhZGVyXCIpXHJcbiAqIHRlc3Q6IE15T2JqOyBcclxuICogYGBgXHJcbiAqIFxyXG4gKiBOYXNjZXJhbm5vIGxlIHNlZ3VlbnRpIHByb3ByaWV0w6AgbmVsbCdvZ2dldHRvIGVzcG9ydGFiaWxlOlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgXHJcbiAqIHRlc3RjaWFvOiBzdHJpbmc7ID0+IFZhbG9yZSBkaSBNeU9iai5jaWFvXHJcbiAqIHRlc3RjaWFvX2NzdnZpczogc3RyaW5nOyA9PiB0cnVlXHJcbiAqIHRlc3RjaWFvX2Nzdmhkcjogc3RyaW5nID0+IFwiTXlIZWFkZXJcIiBcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHthbnl9IHR5cGUgVGlwbyBkYSBlc3BvcnRhcmVcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRBcyA9IChvcmRlcjogbnVtYmVyLCB0eXBlOiBhbnksIHByZWZpeD86IHN0cmluZykgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIHZhciB0ID0gbmV3IHR5cGUoKTtcclxuICAgIHZhciBwcm9wcyA9IHRbZXhwb3J0TGlzdF07XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwcm9wID0gcHJvcHNbaV0ucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgaWYgKHR5cGVvZiB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgdmFyIHRvRW1pdDogYm9vbGVhbiA9IHRbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICAgICAgdmFyIGxibCA9IHRbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICAgICAgdmFyIG9yZGVyUHJvcCA9IHRbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcbiAgICAgICAgaWYgKGZvcm1hdClcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkZvcm1hdFByZWZpeCwgeyB2YWx1ZTogZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXJQcm9wICsgb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZhbHVlTmF2aWdhdG9yLCB7IHZhbHVlOiBwcm9wZXJ0eUtleSArIFwiLlwiICsgcHJvcCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZpc1ByZWZpeCwgeyB2YWx1ZTogdG9FbWl0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2SGRyUHJlZml4LCB7IHZhbHVlOiAocHJlZml4ID8gcHJlZml4ICsgJyAnIDogJycpICsgbGJsLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmFsdWVUeXBlLCB7IHZhbHVlOiB0eXBlLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRbZXhwb3J0TGlzdF0pXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRhcmdldFtleHBvcnRMaXN0XSA9IFtwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXhdXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1bmEgbGlzdGEsIFxyXG4gKiBzaSB1dGlsaXp6YW5vIDIgbmF2aWdhdG9yIHJpc3BldHRpdmFtZW50ZSBwZXIgbGEgdmFsb3JpenphemlvbmUgZGVsbCdIZWFkZXIgZSBkZWwgVmFsb3JlIGUgXHJcbiAqIHBlciBvZ25pIGVsZW1lbnRvIGRlbGwnYXJyYXkgdmVycmFubm8gZ2VuZXJhdGUgMyBwcm9wcmlldMOgIGNoZSBnZXN0aXJhbm5vIGwnZXNwb3J0YXppb25lOiAocHJvcCwgcHJvcF9jc3Z2aXMsIHByb3BfY3N2aGRyKVxyXG4gKiBcclxuICogQVRURU5aSU9ORTogR2xpIG9nZ2V0dGkgZXNwb3J0YXRpIGluIHF1ZXN0YSBtb2RhbGl0w6Agbm9uIGRldm9ubyBwcmVzZW50YXJlIGFsdHJpIHRhZyBkaSB0aXBvIEBFeHBvcnR7Li4ufSBhbGwnaW50ZXJuby4gRmEgdHV0dG8gcXVlc3RvIGRlY29yYXRvcmVcclxuICogXHJcbiAqIEkgbmF2aWdhdG9yIGhhbm5vIHF1ZXN0YSBjb252ZW56aW9uZTpcclxuICogXHJcbiAqIC4gLS0+IGRpdmlkZSBkdWUgcHJvcHJpZXTDoCBkYSByaWNoaWFtYXJlIGNvbnNlY3V0aXZhbWVudGU6IFwiYS5iXCIgcmljaGlhbWVyw6AgXCJvYmouYS5iXCI7XHJcbiAqIFxyXG4gKiB8IC0tPiBkaXZpZGUgcGnDuSBwcm9wcmlldMOgIHBlciBsZSBjb25jYXRlbmF6aW9uaSBjb24gdW5vIHNwYXppbyBmcmEgdW5hIGUgbCdhbHRyYTogXCJyZWdkZXNjfHNsaWNlLnNsaWNlbmFtZVwiIGRpdmVudGVyw6Agb2JqLnJlZ2Rlc2MgKyBcIiBcIiArIG9iai5zbGljZS5zbGljZW5hbWVcclxuICogXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcmRlciBPcmRpbmUgZGkgZXNwb3J0YXppb25lLiBQacO5IHBpY2NvbG8gw6gsIHByaW1hIGFwcGFyZSBpbCB2YWxvcmVcclxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcm5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdGl0b2xvIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZW5hdmlnYXRvciBOYXZpZ2F0b3IgY29sIGNvbXBpdG8gZGkgc2VsZXppb25hcmUgaWwgdmFsb3JlIHBlciBsYSBjb2xvbm5hXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZWZvcm1hdCBGb3JtYXRvIGRpIGVzcG9ydGF6aW9uZSBwZXIgaSB2YWxvcmkgc2VsZXppb25hdGkgZGFsICoqdmFsdWVuYXZpZ2F0b3IqKi4gUHXDsiBlc3NlcmUgdW4gZm9ybWF0byBkYXRhIHBlciBpIGNhbXBpIGRhdGEgbyAnRicgcGVyIGkgY2FtcGkgZmxvYXRpbmcgcG9pbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnRMaXN0ID0gKG9yZGVyOiBudW1iZXIsIGhlYWRlcm5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZW5hdmlnYXRvcjogc3RyaW5nLCB2YWx1ZWZvcm1hdDogc3RyaW5nID0gbnVsbCkgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2T3JkUHJlZml4LCB7IHZhbHVlOiBvcmRlciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2VmFsUHJlZml4LCB7IHZhbHVlOiB2YWx1ZW5hdmlnYXRvciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4LCB7IHZhbHVlOiBoZWFkZXJuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbEZvcm1hdCwgeyB2YWx1ZTogdmFsdWVmb3JtYXQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0ucHVzaChwcm9wZXJ0eUtleSArIGxpc3RDc3ZIZHJQcmVmaXgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4XVxyXG4gIH07XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuIGRpemlvbmFyaW8uIFNlIGFkIGVzZW1waW8gc2kgdm9nbGlvbm8gZ2VuZXJhcmUgbGUgY29sb25uZVxyXG4gKiBcclxuICogVmFsb3JlIEEgPSAxXHJcbiAqIFxyXG4gKiBWYWxvcmUgQiA9IDJcclxuICogXHJcbiAqIFZhbG9yZSBDID0gM1xyXG4gKiBcclxuICogcGFydGVuZG8gZGEgdW4gb2dnZXR0byBpbml6aWFsZSB7IFZhbG9yZSB7IEE6IDEsIEI6IDIsIEM6IDMgfSB9XHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydERpY3Rpb25hcnkgPSAob3JkZXI6IG51bWJlciwgaGVhZGVybmF2aWdhdG9yOiBzdHJpbmcsIHZhbHVlbmF2aWdhdG9yOiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIHNpIG9jY3VwYSBkZWxsJ2VzcG9ydGF6aW9uZSBkZWdsaSBvZ2dldHRpIG1hcmNhdGkgZGFpIERlY29yYXRvcmkgKipFeHBvcnREaWN0aW9uYXJ5KiosICoqRXhwb3J0TGlzdCoqLCAqKkV4cG9ydEFzKiogbyAqKkV4cG9ydCoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXHJcbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29zdHJ1dHRvcmVcclxuICAgKiBcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZXM6IERhdGVTZXJ2aWNlLCBwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0YSB1bmEgbGlzdGEgZGkgb2dnZXR0aSBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBpbnRlZ3JhIG9nbmkgb2dnZXR0byBjb24gbGUgcHJvcHJpZXTDoCBlc3BvcnRhYmlsaSBkYWxsYSBsaWJyZXJpYSAqKkBjdHJsL25neC1jc3YqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55W119IG9ianMgT2dnZXR0aSBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckV4cG9ydChvYmpzOiBhbnlbXSwgY29sdW1uczogc3RyaW5nW10gPSBbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBsZXQgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcbiAgICBsZXQgaGVhZGVyc0NhY2hlID0ge307XHJcblxyXG4gICAgaWYgKCFvYmpzIHx8IG9ianMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG5cclxuICAgIC8vIERldm8gcGVyIGZvcnphIGZhcmxvIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBkYXRvIGNoZSBkZXZvIGVzcG9ycmUgbGUgcHJvcHJpZXTDoCBjaGUgbWkgc2Vydm9ubyBkYSBlc3BvcnRhcmVcclxuICAgIC8vIEdsaSBoZWFkZXIgbGkgcmFjY29sZ28gdHV0dGkgcG9pIGZhY2NpbyB1YW4gZGlzdGluY3QgaW4gbW9kbyBkYSBlc3BvcnRhcmUgdHV0dGUgbGUgcHJvcHJpZXTDoCBwZXIgYmVuZVxyXG4gICAgbGV0IGNvbHVtblNlbGVjdGlvbkRpY3Rpb25hcnk6IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0gPSB7fTtcclxuXHJcbiAgICBpZiAoY29sdW1ucz8ubGVuZ3RoID4gMClcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zPy5sZW5ndGg7IGkrKylcclxuICAgICAgICBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5W2NvbHVtbnNbaV1dID0gdHJ1ZTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGhkcyA9IHRoaXMucGFyc2VBbmRHZXRIZWFkZXJzKG9ianNbaV0sIGNvbHVtblNlbGVjdGlvbkRpY3Rpb25hcnkpO1xyXG4gICAgICAvLyBBZ2dpdW5nbyBnbGkgaGVhZGVyIGZhY2VuZG8gaW4gbW9kbyBkaSBub24gYWdnaXVuZ2VybmUgbWFpIGR1ZSB1Z3VhbGkgcGVyIG5vbiBkb3ZlciBmYXJlIHVuYSBkaXN0aW5jdCBkb3BvXHJcbiAgICAgIC8vIGNoZSBjb3N0ZXJlYmJlIGNvbXVucXVlIHJpc29yc2UuIFV0aWxpenpvIHVuIGRpemlvbmFyaW8gZCdhcHBvZ2dpbyBwZXIgbG9va3VwIGlzdGFudGFuZWlcclxuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHMubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSkge1xyXG4gICAgICAgICAgaGVhZGVyc0NhY2hlW2hkc1trXS5rZXldID0gdHJ1ZTtcclxuICAgICAgICAgIGhlYWRlcnMucHVzaChoZHNba10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29sdW1ucyB8fCBjb2x1bW5zLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gU2UgbWkgYXJyaXZhIGxhIGxpc3RhIGRpIGNvbG9ubmUgbm9uIG1pIGTDoCBzb2xvIGxhIHZpc2liaWxpdMOgLCBtYSBhbmNoZSBsJ29yZGluYW1lbnRvXHJcbiAgICAgIC8vIGxlIGVzcG9ydG8gZGkgY29uc2VndWVuemFcclxuICAgICAgbGV0IG9yZGVyZWRIZWFkZXJzID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCB0aGlzSWQgPSBjb2x1bW5zW2ldO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlYWRlcnNbaV0ucHJvcEtleSA9PSB0aGlzSWQpIHtcclxuICAgICAgICAgICAgb3JkZXJlZEhlYWRlcnMucHVzaChoZWFkZXJzW2ldKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvcmRlcmVkSGVhZGVycztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJpY2kgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0dlbmVyaWNJdGVtW119IG9ianMgT2dnZXR0aSBnZW5lcmljaSBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnNbXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHVibGljIHNldHVwRm9yR2VuZXJpY0V4cG9ydChvYmpzOiBHZW5lcmljSXRlbVtdLCBjb2x1bW5zOiBDc3ZIZWFkZXJzW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgaWYgKCFvYmpzIHx8IG9ianMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG5cclxuICAgIC8vIERldm8gcGVyIGZvcnphIGZhcmxvIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBkYXRvIGNoZSBkZXZvIGVzcG9ycmUgbGUgcHJvcHJpZXTDoCBjaGUgbWkgc2Vydm9ubyBkYSBlc3BvcnRhcmVcclxuICAgIG9ianMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoaW5kZXggPT0gMClcclxuICAgICAgICBoZWFkZXJzID0gdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnBhcnNlQW5kR2V0R2VuZXJpY0hlYWRlcnMob2JqLCBjb2x1bW5zKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBvZ2dldHRvIGdlbmVyaWNvIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGxvIGludGVncmEgY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBNZXRvZG8gaW50ZXJubyByaWNoaWFtYXRvIGRhICoqc2V0dXBGb3JHZW5lcmljRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0dlbmVyaWNJdGVtfSBvYmogT2dnZXR0byBnZW5lcmljbyBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkNvbHVtbltdfSBjb2x1bW5zIENvbG9ubmUgcmljaGllc3RlIGRhbGwnZXNwb3J0YXppb25lXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0R2VuZXJpY0hlYWRlcnMob2JqOiBHZW5lcmljSXRlbSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGlmICghb2JqLnByb3BlcnRpZXMpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIHZhciBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuXHJcbiAgICAvL01pcmFjbGUgaW5jb21pbmdcclxuICAgIGNvbHVtbnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgdmFyIHByb3BWYWx1ZSA9IG9iai5wcm9wZXJ0aWVzW3Qua2V5XTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdC5rZXkgKyBcIl9leHBcIiwgeyB2YWx1ZTogcHJvcFZhbHVlLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiB0LmxhYmVsLCBrZXk6IHQua2V5ICsgXCJfZXhwXCIsIG9yZGVyOiB0Lm9yZGVyLCB0eXBlOiB0LnR5cGUsIHByb3BLZXk6IG51bGwgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvL1RpcmF0aSBmdW9yaSB0dXR0aSBnbGkgaGVhZGVyIGZhY2NpbyBzb3J0IHN1bGwnb3JkaW5hbWVudG9cclxuICAgIHJldHVybiBoZWFkZXJzLnNvcnQoKGEsIGIpID0+IHsgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBvZ2dldHRvIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGxvIGludGVncmEgY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBNZXRvZG8gaW50ZXJubyByaWNoaWFtYXRvIGRhICoqc2V0dXBGb3JFeHBvcnQqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBnZW5lcmljbyBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VBbmRHZXRIZWFkZXJzKG9iajogYW55LCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy8gTWlyYWNsZSBpbmNvbWluZ1xyXG4gICAgbGV0IGV4cG9ydFByb3BzID0gb2JqW2V4cG9ydExpc3RdIHx8IFtdO1xyXG4gICAgbGV0IGxvYyA9IG9ialtsb2NQcm9wZXJ0eV0gPyB0aGlzLmxjLmdlbmVyYXRlRnJvbVR5cGUob2JqW2xvY1Byb3BlcnR5XSkgOiBudWxsO1xyXG5cclxuICAgIGlmIChleHBvcnRQcm9wcy5sZW5ndGggPT0gMClcclxuICAgICAgY29uc29sZS53YXJuKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBOZXNzdW5hIGNvbG9ubmEgY29uZmlndXJhdGEgZGEgZXNwb3J0YXJlIVwiKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cG9ydFByb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwcm9wID0gZXhwb3J0UHJvcHNbaV07XHJcbiAgICAgIGxldCBwcm9wQmFzZSA9IFwiXCI7XHJcbiAgICAgIGxldCB0b0NhbGw6IEZ1bmN0aW9uO1xyXG4gICAgICBpZiAocHJvcC5lbmRzV2l0aChsaXN0Q3N2SGRyUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGxpc3RDc3ZIZHJQcmVmaXgsICcnKTtcclxuICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlTGlzdC5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHByb3AuZW5kc1dpdGgoZGljdGlvbmFyeUNzdkhkclByZWZpeCkpIHtcclxuICAgICAgICBwcm9wQmFzZSA9IHByb3AucmVwbGFjZShkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4LCAnJyk7XHJcbiAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZURpY3Rpb25hcnkuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChwcm9wLmVuZHNXaXRoKGNzdlZpc1ByZWZpeCkpIHtcclxuICAgICAgICBwcm9wQmFzZSA9IHByb3AucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9ialtwcm9wQmFzZSArIGNzdlZhbHVlTmF2aWdhdG9yXSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VPYmplY3QuYmluZCh0aGlzKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlUHJvcGVydHkuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRvQ2FsbClcclxuICAgICAgICB0b0NhbGwob2JqLCBwcm9wQmFzZSwgaGVhZGVycywgY29sdW1uc1NlbGVjdGlvbiwgbG9jKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgc2luZ29sYSBwcm9wcmlldMOgLiBcclxuICAgKiBWaWVuZSBnZW5lcmF0byBsJ2hlYWRlciBlIGxhIHByb3ByaWV0w6AgcmVsYXRpdmEgYWwgdmFsb3JlIGZvcm1hdHRhdG8gbyBub1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZVByb3BlcnR5KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0sIGxvYz86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcclxuICAgIGxldCB0b0VtaXQ6IGJvb2xlYW4gPSBvYmpbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSBvYmpbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICBsZXQgcHJvcEtleSA9IG9ialtwcm9wICsgY3N2UHJvcEtleV07XHJcblxyXG4gICAgaWYgKHByb3BLZXkgJiYgIWNvbHVtbnNTZWxlY3Rpb25bcHJvcEtleV0gJiYgT2JqZWN0LmtleXMoY29sdW1uc1NlbGVjdGlvbikubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIltAZXNmYWVuemEvZXh0ZW5zaW9uc10gQ29sb25uYSBkYSBub24gZXNwb3J0YXJlOiBcIiArIHByb3BLZXkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRleHQgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgbGFiZWwgPSBsb2MgJiYgdGV4dCA/IGxvYy5sb2ModGV4dCkgOiB0ZXh0IHx8IFwiXCI7XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgaWYgKCF0b0VtaXQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBTZSBub24gaG8gdW4gZm9ybWF0byBlc3BvcnRvIGRpcmV0dGFtZW50ZVxyXG4gICAgaWYgKCFmb3JtYXQpIHtcclxuICAgICAgLy8gU2Ugw6ggdW4gZm9ybWF0byBkYXRhIG1pIGFzc2ljdXJvIGRpIG5vbiBzdGFtcGFyZSBtYWkgdW5hIGRhdGEgMDA6MDA6MDAgYWx0cmltZW50aSBpbiBlc3BvcnRhemlvbmUgdmllbmUgdW5vIHNjaGlmb1xyXG4gICAgICBsZXQgdmFsID0gb2JqW3Byb3BdID8gdGhpcy5kYXRlcy50cmltU2Vjb25kcyhvYmpbcHJvcF0udG9TdHJpbmcoKSkgOiBcIlwiO1xyXG4gICAgICBsZXQga2V5ID0gcHJvcCArIFwiX25vZm10XCI7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXksIG9yZGVyLCB0eXBlOiBcInN0cmluZ1wiLCBwcm9wS2V5IH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGtleSA9IHByb3AgKyBcIl9mbXRcIjtcclxuXHJcbiAgICAgIC8vIENhc28gZm9ybWF0byBudW1lcmljb1xyXG4gICAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgY29uc2lkZXJhbmRvIGxhIHBvc3NpYmlsaXTDoCBkaSB6ZXJpXHJcbiAgICAgICAgbGV0IHZhbCA9IG9ialtwcm9wXSAhPSBudWxsID8gb2JqW3Byb3BdLnRvU3RyaW5nKCkgOiBcIlwiO1xyXG4gICAgICAgIC8vIEVsaW1pbm8gdHV0dGUgbGUgdmlyZ29sZSAoaW5kaWNhdG9yaSBkaSBtaWdsaWFpYSBwZXIgbGEgY3VsdHVyZSBkZWZhdWx0IGVuLVVTKVxyXG4gICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC8sLywgXCJcIik7XHJcbiAgICAgICAgLy8gSWwgc2luZ29sbyBwdW50byBjaGUgYyfDqCwgc2UgcHJlc2VudGUgKHNlcGFyYXRvcmUgZGVjaW1hbGkpIGxvIHRyYXNmb3JtbyBpbiB2aXJnb2xhXHJcbiAgICAgICAgbGV0IHZhbENvbnZlcnRlZCA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsQ29udmVydGVkLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleSwgb3JkZXIsIHR5cGU6IFwibnVtYmVyXCIsIHByb3BLZXkgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gU2UgaG8gdW4gZm9ybWF0byBkYXRhIHRyYXNmb3JtbyBpbiBkYXlqcywgZm9ybWF0dG8gZWQgZXNwb3J0b1xyXG4gICAgICAgIC8vIFBlciBsYSB0cmFzZm9ybWF6aW9uZSBpbiBkYXlqcyBwcm92byBwcmltYSBhIHBhc3NhcmdsaSBsYSBzdHJpbmdhIGRpIG5ldHRvLCBzcGVyYW5kbyBsYSByaWNvbm9zY2FcclxuICAgICAgICAvLyBTZSBub24gZnVuemlvbmEgcHJvdm8gYSBkZWZpbmlyZ2xpIGxhIGZvcm1hdHRhemlvbmUgc3RhbmRhcmQgZGVsIG1ldGVyaW5nIHBlciBxdWVsIGxpbmd1YWdnaW9cclxuICAgICAgICBsZXQgdmFsID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQob2JqW3Byb3BdLCBmb3JtYXQubGVuZ3RoIDw9IDEwLCBmb3JtYXQubGVuZ3RoID4gMTYpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5LCBvcmRlciwgdHlwZTogXCJkYXRlXCIsIHByb3BLZXkgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgc2luZ29sYSBwcm9wcmlldMOgIGRhIHVuIG9nZ2V0dG8uIFxyXG4gICAqIFZpZW5lIGdlbmVyYXRvIGwnaGVhZGVyIGUgbGEgcHJvcHJpZXTDoCByZWxhdGl2YSBhbCB2YWxvcmUgZm9ybWF0dGF0byBvIG5vLiBcclxuICAgKiBcclxuICAgKiBQZXIgb3R0ZW5lcmUgaWwgdmFsb3JlIGUgbCdoZWFkZXIgZGVsbGEgcHJvcHJpZXTDoCB2ZW5nb25vIHV0aWxpenphdGkgaSBuYXZpZ2F0b3JpIGF1dG8tZ2VuZXJhdGkgbmVsIGRlY29yYXRvcmUgKipFeHBvcnRBcyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZVxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VPYmplY3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgLy9zZSBxdWVzdGEgcHJvcHJpZXTDoCBoYSB1biBuYXZpZ2F0b3Igc2lnbmlmaWNhIGNoZSBkZXJpdmEgZGEgdW4gb2dnZXR0byBpbnRlcm5vLCByZWN1cGVybyBpbCB2YWxvcmUgaW4gcXVlc3RhIGZhc2UgZGF0byBjaGUgcHJpbWEgbm9uIGNlIGwnaG9cclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgY3N2VmFsdWVOYXZpZ2F0b3JdO1xyXG5cclxuICAgIC8vRXMuIGRpIHZhbHVlbmF2aWdhdG9yIG9iai5zdWJvYmouc3Vic3Vib2JqLnByb3BlcnR5XHJcbiAgICBsZXQgam1wcyA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLlwiKTtcclxuXHJcbiAgICAvLyBMb2NhbGl6emF6aW9uZSBwcmVzYSBkYWxsYSBjbGFzc2UgYmFzZSBzZSBjJ8OoLCBhbHRyaW1lbnRpIGRhbGxhIGNsYXNzZSBpbnRlcm5hIChjaW/DqCBkYWwgcHJpbW8gc2FsdGlubylcclxuICAgIGlmICghbG9jKSB7XHJcbiAgICAgIGxldCB0eXBlID0gb2JqW3Byb3AgKyBjc3ZWYWx1ZVR5cGVdO1xyXG4gICAgICBsZXQgcHJvdG8gPSBuZXcgdHlwZSgpO1xyXG4gICAgICBsb2MgPSBwcm90b1tsb2NQcm9wZXJ0eV0gPyB0aGlzLmxjLmdlbmVyYXRlRnJvbVR5cGUocHJvdG9bbG9jUHJvcGVydHldKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9NaSBjbG9ubyBsJ29nZ2V0dG8gb3JpZ2luYWxlIHBlciBub24gdWNjaWRlcmdsaSBpIHJpZmVyaW1lbnRpXHJcbiAgICBsZXQgY2xvbmUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xyXG4gICAgLy9TYWx0byByaWNvcnNpdmFtZW50ZSBzdSBtZSBzdGVzc28gcGVyIGFycml2YXJlIGFsbGEgcHJvcHJpZXTDoFxyXG4gICAgLy9TYWx0byAxID4gZGl2ZW50YSBvYmpcclxuICAgIC8vU2FsdG8gMiA+IGRpdmVudGEgb2JqLnN1Ym9ialxyXG4gICAgLy9lY2MuLi5cclxuICAgIGptcHMuZm9yRWFjaChwcCA9PiB7IGNsb25lID0gY2xvbmVbcHBdOyB9KTtcclxuXHJcbiAgICAvL1ZhbG9yZSBmaW5hbGUgOkRcclxuICAgIGxldCB2YWx1ZSA9IGNsb25lO1xyXG5cclxuICAgIGxldCB0ZXh0ID0gb2JqW3Byb3AgKyBjc3ZIZHJQcmVmaXhdO1xyXG4gICAgbGV0IGxhYmVsID0gbG9jICYmIHRleHQgPyBsb2MubG9jKHRleHQpIDogdGV4dCB8fCBcIlwiO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIC8vU2UgcGVyIHF1ZXN0YSBwcm9wcmlldMOgIGhvIHVuIGZvcm1hdG8gbG8gYXBwbGljb1xyXG4gICAgbGV0IGZvcm1hdDogc3RyaW5nID0gb2JqW3Byb3AgKyBjc3ZGb3JtYXRQcmVmaXhdO1xyXG4gICAgbGV0IHR5cGU6ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnZGF0ZScgPSBcInN0cmluZ1wiO1xyXG4gICAgaWYgKGZvcm1hdCA9PSBcIkZcIikge1xyXG4gICAgICBsZXQgdmFsID0gdmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgdmFsdWUgPSB2YWwucmVwbGFjZShcIi5cIiwgXCIsXCIpO1xyXG4gICAgICB0eXBlID0gXCJudW1iZXJcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvcm1hdCkge1xyXG4gICAgICB2YWx1ZSA9IHRoaXMuZGF0ZXMuZ2V0Rm9ybWF0dGVkKHZhbHVlLCBmb3JtYXQubGVuZ3RoIDw9IDEwLCBmb3JtYXQubGVuZ3RoID4gMTYpO1xyXG4gICAgICB0eXBlID0gXCJkYXRlXCI7XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgeyB2YWx1ZTogdmFsdWUgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xyXG4gICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleTogcHJvcCwgb3JkZXIsIHR5cGUsIHByb3BLZXk6IG51bGwgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIGxpc3RhIGRpIHZhbG9yaSBwaXZvdHRhdGkgZGluYW1pY2FtZW50ZTpcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBpbCB2YWxvcmUgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gbCdoZWFkZXIgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gQ29uIGlsIHZhbG9yZSBjaSBjcmVvIGxhIHByb3BlcnR5XHJcbiAgICogXHJcbiAgICogPT4gQ29uIGwnaGVhZGVyIGUgaWwgcmlmZXJpbWVudG8gYWxsYSBwcm9wZXJ0eSBhcHBlbmEgY3JlYXRhIGNyZW8gdW4gcmVjb3JkIG5lZ2xpIGhlYWRlciBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lIFxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VMaXN0KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0gLCBsb2M/OiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBsZXQgaGVhZGVybmF2aWdhdG9yID0gb2JqW3Byb3AgKyBsaXN0Q3N2SGRyUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgbGlzdENzdlZhbFByZWZpeF07XHJcbiAgICBsZXQgdmFsdWVmb3JtYXQgPSBvYmpbcHJvcCArIGxpc3RDc3ZWYWxGb3JtYXRdO1xyXG4gICAgbGV0IG9yZGVyID0gb2JqW3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG5cclxuICAgIHZhciBqdW1wczogc3RyaW5nW10sIHRtcFJlczogYW55O1xyXG4gICAgdmFyIG9ianM6IGFueVtdID0gb2JqW3Byb3BdO1xyXG5cclxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG9ianMubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICBsZXQgbGlzdGl0ZW0gPSBvYmpzW2lkeF07XHJcblxyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gUGVyIGwnaGVhZGVyIHNpIGNvbnNpZGVyYSBhIHNlIHN0YW50ZSBvZ25pIHBlenpvIHNlcGFyYXRvIGRhIHNwYXppbyBwZXIgZmFyZSBsZSBjb25jYXRlbmF6aW9uaVxyXG4gICAgICBoZWFkZXJzcGxpdC5mb3JFYWNoKHByID0+IHtcclxuICAgICAgICBqdW1wcyA9IHByLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG5cclxuICAgICAgICBsZXQgbG9jYWxpemVkID0gISFsb2MgPyBsb2MubG9jKHRtcFJlcykgOiB0bXBSZXNcclxuICAgICAgICBpZiAoIWxhYmVsKSBsYWJlbCA9IGxvY2FsaXplZDtcclxuICAgICAgICBlbHNlIGxhYmVsICs9IFwiIFwiICsgbG9jYWxpemVkO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGp1bXBzID0gdmFsdWVuYXZpZ2F0b3Iuc3BsaXQoXCIuXCIpO1xyXG4gICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgIGp1bXBzLmZvckVhY2gocHAgPT4geyB0bXBSZXMgPSB0bXBSZXNbcHBdOyB9KTtcclxuICAgICAgbGV0IHZhbHVlID0gdG1wUmVzO1xyXG5cclxuICAgICAgbGV0IHR5cGU6ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnZGF0ZScgPSBcInN0cmluZ1wiO1xyXG4gICAgICBpZiAodmFsdWVmb3JtYXQgPT0gXCJGXCIpIHtcclxuICAgICAgICBsZXQgdmFsID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiBcIlwiO1xyXG4gICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC8sLywgXCJcIik7XHJcbiAgICAgICAgdmFsdWUgPSB2YWwucmVwbGFjZShcIi5cIiwgXCIsXCIpO1xyXG4gICAgICAgIHR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHZhbHVlZm9ybWF0KSB7XHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGVzLmdldEZvcm1hdHRlZChvYmpbcHJvcF0sIHZhbHVlZm9ybWF0Lmxlbmd0aCA8PSAxMCwgdmFsdWVmb3JtYXQubGVuZ3RoID4gMTYpO1xyXG4gICAgICAgIHR5cGUgPSBcImRhdGVcIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCArIGlkeCwgeyB2YWx1ZTogdmFsdWUgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5OiBwcm9wICsgaWR4LCBvcmRlcjogb3JkZXIgKyBpZHgsIHR5cGUsIHByb3BLZXk6IG51bGwgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBwZXIgbCdlc3BvcnRhemlvbmUgZGkgdW5hIGxpc3RhIGRpIHZhbG9yaSBwaXZvdHRhdGkgZGluYW1pY2FtZW50ZTpcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBpbCB2YWxvcmUgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gUmVjdXBlcm8gbCdoZWFkZXIgdXRpbGl6emFuZG8gaSBuYXZpZ2F0b3JpXHJcbiAgICogXHJcbiAgICogPT4gQ29uIGlsIHZhbG9yZSBjaSBjcmVvIGxhIHByb3BlcnR5XHJcbiAgICogXHJcbiAgICogPT4gQ29uIGwnaGVhZGVyIGUgaWwgcmlmZXJpbWVudG8gYWxsYSBwcm9wZXJ0eSBhcHBlbmEgY3JlYXRhIGNyZW8gdW4gcmVjb3JkIG5lZ2xpIGhlYWRlciBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gb2JqIE9nZ2V0dG8gZGkgY3VpIGVzcG9ydGFyZSBsYSBwcm9wcmlldMOgICoqcHJvcCoqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcHJpZXTDoCBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnN9IGhlYWRlcnMgQ29udGVuaXRvcmUgZGVnbGkgaGVhZGVyLCB2ZXJyw6AgcmllbXBpdG8gZGEgcXVlc3RhIGZ1bnppb25lXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZURpY3Rpb25hcnkob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSAsIGxvYz86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcclxuICAgIGxldCBoZWFkZXJuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGRpY3Rpb25hcnlDc3ZIZHJQcmVmaXhdO1xyXG4gICAgbGV0IHZhbHVlbmF2aWdhdG9yID0gb2JqW3Byb3AgKyBkaWN0aW9uYXJ5Q3N2VmFsUHJlZml4XTtcclxuICAgIGxldCBvcmRlciA9IG9ialtwcm9wICsgY3N2T3JkUHJlZml4XTtcclxuXHJcbiAgICB2YXIganVtcHM6IHN0cmluZ1tdLCB0bXBSZXM6IGFueTtcclxuICAgIHZhciBvYmpzOiBhbnlbXSA9IG9ialtwcm9wXTtcclxuXHJcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBvYmpzLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgbGV0IGxpc3RpdGVtID0gb2Jqc1tpZHhdO1xyXG4gICAgICB2YXIgaGVhZGVyc3BsaXQgPSBoZWFkZXJuYXZpZ2F0b3Iuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG5cclxuICAgICAgaGVhZGVyc3BsaXQuZm9yRWFjaChwciA9PiB7XHJcbiAgICAgICAganVtcHMgPSBwci5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgdG1wUmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaXN0aXRlbSkpO1xyXG4gICAgICAgIGp1bXBzLmZvckVhY2gocHAgPT4geyB0bXBSZXMgPSB0bXBSZXNbcHBdOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFsYWJlbCkgbGFiZWwgPSAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlcztcclxuICAgICAgICBlbHNlIGxhYmVsICs9IFwiIFwiICsgISFsb2MgPyBsb2MubG9jKHRtcFJlcykgOiB0bXBSZXM7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdmFyIHZhbHVlc3BsaXQgPSB2YWx1ZW5hdmlnYXRvci5zcGxpdChcIixcIik7XHJcbiAgICAgIHZhbHVlc3BsaXQuZm9yRWFjaCgodCwgaWR4aW50ZXJuYWwpID0+IHtcclxuICAgICAgICB2YXIgbmF2aWcgPSB0LnNwbGl0KFwiLVwiKVsxXTtcclxuICAgICAgICB2YXIgZGVzYyA9IHQuc3BsaXQoXCItXCIpWzBdO1xyXG5cclxuICAgICAgICBqdW1wcyA9IG5hdmlnLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICB0bXBSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpc3RpdGVtKSk7XHJcbiAgICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IHRtcFJlcztcclxuXHJcbiAgICAgICAgbGV0IHByb3BuYW1lID0gcHJvcCArIGlkeC50b1N0cmluZygpICsgaWR4aW50ZXJuYWwudG9TdHJpbmcoKTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wbmFtZSwgeyB2YWx1ZTogdmFsdWUgPz8gXCJcIiwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiBsYWJlbCArIFwiIFwiICsgISFsb2MgPyBsb2MubG9jKGRlc2MpIDogZGVzYywga2V5OiBwcm9wbmFtZSwgb3JkZXI6IG9yZGVyICsgaWR4LCB0eXBlOiAnc3RyaW5nJywgcHJvcEtleTogbnVsbCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogRWZmZXR0dWEgbCdlc3BvcnRhemlvbmUgaW4gZmlsZSBDU1YgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBleHBvcnRDU1YoZm46IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBkYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IGNzdkRhdGEgPSAnJywgcm93ID0gJycsIHNlcCA9ICc7JztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGggPSBoZWFkZXJzW2ldO1xyXG4gICAgICByb3cgKz0gYCR7cm93ICE9ICcnID8gc2VwIDogJyd9XCIke2gubGFiZWx9XCJgO1xyXG4gICAgfVxyXG4gICAgY3N2RGF0YSArPSByb3cgKyAnXFxyXFxuJztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcm93ID0gJyc7XHJcbiAgICAgIGxldCBpdGVtID0gZGF0YVtpXTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWFkZXJzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IGl0ZW1baGVhZGVyc1tqXS5rZXldO1xyXG4gICAgICAgIHJvdyArPSBgJHtyb3cgIT0gJycgPyBzZXAgOiAnJ31cIiR7dmFsfVwiYDtcclxuICAgICAgfVxyXG4gICAgICBjc3ZEYXRhICs9IHJvdyArICdcXHJcXG4nO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBCT00gPSBuZXcgVWludDhBcnJheShbMHhFRiwweEJCLDB4QkZdKTtcclxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW0JPTSwgY3N2RGF0YV0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcclxuICAgIHZhciBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgdGhpcy51dGlFeHRzLmZpbGVEb3dubG9hZChvYmplY3RVcmwsIGZuLmVuZHNXaXRoKCcueGxzeCcpID8gZm4ucmVwbGFjZSgnLnhsc3gnLCAnLmNzdicpIDogZm4uZW5kc1dpdGgoJy5jc3YnKSA/IGZuIDogZm4gKyBcIi5jc3ZcIik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIENhY2hlIGRlbCBtb2R1bG8gcGVyIGwnZXNwb3J0YXppb25lIEV4Y2VsICovXHJcbiAgcHJpdmF0ZSBFeGNlbEpTOiBhbnk7XHJcblxyXG4gIC8qKiBFZmZldHR1YSBsJ2VzcG9ydGF6aW9uZSBkZWwgZmlsZSBFeGNlbCBiYXNhbmRvc2kgc3VsIG1vZHVsbyAqKkV4Y2VsSlMqKiwgc3VnbGkgaGVhZGVyICoqaGVhZGVycyoqIGUgc3VpIGRhdGkgKipkYXRhKiogKi9cclxuICBwcml2YXRlIGFzeW5jIGV4cG9ydEV4Y2VsKGZuOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgZGF0YTogYW55W10pIHtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLkV4Y2VsSlMgPSB0aGlzLkV4Y2VsSlMgfHwgYXdhaXQgaW1wb3J0KFwiZXhjZWxqc1wiKTtcclxuICAgIH1cclxuICAgIGNhdGNoIHtcclxuICAgICAgdGhyb3cgXCJJbXBvc3NpYmlsZSBjYXJpY2FyZSBsYSBsaWJyZXJpYSBwZXIgbCdlc3BvcnRhemlvbmUgaW4gRXhjZWxcIjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaUZpeCA9IDE7XHJcbiAgICBsZXQgd29ya2Jvb2sgPSBuZXcgdGhpcy5FeGNlbEpTLldvcmtib29rKCk7XHJcbiAgICB3b3JrYm9vay5jcmVhdG9yID0gXCJFbWEncyBiaWcgRXMtVGFibGVcIjtcclxuICAgIHdvcmtib29rLmNyZWF0ZWQgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGxldCBzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldCgnRGF0YScpO1xyXG4gICAgbGV0IGhlYWRlciA9IHNoZWV0LmdldFJvdygxKTtcclxuICAgIGhlYWRlci5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICBoZWFkZXJzID0gaGVhZGVycy5zb3J0KChhOiBDc3ZIZWFkZXJzLCBiOiBDc3ZIZWFkZXJzKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoID0gaGVhZGVyc1tpXTtcclxuICAgICAgaGVhZGVyLmdldENlbGwoaSArIGlGaXgpLnZhbHVlID0gaC5sYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHJvdyA9IHNoZWV0LmdldFJvdyhpICsgaUZpeCArIDEpO1xyXG4gICAgICBsZXQgaXRlbSA9IGRhdGFbaV07XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBoID0gaGVhZGVyc1tpXTtcclxuICAgICAgICBsZXQgY2VsbCA9IHJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICBsZXQgdmFsID0gaXRlbVtoLmtleV07XHJcblxyXG4gICAgICAgIGlmICghdmFsKSB7XHJcbiAgICAgICAgICBjZWxsLnZhbHVlID0gXCJcIjtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3dpdGNoIChoLnR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgICAvLyBFeGNlbEpTIHZhIGRpIGRlZmF1bHQgaW4gVVRDIHF1aW5kaSByaXNjaGllcmViYmUgZGkgdGlyYXJlIGdpw7kgMiBvcmUgYWQgb2duaSBlc3BvcnRhemlvbmVcclxuICAgICAgICAgICAgLy8gQmlzb2duYSBhZ2dpdW5nZXJlIGwndXRjIG9mZnNldCBhbGxhIGRhdGEgYXR0dWFsZVxyXG4gICAgICAgICAgICBsZXQgZGF0ZSA9IHRoaXMuZGF0ZXMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsKTtcclxuICAgICAgICAgICAgaWYgKGRhdGUpIHtcclxuICAgICAgICAgICAgICBsZXQgY29ycmVjdGVkRGF0ZSA9IGRhdGUuYWRkKGRhdGUudXRjT2Zmc2V0KCksICdtaW51dGUnKTtcclxuICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gY29ycmVjdGVkRGF0ZS50b0RhdGUoKTtcclxuICAgICAgICAgICAgICBjZWxsLm51bUZtdCA9IHZhbC5sZW5ndGggPiAxMCA/ICdkZC9tbS95eXl5IGg6bTpzJyA6ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICAgICAgbGV0IGNvbnZlcnRlZCA9IHBhcnNlRmxvYXQodmFsLnJlcGxhY2UoJywnLCAnLicpKTtcclxuICAgICAgICAgICAgY2VsbC52YWx1ZSA9IGlzTmFOKGNvbnZlcnRlZCkgPyBcIlwiIDogY29udmVydGVkO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNlbGwudmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBidWZmZXIgPSBhd2FpdCB3b3JrYm9vay54bHN4LndyaXRlQnVmZmVyKCk7XHJcbiAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7XCIgfSk7XHJcbiAgICBsZXQgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIHRoaXMudXRpRXh0cy5maWxlRG93bmxvYWQob2JqZWN0VXJsLCBmbi5lbmRzV2l0aCgnLmNzdicpID8gZm4ucmVwbGFjZSgnLmNzdicsICcueGxzeCcpIDogZm4uZW5kc1dpdGgoJy54bHN4JykgPyBmbiA6IGZuICsgXCIueGxzeFwiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgZWZmZXR0aXZhbWVudGUgZ2VuZXJhIGdsaSBoZWFkZXIgZSBpIGRhdGkgcGVyIGwnZXNwb3J0YXppb25lIGNvbiAqKm5neC1jc3YqKlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBlc3BvcnRhcmVcclxuICAgKi9cclxuICBwdWJsaWMgZXhwb3J0KGl0ZW1zOiBhbnlbXSwgZm9ybWF0OiAnQ1NWJyB8ICdYTFNYJywgZmlsZU5hbWU6IHN0cmluZywgdHlwZTogVHlwZTxhbnk+LCBjb2x1bW5zRmlsdGVyPzogc3RyaW5nW10sIGdlbmVyaWNIZWFkZXJzPzogQ3N2SGVhZGVyc1tdKSB7XHJcbiAgICB2YXIgY3JlYXRlZEl0ZW1zID0gaXRlbXMubWFwKHQgPT4ge1xyXG4gICAgICBsZXQgdG1wID0gbmV3IHR5cGUoKTtcclxuICAgICAgZm9yKGxldCBwcm9wZXJ0eSBpbiB0KSB0bXBbcHJvcGVydHldID0gdFtwcm9wZXJ0eV07XHJcbiAgICAgIHJldHVybiB0bXA7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgaGVhZGVycyA9IGdlbmVyaWNIZWFkZXJzID8gdGhpcy5zZXR1cEZvckdlbmVyaWNFeHBvcnQoY3JlYXRlZEl0ZW1zLCBnZW5lcmljSGVhZGVycykgOiB0aGlzLnNldHVwRm9yRXhwb3J0KGNyZWF0ZWRJdGVtcywgY29sdW1uc0ZpbHRlcik7XHJcbiAgICAoZm9ybWF0ID09IFwiQ1NWXCIgPyB0aGlzLmV4cG9ydENTViA6IHRoaXMuZXhwb3J0RXhjZWwpLmJpbmQodGhpcykoZmlsZU5hbWUsIGhlYWRlcnMsIGNyZWF0ZWRJdGVtcyk7XHJcbiAgfVxyXG59Il19
|
|
611
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5leHBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLakQsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBUS9ROzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUE4QjtJQUMvRCxPQUFPLFNBQVMsWUFBWSxDQUF3QyxXQUFjO1FBQ2hGLE9BQU8sS0FBTSxTQUFRLFdBQVc7WUFBekI7O2dCQUE0QixZQUFPLEdBQUcsR0FBRyxDQUFDO1lBQUMsQ0FBQztTQUFBLENBQUM7SUFDdEQsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQWlCLElBQUksRUFBRSxVQUFrQixJQUFJLEVBQUUsRUFBRSxDQUNyRyxDQUFDLE1BQWMsRUFBRSxXQUFtQixFQUFFLEVBQUU7SUFDdEMsSUFBSSxNQUFNO1FBQ1IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUss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Y0FEQSxNQUFNOzJGQUNuQixhQUFhO2tCQUR6QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBFc2ZhZW56YVxyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5cclxuaW1wb3J0IHsgZXhwb3J0TGlzdCwgY3N2Rm9ybWF0UHJlZml4LCBjc3ZIZHJQcmVmaXgsIGNzdk9yZFByZWZpeCwgY3N2VmFsdWVOYXZpZ2F0b3IsIGNzdlZpc1ByZWZpeCwgZGljdGlvbmFyeUNzdkhkclByZWZpeCwgZGljdGlvbmFyeUNzdlZhbFByZWZpeCwgbGlzdENzdkhkclByZWZpeCwgbGlzdENzdlZhbEZvcm1hdCwgbGlzdENzdlZhbFByZWZpeCwgY3N2UHJvcEtleSwgbG9jUHJvcGVydHksIGNzdlZhbHVlVHlwZSB9IGZyb20gXCIuLi9tb2RlbHMvRXhwb3J0Q29uc3RzXCI7XHJcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zLmRhdGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gXCIuL2V4dGVuc2lvbnMudXRpbGl0aWVzLnNlcnZpY2VcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQ3N2SGVhZGVycyB9IGZyb20gXCIuLi9tb2RlbHMvQ3N2SGVhZGVyc1wiO1xyXG5pbXBvcnQgeyBHZW5lcmljSXRlbSB9IGZyb20gXCIuLi9tb2RlbHMvR2VuZXJpY0l0ZW1cIjtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGNoZSBmb3JuaXNjZSBsYSBjbGFzc2UgZGkgbG9jYWxpenphemlvbmUgcGVyIHR1dHRlIGxlIHByb3ByaWV0w6AgZXNwb3J0YXRlIGNvbiBARXhwb3J0IGUgcXVhbHNpYXNpIGFsdHJvIHRhZyBjaGUgcmljaGllZGEgbG9jYWxpenphemlvbmkuXHJcbiAqIFxyXG4gKiBTb3N0YW56aWxhbWVudGUgYWdnaXVuZ2UgbGEgcHJvcHJpZXTDoCAqKl9fbG9jX18qKiBhbGwnb2dnZXR0byBjcmVhdG8gZGFsbGEgY2xhc3NlIGNvcnJlbnRlIGFzc2VnbmFuZG9nbGkgY29tZSB2YWxvcmUgaWwgdGlwbyBkZWwgTG9jYWxpemF0aW9uU2VydmljZSBkYSB1c2FyZSBwZXIgbGEgdHJhZHV6aW9uZVxyXG4gKiBcclxuICogQHBhcmFtIHtUeXBlPExvY2FsaXphdGlvblNlcnZpY2U+fSBsb2MgVGlwbyBlcmVkaXRhdG8gZGFsIExvY2FsaXphdGlvblNlcnZpY2UgY2hlIHB1w7IgZXNzZXJlIGNyZWF0byBhIHJ1bnRpbWUgc290dG8gY29udGVzdG8gZGVsbGEgREkgZGkgQW5ndWxhclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydExvY2FsaXphdGlvbihsb2M6IFR5cGU8TG9jYWxpemF0aW9uU2VydmljZT4pIHtcclxuICByZXR1cm4gZnVuY3Rpb24gaW50ZWdyYXRlTG9jPFQgZXh0ZW5kcyB7IG5ldyguLi5hcmdzOiBhbnlbXSk6IHt9IH0+KGNvbnN0cnVjdG9yOiBUKSB7XHJcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBjb25zdHJ1Y3RvciB7IF9fbG9jX18gPSBsb2M7IH07XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRGVjb3JhdG9yZSBkaSBlc3BvcnRhemlvbmUgdXRpbGl6emFiaWxlIHN1IHVuYSBwcm9wcmlldMOgIHNpbmdvbGEuIFxyXG4gKiBWZXJyYW5ubyBnZW5lcmF0ZSAzIHByb3ByaWV0w6AgY2hlIGdlc3RpcmFubm8gbCdlc3BvcnRhemlvbmU6IChwcm9wLCBwcm9wX2NzdnZpcywgcHJvcF9jc3ZoZHIpLiBcclxuICogXHJcbiAqIEFkIGVzZW1waW8sIGRhIHF1ZXN0YSBjb25maWd1cmF6aW9uZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiBARXhwb3J0KHRydWUsIFwiTXlIZWFkZXJcIilcclxuICogY2lhbzogc3RyaW5nO1xyXG4gKiBgYGBcclxuICogXHJcbiAqIE5hc2NlcmFubm8gbGUgc2VndWVudGkgcHJvcHJpZXTDoCBuZWxsJ29nZ2V0dG8gZXNwb3J0YWJpbGU6XHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogY2lhb19jc3Z2aXM6IHN0cmluZzsgPT4gdHJ1ZVxyXG4gKiBjaWFvOiBzdHJpbmc7XHJcbiAqIGNpYW9fY3N2aGRyOiBzdHJpbmcgPT4gXCJNeUhlYWRlclwiXHJcbiAqIGBgYFxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyIFRpdG9sbyBkZWxsYSBjb2xvbm5hIG5lbCBmaWxlIENTViBlc3BvcnRhdG9cclxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCBGb3JtYXRvIGRpIGVzcG9ydGF6aW9uZS4gUHXDsiBlc3NlcmUgdW4gZm9ybWF0byBkYXRhIHBlciBpIGNhbXBpIGRhdGEgbyAnRicgcGVyIGkgY2FtcGkgZmxvYXRpbmcgcG9pbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFeHBvcnQgPSAob3JkZXI6IG51bWJlciwgaGVhZGVyOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nID0gbnVsbCwgdGFibGVpZDogc3RyaW5nID0gbnVsbCkgPT5cclxuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChmb3JtYXQpXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2Rm9ybWF0UHJlZml4LCB7IHZhbHVlOiBmb3JtYXQsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgY3N2T3JkUHJlZml4LCB7IHZhbHVlOiBvcmRlciwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZWaXNQcmVmaXgsIHsgdmFsdWU6ICEhaGVhZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBpZiAodGFibGVpZClcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBjc3ZQcm9wS2V5LCB7IHZhbHVlOiB0YWJsZWlkLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBjc3ZWaXNQcmVmaXgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBjc3ZWaXNQcmVmaXhdXHJcbiAgfTtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW4gb2dnZXR0by4gXHJcbiAqIFBlciBvZ25pIHByb3ByaWV0w6AgZGVsbCdvZ2dldHRvIHZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcikuIFxyXG4gKiBQZXIgZXNzZXJlIGVzcG9ydGF0ZSwgbGUgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gZGV2b25vIGVzc2VyZSBtYXJjYXRlIGNvbiBpIERlY29yYXRvcmkgZGkgZXNwb3J0YXppb25lXHJcbiAqIFxyXG4gKiBBZCBlc2VtcGlvLCBkYSBxdWVzdGEgY29uZmlndXJhemlvbmU6XHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogTXlPYmoge1xyXG4gKiAgICAgQEV4cG9ydCh0cnVlLCBcIk15SGVhZGVyXCIpXHJcbiAqICAgICBjaWFvOiBzdHJpbmc7XHJcbiAqIH1cclxuICogXHJcbiAqIEBFeHBvcnRPYmplY3QodHJ1ZSwgXCJNeUhlYWRlclwiKVxyXG4gKiB0ZXN0OiBNeU9iajsgXHJcbiAqIGBgYFxyXG4gKiBcclxuICogTmFzY2VyYW5ubyBsZSBzZWd1ZW50aSBwcm9wcmlldMOgIG5lbGwnb2dnZXR0byBlc3BvcnRhYmlsZTpcclxuICogXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiB0ZXN0Y2lhbzogc3RyaW5nOyA9PiBWYWxvcmUgZGkgTXlPYmouY2lhb1xyXG4gKiB0ZXN0Y2lhb19jc3Z2aXM6IHN0cmluZzsgPT4gdHJ1ZVxyXG4gKiB0ZXN0Y2lhb19jc3ZoZHI6IHN0cmluZyA9PiBcIk15SGVhZGVyXCIgXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7YW55fSB0eXBlIFRpcG8gZGEgZXNwb3J0YXJlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXhwb3J0QXMgPSAob3JkZXI6IG51bWJlciwgdHlwZTogYW55LCBwcmVmaXg/OiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICB2YXIgdCA9IG5ldyB0eXBlKCk7XHJcbiAgICB2YXIgcHJvcHMgPSB0W2V4cG9ydExpc3RdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcHJvcCA9IHByb3BzW2ldLnJlcGxhY2UoY3N2VmlzUHJlZml4LCAnJyk7XHJcbiAgICAgIGlmICh0eXBlb2YgdFtwcm9wICsgY3N2VmlzUHJlZml4XSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHZhciB0b0VtaXQ6IGJvb2xlYW4gPSB0W3Byb3AgKyBjc3ZWaXNQcmVmaXhdO1xyXG4gICAgICAgIHZhciBsYmwgPSB0W3Byb3AgKyBjc3ZIZHJQcmVmaXhdO1xyXG4gICAgICAgIHZhciBmb3JtYXQgPSB0W3Byb3AgKyBjc3ZGb3JtYXRQcmVmaXhdO1xyXG4gICAgICAgIHZhciBvcmRlclByb3AgPSB0W3Byb3AgKyBjc3ZPcmRQcmVmaXhdO1xyXG4gICAgICAgIGlmIChmb3JtYXQpXHJcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZGb3JtYXRQcmVmaXgsIHsgdmFsdWU6IGZvcm1hdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZPcmRQcmVmaXgsIHsgdmFsdWU6IG9yZGVyUHJvcCArIG9yZGVyLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkgKyBwcm9wLCB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWYWx1ZU5hdmlnYXRvciwgeyB2YWx1ZTogcHJvcGVydHlLZXkgKyBcIi5cIiArIHByb3AsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIHByb3AgKyBjc3ZWaXNQcmVmaXgsIHsgdmFsdWU6IHRvRW1pdCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdkhkclByZWZpeCwgeyB2YWx1ZTogKHByZWZpeCA/IHByZWZpeCArICcgJyA6ICcnKSArIGxibCwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgcHJvcCArIGNzdlZhbHVlVHlwZSwgeyB2YWx1ZTogdHlwZSwgd3JpdGFibGU6IGZhbHNlIH0pO1xyXG5cclxuICAgICAgICBpZiAodGFyZ2V0W2V4cG9ydExpc3RdKVxyXG4gICAgICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmlzUHJlZml4KTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0YXJnZXRbZXhwb3J0TGlzdF0gPSBbcHJvcGVydHlLZXkgKyBwcm9wICsgY3N2VmlzUHJlZml4XVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbi8qKlxyXG4gKiBEZWNvcmF0b3JlIGRpIGVzcG9ydGF6aW9uZSB1dGlsaXp6YWJpbGUgc3UgdW5hIGxpc3RhLCBcclxuICogc2kgdXRpbGl6emFubyAyIG5hdmlnYXRvciByaXNwZXR0aXZhbWVudGUgcGVyIGxhIHZhbG9yaXp6YXppb25lIGRlbGwnSGVhZGVyIGUgZGVsIFZhbG9yZSBlIFxyXG4gKiBwZXIgb2duaSBlbGVtZW50byBkZWxsJ2FycmF5IHZlcnJhbm5vIGdlbmVyYXRlIDMgcHJvcHJpZXTDoCBjaGUgZ2VzdGlyYW5ubyBsJ2VzcG9ydGF6aW9uZTogKHByb3AsIHByb3BfY3N2dmlzLCBwcm9wX2NzdmhkcilcclxuICogXHJcbiAqIEFUVEVOWklPTkU6IEdsaSBvZ2dldHRpIGVzcG9ydGF0aSBpbiBxdWVzdGEgbW9kYWxpdMOgIG5vbiBkZXZvbm8gcHJlc2VudGFyZSBhbHRyaSB0YWcgZGkgdGlwbyBARXhwb3J0ey4uLn0gYWxsJ2ludGVybm8uIEZhIHR1dHRvIHF1ZXN0byBkZWNvcmF0b3JlXHJcbiAqIFxyXG4gKiBJIG5hdmlnYXRvciBoYW5ubyBxdWVzdGEgY29udmVuemlvbmU6XHJcbiAqIFxyXG4gKiAuIC0tPiBkaXZpZGUgZHVlIHByb3ByaWV0w6AgZGEgcmljaGlhbWFyZSBjb25zZWN1dGl2YW1lbnRlOiBcImEuYlwiIHJpY2hpYW1lcsOgIFwib2JqLmEuYlwiO1xyXG4gKiBcclxuICogfCAtLT4gZGl2aWRlIHBpw7kgcHJvcHJpZXTDoCBwZXIgbGUgY29uY2F0ZW5hemlvbmkgY29uIHVubyBzcGF6aW8gZnJhIHVuYSBlIGwnYWx0cmE6IFwicmVnZGVzY3xzbGljZS5zbGljZW5hbWVcIiBkaXZlbnRlcsOgIG9iai5yZWdkZXNjICsgXCIgXCIgKyBvYmouc2xpY2Uuc2xpY2VuYW1lXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JkZXIgT3JkaW5lIGRpIGVzcG9ydGF6aW9uZS4gUGnDuSBwaWNjb2xvIMOoLCBwcmltYSBhcHBhcmUgaWwgdmFsb3JlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHRpdG9sbyBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVuYXZpZ2F0b3IgTmF2aWdhdG9yIGNvbCBjb21waXRvIGRpIHNlbGV6aW9uYXJlIGlsIHZhbG9yZSBwZXIgbGEgY29sb25uYVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVmb3JtYXQgRm9ybWF0byBkaSBlc3BvcnRhemlvbmUgcGVyIGkgdmFsb3JpIHNlbGV6aW9uYXRpIGRhbCAqKnZhbHVlbmF2aWdhdG9yKiouIFB1w7IgZXNzZXJlIHVuIGZvcm1hdG8gZGF0YSBwZXIgaSBjYW1waSBkYXRhIG8gJ0YnIHBlciBpIGNhbXBpIGZsb2F0aW5nIHBvaW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXhwb3J0TGlzdCA9IChvcmRlcjogbnVtYmVyLCBoZWFkZXJuYXZpZ2F0b3I6IHN0cmluZywgdmFsdWVuYXZpZ2F0b3I6IHN0cmluZywgdmFsdWVmb3JtYXQ6IHN0cmluZyA9IG51bGwpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVuYXZpZ2F0b3IsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgbGlzdENzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVybmF2aWdhdG9yLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGxpc3RDc3ZWYWxGb3JtYXQsIHsgdmFsdWU6IHZhbHVlZm9ybWF0LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBsaXN0Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgbGlzdENzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIERlY29yYXRvcmUgZGkgZXNwb3J0YXppb25lIHV0aWxpenphYmlsZSBzdSB1biBkaXppb25hcmlvLiBTZSBhZCBlc2VtcGlvIHNpIHZvZ2xpb25vIGdlbmVyYXJlIGxlIGNvbG9ubmVcclxuICogXHJcbiAqIFZhbG9yZSBBID0gMVxyXG4gKiBcclxuICogVmFsb3JlIEIgPSAyXHJcbiAqIFxyXG4gKiBWYWxvcmUgQyA9IDNcclxuICogXHJcbiAqIHBhcnRlbmRvIGRhIHVuIG9nZ2V0dG8gaW5pemlhbGUgeyBWYWxvcmUgeyBBOiAxLCBCOiAyLCBDOiAzIH0gfVxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIE9yZGluZSBkaSBlc3BvcnRhemlvbmUuIFBpw7kgcGljY29sbyDDqCwgcHJpbWEgYXBwYXJlIGlsIHZhbG9yZVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVycHJlZml4IFByZWZpc3NvIHBlciBsJ2hlYWRlclxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVwcmVmaXggUHJlZmlzc28gcGVyIGlsIHZhbG9yZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEV4cG9ydERpY3Rpb25hcnkgPSAob3JkZXI6IG51bWJlciwgaGVhZGVycHJlZml4OiBzdHJpbmcsIHZhbHVlcHJlZml4OiBzdHJpbmcpID0+XHJcbiAgKHRhcmdldDogT2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSArIGNzdk9yZFByZWZpeCwgeyB2YWx1ZTogb3JkZXIsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdlZhbFByZWZpeCwgeyB2YWx1ZTogdmFsdWVwcmVmaXgsIHdyaXRhYmxlOiBmYWxzZSB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeCwgeyB2YWx1ZTogaGVhZGVycHJlZml4LCB3cml0YWJsZTogZmFsc2UgfSk7XHJcblxyXG4gICAgaWYgKHRhcmdldFtleHBvcnRMaXN0XSlcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdLnB1c2gocHJvcGVydHlLZXkgKyBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4KTtcclxuICAgIGVsc2VcclxuICAgICAgdGFyZ2V0W2V4cG9ydExpc3RdID0gW3Byb3BlcnR5S2V5ICsgZGljdGlvbmFyeUNzdkhkclByZWZpeF1cclxuICB9O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIHNpIG9jY3VwYSBkZWxsJ2VzcG9ydGF6aW9uZSBkZWdsaSBvZ2dldHRpIG1hcmNhdGkgZGFpIERlY29yYXRvcmkgKipFeHBvcnREaWN0aW9uYXJ5KiosICoqRXhwb3J0TGlzdCoqLCAqKkV4cG9ydEFzKiogbyAqKkV4cG9ydCoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXHJcbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29zdHJ1dHRvcmVcclxuICAgKiBcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZXM6IERhdGVTZXJ2aWNlLCBwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0YSB1bmEgbGlzdGEgZGkgb2dnZXR0aSBnZW5lcmEgZ2xpIGhlYWRlciBwZXIgbCdlc3BvcnRhemlvbmUgZSBpbnRlZ3JhIG9nbmkgb2dnZXR0byBjb24gbGUgcHJvcHJpZXTDoCBlc3BvcnRhYmlsaSBkYWxsYSBsaWJyZXJpYSAqKkBjdHJsL25neC1jc3YqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55W119IG9ianMgT2dnZXR0aSBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXR1cEZvckV4cG9ydChvYmpzOiBhbnlbXSwgY29sdW1uczogc3RyaW5nW10gPSBbXSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICBsZXQgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcbiAgICBsZXQgaGVhZGVyc0NhY2hlID0ge307XHJcblxyXG4gICAgaWYgKCFvYmpzIHx8IG9ianMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG5cclxuICAgIC8vIERldm8gcGVyIGZvcnphIGZhcmxvIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBkYXRvIGNoZSBkZXZvIGVzcG9ycmUgbGUgcHJvcHJpZXTDoCBjaGUgbWkgc2Vydm9ubyBkYSBlc3BvcnRhcmVcclxuICAgIC8vIEdsaSBoZWFkZXIgbGkgcmFjY29sZ28gdHV0dGkgcG9pIGZhY2NpbyB1YW4gZGlzdGluY3QgaW4gbW9kbyBkYSBlc3BvcnRhcmUgdHV0dGUgbGUgcHJvcHJpZXTDoCBwZXIgYmVuZVxyXG4gICAgbGV0IGNvbHVtblNlbGVjdGlvbkRpY3Rpb25hcnk6IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0gPSB7fTtcclxuXHJcbiAgICBpZiAoY29sdW1ucz8ubGVuZ3RoID4gMClcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zPy5sZW5ndGg7IGkrKylcclxuICAgICAgICBjb2x1bW5TZWxlY3Rpb25EaWN0aW9uYXJ5W2NvbHVtbnNbaV1dID0gdHJ1ZTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGhkcyA9IHRoaXMucGFyc2VBbmRHZXRIZWFkZXJzKG9ianNbaV0sIGNvbHVtblNlbGVjdGlvbkRpY3Rpb25hcnkpO1xyXG4gICAgICAvLyBBZ2dpdW5nbyBnbGkgaGVhZGVyIGZhY2VuZG8gaW4gbW9kbyBkaSBub24gYWdnaXVuZ2VybmUgbWFpIGR1ZSB1Z3VhbGkgcGVyIG5vbiBkb3ZlciBmYXJlIHVuYSBkaXN0aW5jdCBkb3BvXHJcbiAgICAgIC8vIGNoZSBjb3N0ZXJlYmJlIGNvbXVucXVlIHJpc29yc2UuIFV0aWxpenpvIHVuIGRpemlvbmFyaW8gZCdhcHBvZ2dpbyBwZXIgbG9va3VwIGlzdGFudGFuZWlcclxuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHMubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnNDYWNoZVtoZHNba10ua2V5XSkge1xyXG4gICAgICAgICAgaGVhZGVyc0NhY2hlW2hkc1trXS5rZXldID0gdHJ1ZTtcclxuICAgICAgICAgIGhlYWRlcnMucHVzaChoZHNba10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29sdW1ucyB8fCBjb2x1bW5zLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gaGVhZGVycy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gU2UgbWkgYXJyaXZhIGxhIGxpc3RhIGRpIGNvbG9ubmUgbm9uIG1pIGTDoCBzb2xvIGxhIHZpc2liaWxpdMOgLCBtYSBhbmNoZSBsJ29yZGluYW1lbnRvXHJcbiAgICAgIC8vIGxlIGVzcG9ydG8gZGkgY29uc2VndWVuemFcclxuICAgICAgbGV0IG9yZGVyZWRIZWFkZXJzID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCB0aGlzSWQgPSBjb2x1bW5zW2ldO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlYWRlcnNbaV0ucHJvcEtleSA9PSB0aGlzSWQpIHtcclxuICAgICAgICAgICAgb3JkZXJlZEhlYWRlcnMucHVzaChoZWFkZXJzW2ldKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvcmRlcmVkSGVhZGVycztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJpY2kgZ2VuZXJhIGdsaSBoZWFkZXIgcGVyIGwnZXNwb3J0YXppb25lIGUgaW50ZWdyYSBvZ25pIG9nZ2V0dG8gY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0dlbmVyaWNJdGVtW119IG9ianMgT2dnZXR0aSBnZW5lcmljaSBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkhlYWRlcnNbXX0gY29sdW1ucyBDb2xvbm5lIHJpY2hpZXN0ZSBkYWxsJ2VzcG9ydGF6aW9uZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDc3ZIZWFkZXJzW119IEhlYWRlciBkaSBlc3BvcnRhemlvbmUgZ2nDoCBvcmRpbmF0aSBjb3JyZXR0YW1lbnRlXHJcbiAgICovXHJcbiAgcHVibGljIHNldHVwRm9yR2VuZXJpY0V4cG9ydChvYmpzOiBHZW5lcmljSXRlbVtdLCBjb2x1bW5zOiBDc3ZIZWFkZXJzW10pOiBDc3ZIZWFkZXJzW10ge1xyXG4gICAgbGV0IGhlYWRlcnM6IENzdkhlYWRlcnNbXSA9IFtdO1xyXG4gICAgaWYgKCFvYmpzIHx8IG9ianMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBoZWFkZXJzO1xyXG5cclxuICAgIC8vIERldm8gcGVyIGZvcnphIGZhcmxvIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBkYXRvIGNoZSBkZXZvIGVzcG9ycmUgbGUgcHJvcHJpZXTDoCBjaGUgbWkgc2Vydm9ubyBkYSBlc3BvcnRhcmVcclxuICAgIG9ianMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoaW5kZXggPT0gMClcclxuICAgICAgICBoZWFkZXJzID0gdGhpcy5wYXJzZUFuZEdldEdlbmVyaWNIZWFkZXJzKG9iaiwgY29sdW1ucyk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnBhcnNlQW5kR2V0R2VuZXJpY0hlYWRlcnMob2JqLCBjb2x1bW5zKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBvZ2dldHRvIGdlbmVyaWNvIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGxvIGludGVncmEgY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBNZXRvZG8gaW50ZXJubyByaWNoaWFtYXRvIGRhICoqc2V0dXBGb3JHZW5lcmljRXhwb3J0KipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0dlbmVyaWNJdGVtfSBvYmogT2dnZXR0byBnZW5lcmljbyBkYSBlc3BvcnRhcmVcclxuICAgKiBAcGFyYW0ge0NzdkNvbHVtbltdfSBjb2x1bW5zIENvbG9ubmUgcmljaGllc3RlIGRhbGwnZXNwb3J0YXppb25lXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NzdkhlYWRlcnNbXX0gSGVhZGVyIGRpIGVzcG9ydGF6aW9uZSBnacOgIG9yZGluYXRpIGNvcnJldHRhbWVudGVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlQW5kR2V0R2VuZXJpY0hlYWRlcnMob2JqOiBHZW5lcmljSXRlbSwgY29sdW1uczogQ3N2SGVhZGVyc1tdKTogQ3N2SGVhZGVyc1tdIHtcclxuICAgIGlmICghb2JqLnByb3BlcnRpZXMpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIHZhciBoZWFkZXJzOiBDc3ZIZWFkZXJzW10gPSBbXTtcclxuXHJcbiAgICAvL01pcmFjbGUgaW5jb21pbmdcclxuICAgIGNvbHVtbnMuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgdmFyIHByb3BWYWx1ZSA9IG9iai5wcm9wZXJ0aWVzW3Qua2V5XTtcclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgdC5rZXkgKyBcIl9leHBcIiwgeyB2YWx1ZTogcHJvcFZhbHVlLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiB0LmxhYmVsLCBrZXk6IHQua2V5ICsgXCJfZXhwXCIsIG9yZGVyOiB0Lm9yZGVyLCB0eXBlOiB0LnR5cGUsIHByb3BLZXk6IG51bGwgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvL1RpcmF0aSBmdW9yaSB0dXR0aSBnbGkgaGVhZGVyIGZhY2NpbyBzb3J0IHN1bGwnb3JkaW5hbWVudG9cclxuICAgIHJldHVybiBoZWFkZXJzLnNvcnQoKGEsIGIpID0+IHsgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBvZ2dldHRvIGdlbmVyYSBnbGkgaGVhZGVyIHBlciBsJ2VzcG9ydGF6aW9uZSBlIGxvIGludGVncmEgY29uIGxlIHByb3ByaWV0w6AgZXNwb3J0YWJpbGkgZGFsbGEgbGlicmVyaWEgKipAY3RybC9uZ3gtY3N2KipcclxuICAgKiBcclxuICAgKiBNZXRvZG8gaW50ZXJubyByaWNoaWFtYXRvIGRhICoqc2V0dXBGb3JFeHBvcnQqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBnZW5lcmljbyBkYSBlc3BvcnRhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q3N2SGVhZGVyc1tdfSBIZWFkZXIgZGkgZXNwb3J0YXppb25lIGdpw6Agb3JkaW5hdGkgY29ycmV0dGFtZW50ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VBbmRHZXRIZWFkZXJzKG9iajogYW55LCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSk6IENzdkhlYWRlcnNbXSB7XHJcbiAgICB2YXIgaGVhZGVyczogQ3N2SGVhZGVyc1tdID0gW107XHJcblxyXG4gICAgLy8gTWlyYWNsZSBpbmNvbWluZ1xyXG4gICAgbGV0IGV4cG9ydFByb3BzID0gb2JqW2V4cG9ydExpc3RdIHx8IFtdO1xyXG4gICAgbGV0IGxvYyA9IG9ialtsb2NQcm9wZXJ0eV0gPyB0aGlzLmxjLmdlbmVyYXRlRnJvbVR5cGUob2JqW2xvY1Byb3BlcnR5XSkgOiBudWxsO1xyXG5cclxuICAgIGlmIChleHBvcnRQcm9wcy5sZW5ndGggPT0gMClcclxuICAgICAgY29uc29sZS53YXJuKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBOZXNzdW5hIGNvbG9ubmEgY29uZmlndXJhdGEgZGEgZXNwb3J0YXJlIVwiKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cG9ydFByb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwcm9wID0gZXhwb3J0UHJvcHNbaV07XHJcbiAgICAgIGxldCBwcm9wQmFzZSA9IFwiXCI7XHJcbiAgICAgIGxldCB0b0NhbGw6IEZ1bmN0aW9uO1xyXG4gICAgICBpZiAocHJvcC5lbmRzV2l0aChsaXN0Q3N2SGRyUHJlZml4KSkge1xyXG4gICAgICAgIHByb3BCYXNlID0gcHJvcC5yZXBsYWNlKGxpc3RDc3ZIZHJQcmVmaXgsICcnKTtcclxuICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlTGlzdC5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHByb3AuZW5kc1dpdGgoZGljdGlvbmFyeUNzdkhkclByZWZpeCkpIHtcclxuICAgICAgICBwcm9wQmFzZSA9IHByb3AucmVwbGFjZShkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4LCAnJyk7XHJcbiAgICAgICAgdG9DYWxsID0gdGhpcy5wYXJzZURpY3Rpb25hcnkuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChwcm9wLmVuZHNXaXRoKGNzdlZpc1ByZWZpeCkpIHtcclxuICAgICAgICBwcm9wQmFzZSA9IHByb3AucmVwbGFjZShjc3ZWaXNQcmVmaXgsICcnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9ialtwcm9wQmFzZSArIGNzdlZhbHVlTmF2aWdhdG9yXSAhPT0gXCJ1bmRlZmluZWRcIilcclxuICAgICAgICAgIHRvQ2FsbCA9IHRoaXMucGFyc2VPYmplY3QuYmluZCh0aGlzKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0b0NhbGwgPSB0aGlzLnBhcnNlUHJvcGVydHkuYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRvQ2FsbClcclxuICAgICAgICB0b0NhbGwob2JqLCBwcm9wQmFzZSwgaGVhZGVycywgY29sdW1uc1NlbGVjdGlvbiwgbG9jKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGVhZGVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgc2luZ29sYSBwcm9wcmlldMOgLiBcclxuICAgKiBWaWVuZSBnZW5lcmF0byBsJ2hlYWRlciBlIGxhIHByb3ByaWV0w6AgcmVsYXRpdmEgYWwgdmFsb3JlIGZvcm1hdHRhdG8gbyBub1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZVByb3BlcnR5KG9iajogYW55LCBwcm9wOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgY29sdW1uc1NlbGVjdGlvbj86IHsgW2lkOiBzdHJpbmddOiB0cnVlIH0sIGxvYz86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcclxuICAgIGxldCB0b0VtaXQ6IGJvb2xlYW4gPSBvYmpbcHJvcCArIGNzdlZpc1ByZWZpeF07XHJcbiAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSBvYmpbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICBsZXQgcHJvcEtleSA9IG9ialtwcm9wICsgY3N2UHJvcEtleV07XHJcblxyXG4gICAgaWYgKHByb3BLZXkgJiYgIWNvbHVtbnNTZWxlY3Rpb25bcHJvcEtleV0gJiYgT2JqZWN0LmtleXMoY29sdW1uc1NlbGVjdGlvbikubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIltAZXNmYWVuemEvZXh0ZW5zaW9uc10gQ29sb25uYSBkYSBub24gZXNwb3J0YXJlOiBcIiArIHByb3BLZXkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRleHQgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgbGFiZWwgPSBsb2MgJiYgdGV4dCA/IGxvYy5sb2ModGV4dCkgOiB0ZXh0IHx8IFwiXCI7XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgaWYgKCF0b0VtaXQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBTZSBub24gaG8gdW4gZm9ybWF0byBlc3BvcnRvIGRpcmV0dGFtZW50ZVxyXG4gICAgaWYgKCFmb3JtYXQpIHtcclxuICAgICAgLy8gU2Ugw6ggdW4gZm9ybWF0byBkYXRhIG1pIGFzc2ljdXJvIGRpIG5vbiBzdGFtcGFyZSBtYWkgdW5hIGRhdGEgMDA6MDA6MDAgYWx0cmltZW50aSBpbiBlc3BvcnRhemlvbmUgdmllbmUgdW5vIHNjaGlmb1xyXG4gICAgICBsZXQgdmFsID0gb2JqW3Byb3BdID8gdGhpcy5kYXRlcy50cmltU2Vjb25kcyhvYmpbcHJvcF0udG9TdHJpbmcoKSkgOiBcIlwiO1xyXG4gICAgICBsZXQga2V5ID0gcHJvcCArIFwiX25vZm10XCI7XHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXksIG9yZGVyLCB0eXBlOiBcInN0cmluZ1wiLCBwcm9wS2V5IH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGtleSA9IHByb3AgKyBcIl9mbXRcIjtcclxuXHJcbiAgICAgIC8vIENhc28gZm9ybWF0byBudW1lcmljb1xyXG4gICAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgY29uc2lkZXJhbmRvIGxhIHBvc3NpYmlsaXTDoCBkaSB6ZXJpXHJcbiAgICAgICAgbGV0IHZhbCA9IG9ialtwcm9wXSAhPSBudWxsID8gb2JqW3Byb3BdLnRvU3RyaW5nKCkgOiBcIlwiO1xyXG4gICAgICAgIC8vIEVsaW1pbm8gdHV0dGUgbGUgdmlyZ29sZSAoaW5kaWNhdG9yaSBkaSBtaWdsaWFpYSBwZXIgbGEgY3VsdHVyZSBkZWZhdWx0IGVuLVVTKVxyXG4gICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKC8sLywgXCJcIik7XHJcbiAgICAgICAgLy8gSWwgc2luZ29sbyBwdW50byBjaGUgYyfDqCwgc2UgcHJlc2VudGUgKHNlcGFyYXRvcmUgZGVjaW1hbGkpIGxvIHRyYXNmb3JtbyBpbiB2aXJnb2xhXHJcbiAgICAgICAgbGV0IHZhbENvbnZlcnRlZCA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcblxyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsQ29udmVydGVkLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICAgICAgaGVhZGVycy5wdXNoKHsgbGFiZWwsIGtleSwgb3JkZXIsIHR5cGU6IFwibnVtYmVyXCIsIHByb3BLZXkgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gU2UgaG8gdW4gZm9ybWF0byBkYXRhIHRyYXNmb3JtbyBpbiBkYXlqcywgZm9ybWF0dG8gZWQgZXNwb3J0b1xyXG4gICAgICAgIC8vIFBlciBsYSB0cmFzZm9ybWF6aW9uZSBpbiBkYXlqcyBwcm92byBwcmltYSBhIHBhc3NhcmdsaSBsYSBzdHJpbmdhIGRpIG5ldHRvLCBzcGVyYW5kbyBsYSByaWNvbm9zY2FcclxuICAgICAgICAvLyBTZSBub24gZnVuemlvbmEgcHJvdm8gYSBkZWZpbmlyZ2xpIGxhIGZvcm1hdHRhemlvbmUgc3RhbmRhcmQgZGVsIG1ldGVyaW5nIHBlciBxdWVsIGxpbmd1YWdnaW9cclxuICAgICAgICBsZXQgdmFsID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQob2JqW3Byb3BdLCBmb3JtYXQubGVuZ3RoIDw9IDEwLCBmb3JtYXQubGVuZ3RoID4gMTYpO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsID8/IFwiXCIsIHdyaXRhYmxlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5LCBvcmRlciwgdHlwZTogXCJkYXRlXCIsIHByb3BLZXkgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgc2luZ29sYSBwcm9wcmlldMOgIGRhIHVuIG9nZ2V0dG8uIFxyXG4gICAqIFZpZW5lIGdlbmVyYXRvIGwnaGVhZGVyIGUgbGEgcHJvcHJpZXTDoCByZWxhdGl2YSBhbCB2YWxvcmUgZm9ybWF0dGF0byBvIG5vLiBcclxuICAgKiBcclxuICAgKiBQZXIgb3R0ZW5lcmUgaWwgdmFsb3JlIGUgbCdoZWFkZXIgZGVsbGEgcHJvcHJpZXTDoCB2ZW5nb25vIHV0aWxpenphdGkgaSBuYXZpZ2F0b3JpIGF1dG8tZ2VuZXJhdGkgbmVsIGRlY29yYXRvcmUgKipFeHBvcnRBcyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IG9iaiBPZ2dldHRvIGRpIGN1aSBlc3BvcnRhcmUgbGEgcHJvcHJpZXTDoCAqKnByb3AqKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3ByaWV0w6AgZGEgZXNwb3J0YXJlXHJcbiAgICogQHBhcmFtIHtDc3ZIZWFkZXJzfSBoZWFkZXJzIENvbnRlbml0b3JlIGRlZ2xpIGhlYWRlciwgdmVycsOgIHJpZW1waXRvIGRhIHF1ZXN0YSBmdW56aW9uZVxyXG4gICAqIEBwYXJhbSB7TG9jYWxpemF0aW9uU2VydmljZX0gbG9jIFNlcnZpemlvIGRpIGxvY2FsaXp6YXppb25lIGNoZSB0cmFkdWNlIHR1dHRpIGkgbm9taSBjaGUgcHXDslxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGFyc2VPYmplY3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSwgbG9jPzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgLy9zZSBxdWVzdGEgcHJvcHJpZXTDoCBoYSB1biBuYXZpZ2F0b3Igc2lnbmlmaWNhIGNoZSBkZXJpdmEgZGEgdW4gb2dnZXR0byBpbnRlcm5vLCByZWN1cGVybyBpbCB2YWxvcmUgaW4gcXVlc3RhIGZhc2UgZGF0byBjaGUgcHJpbWEgbm9uIGNlIGwnaG9cclxuICAgIGxldCB2YWx1ZW5hdmlnYXRvciA9IG9ialtwcm9wICsgY3N2VmFsdWVOYXZpZ2F0b3JdO1xyXG5cclxuICAgIC8vRXMuIGRpIHZhbHVlbmF2aWdhdG9yIG9iai5zdWJvYmouc3Vic3Vib2JqLnByb3BlcnR5XHJcbiAgICBsZXQgam1wcyA9IHZhbHVlbmF2aWdhdG9yLnNwbGl0KFwiLlwiKTtcclxuXHJcbiAgICAvLyBMb2NhbGl6emF6aW9uZSBwcmVzYSBkYWxsYSBjbGFzc2UgYmFzZSBzZSBjJ8OoLCBhbHRyaW1lbnRpIGRhbGxhIGNsYXNzZSBpbnRlcm5hIChjaW/DqCBkYWwgcHJpbW8gc2FsdGlubylcclxuICAgIGlmICghbG9jKSB7XHJcbiAgICAgIGxldCB0eXBlID0gb2JqW3Byb3AgKyBjc3ZWYWx1ZVR5cGVdO1xyXG4gICAgICBsZXQgcHJvdG8gPSBuZXcgdHlwZSgpO1xyXG4gICAgICBsb2MgPSBwcm90b1tsb2NQcm9wZXJ0eV0gPyB0aGlzLmxjLmdlbmVyYXRlRnJvbVR5cGUocHJvdG9bbG9jUHJvcGVydHldKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9NaSBjbG9ubyBsJ29nZ2V0dG8gb3JpZ2luYWxlIHBlciBub24gdWNjaWRlcmdsaSBpIHJpZmVyaW1lbnRpXHJcbiAgICBsZXQgY2xvbmUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xyXG4gICAgLy9TYWx0byByaWNvcnNpdmFtZW50ZSBzdSBtZSBzdGVzc28gcGVyIGFycml2YXJlIGFsbGEgcHJvcHJpZXTDoFxyXG4gICAgLy9TYWx0byAxID4gZGl2ZW50YSBvYmpcclxuICAgIC8vU2FsdG8gMiA+IGRpdmVudGEgb2JqLnN1Ym9ialxyXG4gICAgLy9lY2MuLi5cclxuICAgIGptcHMuZm9yRWFjaChwcCA9PiB7IGNsb25lID0gY2xvbmU/LltwcF07IH0pO1xyXG5cclxuICAgIC8vVmFsb3JlIGZpbmFsZSA6RFxyXG4gICAgbGV0IHZhbHVlID0gY2xvbmU7XHJcblxyXG4gICAgbGV0IHRleHQgPSBvYmpbcHJvcCArIGNzdkhkclByZWZpeF07XHJcbiAgICBsZXQgbGFiZWwgPSBsb2MgJiYgdGV4dCA/IGxvYy5sb2ModGV4dCkgOiB0ZXh0IHx8IFwiXCI7XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgLy9TZSBwZXIgcXVlc3RhIHByb3ByaWV0w6AgaG8gdW4gZm9ybWF0byBsbyBhcHBsaWNvXHJcbiAgICBsZXQgZm9ybWF0OiBzdHJpbmcgPSBvYmpbcHJvcCArIGNzdkZvcm1hdFByZWZpeF07XHJcbiAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyA9IFwic3RyaW5nXCI7XHJcbiAgICBpZiAoZm9ybWF0ID09IFwiRlwiKSB7XHJcbiAgICAgIGxldCB2YWwgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgvLC8sIFwiXCIpO1xyXG4gICAgICB2YWx1ZSA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcbiAgICAgIHR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm9ybWF0KSB7XHJcbiAgICAgIHZhbHVlID0gdGhpcy5kYXRlcy5nZXRGb3JtYXR0ZWQodmFsdWUsIGZvcm1hdC5sZW5ndGggPD0gMTAsIGZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgIHR5cGUgPSBcImRhdGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XHJcbiAgICBoZWFkZXJzLnB1c2goeyBsYWJlbCwga2V5OiBwcm9wLCBvcmRlciwgdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmUgXHJcbiAgICogQHBhcmFtIHtMb2NhbGl6YXRpb25TZXJ2aWNlfSBsb2MgU2Vydml6aW8gZGkgbG9jYWxpenphemlvbmUgY2hlIHRyYWR1Y2UgdHV0dGkgaSBub21pIGNoZSBwdcOyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJzZUxpc3Qob2JqOiBhbnksIHByb3A6IHN0cmluZywgaGVhZGVyczogQ3N2SGVhZGVyc1tdLCBjb2x1bW5zU2VsZWN0aW9uPzogeyBbaWQ6IHN0cmluZ106IHRydWUgfSAsIGxvYz86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcclxuICAgIGxldCBoZWFkZXJuYXZpZ2F0b3IgPSBvYmpbcHJvcCArIGxpc3RDc3ZIZHJQcmVmaXhdO1xyXG4gICAgbGV0IHZhbHVlbmF2aWdhdG9yID0gb2JqW3Byb3AgKyBsaXN0Q3N2VmFsUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZWZvcm1hdCA9IG9ialtwcm9wICsgbGlzdENzdlZhbEZvcm1hdF07XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgdmFyIGp1bXBzOiBzdHJpbmdbXSwgdG1wUmVzOiBhbnk7XHJcbiAgICB2YXIgb2JqczogYW55W10gPSBvYmpbcHJvcF07XHJcblxyXG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgb2Jqcy5sZW5ndGg7IGlkeCsrKSB7XHJcbiAgICAgIGxldCBsaXN0aXRlbSA9IG9ianNbaWR4XTtcclxuXHJcbiAgICAgIHZhciBoZWFkZXJzcGxpdCA9IGhlYWRlcm5hdmlnYXRvci5zcGxpdChcIiBcIik7XHJcbiAgICAgIHZhciBsYWJlbCA9IFwiXCI7XHJcblxyXG4gICAgICAvLyBQZXIgbCdoZWFkZXIgc2kgY29uc2lkZXJhIGEgc2Ugc3RhbnRlIG9nbmkgcGV6em8gc2VwYXJhdG8gZGEgc3BhemlvIHBlciBmYXJlIGxlIGNvbmNhdGVuYXppb25pXHJcbiAgICAgIGhlYWRlcnNwbGl0LmZvckVhY2gocHIgPT4ge1xyXG4gICAgICAgIGp1bXBzID0gcHIuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAgICBqdW1wcy5mb3JFYWNoKHBwID0+IHsgdG1wUmVzID0gdG1wUmVzW3BwXTsgfSk7XHJcblxyXG4gICAgICAgIGxldCBsb2NhbGl6ZWQgPSAhIWxvYyA/IGxvYy5sb2ModG1wUmVzKSA6IHRtcFJlc1xyXG4gICAgICAgIGlmICghbGFiZWwpIGxhYmVsID0gbG9jYWxpemVkO1xyXG4gICAgICAgIGVsc2UgbGFiZWwgKz0gXCIgXCIgKyBsb2NhbGl6ZWQ7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAganVtcHMgPSB2YWx1ZW5hdmlnYXRvci5zcGxpdChcIi5cIik7XHJcbiAgICAgIHRtcFJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGlzdGl0ZW0pKTtcclxuICAgICAganVtcHMuZm9yRWFjaChwcCA9PiB7IHRtcFJlcyA9IHRtcFJlc1twcF07IH0pO1xyXG4gICAgICBsZXQgdmFsdWUgPSB0bXBSZXM7XHJcblxyXG4gICAgICBsZXQgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyA9IFwic3RyaW5nXCI7XHJcbiAgICAgIGlmICh2YWx1ZWZvcm1hdCA9PSBcIkZcIikge1xyXG4gICAgICAgIGxldCB2YWwgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IFwiXCI7XHJcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLywvLCBcIlwiKTtcclxuICAgICAgICB2YWx1ZSA9IHZhbC5yZXBsYWNlKFwiLlwiLCBcIixcIik7XHJcbiAgICAgICAgdHlwZSA9IFwibnVtYmVyXCI7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodmFsdWVmb3JtYXQpIHtcclxuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZXMuZ2V0Rm9ybWF0dGVkKG9ialtwcm9wXSwgdmFsdWVmb3JtYXQubGVuZ3RoIDw9IDEwLCB2YWx1ZWZvcm1hdC5sZW5ndGggPiAxNik7XHJcbiAgICAgICAgdHlwZSA9IFwiZGF0ZVwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wICsgaWR4LCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsLCBrZXk6IHByb3AgKyBpZHgsIG9yZGVyOiBvcmRlciArIGlkeCwgdHlwZSwgcHJvcEtleTogbnVsbCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHBlciBsJ2VzcG9ydGF6aW9uZSBkaSB1bmEgbGlzdGEgZGkgdmFsb3JpIHBpdm90dGF0aSBkaW5hbWljYW1lbnRlOlxyXG4gICAqIFxyXG4gICAqID0+IFJlY3VwZXJvIGlsIHZhbG9yZSB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBSZWN1cGVybyBsJ2hlYWRlciB1dGlsaXp6YW5kbyBpIG5hdmlnYXRvcmlcclxuICAgKiBcclxuICAgKiA9PiBDb24gaWwgdmFsb3JlIGNpIGNyZW8gbGEgcHJvcGVydHlcclxuICAgKiBcclxuICAgKiA9PiBDb24gbCdoZWFkZXIgZSBpbCByaWZlcmltZW50byBhbGxhIHByb3BlcnR5IGFwcGVuYSBjcmVhdGEgY3JlbyB1biByZWNvcmQgbmVnbGkgaGVhZGVyIGRhIGVzcG9ydGFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkaSBjdWkgZXNwb3J0YXJlIGxhIHByb3ByaWV0w6AgKipwcm9wKipcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wcmlldMOgIGRhIGVzcG9ydGFyZVxyXG4gICAqIEBwYXJhbSB7Q3N2SGVhZGVyc30gaGVhZGVycyBDb250ZW5pdG9yZSBkZWdsaSBoZWFkZXIsIHZlcnLDoCByaWVtcGl0byBkYSBxdWVzdGEgZnVuemlvbmVcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlRGljdGlvbmFyeShvYmo6IGFueSwgcHJvcDogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGNvbHVtbnNTZWxlY3Rpb24/OiB7IFtpZDogc3RyaW5nXTogdHJ1ZSB9KSB7XHJcbiAgICBsZXQgaGVhZGVycHJlZml4ID0gb2JqW3Byb3AgKyBkaWN0aW9uYXJ5Q3N2SGRyUHJlZml4XTtcclxuICAgIGxldCB2YWx1ZXByZWZpeCA9IG9ialtwcm9wICsgZGljdGlvbmFyeUNzdlZhbFByZWZpeF07XHJcbiAgICBsZXQgb3JkZXIgPSBvYmpbcHJvcCArIGNzdk9yZFByZWZpeF07XHJcblxyXG4gICAgdmFyIG9iamVjdDogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0gb2JqW3Byb3BdO1xyXG4gICAgbGV0IGlkeCA9IDA7XHJcblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iamVjdCkpIHtcclxuXHJcbiAgICAgIC8vIElnbm9ybyB0dXR0aSBpIGNtYXBpIGNoZSBub24gZmFubm8gcGFydGUgZGVsbGEgc2VsZXppb25lIGRlbGxlIGNvbG9ubmVcclxuICAgICAgaWYgKGNvbHVtbnNTZWxlY3Rpb24gJiYgIWNvbHVtbnNTZWxlY3Rpb25ba2V5XSlcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGxldCBwcm9wbmFtZSA9IHByb3AgKyBcIl9cIiArIGtleTtcclxuICAgICAgbGV0IHZhbHVlID0gdmFsdWVwcmVmaXggPyB2YWx1ZXByZWZpeCArIFwiIFwiICsgdmFsIDogdmFsO1xyXG4gICAgICBsZXQgbGFiZWwgPSBoZWFkZXJwcmVmaXggPyBoZWFkZXJwcmVmaXggKyBcIiBcIiArIGtleSA6IGtleTtcclxuXHJcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BuYW1lLCB7IHZhbHVlOiB2YWx1ZSA/PyBcIlwiLCB3cml0YWJsZTogZmFsc2UgfSk7XHJcbiAgICAgIGhlYWRlcnMucHVzaCh7IGxhYmVsOiBsYWJlbCwga2V5OiBwcm9wbmFtZSwgb3JkZXI6IG9yZGVyICsgaWR4KyssIHR5cGU6ICdzdHJpbmcnLCBwcm9wS2V5OiBudWxsIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIEVmZmV0dHVhIGwnZXNwb3J0YXppb25lIGluIGZpbGUgQ1NWIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZXhwb3J0Q1NWKGZuOiBzdHJpbmcsIGhlYWRlcnM6IENzdkhlYWRlcnNbXSwgZGF0YTogYW55W10pIHtcclxuICAgIGxldCBjc3ZEYXRhID0gJycsIHJvdyA9ICcnLCBzZXAgPSAnOyc7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBoID0gaGVhZGVyc1tpXTtcclxuICAgICAgcm93ICs9IGAke3JvdyAhPSAnJyA/IHNlcCA6ICcnfVwiJHtoLmxhYmVsfVwiYDtcclxuICAgIH1cclxuICAgIGNzdkRhdGEgKz0gcm93ICsgJ1xcclxcbic7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJvdyA9ICcnO1xyXG4gICAgICBsZXQgaXRlbSA9IGRhdGFbaV07XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVhZGVycy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGxldCB2YWwgPSBpdGVtW2hlYWRlcnNbal0ua2V5XTtcclxuICAgICAgICByb3cgKz0gYCR7cm93ICE9ICcnID8gc2VwIDogJyd9XCIke3ZhbH1cImA7XHJcbiAgICAgIH1cclxuICAgICAgY3N2RGF0YSArPSByb3cgKyAnXFxyXFxuJztcclxuICAgIH1cclxuXHJcbiAgICB2YXIgQk9NID0gbmV3IFVpbnQ4QXJyYXkoWzB4RUYsMHhCQiwweEJGXSk7XHJcbiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtCT00sIGNzdkRhdGFdLCB7IHR5cGU6ICd0ZXh0L2NzdicgfSk7XHJcbiAgICB2YXIgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIHRoaXMudXRpRXh0cy5maWxlRG93bmxvYWQob2JqZWN0VXJsLCBmbi5lbmRzV2l0aCgnLnhsc3gnKSA/IGZuLnJlcGxhY2UoJy54bHN4JywgJy5jc3YnKSA6IGZuLmVuZHNXaXRoKCcuY3N2JykgPyBmbiA6IGZuICsgXCIuY3N2XCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKiBDYWNoZSBkZWwgbW9kdWxvIHBlciBsJ2VzcG9ydGF6aW9uZSBFeGNlbCAqL1xyXG4gIHByaXZhdGUgRXhjZWxKUzogYW55O1xyXG5cclxuICAvKiogRWZmZXR0dWEgbCdlc3BvcnRhemlvbmUgZGVsIGZpbGUgRXhjZWwgYmFzYW5kb3NpIHN1bCBtb2R1bG8gKipFeGNlbEpTKiosIHN1Z2xpIGhlYWRlciAqKmhlYWRlcnMqKiBlIHN1aSBkYXRpICoqZGF0YSoqICovXHJcbiAgcHJpdmF0ZSBhc3luYyBleHBvcnRFeGNlbChmbjogc3RyaW5nLCBoZWFkZXJzOiBDc3ZIZWFkZXJzW10sIGRhdGE6IGFueVtdKSB7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5FeGNlbEpTID0gdGhpcy5FeGNlbEpTIHx8IGF3YWl0IGltcG9ydChcImV4Y2VsanNcIik7XHJcbiAgICB9XHJcbiAgICBjYXRjaCB7XHJcbiAgICAgIHRocm93IFwiSW1wb3NzaWJpbGUgY2FyaWNhcmUgbGEgbGlicmVyaWEgcGVyIGwnZXNwb3J0YXppb25lIGluIEV4Y2VsXCI7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGlGaXggPSAxO1xyXG4gICAgbGV0IHdvcmtib29rID0gbmV3IHRoaXMuRXhjZWxKUy5Xb3JrYm9vaygpO1xyXG4gICAgd29ya2Jvb2suY3JlYXRvciA9IFwiRW1hJ3MgYmlnIEVzLVRhYmxlXCI7XHJcbiAgICB3b3JrYm9vay5jcmVhdGVkID0gbmV3IERhdGUoKTtcclxuXHJcbiAgICBsZXQgc2hlZXQgPSB3b3JrYm9vay5hZGRXb3Jrc2hlZXQoJ0RhdGEnKTtcclxuICAgIGxldCBoZWFkZXIgPSBzaGVldC5nZXRSb3coMSk7XHJcbiAgICBoZWFkZXIuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc29ydCgoYTogQ3N2SGVhZGVycywgYjogQ3N2SGVhZGVycykgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgaCA9IGhlYWRlcnNbaV07XHJcbiAgICAgIGhlYWRlci5nZXRDZWxsKGkgKyBpRml4KS52YWx1ZSA9IGgubGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCByb3cgPSBzaGVldC5nZXRSb3coaSArIGlGaXggKyAxKTtcclxuICAgICAgbGV0IGl0ZW0gPSBkYXRhW2ldO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgaCA9IGhlYWRlcnNbaV07XHJcbiAgICAgICAgbGV0IGNlbGwgPSByb3cuZ2V0Q2VsbChpICsgMSk7XHJcbiAgICAgICAgbGV0IHZhbCA9IGl0ZW1baC5rZXldO1xyXG5cclxuICAgICAgICBpZiAoIXZhbCkge1xyXG4gICAgICAgICAgY2VsbC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN3aXRjaCAoaC50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICAgICAgLy8gRXhjZWxKUyB2YSBkaSBkZWZhdWx0IGluIFVUQyBxdWluZGkgcmlzY2hpZXJlYmJlIGRpIHRpcmFyZSBnacO5IDIgb3JlIGFkIG9nbmkgZXNwb3J0YXppb25lXHJcbiAgICAgICAgICAgIC8vIEJpc29nbmEgYWdnaXVuZ2VyZSBsJ3V0YyBvZmZzZXQgYWxsYSBkYXRhIGF0dHVhbGVcclxuICAgICAgICAgICAgbGV0IGRhdGUgPSB0aGlzLmRhdGVzLmdldERhdGVDb252ZXJ0aW9uKHZhbCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNvcnJlY3RlZERhdGUgPSBkYXRlLmFkZChkYXRlLnV0Y09mZnNldCgpLCAnbWludXRlJyk7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IGNvcnJlY3RlZERhdGUudG9EYXRlKCk7XHJcbiAgICAgICAgICAgICAgY2VsbC5udW1GbXQgPSB2YWwubGVuZ3RoID4gMTAgPyAnZGQvbW0veXl5eSBoOm06cycgOiAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgICAgIGxldCBjb252ZXJ0ZWQgPSBwYXJzZUZsb2F0KHZhbC5yZXBsYWNlKCcsJywgJy4nKSk7XHJcbiAgICAgICAgICAgIGNlbGwudmFsdWUgPSBpc05hTihjb252ZXJ0ZWQpID8gXCJcIiA6IGNvbnZlcnRlZDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjZWxsLnZhbHVlID0gdmFsO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgYnVmZmVyID0gYXdhaXQgd29ya2Jvb2sueGxzeC53cml0ZUJ1ZmZlcigpO1xyXG4gICAgbGV0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0O1wiIH0pO1xyXG4gICAgbGV0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICB0aGlzLnV0aUV4dHMuZmlsZURvd25sb2FkKG9iamVjdFVybCwgZm4uZW5kc1dpdGgoJy5jc3YnKSA/IGZuLnJlcGxhY2UoJy5jc3YnLCAnLnhsc3gnKSA6IGZuLmVuZHNXaXRoKCcueGxzeCcpID8gZm4gOiBmbiArIFwiLnhsc3hcIik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gY2hlIGVmZmV0dGl2YW1lbnRlIGdlbmVyYSBnbGkgaGVhZGVyIGUgaSBkYXRpIHBlciBsJ2VzcG9ydGF6aW9uZSBjb24gKipuZ3gtY3N2KipcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgZGEgZXNwb3J0YXJlXHJcbiAgICovXHJcbiAgcHVibGljIGV4cG9ydChpdGVtczogYW55W10sIGZvcm1hdDogJ0NTVicgfCAnWExTWCcsIGZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFR5cGU8YW55PiwgY29sdW1uc0ZpbHRlcj86IHN0cmluZ1tdLCBnZW5lcmljSGVhZGVycz86IENzdkhlYWRlcnNbXSkge1xyXG4gICAgdmFyIGNyZWF0ZWRJdGVtcyA9IGl0ZW1zLm1hcCh0ID0+IHtcclxuICAgICAgbGV0IHRtcCA9IG5ldyB0eXBlKCk7XHJcbiAgICAgIGZvcihsZXQgcHJvcGVydHkgaW4gdCkgdG1wW3Byb3BlcnR5XSA9IHRbcHJvcGVydHldO1xyXG4gICAgICByZXR1cm4gdG1wO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IGhlYWRlcnMgPSBnZW5lcmljSGVhZGVycyA/IHRoaXMuc2V0dXBGb3JHZW5lcmljRXhwb3J0KGNyZWF0ZWRJdGVtcywgZ2VuZXJpY0hlYWRlcnMpIDogdGhpcy5zZXR1cEZvckV4cG9ydChjcmVhdGVkSXRlbXMsIGNvbHVtbnNGaWx0ZXIpO1xyXG4gICAgKGZvcm1hdCA9PSBcIkNTVlwiID8gdGhpcy5leHBvcnRDU1YgOiB0aGlzLmV4cG9ydEV4Y2VsKS5iaW5kKHRoaXMpKGZpbGVOYW1lLCBoZWFkZXJzLCBjcmVhdGVkSXRlbXMpO1xyXG4gIH1cclxufSJdfQ==
|
|
@@ -1668,13 +1668,13 @@ const ExportList = (order, headernavigator, valuenavigator, valueformat = null)
|
|
|
1668
1668
|
* partendo da un oggetto iniziale { Valore { A: 1, B: 2, C: 3 } }
|
|
1669
1669
|
*
|
|
1670
1670
|
* @param {number} order Ordine di esportazione. Più piccolo è, prima appare il valore
|
|
1671
|
-
* @param {string}
|
|
1672
|
-
* @param {string}
|
|
1671
|
+
* @param {string} headerprefix Prefisso per l'header
|
|
1672
|
+
* @param {string} valueprefix Prefisso per il valore
|
|
1673
1673
|
*/
|
|
1674
|
-
const ExportDictionary = (order,
|
|
1674
|
+
const ExportDictionary = (order, headerprefix, valueprefix) => (target, propertyKey) => {
|
|
1675
1675
|
Object.defineProperty(target, propertyKey + csvOrdPrefix, { value: order, writable: false });
|
|
1676
|
-
Object.defineProperty(target, propertyKey + dictionaryCsvValPrefix, { value:
|
|
1677
|
-
Object.defineProperty(target, propertyKey + dictionaryCsvHdrPrefix, { value:
|
|
1676
|
+
Object.defineProperty(target, propertyKey + dictionaryCsvValPrefix, { value: valueprefix, writable: false });
|
|
1677
|
+
Object.defineProperty(target, propertyKey + dictionaryCsvHdrPrefix, { value: headerprefix, writable: false });
|
|
1678
1678
|
if (target[exportList])
|
|
1679
1679
|
target[exportList].push(propertyKey + dictionaryCsvHdrPrefix);
|
|
1680
1680
|
else
|
|
@@ -1906,7 +1906,7 @@ class ExportService {
|
|
|
1906
1906
|
//Salto 1 > diventa obj
|
|
1907
1907
|
//Salto 2 > diventa obj.subobj
|
|
1908
1908
|
//ecc...
|
|
1909
|
-
jmps.forEach(pp => { clone = clone[pp]; });
|
|
1909
|
+
jmps.forEach(pp => { clone = clone === null || clone === void 0 ? void 0 : clone[pp]; });
|
|
1910
1910
|
//Valore finale :D
|
|
1911
1911
|
let value = clone;
|
|
1912
1912
|
let text = obj[prop + csvHdrPrefix];
|
|
@@ -1999,39 +1999,22 @@ class ExportService {
|
|
|
1999
1999
|
* @param {any} obj Oggetto di cui esportare la proprietà **prop**
|
|
2000
2000
|
* @param {string} prop Proprietà da esportare
|
|
2001
2001
|
* @param {CsvHeaders} headers Contenitore degli header, verrà riempito da questa funzione
|
|
2002
|
-
* @param {LocalizationService} loc Servizio di localizzazione che traduce tutti i nomi che può
|
|
2003
2002
|
*/
|
|
2004
|
-
parseDictionary(obj, prop, headers, columnsSelection
|
|
2005
|
-
let
|
|
2006
|
-
let
|
|
2003
|
+
parseDictionary(obj, prop, headers, columnsSelection) {
|
|
2004
|
+
let headerprefix = obj[prop + dictionaryCsvHdrPrefix];
|
|
2005
|
+
let valueprefix = obj[prop + dictionaryCsvValPrefix];
|
|
2007
2006
|
let order = obj[prop + csvOrdPrefix];
|
|
2008
|
-
var
|
|
2009
|
-
|
|
2010
|
-
for (
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
label = !!loc ? loc.loc(tmpRes) : tmpRes;
|
|
2020
|
-
else
|
|
2021
|
-
label += " " + !!loc ? loc.loc(tmpRes) : tmpRes;
|
|
2022
|
-
});
|
|
2023
|
-
var valuesplit = valuenavigator.split(",");
|
|
2024
|
-
valuesplit.forEach((t, idxinternal) => {
|
|
2025
|
-
var navig = t.split("-")[1];
|
|
2026
|
-
var desc = t.split("-")[0];
|
|
2027
|
-
jumps = navig.split(".");
|
|
2028
|
-
tmpRes = JSON.parse(JSON.stringify(listitem));
|
|
2029
|
-
jumps.forEach(pp => { tmpRes = tmpRes[pp]; });
|
|
2030
|
-
let value = tmpRes;
|
|
2031
|
-
let propname = prop + idx.toString() + idxinternal.toString();
|
|
2032
|
-
Object.defineProperty(obj, propname, { value: value !== null && value !== void 0 ? value : "", writable: false });
|
|
2033
|
-
headers.push({ label: label + " " + !!loc ? loc.loc(desc) : desc, key: propname, order: order + idx, type: 'string', propKey: null });
|
|
2034
|
-
});
|
|
2007
|
+
var object = obj[prop];
|
|
2008
|
+
let idx = 0;
|
|
2009
|
+
for (const [key, val] of Object.entries(object)) {
|
|
2010
|
+
// Ignoro tutti i cmapi che non fanno parte della selezione delle colonne
|
|
2011
|
+
if (columnsSelection && !columnsSelection[key])
|
|
2012
|
+
continue;
|
|
2013
|
+
let propname = prop + "_" + key;
|
|
2014
|
+
let value = valueprefix ? valueprefix + " " + val : val;
|
|
2015
|
+
let label = headerprefix ? headerprefix + " " + key : key;
|
|
2016
|
+
Object.defineProperty(obj, propname, { value: value !== null && value !== void 0 ? value : "", writable: false });
|
|
2017
|
+
headers.push({ label: label, key: propname, order: order + idx++, type: 'string', propKey: null });
|
|
2035
2018
|
}
|
|
2036
2019
|
}
|
|
2037
2020
|
/**
|