@techextensor/tab-sdk 0.0.6 → 0.0.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.
@@ -1,9 +1,11 @@
1
1
  import { inject, Injectable } from '@angular/core';
2
- import { MediaUploadHelper } from '@techextensor/tab-core-utility';
2
+ import { ApiService, MediaUploadHelper } from '@techextensor/tab-core-utility';
3
3
  import { firstValueFrom } from 'rxjs';
4
+ import { TabSdk } from '../tab-sdk.service';
4
5
  import * as i0 from "@angular/core";
5
6
  export class FileService {
6
7
  _mediaUploadHelper = inject(MediaUploadHelper);
8
+ apiService = inject(ApiService);
7
9
  /**
8
10
  * Uploads media files using the provided payload and optional headers.
9
11
  *
@@ -29,6 +31,47 @@ export class FileService {
29
31
  // Return the response from the server
30
32
  return response;
31
33
  }
34
+ /**
35
+ * Processes an FTP URL and returns a processed URL.
36
+ *
37
+ * @param params - The parameters containing data, an optional defaultHeader, and an optional imgElement.
38
+ * @returns A promise that resolves to the processed URL or null if an error occurs.
39
+ */
40
+ async processFtpUrl(params) {
41
+ // Return null if the data is invalid
42
+ if (!params?.data || params?.data === 'null' || params?.data === 'undefined')
43
+ return null;
44
+ try {
45
+ let url = params.data;
46
+ // Extract the value from a JSON string if it contains 'value'
47
+ if (url?.includes('value')) {
48
+ url = JSON.parse(url).value;
49
+ }
50
+ // Check if the URL is an image from the FileManager service
51
+ if (url.includes('FileManager/GetImage')) {
52
+ const options = { responseType: 'blob' };
53
+ // Add default headers if specified
54
+ if (params.defaultHeader) {
55
+ options.headers = TabSdk.util?.getDefaultAppHeaders();
56
+ }
57
+ // Fetch the image as a blob
58
+ const blob = await firstValueFrom(this.apiService.getByUrl(url, options));
59
+ // Create an object URL from the blob
60
+ url = URL.createObjectURL(blob);
61
+ }
62
+ // Set the image element's source to the processed URL
63
+ if (params.imgElement) {
64
+ params.imgElement.src = url;
65
+ params.imgElement.onload = null;
66
+ }
67
+ return url;
68
+ }
69
+ catch (e) {
70
+ // Log any errors that occur during processing
71
+ console.error("Error processing FTP", e);
72
+ return null;
73
+ }
74
+ }
32
75
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
33
76
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileService, providedIn: 'root' });
34
77
  }
@@ -38,4 +81,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
38
81
  providedIn: 'root'
39
82
  }]
40
83
  }] });
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL2FwcC9maWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFxQixpQkFBaUIsRUFBMkIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUt0QyxNQUFNLE9BQU8sV0FBVztJQUNaLGtCQUFrQixHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUUxRTs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBZ0MsRUFBRSxPQUFhO1FBQ2xFLDhFQUE4RTtRQUM5RSxNQUFNLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FDN0QsQ0FBQztRQUNGLHNDQUFzQztRQUN0QyxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQWU7UUFDakMsOEVBQThFO1FBQzlFLE1BQU0sUUFBUSxHQUFHLE1BQU0sY0FBYyxDQUNqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUNuRCxDQUFDO1FBQ0Ysc0NBQXNDO1FBQ3RDLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7d0dBaENRLFdBQVc7NEdBQVgsV0FBVyxjQUZSLE1BQU07OzRGQUVULFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSwgTWVkaWFVcGxvYWRIZWxwZXIsIFVwbG9hZE1lZGlhRmlsZXNQYXlsb2FkIH0gZnJvbSAnQHRlY2hleHRlbnNvci90YWItY29yZS11dGlsaXR5JztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgX21lZGlhVXBsb2FkSGVscGVyOiBNZWRpYVVwbG9hZEhlbHBlciA9IGluamVjdChNZWRpYVVwbG9hZEhlbHBlcik7XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIG1lZGlhIGZpbGVzIHVzaW5nIHRoZSBwcm92aWRlZCBwYXlsb2FkIGFuZCBvcHRpb25hbCBoZWFkZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBheWxvYWQgVGhlIHBheWxvYWQgY29udGFpbmluZyB0aGUgbWVkaWEgZmlsZXMgdG8gdXBsb2FkLlxuICAgICAqIEBwYXJhbSBoZWFkZXJzIE9wdGlvbmFsIGhlYWRlcnMgdG8gcGFzcyB0byB0aGUgc2VydmVyLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgY29tbW9uIEFQSSByZXNwb25zZS5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRNZWRpYUZpbGVzKHBheWxvYWQ6IFVwbG9hZE1lZGlhRmlsZXNQYXlsb2FkLCBoZWFkZXJzPzogYW55KTogUHJvbWlzZTxDb21tb25BcGlSZXNwb25zZT4ge1xuICAgICAgICAvLyBVc2UgdGhlIGZpcnN0VmFsdWVGcm9tIFJ4SnMgb3BlcmF0b3IgdG8gd2FpdCBmb3IgdGhlIG9ic2VydmFibGUgdG8gY29tcGxldGVcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICAgIHRoaXMuX21lZGlhVXBsb2FkSGVscGVyLnVwbG9hZE1lZGlhRmlsZXMocGF5bG9hZCwgaGVhZGVycylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBtZWRpYSBmaWxlIGZyb20gdGhlIHNlcnZlciB1c2luZyB0aGUgcHJvdmlkZWQgbWVkaWEgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgSUQgb2YgdGhlIG1lZGlhIGZpbGUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgY29tbW9uIEFQSSByZXNwb25zZS5cbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVNZWRpYUZpbGUobWVkaWFJZDogc3RyaW5nKTogUHJvbWlzZTxDb21tb25BcGlSZXNwb25zZT4ge1xuICAgICAgICAvLyBVc2UgdGhlIGZpcnN0VmFsdWVGcm9tIFJ4SnMgb3BlcmF0b3IgdG8gd2FpdCBmb3IgdGhlIG9ic2VydmFibGUgdG8gY29tcGxldGVcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICAgIHRoaXMuX21lZGlhVXBsb2FkSGVscGVyLnJlbW92ZU1lZGlhRmlsZShtZWRpYUlkKVxuICAgICAgICApO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxufSJdfQ==
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL2FwcC9maWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBcUIsaUJBQWlCLEVBQTJCLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBSzVDLE1BQU0sT0FBTyxXQUFXO0lBQ1osa0JBQWtCLEdBQXNCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xFLFVBQVUsR0FBZSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFcEQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWdDLEVBQUUsT0FBYTtRQUNsRSw4RUFBOEU7UUFDOUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxjQUFjLENBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQzdELENBQUM7UUFDRixzQ0FBc0M7UUFDdEMsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFlO1FBQ2pDLDhFQUE4RTtRQUM5RSxNQUFNLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FDbkQsQ0FBQztRQUNGLHNDQUFzQztRQUN0QyxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQWdGO1FBQ2hHLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsSUFBSSxLQUFLLE1BQU0sSUFBSSxNQUFNLEVBQUUsSUFBSSxLQUFLLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUxRixJQUFJLENBQUM7WUFDRCxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBRXRCLDhEQUE4RDtZQUM5RCxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2hDLENBQUM7WUFFRCw0REFBNEQ7WUFDNUQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxPQUFPLEdBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBRTlDLG1DQUFtQztnQkFDbkMsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3ZCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxDQUFDO2dCQUMxRCxDQUFDO2dCQUVELDRCQUE0QjtnQkFDNUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBRTFFLHFDQUFxQztnQkFDckMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUVELHNEQUFzRDtZQUN0RCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO2dCQUM1QixNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDcEMsQ0FBQztZQUVELE9BQU8sR0FBRyxDQUFDO1FBRWYsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCw4Q0FBOEM7WUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQzt3R0FsRlEsV0FBVzs0R0FBWCxXQUFXLGNBRlIsTUFBTTs7NEZBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwaVNlcnZpY2UsIENvbW1vbkFwaVJlc3BvbnNlLCBNZWRpYVVwbG9hZEhlbHBlciwgVXBsb2FkTWVkaWFGaWxlc1BheWxvYWQgfSBmcm9tICdAdGVjaGV4dGVuc29yL3RhYi1jb3JlLXV0aWxpdHknO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYlNkayB9IGZyb20gJy4uL3RhYi1zZGsuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgX21lZGlhVXBsb2FkSGVscGVyOiBNZWRpYVVwbG9hZEhlbHBlciA9IGluamVjdChNZWRpYVVwbG9hZEhlbHBlcik7XG4gICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBBcGlTZXJ2aWNlID0gaW5qZWN0KEFwaVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyBtZWRpYSBmaWxlcyB1c2luZyB0aGUgcHJvdmlkZWQgcGF5bG9hZCBhbmQgb3B0aW9uYWwgaGVhZGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIG1lZGlhIGZpbGVzIHRvIHVwbG9hZC5cbiAgICAgKiBAcGFyYW0gaGVhZGVycyBPcHRpb25hbCBoZWFkZXJzIHRvIHBhc3MgdG8gdGhlIHNlcnZlci5cbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGNvbW1vbiBBUEkgcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkTWVkaWFGaWxlcyhwYXlsb2FkOiBVcGxvYWRNZWRpYUZpbGVzUGF5bG9hZCwgaGVhZGVycz86IGFueSk6IFByb21pc2U8Q29tbW9uQXBpUmVzcG9uc2U+IHtcbiAgICAgICAgLy8gVXNlIHRoZSBmaXJzdFZhbHVlRnJvbSBSeEpzIG9wZXJhdG9yIHRvIHdhaXQgZm9yIHRoZSBvYnNlcnZhYmxlIHRvIGNvbXBsZXRlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLl9tZWRpYVVwbG9hZEhlbHBlci51cGxvYWRNZWRpYUZpbGVzKHBheWxvYWQsIGhlYWRlcnMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIFJldHVybiB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgbWVkaWEgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIHByb3ZpZGVkIG1lZGlhIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lZGlhSWQgVGhlIElEIG9mIHRoZSBtZWRpYSBmaWxlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGNvbW1vbiBBUEkgcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlTWVkaWFGaWxlKG1lZGlhSWQ6IHN0cmluZyk6IFByb21pc2U8Q29tbW9uQXBpUmVzcG9uc2U+IHtcbiAgICAgICAgLy8gVXNlIHRoZSBmaXJzdFZhbHVlRnJvbSBSeEpzIG9wZXJhdG9yIHRvIHdhaXQgZm9yIHRoZSBvYnNlcnZhYmxlIHRvIGNvbXBsZXRlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLl9tZWRpYVVwbG9hZEhlbHBlci5yZW1vdmVNZWRpYUZpbGUobWVkaWFJZClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBGVFAgVVJMIGFuZCByZXR1cm5zIGEgcHJvY2Vzc2VkIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBjb250YWluaW5nIGRhdGEsIGFuIG9wdGlvbmFsIGRlZmF1bHRIZWFkZXIsIGFuZCBhbiBvcHRpb25hbCBpbWdFbGVtZW50LlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcm9jZXNzZWQgVVJMIG9yIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3NGdHBVcmwocGFyYW1zOiB7IGRhdGE6IHN0cmluZywgZGVmYXVsdEhlYWRlcj86IGJvb2xlYW4sIGltZ0VsZW1lbnQ/OiBIVE1MSW1hZ2VFbGVtZW50IH0pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGUgZGF0YSBpcyBpbnZhbGlkXG4gICAgICAgIGlmICghcGFyYW1zPy5kYXRhIHx8IHBhcmFtcz8uZGF0YSA9PT0gJ251bGwnIHx8IHBhcmFtcz8uZGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdXJsID0gcGFyYW1zLmRhdGE7XG5cbiAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gYSBKU09OIHN0cmluZyBpZiBpdCBjb250YWlucyAndmFsdWUnXG4gICAgICAgICAgICBpZiAodXJsPy5pbmNsdWRlcygndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHVybCA9IEpTT04ucGFyc2UodXJsKS52YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFVSTCBpcyBhbiBpbWFnZSBmcm9tIHRoZSBGaWxlTWFuYWdlciBzZXJ2aWNlXG4gICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCdGaWxlTWFuYWdlci9HZXRJbWFnZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0geyByZXNwb25zZVR5cGU6ICdibG9iJyB9O1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGRlZmF1bHQgaGVhZGVycyBpZiBzcGVjaWZpZWRcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmRlZmF1bHRIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gVGFiU2RrLnV0aWw/LmdldERlZmF1bHRBcHBIZWFkZXJzKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGltYWdlIGFzIGEgYmxvYlxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmFwaVNlcnZpY2UuZ2V0QnlVcmwodXJsLCBvcHRpb25zKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gb2JqZWN0IFVSTCBmcm9tIHRoZSBibG9iXG4gICAgICAgICAgICAgICAgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBpbWFnZSBlbGVtZW50J3Mgc291cmNlIHRvIHRoZSBwcm9jZXNzZWQgVVJMXG4gICAgICAgICAgICBpZiAocGFyYW1zLmltZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMuaW1nRWxlbWVudC5zcmMgPSB1cmw7XG4gICAgICAgICAgICAgICAgcGFyYW1zLmltZ0VsZW1lbnQub25sb2FkID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybDtcblxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBMb2cgYW55IGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcHJvY2Vzc2luZyBGVFBcIiwgZSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL2ludGVyZmFjZS91aS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNjcmVlbkRpc3BsYXlNb2RlIH0gZnJvbSBcIi4uL2VudW0vdWkuZW51bVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VTY3JlZW5PcHRpb25zIHtcbiAgc2NyZWVuSWQ6IHN0cmluZztcbiAgcmVxdG9rZW5zPzogYW55O1xuICBzdWJtaXNzaW9uPzogYW55O1xuICB0aXRsZT86IHN0cmluZztcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbiAgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XG4gIHJlZnJlc2hlcj86ICgpID0+IHZvaWQ7XG4gIGNsb3Nlcj86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuT3Blbk9wdGlvbnMgZXh0ZW5kcyBCYXNlU2NyZWVuT3B0aW9ucyB7XG4gIG1vZGU6IFNjcmVlbkRpc3BsYXlNb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hdmlnYXRpb25PcHRpb25zIHtcbiAgc2NyZWVuSWQ6IHN0cmluZztcbiAgcmVxdG9rZW5zPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0ZVRvU3ViZG9tYWluT3B0aW9ucyB7XG4gIHN1YkRvbWFpbjogc3RyaW5nO1xuICBhcHBDb2RlOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xufSJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL2ludGVyZmFjZS91aS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNjcmVlbkRpc3BsYXlNb2RlIH0gZnJvbSBcIi4uL2VudW0vdWkuZW51bVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VTY3JlZW5PcHRpb25zIHtcbiAgc2NyZWVuSWQ6IHN0cmluZztcbiAgcmVxdG9rZW5zPzogYW55O1xuICBzdWJtaXNzaW9uPzogYW55O1xuICB0aXRsZT86IHN0cmluZztcbiAgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGhlaWdodD86IHN0cmluZyB8IG51bWJlcjtcbiAgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XG4gIHJlZnJlc2hlcj86ICgpID0+IHZvaWQ7XG4gIGNsb3Nlcj86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuT3Blbk9wdGlvbnMgZXh0ZW5kcyBCYXNlU2NyZWVuT3B0aW9ucyB7XG4gIG1vZGU6IFNjcmVlbkRpc3BsYXlNb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hdmlnYXRpb25PcHRpb25zIHtcbiAgc2NyZWVuSWQ6IHN0cmluZztcbiAgcmVxdG9rZW5zPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0ZVRvU3ViZG9tYWluT3B0aW9ucyB7XG4gIHN1YkRvbWFpbjogc3RyaW5nO1xuICBhcHBDb2RlOiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn0iXX0=
@@ -70,6 +70,34 @@ export class StoreService {
70
70
  // Save the updated organization info back to storage
71
71
  this.setOrgInfo(orgInfo);
72
72
  }
