ngx-material-entity 15.2.2 → 15.2.4
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/components/edit-page/edit-page.component.d.ts +27 -2
- package/components/table/edit-dialog/edit-data.builder.d.ts +16 -2
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +17 -2
- package/components/table/table-data.d.ts +37 -0
- package/components/table/table.component.d.ts +1 -0
- package/encapsulation/reflect.utilities.d.ts +1 -0
- package/esm2020/components/edit-page/edit-page.component.mjs +62 -9
- package/esm2020/components/edit-page/page-edit-data.builder.mjs +3 -3
- package/esm2020/components/input/input.component.mjs +3 -3
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +3 -3
- package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +21 -4
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +50 -7
- package/esm2020/components/table/table-data.builder.mjs +11 -6
- package/esm2020/components/table/table-data.mjs +1 -1
- package/esm2020/components/table/table.component.mjs +4 -3
- package/esm2020/encapsulation/reflect.utilities.mjs +2 -1
- package/esm2020/public-api.mjs +1 -2
- package/esm2020/utilities/date.utilities.mjs +3 -2
- package/esm2020/utilities/entity.utilities.mjs +10 -7
- package/fesm2015/ngx-material-entity.mjs +199 -80
- package/fesm2015/ngx-material-entity.mjs.map +1 -1
- package/fesm2020/ngx-material-entity.mjs +198 -80
- package/fesm2020/ngx-material-entity.mjs.map +1 -1
- package/package.json +1 -2
- package/public-api.d.ts +0 -1
|
@@ -780,12 +780,15 @@ export class EntityUtilities {
|
|
|
780
780
|
res.push(firstTab);
|
|
781
781
|
}
|
|
782
782
|
for (let i = 2; i <= numberOfTabs; i++) {
|
|
783
|
-
const
|
|
784
|
-
|
|
785
|
-
tab
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
783
|
+
const rows = EntityUtilities.getEntityRows(entity, i, hideOmitForCreate, hideOmitForEdit, additionalOmitValues);
|
|
784
|
+
if (rows.length) {
|
|
785
|
+
const tab = {
|
|
786
|
+
tabName: EntityUtilities.getTabName(entity, i),
|
|
787
|
+
tab: i,
|
|
788
|
+
rows: rows
|
|
789
|
+
};
|
|
790
|
+
res.push(tab);
|
|
791
|
+
}
|
|
789
792
|
}
|
|
790
793
|
return res;
|
|
791
794
|
}
|
|
@@ -879,4 +882,4 @@ EntityUtilities.DATE_RANGE_END_KEY = 'dateRangeEnd';
|
|
|
879
882
|
EntityUtilities.construct = EntityUtilities.new;
|
|
880
883
|
// eslint-disable-next-line @typescript-eslint/member-ordering, jsdoc/require-jsdoc, @typescript-eslint/typedef
|
|
881
884
|
EntityUtilities.build = EntityUtilities.new;
|
|
882
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFXeEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFvQmpEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixlQUFlO0lBK0NqQzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBZ0QsTUFBa0I7UUFDckYsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxRQUFRLEdBQW9DLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkcsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBZ0QsTUFBa0I7UUFDckYsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxR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QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxlQUFlLEVBQUU7WUFDakIsTUFBTSxpQkFBaUIsR0FBeUIsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pGLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7O0FBcmdDRDs7R0FFRztBQUNhLDBDQUEwQixHQUFXLHFCQUFxQixDQUFDO0FBRTNFOztHQUVHO0FBQ2Esd0NBQXdCLEdBQVcsb0JBQW9CLENBQUM7QUFFeEU7O0dBRUc7QUFDYSx3Q0FBd0IsR0FBVyxvQkFBb0IsQ0FBQztBQUV4RTs7R0FFRztBQUNhLDZCQUFhLEdBQVcsV0FBVyxDQUFDO0FBRXBEOztHQUVHO0FBQ2Esb0NBQW9CLEdBQVcsaUJBQWlCLENBQUM7QUFFakU7O0dBRUc7QUFDYSx3QkFBUSxHQUFXLE1BQU0sQ0FBQztBQUUxQzs7R0FFRztBQUNhLDhCQUFjLEdBQVcsV0FBVyxDQUFDO0FBRXJEOztHQUVHO0FBQ2Esb0NBQW9CLEdBQVcsZ0JBQWdCLENBQUM7QUFFaEU7O0dBRUc7QUFDYSxrQ0FBa0IsR0FBVyxjQUFjLENBQUM7QUF3TTVELCtHQUErRztBQUN4Ryx5QkFBUyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUM7QUFDdkMsK0dBQStHO0FBQ3hHLHFCQUFLLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRpbWUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGF0ZUZpbHRlckZuIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IERhdGVSYW5nZUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2FycmF5L2FycmF5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlY29yYXRvclR5cGUsIERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvcHJvcGVydHktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgVG9nZ2xlQm9vbGVhbkRlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9ib29sZWFuL2Jvb2xlYW4tZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2N1c3RvbS9jdXN0b20tZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBEYXRlVGltZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRGVmYXVsdERhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBGaWxlRGF0YSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvbnVtYmVyL251bWJlci1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL29iamVjdC9vYmplY3QtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsLCBQYXNzd29yZFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsLCBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL3N0cmluZy9zdHJpbmctZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IFJlZmxlY3RVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL3JlZmxlY3QudXRpbGl0aWVzJztcbmltcG9ydCB7IERhdGVVdGlsaXRpZXMgfSBmcm9tICcuL2RhdGUudXRpbGl0aWVzJztcbmltcG9ydCB7IEZpbGVVdGlsaXRpZXMgfSBmcm9tICcuL2ZpbGUudXRpbGl0aWVzJztcblxuLyoqXG4gKiBTaG93cyBpbmZvcm1hdGlvbiBhYm91dCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBlbnRpdGllcy5cbiAqL1xuaW50ZXJmYWNlIERpZmZlcmVuY2U8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSB3aGVyZSB0aGUgdHdvIGVudGl0aWVzIGhhdmUgZGlmZmVyZW50IHZhbHVlcy5cbiAgICAgKi9cbiAgICBrZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBiZWZvcmU6IHVua25vd24sXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmFsdWUgYWZ0ZXIgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBhZnRlcjogdW5rbm93blxufVxuXG4vKipcbiAqIENvbnRhaW5zIEhlbHBlck1ldGhvZHMgYXJvdW5kIGhhbmRsaW5nIEVudGl0aWVzIGFuZCB0aGVpciBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVudGl0eVV0aWxpdGllcyB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciBhbGwga2V5cyBvZiBtZXRhZGF0YSB0aGF0IHNob3VsZCBiZSBzZXQgdG8gdW5kZWZpbmVkIHdoZW4gdGhlIGVudGl0eSBnZXRzIHJlc2V0LlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBNRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWTogc3RyaW5nID0gJ21ldGFkYXRhS2V5c1RvUmVzZXQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIHNpbmdsZSBwcmV2aWV3IGltYWdlIHZhbHVlIG9uIGltYWdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IFNJTkdMRV9QUkVWSUVXX0lNQUdFX0tFWTogc3RyaW5nID0gJ3NpbmdsZVByZXZpZXdJbWFnZSc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgbXVsdGkgcHJldmlldyBpbWFnZXMgdmFsdWUgb24gaW1hZ2UgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgTVVMVElfUFJFVklFV19JTUFHRVNfS0VZOiBzdHJpbmcgPSAnbXVsdGlQcmV2aWV3SW1hZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBmaWxlbmFtZXMgdmFsdWUgb24gZmlsZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBGSUxFTkFNRVNfS0VZOiBzdHJpbmcgPSAnZmlsZU5hbWVzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBjb25maXJtIHBhc3N3b3JkIHZhbHVlIG9uIHBhc3N3b3JkIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IENPTkZJUk1fUEFTU1dPUkRfS0VZOiBzdHJpbmcgPSAnY29uZmlybVBhc3N3b3JkJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSB0aW1lIHZhbHVlIG9uIGRhdGUgdGltZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBUSU1FX0tFWTogc3RyaW5nID0gJ3RpbWUnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIGRhdGUgcmFuZ2UgdmFsdWUgb24gZGF0ZSByYW5nZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBEQVRFX1JBTkdFX0tFWTogc3RyaW5nID0gJ2RhdGVSYW5nZSc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgZGF0ZSByYW5nZSBzdGFydCB2YWx1ZSBvbiBkYXRlIHJhbmdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IERBVEVfUkFOR0VfU1RBUlRfS0VZOiBzdHJpbmcgPSAnZGF0ZVJhbmdlU3RhcnQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIGRhdGUgcmFuZ2UgZW5kIHZhbHVlIG9uIGRhdGUgcmFuZ2UgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgREFURV9SQU5HRV9FTkRfS0VZOiBzdHJpbmcgPSAnZGF0ZVJhbmdlRW5kJztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgdG8gb21pdCB3aGVuIHVwZGF0aW5nIHRoZSBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciB1cGRhdGluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgdXBkYXRpbmcgYW4gRW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPbWl0Rm9yVXBkYXRlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEub21pdEZvclVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIHRvIG9taXQgd2hlbiBjcmVhdGluZyBuZXcgZW50aXRpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciBjcmVhdGluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgY3JlYXRpbmcgYSBuZXcgRW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPbWl0Rm9yQ3JlYXRlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEub21pdEZvckNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBlbnRpdHkgd2l0aG91dCB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgd2l0aCBhbGwgaXRzIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVkdWNlZCBlbnRpdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXaXRob3V0T21pdENyZWF0ZVZhbHVlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IFBhcnRpYWw8RW50aXR5VHlwZT4ge1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLm9taXQoZW50aXR5LCBFbnRpdHlVdGlsaXRpZXMuZ2V0T21pdEZvckNyZWF0ZShlbnRpdHkpKSBhcyBQYXJ0aWFsPEVudGl0eVR5cGU+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGVudGl0eSB3aXRob3V0IHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgb21pdHRlZCBmb3IgdXBkYXRpbmcuXG4gICAgICogVGhpcyBhbHNvIGhhbmRsZXMgb21pdHRpbmcga2V5cyBmb3IgQG9iamVjdCBvciBAYXJyYXkgdmFsdWVzIGFuZCByZW1vdmVzIHZhbHVlcyB0aGF0IGhhdmVuJ3QgYmVlbiBjaGFuZ2VkIGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIGFsbCBpdHMgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSBhbnkgY2hhbmdlcyB3ZXJlIGFwcGxpZWQuXG4gICAgICogQHJldHVybnMgVGhlIHJlZHVjZWQgZW50aXR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0V2l0aG91dE9taXRVcGRhdGVWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGVcbiAgICApOiBQcm9taXNlPFBhcnRpYWw8RW50aXR5VHlwZT4+IHtcbiAgICAgICAgY29uc3QgcmVzOiBQYXJ0aWFsPEVudGl0eVR5cGU+ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5LCBmYWxzZSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghKGF3YWl0IEVudGl0eVV0aWxpdGllcy5pc0VxdWFsKGVudGl0eVtrZXldLCBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSwgbWV0YWRhdGEsIHR5cGUpKSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzW2tleV0gYXMgb2JqZWN0KSA9IExvZGFzaFV0aWxpdGllcy5vbWl0KGVudGl0eVtrZXldIGFzIGFueSwgRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5W2tleV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc1trZXldIGFzIG9iamVjdFtdKSA9IChlbnRpdHlba2V5XSBhcyBvYmplY3RbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHZhbHVlID0+IExvZGFzaFV0aWxpdGllcy5vbWl0KHZhbHVlLCBFbnRpdHlVdGlsaXRpZXMuZ2V0T21pdEZvckNyZWF0ZSh2YWx1ZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlbnRpdHlba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHByb3BlcnRpZXMgb24gdGhlIGdpdmVuIGVudGl0eSB3aGljaCBhcmUgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBjaGVjayBmb3IgZmlsZSBwcm9wZXJ0aWVzLlxuICAgICAqIEBwYXJhbSBvbWl0IC0gV2hldGhlciB0byBsZWF2ZSBvdXQgdmFsdWVzIHRoYXQgYXJlIG9taXR0ZWQgZm9yIGNyZWF0ZSBvciBkZWxldGUuXG4gICAgICogQHJldHVybnMgVGhlIGtleXMgb2YgYWxsIGZpbGUgcHJvcGVydGllcyBvbiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGaWxlUHJvcGVydGllczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIG9taXQ/OiAnY3JlYXRlJyB8ICd1cGRhdGUnXG4gICAgKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQgfHwgdHlwZSA9PT0gRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghKG1ldGFkYXRhLm9taXRGb3JDcmVhdGUgJiYgb21pdCA9PT0gJ2NyZWF0ZScpICYmICEobWV0YWRhdGEub21pdEZvclVwZGF0ZSAmJiBvbWl0ID09PSAndXBkYXRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBpbmNsdWRlZCBpbiBhbiBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgbWV0YWRhdGEgZnJvbS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb20uXG4gICAgICogQHBhcmFtIHR5cGUgLSBGb3Igc2VjdXJlIFR5cGluZywgZGVmaW5lcyB0aGUgcmV0dXJuZWQgUHJvcGVydHlDb25maWcuXG4gICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAdGhyb3dzIFdoZW4gbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5TWV0YWRhdGE8XG4gICAgICAgIEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPixcbiAgICAgICAgVCBleHRlbmRzIERlY29yYXRvclR5cGVzLFxuICAgICAgICBDdXN0b21NZXRhZGF0YVR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgID4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgdHlwZT86IFRcbiAgICApOiBEZWNvcmF0b3JUeXBlPFQsIEN1c3RvbU1ldGFkYXRhVHlwZT4ge1xuICAgICAgICBjb25zdCBtZXRhZGF0YTogdW5rbm93biA9IFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoJ21ldGFkYXRhJywgZW50aXR5LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eUtleSl9IG9uIHRoZSBlbnRpdHkgJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhIGFzIERlY29yYXRvclR5cGU8VCwgQ3VzdG9tTWV0YWRhdGFUeXBlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gRW50aXR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YS5cbiAgICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5VHlwZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlXG4gICAgKTogRGVjb3JhdG9yVHlwZXMge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlUeXBlOiB1bmtub3duID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgndHlwZScsIGVudGl0eSwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgdHlwZSBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfSBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVR5cGUgYXMgRGVjb3JhdG9yVHlwZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHR5cGUgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX0gb24gdGhlIGVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWxsIHByb3BlcnR5IHZhbHVlcyBiYXNlZCBvbiBhIGdpdmVuIGVudGl0eSBkYXRhLW9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGNvbnN0cnVjdGVkIChpZiBjYWxsZWQgaW5zaWRlIGFuIEVudGl0eSBjb25zdHJ1Y3RvciBpdHMgdXN1YWxseSB0aGlzKS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGRhdGEgb2JqZWN0IHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWVzIGZyb20uXG4gICAgICogQGFsaWFzIG5ld1xuICAgICAqIEBhbGlhcyBidWlsZFxuICAgICAqIEBhbGlhcyBjb25zdHJ1Y3RcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV3PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4odGFyZ2V0OiBFbnRpdHlUeXBlLCBlbnRpdHk/OiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKHRhcmdldCwga2V5KTtcbiAgICAgICAgICAgIGxldCB2YWx1ZTogdW5rbm93biA9IGVudGl0eSA/IFJlZmxlY3RVdGlsaXRpZXMuZ2V0KGVudGl0eSwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUOlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3RNZXRhZGF0YTogRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT5cbiAgICAgICAgICAgICAgICAgICAgICAgID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGFyZ2V0LCBrZXksIERlY29yYXRvclR5cGVzLk9CSkVDVCk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IG9iamVjdE1ldGFkYXRhLkVudGl0eUNsYXNzKHZhbHVlIGFzIG9iamVjdCB8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0QXJyYXk6IEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCA9IHZhbHVlIGFzIEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzQXJyYXk6IEVudGl0eVR5cGVbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5TWV0YWRhdGE6IEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGFyZ2V0LCBrZXksIERlY29yYXRvclR5cGVzLkFSUkFZKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVdpdGhNZXRhZGF0YTogRW50aXR5VHlwZSA9IG5ldyBhcnJheU1ldGFkYXRhLkVudGl0eUNsYXNzKGl0ZW0pIGFzIEVudGl0eVR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzQXJyYXkucHVzaChpdGVtV2l0aE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc0FycmF5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmcsIGpzZG9jL3JlcXVpcmUtanNkb2MsIEB0eXBlc2NyaXB0LWVzbGludC90eXBlZGVmXG4gICAgc3RhdGljIGNvbnN0cnVjdCA9IEVudGl0eVV0aWxpdGllcy5uZXc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmcsIGpzZG9jL3JlcXVpcmUtanNkb2MsIEB0eXBlc2NyaXB0LWVzbGludC90eXBlZGVmXG4gICAgc3RhdGljIGJ1aWxkID0gRW50aXR5VXRpbGl0aWVzLm5ldztcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdmFsdWVzIG9uIGFuIGVudGl0eSBhcmUgdmFsaWQuXG4gICAgICogQWxzbyBjaGVja3MgYWxsIHRoZSB2YWxpZGF0b3JzIGdpdmVuIGJ5IHRoZSBtZXRhZGF0YSAoXCJyZXF1aXJlZFwiLCBcIm1heExlbmd0aFwiIGV0Yy4pLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gdmFsaWRhdGUuXG4gICAgICogQHBhcmFtIG9taXQgLSBXaGV0aGVyIHRvIGNoZWNrIGZvciBjcmVhdGluZyBvciBlZGl0aW5nIHZhbGlkaXR5LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgdmFsaWQuXG4gICAgICovXG4gICAgc3RhdGljIGlzRW50aXR5VmFsaWQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUsIG9taXQ6ICdjcmVhdGUnIHwgJ3VwZGF0ZScpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1Byb3BlcnR5VmFsaWQoZW50aXR5LCBrZXksIG9taXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzaW5nbGUgcHJvcGVydHkgdmFsdWUgaXMgdmFsaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aGVyZSB0aGUgcHJvcGVydHkgaXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBvbWl0IC0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgZ2l2ZW4gZW50aXR5IGlzIHZhbGlkIGZvciBjcmVhdGlvbiBvciB1cGRhdGluZy5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdmFsaWQuXG4gICAgICogQHRocm93cyBUaHJvd3Mgd2hlbiBpdCBleHRyYWN0cyBhbiB1bmtub3duIG1ldGFkYXRhIHR5cGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNQcm9wZXJ0eVZhbGlkPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAga2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBvbWl0OiAnY3JlYXRlJyB8ICd1cGRhdGUnXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXksIHR5cGUpO1xuXG4gICAgICAgIGlmIChtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlICYmIG9taXQgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEub21pdEZvclVwZGF0ZSAmJiBvbWl0ID09PSAndXBkYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnJlcXVpcmVkICYmIHR5cGUgIT09IERlY29yYXRvclR5cGVzLkhBU19NQU5ZKSB7XG4gICAgICAgICAgICBpZiAoZW50aXR5W2tleV0gPT0gbnVsbCB8fCBlbnRpdHlba2V5XSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkJPT0xFQU5fRFJPUERPV046XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkJPT0xFQU5fQ0hFQ0tCT1g6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkJPT0xFQU5fVE9HR0xFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eUJvb2xlYW46IGJvb2xlYW4gPSBlbnRpdHlba2V5XSBhcyBib29sZWFuO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvb2xlYW5NZXRhZGF0YTogVG9nZ2xlQm9vbGVhbkRlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgVG9nZ2xlQm9vbGVhbkRlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzQm9vbGVhblZhbGlkKGVudGl0eUJvb2xlYW4sIGJvb2xlYW5NZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0RST1BET1dOOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5TVFJJTkc6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklOR19BVVRPQ09NUExFVEU6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5U3RyaW5nOiBzdHJpbmcgPSBlbnRpdHlba2V5XSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nTWV0YWRhdGE6IERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1N0cmluZ1ZhbGlkKGVudGl0eVN0cmluZywgc3RyaW5nTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklOR19URVhUQk9YOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eVRleHRib3g6IHN0cmluZyA9IGVudGl0eVtrZXldIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Ym94TWV0YWRhdGE6IFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1RleHRib3hWYWxpZChlbnRpdHlUZXh0Ym94LCB0ZXh0Ym94TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklOR19QQVNTV09SRDpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlQYXNzd29yZDogc3RyaW5nID0gZW50aXR5W2tleV0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkTWV0YWRhdGE6IFBhc3N3b3JkU3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBQYXNzd29yZFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1QYXNzd29yZDogc3RyaW5nID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSh0aGlzLkNPTkZJUk1fUEFTU1dPUkRfS0VZLCBlbnRpdHksIGtleSkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzUGFzc3dvcmRWYWxpZChlbnRpdHlQYXNzd29yZCwgcGFzc3dvcmRNZXRhZGF0YSwgY29uZmlybVBhc3N3b3JkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5OVU1CRVJfRFJPUERPV046XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk5VTUJFUjpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuTlVNQkVSX1NMSURFUjpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlOdW1iZXI6IG51bWJlciA9IGVudGl0eVtrZXldIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJNZXRhZGF0YTogRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzTnVtYmVyVmFsaWQoZW50aXR5TnVtYmVyLCBudW1iZXJNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eU9iamVjdDogRW50aXR5VHlwZSA9IGVudGl0eVtrZXldIGFzIEVudGl0eVR5cGU7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXJLZXkgaW4gZW50aXR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gZW50aXR5T2JqZWN0W3BhcmFtZXRlcktleV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICEobWV0YWRhdGEgYXMgRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+KS5vbWl0LmluY2x1ZGVzKHBhcmFtZXRlcktleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICYmICEoIW1ldGFkYXRhLnJlcXVpcmVkICYmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09ICcnKSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1Byb3BlcnR5VmFsaWQoZW50aXR5T2JqZWN0LCBwYXJhbWV0ZXJLZXksIG9taXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQ0hJUFM6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19BVVRPQ09NUExFVEVfQ0hJUFM6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEU6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfVElNRTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVk6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5QXJyYXk6IHVua25vd25bXSA9IGVudGl0eVtrZXldIGFzIHVua25vd25bXTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5TWV0YWRhdGE6IEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT4gPSBtZXRhZGF0YSBhcyBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICAgICAgICAgIGlmIChhcnJheU1ldGFkYXRhLnJlcXVpcmVkICYmICFlbnRpdHlBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlEYXRlOiBEYXRlID0gbmV3IERhdGUoZW50aXR5W2tleV0gYXMgRGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZU1ldGFkYXRhOiBEZWZhdWx0RGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGVmYXVsdERhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0RhdGVWYWxpZChlbnRpdHlEYXRlLCBkYXRlTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfUkFOR0U6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RGF0ZVJhbmdlOiBEYXRlUmFuZ2UgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGVudGl0eVtrZXldIGFzIERhdGVSYW5nZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZVJhbmdlTWV0YWRhdGE6IERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0RhdGVSYW5nZVZhbGlkKGVudGl0eURhdGVSYW5nZSwgZGF0ZVJhbmdlTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfVElNRTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlEYXRlVGltZTogRGF0ZSA9IG5ldyBEYXRlKGVudGl0eVtrZXldIGFzIERhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lTWV0YWRhdGE6IERhdGVUaW1lRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGF0ZVRpbWVEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzVGltZTogYm9vbGVhbiA9IFJlZmxlY3RVdGlsaXRpZXMuaGFzTWV0YWRhdGEodGhpcy5USU1FX0tFWSwgZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRGF0ZVRpbWVWYWxpZChlbnRpdHlEYXRlVGltZSwgZGF0ZVRpbWVNZXRhZGF0YSwgaGFzVGltZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9ERUZBVUxUOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eUZpbGU6IEZpbGVEYXRhIHwgRmlsZURhdGFbXSA9IGVudGl0eVtrZXldIGFzIEZpbGVEYXRhIHwgRmlsZURhdGFbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlGaWxlTWV0YWRhdGE6IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRmlsZURhdGFWYWxpZChlbnRpdHlGaWxlLCBlbnRpdHlGaWxlTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlJFRkVSRU5DRVNfTUFOWTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuSEFTX01BTlk6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkNVU1RPTTpcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgbWF4LWxlblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbU1ldGFkYXRhOiBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlLCBhbnksIGFueSwgYW55PiA9IG1ldGFkYXRhIGFzIEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGUsIGFueSwgYW55LCBhbnk+O1xuICAgICAgICAgICAgICAgIGlmICghY3VzdG9tTWV0YWRhdGEuaXNWYWxpZChlbnRpdHlba2V5XSwgb21pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmFsaWRhdGUgdGhlIGlucHV0IGJlY2F1c2UgdGhlIERlY29yYXRvclR5cGUgJHt0eXBlfSBpcyBub3Qga25vd25gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0Jvb2xlYW5WYWxpZCh2YWx1ZTogYm9vbGVhbiwgbWV0YWRhdGE6IFRvZ2dsZUJvb2xlYW5EZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEucmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNTdHJpbmdWYWxpZCh2YWx1ZTogc3RyaW5nLCBtZXRhZGF0YTogRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWV0YWRhdGEubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbkxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCBtZXRhZGF0YS5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEucmVnZXggJiYgIXZhbHVlLm1hdGNoKG1ldGFkYXRhLnJlZ2V4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzVGV4dGJveFZhbGlkKHZhbHVlOiBzdHJpbmcsIG1ldGFkYXRhOiBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtZXRhZGF0YS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IG1ldGFkYXRhLm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzUGFzc3dvcmRWYWxpZCh2YWx1ZTogc3RyaW5nLCBtZXRhZGF0YTogUGFzc3dvcmRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgY29uZmlybVBhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBjb25maXJtUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1ldGFkYXRhLm1heExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5MZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgbWV0YWRhdGEubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnJlZ2V4ICYmICF2YWx1ZS5tYXRjaChtZXRhZGF0YS5yZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc051bWJlclZhbGlkKHZhbHVlOiBudW1iZXIsIG1ldGFkYXRhOiBEZWZhdWx0TnVtYmVyRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heCAmJiB2YWx1ZSA+IG1ldGFkYXRhLm1heCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW4gJiYgdmFsdWUgPCBtZXRhZGF0YS5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0RhdGVWYWxpZCh2YWx1ZTogRGF0ZSwgbWV0YWRhdGE6IERlZmF1bHREYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbiAmJiB2YWx1ZS5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW4odmFsdWUpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXggJiYgdmFsdWUuZ2V0VGltZSgpID4gbWV0YWRhdGEubWF4KHZhbHVlKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyICYmICFtZXRhZGF0YS5maWx0ZXIodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNEYXRlUmFuZ2VWYWxpZCh2YWx1ZTogRGF0ZVJhbmdlLCBtZXRhZGF0YTogRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgaWYgKCEodmFsdWUuc3RhcnQgYXMgRGF0ZSB8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh2YWx1ZS5lbmQgYXMgRGF0ZSB8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuc3RhcnQgPSBuZXcgRGF0ZSh2YWx1ZS5zdGFydCk7XG4gICAgICAgIHZhbHVlLmVuZCA9IG5ldyBEYXRlKHZhbHVlLmVuZCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5TdGFydCAmJiB2YWx1ZS5zdGFydC5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW5TdGFydCh2YWx1ZS5zdGFydCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heFN0YXJ0ICYmIHZhbHVlLnN0YXJ0LmdldFRpbWUoKSA+IG1ldGFkYXRhLm1heFN0YXJ0KHZhbHVlLnN0YXJ0KS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluRW5kICYmIHZhbHVlLmVuZC5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW5FbmQodmFsdWUuZW5kKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4RW5kICYmIHZhbHVlLmVuZC5nZXRUaW1lKCkgPiBtZXRhZGF0YS5tYXhFbmQodmFsdWUuZW5kKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyKSB7XG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmZpbHRlcih2YWx1ZS5zdGFydCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmZpbHRlcih2YWx1ZS5lbmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLnZhbHVlcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0ZSBvZiB2YWx1ZS52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YS5maWx0ZXIoZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0RhdGVUaW1lVmFsaWQodmFsdWU6IERhdGUsIG1ldGFkYXRhOiBEYXRlVGltZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgaGFzVGltZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWhhc1RpbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluRGF0ZSAmJiB2YWx1ZS5nZXRUaW1lKCkgPCBtZXRhZGF0YS5taW5EYXRlKHZhbHVlKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4RGF0ZSAmJiB2YWx1ZS5nZXRUaW1lKCkgPiBtZXRhZGF0YS5tYXhEYXRlKHZhbHVlKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEuZmlsdGVyRGF0ZSAmJiAhbWV0YWRhdGEuZmlsdGVyRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lOiBUaW1lID0ge1xuICAgICAgICAgICAgaG91cnM6IHZhbHVlLmdldEhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiB2YWx1ZS5nZXRNaW51dGVzKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pblRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblRpbWU6IFRpbWUgPSBtZXRhZGF0YS5taW5UaW1lKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzID4gbWluVGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzID09PSBtaW5UaW1lLmhvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lLm1pbnV0ZXMgPj0gbWluVGltZS5taW51dGVzXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heFRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFRpbWU6IFRpbWUgPSBtZXRhZGF0YS5tYXhUaW1lKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzIDwgbWF4VGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXJzID09PSBtYXhUaW1lLmhvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lLm1pbnV0ZXMgPD0gbWF4VGltZS5taW51dGVzXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmZpbHRlclRpbWUpIHtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZmlsdGVyVGltZSh0aW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0ZpbGVEYXRhVmFsaWQodmFsdWU6IEZpbGVEYXRhIHwgRmlsZURhdGFbXSwgbWV0YWRhdGE6IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVEYXRhW10gPSBtZXRhZGF0YS5tdWx0aXBsZSA/IHZhbHVlIGFzIEZpbGVEYXRhW10gOiBbdmFsdWUgYXMgRmlsZURhdGFdO1xuICAgICAgICBsZXQgZmlsZVNpemVUb3RhbDogbnVtYmVyID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIWZpbGUubmFtZSB8fCAhZmlsZS5maWxlICYmICFmaWxlLnVybCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghRmlsZVV0aWxpdGllcy5pc01pbWVUeXBlVmFsaWQoZmlsZS50eXBlLCBtZXRhZGF0YS5hbGxvd2VkTWltZVR5cGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChGaWxlVXRpbGl0aWVzLnRyYW5zZm9ybVRvTWVnYUJ5dGVzKGZpbGUuc2l6ZSwgJ0InKSA+IG1ldGFkYXRhLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlU2l6ZVRvdGFsICs9IGZpbGUuc2l6ZTtcbiAgICAgICAgICAgIGlmIChGaWxlVXRpbGl0aWVzLnRyYW5zZm9ybVRvTWVnYUJ5dGVzKGZpbGVTaXplVG90YWwsICdCJykgPiBtZXRhZGF0YS5tYXhTaXplVG90YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFuIGVudGl0eSBpcyBcImRpcnR5XCIgKGlmIGl0cyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IGFmdGVyIGFsbCBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIGRpcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0RpcnR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghKGVudGl0eVByaW9yQ2hhbmdlcyBhcyBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZXM6IERpZmZlcmVuY2U8RW50aXR5VHlwZT5bXSA9IGF3YWl0IEVudGl0eVV0aWxpdGllcy5kaWZmZXJlbmNlc0ZvckRpcnR5KGVudGl0eSwgZW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIHJldHVybiBkaWZmZXJlbmNlcy5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBkaWZmZXJlbmNlc0ZvckRpcnR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlXG4gICAgKTogUHJvbWlzZTxEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10+IHtcbiAgICAgICAgY29uc3QgcmVzOiBEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdFV0aWxpdGllcy5vd25LZXlzKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghKGF3YWl0IEVudGl0eVV0aWxpdGllcy5pc0VxdWFsKGVudGl0eVtrZXldLCBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSwgbWV0YWRhdGEsIHR5cGUpKSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZTogZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyOiBlbnRpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gc2V0IGJsb2IgZmlsZSBkYXRhIHNvIHRoYXQgaXQgaXMgb25seSByZXF1ZXN0ZWQgb25jZS5cbiAgICAgICAgICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoZW50aXR5W2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETyBSZW1vdmVcbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gRW50aXRpZXMgYW5kIHJldHVybnMgdGhlaXIgZGlmZmVyZW5jZSBpbiBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGZpcnN0IGVudGl0eSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgc2Vjb25kIGVudGl0eSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBFbnRpdGllcyBpbiBmb3JtIG9mIGEgUGFydGlhbC5cbiAgICAgKi9cbiAgICAvLyBzdGF0aWMgYXN5bmMgZGlmZmVyZW5jZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgIC8vICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgLy8gICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZVxuICAgIC8vICk6IFByb21pc2U8UGFydGlhbDxFbnRpdHlUeXBlPj4ge1xuICAgIC8vICAgICBjb25zdCByZXM6IFBhcnRpYWw8RW50aXR5VHlwZT4gPSB7fTtcbiAgICAvLyAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgLy8gICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAvLyAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgLy8gICAgICAgICBpZiAoIShhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbChlbnRpdHlba2V5XSwgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sIG1ldGFkYXRhLCB0eXBlKSkpIHtcbiAgICAvLyAgICAgICAgICAgICByZXNba2V5XSA9IGVudGl0eVtrZXldO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiByZXM7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHR3byBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqIEl0IHVzZXMgdGhlIGlzRXF1YWwgbWV0aG9kIGZyb20gTG9kYXNoVXRpbGl0aWVzIGFuZCBleHRlbmRzIGl0IHdpdGggZnVuY3Rpb25hbGl0eSByZWdhcmRpbmcgRGF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWVQcmlvckNoYW5nZXMgLSBUaGUgdmFsdWUgYmVmb3JlIGFueSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSAtIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGdpdmVuIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGlzRXF1YWwoXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxuICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bixcbiAgICAgICAgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsXG4gICAgICAgIHR5cGU6IERlY29yYXRvclR5cGVzXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFX1JBTkdFOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbERhdGVSYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAobWV0YWRhdGEgYXMgRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5maWx0ZXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbERhdGUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbERhdGVUaW1lKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEU6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxBcnJheURhdGUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxBcnJheURhdGVSYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAobWV0YWRhdGEgYXMgRGF0ZVJhbmdlQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCkuZmlsdGVyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0NISVBTOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQVVUT0NPTVBMRVRFX0NISVBTOlxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbEFycmF5U3RyaW5nKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkZJTEVfSU1BR0U6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxGaWxlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgKG1ldGFkYXRhIGFzIERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLm11bHRpcGxlKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQ1VTVE9NOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsQ3VzdG9tKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgbWV0YWRhdGEgYXMgQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55LCBhbnksIGFueSwgYW55Pik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbCh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5U3RyaW5nKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4gfCBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0FycmF5OiBzdHJpbmdbXSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUgYXMgc3RyaW5nW10pLnNvcnQoKTtcbiAgICAgICAgY29uc3Qgc3RyaW5nQXJyYXlQcmlvckNoYW5nZXM6IHN0cmluZ1tdID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBzdHJpbmdbXSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoc3RyaW5nQXJyYXksIHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQXJyYXlEYXRlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZTogRGF0ZVtdID0gKHZhbHVlIGFzIERhdGVbXSkubWFwKHYgPT4gbmV3IERhdGUodikpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVQcmlvckNoYW5nZXM6IERhdGVbXSA9ICh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlW10pLm1hcCh2ID0+IG5ldyBEYXRlKHYpKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChuZXdWYWx1ZSwgbmV3VmFsdWVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheURhdGVSYW5nZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIGZpbHRlcj86IERhdGVGaWx0ZXJGbjxEYXRlPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2VzOiBEYXRlUmFuZ2VbXSA9ICh2YWx1ZSBhcyBEYXRlUmFuZ2VbXSkuc29ydCgpO1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzOiBEYXRlUmFuZ2VbXSA9ICh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlUmFuZ2VbXSkuc29ydCgpO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlcy5sZW5ndGggIT09IGRhdGVSYW5nZXNQcmlvckNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGVSYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlUmFuZ2UoZGF0ZVJhbmdlc1tpXSwgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlc1tpXSwgZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsRGF0ZVRpbWUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgY29uc3QgZGF0ZVByaW9yQ2hhbmdlczogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGUpO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZSwgZGF0ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgY29uc3QgZGF0ZVByaW9yQ2hhbmdlczogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGUpO1xuICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICBkYXRlUHJpb3JDaGFuZ2VzLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZSwgZGF0ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGVSYW5nZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIGZpbHRlcj86IERhdGVGaWx0ZXJGbjxEYXRlPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2U6IERhdGVSYW5nZSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUpIGFzIERhdGVSYW5nZTtcbiAgICAgICAgZGF0ZVJhbmdlLnN0YXJ0ID0gbmV3IERhdGUoKHZhbHVlIGFzIERhdGVSYW5nZSkuc3RhcnQpO1xuICAgICAgICBkYXRlUmFuZ2UuZW5kID0gbmV3IERhdGUoKHZhbHVlIGFzIERhdGVSYW5nZSkuZW5kKTtcbiAgICAgICAgZGF0ZVJhbmdlLnZhbHVlcyA9IERhdGVVdGlsaXRpZXMuZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICAgICAgZGF0ZVJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZGF0ZVJhbmdlLmVuZCxcbiAgICAgICAgICAgIGZpbHRlclxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2VQcmlvckNoYW5nZXM6IERhdGVSYW5nZSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMpIGFzIERhdGVSYW5nZTtcbiAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0ID0gbmV3IERhdGUoKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGVSYW5nZSkuc3RhcnQpO1xuICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kID0gbmV3IERhdGUoKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGVSYW5nZSkuZW5kKTtcbiAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnZhbHVlcyA9IERhdGVVdGlsaXRpZXMuZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0LFxuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCxcbiAgICAgICAgICAgIGZpbHRlclxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZVJhbmdlLCBkYXRlUmFuZ2VQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIGJsb2JzIHdpdGggamVzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgaXNFcXVhbEZpbGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBtdWx0aXBsZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlUHJpb3JDaGFuZ2VzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlczogRmlsZURhdGFbXSA9IG11bHRpcGxlID8gKHZhbHVlIGFzIEZpbGVEYXRhW10pLnNvcnQoKSA6IFt2YWx1ZSBhcyBGaWxlRGF0YV0uc29ydCgpO1xuICAgICAgICBjb25zdCBmaWxlc1ByaW9yQ2hhbmdlczogRmlsZURhdGFbXSA9IG11bHRpcGxlID8gKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIEZpbGVEYXRhW10pLnNvcnQoKSA6IFt2YWx1ZVByaW9yQ2hhbmdlcyBhcyBGaWxlRGF0YV0uc29ydCgpO1xuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoICE9PSBmaWxlc1ByaW9yQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGNoZWNrcyB0aGlzIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIGFueSBmaWxlcyBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgICAgIGlmICghTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoTG9kYXNoVXRpbGl0aWVzLm9taXQoZmlsZXNbaV0sICdmaWxlJyksIExvZGFzaFV0aWxpdGllcy5vbWl0KGZpbGVzUHJpb3JDaGFuZ2VzW2ldLCAnZmlsZScpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlICYmICFmaWxlc1tpXS5maWxlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXNbaV0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZpbGVzW2ldKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmZpbGUgJiYgIWZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGUpIHtcbiAgICAgICAgICAgICAgICBmaWxlc1ByaW9yQ2hhbmdlc1tpXSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZXNQcmlvckNoYW5nZXNbaV0pO1xuICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzID0gZmlsZXNQcmlvckNoYW5nZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGF3YWl0IGZpbGVzW2ldLmZpbGU/LnRleHQoKSwgYXdhaXQgZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZT8udGV4dCgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQ3VzdG9tKFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIG1ldGFkYXRhOiBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbWV0YWRhdGEuaXNFcXVhbCh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIG1ldGFkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRpbmcgZW50aXR5IGtleXMgYnkgdGhlaXIgb3JkZXIgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYSAtIEZpcnN0IGtleSBvZiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGIgLSBTZWNvbmQga2V5IG9mIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gQ3VycmVudCBlbnRpdHkgKHVzZWQgdG8gZ2V0IG1ldGFkYXRhIG9mIGVudGl0eSBrZXlzKS5cbiAgICAgKiBAcmV0dXJucyAwIGlmIGJvdGggdmFsdWVzIGhhdmUgdGhlIHNhbWUgb3JkZXIsIGEgbmVnYXRpdmUgdmFsdWUgaWYgJ2EnIGNvbWVzIGJlZm9yZSAnYicsIGEgcG9zaXRpdmUgdmFsdWUgaWYgJ2EnIGNvbWVzIGJlaGluZCAnYicuXG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmVPcmRlcjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBhOiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBiOiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGVcbiAgICApOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtZXRhZGF0YUE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGEpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YUI6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGIpO1xuXG4gICAgICAgIGlmIChtZXRhZGF0YUEucG9zaXRpb24ub3JkZXIgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhZGF0YUEucG9zaXRpb24ub3JkZXIgLSBtZXRhZGF0YUIucG9zaXRpb24ub3JkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYm9vdHN0cmFwIGNvbHVtbiB2YWx1ZXMgZm9yIFwibGdcIiwgXCJtZFwiLCBcInNtXCIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gRW50aXR5IHRvIGdldCB0aGUgYm9vdHN0cmFwIGNvbHVtbiB2YWx1ZXMgb2YgdGhlIGtleS5cbiAgICAgKiBAcGFyYW0ga2V5IC0gS2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQgYm9vdHN0cmFwIGNvbHVtbiB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIERlZmluZXMgZm9yIHdoaWNoIHNjcmVlbiBzaXplIHRoZSBjb2x1bW4gdmFsdWVzIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJucyBCb290c3RyYXAgY29sdW1uIHZhbHVlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXaWR0aDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGtleToga2V5b2YgRW50aXR5VHlwZSwgdHlwZTogJ2xnJyB8ICdtZCcgfCAnc20nXG4gICAgKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbGcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzBdO1xuICAgICAgICAgICAgY2FzZSAnbWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzFdO1xuICAgICAgICAgICAgY2FzZSAnc20nOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIGFsbCBjaGFuZ2VzIG9uIGFuIGVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIHJlc2V0LlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzZXRDaGFuZ2VzT25FbnRpdHk8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUsIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHlQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuc2V0KGVudGl0eSwga2V5LCBSZWZsZWN0VXRpbGl0aWVzLmdldChlbnRpdHlQcmlvckNoYW5nZXMsIGtleSkpO1xuICAgICAgICAgICAgaWYgKFJlZmxlY3RVdGlsaXRpZXMuaGFzTWV0YWRhdGEodGhpcy5NRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWSwgZW50aXR5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIChSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKHRoaXMuTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVksIGVudGl0eSwga2V5KSBhcyBzdHJpbmdbXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFJlZmxlY3RVdGlsaXRpZXMuaGFzTWV0YWRhdGEoaywgZW50aXR5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLmRlZmluZU1ldGFkYXRhKGssIHVuZGVmaW5lZCwgZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RW50aXR5Um93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHRhYjogbnVtYmVyLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbixcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuLFxuICAgICAgICBhZGRpdGlvbmFsT21pdFZhbHVlczogKGtleW9mIEVudGl0eVR5cGUpW11cbiAgICApOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXSB7XG4gICAgICAgIGNvbnN0IHJlczogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSBbXTtcblxuICAgICAgICBjb25zdCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5LCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0KVxuICAgICAgICAgICAgLmZpbHRlcihrID0+ICFhZGRpdGlvbmFsT21pdFZhbHVlcy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUm93czogbnVtYmVyID0gRW50aXR5VXRpbGl0aWVzLmdldE51bWJlck9mUm93czxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIHRhYik7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbnVtYmVyT2ZSb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdzogRW50aXR5Um93PEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHJvdzogaSxcbiAgICAgICAgICAgICAgICBrZXlzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIGksIHRhYilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEVudGl0eVV0aWxpdGllcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYikubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0Um93OiBFbnRpdHlSb3c8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgcm93OiBudW1iZXJPZlJvd3MgKyAxLFxuICAgICAgICAgICAgICAgIGtleXM6IEVudGl0eVV0aWxpdGllcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChsYXN0Um93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGFicyB0aGF0IGFyZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUgcm93cyBmcm9tLlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckNyZWF0ZSAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvckNyZWF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckVkaXQgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JVcGRhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gYWRkaXRpb25hbE9taXRWYWx1ZXMgLSBBZGRpdGlvbmFsIG9taXQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIFRoZSBzb3J0ZWQgVGFicyBjb250YWluaW5nIHRoZSByb3dzIGFuZCB0aGUga2V5cyB0byBkaXNwbGF5IGluIHRoYXQgcm93LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRFbnRpdHlUYWJzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIGFkZGl0aW9uYWxPbWl0VmFsdWVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdXG4gICAgKTogRW50aXR5VGFiPEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIGNvbnN0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHksIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gIWFkZGl0aW9uYWxPbWl0VmFsdWVzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZUYWJzOiBudW1iZXIgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0TnVtYmVyT2ZUYWJzPEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgY29uc3QgZmlyc3RUYWJSb3dzOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXSA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KGVudGl0eSwgLTEsIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQsIGFkZGl0aW9uYWxPbWl0VmFsdWVzKTtcbiAgICAgICAgaWYgKGZpcnN0VGFiUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VGFiOiBFbnRpdHlUYWI8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgdGFiTmFtZTogRW50aXR5VXRpbGl0aWVzLmdldEZpcnN0VGFiTmFtZShlbnRpdHkpLFxuICAgICAgICAgICAgICAgIHRhYjogLTEsXG4gICAgICAgICAgICAgICAgcm93czogZmlyc3RUYWJSb3dzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2goZmlyc3RUYWIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMjsgaSA8PSBudW1iZXJPZlRhYnM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGFiOiBFbnRpdHlUYWI8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgdGFiTmFtZTogRW50aXR5VXRpbGl0aWVzLmdldFRhYk5hbWUoZW50aXR5LCBpKSxcbiAgICAgICAgICAgICAgICB0YWI6IGksXG4gICAgICAgICAgICAgICAgcm93czogRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVJvd3M8RW50aXR5VHlwZT4oZW50aXR5LCBpLCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0LCBhZGRpdGlvbmFsT21pdFZhbHVlcylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaCh0YWIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRLZXlzRm9yUm93PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspLnBvc2l0aW9uLnJvdyA9PT0gcm93KVxuICAgICAgICAgICAgLmZpbHRlcihrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykucG9zaXRpb24udGFiID09PSB0YWIpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gRW50aXR5VXRpbGl0aWVzLmNvbXBhcmVPcmRlcihhLCBiLCBlbnRpdHkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXROdW1iZXJPZlJvd3M8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgdGFiOiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4ga2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykucG9zaXRpb24udGFiID09PSB0YWIpXG4gICAgICAgICAgICAubWFwKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi5yb3cpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGEgPiBiID8gLTEgOiAxKSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TnVtYmVyT2ZUYWJzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oa2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sIGVudGl0eTogRW50aXR5VHlwZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBrZXlzXG4gICAgICAgICAgICAubWFwKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi50YWIpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGEgPiBiID8gLTEgOiAxKSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgdGFiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KVxuICAgICAgICAgICAgLm1hcChrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0ucG9zaXRpb24udGFiID09PSB0YWIgJiYgbS5wb3NpdGlvbi50YWJOYW1lKT8ucG9zaXRpb24udGFiTmFtZTtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVkVGFiTmFtZSA/PyBgVGFiICR7dGFifWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rmlyc3RUYWJOYW1lPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZWRUYWJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSlcbiAgICAgICAgICAgIC5tYXAoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspKVxuICAgICAgICAgICAgLmZpbmQobSA9PiBtLnBvc2l0aW9uLnRhYk5hbWUgJiYgbS5wb3NpdGlvbi50YWIgPT09IC0xKT8ucG9zaXRpb24udGFiTmFtZTtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVkVGFiTmFtZSA/PyAnVGFiIDEnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGtleXMgb2YgdGhlIHByb3ZpZGVkIGVudGl0eSBjb3JyZWN0bHkgdHlwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIGtleXMgb2YuXG4gICAgICogQHBhcmFtIGhpZGVPbWl0Rm9yQ3JlYXRlIC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yQ3JlYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHBhcmFtIGhpZGVPbWl0Rm9yRWRpdCAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvclVwZGF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGtleXMgb2YgdGhlIGVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMga2V5c09mPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuID0gZmFsc2VcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGxldCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpO1xuICAgICAgICBpZiAoaGlkZU9taXRGb3JDcmVhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9taXRGb3JDcmVhdGVLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eSk7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhb21pdEZvckNyZWF0ZUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWRlT21pdEZvckVkaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9taXRGb3JVcGRhdGVLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yVXBkYXRlKGVudGl0eSk7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhb21pdEZvclVwZGF0ZUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHJvdyB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkaXNwbGF5IGFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlSb3c8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbiB3aGljaCB0aGlzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcm93OiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleXMgb2YgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhhdCByb3cuXG4gICAgICovXG4gICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW11cbn1cblxuLyoqXG4gKiBBIHRhYiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRpc3BsYXkgYW4gZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVRhYjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFiIGluIHdoaWNoIHRoZSByb3dzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgdGFiOiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgdG8gZGlzcGxheSBpbnNpZGUgdGhlIHRhYi5cbiAgICAgKi9cbiAgICB0YWJOYW1lOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIHJvd3MgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluc2lkZSB0aGlzIHRhYiwuXG4gICAgICovXG4gICAgcm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W11cbn0iXX0=
|
|
885
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFXeEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFvQmpEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixlQUFlO0lBK0NqQzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBZ0QsTUFBa0I7UUFDckYsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxRQUFRLEdBQW9DLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkcsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBZ0QsTUFBa0I7UUFDckYsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsTUFBTSxR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QUFDO1lBQ3pGLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksZUFBZSxFQUFFO1lBQ2pCLE1BQU0saUJBQWlCLEdBQXlCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6RixJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOztBQTFnQ0Q7O0dBRUc7QUFDYSwwQ0FBMEIsR0FBVyxxQkFBcUIsQ0FBQztBQUUzRTs7R0FFRztBQUNhLHdDQUF3QixHQUFXLG9CQUFvQixDQUFDO0FBRXhFOztHQUVHO0FBQ2Esd0NBQXdCLEdBQVcsb0JBQW9CLENBQUM7QUFFeEU7O0dBRUc7QUFDYSw2QkFBYSxHQUFXLFdBQVcsQ0FBQztBQUVwRDs7R0FFRztBQUNhLG9DQUFvQixHQUFXLGlCQUFpQixDQUFDO0FBRWpFOztHQUVHO0FBQ2Esd0JBQVEsR0FBVyxNQUFNLENBQUM7QUFFMUM7O0dBRUc7QUFDYSw4QkFBYyxHQUFXLFdBQVcsQ0FBQztBQUVyRDs7R0FFRztBQUNhLG9DQUFvQixHQUFXLGdCQUFnQixDQUFDO0FBRWhFOztHQUVHO0FBQ2Esa0NBQWtCLEdBQVcsY0FBYyxDQUFDO0FBd001RCwrR0FBK0c7QUFDeEcseUJBQVMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDO0FBQ3ZDLCtHQUErRztBQUN4RyxxQkFBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaW1lIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9hcnJheS9hcnJheS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWNvcmF0b3JUeXBlLCBEZWNvcmF0b3JUeXBlcyB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9kZWNvcmF0b3ItdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9iYXNlL3Byb3BlcnR5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IFRvZ2dsZUJvb2xlYW5EZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYm9vbGVhbi9ib29sZWFuLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9jdXN0b20vY3VzdG9tLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRGF0ZVRpbWVEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIERlZmF1bHREYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2RhdGUvZGF0ZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2RhdGUvZGF0ZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRmlsZURhdGEgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0TnVtYmVyRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL251bWJlci9udW1iZXItZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9vYmplY3Qvb2JqZWN0LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgUGFzc3dvcmRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgVGV4dGJveFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9zdHJpbmcvc3RyaW5nLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uL2VuY2Fwc3VsYXRpb24vbG9kYXNoLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBSZWZsZWN0VXRpbGl0aWVzIH0gZnJvbSAnLi4vZW5jYXBzdWxhdGlvbi9yZWZsZWN0LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBEYXRlVXRpbGl0aWVzIH0gZnJvbSAnLi9kYXRlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBGaWxlVXRpbGl0aWVzIH0gZnJvbSAnLi9maWxlLnV0aWxpdGllcyc7XG5cbi8qKlxuICogU2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gZW50aXRpZXMuXG4gKi9cbmludGVyZmFjZSBEaWZmZXJlbmNlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hlcmUgdGhlIHR3byBlbnRpdGllcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAgICovXG4gICAga2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICovXG4gICAgYmVmb3JlOiB1bmtub3duLFxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIGFmdGVyIGNoYW5nZXMuXG4gICAgICovXG4gICAgYWZ0ZXI6IHVua25vd25cbn1cblxuLyoqXG4gKiBDb250YWlucyBIZWxwZXJNZXRob2RzIGFyb3VuZCBoYW5kbGluZyBFbnRpdGllcyBhbmQgdGhlaXIgcHJvcGVydHktbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHlVdGlsaXRpZXMge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgYWxsIGtleXMgb2YgbWV0YWRhdGEgdGhhdCBzaG91bGQgYmUgc2V0IHRvIHVuZGVmaW5lZCB3aGVuIHRoZSBlbnRpdHkgZ2V0cyByZXNldC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVk6IHN0cmluZyA9ICdtZXRhZGF0YUtleXNUb1Jlc2V0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBzaW5nbGUgcHJldmlldyBpbWFnZSB2YWx1ZSBvbiBpbWFnZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBTSU5HTEVfUFJFVklFV19JTUFHRV9LRVk6IHN0cmluZyA9ICdzaW5nbGVQcmV2aWV3SW1hZ2UnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIG11bHRpIHByZXZpZXcgaW1hZ2VzIHZhbHVlIG9uIGltYWdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IE1VTFRJX1BSRVZJRVdfSU1BR0VTX0tFWTogc3RyaW5nID0gJ211bHRpUHJldmlld0ltYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgZmlsZW5hbWVzIHZhbHVlIG9uIGZpbGUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgRklMRU5BTUVTX0tFWTogc3RyaW5nID0gJ2ZpbGVOYW1lcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgY29uZmlybSBwYXNzd29yZCB2YWx1ZSBvbiBwYXNzd29yZCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBDT05GSVJNX1BBU1NXT1JEX0tFWTogc3RyaW5nID0gJ2NvbmZpcm1QYXNzd29yZCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgdGltZSB2YWx1ZSBvbiBkYXRlIHRpbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgVElNRV9LRVk6IHN0cmluZyA9ICd0aW1lJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBkYXRlIHJhbmdlIHZhbHVlIG9uIGRhdGUgcmFuZ2UgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgREFURV9SQU5HRV9LRVk6IHN0cmluZyA9ICdkYXRlUmFuZ2UnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIGRhdGUgcmFuZ2Ugc3RhcnQgdmFsdWUgb24gZGF0ZSByYW5nZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBEQVRFX1JBTkdFX1NUQVJUX0tFWTogc3RyaW5nID0gJ2RhdGVSYW5nZVN0YXJ0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBkYXRlIHJhbmdlIGVuZCB2YWx1ZSBvbiBkYXRlIHJhbmdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IERBVEVfUkFOR0VfRU5EX0tFWTogc3RyaW5nID0gJ2RhdGVSYW5nZUVuZCc7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIHRvIG9taXQgd2hlbiB1cGRhdGluZyB0aGUgZW50aXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgdXBkYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIHVwZGF0aW5nIGFuIEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvclVwZGF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLm9taXRGb3JVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyB0byBvbWl0IHdoZW4gY3JlYXRpbmcgbmV3IGVudGl0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgY3JlYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIGNyZWF0aW5nIGEgbmV3IEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvckNyZWF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLm9taXRGb3JDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gZW50aXR5IHdpdGhvdXQgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBvbWl0dGVkIGZvciBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggYWxsIGl0cyB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgVGhlIHJlZHVjZWQgZW50aXR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0V2l0aG91dE9taXRDcmVhdGVWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiBQYXJ0aWFsPEVudGl0eVR5cGU+IHtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5vbWl0KGVudGl0eSwgRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5KSkgYXMgUGFydGlhbDxFbnRpdHlUeXBlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBlbnRpdHkgd2l0aG91dCB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIHVwZGF0aW5nLlxuICAgICAqIFRoaXMgYWxzbyBoYW5kbGVzIG9taXR0aW5nIGtleXMgZm9yIEBvYmplY3Qgb3IgQGFycmF5IHZhbHVlcyBhbmQgcmVtb3ZlcyB2YWx1ZXMgdGhhdCBoYXZlbid0IGJlZW4gY2hhbmdlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgd2l0aCBhbGwgaXRzIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIC0gVGhlIGVudGl0eSBiZWZvcmUgYW55IGNoYW5nZXMgd2VyZSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIFRoZSByZWR1Y2VkIGVudGl0eSBvYmplY3QuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGdldFdpdGhvdXRPbWl0VXBkYXRlVmFsdWVzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlXG4gICAgKTogUHJvbWlzZTxQYXJ0aWFsPEVudGl0eVR5cGU+PiB7XG4gICAgICAgIGNvbnN0IHJlczogUGFydGlhbDxFbnRpdHlUeXBlPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSwgZmFsc2UsIHRydWUpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbChlbnRpdHlba2V5XSwgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sIG1ldGFkYXRhLCB0eXBlKSkpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc1trZXldIGFzIG9iamVjdCkgPSBMb2Rhc2hVdGlsaXRpZXMub21pdChlbnRpdHlba2V5XSBhcyBhbnksIEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eVtrZXldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNba2V5XSBhcyBvYmplY3RbXSkgPSAoZW50aXR5W2tleV0gYXMgb2JqZWN0W10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YWx1ZSA9PiBMb2Rhc2hVdGlsaXRpZXMub21pdCh2YWx1ZSwgRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JDcmVhdGUodmFsdWUpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gZW50aXR5W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkgd2hpY2ggYXJlIGZpbGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gY2hlY2sgZm9yIGZpbGUgcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb21pdCAtIFdoZXRoZXIgdG8gbGVhdmUgb3V0IHZhbHVlcyB0aGF0IGFyZSBvbWl0dGVkIGZvciBjcmVhdGUgb3IgZGVsZXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBrZXlzIG9mIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RmlsZVByb3BlcnRpZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBvbWl0PzogJ2NyZWF0ZScgfCAndXBkYXRlJ1xuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gRGVjb3JhdG9yVHlwZXMuRklMRV9ERUZBVUxUIHx8IHR5cGUgPT09IERlY29yYXRvclR5cGVzLkZJTEVfSU1BR0UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIShtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlICYmIG9taXQgPT09ICdjcmVhdGUnKSAmJiAhKG1ldGFkYXRhLm9taXRGb3JVcGRhdGUgJiYgb21pdCA9PT0gJ3VwZGF0ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWV0YWRhdGEgaW5jbHVkZWQgaW4gYW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIHRoZSBwcm9wZXJ0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb20uXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBFbnRpdHkgdG8gZ2V0IHRoZSBtZXRhZGF0YSBmcm9tLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gRm9yIHNlY3VyZSBUeXBpbmcsIGRlZmluZXMgdGhlIHJldHVybmVkIFByb3BlcnR5Q29uZmlnLlxuICAgICAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHRocm93cyBXaGVuIG5vIG1ldGFkYXRhIGNhbiBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eU1ldGFkYXRhPFxuICAgICAgICBFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4sXG4gICAgICAgIFQgZXh0ZW5kcyBEZWNvcmF0b3JUeXBlcyxcbiAgICAgICAgQ3VzdG9tTWV0YWRhdGFUeXBlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIHR5cGU/OiBUXG4gICAgKTogRGVjb3JhdG9yVHlwZTxULCBDdXN0b21NZXRhZGF0YVR5cGU+IHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IHVua25vd24gPSBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKCdtZXRhZGF0YScsIGVudGl0eSwgcHJvcGVydHlLZXkpO1xuICAgICAgICBpZiAobWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfSBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhZGF0YSBhcyBEZWNvcmF0b3JUeXBlPFQsIEN1c3RvbU1ldGFkYXRhVHlwZT47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHktbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIHRoZSBwcm9wZXJ0eSB0byBnZXQgdGhlIHR5cGUgZnJvbS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIHR5cGUgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEuXG4gICAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIG5vIG1ldGFkYXRhIGNhbiBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eVR5cGU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLCBwcm9wZXJ0eUtleToga2V5b2YgRW50aXR5VHlwZVxuICAgICk6IERlY29yYXRvclR5cGVzIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VHlwZTogdW5rbm93biA9IFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoJ3R5cGUnLCBlbnRpdHksIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHR5cGUgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX0gb24gdGhlIGVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlUeXBlIGFzIERlY29yYXRvclR5cGVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCB0eXBlIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eUtleSl9IG9uIHRoZSBlbnRpdHkgJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGFsbCBwcm9wZXJ0eSB2YWx1ZXMgYmFzZWQgb24gYSBnaXZlbiBlbnRpdHkgZGF0YS1vYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBuZWVkcyB0byBiZSBjb25zdHJ1Y3RlZCAoaWYgY2FsbGVkIGluc2lkZSBhbiBFbnRpdHkgY29uc3RydWN0b3IgaXRzIHVzdWFsbHkgdGhpcykuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBkYXRhIG9iamVjdCB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlcyBmcm9tLlxuICAgICAqIEBhbGlhcyBuZXdcbiAgICAgKiBAYWxpYXMgYnVpbGRcbiAgICAgKiBAYWxpYXMgY29uc3RydWN0XG4gICAgICovXG4gICAgc3RhdGljIG5ldzxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KHRhcmdldDogRW50aXR5VHlwZSwgZW50aXR5PzogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZSh0YXJnZXQsIGtleSk7XG4gICAgICAgICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBlbnRpdHkgPyBSZWZsZWN0VXRpbGl0aWVzLmdldChlbnRpdHksIGtleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVDpcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0TWV0YWRhdGE6IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgICA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKHRhcmdldCwga2V5LCBEZWNvcmF0b3JUeXBlcy5PQkpFQ1QpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBvYmplY3RNZXRhZGF0YS5FbnRpdHlDbGFzcyh2YWx1ZSBhcyBvYmplY3QgfCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEFycmF5OiBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQgPSB2YWx1ZSBhcyBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc0FycmF5OiBFbnRpdHlUeXBlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheU1ldGFkYXRhOiBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKHRhcmdldCwga2V5LCBEZWNvcmF0b3JUeXBlcy5BUlJBWSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1XaXRoTWV0YWRhdGE6IEVudGl0eVR5cGUgPSBuZXcgYXJyYXlNZXRhZGF0YS5FbnRpdHlDbGFzcyhpdGVtKSBhcyBFbnRpdHlUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0FycmF5LnB1c2goaXRlbVdpdGhNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXNBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nLCBqc2RvYy9yZXF1aXJlLWpzZG9jLCBAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZWRlZlxuICAgIHN0YXRpYyBjb25zdHJ1Y3QgPSBFbnRpdHlVdGlsaXRpZXMubmV3O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nLCBqc2RvYy9yZXF1aXJlLWpzZG9jLCBAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZWRlZlxuICAgIHN0YXRpYyBidWlsZCA9IEVudGl0eVV0aWxpdGllcy5uZXc7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlcyBvbiBhbiBlbnRpdHkgYXJlIHZhbGlkLlxuICAgICAqIEFsc28gY2hlY2tzIGFsbCB0aGUgdmFsaWRhdG9ycyBnaXZlbiBieSB0aGUgbWV0YWRhdGEgKFwicmVxdWlyZWRcIiwgXCJtYXhMZW5ndGhcIiBldGMuKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIHZhbGlkYXRlLlxuICAgICAqIEBwYXJhbSBvbWl0IC0gV2hldGhlciB0byBjaGVjayBmb3IgY3JlYXRpbmcgb3IgZWRpdGluZyB2YWxpZGl0eS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIHZhbGlkLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0VudGl0eVZhbGlkPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlLCBvbWl0OiAnY3JlYXRlJyB8ICd1cGRhdGUnKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNQcm9wZXJ0eVZhbGlkKGVudGl0eSwga2V5LCBvbWl0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc2luZ2xlIHByb3BlcnR5IHZhbHVlIGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgd2hlcmUgdGhlIHByb3BlcnR5IGlzIGZyb20uXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gb21pdCAtIFdoZXRoZXIgdG8gY2hlY2sgaWYgdGhlIGdpdmVuIGVudGl0eSBpcyB2YWxpZCBmb3IgY3JlYXRpb24gb3IgdXBkYXRpbmcuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHZhbGlkLlxuICAgICAqIEB0aHJvd3MgVGhyb3dzIHdoZW4gaXQgZXh0cmFjdHMgYW4gdW5rbm93biBtZXRhZGF0YSB0eXBlLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGlzUHJvcGVydHlWYWxpZDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGtleToga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgb21pdDogJ2NyZWF0ZScgfCAndXBkYXRlJ1xuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5LCB0eXBlKTtcblxuICAgICAgICBpZiAobWV0YWRhdGEub21pdEZvckNyZWF0ZSAmJiBvbWl0ID09PSAnY3JlYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm9taXRGb3JVcGRhdGUgJiYgb21pdCA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5yZXF1aXJlZCAmJiB0eXBlICE9PSBEZWNvcmF0b3JUeXBlcy5IQVNfTUFOWSkge1xuICAgICAgICAgICAgaWYgKGVudGl0eVtrZXldID09IG51bGwgfHwgZW50aXR5W2tleV0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0RST1BET1dOOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0NIRUNLQk9YOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5CT09MRUFOX1RPR0dMRTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlCb29sZWFuOiBib29sZWFuID0gZW50aXR5W2tleV0gYXMgYm9vbGVhbjtcbiAgICAgICAgICAgICAgICBjb25zdCBib29sZWFuTWV0YWRhdGE6IFRvZ2dsZUJvb2xlYW5EZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIFRvZ2dsZUJvb2xlYW5EZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0Jvb2xlYW5WYWxpZChlbnRpdHlCb29sZWFuLCBib29sZWFuTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlNUUklOR19EUk9QRE9XTjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuU1RSSU5HOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5TVFJJTkdfQVVUT0NPTVBMRVRFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eVN0cmluZzogc3RyaW5nID0gZW50aXR5W2tleV0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ01ldGFkYXRhOiBEZWZhdWx0U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBEZWZhdWx0U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNTdHJpbmdWYWxpZChlbnRpdHlTdHJpbmcsIHN0cmluZ01ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5TVFJJTkdfVEVYVEJPWDpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlUZXh0Ym94OiBzdHJpbmcgPSBlbnRpdHlba2V5XSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dGJveE1ldGFkYXRhOiBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNUZXh0Ym94VmFsaWQoZW50aXR5VGV4dGJveCwgdGV4dGJveE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5TVFJJTkdfUEFTU1dPUkQ6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5UGFzc3dvcmQ6IHN0cmluZyA9IGVudGl0eVtrZXldIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzd29yZE1ldGFkYXRhOiBQYXNzd29yZFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgUGFzc3dvcmRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maXJtUGFzc3dvcmQ6IHN0cmluZyA9IFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEodGhpcy5DT05GSVJNX1BBU1NXT1JEX0tFWSwgZW50aXR5LCBrZXkpIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc1Bhc3N3b3JkVmFsaWQoZW50aXR5UGFzc3dvcmQsIHBhc3N3b3JkTWV0YWRhdGEsIGNvbmZpcm1QYXNzd29yZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuTlVNQkVSX0RST1BET1dOOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk5VTUJFUl9TTElERVI6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5TnVtYmVyOiBudW1iZXIgPSBlbnRpdHlba2V5XSBhcyBudW1iZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyTWV0YWRhdGE6IERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc051bWJlclZhbGlkKGVudGl0eU51bWJlciwgbnVtYmVyTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVDpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlPYmplY3Q6IEVudGl0eVR5cGUgPSBlbnRpdHlba2V5XSBhcyBFbnRpdHlUeXBlO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyS2V5IGluIGVudGl0eU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IGVudGl0eU9iamVjdFtwYXJhbWV0ZXJLZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAhKG1ldGFkYXRhIGFzIERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPikub21pdC5pbmNsdWRlcyhwYXJhbWV0ZXJLZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAhKCFtZXRhZGF0YS5yZXF1aXJlZCAmJiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSAnJykpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNQcm9wZXJ0eVZhbGlkKGVudGl0eU9iamVjdCwgcGFyYW1ldGVyS2V5LCBvbWl0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0NISVBTOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQVVUT0NPTVBMRVRFX0NISVBTOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1RJTUU6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfUkFOR0U6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eUFycmF5OiB1bmtub3duW10gPSBlbnRpdHlba2V5XSBhcyB1bmtub3duW107XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheU1ldGFkYXRhOiBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+ID0gbWV0YWRhdGEgYXMgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlNZXRhZGF0YS5yZXF1aXJlZCAmJiAhZW50aXR5QXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEU6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKGVudGl0eVtrZXldIGFzIERhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVNZXRhZGF0YTogRGVmYXVsdERhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERlZmF1bHREYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNEYXRlVmFsaWQoZW50aXR5RGF0ZSwgZGF0ZU1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFX1JBTkdFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eURhdGVSYW5nZTogRGF0ZVJhbmdlID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcChlbnRpdHlba2V5XSBhcyBEYXRlUmFuZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVSYW5nZU1ldGFkYXRhOiBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBtZXRhZGF0YSBhcyBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAgICAgaWYgKCFFbnRpdHlVdGlsaXRpZXMuaXNEYXRlUmFuZ2VWYWxpZChlbnRpdHlEYXRlUmFuZ2UsIGRhdGVSYW5nZU1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFX1RJTUU6XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RGF0ZVRpbWU6IERhdGUgPSBuZXcgRGF0ZShlbnRpdHlba2V5XSBhcyBEYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlVGltZU1ldGFkYXRhOiBEYXRlVGltZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IG1ldGFkYXRhIGFzIERhdGVUaW1lRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1RpbWU6IGJvb2xlYW4gPSBSZWZsZWN0VXRpbGl0aWVzLmhhc01ldGFkYXRhKHRoaXMuVElNRV9LRVksIGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0RhdGVUaW1lVmFsaWQoZW50aXR5RGF0ZVRpbWUsIGRhdGVUaW1lTWV0YWRhdGEsIGhhc1RpbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVDpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRTpcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlGaWxlOiBGaWxlRGF0YSB8IEZpbGVEYXRhW10gPSBlbnRpdHlba2V5XSBhcyBGaWxlRGF0YSB8IEZpbGVEYXRhW107XG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RmlsZU1ldGFkYXRhOiBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gbWV0YWRhdGEgYXMgRGVmYXVsdEZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcbiAgICAgICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0ZpbGVEYXRhVmFsaWQoZW50aXR5RmlsZSwgZW50aXR5RmlsZU1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5SRUZFUkVOQ0VTX01BTlk6XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkhBU19NQU5ZOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5DVVNUT006XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIG1heC1sZW5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21NZXRhZGF0YTogQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZSwgYW55LCBhbnksIGFueT4gPSBtZXRhZGF0YSBhcyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlLCBhbnksIGFueSwgYW55PjtcbiAgICAgICAgICAgICAgICBpZiAoIWN1c3RvbU1ldGFkYXRhLmlzVmFsaWQoZW50aXR5W2tleV0sIG9taXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZhbGlkYXRlIHRoZSBpbnB1dCBiZWNhdXNlIHRoZSBEZWNvcmF0b3JUeXBlICR7dHlwZX0gaXMgbm90IGtub3duYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNCb29sZWFuVmFsaWQodmFsdWU6IGJvb2xlYW4sIG1ldGFkYXRhOiBUb2dnbGVCb29sZWFuRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhLnJlcXVpcmVkICYmICF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzU3RyaW5nVmFsaWQodmFsdWU6IHN0cmluZywgbWV0YWRhdGE6IERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEubWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1ldGFkYXRhLm1heExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5MZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgbWV0YWRhdGEubWluTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnJlZ2V4ICYmICF2YWx1ZS5tYXRjaChtZXRhZGF0YS5yZWdleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc1RleHRib3hWYWxpZCh2YWx1ZTogc3RyaW5nLCBtZXRhZGF0YTogVGV4dGJveFN0cmluZ0RlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWV0YWRhdGEubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbkxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCBtZXRhZGF0YS5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc1Bhc3N3b3JkVmFsaWQodmFsdWU6IHN0cmluZywgbWV0YWRhdGE6IFBhc3N3b3JkU3RyaW5nRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIGNvbmZpcm1QYXNzd29yZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gY29uZmlybVBhc3N3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtZXRhZGF0YS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IG1ldGFkYXRhLm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5yZWdleCAmJiAhdmFsdWUubWF0Y2gobWV0YWRhdGEucmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNOdW1iZXJWYWxpZCh2YWx1ZTogbnVtYmVyLCBtZXRhZGF0YTogRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXggJiYgdmFsdWUgPiBtZXRhZGF0YS5tYXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWluICYmIHZhbHVlIDwgbWV0YWRhdGEubWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNEYXRlVmFsaWQodmFsdWU6IERhdGUsIG1ldGFkYXRhOiBEZWZhdWx0RGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW4gJiYgdmFsdWUuZ2V0VGltZSgpIDwgbWV0YWRhdGEubWluKHZhbHVlKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubWF4ICYmIHZhbHVlLmdldFRpbWUoKSA+IG1ldGFkYXRhLm1heCh2YWx1ZSkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmZpbHRlciAmJiAhbWV0YWRhdGEuZmlsdGVyKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRGF0ZVJhbmdlVmFsaWQodmFsdWU6IERhdGVSYW5nZSwgbWV0YWRhdGE6IERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWV0YWRhdGEucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGlmICghKHZhbHVlLnN0YXJ0IGFzIERhdGUgfCB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEodmFsdWUuZW5kIGFzIERhdGUgfCB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHVlLnN0YXJ0ID0gbmV3IERhdGUodmFsdWUuc3RhcnQpO1xuICAgICAgICB2YWx1ZS5lbmQgPSBuZXcgRGF0ZSh2YWx1ZS5lbmQpO1xuICAgICAgICBpZiAobWV0YWRhdGEubWluU3RhcnQgJiYgdmFsdWUuc3RhcnQuZ2V0VGltZSgpIDwgbWV0YWRhdGEubWluU3RhcnQodmFsdWUuc3RhcnQpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhTdGFydCAmJiB2YWx1ZS5zdGFydC5nZXRUaW1lKCkgPiBtZXRhZGF0YS5tYXhTdGFydCh2YWx1ZS5zdGFydCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbkVuZCAmJiB2YWx1ZS5lbmQuZ2V0VGltZSgpIDwgbWV0YWRhdGEubWluRW5kKHZhbHVlLmVuZCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heEVuZCAmJiB2YWx1ZS5lbmQuZ2V0VGltZSgpID4gbWV0YWRhdGEubWF4RW5kKHZhbHVlLmVuZCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmZpbHRlcikge1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YS5maWx0ZXIodmFsdWUuc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YS5maWx0ZXIodmFsdWUuZW5kKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGUgb2YgdmFsdWUudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZmlsdGVyKGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNEYXRlVGltZVZhbGlkKHZhbHVlOiBEYXRlLCBtZXRhZGF0YTogRGF0ZVRpbWVEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwsIGhhc1RpbWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFoYXNUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1pbkRhdGUgJiYgdmFsdWUuZ2V0VGltZSgpIDwgbWV0YWRhdGEubWluRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLm1heERhdGUgJiYgdmFsdWUuZ2V0VGltZSgpID4gbWV0YWRhdGEubWF4RGF0ZSh2YWx1ZSkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmZpbHRlckRhdGUgJiYgIW1ldGFkYXRhLmZpbHRlckRhdGUodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGltZTogVGltZSA9IHtcbiAgICAgICAgICAgIGhvdXJzOiB2YWx1ZS5nZXRIb3VycygpLFxuICAgICAgICAgICAgbWludXRlczogdmFsdWUuZ2V0TWludXRlcygpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChtZXRhZGF0YS5taW5UaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5UaW1lOiBUaW1lID0gbWV0YWRhdGEubWluVGltZSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgdGltZS5ob3VycyA+IG1pblRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAgICAgfHwgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5ob3VycyA9PT0gbWluVGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZS5taW51dGVzID49IG1pblRpbWUubWludXRlc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5tYXhUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtYXhUaW1lOiBUaW1lID0gbWV0YWRhdGEubWF4VGltZSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgdGltZS5ob3VycyA8IG1heFRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAgICAgfHwgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5ob3VycyA9PT0gbWF4VGltZS5ob3Vyc1xuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZS5taW51dGVzIDw9IG1heFRpbWUubWludXRlc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5maWx0ZXJUaW1lKSB7XG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmZpbHRlclRpbWUodGltZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNGaWxlRGF0YVZhbGlkKHZhbHVlOiBGaWxlRGF0YSB8IEZpbGVEYXRhW10sIG1ldGFkYXRhOiBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlRGF0YVtdID0gbWV0YWRhdGEubXVsdGlwbGUgPyB2YWx1ZSBhcyBGaWxlRGF0YVtdIDogW3ZhbHVlIGFzIEZpbGVEYXRhXTtcbiAgICAgICAgbGV0IGZpbGVTaXplVG90YWw6IG51bWJlciA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgaWYgKCFmaWxlLm5hbWUgfHwgIWZpbGUuZmlsZSAmJiAhZmlsZS51cmwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUZpbGVVdGlsaXRpZXMuaXNNaW1lVHlwZVZhbGlkKGZpbGUudHlwZSwgbWV0YWRhdGEuYWxsb3dlZE1pbWVUeXBlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoRmlsZVV0aWxpdGllcy50cmFuc2Zvcm1Ub01lZ2FCeXRlcyhmaWxlLnNpemUsICdCJykgPiBtZXRhZGF0YS5tYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZVNpemVUb3RhbCArPSBmaWxlLnNpemU7XG4gICAgICAgICAgICBpZiAoRmlsZVV0aWxpdGllcy50cmFuc2Zvcm1Ub01lZ2FCeXRlcyhmaWxlU2l6ZVRvdGFsLCAnQicpID4gbWV0YWRhdGEubWF4U2l6ZVRvdGFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBlbnRpdHkgaXMgXCJkaXJ0eVwiIChpZiBpdHMgdmFsdWVzIGhhdmUgY2hhbmdlZCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSBhZnRlciBhbGwgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIC0gVGhlIGVudGl0eSBiZWZvcmUgdGhlIGNoYW5nZXMuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGVudGl0eSBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgaXNEaXJ0eTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZVxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIShlbnRpdHlQcmlvckNoYW5nZXMgYXMgRW50aXR5VHlwZSB8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZlcmVuY2VzOiBEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10gPSBhd2FpdCBFbnRpdHlVdGlsaXRpZXMuZGlmZmVyZW5jZXNGb3JEaXJ0eShlbnRpdHksIGVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICByZXR1cm4gZGlmZmVyZW5jZXMubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZGlmZmVyZW5jZXNGb3JEaXJ0eTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZVxuICAgICk6IFByb21pc2U8RGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdPiB7XG4gICAgICAgIGNvbnN0IHJlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbChlbnRpdHlba2V5XSwgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sIG1ldGFkYXRhLCB0eXBlKSkpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IGVudGl0eVByaW9yQ2hhbmdlc1trZXldLFxuICAgICAgICAgICAgICAgICAgICBhZnRlcjogZW50aXR5W2tleV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIHNldCBibG9iIGZpbGUgZGF0YSBzbyB0aGF0IGl0IGlzIG9ubHkgcmVxdWVzdGVkIG9uY2UuXG4gICAgICAgICAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0gPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGVudGl0eVtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE8gUmVtb3ZlXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIEVudGl0aWVzIGFuZCByZXR1cm5zIHRoZWlyIGRpZmZlcmVuY2UgaW4gYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBmaXJzdCBlbnRpdHkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIC0gVGhlIHNlY29uZCBlbnRpdHkgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gRW50aXRpZXMgaW4gZm9ybSBvZiBhIFBhcnRpYWwuXG4gICAgICovXG4gICAgLy8gc3RhdGljIGFzeW5jIGRpZmZlcmVuY2U8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAvLyAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgIC8vICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGVcbiAgICAvLyApOiBQcm9taXNlPFBhcnRpYWw8RW50aXR5VHlwZT4+IHtcbiAgICAvLyAgICAgY29uc3QgcmVzOiBQYXJ0aWFsPEVudGl0eVR5cGU+ID0ge307XG4gICAgLy8gICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgIC8vICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgLy8gICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgIC8vICAgICAgICAgaWYgKCEoYXdhaXQgRW50aXR5VXRpbGl0aWVzLmlzRXF1YWwoZW50aXR5W2tleV0sIGVudGl0eVByaW9yQ2hhbmdlc1trZXldLCBtZXRhZGF0YSwgdHlwZSkpKSB7XG4gICAgLy8gICAgICAgICAgICAgcmVzW2tleV0gPSBlbnRpdHlba2V5XTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gcmVzO1xuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0d28gZ2l2ZW4gdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgKiBJdCB1c2VzIHRoZSBpc0VxdWFsIG1ldGhvZCBmcm9tIExvZGFzaFV0aWxpdGllcyBhbmQgZXh0ZW5kcyBpdCB3aXRoIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nIERhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlUHJpb3JDaGFuZ2VzIC0gVGhlIHZhbHVlIGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0VxdWFsKFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sXG4gICAgICAgIG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsLFxuICAgICAgICB0eXBlOiBEZWNvcmF0b3JUeXBlc1xuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCkuZmlsdGVyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxEYXRlVGltZSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1RJTUU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsQXJyYXlEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfUkFOR0U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsQXJyYXlEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLmZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gRW50aXR5VXRpbGl0aWVzLmlzRXF1YWxBcnJheVN0cmluZyh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVV0aWxpdGllcy5pc0VxdWFsRmlsZSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIChtZXRhZGF0YSBhcyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5tdWx0aXBsZSk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkNVU1RPTTpcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlVdGlsaXRpZXMuaXNFcXVhbEN1c3RvbSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIG1ldGFkYXRhIGFzIEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueSwgYW55LCBhbnksIGFueT4pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheVN0cmluZyh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHwgUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzdHJpbmdBcnJheTogc3RyaW5nW10gPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlIGFzIHN0cmluZ1tdKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzOiBzdHJpbmdbXSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgc3RyaW5nW10pLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHN0cmluZ0FycmF5LCBzdHJpbmdBcnJheVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5RGF0ZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWU6IERhdGVbXSA9ICh2YWx1ZSBhcyBEYXRlW10pLm1hcCh2ID0+IG5ldyBEYXRlKHYpKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlUHJpb3JDaGFuZ2VzOiBEYXRlW10gPSAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVtdKS5tYXAodiA9PiBuZXcgRGF0ZSh2KSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwobmV3VmFsdWUsIG5ld1ZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQXJyYXlEYXRlUmFuZ2UodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBmaWx0ZXI/OiBEYXRlRmlsdGVyRm48RGF0ZT4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlczogRGF0ZVJhbmdlW10gPSAodmFsdWUgYXMgRGF0ZVJhbmdlW10pLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlczogRGF0ZVJhbmdlW10gPSAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVJhbmdlW10pLnNvcnQoKTtcbiAgICAgICAgaWYgKGRhdGVSYW5nZXMubGVuZ3RoICE9PSBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkYXRlUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIUVudGl0eVV0aWxpdGllcy5pc0VxdWFsRGF0ZVJhbmdlKGRhdGVSYW5nZXNbaV0sIGRhdGVSYW5nZXNQcmlvckNoYW5nZXNbaV0sIGZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGVUaW1lKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgZGF0ZVByaW9yQ2hhbmdlcy5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlUmFuZ2UodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBmaWx0ZXI/OiBEYXRlRmlsdGVyRm48RGF0ZT4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlOiBEYXRlUmFuZ2UgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlKSBhcyBEYXRlUmFuZ2U7XG4gICAgICAgIGRhdGVSYW5nZS5zdGFydCA9IG5ldyBEYXRlKCh2YWx1ZSBhcyBEYXRlUmFuZ2UpLnN0YXJ0KTtcbiAgICAgICAgZGF0ZVJhbmdlLmVuZCA9IG5ldyBEYXRlKCh2YWx1ZSBhcyBEYXRlUmFuZ2UpLmVuZCk7XG4gICAgICAgIGRhdGVSYW5nZS52YWx1ZXMgPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgIGRhdGVSYW5nZS5zdGFydCxcbiAgICAgICAgICAgIGRhdGVSYW5nZS5lbmQsXG4gICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzOiBEYXRlUmFuZ2UgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlUHJpb3JDaGFuZ2VzKSBhcyBEYXRlUmFuZ2U7XG4gICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5zdGFydCA9IG5ldyBEYXRlKCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlUmFuZ2UpLnN0YXJ0KTtcbiAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCA9IG5ldyBEYXRlKCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlUmFuZ2UpLmVuZCk7XG4gICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy52YWx1ZXMgPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5zdGFydCxcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQsXG4gICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGVSYW5nZSwgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGlzRXF1YWxGaWxlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93biwgbXVsdGlwbGU6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByaW9yQ2hhbmdlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVEYXRhW10gPSBtdWx0aXBsZSA/ICh2YWx1ZSBhcyBGaWxlRGF0YVtdKS5zb3J0KCkgOiBbdmFsdWUgYXMgRmlsZURhdGFdLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZmlsZXNQcmlvckNoYW5nZXM6IEZpbGVEYXRhW10gPSBtdWx0aXBsZSA/ICh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBGaWxlRGF0YVtdKS5zb3J0KCkgOiBbdmFsdWVQcmlvckNoYW5nZXMgYXMgRmlsZURhdGFdLnNvcnQoKTtcbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCAhPT0gZmlsZXNQcmlvckNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgdGhpcyBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyBhbnkgZmlsZXMgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAgICAgICAgICBpZiAoIUxvZGFzaFV0aWxpdGllcy5pc0VxdWFsKExvZGFzaFV0aWxpdGllcy5vbWl0KGZpbGVzW2ldLCAnZmlsZScpLCBMb2Rhc2hVdGlsaXRpZXMub21pdChmaWxlc1ByaW9yQ2hhbmdlc1tpXSwgJ2ZpbGUnKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZSAmJiAhZmlsZXNbaV0uZmlsZSkge1xuICAgICAgICAgICAgICAgIGZpbGVzW2ldID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YShmaWxlc1tpXSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlc1tpXS5maWxlICYmICFmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXNQcmlvckNoYW5nZXNbaV0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZpbGVzUHJpb3JDaGFuZ2VzW2ldKTtcbiAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyA9IGZpbGVzUHJpb3JDaGFuZ2VzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChhd2FpdCBmaWxlc1tpXS5maWxlPy50ZXh0KCksIGF3YWl0IGZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGU/LnRleHQoKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEN1c3RvbShcbiAgICAgICAgdmFsdWU6IHVua25vd24sXG4gICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBtZXRhZGF0YTogQ3VzdG9tRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55LCBhbnksIGFueSwgYW55PlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW1ldGFkYXRhLmlzRXF1YWwodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzLCBtZXRhZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIGZ1bmN0aW9uIGZvciBzb3J0aW5nIGVudGl0eSBrZXlzIGJ5IHRoZWlyIG9yZGVyIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGEgLSBGaXJzdCBrZXkgb2YgZW50aXR5LlxuICAgICAqIEBwYXJhbSBiIC0gU2Vjb25kIGtleSBvZiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEN1cnJlbnQgZW50aXR5ICh1c2VkIHRvIGdldCBtZXRhZGF0YSBvZiBlbnRpdHkga2V5cykuXG4gICAgICogQHJldHVybnMgMCBpZiBib3RoIHZhbHVlcyBoYXZlIHRoZSBzYW1lIG9yZGVyLCBhIG5lZ2F0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWZvcmUgJ2InLCBhIHBvc2l0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWhpbmQgJ2InLlxuICAgICAqL1xuICAgIHN0YXRpYyBjb21wYXJlT3JkZXI8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgYToga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgYjoga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlXG4gICAgKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFBOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBhKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFCOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBiKTtcblxuICAgICAgICBpZiAobWV0YWRhdGFBLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGFBLnBvc2l0aW9uLm9yZGVyIC0gbWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIGZvciBcImxnXCIsIFwibWRcIiwgXCJzbVwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEVudGl0eSB0byBnZXQgdGhlIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIG9mIHRoZSBrZXkuXG4gICAgICogQHBhcmFtIGtleSAtIEtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0IGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHR5cGUgLSBEZWZpbmVzIGZvciB3aGljaCBzY3JlZW4gc2l6ZSB0aGUgY29sdW1uIHZhbHVlcyBzaG91bGQgYmUgcmV0dXJuZWQuXG4gICAgICogQHJldHVybnMgQm9vdHN0cmFwIGNvbHVtbiB2YWx1ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0V2lkdGg8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBrZXk6IGtleW9mIEVudGl0eVR5cGUsIHR5cGU6ICdsZycgfCAnbWQnIHwgJ3NtJ1xuICAgICk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xnJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdFdpZHRoc1swXTtcbiAgICAgICAgICAgIGNhc2UgJ21kJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdFdpZHRoc1sxXTtcbiAgICAgICAgICAgIGNhc2UgJ3NtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdFdpZHRoc1syXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyBhbGwgY2hhbmdlcyBvbiBhbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byByZXNldC5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIC0gVGhlIGVudGl0eSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlc2V0Q2hhbmdlc09uRW50aXR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlLCBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5UHJpb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLnNldChlbnRpdHksIGtleSwgUmVmbGVjdFV0aWxpdGllcy5nZXQoZW50aXR5UHJpb3JDaGFuZ2VzLCBrZXkpKTtcbiAgICAgICAgICAgIGlmIChSZWZsZWN0VXRpbGl0aWVzLmhhc01ldGFkYXRhKHRoaXMuTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVksIGVudGl0eSwga2V5KSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiAoUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSh0aGlzLk1FVEFEQVRBX0tFWVNfVE9fUkVTRVRfS0VZLCBlbnRpdHksIGtleSkgYXMgc3RyaW5nW10pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChSZWZsZWN0VXRpbGl0aWVzLmhhc01ldGFkYXRhKGssIGVudGl0eSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YShrLCB1bmRlZmluZWQsIGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEVudGl0eVJvd3M8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICB0YWI6IG51bWJlcixcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4sXG4gICAgICAgIGhpZGVPbWl0Rm9yRWRpdDogYm9vbGVhbixcbiAgICAgICAgYWRkaXRpb25hbE9taXRWYWx1ZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdXG4gICAgKTogRW50aXR5Um93PEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gW107XG5cbiAgICAgICAgY29uc3Qga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSBFbnRpdHlVdGlsaXRpZXMua2V5c09mKGVudGl0eSwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdClcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiAhYWRkaXRpb25hbE9taXRWYWx1ZXMuaW5jbHVkZXMoaykpO1xuICAgICAgICBjb25zdCBudW1iZXJPZlJvd3M6IG51bWJlciA9IEVudGl0eVV0aWxpdGllcy5nZXROdW1iZXJPZlJvd3M8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCB0YWIpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IG51bWJlck9mUm93czsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3c6IEVudGl0eVJvdzxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICByb3c6IGksXG4gICAgICAgICAgICAgICAga2V5czogRW50aXR5VXRpbGl0aWVzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCBpLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gocm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChFbnRpdHlVdGlsaXRpZXMuZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIC0xLCB0YWIpLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdFJvdzogRW50aXR5Um93PEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHJvdzogbnVtYmVyT2ZSb3dzICsgMSxcbiAgICAgICAgICAgICAgICBrZXlzOiBFbnRpdHlVdGlsaXRpZXMuZ2V0S2V5c0ZvclJvdzxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIC0xLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gobGFzdFJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRhYnMgdGhhdCBhcmUgdXNlZCB0byBkaXNwbGF5IHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHJvd3MgZnJvbS5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHBhcmFtIGFkZGl0aW9uYWxPbWl0VmFsdWVzIC0gQWRkaXRpb25hbCBvbWl0IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc29ydGVkIFRhYnMgY29udGFpbmluZyB0aGUgcm93cyBhbmQgdGhlIGtleXMgdG8gZGlzcGxheSBpbiB0aGF0IHJvdy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RW50aXR5VGFiczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIGhpZGVPbWl0Rm9yRWRpdDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBhZGRpdGlvbmFsT21pdFZhbHVlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXVxuICAgICk6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdIHtcbiAgICAgICAgY29uc3QgcmVzOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXSA9IFtdO1xuICAgICAgICBjb25zdCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5LCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0KVxuICAgICAgICAgICAgLmZpbHRlcihrID0+ICFhZGRpdGlvbmFsT21pdFZhbHVlcy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mVGFiczogbnVtYmVyID0gRW50aXR5VXRpbGl0aWVzLmdldE51bWJlck9mVGFiczxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHkpO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIGNvbnN0IGZpcnN0VGFiUm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5Um93czxFbnRpdHlUeXBlPihlbnRpdHksIC0xLCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0LCBhZGRpdGlvbmFsT21pdFZhbHVlcyk7XG4gICAgICAgIGlmIChmaXJzdFRhYlJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHRhYk5hbWU6IEVudGl0eVV0aWxpdGllcy5nZXRGaXJzdFRhYk5hbWUoZW50aXR5KSxcbiAgICAgICAgICAgICAgICB0YWI6IC0xLFxuICAgICAgICAgICAgICAgIHJvd3M6IGZpcnN0VGFiUm93c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZpcnN0VGFiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPD0gbnVtYmVyT2ZUYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3M6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVJvd3M8RW50aXR5VHlwZT4oXG4gICAgICAgICAgICAgICAgZW50aXR5LCBpLCBoaWRlT21pdEZvckNyZWF0ZSwgaGlkZU9taXRGb3JFZGl0LCBhZGRpdGlvbmFsT21pdFZhbHVlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyb3dzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YWJOYW1lOiBFbnRpdHlVdGlsaXRpZXMuZ2V0VGFiTmFtZShlbnRpdHksIGkpLFxuICAgICAgICAgICAgICAgICAgICB0YWI6IGksXG4gICAgICAgICAgICAgICAgICAgIHJvd3M6IHJvd3NcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRhYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEtleXNGb3JSb3c8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgcm93OiBudW1iZXIsXG4gICAgICAgIHRhYjogbnVtYmVyXG4gICAgKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICByZXR1cm4ga2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykucG9zaXRpb24ucm93ID09PSByb3cpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBFbnRpdHlVdGlsaXRpZXMuY29tcGFyZU9yZGVyKGEsIGIsIGVudGl0eSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldE51bWJlck9mUm93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBrZXlzXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKS5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5tYXAoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspLnBvc2l0aW9uLnJvdylcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYSA+IGIgPyAtMSA6IDEpKVswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXROdW1iZXJPZlRhYnM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSwgZW50aXR5OiBFbnRpdHlUeXBlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgICAgIC5tYXAoayA9PiBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspLnBvc2l0aW9uLnRhYilcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYSA+IGIgPyAtMSA6IDEpKVswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUYWJOYW1lPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlLCB0YWI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVkVGFiTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gRW50aXR5VXRpbGl0aWVzLmtleXNPZihlbnRpdHkpXG4gICAgICAgICAgICAubWFwKGsgPT4gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKSlcbiAgICAgICAgICAgIC5maW5kKG0gPT4gbS5wb3NpdGlvbi50YWIgPT09IHRhYiAmJiBtLnBvc2l0aW9uLnRhYk5hbWUpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/IGBUYWIgJHt0YWJ9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGaXJzdFRhYk5hbWU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IEVudGl0eVV0aWxpdGllcy5rZXlzT2YoZW50aXR5KVxuICAgICAgICAgICAgLm1hcChrID0+IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0ucG9zaXRpb24udGFiTmFtZSAmJiBtLnBvc2l0aW9uLnRhYiA9PT0gLTEpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/ICdUYWIgMSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgZW50aXR5IGNvcnJlY3RseSB0eXBlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUga2V5cyBvZi5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2Yga2V5cyBvZiB0aGUgZW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlzT2Y8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgbGV0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gUmVmbGVjdFV0aWxpdGllcy5vd25LZXlzKGVudGl0eSk7XG4gICAgICAgIGlmIChoaWRlT21pdEZvckNyZWF0ZSkge1xuICAgICAgICAgICAgY29uc3Qgb21pdEZvckNyZWF0ZUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yQ3JlYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhpZGVPbWl0Rm9yRWRpdCkge1xuICAgICAgICAgICAgY29uc3Qgb21pdEZvclVwZGF0ZUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yVXBkYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgcm93IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRpc3BsYXkgYW4gZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVJvdzxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGluIHdoaWNoIHRoaXMgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICByb3c6IG51bWJlcixcbiAgICAvKipcbiAgICAgKiBUaGUga2V5cyBvZiB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGF0IHJvdy5cbiAgICAgKi9cbiAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXVxufVxuXG4vKipcbiAqIEEgdGFiIHRoYXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZGlzcGxheSBhbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5VGFiPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0YWIgaW4gd2hpY2ggdGhlIHJvd3Mgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICB0YWI6IG51bWJlcixcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSB0byBkaXNwbGF5IGluc2lkZSB0aGUgdGFiLlxuICAgICAqL1xuICAgIHRhYk5hbWU6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgcm93cyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5zaWRlIHRoaXMgdGFiLC5cbiAgICAgKi9cbiAgICByb3dzOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXVxufSJdfQ==
|