@aurigma/ng-design-atoms-api-client 2.31.5 → 2.31.8
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.
|
@@ -5573,4 +5573,4 @@ function blobToText(blob) {
|
|
|
5573
5573
|
}
|
|
5574
5574
|
});
|
|
5575
5575
|
}
|
|
5576
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLWF0b21zLWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvYXVyaWdtYS9hZ2VudHMvMDUvX3dvcmsvMjQ1L3MvQXVyaWdtYS5EZXNpZ25BdG9tc0FwaS5UeXBlU2NyaXB0QXBpQ2xpZW50L0FuZ3VsYXIvYXBpLWNsaWVudC9wcm9qZWN0cy9jbGllbnQvc3JjLyIsInNvdXJjZXMiOlsibGliL2Rlc2lnbi1hdG9tcy1hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4QixtQkFBbUI7QUFDbkIsNEhBQTRIO0FBQzVILG9CQUFvQjtBQUNwQix3QkFBd0I7QUFDeEIsdUNBQXVDO0FBRXZDLE9BQU8sRUFBRSxRQUFRLElBQUksbUJBQW1CLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakcsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLElBQUksZUFBZSxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUUvRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQVMsY0FBYyxDQUFDLENBQUM7QUFFdkUsTUFBTSxPQUFPLHNCQUFzQjtJQUFuQztRQUNJLFdBQU0sR0FBVyx3QkFBd0IsQ0FBQztRQUMxQyxXQUFNLEdBQVcsUUFBUSxDQUFDO1FBQ2xCLHVCQUFrQixHQUFXLElBQUksQ0FBQztJQUc5QyxDQUFDO0lBRlMscUJBQXFCOzhEQUFzQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7S0FBQTtJQUFBLENBQUM7SUFDbkYscUJBQXFCLENBQUMsS0FBYSxJQUFVLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQUEsQ0FBQztDQUNuRjtBQUVELE1BQU0sT0FBTyxhQUFhO0lBQ3RCLFlBQW9CLGFBQXFDO1FBQXJDLGtCQUFhLEdBQWIsYUFBYSxDQUF3QjtJQUFJLENBQUM7SUFFOUMsZ0JBQWdCLENBQUMsT0FBWTs7WUFDekMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNqQixPQUFPLENBQUMsT0FBTyxHQUFJLE9BQU8sQ0FBQyxPQUF1QixDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO2FBQy9GO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxPQUFPLEdBQUksT0FBTyxDQUFDLE9BQXVCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25HO1lBQ0Qsa0ZBQWtGO1lBQ2xGLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVTLFVBQVUsQ0FBQyxTQUFpQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFUyxlQUFlLENBQUMsR0FBVyxFQUFFLEdBQXFCLEVBQUUsRUFBOEM7UUFDMUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBa0JELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxhQUFhO0lBS2pELFlBQTRDLGFBQXFDLEVBQXNCLElBQWdCLEVBQW9DLE9BQWdCO1FBQ3ZLLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUhmLHFCQUFnQixHQUFtRCxTQUFTLENBQUM7UUFJbkYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUTtRQUNKLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLENBQUM7UUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUN4QixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQThCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRDthQUNKOztnQkFDRyxPQUE4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGVBQWUsQ0FBQyxRQUEwQjtRQUNoRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDSCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG9CQUFvQixDQUFDO1FBQy9DLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUF3QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0Q7YUFDSjs7Z0JBQ0csT0FBd0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxjQUFjLENBQUMsUUFBMEI7UUFDL0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBc0IsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQzs7OztZQS9ISixVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7OztZQU04RCxzQkFBc0IsdUJBQXBFLE1BQU0sU0FBQyxzQkFBc0I7WUF4RHJDLFVBQVUsdUJBd0RxRSxNQUFNLFNBQUMsVUFBVTt5Q0FBcUIsUUFBUSxZQUFJLE1BQU0sU0FBQyxZQUFZOztBQWdRN0osTUFBTSxPQUFPLGlDQUFrQyxTQUFRLGFBQWE7SUFLaEUsWUFBNEMsYUFBcUMsRUFBc0IsSUFBZ0IsRUFBb0MsT0FBZ0I7UUFDdkssS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBSGYscUJBQWdCLEdBQW1ELFNBQVMsQ0FBQztRQUluRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsUUFBZ0IsRUFBRSxJQUF5QztRQUNoRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHdEQUF3RCxDQUFDO1FBQ25GLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBZ0IsRUFBRSxNQUFxQjtRQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLDhEQUE4RCxDQUFDO1FBQ3pGLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDL0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSwwQkFBMEI7YUFDdkMsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxZQUFZLENBQUMsUUFBMEI7UUFDN0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsUUFBZ0IsRUFBRSxPQUFtQztRQUM1RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLDJEQUEyRCxDQUFDO1FBQ3RGLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSTtZQUN6QyxJQUFJLElBQUksVUFBVSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxRQUEwQjtRQUNsRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxRQUFnQixFQUFFLElBQTZDO1FBQ3hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNERBQTRELENBQUM7UUFDdkYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFFBQWdCLEVBQUUsSUFBK0M7UUFDNUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw4REFBOEQsQ0FBQztRQUN6RixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFvQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0Q7YUFDSjs7Z0JBQ0csT0FBb0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxRQUEwQjtRQUN0RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLElBQTZCO1FBQzdELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsaUVBQWlFLENBQUM7UUFDNUYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsd0JBQXdCLENBQUMsUUFBMEI7UUFDekQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0gsR0FBRyxDQUFDLFFBQWdCLEVBQUUsQ0FBNkIsRUFBRSxDQUE2QixFQUFFLENBQTZCLEVBQUUsSUFBZ0MsRUFBRSxHQUErQixFQUFFLFNBQXFDLEVBQUUsTUFBa0MsRUFBRSxFQUErQixFQUFFLE1BQWtDLEVBQUUsRUFBK0IsRUFBRSxLQUFpQyxFQUFFLEdBQStCLEVBQUUsRUFBOEIsRUFBRSxTQUFzQyxFQUFFLElBQWdDLEVBQUUsYUFBeUM7UUFDMWpCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0RBQW9ELENBQUM7UUFDL0UsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUk7WUFDN0IsSUFBSSxJQUFJLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJO1lBQ25DLElBQUksSUFBSSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUk7WUFDakMsSUFBSSxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hELElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSTtZQUM3QyxJQUFJLElBQUksWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEUsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQ3ZDLElBQUksSUFBSSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUN2QyxJQUFJLElBQUksU0FBUyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7WUFDckMsSUFBSSxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUNqQyxJQUFJLElBQUksTUFBTSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUk7WUFDN0MsSUFBSSxJQUFJLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUNuQyxJQUFJLElBQUksT0FBTyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUQsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxJQUFJO1lBQ3JELElBQUksSUFBSSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxVQUFVLENBQUMsUUFBMEI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxRQUFnQjtRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVEQUF1RCxDQUFDO1FBQ2xGLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsaUJBQWlCLENBQUMsUUFBMEI7UUFDbEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNuRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFjLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsUUFBZ0IsRUFBRSxDQUE2QjtRQUMvQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG9EQUFvRCxDQUFDO1FBQy9FLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLFVBQVUsQ0FBQyxRQUEwQjtRQUMzQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxRQUFnQixFQUFFLEtBQWlDO1FBQ3hELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcseURBQXlELENBQUM7UUFDcEYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1RCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLFFBQWdCLEVBQUUsQ0FBNkI7UUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxvREFBb0QsQ0FBQztRQUMvRSxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUk7WUFDN0IsSUFBSSxJQUFJLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxVQUFVLENBQUMsUUFBMEI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsUUFBZ0IsRUFBRSxDQUE2QjtRQUMvQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG9EQUFvRCxDQUFDO1FBQy9FLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLFVBQVUsQ0FBQyxRQUEwQjtRQUMzQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDeEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywyRUFBMkUsQ0FBQztRQUN0RyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILCtCQUErQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDNUYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywrRUFBK0UsQ0FBQztRQUMxRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM1RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxzQ0FBc0MsQ0FBQyxRQUEwQjtRQUN2RSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDckYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3RUFBd0UsQ0FBQztRQUNuRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUywrQkFBK0IsQ0FBQyxRQUEwQjtRQUNoRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILDRCQUE0QixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDekYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw0RUFBNEUsQ0FBQztRQUN2RyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQ0FBbUMsQ0FBQyxRQUEwQjtRQUNwRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsSUFBNkM7UUFDN0UsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxpRUFBaUUsQ0FBQztRQUM1RixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFnQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkQ7YUFDSjs7Z0JBQ0csT0FBZ0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ25HLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQWMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLFFBQWdCLEVBQUUsSUFBMEM7UUFDakYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3RUFBd0UsQ0FBQztRQUNuRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUywrQkFBK0IsQ0FBQyxRQUEwQjtRQUNoRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDeEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywyRUFBMkUsQ0FBQztRQUN0RyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsSUFBbUQ7UUFDeEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzRUFBc0UsQ0FBQztRQUNqRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNuRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyw2QkFBNkIsQ0FBQyxRQUEwQjtRQUM5RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdDQUFnQyxDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDN0YsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxnRkFBZ0YsQ0FBQztRQUMzRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx1Q0FBdUMsQ0FBQyxRQUEwQjtRQUN4RSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILDBCQUEwQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDdkYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywwRUFBMEUsQ0FBQztRQUNyRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxpQ0FBaUMsQ0FBQyxRQUEwQjtRQUNsRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDbkYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzRUFBc0UsQ0FBQztRQUNqRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNuRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyw2QkFBNkIsQ0FBQyxRQUEwQjtRQUM5RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQzs7OztZQXZrREosVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7WUFNOEQsc0JBQXNCLHVCQUFwRSxNQUFNLFNBQUMsc0JBQXNCO1lBN1RyQyxVQUFVLHVCQTZUcUUsTUFBTSxTQUFDLFVBQVU7eUNBQXFCLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTs7QUFpbEQ3SixNQUFNLE9BQU8sMEJBQTJCLFNBQVEsYUFBYTtJQUt6RCxZQUE0QyxhQUFxQyxFQUFzQixJQUFnQixFQUFvQyxPQUFnQjtRQUN2SyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFIZixxQkFBZ0IsR0FBbUQsU0FBUyxDQUFDO1FBSW5GLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxrQkFBa0IsQ0FBQyxVQUF1QyxFQUFFLFFBQTZCLEVBQUUsSUFBaUQ7UUFDeEksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw0Q0FBNEMsQ0FBQztRQUN2RSxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLElBQUk7WUFDL0MsSUFBSSxJQUFJLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9GO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHlCQUF5QixDQUFDLFFBQTBCO1FBQzFELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQzs7OztZQTVGSixVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7OztZQU04RCxzQkFBc0IsdUJBQXBFLE1BQU0sU0FBQyxzQkFBc0I7WUFuNURyQyxVQUFVLHVCQW01RHFFLE1BQU0sU0FBQyxVQUFVO3lDQUFxQixRQUFRLFlBQUksTUFBTSxTQUFDLFlBQVk7O0FBOFE3SixNQUFNLE9BQU8sMkJBQTRCLFNBQVEsYUFBYTtJQUsxRCxZQUE0QyxhQUFxQyxFQUFzQixJQUFnQixFQUFvQyxPQUFnQjtRQUN2SyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFIZixxQkFBZ0IsR0FBbUQsU0FBUyxDQUFDO1FBSW5GLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLFFBQTZCLEVBQUUsSUFBNEM7UUFDckYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywrQkFBK0IsQ0FBQztRQUMxRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxRQUEwQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksQ0FBQyxjQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCLEVBQUUsSUFBMkM7UUFDakwsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztRQUNuRCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQW9DLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRDthQUNKOztnQkFDRyxPQUFvQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLG1CQUFtQixDQUFDLFFBQTBCO1FBQ3BELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBa0IsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxpQkFBaUIsQ0FBQyxFQUFpQixFQUFFLFlBQXdDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkI7UUFDekosSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3Q0FBd0MsQ0FBQztRQUNuRSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUk7WUFDbkQsSUFBSSxJQUFJLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFFLElBQUksbUJBQW1CLEtBQUssU0FBUyxJQUFJLG1CQUFtQixLQUFLLElBQUk7WUFDakUsSUFBSSxJQUFJLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzlGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHdCQUF3QixDQUFDLFFBQTBCO1FBQ3pELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3BILE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFnQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDMUgsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsV0FBVyxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QjtRQUN0SixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG1DQUFtQyxDQUFDO1FBQzlELElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxRQUEwQjtRQUNuRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxXQUFXLENBQUMsRUFBaUIsRUFBRSxjQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCLEVBQUUsSUFBNkI7UUFDckwsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQ0FBbUMsQ0FBQztRQUM5RCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2FBQ3JDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQThCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRDthQUNKOztnQkFDRyxPQUE4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGtCQUFrQixDQUFDLFFBQTBCO1FBQ25ELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsWUFBWSxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QixFQUFFLFNBQXdDLEVBQUUsaUNBQTZELEVBQUUsbUNBQXNFLEVBQUUscURBQWlGLEVBQUUsZ0RBQXlGLEVBQUUsNENBQStFO1FBQ3ZrQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG1DQUFtQyxDQUFDO1FBQzlELElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQzs7WUFFN0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxpQ0FBaUMsS0FBSyxJQUFJLElBQUksaUNBQWlDLEtBQUssU0FBUztZQUM3RixRQUFRLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxFQUFFLGlDQUFpQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkcsSUFBSSxtQ0FBbUMsS0FBSyxJQUFJLElBQUksbUNBQW1DLEtBQUssU0FBUztZQUNqRyxRQUFRLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxFQUFFLG1DQUFtQyxDQUFDLElBQUksRUFBRSxtQ0FBbUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMxTyxJQUFJLHFEQUFxRCxLQUFLLElBQUksSUFBSSxxREFBcUQsS0FBSyxTQUFTO1lBQ3JJLFFBQVEsQ0FBQyxNQUFNLENBQUMsdURBQXVELEVBQUUscURBQXFELENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvSSxJQUFJLGdEQUFnRCxLQUFLLElBQUksSUFBSSxnREFBZ0QsS0FBSyxTQUFTO1lBQzNILE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLENBQUMsQ0FBQzs7WUFFcEcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxrREFBa0QsRUFBRSxnREFBZ0QsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JJLElBQUksNENBQTRDLEtBQUssSUFBSSxJQUFJLDRDQUE0QyxLQUFLLFNBQVM7WUFDbkgsUUFBUSxDQUFDLE1BQU0sQ0FBQyw4Q0FBOEMsRUFBRSw0Q0FBNEMsQ0FBQyxJQUFJLEVBQUUsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyw0Q0FBNEMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFFdlIsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQUMsRUFBaUIsRUFBRSxjQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCO1FBQ3pKLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0NBQW9DLENBQUM7UUFDL0QsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsS0FBSyxJQUFJO1lBQ3ZELElBQUksSUFBSSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzlFLElBQUksbUJBQW1CLEtBQUssU0FBUyxJQUFJLG1CQUFtQixLQUFLLElBQUk7WUFDakUsSUFBSSxJQUFJLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHFCQUFxQixDQUFDLFFBQTBCO1FBQ3RELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QjtRQUN2SixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVDQUF1QyxDQUFDO1FBQ2xFLElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUF3QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0Q7YUFDSjs7Z0JBQ0csT0FBd0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxRQUEwQjtRQUNwRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQXNCLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFlBQVksQ0FBQyxFQUFpQixFQUFFLGNBQTJDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkIsRUFBRSxJQUF3QztRQUNqTSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVDQUF1QyxDQUFDO1FBQ2xFLElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7YUFDckMsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxFQUFpQixFQUFFLGNBQTJDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkI7UUFDdEosSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxQ0FBcUMsQ0FBQztRQUNoRSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDeEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsa0JBQWtCLENBQUMsUUFBMEI7UUFDbkQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsV0FBVyxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QixFQUFFLElBQXNDO1FBQzlMLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcscUNBQXFDLENBQUM7UUFDaEUsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsS0FBSyxJQUFJO1lBQ3ZELElBQUksSUFBSSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzlFLElBQUksbUJBQW1CLEtBQUssU0FBUyxJQUFJLG1CQUFtQixLQUFLLElBQUk7WUFDakUsSUFBSSxJQUFJLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjthQUNyQyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE4QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckQ7YUFDSjs7Z0JBQ0csT0FBOEIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxRQUEwQjtRQUNuRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGFBQWEsQ0FBQyxFQUFpQixFQUFFLGNBQTJDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkI7UUFDeEosSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxQ0FBcUMsQ0FBQztRQUNoRSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDMUY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsb0JBQW9CLENBQUMsUUFBMEI7UUFDckQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLFFBQTZCLEVBQUUsSUFBK0I7UUFDdkUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztRQUNuRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxRQUEwQjtRQUNwRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILFVBQVUsQ0FBQyxRQUFzQyxFQUFFLFFBQTZCLEVBQUUsVUFBOEMsRUFBRSxRQUFvQyxFQUFFLGFBQXlDLEVBQUUsVUFBNkM7UUFDNVAsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUztZQUMvQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0MsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsS0FBSyxTQUFTO1lBQ3JELFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUztZQUMvQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTdHLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQTBCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsUUFBb0MsRUFBRSxlQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCO1FBQzNMLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNENBQTRDLENBQUM7UUFDdkUsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLElBQUk7WUFDekQsSUFBSSxJQUFJLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEYsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDMUc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsb0NBQW9DLENBQUMsUUFBMEI7UUFDckUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsK0JBQStCLENBQUMsVUFBc0MsRUFBRSxlQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCO1FBQy9MLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsOENBQThDLENBQUM7UUFDekUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLElBQUk7WUFDekQsSUFBSSxJQUFJLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEYsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsc0NBQXNDLENBQUMsUUFBMEI7UUFDdkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLENBQUMsVUFBdUMsRUFBRSxRQUE2QixFQUFFLElBQWtEO1FBQzFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUM7UUFDakUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLDBCQUEwQjthQUN2QyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUywwQkFBMEIsQ0FBQyxRQUEwQjtRQUMzRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLENBQUMsVUFBdUMsRUFBRSxRQUE2QixFQUFFLElBQWdEO1FBQ3RJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0NBQW9DLENBQUM7UUFDL0QsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLDBCQUEwQjthQUN2QyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsVUFBdUMsRUFBRSxRQUE2QixFQUFFLElBQTRDO1FBQzlILElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcseUJBQXlCLENBQUM7UUFDcEQsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLDBCQUEwQjthQUN2QyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxRQUEwQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7WUF6b0RKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7O1lBTThELHNCQUFzQix1QkFBcEUsTUFBTSxTQUFDLHNCQUFzQjtZQXRxRXJDLFVBQVUsdUJBc3FFcUUsTUFBTSxTQUFDLFVBQVU7eUNBQXFCLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTs7QUFpeUQ3SixNQUFNLE9BQU8sMEJBQTJCLFNBQVEsYUFBYTtJQUt6RCxZQUE0QyxhQUFxQyxFQUFzQixJQUFnQixFQUFvQyxPQUFnQjtRQUN2SyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFIZixxQkFBZ0IsR0FBbUQsU0FBUyxDQUFDO1FBSW5GLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsUUFBNkIsRUFBRSxJQUF5QztRQUM3RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLGtDQUFrQyxDQUFDO1FBQzdELElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE1BQXFCLEVBQUUsUUFBNkI7UUFDdEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3Q0FBd0MsQ0FBQztRQUNuRSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUk7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsWUFBWSxDQUFDLFFBQTBCO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxPQUFtQyxFQUFFLFFBQTZCO1FBQ3pFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0NBQW9DLENBQUM7UUFDL0QsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQ3pDLElBQUksSUFBSSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNoRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQTBCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxRQUE2QixFQUFFLElBQTZDO1FBQ3JGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUM7UUFDakUsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxRQUE2QixFQUFFLElBQStDO1FBQ3pGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsd0NBQXdDLENBQUM7UUFDbkUsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0Y7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBb0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNEO2FBQ0o7O2dCQUNHLE9BQW9DLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMscUJBQXFCLENBQUMsUUFBMEI7UUFDdEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN2RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFrQixJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLFFBQTZCLEVBQUUsSUFBNkI7UUFDMUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywyQ0FBMkMsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsR0FBRyxDQUFDLENBQTZCLEVBQUUsQ0FBNkIsRUFBRSxDQUE2QixFQUFFLElBQWdDLEVBQUUsR0FBK0IsRUFBRSxTQUFxQyxFQUFFLE1BQWtDLEVBQUUsRUFBK0IsRUFBRSxNQUFrQyxFQUFFLEVBQStCLEVBQUUsS0FBaUMsRUFBRSxHQUErQixFQUFFLEVBQThCLEVBQUUsU0FBc0MsRUFBRSxJQUFnQyxFQUFFLGFBQXlDLEVBQUUsUUFBNkI7UUFDdmtCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUk7WUFDN0IsSUFBSSxJQUFJLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJO1lBQ25DLElBQUksSUFBSSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUk7WUFDakMsSUFBSSxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hELElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSTtZQUM3QyxJQUFJLElBQUksWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEUsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQ3ZDLElBQUksSUFBSSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUN2QyxJQUFJLElBQUksU0FBUyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7WUFDckMsSUFBSSxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUNqQyxJQUFJLElBQUksTUFBTSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUk7WUFDN0MsSUFBSSxJQUFJLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUNuQyxJQUFJLElBQUksT0FBTyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUQsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxJQUFJO1lBQ3JELElBQUksSUFBSSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxVQUFVLENBQUMsUUFBMEI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsUUFBNkI7UUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxpQ0FBaUMsQ0FBQztRQUM1RCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQWdDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RDthQUNKOztnQkFDRyxPQUFnQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQTBCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxDQUE2QixFQUFFLFFBQTZCO1FBQzVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsVUFBVSxDQUFDLFFBQTBCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxLQUFpQyxFQUFFLFFBQTZCO1FBQ3JFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsa0NBQWtDLENBQUM7UUFDN0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1RCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxDQUE2QixFQUFFLFFBQTZCO1FBQzVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsVUFBVSxDQUFDLFFBQTBCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxDQUE2QixFQUFFLFFBQTZCO1FBQzVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsVUFBVSxDQUFDLFFBQTBCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDJCQUEyQixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDckcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxREFBcUQsQ0FBQztRQUNoRixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCwrQkFBK0IsQ0FBQyxRQUE2QixFQUFFLElBQThDO1FBQ3pHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcseURBQXlELENBQUM7UUFDcEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsc0NBQXNDLENBQUMsUUFBMEI7UUFDdkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsUUFBNkIsRUFBRSxJQUE4QztRQUNsRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLGtEQUFrRCxDQUFDO1FBQzdFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JHO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLCtCQUErQixDQUFDLFFBQTBCO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDRCQUE0QixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDdEcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzREFBc0QsQ0FBQztRQUNqRixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQ0FBbUMsQ0FBQyxRQUEwQjtRQUNwRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxRQUE2QixFQUFFLElBQTZDO1FBQzFGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsMkNBQTJDLENBQUM7UUFDdEUsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsd0JBQXdCLENBQUMsUUFBMEI7UUFDekQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNuRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFjLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsUUFBNkIsRUFBRSxJQUEwQztRQUM5RixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLGtEQUFrRCxDQUFDO1FBQzdFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JHO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLCtCQUErQixDQUFDLFFBQTBCO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDJCQUEyQixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDckcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxREFBcUQsQ0FBQztRQUNoRixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxRQUE2QixFQUFFLElBQW1EO1FBQ3JHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZ0RBQWdELENBQUM7UUFDM0UsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsNkJBQTZCLENBQUMsUUFBMEI7UUFDOUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0NBQWdDLENBQUMsUUFBNkIsRUFBRSxJQUE4QztRQUMxRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLDBEQUEwRCxDQUFDO1FBQ3JGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdHO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHVDQUF1QyxDQUFDLFFBQTBCO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDBCQUEwQixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDcEcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxvREFBb0QsQ0FBQztRQUMvRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxpQ0FBaUMsQ0FBQyxRQUEwQjtRQUNsRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxRQUE2QixFQUFFLElBQThDO1FBQ2hHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZ0RBQWdELENBQUM7UUFDM0UsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsNkJBQTZCLENBQUMsUUFBMEI7UUFDOUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7WUFybkRKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7O1lBTThELHNCQUFzQix1QkFBcEUsTUFBTSxTQUFDLHNCQUFzQjtZQTU4SHJDLFVBQVUsdUJBNDhIcUUsTUFBTSxTQUFDLFVBQVU7eUNBQXFCLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTs7QUFpdEQ3SixtQ0FBbUM7QUFDbkMsTUFBTSxDQUFOLElBQVksb0JBS1g7QUFMRCxXQUFZLG9CQUFvQjtJQUM1QixxQ0FBYSxDQUFBO0lBQ2IsbUNBQVcsQ0FBQTtJQUNYLHFDQUFhLENBQUE7SUFDYixtQ0FBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLG9CQUFvQixLQUFwQixvQkFBb0IsUUFLL0I7QUE0Q0QsTUFBTSxDQUFOLElBQVksaUJBT1g7QUFQRCxXQUFZLGlCQUFpQjtJQUN6Qix3Q0FBbUIsQ0FBQTtJQUNuQixzQ0FBaUIsQ0FBQTtJQUNqQix3Q0FBbUIsQ0FBQTtJQUNuQiw0Q0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBdUIsQ0FBQTtJQUN2QixrQ0FBYSxDQUFBO0FBQ2pCLENBQUMsRUFQVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBTzVCO0FBZ0JELDRCQUE0QjtBQUM1QixNQUFNLENBQU4sSUFBWSxnQkFJWDtBQUpELFdBQVksZ0JBQWdCO0lBQ3hCLDJDQUF1QixDQUFBO0lBQ3ZCLGlFQUE2QyxDQUFBO0lBQzdDLG1GQUErRCxDQUFBO0FBQ25FLENBQUMsRUFKVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBSTNCO0FBRUQscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBTixJQUFZLDBCQUVYO0FBRkQsV0FBWSwwQkFBMEI7SUFDbEMsNkNBQWUsQ0FBQTtBQUNuQixDQUFDLEVBRlcsMEJBQTBCLEtBQTFCLDBCQUEwQixRQUVyQztBQTBCRCxNQUFNLENBQU4sSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2hCLDJCQUFlLENBQUE7SUFDZiwyQkFBZSxDQUFBO0lBQ2YsK0JBQW1CLENBQUE7SUFDbkIsMkJBQWUsQ0FBQTtBQUNuQixDQUFDLEVBTFcsUUFBUSxLQUFSLFFBQVEsUUFLbkI7QUFFRCx1QkFBdUI7QUFDdkIsTUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN0QiwrQkFBYSxDQUFBO0lBQ2IsK0NBQTZCLENBQUE7SUFDN0IsNkRBQTJDLENBQUE7QUFDL0MsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBd0JELE1BQU0sQ0FBTixJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDMUIsbUNBQWEsQ0FBQTtJQUNiLGlDQUFXLENBQUE7SUFDWCxtQ0FBYSxDQUFBO0lBQ2IsaUNBQVcsQ0FBQTtBQUNmLENBQUMsRUFMVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBSzdCO0FBRUQsTUFBTSxDQUFOLElBQVksNkJBWVg7QUFaRCxXQUFZLDZCQUE2QjtJQUNyQyw4Q0FBYSxDQUFBO0lBQ2Isa0RBQWlCLENBQUE7SUFDakIsNENBQVcsQ0FBQTtJQUNYLHNFQUFxQyxDQUFBO0lBQ3JDLGtEQUFpQixDQUFBO0lBQ2pCLGdEQUFlLENBQUE7SUFDZixnRUFBK0IsQ0FBQTtJQUMvQixvREFBbUIsQ0FBQTtJQUNuQiw4REFBNkIsQ0FBQTtJQUM3Qiw4REFBNkIsQ0FBQTtJQUM3QixzREFBcUIsQ0FBQTtBQUN6QixDQUFDLEVBWlcsNkJBQTZCLEtBQTdCLDZCQUE2QixRQVl4QztBQXVERCxNQUFNLE9BQU8sWUFBYSxTQUFRLEtBQUs7SUFPbkMsWUFBWSxPQUFlLEVBQUUsTUFBYyxFQUFFLFFBQWdCLEVBQUUsT0FBZ0MsRUFBRSxNQUFXO1FBQ3hHLEtBQUssRUFBRSxDQUFDO1FBU0YsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFQNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUlELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBUTtRQUMxQixPQUFPLEdBQUcsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDO0lBQ3ZDLENBQUM7Q0FDSjtBQUVELFNBQVMsY0FBYyxDQUFDLE9BQWUsRUFBRSxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxPQUFnQyxFQUFFLE1BQVk7SUFDckgsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQ3ZDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBRWhDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUYsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQVM7SUFDekIsT0FBTyxJQUFJLFVBQVUsQ0FBUyxDQUFDLFFBQWEsRUFBRSxFQUFFO1FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjthQUFNO1lBQ0gsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFO2dCQUNwQixRQUFRLENBQUMsSUFBSSxDQUFPLEtBQUssQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUM7WUFDRixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDxhdXRvLWdlbmVyYXRlZD5cbi8vICAgICBHZW5lcmF0ZWQgdXNpbmcgdGhlIE5Td2FnIHRvb2xjaGFpbiB2MTMuMTUuNS4wIChOSnNvblNjaGVtYSB2MTAuNi42LjAgKE5ld3RvbnNvZnQuSnNvbiB2MTEuMC4wLjApKSAoaHR0cDovL05Td2FnLm9yZylcbi8vIDwvYXV0by1nZW5lcmF0ZWQ+XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlU2hhcnBlciBkaXNhYmxlIEluY29uc2lzdGVudE5hbWluZ1xuXG5pbXBvcnQgeyBtZXJnZU1hcCBhcyBfb2JzZXJ2YWJsZU1lcmdlTWFwLCBjYXRjaEVycm9yIGFzIF9vYnNlcnZhYmxlQ2F0Y2ggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tIGFzIF9vYnNlcnZhYmxlRnJvbSwgdGhyb3dFcnJvciBhcyBfb2JzZXJ2YWJsZVRocm93LCBvZiBhcyBfb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cFJlc3BvbnNlQmFzZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuZXhwb3J0IGNvbnN0IEFQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdBUElfQkFTRV9VUkwnKTtcblxuZXhwb3J0IGNsYXNzIEFwaUNsaWVudENvbmZpZ3VyYXRpb24ge1xuICAgIGFwaVVybDogc3RyaW5nID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTQyMjAnO1xuICAgIGFwaUtleTogc3RyaW5nID0gJ0FwaUtleSc7XG4gICAgcHJpdmF0ZSBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZyA9IG51bGw7XG4gICAgYXN5bmMgZ2V0QXV0aG9yaXphdGlvblRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbjsgfTtcbiAgICBzZXRBdXRob3JpemF0aW9uVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQgeyB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbiA9IHRva2VuOyB9O1xufVxuXG5leHBvcnQgY2xhc3MgQXBpQ2xpZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uKSB7IH1cblxuICAgIHByb3RlY3RlZCBhc3luYyB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEF1dGhvcml6YXRpb25Ub2tlbigpO1xuICAgICAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IChvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnMpLmFwcGVuZChcImF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gKG9wdGlvbnMuaGVhZGVycyBhcyBIdHRwSGVhZGVycykuYXBwZW5kKFwiWC1BUEktS2V5XCIsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgdHJhbnNmb3JtUmVzcG9uc2U6IChyZXMpID0+IHJlcywgcmVzcG9uc2VUeXBlOiAnanNvbicgfTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEJhc2VVcmwoZGVmdWx0VXJsOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyYW5zZm9ybVJlc3VsdCh1cmw6IHN0cmluZywgcmVzOiBIdHRwUmVzcG9uc2VCYXNlLCBjYjogKHJlczogSHR0cFJlc3BvbnNlQmFzZSkgPT4gT2JzZXJ2YWJsZTxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgIHJldHVybiBjYihyZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnVpbGRJbmZvQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFzc2VtYmx5IGJ1aWxkIGluZm9cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBoZWFkSW5mbygpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIEdldHMgYXNzZW1ibHkgYnVpbGQgaW5mb1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8oKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQnVpbGRJbmZvQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElCdWlsZEluZm9BcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYXNzZW1ibHkgYnVpbGQgaW5mb1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGhlYWRJbmZvKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9pbmZvXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiaGVhZFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NIZWFkSW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0hlYWRJbmZvKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0hlYWRJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYXNzZW1ibHkgYnVpbGQgaW5mb1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8oKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9pbmZvXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8QnVpbGRJbmZvTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEJ1aWxkSW5mb01vZGVsPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNDb21wYXRpYmlsaXR5QXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNzc0ZvbnRzKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBGb250c01ldGhvZERhdGEgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHRlbmFudElkOiBudW1iZXIsIHBzTmFtZTogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZm9udEtleSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENzc0ZvbnQodGVuYW50SWQ6IG51bWJlciwgZm9udEtleT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbWFnZVNpemUodGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0U2hhcGVCb3VuZHModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldFNoYXBlQm91bmRzUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0V2F0ZXJtYXJrSXRlbXModGVuYW50SWQ6IG51bWJlciwgYm9keT86IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaW1nKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdGgodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVzb3VyY2UodGVuYW50SWQ6IG51bWJlciwgaW1hZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdHh0KHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVDb2xvcnNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUltYWdlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUltYWdlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVTaGFwZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduQXRvbXNDb21wYXRpYmlsaXR5QXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc0NvbXBhdGliaWxpdHlBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3NzRm9udHModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2Nzc2ZvbnRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3NzRm9udHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0Nzc0ZvbnRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHRlbmFudElkOiBudW1iZXIsIHBzTmFtZTogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvZm9udHMve3BzTmFtZX1cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAocHNOYW1lID09PSB1bmRlZmluZWQgfHwgcHNOYW1lID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHNOYW1lJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3BzTmFtZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwc05hbWUpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRm9udHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0ZvbnRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZvbnRLZXkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KHRlbmFudElkOiBudW1iZXIsIGZvbnRLZXk/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRDc3NGb250P1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIGlmIChmb250S2V5ICE9PSB1bmRlZmluZWQgJiYgZm9udEtleSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmb250S2V5PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmb250S2V5KSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENzc0ZvbnQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDc3NGb250KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRDc3NGb250KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbWFnZVNpemUodGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRJbWFnZVNpemVcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbWFnZVNpemUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TnVsbEFibGVTaXplPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxOdWxsQWJsZVNpemU+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRTaGFwZUJvdW5kcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL0dldFNoYXBlQm91bmRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFNoYXBlQm91bmRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0U2hhcGVCb3VuZHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVjdGFuZ2xlRj4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZWN0YW5nbGVGPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0U2hhcGVCb3VuZHMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFJlY3RhbmdsZUY+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFJlY3RhbmdsZUY+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0V2F0ZXJtYXJrSXRlbXNcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0V2F0ZXJtYXJrSXRlbXMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0V2F0ZXJtYXJrSXRlbXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaW1nKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvaW1nP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIGlmIChmICE9PSB1bmRlZmluZWQgJiYgZiAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICBpZiAodyAhPT0gdW5kZWZpbmVkICYmIHcgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggIT09IHVuZGVmaW5lZCAmJiBoICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGgpICsgXCImXCI7XG4gICAgICAgIGlmIChjbXlrICE9PSB1bmRlZmluZWQgJiYgY215ayAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjbXlrPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjbXlrKSArIFwiJlwiO1xuICAgICAgICBpZiAocmdiICE9PSB1bmRlZmluZWQgJiYgcmdiICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInJnYj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmdiKSArIFwiJlwiO1xuICAgICAgICBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQgJiYgZ3JheXNjYWxlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImdyYXlzY2FsZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZ3JheXNjYWxlKSArIFwiJlwiO1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRhcmdldD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGFyZ2V0KSArIFwiJlwiO1xuICAgICAgICBpZiAoc3EgIT09IHVuZGVmaW5lZCAmJiBzcSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzcT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3EpICsgXCImXCI7XG4gICAgICAgIGlmIChlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3QgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZWZmZWN0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBlZmZlY3QpICsgXCImXCI7XG4gICAgICAgIGlmIChrcCAhPT0gdW5kZWZpbmVkICYmIGtwICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yICE9PSB1bmRlZmluZWQgJiYgY29sb3IgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNvbG9yKSArIFwiJlwiO1xuICAgICAgICBpZiAob2JtICE9PSB1bmRlZmluZWQgJiYgb2JtICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcIm9ibT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb2JtKSArIFwiJlwiO1xuICAgICAgICBpZiAob28gIT09IHVuZGVmaW5lZCAmJiBvbyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvbz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb28pICsgXCImXCI7XG4gICAgICAgIGlmIChhbHBoYU1hc2sgIT09IHVuZGVmaW5lZCAmJiBhbHBoYU1hc2sgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiYWxwaGFNYXNrPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhbHBoYU1hc2spICsgXCImXCI7XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwYWdlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAoY29sb3JpemVDb2xvciAhPT0gdW5kZWZpbmVkICYmIGNvbG9yaXplQ29sb3IgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NJbWcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NJbWcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0ltZyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2xpY2Vuc2VcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldExpY2Vuc2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRMaWNlbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcHRoKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9wdGg/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgIT09IHVuZGVmaW5lZCAmJiBmICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NQdGgocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVzb3VyY2UodGVuYW50SWQ6IG51bWJlciwgaW1hZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9yZXNvdXJjZT9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiBpbWFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJpbWFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaW1hZ2UpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHN2Zyh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvc3ZnP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIGlmIChmICE9PSB1bmRlZmluZWQgJiYgZiAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU3ZnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdHh0KHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci90eHQ/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgIT09IHVuZGVmaW5lZCAmJiBmICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NUeHQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVDb2xvcnNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQnlDb2xvckRhdGFcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeUNvbG9yRGF0YSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8c3RyaW5nPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxzdHJpbmc+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QodGVuYW50SWQ6IG51bWJlciwgYm9keT86IE11bHRpQ2FsbFJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3RcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUltYWdlSXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVTaGFwZUl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNJbWFnZXNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSB3ZWIgaW1hZ2UgcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkXG4gICAgKGRlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJykuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXcoYXR0YWNobWVudD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckltYWdlUHJldmlld01vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25BdG9tc0ltYWdlc0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJRGVzaWduQXRvbXNJbWFnZXNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSB3ZWIgaW1hZ2UgcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkXG4gICAgKGRlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJykuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXcoYXR0YWNobWVudD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckltYWdlUHJldmlld01vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2ltYWdlcy9yZW5kZXItaW1hZ2UtcHJldmlldz9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZCAmJiBhdHRhY2htZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImF0dGFjaG1lbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGF0dGFjaG1lbnQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlbmRlckltYWdlUHJldmlldyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlc2lnbkF0b21zU2VydmljZUFwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgY29sb3JzXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENvbnZlcnQgY29sb3JzIG9wZXJhdGlvbiBwYXJhbWV0ZXJzXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY29udmVydENvbG9ycyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IENvbnZlcnRDb2xvcnNNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZGVzaWduIGZpbGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQgc2F2ZXMgaXQgaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHNhdmVkIHRvIHByaXZhdGUgc3RvcmFnZVxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRGVzaWduIGNyZWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVEZXNpZ24ocHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlRGVzaWduTW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxEZXNpZ25JbmZvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvbnRlbnQgb2YgdGhlIGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdXJmYWNlSW5kZXggKG9wdGlvbmFsKSBTdXJmYWNlIGluZGV4LlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBleHRyYWN0QmFja2dyb3VuZChpZDogc3RyaW5nIHwgbnVsbCwgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIExvYWRzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZFByb2R1Y3QoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBTYXZlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIHRvIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgc2F2ZWQgdG8gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHByb2R1Y3QgZGVzY3JpcHRpb25cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBzYXZlUHJvZHVjdChpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogUGF0Y2hlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIGluIGRlc2lnbiBmaWxlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcGF0Y2hUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwYXRjaFByb2R1Y3QoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgcGF0Y2hUeXBlPzogUHJvZHVjdFBhdGNoVHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGU/OiBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogTG9hZHMgZGF0YSBzY2hlbWEgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZERhdGFTY2hlbWEoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhcmlhYmxlIGl0ZW1zIGluZm9ybWF0aW9uIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0VmFyaWFibGVzKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPjtcbiAgICAvKipcbiAgICAgKiBTZXRzIHZhcmlhYmxlIGl0ZW1zIHZhbHVlcyBmb3IgZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlIChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJyBkZXNpZ24gd2lsbCBiZSB0YWtlbiBmcm9tIHByaXZhdGUgc3RvcmFnZVxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRGVzaWduIHZhcmlhYmxlIHZhbHVlc1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNldFZhcmlhYmxlcyhpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVmFyaWFibGVzTW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBMb2FkcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20gZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlIChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJyBkZXNpZ24gd2lsbCBiZSB0YWtlbiBmcm9tIHByaXZhdGUgc3RvcmFnZVxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWRWZHBEYXRhKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD47XG4gICAgLyoqXG4gICAgICogU2F2ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiB0byBkZXNpZ24gZmlsZSBhbmQgdXBkYXRlcyBkZXNpZ24gaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHZkcCBkYXRhXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVZkcERhdGEoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFZkcERhdGFNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcmFtdGlvbiBmcm9tIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGVWZHBEYXRhKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIEZsYXR0ZW4gaXRlbXMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIEl0ZW1zIHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZmxhdHRlbkl0ZW1zKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55W10gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgcHJvZHVjdCBpdGVtXG4gICAgICogQHBhcmFtIGl0ZW1UeXBlIChvcHRpb25hbCkgRGVzaXJlZCBpdGVtIHR5cGVcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBzb3VyY2VUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZUlkIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZU93bmVySWQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZUl0ZW0oaXRlbVR5cGU/OiBJdGVtVHlwZSB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBzb3VyY2VUeXBlPzogSXRlbVNvdXJjZVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNvdXJjZU93bmVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VGaWxlPzogRmlsZVBhcmFtZXRlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByaXZhdGUgZGVzaWduIGZyb20gYSBwdWJsaWMgZGVzaWduLlxuICAgICAqIEBwYXJhbSBkZXNpZ25JZCAob3B0aW9uYWwpIFB1YmxpYyBkZXNpZ24gSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIElELlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIElELlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21EZXNpZ24oZGVzaWduSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlRGVzaWduSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcml2YXRlIGRlc2lnbiBmcm9tIGEgcHVibGljIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSByZXNvdXJjZUlkIChvcHRpb25hbCkgUmVzb3VyY2UgSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIElELlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIElELlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZShyZXNvdXJjZUlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZURlc2lnbklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJldmlld01vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByb29mIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJvb2YgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJEZXNpZ25Qcm9vZihhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJvb2ZNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogUmVuZGVyIHByb2R1Y3QgcHJvb2YgaW1hZ2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBQcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyUHJvZHVjdChhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyUHJvZHVjdE1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25BdG9tc1NlcnZpY2VBcGlDbGllbnQgZXh0ZW5kcyBBcGlDbGllbnRCYXNlIGltcGxlbWVudHMgSURlc2lnbkF0b21zU2VydmljZUFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgY29sb3JzXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENvbnZlcnQgY29sb3JzIG9wZXJhdGlvbiBwYXJhbWV0ZXJzXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY29udmVydENvbG9ycyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IENvbnZlcnRDb2xvcnNNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jb2xvckNvbnZlcnRlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDb252ZXJ0Q29sb3JzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ29udmVydENvbG9ycyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ29udmVydENvbG9ycyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBkZXNpZ24gZmlsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBzYXZlcyBpdCBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgc2F2ZWQgdG8gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBEZXNpZ24gY3JlYXRpb24gcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZURlc2lnbihwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBDcmVhdGVEZXNpZ25Nb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPERlc2lnbkluZm8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducz9cIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVEZXNpZ24oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVEZXNpZ24oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RGVzaWduSW5mbz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxEZXNpZ25JbmZvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlRGVzaWduKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxEZXNpZ25JbmZvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDE6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDEgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxEZXNpZ25JbmZvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPERlc2lnbkluZm8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb250ZW50IG9mIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3VyZmFjZUluZGV4IChvcHRpb25hbCkgU3VyZmFjZSBpbmRleC5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZXh0cmFjdEJhY2tncm91bmQoaWQ6IHN0cmluZyB8IG51bGwsIHN1cmZhY2VJbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9iYWNrZ3JvdW5kP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChzdXJmYWNlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBzdXJmYWNlSW5kZXggIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic3VyZmFjZUluZGV4PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdXJmYWNlSW5kZXgpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0V4dHJhY3RCYWNrZ3JvdW5kKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRXh0cmFjdEJhY2tncm91bmQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0V4dHJhY3RCYWNrZ3JvdW5kKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TWlzc2luZ0Rlc2lnbkVsZW1lbnREdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQyMjogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQyMiA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFVucHJvY2Vzc2FibGVEZXNpZ25FbGVtZW50RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNsaWVudCBFcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MjIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZVxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkUHJvZHVjdChpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L21vZGVsP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZSAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZU93bmVyICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWRQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvYWRQcm9kdWN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgdG8gZGVzaWduIGZpbGUgYW5kIHVwZGF0ZXMgZGVzaWduIGluIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlIChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJyBkZXNpZ24gd2lsbCBiZSBzYXZlZCB0byBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFNlcmlhbGl6ZWQgcHJvZHVjdCBkZXNjcmlwdGlvblxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNhdmVQcm9kdWN0KGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9tb2RlbD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicHV0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NhdmVQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzU2F2ZVByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU2F2ZVByb2R1Y3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF0Y2hlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIGluIGRlc2lnbiBmaWxlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcGF0Y2hUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwYXRjaFByb2R1Y3QoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgcGF0Y2hUeXBlPzogUHJvZHVjdFBhdGNoVHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGU/OiBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vbW9kZWw/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgaWYgKHBhdGNoVHlwZSA9PT0gbnVsbCB8fCBwYXRjaFR5cGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhdGNoVHlwZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJwYXRjaFR5cGVcIiwgcGF0Y2hUeXBlLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lICE9PSBudWxsICYmIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvLml0ZW1OYW1lXCIsIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlICE9PSBudWxsICYmIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm8uc291cmNlRmlsZVwiLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZS5kYXRhLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZS5maWxlTmFtZSA/IHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlLmZpbGVOYW1lIDogXCJyZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm8uc291cmNlRmlsZVwiKTtcbiAgICAgICAgaWYgKHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lICE9PSBudWxsICYmIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm8ucGxhY2Vob2xkZXJJdGVtTmFtZVwiLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZSA9PT0gbnVsbCB8fCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm8ubmV3Q29udGVudFR5cGVcIiwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX25ld0NvbnRlbnRUeXBlLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgIT09IG51bGwgJiYgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mby5zb3VyY2VGaWxlXCIsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlLmRhdGEsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlLmZpbGVOYW1lID8gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUuZmlsZU5hbWUgOiBcInJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mby5zb3VyY2VGaWxlXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicGF0Y2hcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUGF0Y2hQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUGF0Y2hQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1BhdGNoUHJvZHVjdChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBkYXRhIHNjaGVtYSBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZVxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkRGF0YVNjaGVtYShpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3NjaGVtYT9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWREYXRhU2NoZW1hKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZERhdGFTY2hlbWEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvYWREYXRhU2NoZW1hKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHZhcmlhYmxlIGl0ZW1zIGluZm9ybWF0aW9uIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0VmFyaWFibGVzKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS92YXJpYWJsZXM/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VmFyaWFibGVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VmFyaWFibGVzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0VmFyaWFibGVzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxWYXJpYWJsZXNNb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VmFyaWFibGVzTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFZhcmlhYmxlc01vZGVsPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdmFyaWFibGUgaXRlbXMgdmFsdWVzIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBEZXNpZ24gdmFyaWFibGUgdmFsdWVzXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2V0VmFyaWFibGVzKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBWYXJpYWJsZXNNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZhcmlhYmxlcz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicHV0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NldFZhcmlhYmxlcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NldFZhcmlhYmxlcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTZXRWYXJpYWJsZXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZVxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkVmRwRGF0YShpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxWZHBEYXRhTW9kZWw+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcERhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFZkcERhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxWZHBEYXRhTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VmRwRGF0YU1vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9hZFZkcERhdGEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VmRwRGF0YU1vZGVsPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxWZHBEYXRhTW9kZWw+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiB0byBkZXNpZ24gZmlsZSBhbmQgdXBkYXRlcyBkZXNpZ24gaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHZkcCBkYXRhXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVZkcERhdGEoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFZkcERhdGFNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcERhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInB1dFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTYXZlVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NhdmVWZHBEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1NhdmVWZHBEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcmFtdGlvbiBmcm9tIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGVWZHBEYXRhKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcERhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZGVsZXRlXCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0RlbGV0ZVZkcERhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NEZWxldGVWZHBEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0RlbGV0ZVZkcERhdGEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ29uZmxpY3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVuIGl0ZW1zLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBJdGVtcyB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZsYXR0ZW5JdGVtcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IGFueVtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2ZsYXR0ZW4/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGbGF0dGVuSXRlbXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHByb2R1Y3QgaXRlbVxuICAgICAqIEBwYXJhbSBpdGVtVHlwZSAob3B0aW9uYWwpIERlc2lyZWQgaXRlbSB0eXBlXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gc291cmNlVHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VJZCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VPd25lcklkIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVJdGVtKGl0ZW1UeXBlPzogSXRlbVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgc291cmNlVHlwZT86IEl0ZW1Tb3VyY2VUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCwgc291cmNlSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VPd25lcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvaXRlbUNyZWF0b3I/XCI7XG4gICAgICAgIGlmIChpdGVtVHlwZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW1UeXBlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcIml0ZW1UeXBlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpdGVtVHlwZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgIT09IG51bGwgJiYgc291cmNlVHlwZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwic291cmNlVHlwZVwiLCBzb3VyY2VUeXBlLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc291cmNlSWQgIT09IG51bGwgJiYgc291cmNlSWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInNvdXJjZUlkXCIsIHNvdXJjZUlkLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc291cmNlT3duZXJJZCAhPT0gbnVsbCAmJiBzb3VyY2VPd25lcklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJzb3VyY2VPd25lcklkXCIsIHNvdXJjZU93bmVySWQudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChzb3VyY2VGaWxlICE9PSBudWxsICYmIHNvdXJjZUZpbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInNvdXJjZUZpbGVcIiwgc291cmNlRmlsZS5kYXRhLCBzb3VyY2VGaWxlLmZpbGVOYW1lID8gc291cmNlRmlsZS5maWxlTmFtZSA6IFwic291cmNlRmlsZVwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVJdGVtKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlSXRlbSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlSXRlbShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcHJpdmF0ZSBkZXNpZ24gZnJvbSBhIHB1YmxpYyBkZXNpZ24uXG4gICAgICogQHBhcmFtIGRlc2lnbklkIChvcHRpb25hbCkgUHVibGljIGRlc2lnbiBJRC5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZURlc2lnbklkIChvcHRpb25hbCkgUHJpdmF0ZSBkZXNpZ24gSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgSUQuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihkZXNpZ25JZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVEZXNpZ25JZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9wcml2YXRlLWRlc2lnbnMvZnJvbS1kZXNpZ24/XCI7XG4gICAgICAgIGlmIChkZXNpZ25JZCAhPT0gdW5kZWZpbmVkICYmIGRlc2lnbklkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnbklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVEZXNpZ25JZCAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVEZXNpZ25JZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlRGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVEZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZU93bmVyICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21EZXNpZ24oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcml2YXRlIGRlc2lnbiBmcm9tIGEgcHVibGljIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSByZXNvdXJjZUlkIChvcHRpb25hbCkgUmVzb3VyY2UgSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIElELlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIElELlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZShyZXNvdXJjZUlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZURlc2lnbklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3ByaXZhdGUtZGVzaWducy9mcm9tLXJlc291cmNlP1wiO1xuICAgICAgICBpZiAocmVzb3VyY2VJZCAhPT0gdW5kZWZpbmVkICYmIHJlc291cmNlSWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicmVzb3VyY2VJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVzb3VyY2VJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVEZXNpZ25JZCAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVEZXNpZ25JZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlRGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVEZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZU93bmVyICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkXG4gICAgKGRlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJykuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJEZXNpZ25QcmV2aWV3KGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25QcmV2aWV3TW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvcmVuZGVyLWRlc2lnbi1wcmV2aWV3P1wiO1xuICAgICAgICBpZiAoYXR0YWNobWVudCAhPT0gdW5kZWZpbmVkICYmIGF0dGFjaG1lbnQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiYXR0YWNobWVudD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYXR0YWNobWVudCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlckRlc2lnblByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJvb2Ygd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcm9vZiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByb29mKGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25Qcm9vZk1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3JlbmRlci1kZXNpZ24tcHJvb2Y/XCI7XG4gICAgICAgIGlmIChhdHRhY2htZW50ICE9PSB1bmRlZmluZWQgJiYgYXR0YWNobWVudCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIHByb2R1Y3QgcHJvb2YgaW1hZ2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBQcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyUHJvZHVjdChhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyUHJvZHVjdE1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3JlbmRlcmVyP1wiO1xuICAgICAgICBpZiAoYXR0YWNobWVudCAhPT0gdW5kZWZpbmVkICYmIGF0dGFjaG1lbnQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiYXR0YWNobWVudD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYXR0YWNobWVudCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlclByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJQcm9kdWN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNWaWV3ZXJBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjc3NGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBmb250cyhwc05hbWU6IHN0cmluZyB8IG51bGwsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KGZvbnRLZXk/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW1hZ2VTaXplKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFNoYXBlQm91bmRzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFdhdGVybWFya0l0ZW1zKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGltZyhmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0TGljZW5zZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcHRoKGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlc291cmNlKGltYWdlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHN2ZyhmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dChmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeUNvbG9yRGF0YSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBNdWx0aUNhbGxSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55Pjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25BdG9tc1ZpZXdlckFwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJRGVzaWduQXRvbXNWaWV3ZXJBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjc3NGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9jc3Nmb250cz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHN0cmluZz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHBzTmFtZTogc3RyaW5nIHwgbnVsbCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9mb250cy97cHNOYW1lfT9cIjtcbiAgICAgICAgaWYgKHBzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IHBzTmFtZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BzTmFtZScgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntwc05hbWV9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHNOYW1lKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRm9udHMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRm9udHMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZm9udEtleSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q3NzRm9udChmb250S2V5Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRDc3NGb250P1wiO1xuICAgICAgICBpZiAoZm9udEtleSAhPT0gdW5kZWZpbmVkICYmIGZvbnRLZXkgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZm9udEtleT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZm9udEtleSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q3NzRm9udCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENzc0ZvbnQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENzc0ZvbnQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW1hZ2VTaXplKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRJbWFnZVNpemU/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbWFnZVNpemUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TnVsbEFibGVTaXplPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxOdWxsQWJsZVNpemU+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFNoYXBlQm91bmRzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRTaGFwZUJvdW5kcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRTaGFwZUJvdW5kcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFNoYXBlQm91bmRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlY3RhbmdsZUY+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVjdGFuZ2xlRj4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFNoYXBlQm91bmRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxSZWN0YW5nbGVGPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxSZWN0YW5nbGVGPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxSZWN0YW5nbGVGPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRXYXRlcm1hcmtJdGVtcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFdhdGVybWFya0l0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGltZyhmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvaW1nP1wiO1xuICAgICAgICBpZiAoZiAhPT0gdW5kZWZpbmVkICYmIGYgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHcgIT09IHVuZGVmaW5lZCAmJiB3ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInc9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHcpICsgXCImXCI7XG4gICAgICAgIGlmIChoICE9PSB1bmRlZmluZWQgJiYgaCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayAhPT0gdW5kZWZpbmVkICYmIGNteWsgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY215az1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY215aykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJnYiAhPT0gdW5kZWZpbmVkICYmIHJnYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJyZ2I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJnYikgKyBcIiZcIjtcbiAgICAgICAgaWYgKGdyYXlzY2FsZSAhPT0gdW5kZWZpbmVkICYmIGdyYXlzY2FsZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJncmF5c2NhbGU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGdyYXlzY2FsZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YXJnZXQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRhcmdldCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNxICE9PSB1bmRlZmluZWQgJiYgc3EgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgIT09IHVuZGVmaW5lZCAmJiBrcCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJrcD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsga3ApICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvciAhPT0gdW5kZWZpbmVkICYmIGNvbG9yICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImNvbG9yPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9ibSAhPT0gdW5kZWZpbmVkICYmIG9ibSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvYm09XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9ibSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9vICE9PSB1bmRlZmluZWQgJiYgb28gIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrICE9PSB1bmRlZmluZWQgJiYgYWxwaGFNYXNrICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicGFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcGFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yaXplQ29sb3IgIT09IHVuZGVmaW5lZCAmJiBjb2xvcml6ZUNvbG9yICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImNvbG9yaXplQ29sb3I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNvbG9yaXplQ29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSW1nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0TGljZW5zZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL2xpY2Vuc2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldExpY2Vuc2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRMaWNlbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdGgoZj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvcHRoP1wiO1xuICAgICAgICBpZiAoZiAhPT0gdW5kZWZpbmVkICYmIGYgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NQdGgocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZShpbWFnZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmIChpbWFnZSAhPT0gdW5kZWZpbmVkICYmIGltYWdlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImltYWdlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpbWFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL3N2Zz9cIjtcbiAgICAgICAgaWYgKGYgIT09IHVuZGVmaW5lZCAmJiBmICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU3ZnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB0eHQoZj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvdHh0P1wiO1xuICAgICAgICBpZiAoZiAhPT0gdW5kZWZpbmVkICYmIGYgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NUeHQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXI/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXI/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlQ29sb3JzUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVCeUNvbG9yRGF0YT9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeUNvbG9yRGF0YSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCeUNvbG9yRGF0YShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHN0cmluZz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3Q/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUltYWdlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXI/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1EZXRhaWxzIHtcbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICBkZXRhaWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGluc3RhbmNlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgc2VydmljZSAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEluZm9Nb2RlbCB7XG4gICAgLyoqIFZlcnNpb24gbnVtYmVyICovXG4gICAgdmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEJ1aWxkIGRhdGUgKFVUQykgKi9cbiAgICBidWlsZERhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIChEZWJ1ZyB8IFJlbGVhc2UpICovXG4gICAgY29uZmlndXJhdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFNlcnZpY2UgbmFtZSAqL1xuICAgIGFwcE5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvbnRzTWV0aG9kRGF0YSB7XG4gICAgcmVxdWVzdGVkRm9udHNCeVBzTmFtZT86IHN0cmluZ1tdIHwgbnVsbDtcbiAgICBhZHZhbmNlZE1vZGU/OiBib29sZWFuO1xuICAgIGJhc2VVcmw/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEltYWdlU2l6ZVJlcXVlc3Qge1xuICAgIGltYWdlSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIHBhZ2VJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOdWxsQWJsZVNpemUge1xuICAgIHdpZHRoPzogbnVtYmVyIHwgbnVsbDtcbiAgICBoZWlnaHQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFNoYXBlQm91bmRzUmVxdWVzdCB7XG4gICAgcGF0aD86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnRGIHtcbiAgICByZWFkb25seSBpc0VtcHR5PzogYm9vbGVhbjtcbiAgICB4PzogbnVtYmVyO1xuICAgIHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdGFuZ2xlRiB7XG4gICAgbG9jYXRpb24/OiBQb2ludEY7XG4gICAgc2l6ZT86IHN0cmluZztcbiAgICB4PzogbnVtYmVyO1xuICAgIHk/OiBudW1iZXI7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGxlZnQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgdG9wPzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHJpZ2h0PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGJvdHRvbT86IG51bWJlcjtcbiAgICByZWFkb25seSBpc0VtcHR5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVIYW5kbGVyUmVxdWVzdCB7XG4gICAgY2FudmFzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbUhhbmRsZXJEYXRhPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpdGVtRGF0YT86IGFueSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ29sb3JzUmVxdWVzdCB7XG4gICAgY2FudmFzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgY29sb3JEYXRhPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aUNhbGxSZXF1ZXN0SXRlbSB7XG4gICAgY2FudmFzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbUhhbmRsZXJzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgY29sb3JEYXRhPzogc3RyaW5nIHwgbnVsbDtcbiAgICBhY3R1YWxTaXplPzogYm9vbGVhbiB8IG51bGw7XG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbz86IGJvb2xlYW4gfCBudWxsO1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG4gICAgaW1hZ2VJZD86IHN0cmluZyB8IG51bGw7XG4gICAgcGFnZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICBtZXRob2ROYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpdGVtRGF0YT86IGFueSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlDYWxsUmVxdWVzdCB7XG4gICAgaXRlbXM/OiBNdWx0aUNhbGxSZXF1ZXN0SXRlbVtdIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbWFnZUhhbmRsZXJSZXF1ZXN0IHtcbiAgICBhY3R1YWxTaXplPzogYm9vbGVhbjtcbiAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPzogYm9vbGVhbjtcbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1IYW5kbGVyRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbURhdGE/OiBhbnkgfCBudWxsO1xufVxuXG4vKiogUHJvZHVjdCBwcmV2aWV3IGZpbGUgZm9ybWF0LiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFByZXZpZXdGb3JtYXQge1xuICAgIEpwZWcgPSBcIkpwZWdcIixcbiAgICBQbmcgPSBcIlBuZ1wiLFxuICAgIFRpZmYgPSBcIlRpZmZcIixcbiAgICBQZGYgPSBcIlBkZlwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckltYWdlUHJldmlld01vZGVsIHtcbiAgICAvKiogRXh0ZXJuYWwgaW1hZ2UgVVJMLiAqL1xuICAgIGltYWdlVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSGVpZ2h0IG9mIHByZXZpZXcgaW1hZ2UuICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBXaWR0aCBvZiBwcmV2aWV3IGltYWdlLiAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKiBPdXRwdXQgaW1hZ2UgZm9ybWF0LiBQTkcgYnkgZGVmYXVsdC4gKi9cbiAgICBmaWxlRm9ybWF0PzogUHJvZHVjdFByZXZpZXdGb3JtYXQgfCBudWxsO1xufVxuXG4vKiogQ29udmVydCBjb2xvcnMgb3BlcmF0aW9uIHBhcmFtZXRlcnMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydENvbG9yc01vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBjb2xvciBkZXNjcmlwdGlvbiAqL1xuICAgIGNvbG9yczogYW55W107XG4gICAgLyoqIFNvdXJjZSBjb2xvciBwcm9maWxlIGRlc2NyaXB0aW9uICovXG4gICAgc291cmNlQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRGVzdGluYXRpb24gY29sb3IgcHJvZmlsZSBkZXNjcmlwdGlvbiAqL1xuICAgIGRlc3RpbmF0aW9uQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGFyZ2VudCBjb2xvciBwcm9maWxlIGRlc2NyaXB0aW9uICovXG4gICAgdGFyZ2V0RGV2aWNlQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIERlc2lnbiBjcmVhdGlvbiBwYXJhbWV0ZXJzICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZURlc2lnbk1vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBwcm9kdWN0IGRlc2NyaXB0aW9uICovXG4gICAgcHJvZHVjdD86IGFueSB8IG51bGw7XG4gICAgLyoqIFNlcmlhbGl6ZWQgcHJvZHVjdCBkYXRhIHNjaGVtYSAoYmFzZTY0IGZpbGUgc3RyZWFtKSAqL1xuICAgIGRhdGFTY2hlbWE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gbmFtZSAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gbG9jYXRpb24gKGZvbGRlciBwYXRoKSAqL1xuICAgIHBhdGg/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2lnbkluZm8ge1xuICAgIGlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGVudW0gRGVzaWduRWxlbWVudFR5cGUge1xuICAgIFByb2R1Y3QgPSBcIlByb2R1Y3RcIixcbiAgICBEZXNpZ24gPSBcIkRlc2lnblwiLFxuICAgIFN1cmZhY2UgPSBcIlN1cmZhY2VcIixcbiAgICBDb250YWluZXIgPSBcIkNvbnRhaW5lclwiLFxuICAgIFByaW50QXJlYSA9IFwiUHJpbnRBcmVhXCIsXG4gICAgSXRlbSA9IFwiSXRlbVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pc3NpbmdEZXNpZ25FbGVtZW50RHRvIHtcbiAgICAvKiogUHJvYmxlbSBkZXNjcmlwdGlvbi4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1pc3NpbmcgZWxlbWVudCB0eXBlLiAqL1xuICAgIHJlYWRvbmx5IG1pc3NpbmdFbGVtZW50VHlwZT86IERlc2lnbkVsZW1lbnRUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVucHJvY2Vzc2FibGVEZXNpZ25FbGVtZW50RHRvIHtcbiAgICAvKiogUHJvYmxlbSBkZXNjcmlwdGlvbi4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1pc3NpbmcgZWxlbWVudCB0eXBlLiAqL1xuICAgIHJlYWRvbmx5IG1pc3NpbmdFbGVtZW50VHlwZT86IERlc2lnbkVsZW1lbnRUeXBlO1xufVxuXG4vKiogQXZhaWxhYmxlIHBhdGNoIHR5cGUuICovXG5leHBvcnQgZW51bSBQcm9kdWN0UGF0Y2hUeXBlIHtcbiAgICBVbmRlZmluZWQgPSBcIlVuZGVmaW5lZFwiLFxuICAgIFJlcGxhY2VJbWFnZUl0ZW1GaWxlID0gXCJSZXBsYWNlSW1hZ2VJdGVtRmlsZVwiLFxuICAgIFJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50ID0gXCJSZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudFwiLFxufVxuXG4vKiogUGxhY2Vob2xkZXIgaXRlbSBjb250ZW50IHR5cGUuICovXG5leHBvcnQgZW51bSBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB7XG4gICAgSW1hZ2UgPSBcIkltYWdlXCIsXG59XG5cbi8qKiBWYXJpYWJsZSBpbmZvcm1hdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVJbmZvIHtcbiAgICAvKiogVmFyaWFibGUgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgdmFsdWUuICovXG4gICAgdmFsdWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBWYXJpYWJsZSB0eXBlLiAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogVmFyaWFibGVzIGluZm9ybWF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlc01vZGVsIHtcbiAgICAvKiogTGlzdCBvZiB2YXJpYWJsZXMgKi9cbiAgICBpdGVtcz86IFZhcmlhYmxlSW5mb1tdIHwgbnVsbDtcbn1cblxuLyoqIFZhcmlhYmxlIGRhdGEgcHJpbnRpbmcgaW5mb3JtYXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmRwRGF0YU1vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCB2ZHAgZGF0YXNldCAqL1xuICAgIHZkcERhdGFTZXQ/OiBhbnkgfCBudWxsO1xuICAgIC8qKiBTZXJpYWxpemVkIHZkcCBpdGVtcyBkYXRhICovXG4gICAgdmRwSXRlbXNEYXRhPzogYW55IHwgbnVsbDtcbn1cblxuZXhwb3J0IGVudW0gSXRlbVR5cGUge1xuICAgIEltYWdlID0gXCJJbWFnZVwiLFxuICAgIFNoYXBlID0gXCJTaGFwZVwiLFxuICAgIENsaXBhcnQgPSBcIkNsaXBhcnRcIixcbiAgICBHcm91cCA9IFwiR3JvdXBcIixcbn1cblxuLyoqIEl0ZW0gc291Y2UgdHlwZXMgKi9cbmV4cG9ydCBlbnVtIEl0ZW1Tb3VyY2VUeXBlIHtcbiAgICBGaWxlID0gXCJGaWxlXCIsXG4gICAgSW1hZ2VTdG9yYWdlID0gXCJJbWFnZVN0b3JhZ2VcIixcbiAgICBQcml2YXRlSW1hZ2VTdG9yYWdlID0gXCJQcml2YXRlSW1hZ2VTdG9yYWdlXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFByZXZpZXdSZW5kZXJpbmdDb25maWcge1xuICAgIHN1cmZhY2VJbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIGZpbGVGb3JtYXQ/OiBQcm9kdWN0UHJldmlld0Zvcm1hdCB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyRGVzaWduUHJldmlld01vZGVsIHtcbiAgICAvKiogRGVzaWduIElELlxuVXNlZCB0byBnZXQgZGVzaWduIGZpbGUgZnJvbSBwdWJsaWMgb3IgcHJpdmF0ZSBzdG9yYWdlLiAqL1xuICAgIGRlc2lnbklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIElELlxuVXNlZCB0byBnZXQgbW9ja3VwIGZpbGUgZnJvbSBwdWJsaWMgc3RvcmFnZS4gKi9cbiAgICBtb2NrdXBJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElEIG9mIHRoZSBkZXNpZ24gb3duZXIuICovXG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJldmlldyBvZiBkZXNpZ24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogUHJvZHVjdFByZXZpZXdSZW5kZXJpbmdDb25maWcgfCBudWxsO1xuICAgIC8qKiBWYXJpYWJsZSAodXNlcikgZGF0YSBmb3IgZGVzaWduIHZhcmlhYmxlIGZpZWxkcyBpbiB0aGUgcHJldmlldyBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbmV4cG9ydCBlbnVtIFByb2R1Y3RQcm9vZkZvcm1hdCB7XG4gICAgSnBlZyA9IFwiSnBlZ1wiLFxuICAgIFBuZyA9IFwiUG5nXCIsXG4gICAgVGlmZiA9IFwiVGlmZlwiLFxuICAgIFBkZiA9IFwiUGRmXCIsXG59XG5cbmV4cG9ydCBlbnVtIFByb2R1Y3RQcm9vZkludGVycG9sYXRpb25Nb2RlIHtcbiAgICBIaWdoID0gXCJIaWdoXCIsXG4gICAgTWVkaXVtID0gXCJNZWRpdW1cIixcbiAgICBMb3cgPSBcIkxvd1wiLFxuICAgIE5lYXJlc3ROZWlnaGJvdXIgPSBcIk5lYXJlc3ROZWlnaGJvdXJcIixcbiAgICBMaW5lYXIgPSBcIkxpbmVhclwiLFxuICAgIEN1YmljID0gXCJDdWJpY1wiLFxuICAgIFN1cGVyc2FtcGxpbmcgPSBcIlN1cGVyc2FtcGxpbmdcIixcbiAgICBMYW5jem9zID0gXCJMYW5jem9zXCIsXG4gICAgQW5pc290cm9waWM0ID0gXCJBbmlzb3Ryb3BpYzRcIixcbiAgICBBbmlzb3Ryb3BpYzkgPSBcIkFuaXNvdHJvcGljOVwiLFxuICAgIExhbmN6b3MzID0gXCJMYW5jem9zM1wiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB7XG4gICAgLyoqIFN1cmZhY2UgdG8gcmVuZGVyICovXG4gICAgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSB3aWR0aCAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGhlaWdodCAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSBmb3JtYXQgKi9cbiAgICBmb3JtYXQ/OiBQcm9kdWN0UHJvb2ZGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGludGVycG9sYXRpb24gKi9cbiAgICBpbnRlcnBvbGF0aW9uTW9kZT86IFByb2R1Y3RQcm9vZkludGVycG9sYXRpb25Nb2RlIHwgbnVsbDtcbiAgICAvKiogRGVmaW5lcyB3aGV0aGVyIHNhZmV0eSBsaW5lcyBzaG91bGQgYmUgdmlzdWFsaXplZCAqL1xuICAgIHNhZmV0eUxpbmVzRW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKiBEZWZpbmVzIHdoZXRoZXIgd2F0ZXJtYXJrIHNob3VsZCBiZSBpbmNsdWRlZCAqL1xuICAgIHdhdGVybWFya0VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKiogRGVmaW5lcyB3YXRlcm1hcmsgb3BhY2l0eSAoaW4gcmFuZ2UgMCAuLiAxLjApICovXG4gICAgd2F0ZXJtYXJrT3BhY2l0eT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIERlZmluZXMgd2hldGhlciB3YXRlcm1hcmsgc2hvdWxkIGJlIHJlcGVhdGVkICovXG4gICAgd2F0ZXJtYXJrUmVwZWF0PzogYm9vbGVhbiB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyRGVzaWduUHJvb2ZNb2RlbCB7XG4gICAgLyoqIERlc2lnbiBJRC5cblVzZWQgdG8gZ2V0IGRlc2lnbiBmaWxlIGZyb20gcHVibGljIG9yIHByaXZhdGUgc3RvcmFnZS4gKi9cbiAgICBkZXNpZ25JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElEIG9mIHRoZSBkZXNpZ24gb3duZXIuICovXG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJvb2YgaW1hZ2Ugb2YgZGVzaWduLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG4gICAgLyoqIFZhcmlhYmxlICh1c2VyKSBkYXRhIGZvciBkZXNpZ24gdmFyaWFibGUgZmllbGRzIGluIHRoZSBwcm9vZiBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbi8qKiBSZW5kZXIgcHJvZHVjdCBwYXJhbWV0ZXJzICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclByb2R1Y3RNb2RlbCB7XG4gICAgLyoqIFNlcmlhbGl6ZWQgcHJvZHVjdCBkZXNjcmlwdGlvbiAqL1xuICAgIHByb2R1Y3Q6IGFueTtcbiAgICAvKiogUHJvb2YgSW1hZ2UgcmVuZGVyaW5nIGNvbmZpZyAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhcmFtZXRlciB7XG4gICAgZGF0YTogYW55O1xuICAgIGZpbGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlc3BvbnNlIHtcbiAgICBkYXRhOiBCbG9iO1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIGZpbGVOYW1lPzogc3RyaW5nO1xuICAgIGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgcmVzcG9uc2U6IHN0cmluZztcbiAgICBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcbiAgICByZXN1bHQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ6IGFueSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0FwaUV4Y2VwdGlvbiA9IHRydWU7XG5cbiAgICBzdGF0aWMgaXNBcGlFeGNlcHRpb24ob2JqOiBhbnkpOiBvYmogaXMgQXBpRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG9iai5pc0FwaUV4Y2VwdGlvbiA9PT0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3VsdCk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhuZXcgQXBpRXhjZXB0aW9uKG1lc3NhZ2UsIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnMsIG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvVGV4dChibG9iOiBhbnkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmICghYmxvYikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcIlwiKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgoPGFueT5ldmVudC50YXJnZXQpLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChibG9iKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSJdfQ==
|
|
5576
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLWF0b21zLWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvYXVyaWdtYS9hZ2VudHMvMDEvX3dvcmsvMTQ1L3MvQXVyaWdtYS5EZXNpZ25BdG9tc0FwaS5UeXBlU2NyaXB0QXBpQ2xpZW50L0FuZ3VsYXIvYXBpLWNsaWVudC9wcm9qZWN0cy9jbGllbnQvc3JjLyIsInNvdXJjZXMiOlsibGliL2Rlc2lnbi1hdG9tcy1hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4QixtQkFBbUI7QUFDbkIsNEhBQTRIO0FBQzVILG9CQUFvQjtBQUNwQix3QkFBd0I7QUFDeEIsdUNBQXVDO0FBRXZDLE9BQU8sRUFBRSxRQUFRLElBQUksbUJBQW1CLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakcsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLElBQUksZUFBZSxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUUvRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQVMsY0FBYyxDQUFDLENBQUM7QUFFdkUsTUFBTSxPQUFPLHNCQUFzQjtJQUFuQztRQUNJLFdBQU0sR0FBVyx3QkFBd0IsQ0FBQztRQUMxQyxXQUFNLEdBQVcsUUFBUSxDQUFDO1FBQ2xCLHVCQUFrQixHQUFXLElBQUksQ0FBQztJQUc5QyxDQUFDO0lBRlMscUJBQXFCOzhEQUFzQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7S0FBQTtJQUFBLENBQUM7SUFDbkYscUJBQXFCLENBQUMsS0FBYSxJQUFVLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQUEsQ0FBQztDQUNuRjtBQUVELE1BQU0sT0FBTyxhQUFhO0lBQ3RCLFlBQW9CLGFBQXFDO1FBQXJDLGtCQUFhLEdBQWIsYUFBYSxDQUF3QjtJQUFJLENBQUM7SUFFOUMsZ0JBQWdCLENBQUMsT0FBWTs7WUFDekMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNqQixPQUFPLENBQUMsT0FBTyxHQUFJLE9BQU8sQ0FBQyxPQUF1QixDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO2FBQy9GO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxPQUFPLEdBQUksT0FBTyxDQUFDLE9BQXVCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25HO1lBQ0Qsa0ZBQWtGO1lBQ2xGLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUM7S0FBQTtJQUVTLFVBQVUsQ0FBQyxTQUFpQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFUyxlQUFlLENBQUMsR0FBVyxFQUFFLEdBQXFCLEVBQUUsRUFBOEM7UUFDMUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBa0JELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxhQUFhO0lBS2pELFlBQTRDLGFBQXFDLEVBQXNCLElBQWdCLEVBQW9DLE9BQWdCO1FBQ3ZLLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUhmLHFCQUFnQixHQUFtRCxTQUFTLENBQUM7UUFJbkYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUTtRQUNKLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLENBQUM7UUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUN4QixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQThCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRDthQUNKOztnQkFDRyxPQUE4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGVBQWUsQ0FBQyxRQUEwQjtRQUNoRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDSCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG9CQUFvQixDQUFDO1FBQy9DLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUF3QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0Q7YUFDSjs7Z0JBQ0csT0FBd0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxjQUFjLENBQUMsUUFBMEI7UUFDL0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBc0IsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQzs7OztZQS9ISixVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7OztZQU04RCxzQkFBc0IsdUJBQXBFLE1BQU0sU0FBQyxzQkFBc0I7WUF4RHJDLFVBQVUsdUJBd0RxRSxNQUFNLFNBQUMsVUFBVTt5Q0FBcUIsUUFBUSxZQUFJLE1BQU0sU0FBQyxZQUFZOztBQWdRN0osTUFBTSxPQUFPLGlDQUFrQyxTQUFRLGFBQWE7SUFLaEUsWUFBNEMsYUFBcUMsRUFBc0IsSUFBZ0IsRUFBb0MsT0FBZ0I7UUFDdkssS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBSGYscUJBQWdCLEdBQW1ELFNBQVMsQ0FBQztRQUluRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsUUFBZ0IsRUFBRSxJQUF5QztRQUNoRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHdEQUF3RCxDQUFDO1FBQ25GLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsUUFBZ0IsRUFBRSxNQUFxQjtRQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLDhEQUE4RCxDQUFDO1FBQ3pGLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDL0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSwwQkFBMEI7YUFDdkMsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxZQUFZLENBQUMsUUFBMEI7UUFDN0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsUUFBZ0IsRUFBRSxPQUFtQztRQUM1RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLDJEQUEyRCxDQUFDO1FBQ3RGLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSTtZQUN6QyxJQUFJLElBQUksVUFBVSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxRQUEwQjtRQUNsRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxRQUFnQixFQUFFLElBQTZDO1FBQ3hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNERBQTRELENBQUM7UUFDdkYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFFBQWdCLEVBQUUsSUFBK0M7UUFDNUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw4REFBOEQsQ0FBQztRQUN6RixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFvQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0Q7YUFDSjs7Z0JBQ0csT0FBb0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxRQUEwQjtRQUN0RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLElBQTZCO1FBQzdELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsaUVBQWlFLENBQUM7UUFDNUYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsd0JBQXdCLENBQUMsUUFBMEI7UUFDekQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0gsR0FBRyxDQUFDLFFBQWdCLEVBQUUsQ0FBNkIsRUFBRSxDQUE2QixFQUFFLENBQTZCLEVBQUUsSUFBZ0MsRUFBRSxHQUErQixFQUFFLFNBQXFDLEVBQUUsTUFBa0MsRUFBRSxFQUErQixFQUFFLE1BQWtDLEVBQUUsRUFBK0IsRUFBRSxLQUFpQyxFQUFFLEdBQStCLEVBQUUsRUFBOEIsRUFBRSxTQUFzQyxFQUFFLElBQWdDLEVBQUUsYUFBeUM7UUFDMWpCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0RBQW9ELENBQUM7UUFDL0UsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUk7WUFDN0IsSUFBSSxJQUFJLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJO1lBQ25DLElBQUksSUFBSSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUk7WUFDakMsSUFBSSxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hELElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSTtZQUM3QyxJQUFJLElBQUksWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEUsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQ3ZDLElBQUksSUFBSSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUN2QyxJQUFJLElBQUksU0FBUyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7WUFDckMsSUFBSSxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUNqQyxJQUFJLElBQUksTUFBTSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUk7WUFDN0MsSUFBSSxJQUFJLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUNuQyxJQUFJLElBQUksT0FBTyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUQsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxJQUFJO1lBQ3JELElBQUksSUFBSSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxVQUFVLENBQUMsUUFBMEI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxRQUFnQjtRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVEQUF1RCxDQUFDO1FBQ2xGLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsaUJBQWlCLENBQUMsUUFBMEI7UUFDbEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNuRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFjLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsUUFBZ0IsRUFBRSxDQUE2QjtRQUMvQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG9EQUFvRCxDQUFDO1FBQy9FLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLFVBQVUsQ0FBQyxRQUEwQjtRQUMzQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxRQUFnQixFQUFFLEtBQWlDO1FBQ3hELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcseURBQXlELENBQUM7UUFDcEYsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1RCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLFFBQWdCLEVBQUUsQ0FBNkI7UUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxvREFBb0QsQ0FBQztRQUMvRSxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUk7WUFDN0IsSUFBSSxJQUFJLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxVQUFVLENBQUMsUUFBMEI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsUUFBZ0IsRUFBRSxDQUE2QjtRQUMvQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG9EQUFvRCxDQUFDO1FBQy9FLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLFVBQVUsQ0FBQyxRQUEwQjtRQUMzQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDeEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywyRUFBMkUsQ0FBQztRQUN0RyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILCtCQUErQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDNUYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywrRUFBK0UsQ0FBQztRQUMxRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM1RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxzQ0FBc0MsQ0FBQyxRQUEwQjtRQUN2RSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDckYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3RUFBd0UsQ0FBQztRQUNuRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUywrQkFBK0IsQ0FBQyxRQUEwQjtRQUNoRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILDRCQUE0QixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDekYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw0RUFBNEUsQ0FBQztRQUN2RyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQ0FBbUMsQ0FBQyxRQUEwQjtRQUNwRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsSUFBNkM7UUFDN0UsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxpRUFBaUUsQ0FBQztRQUM1RixJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFnQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdkQ7YUFDSjs7Z0JBQ0csT0FBZ0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ25HLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQWMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLFFBQWdCLEVBQUUsSUFBMEM7UUFDakYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3RUFBd0UsQ0FBQztRQUNuRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUywrQkFBK0IsQ0FBQyxRQUEwQjtRQUNoRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDeEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywyRUFBMkUsQ0FBQztRQUN0RyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsSUFBbUQ7UUFDeEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzRUFBc0UsQ0FBQztRQUNqRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNuRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyw2QkFBNkIsQ0FBQyxRQUEwQjtRQUM5RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdDQUFnQyxDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDN0YsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxnRkFBZ0YsQ0FBQztRQUMzRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx1Q0FBdUMsQ0FBQyxRQUEwQjtRQUN4RSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILDBCQUEwQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDdkYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywwRUFBMEUsQ0FBQztRQUNyRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxpQ0FBaUMsQ0FBQyxRQUEwQjtRQUNsRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsSUFBOEM7UUFDbkYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzRUFBc0UsQ0FBQztRQUNqRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNuRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyw2QkFBNkIsQ0FBQyxRQUEwQjtRQUM5RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQzs7OztZQXZrREosVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7WUFNOEQsc0JBQXNCLHVCQUFwRSxNQUFNLFNBQUMsc0JBQXNCO1lBN1RyQyxVQUFVLHVCQTZUcUUsTUFBTSxTQUFDLFVBQVU7eUNBQXFCLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTs7QUFpbEQ3SixNQUFNLE9BQU8sMEJBQTJCLFNBQVEsYUFBYTtJQUt6RCxZQUE0QyxhQUFxQyxFQUFzQixJQUFnQixFQUFvQyxPQUFnQjtRQUN2SyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFIZixxQkFBZ0IsR0FBbUQsU0FBUyxDQUFDO1FBSW5GLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxrQkFBa0IsQ0FBQyxVQUF1QyxFQUFFLFFBQTZCLEVBQUUsSUFBaUQ7UUFDeEksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw0Q0FBNEMsQ0FBQztRQUN2RSxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLElBQUk7WUFDL0MsSUFBSSxJQUFJLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQy9GO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHlCQUF5QixDQUFDLFFBQTBCO1FBQzFELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQzs7OztZQTVGSixVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7OztZQU04RCxzQkFBc0IsdUJBQXBFLE1BQU0sU0FBQyxzQkFBc0I7WUFuNURyQyxVQUFVLHVCQW01RHFFLE1BQU0sU0FBQyxVQUFVO3lDQUFxQixRQUFRLFlBQUksTUFBTSxTQUFDLFlBQVk7O0FBOFE3SixNQUFNLE9BQU8sMkJBQTRCLFNBQVEsYUFBYTtJQUsxRCxZQUE0QyxhQUFxQyxFQUFzQixJQUFnQixFQUFvQyxPQUFnQjtRQUN2SyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFIZixxQkFBZ0IsR0FBbUQsU0FBUyxDQUFDO1FBSW5GLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLFFBQTZCLEVBQUUsSUFBNEM7UUFDckYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywrQkFBK0IsQ0FBQztRQUMxRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxRQUEwQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksQ0FBQyxjQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCLEVBQUUsSUFBMkM7UUFDakwsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztRQUNuRCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQW9DLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRDthQUNKOztnQkFDRyxPQUFvQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLG1CQUFtQixDQUFDLFFBQTBCO1FBQ3BELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBa0IsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxpQkFBaUIsQ0FBQyxFQUFpQixFQUFFLFlBQXdDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkI7UUFDekosSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3Q0FBd0MsQ0FBQztRQUNuRSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUk7WUFDbkQsSUFBSSxJQUFJLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFFLElBQUksbUJBQW1CLEtBQUssU0FBUyxJQUFJLG1CQUFtQixLQUFLLElBQUk7WUFDakUsSUFBSSxJQUFJLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzlGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHdCQUF3QixDQUFDLFFBQTBCO1FBQ3pELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3BILE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFnQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDMUgsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsV0FBVyxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QjtRQUN0SixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG1DQUFtQyxDQUFDO1FBQzlELElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxRQUEwQjtRQUNuRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxXQUFXLENBQUMsRUFBaUIsRUFBRSxjQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCLEVBQUUsSUFBNkI7UUFDckwsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQ0FBbUMsQ0FBQztRQUM5RCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2FBQ3JDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQThCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRDthQUNKOztnQkFDRyxPQUE4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGtCQUFrQixDQUFDLFFBQTBCO1FBQ25ELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsWUFBWSxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QixFQUFFLFNBQXdDLEVBQUUsaUNBQTZELEVBQUUsbUNBQXNFLEVBQUUscURBQWlGLEVBQUUsZ0RBQXlGLEVBQUUsNENBQStFO1FBQ3ZrQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLG1DQUFtQyxDQUFDO1FBQzlELElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQzs7WUFFN0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxpQ0FBaUMsS0FBSyxJQUFJLElBQUksaUNBQWlDLEtBQUssU0FBUztZQUM3RixRQUFRLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxFQUFFLGlDQUFpQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkcsSUFBSSxtQ0FBbUMsS0FBSyxJQUFJLElBQUksbUNBQW1DLEtBQUssU0FBUztZQUNqRyxRQUFRLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxFQUFFLG1DQUFtQyxDQUFDLElBQUksRUFBRSxtQ0FBbUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMxTyxJQUFJLHFEQUFxRCxLQUFLLElBQUksSUFBSSxxREFBcUQsS0FBSyxTQUFTO1lBQ3JJLFFBQVEsQ0FBQyxNQUFNLENBQUMsdURBQXVELEVBQUUscURBQXFELENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvSSxJQUFJLGdEQUFnRCxLQUFLLElBQUksSUFBSSxnREFBZ0QsS0FBSyxTQUFTO1lBQzNILE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLENBQUMsQ0FBQzs7WUFFcEcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxrREFBa0QsRUFBRSxnREFBZ0QsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JJLElBQUksNENBQTRDLEtBQUssSUFBSSxJQUFJLDRDQUE0QyxLQUFLLFNBQVM7WUFDbkgsUUFBUSxDQUFDLE1BQU0sQ0FBQyw4Q0FBOEMsRUFBRSw0Q0FBNEMsQ0FBQyxJQUFJLEVBQUUsNENBQTRDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyw0Q0FBNEMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFFdlIsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQUMsRUFBaUIsRUFBRSxjQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCO1FBQ3pKLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0NBQW9DLENBQUM7UUFDL0QsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsS0FBSyxJQUFJO1lBQ3ZELElBQUksSUFBSSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzlFLElBQUksbUJBQW1CLEtBQUssU0FBUyxJQUFJLG1CQUFtQixLQUFLLElBQUk7WUFDakUsSUFBSSxJQUFJLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHFCQUFxQixDQUFDLFFBQTBCO1FBQ3RELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QjtRQUN2SixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVDQUF1QyxDQUFDO1FBQ2xFLElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksUUFBUSxHQUFTO1lBQ2pCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUF3QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0Q7YUFDSjs7Z0JBQ0csT0FBd0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxRQUEwQjtRQUNwRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQXNCLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFlBQVksQ0FBQyxFQUFpQixFQUFFLGNBQTJDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkIsRUFBRSxJQUF3QztRQUNqTSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLHVDQUF1QyxDQUFDO1FBQ2xFLElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN2RCxJQUFJLElBQUksaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxJQUFJO1lBQ2pFLElBQUksSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7YUFDckMsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxFQUFpQixFQUFFLGNBQTJDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkI7UUFDdEosSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxQ0FBcUMsQ0FBQztRQUNoRSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDeEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsa0JBQWtCLENBQUMsUUFBMEI7UUFDbkQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBb0IsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsV0FBVyxDQUFDLEVBQWlCLEVBQUUsY0FBMkMsRUFBRSxtQkFBK0MsRUFBRSxRQUE2QixFQUFFLElBQXNDO1FBQzlMLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcscUNBQXFDLENBQUM7UUFDaEUsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsS0FBSyxJQUFJO1lBQ3ZELElBQUksSUFBSSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzlFLElBQUksbUJBQW1CLEtBQUssU0FBUyxJQUFJLG1CQUFtQixLQUFLLElBQUk7WUFDakUsSUFBSSxJQUFJLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjthQUNyQyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE4QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckQ7YUFDSjs7Z0JBQ0csT0FBOEIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxRQUEwQjtRQUNuRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGFBQWEsQ0FBQyxFQUFpQixFQUFFLGNBQTJDLEVBQUUsbUJBQStDLEVBQUUsUUFBNkI7UUFDeEosSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxQ0FBcUMsQ0FBQztRQUNoRSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLElBQUk7WUFDdkQsSUFBSSxJQUFJLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDMUY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsb0JBQW9CLENBQUMsUUFBMEI7UUFDckQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVksSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLFFBQTZCLEVBQUUsSUFBK0I7UUFDdkUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztRQUNuRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxRQUEwQjtRQUNwRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILFVBQVUsQ0FBQyxRQUFzQyxFQUFFLFFBQTZCLEVBQUUsVUFBOEMsRUFBRSxRQUFvQyxFQUFFLGFBQXlDLEVBQUUsVUFBNkM7UUFDNVAsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUk7WUFDM0MsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUztZQUMvQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0MsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsS0FBSyxTQUFTO1lBQ3JELFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUztZQUMvQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTdHLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQTBCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsNkJBQTZCLENBQUMsUUFBb0MsRUFBRSxlQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCO1FBQzNMLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNENBQTRDLENBQUM7UUFDdkUsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQzNDLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLElBQUk7WUFDekQsSUFBSSxJQUFJLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEYsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDMUc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsb0NBQW9DLENBQUMsUUFBMEI7UUFDckUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsK0JBQStCLENBQUMsVUFBc0MsRUFBRSxlQUEyQyxFQUFFLG1CQUErQyxFQUFFLFFBQTZCO1FBQy9MLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsOENBQThDLENBQUM7UUFDekUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLElBQUk7WUFDekQsSUFBSSxJQUFJLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEYsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUNqRSxJQUFJLElBQUksc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFDeEIsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBOEIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2FBQ0o7O2dCQUNHLE9BQThCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsc0NBQXNDLENBQUMsUUFBMEI7UUFDdkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGFBQWEsQ0FBWSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFZLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLENBQUMsVUFBdUMsRUFBRSxRQUE2QixFQUFFLElBQWtEO1FBQzFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUM7UUFDakUsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLDBCQUEwQjthQUN2QyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUywwQkFBMEIsQ0FBQyxRQUEwQjtRQUMzRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLENBQUMsVUFBdUMsRUFBRSxRQUE2QixFQUFFLElBQWdEO1FBQ3RJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0NBQW9DLENBQUM7UUFDL0QsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLDBCQUEwQjthQUN2QyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsVUFBdUMsRUFBRSxRQUE2QixFQUFFLElBQTRDO1FBQzlILElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcseUJBQXlCLENBQUM7UUFDcEQsSUFBSSxVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxJQUFJO1lBQy9DLElBQUksSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLDBCQUEwQjthQUN2QyxDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxRQUEwQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlHLE1BQU0sUUFBUSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUYsT0FBTyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBTyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RzthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7WUF6b0RKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7O1lBTThELHNCQUFzQix1QkFBcEUsTUFBTSxTQUFDLHNCQUFzQjtZQXRxRXJDLFVBQVUsdUJBc3FFcUUsTUFBTSxTQUFDLFVBQVU7eUNBQXFCLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTs7QUFpeUQ3SixNQUFNLE9BQU8sMEJBQTJCLFNBQVEsYUFBYTtJQUt6RCxZQUE0QyxhQUFxQyxFQUFzQixJQUFnQixFQUFvQyxPQUFnQjtRQUN2SyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFIZixxQkFBZ0IsR0FBbUQsU0FBUyxDQUFDO1FBSW5GLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsUUFBNkIsRUFBRSxJQUF5QztRQUM3RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLGtDQUFrQyxDQUFDO1FBQzdELElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE1BQXFCLEVBQUUsUUFBNkI7UUFDdEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx3Q0FBd0MsQ0FBQztRQUNuRSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUk7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsMEJBQTBCO2FBQ3ZDLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsWUFBWSxDQUFDLFFBQTBCO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxPQUFtQyxFQUFFLFFBQTZCO1FBQ3pFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsb0NBQW9DLENBQUM7UUFDL0QsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQ3pDLElBQUksSUFBSSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNoRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQXNDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNKOztnQkFDRyxPQUFzQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQTBCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxRQUE2QixFQUFFLElBQTZDO1FBQ3JGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUM7UUFDakUsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsbUJBQW1CLENBQUMsUUFBMEI7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxRQUE2QixFQUFFLElBQStDO1FBQ3pGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsd0NBQXdDLENBQUM7UUFDbkUsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0Y7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBb0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNEO2FBQ0o7O2dCQUNHLE9BQW9DLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMscUJBQXFCLENBQUMsUUFBMEI7UUFDdEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN2RyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFrQixJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLFFBQTZCLEVBQUUsSUFBNkI7UUFDMUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRywyQ0FBMkMsQ0FBQztRQUN0RSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5RjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsR0FBRyxDQUFDLENBQTZCLEVBQUUsQ0FBNkIsRUFBRSxDQUE2QixFQUFFLElBQWdDLEVBQUUsR0FBK0IsRUFBRSxTQUFxQyxFQUFFLE1BQWtDLEVBQUUsRUFBK0IsRUFBRSxNQUFrQyxFQUFFLEVBQStCLEVBQUUsS0FBaUMsRUFBRSxHQUErQixFQUFFLEVBQThCLEVBQUUsU0FBc0MsRUFBRSxJQUFnQyxFQUFFLGFBQXlDLEVBQUUsUUFBNkI7UUFDdmtCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUk7WUFDN0IsSUFBSSxJQUFJLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSTtZQUM3QixJQUFJLElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJO1lBQ25DLElBQUksSUFBSSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxRCxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUk7WUFDakMsSUFBSSxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hELElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSTtZQUM3QyxJQUFJLElBQUksWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEUsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQ3ZDLElBQUksSUFBSSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUk7WUFDL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUN2QyxJQUFJLElBQUksU0FBUyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDOUQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7WUFDckMsSUFBSSxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUNqQyxJQUFJLElBQUksTUFBTSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJO1lBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUk7WUFDN0MsSUFBSSxJQUFJLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUNuQyxJQUFJLElBQUksT0FBTyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUQsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxJQUFJO1lBQ3JELElBQUksSUFBSSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBUztZQUNqQixPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRjtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFzQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjs7Z0JBQ0csT0FBc0MsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxVQUFVLENBQUMsUUFBMEI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN0RyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RyxNQUFNLFFBQVEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLE9BQU8sYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQU8sWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUc7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsUUFBNkI7UUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxpQ0FBaUMsQ0FBQztRQUM1RCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZGO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQWdDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RDthQUNKOztnQkFDRyxPQUFnQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQTBCO1FBQ2xELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBYyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxDQUE2QixFQUFFLFFBQTZCO1FBQzVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsVUFBVSxDQUFDLFFBQTBCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxLQUFpQyxFQUFFLFFBQTZCO1FBQ3JFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsa0NBQWtDLENBQUM7UUFDN0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1RCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsZUFBZSxDQUFDLFFBQTBCO1FBQ2hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxDQUE2QixFQUFFLFFBQTZCO1FBQzVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsVUFBVSxDQUFDLFFBQTBCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxDQUE2QixFQUFFLFFBQTZCO1FBQzVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQzdCLElBQUksSUFBSSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxRQUFRLEdBQVM7WUFDakIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBc0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7O2dCQUNHLE9BQXNDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsVUFBVSxDQUFDLFFBQTBCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEcsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUcsTUFBTSxRQUFRLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRixPQUFPLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFPLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDJCQUEyQixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDckcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxREFBcUQsQ0FBQztRQUNoRixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCwrQkFBK0IsQ0FBQyxRQUE2QixFQUFFLElBQThDO1FBQ3pHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcseURBQXlELENBQUM7UUFDcEYsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsc0NBQXNDLENBQUMsUUFBMEI7UUFDdkUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsUUFBNkIsRUFBRSxJQUE4QztRQUNsRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLGtEQUFrRCxDQUFDO1FBQzdFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JHO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLCtCQUErQixDQUFDLFFBQTBCO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDRCQUE0QixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDdEcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzREFBc0QsQ0FBQztRQUNqRixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxtQ0FBbUMsQ0FBQyxRQUEwQjtRQUNwRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxRQUE2QixFQUFFLElBQTZDO1FBQzFGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsMkNBQTJDLENBQUM7UUFDdEUsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUY7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBZ0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0o7O2dCQUNHLE9BQWdDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsd0JBQXdCLENBQUMsUUFBMEI7UUFDekQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNuRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFjLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsUUFBNkIsRUFBRSxJQUEwQztRQUM5RixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLGtEQUFrRCxDQUFDO1FBQzdFLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JHO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLCtCQUErQixDQUFDLFFBQTBCO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDJCQUEyQixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDckcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxxREFBcUQsQ0FBQztRQUNoRixJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQ0FBa0MsQ0FBQyxRQUEwQjtRQUNuRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxRQUE2QixFQUFFLElBQW1EO1FBQ3JHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZ0RBQWdELENBQUM7UUFDM0UsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsNkJBQTZCLENBQUMsUUFBMEI7UUFDOUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0NBQWdDLENBQUMsUUFBNkIsRUFBRSxJQUE4QztRQUMxRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLDBEQUEwRCxDQUFDO1FBQ3JGLElBQUksUUFBUSxLQUFLLElBQUk7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzNELElBQUksUUFBUSxLQUFLLFNBQVM7WUFDM0IsSUFBSSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xFLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksUUFBUSxHQUFTO1lBQ2pCLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxRQUFRLEVBQUUsa0JBQWtCO2FBQy9CLENBQUM7U0FDTCxDQUFDO1FBRUYsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDbkcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFNBQVMsWUFBWSxnQkFBZ0IsRUFBRTtnQkFDdkMsSUFBSTtvQkFDQSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxDQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdHO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQTZCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKOztnQkFDRyxPQUE2QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVTLHVDQUF1QyxDQUFDLFFBQTBCO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQ2QsUUFBUSxZQUFZLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFFBQVMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBTyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFOUUsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUFFO1NBQUM7UUFDeEksSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO2dCQUMxQixTQUFTLEdBQUcsYUFBYSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNHLE9BQU8sY0FBYyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3pDLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7UUFDRCxPQUFPLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDBCQUEwQixDQUFDLFFBQTZCLEVBQUUsSUFBOEM7UUFDcEcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxvREFBb0QsQ0FBQztRQUMvRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMzRCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQzNCLElBQUksSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLFFBQVEsR0FBUztZQUNqQixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxVQUFVO1lBQ25CLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQztnQkFDckIsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsUUFBUSxFQUFFLGtCQUFrQjthQUMvQixDQUFDO1NBQ0wsQ0FBQztRQUVGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDekMsSUFBSSxTQUFTLFlBQVksZ0JBQWdCLEVBQUU7Z0JBQ3ZDLElBQUk7b0JBQ0EsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2RztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUE2QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7YUFDSjs7Z0JBQ0csT0FBNkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxpQ0FBaUMsQ0FBQyxRQUEwQjtRQUNsRSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sWUFBWSxHQUNkLFFBQVEsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxRQUFTLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQU8sUUFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlFLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUFFLEtBQUssSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFBRTtTQUFDO1FBQ3hJLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUNoQixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztnQkFDMUIsU0FBUyxHQUFHLGFBQWEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzRyxPQUFPLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUN6QyxPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pFLE9BQU8sY0FBYyxDQUFDLHNDQUFzQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO1FBQ0QsT0FBTyxhQUFhLENBQVcsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxRQUE2QixFQUFFLElBQThDO1FBQ2hHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsZ0RBQWdELENBQUM7UUFDM0UsSUFBSSxRQUFRLEtBQUssSUFBSTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUztZQUMzQixJQUFJLElBQUksV0FBVyxHQUFHLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDbEUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLEdBQVM7WUFDakIsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsVUFBVTtZQUNuQixZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFFBQVEsRUFBRSxrQkFBa0I7YUFDL0IsQ0FBQztTQUNMLENBQUM7UUFFRixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUNuRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQ3pDLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFO2dCQUN2QyxJQUFJO29CQUNBLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkc7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1IsT0FBNkIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7O2dCQUNHLE9BQTZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRVMsNkJBQTZCLENBQUMsUUFBMEI7UUFDOUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFlBQVksR0FDZCxRQUFRLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsUUFBUyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFPLFFBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RSxJQUFJLFFBQVEsR0FBUSxFQUFFLENBQUM7UUFBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FBQztRQUN4SSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDdkIsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7Z0JBQzFCLFNBQVMsR0FBRyxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0csT0FBTyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU0sSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sS0FBSyxHQUFHLEVBQUU7WUFDekMsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN6RSxPQUFPLGNBQWMsQ0FBQyxzQ0FBc0MsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9GLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUNELE9BQU8sYUFBYSxDQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7WUFybkRKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7O1lBTThELHNCQUFzQix1QkFBcEUsTUFBTSxTQUFDLHNCQUFzQjtZQTU4SHJDLFVBQVUsdUJBNDhIcUUsTUFBTSxTQUFDLFVBQVU7eUNBQXFCLFFBQVEsWUFBSSxNQUFNLFNBQUMsWUFBWTs7QUFpdEQ3SixtQ0FBbUM7QUFDbkMsTUFBTSxDQUFOLElBQVksb0JBS1g7QUFMRCxXQUFZLG9CQUFvQjtJQUM1QixxQ0FBYSxDQUFBO0lBQ2IsbUNBQVcsQ0FBQTtJQUNYLHFDQUFhLENBQUE7SUFDYixtQ0FBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLG9CQUFvQixLQUFwQixvQkFBb0IsUUFLL0I7QUE0Q0QsTUFBTSxDQUFOLElBQVksaUJBT1g7QUFQRCxXQUFZLGlCQUFpQjtJQUN6Qix3Q0FBbUIsQ0FBQTtJQUNuQixzQ0FBaUIsQ0FBQTtJQUNqQix3Q0FBbUIsQ0FBQTtJQUNuQiw0Q0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBdUIsQ0FBQTtJQUN2QixrQ0FBYSxDQUFBO0FBQ2pCLENBQUMsRUFQVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBTzVCO0FBZ0JELDRCQUE0QjtBQUM1QixNQUFNLENBQU4sSUFBWSxnQkFJWDtBQUpELFdBQVksZ0JBQWdCO0lBQ3hCLDJDQUF1QixDQUFBO0lBQ3ZCLGlFQUE2QyxDQUFBO0lBQzdDLG1GQUErRCxDQUFBO0FBQ25FLENBQUMsRUFKVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBSTNCO0FBRUQscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBTixJQUFZLDBCQUVYO0FBRkQsV0FBWSwwQkFBMEI7SUFDbEMsNkNBQWUsQ0FBQTtBQUNuQixDQUFDLEVBRlcsMEJBQTBCLEtBQTFCLDBCQUEwQixRQUVyQztBQTBCRCxNQUFNLENBQU4sSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2hCLDJCQUFlLENBQUE7SUFDZiwyQkFBZSxDQUFBO0lBQ2YsK0JBQW1CLENBQUE7SUFDbkIsMkJBQWUsQ0FBQTtBQUNuQixDQUFDLEVBTFcsUUFBUSxLQUFSLFFBQVEsUUFLbkI7QUFFRCx1QkFBdUI7QUFDdkIsTUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN0QiwrQkFBYSxDQUFBO0lBQ2IsK0NBQTZCLENBQUE7SUFDN0IsNkRBQTJDLENBQUE7QUFDL0MsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBd0JELE1BQU0sQ0FBTixJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDMUIsbUNBQWEsQ0FBQTtJQUNiLGlDQUFXLENBQUE7SUFDWCxtQ0FBYSxDQUFBO0lBQ2IsaUNBQVcsQ0FBQTtBQUNmLENBQUMsRUFMVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBSzdCO0FBRUQsTUFBTSxDQUFOLElBQVksNkJBWVg7QUFaRCxXQUFZLDZCQUE2QjtJQUNyQyw4Q0FBYSxDQUFBO0lBQ2Isa0RBQWlCLENBQUE7SUFDakIsNENBQVcsQ0FBQTtJQUNYLHNFQUFxQyxDQUFBO0lBQ3JDLGtEQUFpQixDQUFBO0lBQ2pCLGdEQUFlLENBQUE7SUFDZixnRUFBK0IsQ0FBQTtJQUMvQixvREFBbUIsQ0FBQTtJQUNuQiw4REFBNkIsQ0FBQTtJQUM3Qiw4REFBNkIsQ0FBQTtJQUM3QixzREFBcUIsQ0FBQTtBQUN6QixDQUFDLEVBWlcsNkJBQTZCLEtBQTdCLDZCQUE2QixRQVl4QztBQXVERCxNQUFNLE9BQU8sWUFBYSxTQUFRLEtBQUs7SUFPbkMsWUFBWSxPQUFlLEVBQUUsTUFBYyxFQUFFLFFBQWdCLEVBQUUsT0FBZ0MsRUFBRSxNQUFXO1FBQ3hHLEtBQUssRUFBRSxDQUFDO1FBU0YsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFQNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUlELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBUTtRQUMxQixPQUFPLEdBQUcsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDO0lBQ3ZDLENBQUM7Q0FDSjtBQUVELFNBQVMsY0FBYyxDQUFDLE9BQWUsRUFBRSxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxPQUFnQyxFQUFFLE1BQVk7SUFDckgsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQ3ZDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBRWhDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUYsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQVM7SUFDekIsT0FBTyxJQUFJLFVBQVUsQ0FBUyxDQUFDLFFBQWEsRUFBRSxFQUFFO1FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjthQUFNO1lBQ0gsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFO2dCQUNwQixRQUFRLENBQUMsSUFBSSxDQUFPLEtBQUssQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUM7WUFDRixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDxhdXRvLWdlbmVyYXRlZD5cbi8vICAgICBHZW5lcmF0ZWQgdXNpbmcgdGhlIE5Td2FnIHRvb2xjaGFpbiB2MTMuMTUuNS4wIChOSnNvblNjaGVtYSB2MTAuNi42LjAgKE5ld3RvbnNvZnQuSnNvbiB2MTEuMC4wLjApKSAoaHR0cDovL05Td2FnLm9yZylcbi8vIDwvYXV0by1nZW5lcmF0ZWQ+XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlU2hhcnBlciBkaXNhYmxlIEluY29uc2lzdGVudE5hbWluZ1xuXG5pbXBvcnQgeyBtZXJnZU1hcCBhcyBfb2JzZXJ2YWJsZU1lcmdlTWFwLCBjYXRjaEVycm9yIGFzIF9vYnNlcnZhYmxlQ2F0Y2ggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tIGFzIF9vYnNlcnZhYmxlRnJvbSwgdGhyb3dFcnJvciBhcyBfb2JzZXJ2YWJsZVRocm93LCBvZiBhcyBfb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZSwgSHR0cFJlc3BvbnNlQmFzZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuZXhwb3J0IGNvbnN0IEFQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdBUElfQkFTRV9VUkwnKTtcblxuZXhwb3J0IGNsYXNzIEFwaUNsaWVudENvbmZpZ3VyYXRpb24ge1xuICAgIGFwaVVybDogc3RyaW5nID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTQyMjAnO1xuICAgIGFwaUtleTogc3RyaW5nID0gJ0FwaUtleSc7XG4gICAgcHJpdmF0ZSBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZyA9IG51bGw7XG4gICAgYXN5bmMgZ2V0QXV0aG9yaXphdGlvblRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbjsgfTtcbiAgICBzZXRBdXRob3JpemF0aW9uVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQgeyB0aGlzLmF1dGhvcml6YXRpb25Ub2tlbiA9IHRva2VuOyB9O1xufVxuXG5leHBvcnQgY2xhc3MgQXBpQ2xpZW50QmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uKSB7IH1cblxuICAgIHByb3RlY3RlZCBhc3luYyB0cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEF1dGhvcml6YXRpb25Ub2tlbigpO1xuICAgICAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IChvcHRpb25zLmhlYWRlcnMgYXMgSHR0cEhlYWRlcnMpLmFwcGVuZChcImF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gKG9wdGlvbnMuaGVhZGVycyBhcyBIdHRwSGVhZGVycykuYXBwZW5kKFwiWC1BUEktS2V5XCIsIHRoaXMuY29uZmlndXJhdGlvbi5hcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgdHJhbnNmb3JtUmVzcG9uc2U6IChyZXMpID0+IHJlcywgcmVzcG9uc2VUeXBlOiAnanNvbicgfTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEJhc2VVcmwoZGVmdWx0VXJsOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5hcGlVcmw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyYW5zZm9ybVJlc3VsdCh1cmw6IHN0cmluZywgcmVzOiBIdHRwUmVzcG9uc2VCYXNlLCBjYjogKHJlczogSHR0cFJlc3BvbnNlQmFzZSkgPT4gT2JzZXJ2YWJsZTxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgIHJldHVybiBjYihyZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQnVpbGRJbmZvQXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFzc2VtYmx5IGJ1aWxkIGluZm9cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBoZWFkSW5mbygpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIEdldHMgYXNzZW1ibHkgYnVpbGQgaW5mb1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8oKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQnVpbGRJbmZvQXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElCdWlsZEluZm9BcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYXNzZW1ibHkgYnVpbGQgaW5mb1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGhlYWRJbmZvKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9pbmZvXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiaGVhZFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NIZWFkSW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0hlYWRJbmZvKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0hlYWRJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYXNzZW1ibHkgYnVpbGQgaW5mb1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldEluZm8oKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9pbmZvXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW5mbyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldEluZm8oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8QnVpbGRJbmZvTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxCdWlsZEluZm9Nb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8QnVpbGRJbmZvTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEJ1aWxkSW5mb01vZGVsPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNDb21wYXRpYmlsaXR5QXBpQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNzc0ZvbnRzKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBGb250c01ldGhvZERhdGEgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHRlbmFudElkOiBudW1iZXIsIHBzTmFtZTogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZm9udEtleSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldENzc0ZvbnQodGVuYW50SWQ6IG51bWJlciwgZm9udEtleT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbWFnZVNpemUodGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0U2hhcGVCb3VuZHModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldFNoYXBlQm91bmRzUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0V2F0ZXJtYXJrSXRlbXModGVuYW50SWQ6IG51bWJlciwgYm9keT86IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaW1nKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdGgodGVuYW50SWQ6IG51bWJlciwgZj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVzb3VyY2UodGVuYW50SWQ6IG51bWJlciwgaW1hZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdHh0KHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVDb2xvcnNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5TXVsdGlDYWxsUmVxdWVzdCh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUltYWdlSXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUltYWdlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVTaGFwZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduQXRvbXNDb21wYXRpYmlsaXR5QXBpQ2xpZW50IGV4dGVuZHMgQXBpQ2xpZW50QmFzZSBpbXBsZW1lbnRzIElEZXNpZ25BdG9tc0NvbXBhdGliaWxpdHlBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3NzRm9udHModGVuYW50SWQ6IG51bWJlciwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2Nzc2ZvbnRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3NzRm9udHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0Nzc0ZvbnRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHRlbmFudElkOiBudW1iZXIsIHBzTmFtZTogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvZm9udHMve3BzTmFtZX1cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAocHNOYW1lID09PSB1bmRlZmluZWQgfHwgcHNOYW1lID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAncHNOYW1lJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3BzTmFtZX1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwc05hbWUpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRm9udHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0ZvbnRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZvbnRLZXkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KHRlbmFudElkOiBudW1iZXIsIGZvbnRLZXk/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRDc3NGb250P1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIGlmIChmb250S2V5ICE9PSB1bmRlZmluZWQgJiYgZm9udEtleSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmb250S2V5PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmb250S2V5KSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENzc0ZvbnQoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRDc3NGb250KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRDc3NGb250KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRJbWFnZVNpemUodGVuYW50SWQ6IG51bWJlciwgYm9keT86IEdldEltYWdlU2l6ZVJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9HZXRJbWFnZVNpemVcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbWFnZVNpemUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TnVsbEFibGVTaXplPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxOdWxsQWJsZVNpemU+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRTaGFwZUJvdW5kcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL0dldFNoYXBlQm91bmRzXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFNoYXBlQm91bmRzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0U2hhcGVCb3VuZHMoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVjdGFuZ2xlRj4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxSZWN0YW5nbGVGPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0U2hhcGVCb3VuZHMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFJlY3RhbmdsZUY+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFJlY3RhbmdsZUY+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFJlY3RhbmdsZUY+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvR2V0V2F0ZXJtYXJrSXRlbXNcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0V2F0ZXJtYXJrSXRlbXMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0V2F0ZXJtYXJrSXRlbXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBoIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNteWsgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmdiIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGdyYXlzY2FsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0YXJnZXQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc3EgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZWZmZWN0IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGtwIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9ibSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBvbyAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBhbHBoYU1hc2sgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcGFnZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBjb2xvcml6ZUNvbG9yIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgaW1nKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB3PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgaD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGNteWs/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZ2I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBncmF5c2NhbGU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0YXJnZXQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzcT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBlZmZlY3Q/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBrcD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9ibT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIG9vPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgYWxwaGFNYXNrPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHBhZ2U/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjb2xvcml6ZUNvbG9yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvaW1nP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIGlmIChmICE9PSB1bmRlZmluZWQgJiYgZiAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICBpZiAodyAhPT0gdW5kZWZpbmVkICYmIHcgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwidz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdykgKyBcIiZcIjtcbiAgICAgICAgaWYgKGggIT09IHVuZGVmaW5lZCAmJiBoICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImg9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGgpICsgXCImXCI7XG4gICAgICAgIGlmIChjbXlrICE9PSB1bmRlZmluZWQgJiYgY215ayAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjbXlrPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjbXlrKSArIFwiJlwiO1xuICAgICAgICBpZiAocmdiICE9PSB1bmRlZmluZWQgJiYgcmdiICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInJnYj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmdiKSArIFwiJlwiO1xuICAgICAgICBpZiAoZ3JheXNjYWxlICE9PSB1bmRlZmluZWQgJiYgZ3JheXNjYWxlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImdyYXlzY2FsZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZ3JheXNjYWxlKSArIFwiJlwiO1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInRhcmdldD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGFyZ2V0KSArIFwiJlwiO1xuICAgICAgICBpZiAoc3EgIT09IHVuZGVmaW5lZCAmJiBzcSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJzcT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgc3EpICsgXCImXCI7XG4gICAgICAgIGlmIChlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3QgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZWZmZWN0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBlZmZlY3QpICsgXCImXCI7XG4gICAgICAgIGlmIChrcCAhPT0gdW5kZWZpbmVkICYmIGtwICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImtwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBrcCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yICE9PSB1bmRlZmluZWQgJiYgY29sb3IgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNvbG9yKSArIFwiJlwiO1xuICAgICAgICBpZiAob2JtICE9PSB1bmRlZmluZWQgJiYgb2JtICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcIm9ibT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb2JtKSArIFwiJlwiO1xuICAgICAgICBpZiAob28gIT09IHVuZGVmaW5lZCAmJiBvbyAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvbz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgb28pICsgXCImXCI7XG4gICAgICAgIGlmIChhbHBoYU1hc2sgIT09IHVuZGVmaW5lZCAmJiBhbHBoYU1hc2sgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiYWxwaGFNYXNrPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhbHBoYU1hc2spICsgXCImXCI7XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwYWdlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAoY29sb3JpemVDb2xvciAhPT0gdW5kZWZpbmVkICYmIGNvbG9yaXplQ29sb3IgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY29sb3JpemVDb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY29sb3JpemVDb2xvcikgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NJbWcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NJbWcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0ltZyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IE1vZGlmaWVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRMaWNlbnNlKHRlbmFudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL2xpY2Vuc2VcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldExpY2Vuc2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRMaWNlbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcHRoKHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9wdGg/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgIT09IHVuZGVmaW5lZCAmJiBmICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NQdGgocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVzb3VyY2UodGVuYW50SWQ6IG51bWJlciwgaW1hZ2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9yZXNvdXJjZT9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiBpbWFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJpbWFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaW1hZ2UpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHN2Zyh0ZW5hbnRJZDogbnVtYmVyLCBmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvc3ZnP1wiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIGlmIChmICE9PSB1bmRlZmluZWQgJiYgZiAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJmPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBmKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU3ZnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdHh0KHRlbmFudElkOiBudW1iZXIsIGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci90eHQ/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgaWYgKGYgIT09IHVuZGVmaW5lZCAmJiBmICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NUeHQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQXJjaGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVBdXRvU2NhbGVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVDb2xvcnNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQnlDb2xvckRhdGFcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeUNvbG9yRGF0YSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8c3RyaW5nPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQnlDb2xvckRhdGEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8c3RyaW5nPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxzdHJpbmc+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QodGVuYW50SWQ6IG51bWJlciwgYm9keT86IE11bHRpQ2FsbFJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3RcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ6IG51bWJlciwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3RlbmFudHMve3RlbmFudElkfS9hcGkvY2N2aWV3ZXIvVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZUltYWdlSXRlbUhhbmRsZXJcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSB1bmRlZmluZWQgfHwgdGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt0ZW5hbnRJZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUltYWdlSXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlclwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IHVuZGVmaW5lZCB8fCB0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie3RlbmFudElkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkOiBudW1iZXIsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS90ZW5hbnRzL3t0ZW5hbnRJZH0vYXBpL2Njdmlld2VyL1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZDogbnVtYmVyLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvdGVuYW50cy97dGVuYW50SWR9L2FwaS9jY3ZpZXdlci9VcGRhdGVTaGFwZUl0ZW1IYW5kbGVyXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gdW5kZWZpbmVkIHx8IHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7dGVuYW50SWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVTaGFwZUl0ZW1IYW5kbGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNJbWFnZXNBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSB3ZWIgaW1hZ2UgcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkXG4gICAgKGRlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJykuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXcoYXR0YWNobWVudD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckltYWdlUHJldmlld01vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25BdG9tc0ltYWdlc0FwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJRGVzaWduQXRvbXNJbWFnZXNBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSB3ZWIgaW1hZ2UgcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkXG4gICAgKGRlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJykuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJJbWFnZVByZXZpZXcoYXR0YWNobWVudD86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFJlbmRlckltYWdlUHJldmlld01vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2ltYWdlcy9yZW5kZXItaW1hZ2UtcHJldmlldz9cIjtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQgIT09IHVuZGVmaW5lZCAmJiBhdHRhY2htZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImF0dGFjaG1lbnQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGF0dGFjaG1lbnQpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJJbWFnZVByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlbmRlckltYWdlUHJldmlldyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2KSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVNYXRjaCA9IGNvbnRlbnREaXNwb3NpdGlvbiA/IC9maWxlbmFtZT1cIj8oW15cIl0qPylcIj8oO3wkKS9nLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZU5hbWVNYXRjaCAmJiBmaWxlTmFtZU1hdGNoLmxlbmd0aCA+IDEgPyBmaWxlTmFtZU1hdGNoWzFdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YoeyBmaWxlTmFtZTogZmlsZU5hbWUsIGRhdGE6IDxhbnk+cmVzcG9uc2VCbG9iLCBzdGF0dXM6IHN0YXR1cywgaGVhZGVyczogX2hlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlc2lnbkF0b21zU2VydmljZUFwaUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgY29sb3JzXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENvbnZlcnQgY29sb3JzIG9wZXJhdGlvbiBwYXJhbWV0ZXJzXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY29udmVydENvbG9ycyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IENvbnZlcnRDb2xvcnNNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZGVzaWduIGZpbGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQgc2F2ZXMgaXQgaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHNhdmVkIHRvIHByaXZhdGUgc3RvcmFnZVxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRGVzaWduIGNyZWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVEZXNpZ24ocHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogQ3JlYXRlRGVzaWduTW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxEZXNpZ25JbmZvPjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvbnRlbnQgb2YgdGhlIGJhY2tncm91bmQuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSBzdXJmYWNlSW5kZXggKG9wdGlvbmFsKSBTdXJmYWNlIGluZGV4LlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBleHRyYWN0QmFja2dyb3VuZChpZDogc3RyaW5nIHwgbnVsbCwgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIExvYWRzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZFByb2R1Y3QoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBTYXZlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIHRvIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgc2F2ZWQgdG8gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHByb2R1Y3QgZGVzY3JpcHRpb25cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBzYXZlUHJvZHVjdChpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogUGF0Y2hlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIGluIGRlc2lnbiBmaWxlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcGF0Y2hUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwYXRjaFByb2R1Y3QoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgcGF0Y2hUeXBlPzogUHJvZHVjdFBhdGNoVHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGU/OiBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD47XG4gICAgLyoqXG4gICAgICogTG9hZHMgZGF0YSBzY2hlbWEgZnJvbSBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbG9hZERhdGFTY2hlbWEoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBHZXRzIHZhcmlhYmxlIGl0ZW1zIGluZm9ybWF0aW9uIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0VmFyaWFibGVzKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPjtcbiAgICAvKipcbiAgICAgKiBTZXRzIHZhcmlhYmxlIGl0ZW1zIHZhbHVlcyBmb3IgZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlIChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJyBkZXNpZ24gd2lsbCBiZSB0YWtlbiBmcm9tIHByaXZhdGUgc3RvcmFnZVxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgRGVzaWduIHZhcmlhYmxlIHZhbHVlc1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNldFZhcmlhYmxlcyhpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVmFyaWFibGVzTW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBMb2FkcyB2YXJpYWJsZSBkYXRhIHByaW50aW5nIGluZm9ybWF0aW9uIGZyb20gZGVzaWduIGZpbGUgdGFrZW4gZnJvbSBzdG9yYWdlXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlIChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJyBkZXNpZ24gd2lsbCBiZSB0YWtlbiBmcm9tIHByaXZhdGUgc3RvcmFnZVxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGxvYWRWZHBEYXRhKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD47XG4gICAgLyoqXG4gICAgICogU2F2ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiB0byBkZXNpZ24gZmlsZSBhbmQgdXBkYXRlcyBkZXNpZ24gaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHZkcCBkYXRhXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVZkcERhdGEoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFZkcERhdGFNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcmFtdGlvbiBmcm9tIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGVWZHBEYXRhKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIEZsYXR0ZW4gaXRlbXMuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIEl0ZW1zIHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZmxhdHRlbkl0ZW1zKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55W10gfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgcHJvZHVjdCBpdGVtXG4gICAgICogQHBhcmFtIGl0ZW1UeXBlIChvcHRpb25hbCkgRGVzaXJlZCBpdGVtIHR5cGVcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBzb3VyY2VUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZUlkIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZU93bmVySWQgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZUl0ZW0oaXRlbVR5cGU/OiBJdGVtVHlwZSB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBzb3VyY2VUeXBlPzogSXRlbVNvdXJjZVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VJZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNvdXJjZU93bmVySWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VGaWxlPzogRmlsZVBhcmFtZXRlciB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByaXZhdGUgZGVzaWduIGZyb20gYSBwdWJsaWMgZGVzaWduLlxuICAgICAqIEBwYXJhbSBkZXNpZ25JZCAob3B0aW9uYWwpIFB1YmxpYyBkZXNpZ24gSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIElELlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIElELlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21EZXNpZ24oZGVzaWduSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlRGVzaWduSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcml2YXRlIGRlc2lnbiBmcm9tIGEgcHVibGljIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSByZXNvdXJjZUlkIChvcHRpb25hbCkgUmVzb3VyY2UgSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIElELlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIElELlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZShyZXNvdXJjZUlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZURlc2lnbklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByZXZpZXcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyRGVzaWduUHJldmlldyhhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJldmlld01vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGEgZGVzaWduIHByb29mIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJywgZmlsZSB3aWxsIGJlIHByb3ZpZGVkIGFzIGFuIGF0dGFjaG1lbnQgd2l0aCB1bmlxdWUgZmlsZW5hbWUgc3VwcGxpZWRcbiAgICAoZGVmYXVsdCB2YWx1ZSBpcyAnZmFsc2UnKS5cbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgUmVuZGVyIG1vZGVsIHdpdGggcHJvb2YgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJEZXNpZ25Qcm9vZihhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyRGVzaWduUHJvb2ZNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogUmVuZGVyIHByb2R1Y3QgcHJvb2YgaW1hZ2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBQcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyUHJvZHVjdChhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyUHJvZHVjdE1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25BdG9tc1NlcnZpY2VBcGlDbGllbnQgZXh0ZW5kcyBBcGlDbGllbnRCYXNlIGltcGxlbWVudHMgSURlc2lnbkF0b21zU2VydmljZUFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChBcGlDbGllbnRDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOiBBcGlDbGllbnRDb25maWd1cmF0aW9uLCBASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX0JBU0VfVVJMKSBiYXNlVXJsPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsICE9PSB1bmRlZmluZWQgJiYgYmFzZVVybCAhPT0gbnVsbCA/IGJhc2VVcmwgOiB0aGlzLmdldEJhc2VVcmwoXCJcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgY29sb3JzXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIENvbnZlcnQgY29sb3JzIG9wZXJhdGlvbiBwYXJhbWV0ZXJzXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY29udmVydENvbG9ycyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IENvbnZlcnRDb2xvcnNNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jb2xvckNvbnZlcnRlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDb252ZXJ0Q29sb3JzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ29udmVydENvbG9ycyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ29udmVydENvbG9ycyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBkZXNpZ24gZmlsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGFuZCBzYXZlcyBpdCBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgc2F2ZWQgdG8gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBEZXNpZ24gY3JlYXRpb24gcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGNyZWF0ZURlc2lnbihwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBDcmVhdGVEZXNpZ25Nb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPERlc2lnbkluZm8+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducz9cIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVEZXNpZ24oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVEZXNpZ24oPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RGVzaWduSW5mbz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxEZXNpZ25JbmZvPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlRGVzaWduKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxEZXNpZ25JbmZvPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDE6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDEgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxEZXNpZ25JbmZvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPERlc2lnbkluZm8+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb250ZW50IG9mIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gc3VyZmFjZUluZGV4IChvcHRpb25hbCkgU3VyZmFjZSBpbmRleC5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZXh0cmFjdEJhY2tncm91bmQoaWQ6IHN0cmluZyB8IG51bGwsIHN1cmZhY2VJbmRleD86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9iYWNrZ3JvdW5kP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChzdXJmYWNlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBzdXJmYWNlSW5kZXggIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic3VyZmFjZUluZGV4PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBzdXJmYWNlSW5kZXgpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0V4dHJhY3RCYWNrZ3JvdW5kKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRXh0cmFjdEJhY2tncm91bmQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0V4dHJhY3RCYWNrZ3JvdW5kKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TWlzc2luZ0Rlc2lnbkVsZW1lbnREdG8+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQyMjogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQyMiA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFVucHJvY2Vzc2FibGVEZXNpZ25FbGVtZW50RHRvPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNsaWVudCBFcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MjIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgcHJvZHVjdCAoZGVzaWduIG1vZGVsKSBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZVxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkUHJvZHVjdChpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L21vZGVsP1wiO1xuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ2lkJyBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKFwie2lkfVwiLCBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGlkKSk7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZSAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZU93bmVyICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWRQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvYWRQcm9kdWN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPGFueT5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8YW55Pig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHByb2R1Y3QgKGRlc2lnbiBtb2RlbCkgdG8gZGVzaWduIGZpbGUgYW5kIHVwZGF0ZXMgZGVzaWduIGluIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIGlkIERlc2lnbiBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlIChvcHRpb25hbCkgSWYgc2V0IHRvICd0cnVlJyBkZXNpZ24gd2lsbCBiZSBzYXZlZCB0byBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFNlcmlhbGl6ZWQgcHJvZHVjdCBkZXNjcmlwdGlvblxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNhdmVQcm9kdWN0KGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS9tb2RlbD9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicHV0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NhdmVQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzU2F2ZVByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU2F2ZVByb2R1Y3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF0Y2hlcyBwcm9kdWN0IChkZXNpZ24gbW9kZWwpIGluIGRlc2lnbiBmaWxlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcGF0Y2hUeXBlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwYXRjaFByb2R1Y3QoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgcGF0Y2hUeXBlPzogUHJvZHVjdFBhdGNoVHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3BsYWNlaG9sZGVySXRlbU5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGU/OiBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB8IHVuZGVmaW5lZCwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGU/OiBGaWxlUGFyYW1ldGVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9kZXNpZ25zL3tpZH0vbW9kZWw/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgaWYgKHBhdGNoVHlwZSA9PT0gbnVsbCB8fCBwYXRjaFR5cGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BhdGNoVHlwZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJwYXRjaFR5cGVcIiwgcGF0Y2hUeXBlLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvX2l0ZW1OYW1lICE9PSBudWxsICYmIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwicmVwbGFjZUltYWdlSXRlbUZpbGVJbmZvLml0ZW1OYW1lXCIsIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19pdGVtTmFtZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlICE9PSBudWxsICYmIHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm8uc291cmNlRmlsZVwiLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZS5kYXRhLCByZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm9fc291cmNlRmlsZS5maWxlTmFtZSA/IHJlcGxhY2VJbWFnZUl0ZW1GaWxlSW5mb19zb3VyY2VGaWxlLmZpbGVOYW1lIDogXCJyZXBsYWNlSW1hZ2VJdGVtRmlsZUluZm8uc291cmNlRmlsZVwiKTtcbiAgICAgICAgaWYgKHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lICE9PSBudWxsICYmIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19wbGFjZWhvbGRlckl0ZW1OYW1lICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm8ucGxhY2Vob2xkZXJJdGVtTmFtZVwiLCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fcGxhY2Vob2xkZXJJdGVtTmFtZS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZSA9PT0gbnVsbCB8fCByZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm9fbmV3Q29udGVudFR5cGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3JlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19uZXdDb250ZW50VHlwZScgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJyZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudEluZm8ubmV3Q29udGVudFR5cGVcIiwgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX25ld0NvbnRlbnRUeXBlLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgIT09IG51bGwgJiYgcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mby5zb3VyY2VGaWxlXCIsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlLmRhdGEsIHJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mb19zb3VyY2VGaWxlLmZpbGVOYW1lID8gcmVwbGFjZVBsYWNlaG9sZGVySXRlbUNvbnRlbnRJbmZvX3NvdXJjZUZpbGUuZmlsZU5hbWUgOiBcInJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50SW5mby5zb3VyY2VGaWxlXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicGF0Y2hcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUGF0Y2hQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUGF0Y2hQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1BhdGNoUHJvZHVjdChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBkYXRhIHNjaGVtYSBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZVxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkRGF0YVNjaGVtYShpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3NjaGVtYT9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0xvYWREYXRhU2NoZW1hKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZERhdGFTY2hlbWEoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvYWREYXRhU2NoZW1hKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHZhcmlhYmxlIGl0ZW1zIGluZm9ybWF0aW9uIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0VmFyaWFibGVzKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Rlc2lnbnMve2lkfS92YXJpYWJsZXM/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VmFyaWFibGVzKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0VmFyaWFibGVzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFZhcmlhYmxlc01vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0VmFyaWFibGVzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxWYXJpYWJsZXNNb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VmFyaWFibGVzTW9kZWw+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFZhcmlhYmxlc01vZGVsPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdmFyaWFibGUgaXRlbXMgdmFsdWVzIGZvciBkZXNpZ24gZmlsZSB0YWtlbiBmcm9tIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBEZXNpZ24gdmFyaWFibGUgdmFsdWVzXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2V0VmFyaWFibGVzKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBWYXJpYWJsZXNNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZhcmlhYmxlcz9cIjtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdpZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntpZH1cIiwgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpZCkpO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2UpICsgXCImXCI7XG4gICAgICAgIGlmIChwcml2YXRlU3RvcmFnZU93bmVyICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlU3RvcmFnZU93bmVyPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwcml2YXRlU3RvcmFnZU93bmVyKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicHV0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NldFZhcmlhYmxlcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NldFZhcmlhYmxlcyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTZXRWYXJpYWJsZXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwOTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwOSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkNvbmZsaWN0XCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwOSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiBmcm9tIGRlc2lnbiBmaWxlIHRha2VuIGZyb20gc3RvcmFnZVxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBsb2FkVmRwRGF0YShpZDogc3RyaW5nIHwgbnVsbCwgcHJpdmF0ZVN0b3JhZ2U/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxWZHBEYXRhTW9kZWw+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcERhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzTG9hZFZkcERhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NMb2FkVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxWZHBEYXRhTW9kZWw+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VmRwRGF0YU1vZGVsPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9hZFZkcERhdGEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFZkcERhdGFNb2RlbD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VmRwRGF0YU1vZGVsPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDk6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDkgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJDb25mbGljdFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxWZHBEYXRhTW9kZWw+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcm1hdGlvbiB0byBkZXNpZ24gZmlsZSBhbmQgdXBkYXRlcyBkZXNpZ24gaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gaWQgRGVzaWduIGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2UgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnIGRlc2lnbiB3aWxsIGJlIHRha2VuIGZyb20gcHJpdmF0ZSBzdG9yYWdlXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBTZXJpYWxpemVkIHZkcCBkYXRhXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc2F2ZVZkcERhdGEoaWQ6IHN0cmluZyB8IG51bGwsIHByaXZhdGVTdG9yYWdlPzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFZkcERhdGFNb2RlbCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcERhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInB1dFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NTYXZlVmRwRGF0YSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1NhdmVWZHBEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1NhdmVWZHBEYXRhKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdmFyaWFibGUgZGF0YSBwcmludGluZyBpbmZvcmFtdGlvbiBmcm9tIGRlc2lnbiBmaWxlIGFuZCB1cGRhdGVzIGRlc2lnbiBpbiBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBpZCBEZXNpZ24gaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZSAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScgZGVzaWduIHdpbGwgYmUgdGFrZW4gZnJvbSBwcml2YXRlIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcHJpdmF0ZVN0b3JhZ2VPd25lciAob3B0aW9uYWwpIFByaXZhdGUgc3RvcmFnZSBvd25lciBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkZWxldGVWZHBEYXRhKGlkOiBzdHJpbmcgfCBudWxsLCBwcml2YXRlU3RvcmFnZT86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwcml2YXRlU3RvcmFnZU93bmVyPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvZGVzaWducy97aWR9L3ZkcERhdGE/XCI7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAnaWQnIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoXCJ7aWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgaWQpKTtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgcHJpdmF0ZVN0b3JhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2U9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlKSArIFwiJlwiO1xuICAgICAgICBpZiAocHJpdmF0ZVN0b3JhZ2VPd25lciAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVTdG9yYWdlT3duZXIgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicHJpdmF0ZVN0b3JhZ2VPd25lcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHJpdmF0ZVN0b3JhZ2VPd25lcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZGVsZXRlXCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0RlbGV0ZVZkcERhdGEoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NEZWxldGVWZHBEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0RlbGV0ZVZkcERhdGEocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA5OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA5ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQ29uZmxpY3RcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVuIGl0ZW1zLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBJdGVtcyB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZsYXR0ZW5JdGVtcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IGFueVtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2ZsYXR0ZW4/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRmxhdHRlbkl0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NGbGF0dGVuSXRlbXMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHByb2R1Y3QgaXRlbVxuICAgICAqIEBwYXJhbSBpdGVtVHlwZSAob3B0aW9uYWwpIERlc2lyZWQgaXRlbSB0eXBlXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gc291cmNlVHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VJZCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzb3VyY2VPd25lcklkIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHNvdXJjZUZpbGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVJdGVtKGl0ZW1UeXBlPzogSXRlbVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgc291cmNlVHlwZT86IEl0ZW1Tb3VyY2VUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCwgc291cmNlSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBzb3VyY2VPd25lcklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc291cmNlRmlsZT86IEZpbGVQYXJhbWV0ZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvaXRlbUNyZWF0b3I/XCI7XG4gICAgICAgIGlmIChpdGVtVHlwZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW1UeXBlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcIml0ZW1UeXBlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpdGVtVHlwZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgIT09IG51bGwgJiYgc291cmNlVHlwZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29udGVudF8uYXBwZW5kKFwic291cmNlVHlwZVwiLCBzb3VyY2VUeXBlLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc291cmNlSWQgIT09IG51bGwgJiYgc291cmNlSWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInNvdXJjZUlkXCIsIHNvdXJjZUlkLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc291cmNlT3duZXJJZCAhPT0gbnVsbCAmJiBzb3VyY2VPd25lcklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250ZW50Xy5hcHBlbmQoXCJzb3VyY2VPd25lcklkXCIsIHNvdXJjZU93bmVySWQudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChzb3VyY2VGaWxlICE9PSBudWxsICYmIHNvdXJjZUZpbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnRlbnRfLmFwcGVuZChcInNvdXJjZUZpbGVcIiwgc291cmNlRmlsZS5kYXRhLCBzb3VyY2VGaWxlLmZpbGVOYW1lID8gc291cmNlRmlsZS5maWxlTmFtZSA6IFwic291cmNlRmlsZVwiKTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVJdGVtKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlSXRlbSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlSXRlbShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkZvcmJpZGRlblwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcHJpdmF0ZSBkZXNpZ24gZnJvbSBhIHB1YmxpYyBkZXNpZ24uXG4gICAgICogQHBhcmFtIGRlc2lnbklkIChvcHRpb25hbCkgUHVibGljIGRlc2lnbiBJRC5cbiAgICAgKiBAcGFyYW0gcHJpdmF0ZURlc2lnbklkIChvcHRpb25hbCkgUHJpdmF0ZSBkZXNpZ24gSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVTdG9yYWdlT3duZXIgKG9wdGlvbmFsKSBQcml2YXRlIHN0b3JhZ2Ugb3duZXIgSUQuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihkZXNpZ25JZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVEZXNpZ25JZD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHByaXZhdGVTdG9yYWdlT3duZXI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9wcml2YXRlLWRlc2lnbnMvZnJvbS1kZXNpZ24/XCI7XG4gICAgICAgIGlmIChkZXNpZ25JZCAhPT0gdW5kZWZpbmVkICYmIGRlc2lnbklkICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImRlc2lnbklkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBkZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVEZXNpZ25JZCAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVEZXNpZ25JZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlRGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVEZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZU93bmVyICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21EZXNpZ24oPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDcmVhdGVQcml2YXRlRGVzaWduRnJvbURlc2lnbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcml2YXRlIGRlc2lnbiBmcm9tIGEgcHVibGljIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSByZXNvdXJjZUlkIChvcHRpb25hbCkgUmVzb3VyY2UgSUQuXG4gICAgICogQHBhcmFtIHByaXZhdGVEZXNpZ25JZCAob3B0aW9uYWwpIFByaXZhdGUgZGVzaWduIElELlxuICAgICAqIEBwYXJhbSBwcml2YXRlU3RvcmFnZU93bmVyIChvcHRpb25hbCkgUHJpdmF0ZSBzdG9yYWdlIG93bmVyIElELlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgY3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZShyZXNvdXJjZUlkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZURlc2lnbklkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcHJpdmF0ZVN0b3JhZ2VPd25lcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3ByaXZhdGUtZGVzaWducy9mcm9tLXJlc291cmNlP1wiO1xuICAgICAgICBpZiAocmVzb3VyY2VJZCAhPT0gdW5kZWZpbmVkICYmIHJlc291cmNlSWQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicmVzb3VyY2VJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVzb3VyY2VJZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVEZXNpZ25JZCAhPT0gdW5kZWZpbmVkICYmIHByaXZhdGVEZXNpZ25JZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJwcml2YXRlRGVzaWduSWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVEZXNpZ25JZCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHByaXZhdGVTdG9yYWdlT3duZXIgIT09IHVuZGVmaW5lZCAmJiBwcml2YXRlU3RvcmFnZU93bmVyICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInByaXZhdGVTdG9yYWdlT3duZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHByaXZhdGVTdG9yYWdlT3duZXIpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0NyZWF0ZVByaXZhdGVEZXNpZ25Gcm9tUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzQ3JlYXRlUHJpdmF0ZURlc2lnbkZyb21SZXNvdXJjZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJldmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkXG4gICAgKGRlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJykuXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFJlbmRlciBtb2RlbCB3aXRoIHByZXZpZXcgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZW5kZXJEZXNpZ25QcmV2aWV3KGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25QcmV2aWV3TW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvcmVuZGVyLWRlc2lnbi1wcmV2aWV3P1wiO1xuICAgICAgICBpZiAoYXR0YWNobWVudCAhPT0gdW5kZWZpbmVkICYmIGF0dGFjaG1lbnQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiYXR0YWNobWVudD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYXR0YWNobWVudCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlckRlc2lnblByZXZpZXcoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJEZXNpZ25QcmV2aWV3KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgYSBkZXNpZ24gcHJvb2Ygd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKG9wdGlvbmFsKSBJZiBzZXQgdG8gJ3RydWUnLCBmaWxlIHdpbGwgYmUgcHJvdmlkZWQgYXMgYW4gYXR0YWNobWVudCB3aXRoIHVuaXF1ZSBmaWxlbmFtZSBzdXBwbGllZFxuICAgIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBSZW5kZXIgbW9kZWwgd2l0aCBwcm9vZiBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlbmRlckRlc2lnblByb29mKGF0dGFjaG1lbnQ/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBSZW5kZXJEZXNpZ25Qcm9vZk1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3JlbmRlci1kZXNpZ24tcHJvb2Y/XCI7XG4gICAgICAgIGlmIChhdHRhY2htZW50ICE9PSB1bmRlZmluZWQgJiYgYXR0YWNobWVudCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJhdHRhY2htZW50PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBhdHRhY2htZW50KSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50SWQgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICd0ZW5hbnRJZCcgY2Fubm90IGJlIG51bGwuXCIpO1xuICAgICAgICBlbHNlIGlmICh0ZW5hbnRJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudElkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyB0ZW5hbnRJZCkgKyBcIiZcIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJEZXNpZ25Qcm9vZig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVuZGVyRGVzaWduUHJvb2YocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJGb3JiaWRkZW5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIHByb2R1Y3QgcHJvb2YgaW1hZ2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy5cbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAob3B0aW9uYWwpIElmIHNldCB0byAndHJ1ZScsIGZpbGUgd2lsbCBiZSBwcm92aWRlZCBhcyBhbiBhdHRhY2htZW50IHdpdGggdW5pcXVlIGZpbGVuYW1lIHN1cHBsaWVkIChkZWZhdWx0IHZhbHVlIGlzICdmYWxzZScpLlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBQcmV2aWV3IHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcmVuZGVyUHJvZHVjdChhdHRhY2htZW50PzogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogUmVuZGVyUHJvZHVjdE1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL3JlbmRlcmVyP1wiO1xuICAgICAgICBpZiAoYXR0YWNobWVudCAhPT0gdW5kZWZpbmVkICYmIGF0dGFjaG1lbnQgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiYXR0YWNobWVudD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYXR0YWNobWVudCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1JlbmRlclByb2R1Y3QoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZW5kZXJQcm9kdWN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZW5kZXJQcm9kdWN0KHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiRm9yYmlkZGVuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVzaWduQXRvbXNWaWV3ZXJBcGlDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjc3NGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBmb250cyhwc05hbWU6IHN0cmluZyB8IG51bGwsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmb250S2V5IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRDc3NGb250KGZvbnRLZXk/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW1hZ2VTaXplKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFNoYXBlQm91bmRzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFdhdGVybWFya0l0ZW1zKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGltZyhmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0TGljZW5zZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgcHRoKGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaW1hZ2UgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHJlc291cmNlKGltYWdlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHN2ZyhmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGYgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHR4dChmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQmFyY29kZUl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeUNvbG9yRGF0YSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUNvbG9yc1JlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBNdWx0aUNhbGxSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQ3VydmVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSW1hZ2VIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT47XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB1cGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55Pjtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25BdG9tc1ZpZXdlckFwaUNsaWVudCBleHRlbmRzIEFwaUNsaWVudEJhc2UgaW1wbGVtZW50cyBJRGVzaWduQXRvbXNWaWV3ZXJBcGlDbGllbnQge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpQ2xpZW50Q29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbjogQXBpQ2xpZW50Q29uZmlndXJhdGlvbiwgQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogdGhpcy5nZXRCYXNlVXJsKFwiXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBjc3NGb250cyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IEZvbnRzTWV0aG9kRGF0YSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9jc3Nmb250cz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NDc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0Nzc0ZvbnRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDc3NGb250cyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHN0cmluZz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGZvbnRzKHBzTmFtZTogc3RyaW5nIHwgbnVsbCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9mb250cy97cHNOYW1lfT9cIjtcbiAgICAgICAgaWYgKHBzTmFtZSA9PT0gdW5kZWZpbmVkIHx8IHBzTmFtZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3BzTmFtZScgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcIntwc05hbWV9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcHNOYW1lKSk7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzRm9udHMoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NGb250cyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRm9udHMocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZm9udEtleSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0Q3NzRm9udChmb250S2V5Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRDc3NGb250P1wiO1xuICAgICAgICBpZiAoZm9udEtleSAhPT0gdW5kZWZpbmVkICYmIGZvbnRLZXkgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZm9udEtleT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZm9udEtleSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0Q3NzRm9udCg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldENzc0ZvbnQoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldENzc0ZvbnQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SW1hZ2VTaXplKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0SW1hZ2VTaXplUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRJbWFnZVNpemU/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzR2V0SW1hZ2VTaXplKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxOdWxsQWJsZVNpemU+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRJbWFnZVNpemUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPE51bGxBYmxlU2l6ZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8TnVsbEFibGVTaXplPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxOdWxsQWJsZVNpemU+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGdldFNoYXBlQm91bmRzKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogR2V0U2hhcGVCb3VuZHNSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8UmVjdGFuZ2xlRj4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRTaGFwZUJvdW5kcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRTaGFwZUJvdW5kcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFNoYXBlQm91bmRzKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFJlY3RhbmdsZUY+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8UmVjdGFuZ2xlRj4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFNoYXBlQm91bmRzKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxSZWN0YW5nbGVGPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxSZWN0YW5nbGVGPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxSZWN0YW5nbGVGPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHBhcmFtIGJvZHkgKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRXYXRlcm1hcmtJdGVtcyh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9HZXRXYXRlcm1hcmtJdGVtcz9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldFdhdGVybWFya0l0ZW1zKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRXYXRlcm1hcmtJdGVtcyhyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB3IChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGggKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY215ayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSByZ2IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gZ3JheXNjYWxlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRhcmdldCAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBzcSAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBlZmZlY3QgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0ga3AgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gY29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gb2JtIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIG9vIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGFscGhhTWFzayAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSBwYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIGNvbG9yaXplQ29sb3IgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGltZyhmPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGg/OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjbXlrPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgcmdiPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZ3JheXNjYWxlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3E/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgZWZmZWN0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwga3A/OiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3I/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvYm0/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBvbz86IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGFscGhhTWFzaz86IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkLCBwYWdlPzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgY29sb3JpemVDb2xvcj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvaW1nP1wiO1xuICAgICAgICBpZiAoZiAhPT0gdW5kZWZpbmVkICYmIGYgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHcgIT09IHVuZGVmaW5lZCAmJiB3ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcInc9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHcpICsgXCImXCI7XG4gICAgICAgIGlmIChoICE9PSB1bmRlZmluZWQgJiYgaCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJoPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBoKSArIFwiJlwiO1xuICAgICAgICBpZiAoY215ayAhPT0gdW5kZWZpbmVkICYmIGNteWsgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiY215az1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgY215aykgKyBcIiZcIjtcbiAgICAgICAgaWYgKHJnYiAhPT0gdW5kZWZpbmVkICYmIHJnYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJyZ2I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJnYikgKyBcIiZcIjtcbiAgICAgICAgaWYgKGdyYXlzY2FsZSAhPT0gdW5kZWZpbmVkICYmIGdyYXlzY2FsZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJncmF5c2NhbGU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGdyYXlzY2FsZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0YXJnZXQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRhcmdldCkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHNxICE9PSB1bmRlZmluZWQgJiYgc3EgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwic3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHNxKSArIFwiJlwiO1xuICAgICAgICBpZiAoZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0ICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImVmZmVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZWZmZWN0KSArIFwiJlwiO1xuICAgICAgICBpZiAoa3AgIT09IHVuZGVmaW5lZCAmJiBrcCAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJrcD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsga3ApICsgXCImXCI7XG4gICAgICAgIGlmIChjb2xvciAhPT0gdW5kZWZpbmVkICYmIGNvbG9yICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImNvbG9yPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjb2xvcikgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9ibSAhPT0gdW5kZWZpbmVkICYmIG9ibSAhPT0gbnVsbClcbiAgICAgICAgICAgIHVybF8gKz0gXCJvYm09XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9ibSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKG9vICE9PSB1bmRlZmluZWQgJiYgb28gIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwib289XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIG9vKSArIFwiJlwiO1xuICAgICAgICBpZiAoYWxwaGFNYXNrICE9PSB1bmRlZmluZWQgJiYgYWxwaGFNYXNrICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImFscGhhTWFzaz1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgYWxwaGFNYXNrKSArIFwiJlwiO1xuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwicGFnZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcGFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKGNvbG9yaXplQ29sb3IgIT09IHVuZGVmaW5lZCAmJiBjb2xvcml6ZUNvbG9yICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImNvbG9yaXplQ29sb3I9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGNvbG9yaXplQ29sb3IpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0ltZyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzSW1nKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0TGljZW5zZSh0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL2xpY2Vuc2U/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc0dldExpY2Vuc2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NHZXRMaWNlbnNlKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NHZXRMaWNlbnNlKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPHN0cmluZz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8c3RyaW5nPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdGgoZj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvcHRoP1wiO1xuICAgICAgICBpZiAoZiAhPT0gdW5kZWZpbmVkICYmIGYgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUHRoKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NQdGgocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGltYWdlIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZXNvdXJjZShpbWFnZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvcmVzb3VyY2U/XCI7XG4gICAgICAgIGlmIChpbWFnZSAhPT0gdW5kZWZpbmVkICYmIGltYWdlICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImltYWdlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBpbWFnZSkgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzUmVzb3VyY2UoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NSZXNvdXJjZSg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVzb3VyY2UocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ0MDQgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgRm91bmRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDA0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEZpbGVSZXNwb25zZT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZiAob3B0aW9uYWwpIFxuICAgICAqIEBwYXJhbSB0ZW5hbnRJZCAob3B0aW9uYWwpIFRlbmFudCBpZGVudGlmaWVyXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgc3ZnKGY/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCB0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL3N2Zz9cIjtcbiAgICAgICAgaWYgKGYgIT09IHVuZGVmaW5lZCAmJiBmICE9PSBudWxsKVxuICAgICAgICAgICAgdXJsXyArPSBcImY9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIGYpICsgXCImXCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIHRyYW5zZm9ybWVkT3B0aW9uc18pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1N2Zyg8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8RmlsZVJlc3BvbnNlPj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU3ZnKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDYpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMgPyByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZU1hdGNoID0gY29udGVudERpc3Bvc2l0aW9uID8gL2ZpbGVuYW1lPVwiPyhbXlwiXSo/KVwiPyg7fCQpL2cuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlTmFtZU1hdGNoICYmIGZpbGVOYW1lTWF0Y2gubGVuZ3RoID4gMSA/IGZpbGVOYW1lTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZih7IGZpbGVOYW1lOiBmaWxlTmFtZSwgZGF0YTogPGFueT5yZXNwb25zZUJsb2IsIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBfaGVhZGVycyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJOb3QgTW9kaWZpZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwNDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDQwNCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBGb3VuZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ1MDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQ1MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxQcm9ibGVtRGV0YWlscz5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NTAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8RmlsZVJlc3BvbnNlPig8YW55Pm51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBmIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICB0eHQoZj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvdHh0P1wiO1xuICAgICAgICBpZiAoZiAhPT0gdW5kZWZpbmVkICYmIGYgIT09IG51bGwpXG4gICAgICAgICAgICB1cmxfICs9IFwiZj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgZikgKyBcIiZcIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlRnJvbSh0aGlzLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9uc18pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAodHJhbnNmb3JtZWRPcHRpb25zXyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJnZXRcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVHh0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxGaWxlUmVzcG9uc2U+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NUeHQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEZpbGVSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcG9uc2UuaGVhZGVycyA/IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC1kaXNwb3NpdGlvblwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24gPyAvZmlsZW5hbWU9XCI/KFteXCJdKj8pXCI/KDt8JCkvZy5leGVjKGNvbnRlbnREaXNwb3NpdGlvbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGVOYW1lTWF0Y2ggJiYgZmlsZU5hbWVNYXRjaC5sZW5ndGggPiAxID8gZmlsZU5hbWVNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBkYXRhOiA8YW55PnJlc3BvbnNlQmxvYiwgc3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IF9oZWFkZXJzIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIk5vdCBNb2RpZmllZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDA0OiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NDA0ID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiTm90IEZvdW5kXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwNCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxGaWxlUmVzcG9uc2U+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVBcmNoZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUFyY2hlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXI/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQXV0b1NjYWxlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUF1dG9TY2FsZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCYXJjb2RlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJhcmNvZGVJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXI/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUJvdW5kZWRUZXh0SXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUJ5Q29sb3JEYXRhKHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogVXBkYXRlQ29sb3JzUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVCeUNvbG9yRGF0YT9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVCeUNvbG9yRGF0YSg8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZUJ5Q29sb3JEYXRhKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHN0cmluZz4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxzdHJpbmc+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCeUNvbG9yRGF0YShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxzdHJpbmc+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHN0cmluZz4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KHRlbmFudElkPzogbnVtYmVyIHwgdW5kZWZpbmVkLCBib2R5PzogTXVsdGlDYWxsUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3Q/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlQnlNdWx0aUNhbGxSZXF1ZXN0KDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVCeU11bHRpQ2FsbFJlcXVlc3QocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRlbmFudElkIChvcHRpb25hbCkgVGVuYW50IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHVwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVDdXJ2ZWRUZXh0SXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZUN1cnZlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2VJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUltYWdlSGFuZGxlclJlcXVlc3QgfCBudWxsIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvYXRvbXMvdjEvY2N2aWV3ZXIvVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVJbWFnZUl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVXBkYXRlSW1hZ2VJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGF0aEJvdW5kZWRUZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBhdGhCb3VuZGVkVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQYXRoQm91bmRlZFRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlUGxhaW5UZXh0SXRlbUhhbmRsZXIodGVuYW50SWQ/OiBudW1iZXIgfCB1bmRlZmluZWQsIGJvZHk/OiBVcGRhdGVIYW5kbGVyUmVxdWVzdCB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9hdG9tcy92MS9jY3ZpZXdlci9VcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcj9cIjtcbiAgICAgICAgaWYgKHRlbmFudElkID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBhcmFtZXRlciAndGVuYW50SWQnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50SWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJ0ZW5hbnRJZD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdGVuYW50SWQpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZUZyb20odGhpcy50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnNfKSkucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKHRyYW5zZm9ybWVkT3B0aW9uc18gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCB0cmFuc2Zvcm1lZE9wdGlvbnNfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJlc3VsdCh1cmxfLCByZXNwb25zZV8sIChyKSA9PiB0aGlzLnByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVBsYWluVGV4dEl0ZW1IYW5kbGVyKDxhbnk+cikpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxhbnk+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NVcGRhdGVQbGFpblRleHRJdGVtSGFuZGxlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAoPGFueT5yZXNwb25zZSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKDxhbnk+cmVzcG9uc2UpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxhbnk+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NTAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0NTAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8UHJvYmxlbURldGFpbHM+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDUwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPGFueT4oPGFueT5udWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGVuYW50SWQgKG9wdGlvbmFsKSBUZW5hbnQgaWRlbnRpZmllclxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdXBkYXRlU2hhcGVJdGVtSGFuZGxlcih0ZW5hbnRJZD86IG51bWJlciB8IHVuZGVmaW5lZCwgYm9keT86IFVwZGF0ZUhhbmRsZXJSZXF1ZXN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL2F0b21zL3YxL2Njdmlld2VyL1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXI/XCI7XG4gICAgICAgIGlmICh0ZW5hbnRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudElkJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKHRlbmFudElkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwidGVuYW50SWQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudElkKSArIFwiJlwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVGcm9tKHRoaXMudHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zXykpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCh0cmFuc2Zvcm1lZE9wdGlvbnNfID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgdHJhbnNmb3JtZWRPcHRpb25zXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1SZXN1bHQodXJsXywgcmVzcG9uc2VfLCAocikgPT4gdGhpcy5wcm9jZXNzVXBkYXRlU2hhcGVJdGVtSGFuZGxlcig8YW55PnIpKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtUmVzdWx0KHVybF8sIHJlc3BvbnNlXywgKHIpID0+IHRoaXMucHJvY2Vzc1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXIoPGFueT5yKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8YW55Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPGFueT4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1VwZGF0ZVNoYXBlSXRlbUhhbmRsZXIocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8YW55PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDUwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc3VsdDUwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFByb2JsZW1EZXRhaWxzPkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkludGVybmFsIHNlcnZlciBlcnJvclwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ1MDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxhbnk+KDxhbnk+bnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1EZXRhaWxzIHtcbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICBkZXRhaWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGluc3RhbmNlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEluZm9ybWF0aW9uIGFib3V0IGEgc2VydmljZSAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEluZm9Nb2RlbCB7XG4gICAgLyoqIFZlcnNpb24gbnVtYmVyICovXG4gICAgdmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIEJ1aWxkIGRhdGUgKFVUQykgKi9cbiAgICBidWlsZERhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIChEZWJ1ZyB8IFJlbGVhc2UpICovXG4gICAgY29uZmlndXJhdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFNlcnZpY2UgbmFtZSAqL1xuICAgIGFwcE5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvbnRzTWV0aG9kRGF0YSB7XG4gICAgcmVxdWVzdGVkRm9udHNCeVBzTmFtZT86IHN0cmluZ1tdIHwgbnVsbDtcbiAgICBhZHZhbmNlZE1vZGU/OiBib29sZWFuO1xuICAgIGJhc2VVcmw/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEltYWdlU2l6ZVJlcXVlc3Qge1xuICAgIGltYWdlSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIHBhZ2VJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOdWxsQWJsZVNpemUge1xuICAgIHdpZHRoPzogbnVtYmVyIHwgbnVsbDtcbiAgICBoZWlnaHQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFNoYXBlQm91bmRzUmVxdWVzdCB7XG4gICAgcGF0aD86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnRGIHtcbiAgICByZWFkb25seSBpc0VtcHR5PzogYm9vbGVhbjtcbiAgICB4PzogbnVtYmVyO1xuICAgIHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdGFuZ2xlRiB7XG4gICAgbG9jYXRpb24/OiBQb2ludEY7XG4gICAgc2l6ZT86IHN0cmluZztcbiAgICB4PzogbnVtYmVyO1xuICAgIHk/OiBudW1iZXI7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGxlZnQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgdG9wPzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHJpZ2h0PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGJvdHRvbT86IG51bWJlcjtcbiAgICByZWFkb25seSBpc0VtcHR5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVIYW5kbGVyUmVxdWVzdCB7XG4gICAgY2FudmFzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbUhhbmRsZXJEYXRhPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpdGVtRGF0YT86IGFueSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ29sb3JzUmVxdWVzdCB7XG4gICAgY2FudmFzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgY29sb3JEYXRhPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aUNhbGxSZXF1ZXN0SXRlbSB7XG4gICAgY2FudmFzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbUhhbmRsZXJzRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgY29sb3JEYXRhPzogc3RyaW5nIHwgbnVsbDtcbiAgICBhY3R1YWxTaXplPzogYm9vbGVhbiB8IG51bGw7XG4gICAgcHJlc2VydmVBc3BlY3RSYXRpbz86IGJvb2xlYW4gfCBudWxsO1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG4gICAgaW1hZ2VJZD86IHN0cmluZyB8IG51bGw7XG4gICAgcGFnZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICBtZXRob2ROYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBpdGVtRGF0YT86IGFueSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlDYWxsUmVxdWVzdCB7XG4gICAgaXRlbXM/OiBNdWx0aUNhbGxSZXF1ZXN0SXRlbVtdIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbWFnZUhhbmRsZXJSZXF1ZXN0IHtcbiAgICBhY3R1YWxTaXplPzogYm9vbGVhbjtcbiAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPzogYm9vbGVhbjtcbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIGNhbnZhc0RhdGE/OiBzdHJpbmcgfCBudWxsO1xuICAgIGl0ZW1IYW5kbGVyRGF0YT86IHN0cmluZyB8IG51bGw7XG4gICAgaXRlbURhdGE/OiBhbnkgfCBudWxsO1xufVxuXG4vKiogUHJvZHVjdCBwcmV2aWV3IGZpbGUgZm9ybWF0LiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFByZXZpZXdGb3JtYXQge1xuICAgIEpwZWcgPSBcIkpwZWdcIixcbiAgICBQbmcgPSBcIlBuZ1wiLFxuICAgIFRpZmYgPSBcIlRpZmZcIixcbiAgICBQZGYgPSBcIlBkZlwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckltYWdlUHJldmlld01vZGVsIHtcbiAgICAvKiogRXh0ZXJuYWwgaW1hZ2UgVVJMLiAqL1xuICAgIGltYWdlVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogSGVpZ2h0IG9mIHByZXZpZXcgaW1hZ2UuICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKiBXaWR0aCBvZiBwcmV2aWV3IGltYWdlLiAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKiBPdXRwdXQgaW1hZ2UgZm9ybWF0LiBQTkcgYnkgZGVmYXVsdC4gKi9cbiAgICBmaWxlRm9ybWF0PzogUHJvZHVjdFByZXZpZXdGb3JtYXQgfCBudWxsO1xufVxuXG4vKiogQ29udmVydCBjb2xvcnMgb3BlcmF0aW9uIHBhcmFtZXRlcnMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydENvbG9yc01vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBjb2xvciBkZXNjcmlwdGlvbiAqL1xuICAgIGNvbG9yczogYW55W107XG4gICAgLyoqIFNvdXJjZSBjb2xvciBwcm9maWxlIGRlc2NyaXB0aW9uICovXG4gICAgc291cmNlQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogRGVzdGluYXRpb24gY29sb3IgcHJvZmlsZSBkZXNjcmlwdGlvbiAqL1xuICAgIGRlc3RpbmF0aW9uQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVGFyZ2VudCBjb2xvciBwcm9maWxlIGRlc2NyaXB0aW9uICovXG4gICAgdGFyZ2V0RGV2aWNlQ29sb3JQcm9maWxlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIERlc2lnbiBjcmVhdGlvbiBwYXJhbWV0ZXJzICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZURlc2lnbk1vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCBwcm9kdWN0IGRlc2NyaXB0aW9uICovXG4gICAgcHJvZHVjdD86IGFueSB8IG51bGw7XG4gICAgLyoqIFNlcmlhbGl6ZWQgcHJvZHVjdCBkYXRhIHNjaGVtYSAoYmFzZTY0IGZpbGUgc3RyZWFtKSAqL1xuICAgIGRhdGFTY2hlbWE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gbmFtZSAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBEZXNpZ24gbG9jYXRpb24gKGZvbGRlciBwYXRoKSAqL1xuICAgIHBhdGg/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2lnbkluZm8ge1xuICAgIGlkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGVudW0gRGVzaWduRWxlbWVudFR5cGUge1xuICAgIFByb2R1Y3QgPSBcIlByb2R1Y3RcIixcbiAgICBEZXNpZ24gPSBcIkRlc2lnblwiLFxuICAgIFN1cmZhY2UgPSBcIlN1cmZhY2VcIixcbiAgICBDb250YWluZXIgPSBcIkNvbnRhaW5lclwiLFxuICAgIFByaW50QXJlYSA9IFwiUHJpbnRBcmVhXCIsXG4gICAgSXRlbSA9IFwiSXRlbVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pc3NpbmdEZXNpZ25FbGVtZW50RHRvIHtcbiAgICAvKiogUHJvYmxlbSBkZXNjcmlwdGlvbi4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1pc3NpbmcgZWxlbWVudCB0eXBlLiAqL1xuICAgIHJlYWRvbmx5IG1pc3NpbmdFbGVtZW50VHlwZT86IERlc2lnbkVsZW1lbnRUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVucHJvY2Vzc2FibGVEZXNpZ25FbGVtZW50RHRvIHtcbiAgICAvKiogUHJvYmxlbSBkZXNjcmlwdGlvbi4gKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIE1pc3NpbmcgZWxlbWVudCB0eXBlLiAqL1xuICAgIHJlYWRvbmx5IG1pc3NpbmdFbGVtZW50VHlwZT86IERlc2lnbkVsZW1lbnRUeXBlO1xufVxuXG4vKiogQXZhaWxhYmxlIHBhdGNoIHR5cGUuICovXG5leHBvcnQgZW51bSBQcm9kdWN0UGF0Y2hUeXBlIHtcbiAgICBVbmRlZmluZWQgPSBcIlVuZGVmaW5lZFwiLFxuICAgIFJlcGxhY2VJbWFnZUl0ZW1GaWxlID0gXCJSZXBsYWNlSW1hZ2VJdGVtRmlsZVwiLFxuICAgIFJlcGxhY2VQbGFjZWhvbGRlckl0ZW1Db250ZW50ID0gXCJSZXBsYWNlUGxhY2Vob2xkZXJJdGVtQ29udGVudFwiLFxufVxuXG4vKiogUGxhY2Vob2xkZXIgaXRlbSBjb250ZW50IHR5cGUuICovXG5leHBvcnQgZW51bSBQbGFjZWhvbGRlckl0ZW1Db250ZW50VHlwZSB7XG4gICAgSW1hZ2UgPSBcIkltYWdlXCIsXG59XG5cbi8qKiBWYXJpYWJsZSBpbmZvcm1hdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVJbmZvIHtcbiAgICAvKiogVmFyaWFibGUgbmFtZS4gKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogVmFyaWFibGUgdmFsdWUuICovXG4gICAgdmFsdWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiBWYXJpYWJsZSB0eXBlLiAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogVmFyaWFibGVzIGluZm9ybWF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhYmxlc01vZGVsIHtcbiAgICAvKiogTGlzdCBvZiB2YXJpYWJsZXMgKi9cbiAgICBpdGVtcz86IFZhcmlhYmxlSW5mb1tdIHwgbnVsbDtcbn1cblxuLyoqIFZhcmlhYmxlIGRhdGEgcHJpbnRpbmcgaW5mb3JtYXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmRwRGF0YU1vZGVsIHtcbiAgICAvKiogU2VyaWFsaXplZCB2ZHAgZGF0YXNldCAqL1xuICAgIHZkcERhdGFTZXQ/OiBhbnkgfCBudWxsO1xuICAgIC8qKiBTZXJpYWxpemVkIHZkcCBpdGVtcyBkYXRhICovXG4gICAgdmRwSXRlbXNEYXRhPzogYW55IHwgbnVsbDtcbn1cblxuZXhwb3J0IGVudW0gSXRlbVR5cGUge1xuICAgIEltYWdlID0gXCJJbWFnZVwiLFxuICAgIFNoYXBlID0gXCJTaGFwZVwiLFxuICAgIENsaXBhcnQgPSBcIkNsaXBhcnRcIixcbiAgICBHcm91cCA9IFwiR3JvdXBcIixcbn1cblxuLyoqIEl0ZW0gc291Y2UgdHlwZXMgKi9cbmV4cG9ydCBlbnVtIEl0ZW1Tb3VyY2VUeXBlIHtcbiAgICBGaWxlID0gXCJGaWxlXCIsXG4gICAgSW1hZ2VTdG9yYWdlID0gXCJJbWFnZVN0b3JhZ2VcIixcbiAgICBQcml2YXRlSW1hZ2VTdG9yYWdlID0gXCJQcml2YXRlSW1hZ2VTdG9yYWdlXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFByZXZpZXdSZW5kZXJpbmdDb25maWcge1xuICAgIHN1cmZhY2VJbmRleD86IG51bWJlciB8IG51bGw7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIGZpbGVGb3JtYXQ/OiBQcm9kdWN0UHJldmlld0Zvcm1hdCB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyRGVzaWduUHJldmlld01vZGVsIHtcbiAgICAvKiogRGVzaWduIElELlxuVXNlZCB0byBnZXQgZGVzaWduIGZpbGUgZnJvbSBwdWJsaWMgb3IgcHJpdmF0ZSBzdG9yYWdlLiAqL1xuICAgIGRlc2lnbklkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKiogTW9ja3VwIElELlxuVXNlZCB0byBnZXQgbW9ja3VwIGZpbGUgZnJvbSBwdWJsaWMgc3RvcmFnZS4gKi9cbiAgICBtb2NrdXBJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElEIG9mIHRoZSBkZXNpZ24gb3duZXIuICovXG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJldmlldyBvZiBkZXNpZ24uICovXG4gICAgcmVuZGVyaW5nQ29uZmlnPzogUHJvZHVjdFByZXZpZXdSZW5kZXJpbmdDb25maWcgfCBudWxsO1xuICAgIC8qKiBWYXJpYWJsZSAodXNlcikgZGF0YSBmb3IgZGVzaWduIHZhcmlhYmxlIGZpZWxkcyBpbiB0aGUgcHJldmlldyBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbmV4cG9ydCBlbnVtIFByb2R1Y3RQcm9vZkZvcm1hdCB7XG4gICAgSnBlZyA9IFwiSnBlZ1wiLFxuICAgIFBuZyA9IFwiUG5nXCIsXG4gICAgVGlmZiA9IFwiVGlmZlwiLFxuICAgIFBkZiA9IFwiUGRmXCIsXG59XG5cbmV4cG9ydCBlbnVtIFByb2R1Y3RQcm9vZkludGVycG9sYXRpb25Nb2RlIHtcbiAgICBIaWdoID0gXCJIaWdoXCIsXG4gICAgTWVkaXVtID0gXCJNZWRpdW1cIixcbiAgICBMb3cgPSBcIkxvd1wiLFxuICAgIE5lYXJlc3ROZWlnaGJvdXIgPSBcIk5lYXJlc3ROZWlnaGJvdXJcIixcbiAgICBMaW5lYXIgPSBcIkxpbmVhclwiLFxuICAgIEN1YmljID0gXCJDdWJpY1wiLFxuICAgIFN1cGVyc2FtcGxpbmcgPSBcIlN1cGVyc2FtcGxpbmdcIixcbiAgICBMYW5jem9zID0gXCJMYW5jem9zXCIsXG4gICAgQW5pc290cm9waWM0ID0gXCJBbmlzb3Ryb3BpYzRcIixcbiAgICBBbmlzb3Ryb3BpYzkgPSBcIkFuaXNvdHJvcGljOVwiLFxuICAgIExhbmN6b3MzID0gXCJMYW5jem9zM1wiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB7XG4gICAgLyoqIFN1cmZhY2UgdG8gcmVuZGVyICovXG4gICAgc3VyZmFjZUluZGV4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSB3aWR0aCAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGhlaWdodCAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKiogRGVzaXJlZCBwcm9vZiBpbWFnZSBmb3JtYXQgKi9cbiAgICBmb3JtYXQ/OiBQcm9kdWN0UHJvb2ZGb3JtYXQgfCBudWxsO1xuICAgIC8qKiBEZXNpcmVkIHByb29mIGltYWdlIGludGVycG9sYXRpb24gKi9cbiAgICBpbnRlcnBvbGF0aW9uTW9kZT86IFByb2R1Y3RQcm9vZkludGVycG9sYXRpb25Nb2RlIHwgbnVsbDtcbiAgICAvKiogRGVmaW5lcyB3aGV0aGVyIHNhZmV0eSBsaW5lcyBzaG91bGQgYmUgdmlzdWFsaXplZCAqL1xuICAgIHNhZmV0eUxpbmVzRW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKiBEZWZpbmVzIHdoZXRoZXIgd2F0ZXJtYXJrIHNob3VsZCBiZSBpbmNsdWRlZCAqL1xuICAgIHdhdGVybWFya0VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKiogRGVmaW5lcyB3YXRlcm1hcmsgb3BhY2l0eSAoaW4gcmFuZ2UgMCAuLiAxLjApICovXG4gICAgd2F0ZXJtYXJrT3BhY2l0eT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqIERlZmluZXMgd2hldGhlciB3YXRlcm1hcmsgc2hvdWxkIGJlIHJlcGVhdGVkICovXG4gICAgd2F0ZXJtYXJrUmVwZWF0PzogYm9vbGVhbiB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyRGVzaWduUHJvb2ZNb2RlbCB7XG4gICAgLyoqIERlc2lnbiBJRC5cblVzZWQgdG8gZ2V0IGRlc2lnbiBmaWxlIGZyb20gcHVibGljIG9yIHByaXZhdGUgc3RvcmFnZS4gKi9cbiAgICBkZXNpZ25JZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIElEIG9mIHRoZSBkZXNpZ24gb3duZXIuICovXG4gICAgb3duZXJJZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqIFJlbmRlcmluZyBjb25maWd1cmF0aW9uIGZvciBnZXR0aW5nIGEgcHJvb2YgaW1hZ2Ugb2YgZGVzaWduLiAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG4gICAgLyoqIFZhcmlhYmxlICh1c2VyKSBkYXRhIGZvciBkZXNpZ24gdmFyaWFibGUgZmllbGRzIGluIHRoZSBwcm9vZiBpbWFnZS4gKi9cbiAgICB2YXJpYWJsZURhdGE/OiBWYXJpYWJsZUluZm9bXSB8IG51bGw7XG59XG5cbi8qKiBSZW5kZXIgcHJvZHVjdCBwYXJhbWV0ZXJzICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclByb2R1Y3RNb2RlbCB7XG4gICAgLyoqIFNlcmlhbGl6ZWQgcHJvZHVjdCBkZXNjcmlwdGlvbiAqL1xuICAgIHByb2R1Y3Q6IGFueTtcbiAgICAvKiogUHJvb2YgSW1hZ2UgcmVuZGVyaW5nIGNvbmZpZyAqL1xuICAgIHJlbmRlcmluZ0NvbmZpZz86IFByb2R1Y3RQcm9vZlJlbmRlcmluZ0NvbmZpZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhcmFtZXRlciB7XG4gICAgZGF0YTogYW55O1xuICAgIGZpbGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlc3BvbnNlIHtcbiAgICBkYXRhOiBCbG9iO1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIGZpbGVOYW1lPzogc3RyaW5nO1xuICAgIGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgcmVzcG9uc2U6IHN0cmluZztcbiAgICBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcbiAgICByZXN1bHQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ6IGFueSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0FwaUV4Y2VwdGlvbiA9IHRydWU7XG5cbiAgICBzdGF0aWMgaXNBcGlFeGNlcHRpb24ob2JqOiBhbnkpOiBvYmogaXMgQXBpRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG9iai5pc0FwaUV4Y2VwdGlvbiA9PT0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3VsdCk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhuZXcgQXBpRXhjZXB0aW9uKG1lc3NhZ2UsIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnMsIG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYmxvYlRvVGV4dChibG9iOiBhbnkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxzdHJpbmc+KChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmICghYmxvYikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcIlwiKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgoPGFueT5ldmVudC50YXJnZXQpLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChibG9iKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSJdfQ==
|