73
+ /**
74
+ * Retrieves the locale settings from the organization info.
75
+ *
76
+ * @returns The locale settings if they exist, otherwise `null`.
77
+ */
78
+ get orgLocaleSettings() {
79
+ // Retrieve the locale settings from the organization info
80
+ let localSettings = this.getOrgInfo()?.LocaleSettings;
81
+ // If the locale settings are a string, parse them as JSON
82
+ if (typeof localSettings === 'string') {
83
+ localSettings = JSON.parse(localSettings);
84
+ }
85
+ // Return the locale settings
86
+ return localSettings;
87
+ }
88
+ /**
89
+ * Sets the locale settings in the organization info.
90
+ *
91
+ * @param value - The locale settings to set.
92
+ */
93
+ set orgLocaleSettings(value) {
94
+ // Retrieve the existing organization info or initialize a new object
95
+ const orgInfo = this.getOrgInfo() || {};
96
+ // Update the locale settings value
97
+ orgInfo.LocaleSettings = value;
98
+ // Save the updated organization info back to storage
99
+ this.setOrgInfo(orgInfo);
100
+ }
73
101
  /**
74
102
  * Retrieves the app ID from the app info.
75
103
  *
@@ -716,4 +744,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
716
744
  providedIn: 'root'
717
745
  }]
718
746
  }] });
719
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYi1zZGsvc3JjL2xpYi9zdG9yZS9zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFLakQsTUFBTSxPQUFPLFlBQVk7SUFDSixvQkFBb0IsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDeEUsc0JBQXNCLEdBQTBCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRS9GOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksUUFBUSxDQUFDLEtBQW9CO1FBQzdCLHFFQUFxRTtRQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRXhDLDZCQUE2QjtRQUM3QixPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUVuQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFVBQVU7UUFDViw4Q0FBOEM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxDLDZEQUE2RDtRQUM3RCxPQUFPLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVE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QUFDLHNCQUFzQixDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDdEQsQ0FBQztJQUNMLENBQUM7d0dBcHhCUSxZQUFZOzRHQUFaLFlBQVksY0FGVCxNQUFNOzs0RkFFVCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSwgU2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLCBTdG9yYWdlQ29uc3RhbnRzIH0gZnJvbSAnQHRlY2hleHRlbnNvci90YWItY29yZS11dGlsaXR5JztcbmltcG9ydCB7IFN0b3JhZ2VUeXBlIH0gZnJvbSAnLi4vZW51bS9zdG9yZS5lbnVtJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTdG9yZVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvY2FsU3RvcmFnZVNlcnZpY2U6IExvY2FsU3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoTG9jYWxTdG9yYWdlU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlOiBTZXNzaW9uU3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoU2Vzc2lvblN0b3JhZ2VTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdGVuYW50IElEIGZyb20gdGhlIGxvY2FsIHN0b3JhZ2UuXG4gICAgICovXG4gICAgZ2V0IHRlbmFudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPcmdJbmZvKCk/LklkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGVuYW50IElEIGluIHRoZSBvcmdhbml6YXRpb24gaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGVuYW50IElEIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgdGVuYW50SWQodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGV4aXN0aW5nIG9yZ2FuaXphdGlvbiBpbmZvIG9yIGluaXRpYWxpemUgYSBuZXcgb2JqZWN0XG4gICAgICAgIGNvbnN0IG9yZ0luZm8gPSB0aGlzLmdldE9yZ0luZm8oKSB8fCB7fTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHRlbmFudCBJRCB2YWx1ZVxuICAgICAgICBvcmdJbmZvLklkID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBvcmdhbml6YXRpb24gaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRPcmdJbmZvKG9yZ0luZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdGVuYW50IG5hbWUgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm8uXG4gICAgICovXG4gICAgZ2V0IHRlbmFudE5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBvcmdhbml6YXRpb24gaW5mbyBmcm9tIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3JnSW5mbyA9IHRoaXMuZ2V0T3JnSW5mbygpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgdGVuYW50IG5hbWUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGxcbiAgICAgICAgcmV0dXJuIG9yZ0luZm8/Lk9yZ2FuaXphdGlvbk5hbWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0ZW5hbnQgbmFtZSBpbiB0aGUgb3JnYW5pemF0aW9uIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHRlbmFudCBuYW1lIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgdGVuYW50TmFtZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3Rpbmcgb3JnYW5pemF0aW9uIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3Qgb3JnSW5mbyA9IHRoaXMuZ2V0T3JnSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgb3JnYW5pemF0aW9uIG5hbWUgdmFsdWVcbiAgICAgICAgb3JnSW5mby5Pcmdhbml6YXRpb25OYW1lID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBvcmdhbml6YXRpb24gaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRPcmdJbmZvKG9yZ0luZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc3ViZG9tYWluIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBzdWJkb21haW4gaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCBzdWJkb21haW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBvcmdhbml6YXRpb24gaW5mbyBmcm9tIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3JnSW5mbyA9IHRoaXMuZ2V0T3JnSW5mbygpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgc3ViZG9tYWluIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybiBudWxsXG4gICAgICAgIHJldHVybiBvcmdJbmZvPy5TdWJkb21haW4gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdWJkb21haW4gaW4gdGhlIG9yZ2FuaXphdGlvbiBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzdWJkb21haW4gdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCBzdWJkb21haW4odmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGV4aXN0aW5nIG9yZ2FuaXphdGlvbiBpbmZvIG9yIGluaXRpYWxpemUgYSBuZXcgb2JqZWN0XG4gICAgICAgIGNvbnN0IG9yZ0luZm8gPSB0aGlzLmdldE9yZ0luZm8oKSB8fCB7fTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHN1YmRvbWFpbiB2YWx1ZVxuICAgICAgICBvcmdJbmZvLlN1YmRvbWFpbiA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgb3JnYW5pemF0aW9uIGluZm8gYmFjayB0byBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0T3JnSW5mbyhvcmdJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFwcCBJRCBmcm9tIHRoZSBhcHAgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgYXBwIElEIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGBudWxsYC5cbiAgICAgKi9cbiAgICBnZXQgYXBwSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFwcEluZm8oKT8uSWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhcHAgSUQgaW4gdGhlIGFwcCBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhcHAgSUQgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCBhcHBJZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgYXBwIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgYXBwSW5mbyA9IHRoaXMuZ2V0QXBwSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYXBwIElEIHZhbHVlXG4gICAgICAgIGFwcEluZm8uSWQgPSB2YWx1ZTtcblxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGFwcCBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldEFwcEluZm8oYXBwSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBhcHAgbmFtZSBmcm9tIHRoZSBhcHAgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgYXBwIG5hbWUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCBhcHBOYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSBhcHAgbmFtZSBmcm9tIHRoZSBhcHAgaW5mbywgb3IgcmV0dXJuIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBJbmZvKCk/LkFwcE5hbWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhcHAgbmFtZSBpbiB0aGUgYXBwIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFwcCBuYW1lIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgYXBwTmFtZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgYXBwIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgYXBwSW5mbyA9IHRoaXMuZ2V0QXBwSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYXBwIG5hbWUgdmFsdWVcbiAgICAgICAgYXBwSW5mby5BcHBOYW1lID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBhcHAgaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRBcHBJbmZvKGFwcEluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZW52aXJvbm1lbnQgSUQgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgZW52aXJvbm1lbnQgSUQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCBlbnZpcm9ubWVudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSBlbnZpcm9ubWVudCBJRCBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVudmlyb25tZW50SW5mbygpPy5JZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGVudmlyb25tZW50IElEIGluIHRoZSBlbnZpcm9ubWVudCBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBlbnZpcm9ubWVudCBJRCB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IGVudmlyb25tZW50SWQodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGV4aXN0aW5nIGVudmlyb25tZW50IGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgZW52aXJvbm1lbnRJbmZvID0gdGhpcy5nZXRFbnZpcm9ubWVudEluZm8oKSB8fCB7fTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGVudmlyb25tZW50IElEIHZhbHVlXG4gICAgICAgIGVudmlyb25tZW50SW5mby5JZCA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRFbnZpcm9ubWVudEluZm8oZW52aXJvbm1lbnRJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVudmlyb25tZW50IG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgZW52aXJvbm1lbnQgbmFtZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IGVudmlyb25tZW50TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgYW5kIHJldHVybiB0aGUgZW52aXJvbm1lbnQgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVudmlyb25tZW50SW5mbygpPy5OYW1lIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZW52aXJvbm1lbnQgbmFtZSBpbiB0aGUgZW52aXJvbm1lbnQgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgZW52aXJvbm1lbnQgbmFtZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IGVudmlyb25tZW50TmFtZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgZW52aXJvbm1lbnQgaW5mbyBvciBpbml0aWFsaXplIGEgbmV3IG9iamVjdFxuICAgICAgICBjb25zdCBlbnZpcm9ubWVudEluZm8gPSB0aGlzLmdldEVudmlyb25tZW50SW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZW52aXJvbm1lbnQgbmFtZSB2YWx1ZVxuICAgICAgICBlbnZpcm9ubWVudEluZm8uTmFtZSA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRFbnZpcm9ubWVudEluZm8oZW52aXJvbm1lbnRJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHRva2VuIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGBudWxsYC5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIGFuZCByZXR1cm4gdGhlIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8sIG9yIHJldHVybiBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5JbmZvKCk/LnRva2VuIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdG9rZW4gaW4gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHRva2VuIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgdG9rZW4odmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGV4aXN0aW5nIHRva2VuIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgdG9rZW5JbmZvID0gdGhpcy5nZXRUb2tlbkluZm8oKSB8fCB7fTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHRva2VuIHZhbHVlXG4gICAgICAgIHRva2VuSW5mby50b2tlbiA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgdG9rZW4gaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRUb2tlbkluZm8odG9rZW5JbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHJlZnJlc2ggdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVmcmVzaCB0b2tlbiBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IHJlZnJlc2hUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgYW5kIHJldHVybiB0aGUgcmVmcmVzaCB0b2tlbiBmcm9tIHRoZSB0b2tlbiBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuSW5mbygpPy5yZWZyZXNoVG9rZW4gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZWZyZXNoIHRva2VuIGluIHRoZSB0b2tlbiBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSByZWZyZXNoIHRva2VuIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgcmVmcmVzaFRva2VuKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBleGlzdGluZyB0b2tlbiBpbmZvIG9yIGluaXRpYWxpemUgYSBuZXcgb2JqZWN0XG4gICAgICAgIGNvbnN0IHRva2VuSW5mbyA9IHRoaXMuZ2V0VG9rZW5JbmZvKCkgfHwge307XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSByZWZyZXNoIHRva2VuIHZhbHVlXG4gICAgICAgIHRva2VuSW5mby5yZWZyZXNoVG9rZW4gPSB2YWx1ZTtcblxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIHRva2VuIGluZm8gYmFjayB0byBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9rZW5JbmZvKHRva2VuSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSByZWZyZXNoIHRva2VuIGV4cGlyeSB0aW1lIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHJlZnJlc2ggdG9rZW4gZXhwaXJ5IHRpbWUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCByZWZyZXNoVG9rZW5FeHBpcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIGFuZCByZXR1cm4gdGhlIHJlZnJlc2ggdG9rZW4gZXhwaXJ5IHRpbWUgZnJvbSB0aGUgdG9rZW4gaW5mbyxcbiAgICAgICAgLy8gb3IgcmV0dXJuIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkluZm8oKT8ucmVmcmVzaFRva2VuRXhwaXJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZSBpbiB0aGUgdG9rZW4gaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHJlZnJlc2hUb2tlbkV4cGlyeSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgdG9rZW4gaW5mbyBvciBpbml0aWFsaXplIGEgbmV3IG9iamVjdFxuICAgICAgICBjb25zdCB0b2tlbkluZm8gPSB0aGlzLmdldFRva2VuSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZVxuICAgICAgICB0b2tlbkluZm8ucmVmcmVzaFRva2VuRXhwaXJ5ID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCB0b2tlbiBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRva2VuSW5mbyh0b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc3RhdGljIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHN0YXRpYyB0b2tlbiBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IHN0YXRpY1Rva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSBzdGF0aWMgdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mbyxcbiAgICAgICAgLy8gb3IgcmV0dXJuIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkluZm8oKT8uc3RhdGljVG9rZW4gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGF0aWMgdG9rZW4gaW4gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0YXRpYyB0b2tlbiB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHN0YXRpY1Rva2VuKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBleGlzdGluZyB0b2tlbiBpbmZvIG9yIGluaXRpYWxpemUgYSBuZXcgb2JqZWN0XG4gICAgICAgIGNvbnN0IHRva2VuSW5mbyA9IHRoaXMuZ2V0VG9rZW5JbmZvKCkgfHwge307XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGF0aWMgdG9rZW4gdmFsdWVcbiAgICAgICAgdG9rZW5JbmZvLnN0YXRpY1Rva2VuID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCB0b2tlbiBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRva2VuSW5mbyh0b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdXNlciBJRCBmcm9tIHRoZSB1c2VyIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHVzZXIgSUQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCB1c2VySWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIGFuZCByZXR1cm4gdGhlIHVzZXIgSUQgZnJvbSB0aGUgdXNlciBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldFVzZXJJbmZvKCk/LnVzZXI/LklkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSB1c2VyJ3Mgcm9sZXMgZnJvbSB0aGUgdXNlciBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1c2VyIHJvbGVzIGlmIHRoZXkgZXhpc3QsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IHVzZXJSb2xlcygpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSB1c2VyIHJvbGVzIGZyb20gdGhlIHVzZXIgaW5mbywgb3IgcmV0dXJuIG51bGwgaWYgdGhleSBkb24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRVc2VySW5mbygpPy51c2VyPy5Sb2xlcyB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdXNlcidzIHRlYW1zIGZyb20gdGhlIHVzZXIgaW5mb3JtYXRpb24uXG4gICAgICogXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdXNlciB0ZWFtcyBpZiB0aGV5IGV4aXN0LCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCB1c2VyVGVhbXMoKTogYW55W10gfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgYW5kIHJldHVybiB0aGUgdXNlciB0ZWFtcyBmcm9tIHRoZSB1c2VyIGluZm8sIG9yIHJldHVybiBudWxsIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlckluZm8oKT8udXNlcj8uVGVhbXMgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB0ZW5hbnQgSUQgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHJlbW92ZVRlbmFudElkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21PcmdJbmZvKCdJZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHRlbmFudCBuYW1lIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICByZW1vdmVUZW5hbnROYW1lKCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHRlbmFudCBuYW1lIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLnJlbW92ZUZyb21PcmdJbmZvKCdPcmdhbml6YXRpb25OYW1lJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc3ViZG9tYWluIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHN1YmRvbWFpbiBwcm9wZXJ0eSBmcm9tIHRoZSBvcmdhbml6YXRpb24gaW5mb3JtYXRpb25cbiAgICAgKiBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVTdWJkb21haW4oKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc3ViZG9tYWluIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLnJlbW92ZUZyb21PcmdJbmZvKCdTdWJkb21haW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhcHAgSUQgZnJvbSB0aGUgYXBwIGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgYXBwIElEIHByb3BlcnR5IGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVBcHBJZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tQXBwSW5mbygnSWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhcHAgbmFtZSBmcm9tIHRoZSBhcHAgaW5mb3JtYXRpb24uXG4gICAgICogXG4gICAgICogVGhpcyByZW1vdmVzIHRoZSBhcHAgbmFtZSBwcm9wZXJ0eSBmcm9tIHRoZSBhcHAgaW5mb3JtYXRpb24gc3RvcmVkIGluIGxvY2FsIHN0b3JhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlQXBwTmFtZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tQXBwSW5mbygnQXBwTmFtZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGVudmlyb25tZW50IElEIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgSUQgcHJvcGVydHkgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVFbnZpcm9ubWVudElkKCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGVudmlyb25tZW50IElEIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUVudmlyb25tZW50SW5mbygnSWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBlbnZpcm9ubWVudCBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgTmFtZSBwcm9wZXJ0eSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvblxuICAgICAqIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZUVudmlyb25tZW50TmFtZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBlbnZpcm9ubWVudCBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUVudmlyb25tZW50SW5mbygnTmFtZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogVGhpcyByZW1vdmVzIHRoZSB0b2tlbiBwcm9wZXJ0eSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlVG9rZW4oKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mb1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21Ub2tlbkluZm8oJ3Rva2VuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcmVmcmVzaCB0b2tlbiBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHJlZnJlc2ggdG9rZW4gcHJvcGVydHkgZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb24gc3RvcmVkIGluIHNlc3Npb25cbiAgICAgKiBzdG9yYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZVJlZnJlc2hUb2tlbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tVG9rZW5JbmZvKCdyZWZyZXNoVG9rZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSByZWZyZXNoIHRva2VuIGV4cGlyeSB0aW1lIGZyb20gdGhlIHRva2VuIGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZSBwcm9wZXJ0eSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlUmVmcmVzaFRva2VuRXhwaXJ5KCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlZnJlc2ggdG9rZW4gZXhwaXJ5IGZyb20gdGhlIHRva2VuIGluZm9cbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tVG9rZW5JbmZvKCdyZWZyZXNoVG9rZW5FeHBpcnknKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzdGF0aWMgdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb24uXG4gICAgICogXG4gICAgICogVGhpcyByZW1vdmVzIHRoZSBzdGF0aWMgdG9rZW4gcHJvcGVydHkgZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb24gc3RvcmVkIGluIHNlc3Npb25cbiAgICAgKiBzdG9yYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZVN0YXRpY1Rva2VuKCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YXRpYyB0b2tlbiBmcm9tIHRoZSB0b2tlbiBpbmZvXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVRva2VuSW5mbygnc3RhdGljVG9rZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZW1vdmUgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlRnJvbU9yZ0luZm8oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3JnSW5mbyA9IHRoaXMuZ2V0T3JnSW5mbygpO1xuICAgICAgICBpZiAob3JnSW5mbykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uXG4gICAgICAgICAgICBkZWxldGUgb3JnSW5mb1trZXldO1xuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBvcmdhbml6YXRpb24gaW5mb3JtYXRpb24gYmFjayB0byBsb2NhbCBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLnNldE9yZ0luZm8ob3JnSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgYXBwIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBzZXNzaW9uXG4gICAgICogc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gcmVtb3ZlIGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21BcHBJbmZvKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFwcEluZm8gPSB0aGlzLmdldEFwcEluZm8oKTtcbiAgICAgICAgaWYgKGFwcEluZm8pIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvblxuICAgICAgICAgICAgZGVsZXRlIGFwcEluZm9ba2V5XTtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgYXBwIGluZm9ybWF0aW9uIGJhY2sgdG8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLnNldEFwcEluZm8oYXBwSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHJlbW92ZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21FbnZpcm9ubWVudEluZm8oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW52aXJvbm1lbnRJbmZvID0gdGhpcy5nZXRFbnZpcm9ubWVudEluZm8oKTtcbiAgICAgICAgaWYgKGVudmlyb25tZW50SW5mbykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGRlbGV0ZSBlbnZpcm9ubWVudEluZm9ba2V5XTtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gYmFjayB0byBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMuc2V0RW52aXJvbm1lbnRJbmZvKGVudmlyb25tZW50SW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIHRva2VuIGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHJlbW92ZSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21Ub2tlbkluZm8oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9rZW5JbmZvID0gdGhpcy5nZXRUb2tlbkluZm8oKTtcbiAgICAgICAgaWYgKHRva2VuSW5mbykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGRlbGV0ZSB0b2tlbkluZm9ba2V5XTtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgdG9rZW4gaW5mb3JtYXRpb24gYmFjayB0byBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMuc2V0VG9rZW5JbmZvKHRva2VuSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiBvYmplY3Qgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIGdldE9yZ0luZm8oKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIFN0b3JhZ2VDb25zdGFudHMub3JnSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiB0byBsb2NhbCBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcmdJbmZvIC0gVGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRPcmdJbmZvKG9yZ0luZm86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyB0ZW1wIG9uY2UgcmVtb3ZlIGZyb20gZHJvcGRvd24sIHdlIGNhbiByZW1vdmUgdGhpc1xuICAgICAgICBpZiAob3JnSW5mby5JZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTZXNzaW9uKFN0b3JhZ2VDb25zdGFudHMuVGVuYW50SWQsIG9yZ0luZm8uSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTZXNzaW9uKFN0b3JhZ2VDb25zdGFudHMuVGVuYW50SWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgb3JnYW5pemF0aW9uIGluZm8gdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRvU3RvcmFnZShTdG9yYWdlVHlwZS5Mb2NhbCwgU3RvcmFnZUNvbnN0YW50cy5vcmdJbmZvLCBvcmdJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFwcCBpbmZvcm1hdGlvbiBmcm9tIHNlc3Npb24gc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgYXBwIGluZm9ybWF0aW9uIG9iamVjdCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgZ2V0QXBwSW5mbygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tU3RvcmFnZShTdG9yYWdlVHlwZS5TZXNzaW9uLCBTdG9yYWdlQ29uc3RhbnRzLmFwcEluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSBhcHAgaW5mb3JtYXRpb24gdG8gc2Vzc2lvbiBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcHBJbmZvIC0gVGhlIGFwcCBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRBcHBJbmZvKGFwcEluZm86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyB0ZW1wIG9uY2UgcmVtb3ZlIGZyb20gZHJvcGRvd24sIHdlIGNhbiByZW1vdmUgdGhpc1xuICAgICAgICBpZiAoYXBwSW5mbz8uSWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLkFwcElkLCBhcHBJbmZvLklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLkFwcElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcHBJbmZvPy5BcHBOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlc3Npb24oU3RvcmFnZUNvbnN0YW50cy5hcHBsaWNhdGlvbkNvZGUsIGFwcEluZm8uQXBwTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNlc3Npb24oU3RvcmFnZUNvbnN0YW50cy5hcHBsaWNhdGlvbkNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgYXBwIGluZm8gdG8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIFN0b3JhZ2VDb25zdGFudHMuYXBwSW5mbywgYXBwSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiBmcm9tIHNlc3Npb24gc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gb2JqZWN0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRFbnZpcm9ubWVudEluZm8oKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwgU3RvcmFnZUNvbnN0YW50cy5lbnZpcm9ubWVudEluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiB0byBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGVudkluZm8gLSBUaGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gdG8gc3RvcmUuXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnRJbmZvKGVudkluZm86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBTYXZlIHRoZSBlbnZpcm9ubWVudCBpbmZvIHRvIHNlc3Npb24gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRvU3RvcmFnZShTdG9yYWdlVHlwZS5TZXNzaW9uLCBTdG9yYWdlQ29uc3RhbnRzLmVudmlyb25tZW50SW5mbywgZW52SW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBmcm9tIHNlc3Npb24gc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgdG9rZW4gaW5mb3JtYXRpb24gb2JqZWN0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRUb2tlbkluZm8oKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwgU3RvcmFnZUNvbnN0YW50cy50b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiB0byBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIHRva2VuSW5mbyAtIFRoZSB0b2tlbiBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRUb2tlbkluZm8odG9rZW5JbmZvOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gdGVtcCBvbmNlIHJlbW92ZSBmcm9tIGRyb3Bkb3duLCB3ZSBjYW4gcmVtb3ZlIHRoaXNcbiAgICAgICAgaWYgKHRva2VuSW5mbz8udG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLnRva2VuLCB0b2tlbkluZm8/LnRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLnRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNhdmUgdGhlIHRva2VuIGluZm8gdG8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIFN0b3JhZ2VDb25zdGFudHMudG9rZW5JbmZvLCB0b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHVzZXIgaW5mb3JtYXRpb24gb2JqZWN0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRVc2VySW5mbygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tU3RvcmFnZShTdG9yYWdlVHlwZS5Mb2NhbCwgU3RvcmFnZUNvbnN0YW50cy51c2VySW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBpbiBsb2NhbCBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB1c2VySW5mbyBUaGUgdXNlciBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRVc2VySW5mbyh1c2VySW5mbzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFNhdmUgdGhlIHVzZXIgaW5mbyB0byBsb2NhbCBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9TdG9yYWdlKFN0b3JhZ2VUeXBlLkxvY2FsLCBTdG9yYWdlQ29uc3RhbnRzLnVzZXJJbmZvLCB1c2VySW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGtleS12YWx1ZSBwYWlyIGluIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHN0b3JlIHRoZSB2YWx1ZSB1bmRlci5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdmFsdWUgdG8gc3RvcmUuXG4gICAgICovXG4gICAgc2V0TG9jYWwoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFRvU3RvcmFnZShTdG9yYWdlVHlwZS5Mb2NhbCwga2V5LCBkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIGxvY2FsIHN0b3JhZ2UgYnkga2V5LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIHRvIHJldHJpZXZlLlxuICAgICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZSwgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIGdldExvY2FsKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICovXG4gICAgcmVtb3ZlTG9jYWwoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBsb2NhbCBzdG9yYWdlIGRhdGEuXG4gICAgICovXG4gICAgY2xlYXJMb2NhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBrZXktdmFsdWUgcGFpciBpbiBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHN0b3JlIHRoZSB2YWx1ZSB1bmRlci5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdmFsdWUgdG8gc3RvcmUuXG4gICAgICovXG4gICAgc2V0U2Vzc2lvbihrZXk6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFNhdmUgZGF0YSB0byBzZXNzaW9uIHN0b3JhZ2UgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXlcbiAgICAgICAgdGhpcy5zZXRUb1N0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwga2V5LCBkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHNlc3Npb24gc3RvcmFnZSBieSBrZXkuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgdG8gcmV0cmlldmUuXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIHN0b3JlZCBpbiBzZXNzaW9uIHN0b3JhZ2UsIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRTZXNzaW9uKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIGZyb20gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHJldHVybiB0aGlzLmdldEZyb21TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gc2Vzc2lvbiBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKi9cbiAgICByZW1vdmVTZXNzaW9uKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHNlc3Npb24gc3RvcmFnZSBkYXRhLlxuICAgICAqL1xuICAgIGNsZWFyU2Vzc2lvbigpOiB2b2lkIHtcbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBrZXktdmFsdWUgcGFpcnMgZnJvbSBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBhdXRoZW50aWNhdGlvbi1yZWxhdGVkIGRhdGEgZnJvbSBsb2NhbCBhbmQgc2Vzc2lvbiBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGFmdGVyIGEgdXNlciBsb2dzIG91dC5cbiAgICAgKi9cbiAgICBjbGVhckF1dGgoKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB1c2VyIGluZm8gZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIFN0b3JhZ2VDb25zdGFudHMudXNlckluZm8pO1xuICAgICAgICAvLyBSZW1vdmUgdG9rZW4gaW5mbyBmcm9tIHNlc3Npb24gc3RvcmFnZVxuICAgICAgICB0aGlzLnJlbW92ZUZyb21TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIFN0b3JhZ2VDb25zdGFudHMudG9rZW5JbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmljIGdldHRlciBtZXRob2QgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIGVpdGhlciBsb2NhbCBvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHR5cGUgb2Ygc3RvcmFnZSB0byByZXRyaWV2ZSBmcm9tLlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdG8gcmV0cmlldmUuXG4gICAgICogQHJldHVybnMgVGhlIHJldHJpZXZlZCBkYXRhLCBkZXNlcmlhbGl6ZWQgZnJvbSBKU09OIGlmIGl0IHdhcyBzdG9yZWQgYXMgYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRGcm9tU3RvcmFnZShzdG9yYWdlOiBTdG9yYWdlVHlwZSwga2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RvcmFnZVxuICAgICAgICBjb25zdCBkYXRhID0gc3RvcmFnZSA9PT0gU3RvcmFnZVR5cGUuTG9jYWxcbiAgICAgICAgICAgID8gdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5nZXRMb2NhbFN0b3JhZ2Uoa2V5KVxuICAgICAgICAgICAgOiB0aGlzLl9zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvblN0b3JhZ2Uoa2V5KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBwYXJzZSB0aGUgZGF0YSBhcyBKU09OXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGE7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBkYXRhIGNhbm5vdCBiZSBwYXJzZWQsIHJldHVybiBpdCBhcyBpc1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIHNwZWNpZmllZCBzdG9yYWdlIHR5cGUuXG4gICAgICogXG4gICAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHR5cGUgb2Ygc3RvcmFnZSB0byB1c2UgKGxvY2FsIG9yIHNlc3Npb24pLlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB1bmRlciB3aGljaCB0aGUgZGF0YSBzaG91bGQgYmUgc3RvcmVkLlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHN0b3JlLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0VG9TdG9yYWdlKHN0b3JhZ2U6IFN0b3JhZ2VUeXBlLCBrZXk6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdG9yYWdlIHR5cGUgaXMgbG9jYWxcbiAgICAgICAgaWYgKHN0b3JhZ2UgPT09IFN0b3JhZ2VUeXBlLkxvY2FsKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIGRhdGEgaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5zZXRMb2NhbFN0b3JhZ2Uoa2V5LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHRoZSBkYXRhIGluIHNlc3Npb24gc3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25TdG9yYWdlKGtleSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgc3BlY2lmaWVkIHN0b3JhZ2UgdHlwZS5cbiAgICAgKiBcbiAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBnaXZlbiBrZXkgZnJvbSBlaXRoZXIgbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlIFxuICAgICAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgc3RvcmFnZSB0eXBlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBzdG9yYWdlIFRoZSB0eXBlIG9mIHN0b3JhZ2UgdG8gcmVtb3ZlIGZyb20gKGxvY2FsIG9yIHNlc3Npb24pLlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21TdG9yYWdlKHN0b3JhZ2U6IFN0b3JhZ2VUeXBlLCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoc3RvcmFnZSA9PT0gU3RvcmFnZVR5cGUuTG9jYWwpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gbG9jYWwgc3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVMb2NhbFN0b3JhZ2Uoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uU3RvcmFnZVNlcnZpY2UucmVtb3ZlU2Vzc2lvblN0b3JhZ2Uoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwga2V5LXZhbHVlIHBhaXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdG9yYWdlIHR5cGUuXG4gICAgICogXG4gICAgICogVGhpcyBtZXRob2QgY2xlYXJzIGFsbCBrZXktdmFsdWUgcGFpcnMgZnJvbSBlaXRoZXIgbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlXG4gICAgICogYmFzZWQgb24gdGhlIHNwZWNpZmllZCBzdG9yYWdlIHR5cGUuXG4gICAgICogXG4gICAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHR5cGUgb2Ygc3RvcmFnZSB0byBjbGVhciAobG9jYWwgb3Igc2Vzc2lvbikuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbGVhclN0b3JhZ2Uoc3RvcmFnZTogU3RvcmFnZVR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHN0b3JhZ2UgPT09IFN0b3JhZ2VUeXBlLkxvY2FsKSB7XG4gICAgICAgICAgICAvLyBDbGVhciBsb2NhbCBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlLmNsZWFyTG9jYWxTdG9yYWdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDbGVhciBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb25TdG9yYWdlU2VydmljZS5jbGVhclNlc3Npb25TdG9yYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG59Il19
747
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYi1zZGsvc3JjL2xpYi9zdG9yZS9zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFLakQsTUFBTSxPQUFPLFlBQVk7SUFDSixvQkFBb0IsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDeEUsc0JBQXNCLEdBQTBCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRS9GOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksUUFBUSxDQUFDLEtBQW9CO1FBQzdCLHFFQUFxRTtRQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRXhDLDZCQUE2QjtRQUM3QixPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUVuQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFVBQVU7UUFDViw4Q0FBOEM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxDLDZEQUE2RDtRQUM3RCxPQUFPLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVE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QztRQUM3RCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssaUJBQWlCLENBQUMsT0FBb0IsRUFBRSxHQUFXO1FBQ3ZELElBQUksT0FBTyxLQUFLLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQyxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7YUFBTSxDQUFDO1lBQ0osc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxZQUFZLENBQUMsT0FBb0I7UUFDckMsSUFBSSxPQUFPLEtBQUssV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hDLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNKLHdCQUF3QjtZQUN4QixJQUFJLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN0RCxDQUFDO0lBQ0wsQ0FBQzt3R0F0ekJRLFlBQVk7NEdBQVosWUFBWSxjQUZULE1BQU07OzRGQUVULFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlLCBTZXNzaW9uU3RvcmFnZVNlcnZpY2UsIFN0b3JhZ2VDb25zdGFudHMgfSBmcm9tICdAdGVjaGV4dGVuc29yL3RhYi1jb3JlLXV0aWxpdHknO1xuaW1wb3J0IHsgU3RvcmFnZVR5cGUgfSBmcm9tICcuLi9lbnVtL3N0b3JlLmVudW0nO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0b3JlU2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9jYWxTdG9yYWdlU2VydmljZTogTG9jYWxTdG9yYWdlU2VydmljZSA9IGluamVjdChMb2NhbFN0b3JhZ2VTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zZXNzaW9uU3RvcmFnZVNlcnZpY2U6IFNlc3Npb25TdG9yYWdlU2VydmljZSA9IGluamVjdChTZXNzaW9uU3RvcmFnZVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSB0ZW5hbnQgSUQgZnJvbSB0aGUgbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICBnZXQgdGVuYW50SWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9yZ0luZm8oKT8uSWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0ZW5hbnQgSUQgaW4gdGhlIG9yZ2FuaXphdGlvbiBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0ZW5hbnQgSUQgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCB0ZW5hbnRJZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3Rpbmcgb3JnYW5pemF0aW9uIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3Qgb3JnSW5mbyA9IHRoaXMuZ2V0T3JnSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdGVuYW50IElEIHZhbHVlXG4gICAgICAgIG9yZ0luZm8uSWQgPSB2YWx1ZTtcblxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIG9yZ2FuaXphdGlvbiBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldE9yZ0luZm8ob3JnSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSB0ZW5hbnQgbmFtZSBmcm9tIHRoZSBvcmdhbml6YXRpb24gaW5mby5cbiAgICAgKi9cbiAgICBnZXQgdGVuYW50TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIG9yZ2FuaXphdGlvbiBpbmZvIGZyb20gc3RvcmFnZVxuICAgICAgICBjb25zdCBvcmdJbmZvID0gdGhpcy5nZXRPcmdJbmZvKCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB0ZW5hbnQgbmFtZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gbnVsbFxuICAgICAgICByZXR1cm4gb3JnSW5mbz8uT3JnYW5pemF0aW9uTmFtZSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRlbmFudCBuYW1lIGluIHRoZSBvcmdhbml6YXRpb24gaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGVuYW50IG5hbWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCB0ZW5hbnROYW1lKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBleGlzdGluZyBvcmdhbml6YXRpb24gaW5mbyBvciBpbml0aWFsaXplIGEgbmV3IG9iamVjdFxuICAgICAgICBjb25zdCBvcmdJbmZvID0gdGhpcy5nZXRPcmdJbmZvKCkgfHwge307XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmdhbml6YXRpb24gbmFtZSB2YWx1ZVxuICAgICAgICBvcmdJbmZvLk9yZ2FuaXphdGlvbk5hbWUgPSB2YWx1ZTtcblxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIG9yZ2FuaXphdGlvbiBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldE9yZ0luZm8ob3JnSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBzdWJkb21haW4gZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHN1YmRvbWFpbiBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IHN1YmRvbWFpbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIG9yZ2FuaXphdGlvbiBpbmZvIGZyb20gc3RvcmFnZVxuICAgICAgICBjb25zdCBvcmdJbmZvID0gdGhpcy5nZXRPcmdJbmZvKCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBzdWJkb21haW4gaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIG51bGxcbiAgICAgICAgcmV0dXJuIG9yZ0luZm8/LlN1YmRvbWFpbiB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN1YmRvbWFpbiBpbiB0aGUgb3JnYW5pemF0aW9uIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN1YmRvbWFpbiB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHN1YmRvbWFpbih2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3Rpbmcgb3JnYW5pemF0aW9uIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3Qgb3JnSW5mbyA9IHRoaXMuZ2V0T3JnSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3ViZG9tYWluIHZhbHVlXG4gICAgICAgIG9yZ0luZm8uU3ViZG9tYWluID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBvcmdhbml6YXRpb24gaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRPcmdJbmZvKG9yZ0luZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgbG9jYWxlIHNldHRpbmdzIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBsb2NhbGUgc2V0dGluZ3MgaWYgdGhleSBleGlzdCwgb3RoZXJ3aXNlIGBudWxsYC5cbiAgICAgKi9cbiAgICBnZXQgb3JnTG9jYWxlU2V0dGluZ3MoKTogYW55IHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxvY2FsZSBzZXR0aW5ncyBmcm9tIHRoZSBvcmdhbml6YXRpb24gaW5mb1xuICAgICAgICBsZXQgbG9jYWxTZXR0aW5ncyA9IHRoaXMuZ2V0T3JnSW5mbygpPy5Mb2NhbGVTZXR0aW5ncztcblxuICAgICAgICAvLyBJZiB0aGUgbG9jYWxlIHNldHRpbmdzIGFyZSBhIHN0cmluZywgcGFyc2UgdGhlbSBhcyBKU09OXG4gICAgICAgIGlmKHR5cGVvZiBsb2NhbFNldHRpbmdzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbG9jYWxTZXR0aW5ncyA9IEpTT04ucGFyc2UobG9jYWxTZXR0aW5ncyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGxvY2FsZSBzZXR0aW5nc1xuICAgICAgICByZXR1cm4gbG9jYWxTZXR0aW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsb2NhbGUgc2V0dGluZ3MgaW4gdGhlIG9yZ2FuaXphdGlvbiBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBsb2NhbGUgc2V0dGluZ3MgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCBvcmdMb2NhbGVTZXR0aW5ncyh2YWx1ZTogYW55KSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBleGlzdGluZyBvcmdhbml6YXRpb24gaW5mbyBvciBpbml0aWFsaXplIGEgbmV3IG9iamVjdFxuICAgICAgICBjb25zdCBvcmdJbmZvID0gdGhpcy5nZXRPcmdJbmZvKCkgfHwge307XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBsb2NhbGUgc2V0dGluZ3MgdmFsdWVcbiAgICAgICAgb3JnSW5mby5Mb2NhbGVTZXR0aW5ncyA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgb3JnYW5pemF0aW9uIGluZm8gYmFjayB0byBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0T3JnSW5mbyhvcmdJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFwcCBJRCBmcm9tIHRoZSBhcHAgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgYXBwIElEIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGBudWxsYC5cbiAgICAgKi9cbiAgICBnZXQgYXBwSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFwcEluZm8oKT8uSWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhcHAgSUQgaW4gdGhlIGFwcCBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhcHAgSUQgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCBhcHBJZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgYXBwIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgYXBwSW5mbyA9IHRoaXMuZ2V0QXBwSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYXBwIElEIHZhbHVlXG4gICAgICAgIGFwcEluZm8uSWQgPSB2YWx1ZTtcblxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGFwcCBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldEFwcEluZm8oYXBwSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBhcHAgbmFtZSBmcm9tIHRoZSBhcHAgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgYXBwIG5hbWUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCBhcHBOYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSBhcHAgbmFtZSBmcm9tIHRoZSBhcHAgaW5mbywgb3IgcmV0dXJuIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBJbmZvKCk/LkFwcE5hbWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhcHAgbmFtZSBpbiB0aGUgYXBwIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFwcCBuYW1lIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgYXBwTmFtZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgYXBwIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgYXBwSW5mbyA9IHRoaXMuZ2V0QXBwSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYXBwIG5hbWUgdmFsdWVcbiAgICAgICAgYXBwSW5mby5BcHBOYW1lID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBhcHAgaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRBcHBJbmZvKGFwcEluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZW52aXJvbm1lbnQgSUQgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgZW52aXJvbm1lbnQgSUQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCBlbnZpcm9ubWVudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSBlbnZpcm9ubWVudCBJRCBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVudmlyb25tZW50SW5mbygpPy5JZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGVudmlyb25tZW50IElEIGluIHRoZSBlbnZpcm9ubWVudCBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBlbnZpcm9ubWVudCBJRCB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IGVudmlyb25tZW50SWQodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGV4aXN0aW5nIGVudmlyb25tZW50IGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgZW52aXJvbm1lbnRJbmZvID0gdGhpcy5nZXRFbnZpcm9ubWVudEluZm8oKSB8fCB7fTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGVudmlyb25tZW50IElEIHZhbHVlXG4gICAgICAgIGVudmlyb25tZW50SW5mby5JZCA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRFbnZpcm9ubWVudEluZm8oZW52aXJvbm1lbnRJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVudmlyb25tZW50IG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgZW52aXJvbm1lbnQgbmFtZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IGVudmlyb25tZW50TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgYW5kIHJldHVybiB0aGUgZW52aXJvbm1lbnQgbmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVudmlyb25tZW50SW5mbygpPy5OYW1lIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZW52aXJvbm1lbnQgbmFtZSBpbiB0aGUgZW52aXJvbm1lbnQgaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgZW52aXJvbm1lbnQgbmFtZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IGVudmlyb25tZW50TmFtZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgZW52aXJvbm1lbnQgaW5mbyBvciBpbml0aWFsaXplIGEgbmV3IG9iamVjdFxuICAgICAgICBjb25zdCBlbnZpcm9ubWVudEluZm8gPSB0aGlzLmdldEVudmlyb25tZW50SW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZW52aXJvbm1lbnQgbmFtZSB2YWx1ZVxuICAgICAgICBlbnZpcm9ubWVudEluZm8uTmFtZSA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRFbnZpcm9ubWVudEluZm8oZW52aXJvbm1lbnRJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHRva2VuIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGBudWxsYC5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIGFuZCByZXR1cm4gdGhlIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8sIG9yIHJldHVybiBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5JbmZvKCk/LnRva2VuIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdG9rZW4gaW4gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHRva2VuIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgdG9rZW4odmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGV4aXN0aW5nIHRva2VuIGluZm8gb3IgaW5pdGlhbGl6ZSBhIG5ldyBvYmplY3RcbiAgICAgICAgY29uc3QgdG9rZW5JbmZvID0gdGhpcy5nZXRUb2tlbkluZm8oKSB8fCB7fTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHRva2VuIHZhbHVlXG4gICAgICAgIHRva2VuSW5mby50b2tlbiA9IHZhbHVlO1xuXG4gICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgdG9rZW4gaW5mbyBiYWNrIHRvIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5zZXRUb2tlbkluZm8odG9rZW5JbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHJlZnJlc2ggdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVmcmVzaCB0b2tlbiBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IHJlZnJlc2hUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgYW5kIHJldHVybiB0aGUgcmVmcmVzaCB0b2tlbiBmcm9tIHRoZSB0b2tlbiBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuSW5mbygpPy5yZWZyZXNoVG9rZW4gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZWZyZXNoIHRva2VuIGluIHRoZSB0b2tlbiBpbmZvLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSByZWZyZXNoIHRva2VuIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgcmVmcmVzaFRva2VuKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBleGlzdGluZyB0b2tlbiBpbmZvIG9yIGluaXRpYWxpemUgYSBuZXcgb2JqZWN0XG4gICAgICAgIGNvbnN0IHRva2VuSW5mbyA9IHRoaXMuZ2V0VG9rZW5JbmZvKCkgfHwge307XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSByZWZyZXNoIHRva2VuIHZhbHVlXG4gICAgICAgIHRva2VuSW5mby5yZWZyZXNoVG9rZW4gPSB2YWx1ZTtcblxuICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIHRva2VuIGluZm8gYmFjayB0byBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9rZW5JbmZvKHRva2VuSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSByZWZyZXNoIHRva2VuIGV4cGlyeSB0aW1lIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHJlZnJlc2ggdG9rZW4gZXhwaXJ5IHRpbWUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCByZWZyZXNoVG9rZW5FeHBpcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIGFuZCByZXR1cm4gdGhlIHJlZnJlc2ggdG9rZW4gZXhwaXJ5IHRpbWUgZnJvbSB0aGUgdG9rZW4gaW5mbyxcbiAgICAgICAgLy8gb3IgcmV0dXJuIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkluZm8oKT8ucmVmcmVzaFRva2VuRXhwaXJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZSBpbiB0aGUgdG9rZW4gaW5mby5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHJlZnJlc2hUb2tlbkV4cGlyeSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgdG9rZW4gaW5mbyBvciBpbml0aWFsaXplIGEgbmV3IG9iamVjdFxuICAgICAgICBjb25zdCB0b2tlbkluZm8gPSB0aGlzLmdldFRva2VuSW5mbygpIHx8IHt9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZVxuICAgICAgICB0b2tlbkluZm8ucmVmcmVzaFRva2VuRXhwaXJ5ID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCB0b2tlbiBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRva2VuSW5mbyh0b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc3RhdGljIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHN0YXRpYyB0b2tlbiBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IHN0YXRpY1Rva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSBzdGF0aWMgdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mbyxcbiAgICAgICAgLy8gb3IgcmV0dXJuIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkluZm8oKT8uc3RhdGljVG9rZW4gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGF0aWMgdG9rZW4gaW4gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0YXRpYyB0b2tlbiB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHN0YXRpY1Rva2VuKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIC8vIFJldHJpZXZlIHRoZSBleGlzdGluZyB0b2tlbiBpbmZvIG9yIGluaXRpYWxpemUgYSBuZXcgb2JqZWN0XG4gICAgICAgIGNvbnN0IHRva2VuSW5mbyA9IHRoaXMuZ2V0VG9rZW5JbmZvKCkgfHwge307XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGF0aWMgdG9rZW4gdmFsdWVcbiAgICAgICAgdG9rZW5JbmZvLnN0YXRpY1Rva2VuID0gdmFsdWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCB0b2tlbiBpbmZvIGJhY2sgdG8gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRva2VuSW5mbyh0b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdXNlciBJRCBmcm9tIHRoZSB1c2VyIGluZm8uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHVzZXIgSUQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCB1c2VySWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIFJldHJpZXZlIGFuZCByZXR1cm4gdGhlIHVzZXIgSUQgZnJvbSB0aGUgdXNlciBpbmZvLCBvciByZXR1cm4gbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIHJldHVybiB0aGlzLmdldFVzZXJJbmZvKCk/LnVzZXI/LklkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSB1c2VyJ3Mgcm9sZXMgZnJvbSB0aGUgdXNlciBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1c2VyIHJvbGVzIGlmIHRoZXkgZXhpc3QsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgZ2V0IHVzZXJSb2xlcygpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSB1c2VyIHJvbGVzIGZyb20gdGhlIHVzZXIgaW5mbywgb3IgcmV0dXJuIG51bGwgaWYgdGhleSBkb24ndCBleGlzdFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRVc2VySW5mbygpPy51c2VyPy5Sb2xlcyB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdXNlcidzIHRlYW1zIGZyb20gdGhlIHVzZXIgaW5mb3JtYXRpb24uXG4gICAgICogXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdXNlciB0ZWFtcyBpZiB0aGV5IGV4aXN0LCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGdldCB1c2VyVGVhbXMoKTogYW55W10gfCBudWxsIHtcbiAgICAgICAgLy8gUmV0cmlldmUgYW5kIHJldHVybiB0aGUgdXNlciB0ZWFtcyBmcm9tIHRoZSB1c2VyIGluZm8sIG9yIHJldHVybiBudWxsIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlckluZm8oKT8udXNlcj8uVGVhbXMgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSB0ZW5hbnQgSUQgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHJlbW92ZVRlbmFudElkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21PcmdJbmZvKCdJZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHRlbmFudCBuYW1lIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICByZW1vdmVUZW5hbnROYW1lKCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHRlbmFudCBuYW1lIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLnJlbW92ZUZyb21PcmdJbmZvKCdPcmdhbml6YXRpb25OYW1lJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc3ViZG9tYWluIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHN1YmRvbWFpbiBwcm9wZXJ0eSBmcm9tIHRoZSBvcmdhbml6YXRpb24gaW5mb3JtYXRpb25cbiAgICAgKiBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVTdWJkb21haW4oKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc3ViZG9tYWluIGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLnJlbW92ZUZyb21PcmdJbmZvKCdTdWJkb21haW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhcHAgSUQgZnJvbSB0aGUgYXBwIGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgYXBwIElEIHByb3BlcnR5IGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVBcHBJZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tQXBwSW5mbygnSWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhcHAgbmFtZSBmcm9tIHRoZSBhcHAgaW5mb3JtYXRpb24uXG4gICAgICogXG4gICAgICogVGhpcyByZW1vdmVzIHRoZSBhcHAgbmFtZSBwcm9wZXJ0eSBmcm9tIHRoZSBhcHAgaW5mb3JtYXRpb24gc3RvcmVkIGluIGxvY2FsIHN0b3JhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlQXBwTmFtZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tQXBwSW5mbygnQXBwTmFtZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGVudmlyb25tZW50IElEIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgSUQgcHJvcGVydHkgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVFbnZpcm9ubWVudElkKCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGVudmlyb25tZW50IElEIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUVudmlyb25tZW50SW5mbygnSWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBlbnZpcm9ubWVudCBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgTmFtZSBwcm9wZXJ0eSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvblxuICAgICAqIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZUVudmlyb25tZW50TmFtZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBlbnZpcm9ubWVudCBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbUVudmlyb25tZW50SW5mbygnTmFtZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHRva2VuIGZyb20gdGhlIHRva2VuIGluZm8uXG4gICAgICogXG4gICAgICogVGhpcyByZW1vdmVzIHRoZSB0b2tlbiBwcm9wZXJ0eSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlVG9rZW4oKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mb1xuICAgICAgICB0aGlzLnJlbW92ZUZyb21Ub2tlbkluZm8oJ3Rva2VuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcmVmcmVzaCB0b2tlbiBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHJlZnJlc2ggdG9rZW4gcHJvcGVydHkgZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb24gc3RvcmVkIGluIHNlc3Npb25cbiAgICAgKiBzdG9yYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZVJlZnJlc2hUb2tlbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tVG9rZW5JbmZvKCdyZWZyZXNoVG9rZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSByZWZyZXNoIHRva2VuIGV4cGlyeSB0aW1lIGZyb20gdGhlIHRva2VuIGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgcmVmcmVzaCB0b2tlbiBleHBpcnkgdGltZSBwcm9wZXJ0eSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlUmVmcmVzaFRva2VuRXhwaXJ5KCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlZnJlc2ggdG9rZW4gZXhwaXJ5IGZyb20gdGhlIHRva2VuIGluZm9cbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tVG9rZW5JbmZvKCdyZWZyZXNoVG9rZW5FeHBpcnknKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzdGF0aWMgdG9rZW4gZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb24uXG4gICAgICogXG4gICAgICogVGhpcyByZW1vdmVzIHRoZSBzdGF0aWMgdG9rZW4gcHJvcGVydHkgZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb24gc3RvcmVkIGluIHNlc3Npb25cbiAgICAgKiBzdG9yYWdlLlxuICAgICAqL1xuICAgIHJlbW92ZVN0YXRpY1Rva2VuKCk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YXRpYyB0b2tlbiBmcm9tIHRoZSB0b2tlbiBpbmZvXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVRva2VuSW5mbygnc3RhdGljVG9rZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byByZW1vdmUgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlRnJvbU9yZ0luZm8oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3JnSW5mbyA9IHRoaXMuZ2V0T3JnSW5mbygpO1xuICAgICAgICBpZiAob3JnSW5mbykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGluZm9ybWF0aW9uXG4gICAgICAgICAgICBkZWxldGUgb3JnSW5mb1trZXldO1xuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBvcmdhbml6YXRpb24gaW5mb3JtYXRpb24gYmFjayB0byBsb2NhbCBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLnNldE9yZ0luZm8ob3JnSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvbi5cbiAgICAgKiBcbiAgICAgKiBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgYXBwIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBzZXNzaW9uXG4gICAgICogc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gcmVtb3ZlIGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21BcHBJbmZvKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFwcEluZm8gPSB0aGlzLmdldEFwcEluZm8oKTtcbiAgICAgICAgaWYgKGFwcEluZm8pIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIGFwcCBpbmZvcm1hdGlvblxuICAgICAgICAgICAgZGVsZXRlIGFwcEluZm9ba2V5XTtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgYXBwIGluZm9ybWF0aW9uIGJhY2sgdG8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLnNldEFwcEluZm8oYXBwSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGVudmlyb25tZW50IGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHJlbW92ZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21FbnZpcm9ubWVudEluZm8oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW52aXJvbm1lbnRJbmZvID0gdGhpcy5nZXRFbnZpcm9ubWVudEluZm8oKTtcbiAgICAgICAgaWYgKGVudmlyb25tZW50SW5mbykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGRlbGV0ZSBlbnZpcm9ubWVudEluZm9ba2V5XTtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gYmFjayB0byBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMuc2V0RW52aXJvbm1lbnRJbmZvKGVudmlyb25tZW50SW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIHRva2VuIGluZm9ybWF0aW9uLlxuICAgICAqIFxuICAgICAqIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gc2Vzc2lvblxuICAgICAqIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHJlbW92ZSBmcm9tIHRoZSB0b2tlbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21Ub2tlbkluZm8oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9rZW5JbmZvID0gdGhpcy5nZXRUb2tlbkluZm8oKTtcbiAgICAgICAgaWYgKHRva2VuSW5mbykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgdG9rZW4gaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGRlbGV0ZSB0b2tlbkluZm9ba2V5XTtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZGF0ZWQgdG9rZW4gaW5mb3JtYXRpb24gYmFjayB0byBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMuc2V0VG9rZW5JbmZvKHRva2VuSW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiBvYmplY3Qgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIGdldE9yZ0luZm8oKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIFN0b3JhZ2VDb25zdGFudHMub3JnSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgdGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiB0byBsb2NhbCBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcmdJbmZvIC0gVGhlIG9yZ2FuaXphdGlvbiBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRPcmdJbmZvKG9yZ0luZm86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyB0ZW1wIG9uY2UgcmVtb3ZlIGZyb20gZHJvcGRvd24sIHdlIGNhbiByZW1vdmUgdGhpc1xuICAgICAgICBpZiAob3JnSW5mby5JZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTZXNzaW9uKFN0b3JhZ2VDb25zdGFudHMuVGVuYW50SWQsIG9yZ0luZm8uSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTZXNzaW9uKFN0b3JhZ2VDb25zdGFudHMuVGVuYW50SWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgb3JnYW5pemF0aW9uIGluZm8gdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRvU3RvcmFnZShTdG9yYWdlVHlwZS5Mb2NhbCwgU3RvcmFnZUNvbnN0YW50cy5vcmdJbmZvLCBvcmdJbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFwcCBpbmZvcm1hdGlvbiBmcm9tIHNlc3Npb24gc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgYXBwIGluZm9ybWF0aW9uIG9iamVjdCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgZ2V0QXBwSW5mbygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tU3RvcmFnZShTdG9yYWdlVHlwZS5TZXNzaW9uLCBTdG9yYWdlQ29uc3RhbnRzLmFwcEluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSBhcHAgaW5mb3JtYXRpb24gdG8gc2Vzc2lvbiBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcHBJbmZvIC0gVGhlIGFwcCBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRBcHBJbmZvKGFwcEluZm86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyB0ZW1wIG9uY2UgcmVtb3ZlIGZyb20gZHJvcGRvd24sIHdlIGNhbiByZW1vdmUgdGhpc1xuICAgICAgICBpZiAoYXBwSW5mbz8uSWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLkFwcElkLCBhcHBJbmZvLklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLkFwcElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcHBJbmZvPy5BcHBOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlc3Npb24oU3RvcmFnZUNvbnN0YW50cy5hcHBsaWNhdGlvbkNvZGUsIGFwcEluZm8uQXBwTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNlc3Npb24oU3RvcmFnZUNvbnN0YW50cy5hcHBsaWNhdGlvbkNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgYXBwIGluZm8gdG8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIFN0b3JhZ2VDb25zdGFudHMuYXBwSW5mbywgYXBwSW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiBmcm9tIHNlc3Npb24gc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gb2JqZWN0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRFbnZpcm9ubWVudEluZm8oKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwgU3RvcmFnZUNvbnN0YW50cy5lbnZpcm9ubWVudEluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiB0byBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGVudkluZm8gLSBUaGUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gdG8gc3RvcmUuXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnRJbmZvKGVudkluZm86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBTYXZlIHRoZSBlbnZpcm9ubWVudCBpbmZvIHRvIHNlc3Npb24gc3RvcmFnZVxuICAgICAgICB0aGlzLnNldFRvU3RvcmFnZShTdG9yYWdlVHlwZS5TZXNzaW9uLCBTdG9yYWdlQ29uc3RhbnRzLmVudmlyb25tZW50SW5mbywgZW52SW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiBmcm9tIHNlc3Npb24gc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgdG9rZW4gaW5mb3JtYXRpb24gb2JqZWN0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRUb2tlbkluZm8oKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwgU3RvcmFnZUNvbnN0YW50cy50b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSB0b2tlbiBpbmZvcm1hdGlvbiB0byBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIHRva2VuSW5mbyAtIFRoZSB0b2tlbiBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRUb2tlbkluZm8odG9rZW5JbmZvOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gdGVtcCBvbmNlIHJlbW92ZSBmcm9tIGRyb3Bkb3duLCB3ZSBjYW4gcmVtb3ZlIHRoaXNcbiAgICAgICAgaWYgKHRva2VuSW5mbz8udG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLnRva2VuLCB0b2tlbkluZm8/LnRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbihTdG9yYWdlQ29uc3RhbnRzLnRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNhdmUgdGhlIHRva2VuIGluZm8gdG8gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIFN0b3JhZ2VDb25zdGFudHMudG9rZW5JbmZvLCB0b2tlbkluZm8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgdXNlciBpbmZvcm1hdGlvbiBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHVzZXIgaW5mb3JtYXRpb24gb2JqZWN0IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRVc2VySW5mbygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGcm9tU3RvcmFnZShTdG9yYWdlVHlwZS5Mb2NhbCwgU3RvcmFnZUNvbnN0YW50cy51c2VySW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdXNlciBpbmZvcm1hdGlvbiBpbiBsb2NhbCBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB1c2VySW5mbyBUaGUgdXNlciBpbmZvcm1hdGlvbiB0byBzdG9yZS5cbiAgICAgKi9cbiAgICBzZXRVc2VySW5mbyh1c2VySW5mbzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFNhdmUgdGhlIHVzZXIgaW5mbyB0byBsb2NhbCBzdG9yYWdlXG4gICAgICAgIHRoaXMuc2V0VG9TdG9yYWdlKFN0b3JhZ2VUeXBlLkxvY2FsLCBTdG9yYWdlQ29uc3RhbnRzLnVzZXJJbmZvLCB1c2VySW5mbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGtleS12YWx1ZSBwYWlyIGluIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHN0b3JlIHRoZSB2YWx1ZSB1bmRlci5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdmFsdWUgdG8gc3RvcmUuXG4gICAgICovXG4gICAgc2V0TG9jYWwoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFRvU3RvcmFnZShTdG9yYWdlVHlwZS5Mb2NhbCwga2V5LCBkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIGxvY2FsIHN0b3JhZ2UgYnkga2V5LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIHRvIHJldHJpZXZlLlxuICAgICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZSwgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIGdldExvY2FsKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICovXG4gICAgcmVtb3ZlTG9jYWwoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBsb2NhbCBzdG9yYWdlIGRhdGEuXG4gICAgICovXG4gICAgY2xlYXJMb2NhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBrZXktdmFsdWUgcGFpciBpbiBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIHN0b3JlIHRoZSB2YWx1ZSB1bmRlci5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdmFsdWUgdG8gc3RvcmUuXG4gICAgICovXG4gICAgc2V0U2Vzc2lvbihrZXk6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFNhdmUgZGF0YSB0byBzZXNzaW9uIHN0b3JhZ2UgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXlcbiAgICAgICAgdGhpcy5zZXRUb1N0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwga2V5LCBkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHNlc3Npb24gc3RvcmFnZSBieSBrZXkuXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBUaGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgdG8gcmV0cmlldmUuXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIHN0b3JlZCBpbiBzZXNzaW9uIHN0b3JhZ2UsIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBnZXRTZXNzaW9uKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIGZyb20gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHJldHVybiB0aGlzLmdldEZyb21TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gc2Vzc2lvbiBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKi9cbiAgICByZW1vdmVTZXNzaW9uKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbiwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHNlc3Npb24gc3RvcmFnZSBkYXRhLlxuICAgICAqL1xuICAgIGNsZWFyU2Vzc2lvbigpOiB2b2lkIHtcbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBrZXktdmFsdWUgcGFpcnMgZnJvbSBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2UoU3RvcmFnZVR5cGUuU2Vzc2lvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBhdXRoZW50aWNhdGlvbi1yZWxhdGVkIGRhdGEgZnJvbSBsb2NhbCBhbmQgc2Vzc2lvbiBzdG9yYWdlLlxuICAgICAqIFxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGFmdGVyIGEgdXNlciBsb2dzIG91dC5cbiAgICAgKi9cbiAgICBjbGVhckF1dGgoKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSB1c2VyIGluZm8gZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgICAgIHRoaXMucmVtb3ZlRnJvbVN0b3JhZ2UoU3RvcmFnZVR5cGUuTG9jYWwsIFN0b3JhZ2VDb25zdGFudHMudXNlckluZm8pO1xuICAgICAgICAvLyBSZW1vdmUgdG9rZW4gaW5mbyBmcm9tIHNlc3Npb24gc3RvcmFnZVxuICAgICAgICB0aGlzLnJlbW92ZUZyb21TdG9yYWdlKFN0b3JhZ2VUeXBlLlNlc3Npb24sIFN0b3JhZ2VDb25zdGFudHMudG9rZW5JbmZvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmljIGdldHRlciBtZXRob2QgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIGVpdGhlciBsb2NhbCBvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHR5cGUgb2Ygc3RvcmFnZSB0byByZXRyaWV2ZSBmcm9tLlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdG8gcmV0cmlldmUuXG4gICAgICogQHJldHVybnMgVGhlIHJldHJpZXZlZCBkYXRhLCBkZXNlcmlhbGl6ZWQgZnJvbSBKU09OIGlmIGl0IHdhcyBzdG9yZWQgYXMgYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRGcm9tU3RvcmFnZShzdG9yYWdlOiBTdG9yYWdlVHlwZSwga2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RvcmFnZVxuICAgICAgICBjb25zdCBkYXRhID0gc3RvcmFnZSA9PT0gU3RvcmFnZVR5cGUuTG9jYWxcbiAgICAgICAgICAgID8gdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5nZXRMb2NhbFN0b3JhZ2Uoa2V5KVxuICAgICAgICAgICAgOiB0aGlzLl9zZXNzaW9uU3RvcmFnZVNlcnZpY2UuZ2V0U2Vzc2lvblN0b3JhZ2Uoa2V5KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBwYXJzZSB0aGUgZGF0YSBhcyBKU09OXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGE7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBkYXRhIGNhbm5vdCBiZSBwYXJzZWQsIHJldHVybiBpdCBhcyBpc1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIHNwZWNpZmllZCBzdG9yYWdlIHR5cGUuXG4gICAgICogXG4gICAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHR5cGUgb2Ygc3RvcmFnZSB0byB1c2UgKGxvY2FsIG9yIHNlc3Npb24pLlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB1bmRlciB3aGljaCB0aGUgZGF0YSBzaG91bGQgYmUgc3RvcmVkLlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHN0b3JlLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0VG9TdG9yYWdlKHN0b3JhZ2U6IFN0b3JhZ2VUeXBlLCBrZXk6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdG9yYWdlIHR5cGUgaXMgbG9jYWxcbiAgICAgICAgaWYgKHN0b3JhZ2UgPT09IFN0b3JhZ2VUeXBlLkxvY2FsKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIGRhdGEgaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5zZXRMb2NhbFN0b3JhZ2Uoa2V5LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHRoZSBkYXRhIGluIHNlc3Npb24gc3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvblN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25TdG9yYWdlKGtleSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgc3BlY2lmaWVkIHN0b3JhZ2UgdHlwZS5cbiAgICAgKiBcbiAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBnaXZlbiBrZXkgZnJvbSBlaXRoZXIgbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlIFxuICAgICAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgc3RvcmFnZSB0eXBlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBzdG9yYWdlIFRoZSB0eXBlIG9mIHN0b3JhZ2UgdG8gcmVtb3ZlIGZyb20gKGxvY2FsIG9yIHNlc3Npb24pLlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUZyb21TdG9yYWdlKHN0b3JhZ2U6IFN0b3JhZ2VUeXBlLCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoc3RvcmFnZSA9PT0gU3RvcmFnZVR5cGUuTG9jYWwpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gbG9jYWwgc3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlU2VydmljZS5yZW1vdmVMb2NhbFN0b3JhZ2Uoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gc2Vzc2lvbiBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uU3RvcmFnZVNlcnZpY2UucmVtb3ZlU2Vzc2lvblN0b3JhZ2Uoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwga2V5LXZhbHVlIHBhaXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdG9yYWdlIHR5cGUuXG4gICAgICogXG4gICAgICogVGhpcyBtZXRob2QgY2xlYXJzIGFsbCBrZXktdmFsdWUgcGFpcnMgZnJvbSBlaXRoZXIgbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlXG4gICAgICogYmFzZWQgb24gdGhlIHNwZWNpZmllZCBzdG9yYWdlIHR5cGUuXG4gICAgICogXG4gICAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHR5cGUgb2Ygc3RvcmFnZSB0byBjbGVhciAobG9jYWwgb3Igc2Vzc2lvbikuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbGVhclN0b3JhZ2Uoc3RvcmFnZTogU3RvcmFnZVR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHN0b3JhZ2UgPT09IFN0b3JhZ2VUeXBlLkxvY2FsKSB7XG4gICAgICAgICAgICAvLyBDbGVhciBsb2NhbCBzdG9yYWdlXG4gICAgICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2VTZXJ2aWNlLmNsZWFyTG9jYWxTdG9yYWdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDbGVhciBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb25TdG9yYWdlU2VydmljZS5jbGVhclNlc3Npb25TdG9yYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG59Il19