@dereekb/dbx-firebase 12.5.9 → 12.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/development/development.widget.service.mjs +1 -1
- package/esm2022/lib/modules/storagefile/container/index.mjs +2 -1
- package/esm2022/lib/modules/storagefile/container/storagefile.download.button.component.mjs +244 -0
- package/esm2022/lib/modules/storagefile/index.mjs +3 -1
- package/esm2022/lib/modules/storagefile/service/index.mjs +3 -0
- package/esm2022/lib/modules/storagefile/service/storagefile.download.service.mjs +158 -0
- package/esm2022/lib/modules/storagefile/service/storagefile.download.storage.service.mjs +91 -0
- package/esm2022/lib/modules/storagefile/storagefile.providers.mjs +33 -0
- package/esm2022/lib/modules/storagefile/store/storagefile.document.store.mjs +3 -2
- package/esm2022/lib/providers.mjs +6 -2
- package/fesm2022/dereekb-dbx-firebase.mjs +512 -8
- package/fesm2022/dereekb-dbx-firebase.mjs.map +1 -1
- package/lib/development/development.widget.service.d.ts +1 -1
- package/lib/modules/storagefile/container/index.d.ts +1 -0
- package/lib/modules/storagefile/container/storagefile.download.button.component.d.ts +133 -0
- package/lib/modules/storagefile/index.d.ts +2 -0
- package/lib/modules/storagefile/service/index.d.ts +2 -0
- package/lib/modules/storagefile/service/storagefile.download.service.d.ts +79 -0
- package/lib/modules/storagefile/service/storagefile.download.storage.service.d.ts +56 -0
- package/lib/modules/storagefile/storagefile.providers.d.ts +13 -0
- package/lib/modules/storagefile/storagefile.upload.module.d.ts +1 -1
- package/lib/modules/storagefile/store/storagefile.document.store.d.ts +1 -0
- package/lib/providers.d.ts +4 -0
- package/package.json +1 -1
|
@@ -53,4 +53,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
53
53
|
type: Inject,
|
|
54
54
|
args: [DEFAULT_FIREBASE_DEVELOPMENT_WIDGET_PROVIDERS_TOKEN]
|
|
55
55
|
}] }] });
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2ZWxvcG1lbnQud2lkZ2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9kZXZlbG9wbWVudC9kZXZlbG9wbWVudC53aWRnZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHbkU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtREFBbUQsR0FBRyxJQUFJLGNBQWMsQ0FBc0MsNENBQTRDLENBQUMsQ0FBQztBQUV6Szs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLG1DQUFtQztJQUNyQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVwQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW9ELENBQUM7SUFFeEYsWUFBcUYsY0FBbUQ7UUFDdEksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxRQUFRLENBQUMsUUFBMkMsRUFBRSxXQUFvQixJQUFJO1FBQzVFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBRWxDLElBQUksUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQzt3R0FuQ1UsbUNBQW1DLGtCQUtkLG1EQUFtRDs0R0FMeEUsbUNBQW1DOzs0RkFBbkMsbUNBQW1DO2tCQUQvQyxVQUFVOzswQkFNSSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1EQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGl0ZXJhYmxlVG9BcnJheSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGJ4V2lkZ2V0U2VydmljZSwgRGJ4V2lkZ2V0VHlwZSB9IGZyb20gJ0BkZXJlZWtiL2RieC13ZWInO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VEZXZlbG9wbWVudFdpZGdldEVudHJ5IH0gZnJvbSAnLi9kZXZlbG9wbWVudC53aWRnZXQnO1xuXG4vKipcbiAqIERlZmF1bHQgcHJvdmlkZXJzIHRvIGluamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklSRUJBU0VfREVWRUxPUE1FTlRfV0lER0VUX1BST1ZJREVSU19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cnlbXT4oJ0RlZmF1bHREYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cmllcycpO1xuXG4vKipcbiAqIFNlcnZpY2UgdXNlZCBmb3IgcmVnaXN0ZXJpbmcgd2lkZ2V0cyB1c2VkIGZvciBkZXZlbG9wbWVudC5cbiAqXG4gKiBEZWZhdWx0IHByb3ZpZGVycyBjYW4gYmUgY29uZmlndXJlZCBieSB0aGUgREVGQVVMVF9GSVJFQkFTRV9BVVRIX0xPR0lOX1BST1ZJREVSU19UT0tFTiBpbmplY3RhYmxlIHZhbHVlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGJ4RmlyZWJhc2VEZXZlbG9wbWVudFdpZGdldFNlcnZpY2Uge1xuICByZWFkb25seSBkYnhXaWRnZXRTZXJ2aWNlID0gaW5qZWN0KERieFdpZGdldFNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VudHJpZXMgPSBuZXcgTWFwPERieFdpZGdldFR5cGUsIERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRFbnRyeT4oKTtcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KERFRkFVTFRfRklSRUJBU0VfREVWRUxPUE1FTlRfV0lER0VUX1BST1ZJREVSU19UT0tFTikgZGVmYXVsdEVudHJpZXM6IERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRFbnRyeVtdKSB7XG4gICAgaWYgKGRlZmF1bHRFbnRyaWVzKSB7XG4gICAgICBkZWZhdWx0RW50cmllcy5mb3JFYWNoKCh4KSA9PiB0aGlzLnJlZ2lzdGVyKHgsIGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gcmVnaXN0ZXIgYSBwcm92aWRlci4gSWYgYSBwcm92aWRlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQsIHRoaXMgd2lsbCBvdmVycmlkZSBpdCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHBhcmFtIG92ZXJyaWRlXG4gICAqL1xuICByZWdpc3Rlcihwcm92aWRlcjogRGJ4RmlyZWJhc2VEZXZlbG9wbWVudFdpZGdldEVudHJ5LCBvdmVycmlkZTogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCB0eXBlID0gcHJvdmlkZXIud2lkZ2V0LnR5cGU7XG5cbiAgICBpZiAob3ZlcnJpZGUgfHwgIXRoaXMuX2VudHJpZXMuaGFzKHR5cGUpKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzLnNldCh0eXBlLCBwcm92aWRlcik7XG4gICAgICB0aGlzLmRieFdpZGdldFNlcnZpY2UucmVnaXN0ZXIocHJvdmlkZXIud2lkZ2V0LCBvdmVycmlkZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldEVudHJ5V2lkZ2V0SWRlbnRpZmllcnMoKTogRGJ4V2lkZ2V0VHlwZVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9lbnRyaWVzLmtleXMoKSk7XG4gIH1cblxuICBnZXRFbnRyaWVzKCk6IERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRFbnRyeVtdIHtcbiAgICByZXR1cm4gaXRlcmFibGVUb0FycmF5KHRoaXMuX2VudHJpZXMudmFsdWVzKCkpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
export * from './storagefile.download.button.component';
|
|
1
2
|
export * from './storagefile.upload.action.handler.directive';
|
|
2
3
|
export * from './storagefile.upload.error';
|
|
3
4
|
export * from './storagefile.upload.handler';
|
|
4
5
|
export * from './storagefile.upload.initialize.document.directive';
|
|
5
6
|
export * from './storagefile.upload.store.directive';
|
|
6
7
|
export * from './storagefile.upload.sync.directive';
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2NvbnRhaW5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5idXR0b24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmFjdGlvbi5oYW5kbGVyLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5oYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmluaXRpYWxpemUuZG9jdW1lbnQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLnN0b3JlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5zeW5jLmRpcmVjdGl2ZSc7XG4iXX0=
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal } from '@angular/core';
|
|
2
|
+
import { DbxActionDialogDirective, DbxActionModule, DbxActionSnackbarErrorDirective, DbxAnchorComponent, DbxButtonComponent, DbxWebFilePreviewService } from '@dereekb/dbx-web';
|
|
3
|
+
import { dateFromDateOrTimeSecondsNumber, isPast, MS_IN_SECOND } from '@dereekb/util';
|
|
4
|
+
import { DbxFirebaseStorageFileDownloadService } from '../service/storagefile.download.service';
|
|
5
|
+
import { maybeValueFromObservableOrValue } from '@dereekb/rxjs';
|
|
6
|
+
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
7
|
+
import { combineLatest, distinctUntilChanged, interval, map, of, shareReplay, switchMap } from 'rxjs';
|
|
8
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@dereekb/dbx-core";
|
|
11
|
+
export class DbxFirebaseStorageFileDownloadButton {
|
|
12
|
+
matDialog = inject(MatDialog);
|
|
13
|
+
dbxWebFilePreviewService = inject(DbxWebFilePreviewService);
|
|
14
|
+
dbxFirebaseStorageFileDownloadService = inject(DbxFirebaseStorageFileDownloadService);
|
|
15
|
+
/**
|
|
16
|
+
* The StorageFileKey to set up the download button for.
|
|
17
|
+
*/
|
|
18
|
+
storageFileKey = input();
|
|
19
|
+
/**
|
|
20
|
+
* The download URL to use for the download button.
|
|
21
|
+
*/
|
|
22
|
+
storageFileDownloadUrl = input();
|
|
23
|
+
/**
|
|
24
|
+
* The MIME type to use the embed component.
|
|
25
|
+
*/
|
|
26
|
+
embedMimeType = input();
|
|
27
|
+
/**
|
|
28
|
+
* Whether or not to show a preview button.
|
|
29
|
+
*
|
|
30
|
+
* Defaults to true.
|
|
31
|
+
*/
|
|
32
|
+
showPreviewButton = input(true);
|
|
33
|
+
/**
|
|
34
|
+
* Output event emitted when the download URL changes.
|
|
35
|
+
*/
|
|
36
|
+
downloadUrlChange = output();
|
|
37
|
+
config = input();
|
|
38
|
+
source = input();
|
|
39
|
+
source$ = toObservable(this.source);
|
|
40
|
+
configSignal = computed(() => {
|
|
41
|
+
const config = this.config();
|
|
42
|
+
const result = {
|
|
43
|
+
buttonStyle: config?.buttonStyle,
|
|
44
|
+
previewButtonStyle: config?.previewButtonStyle,
|
|
45
|
+
icon: config?.icon ?? 'cloud_download',
|
|
46
|
+
text: config?.text ?? 'Start Download',
|
|
47
|
+
downloadReadyIcon: config?.downloadReadyIcon ?? 'download',
|
|
48
|
+
downloadReadyText: config?.downloadReadyText ?? 'Save File',
|
|
49
|
+
previewIcon: config?.previewIcon ?? 'preview',
|
|
50
|
+
previewText: config?.previewText ?? 'View File'
|
|
51
|
+
};
|
|
52
|
+
return result;
|
|
53
|
+
});
|
|
54
|
+
preloadSignal = computed(() => {
|
|
55
|
+
const config = this.configSignal();
|
|
56
|
+
return config.preload ?? false;
|
|
57
|
+
});
|
|
58
|
+
downloadUrlSignal = signal(undefined);
|
|
59
|
+
downloadMimeTypeSignal = signal(undefined);
|
|
60
|
+
downloadUrlExpiresAtSignal = signal(undefined);
|
|
61
|
+
storageFileKeyFromInput$ = toObservable(this.storageFileKey).pipe(distinctUntilChanged(), shareReplay(1));
|
|
62
|
+
storageFileKeyFromSource$ = this.source$.pipe(map((source) => source?.storageFileKey), maybeValueFromObservableOrValue(), distinctUntilChanged(), shareReplay(1));
|
|
63
|
+
storageFileKey$ = combineLatest([this.storageFileKeyFromInput$, this.storageFileKeyFromSource$]).pipe(map(([storageFileKeyFromInput, storageFileKeyFromSource]) => {
|
|
64
|
+
return storageFileKeyFromInput ?? storageFileKeyFromSource;
|
|
65
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
66
|
+
storageFileKeySignal = toSignal(this.storageFileKey$);
|
|
67
|
+
hasDownloadUrlSignal = computed(() => Boolean(this.downloadUrlSignal()));
|
|
68
|
+
buttonStyleSignal = computed(() => {
|
|
69
|
+
const config = this.configSignal();
|
|
70
|
+
const result = {
|
|
71
|
+
type: 'raised',
|
|
72
|
+
...config.buttonStyle
|
|
73
|
+
};
|
|
74
|
+
return result;
|
|
75
|
+
});
|
|
76
|
+
previewButtonStyleSignal = computed(() => {
|
|
77
|
+
const config = this.configSignal();
|
|
78
|
+
const result = {
|
|
79
|
+
type: 'raised',
|
|
80
|
+
...config.previewButtonStyle
|
|
81
|
+
};
|
|
82
|
+
return result;
|
|
83
|
+
});
|
|
84
|
+
iconSignal = computed(() => {
|
|
85
|
+
const config = this.configSignal();
|
|
86
|
+
const hasDownloadUrl = this.hasDownloadUrlSignal();
|
|
87
|
+
return hasDownloadUrl ? (config.downloadReadyIcon ?? config.icon) : config.icon;
|
|
88
|
+
});
|
|
89
|
+
textSignal = computed(() => {
|
|
90
|
+
const config = this.configSignal();
|
|
91
|
+
const hasDownloadUrl = this.hasDownloadUrlSignal();
|
|
92
|
+
return hasDownloadUrl ? (config.downloadReadyText ?? config.text) : config.text;
|
|
93
|
+
});
|
|
94
|
+
previewIconSignal = computed(() => {
|
|
95
|
+
const config = this.configSignal();
|
|
96
|
+
return config.previewIcon;
|
|
97
|
+
});
|
|
98
|
+
previewTextSignal = computed(() => {
|
|
99
|
+
const config = this.configSignal();
|
|
100
|
+
return config.previewText;
|
|
101
|
+
});
|
|
102
|
+
anchorSignal = computed(() => {
|
|
103
|
+
const downloadUrl = this.downloadUrlSignal();
|
|
104
|
+
let result;
|
|
105
|
+
if (downloadUrl) {
|
|
106
|
+
result = {
|
|
107
|
+
url: downloadUrl
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
});
|
|
112
|
+
storageFileDownloadUrlEffect = effect(() => {
|
|
113
|
+
const downloadUrl = this.storageFileDownloadUrl();
|
|
114
|
+
if (downloadUrl || downloadUrl === null) {
|
|
115
|
+
this.downloadUrlSignal.set(downloadUrl);
|
|
116
|
+
}
|
|
117
|
+
}, {
|
|
118
|
+
allowSignalWrites: true
|
|
119
|
+
});
|
|
120
|
+
// Preview
|
|
121
|
+
showPreviewButtonSignal = computed(() => {
|
|
122
|
+
const config = this.configSignal();
|
|
123
|
+
const hasDownloadUrl = this.hasDownloadUrlSignal();
|
|
124
|
+
return hasDownloadUrl && (config.showPreviewButton ?? true);
|
|
125
|
+
});
|
|
126
|
+
openCustomPreviewSignal = computed(() => {
|
|
127
|
+
const config = this.configSignal();
|
|
128
|
+
return config.openCustomPreview;
|
|
129
|
+
});
|
|
130
|
+
handleOpenPreviewDialog = () => {
|
|
131
|
+
const openPreview = this.openCustomPreviewSignal();
|
|
132
|
+
const srcUrl = this.downloadUrlSignal();
|
|
133
|
+
const inputEmbedMimeType = this.embedMimeType();
|
|
134
|
+
const downloadMimeType = this.downloadMimeTypeSignal();
|
|
135
|
+
const embedMimeType = inputEmbedMimeType ?? downloadMimeType;
|
|
136
|
+
return openPreview?.(srcUrl, embedMimeType) ?? this.dbxWebFilePreviewService.openPreviewDialog(srcUrl, embedMimeType);
|
|
137
|
+
};
|
|
138
|
+
// Cached Url Effect
|
|
139
|
+
// When the key changes, check the cache to see if it is already available, and populate the download url if it is.
|
|
140
|
+
cachedUrlForStorageFileKey$ = this.storageFileKey$.pipe(switchMap((key) => (key ? this.dbxFirebaseStorageFileDownloadService.getCachedDownloadPairForStorageFile(key) : of(null))), shareReplay(1));
|
|
141
|
+
cachedUrlForStorageFileKeySignal = toSignal(this.cachedUrlForStorageFileKey$);
|
|
142
|
+
cachedUrlEffect = effect(() => {
|
|
143
|
+
const cachedPair = this.cachedUrlForStorageFileKeySignal();
|
|
144
|
+
if (cachedPair) {
|
|
145
|
+
this.downloadUrlSignal.set(cachedPair.downloadUrl);
|
|
146
|
+
this.downloadMimeTypeSignal.set(cachedPair.mimeType);
|
|
147
|
+
this.downloadUrlExpiresAtSignal.set(cachedPair.expiresAt);
|
|
148
|
+
}
|
|
149
|
+
}, {
|
|
150
|
+
allowSignalWrites: true
|
|
151
|
+
});
|
|
152
|
+
// Expiration Effect
|
|
153
|
+
downloadUrlExpiresAt$ = toObservable(this.downloadUrlExpiresAtSignal).pipe(map(dateFromDateOrTimeSecondsNumber), distinctUntilChanged(), shareReplay(1));
|
|
154
|
+
downloadUrlHasExpired$ = this.downloadUrlExpiresAt$.pipe(switchMap((x) => {
|
|
155
|
+
let obs;
|
|
156
|
+
if (x) {
|
|
157
|
+
obs = interval(MS_IN_SECOND).pipe(map(() => isPast(x)), distinctUntilChanged(), shareReplay(1));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
obs = of(false);
|
|
161
|
+
}
|
|
162
|
+
return obs;
|
|
163
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
164
|
+
downloadUrlHasExpiredSignal = toSignal(this.downloadUrlHasExpired$);
|
|
165
|
+
downloadUrlHasExpiredEffect = effect(() => {
|
|
166
|
+
const expired = this.downloadUrlHasExpiredSignal();
|
|
167
|
+
if (expired) {
|
|
168
|
+
this.downloadUrlSignal.set(undefined);
|
|
169
|
+
this.downloadMimeTypeSignal.set(undefined);
|
|
170
|
+
this.downloadUrlExpiresAtSignal.set(undefined);
|
|
171
|
+
}
|
|
172
|
+
}, {
|
|
173
|
+
allowSignalWrites: true
|
|
174
|
+
});
|
|
175
|
+
// Output Effect
|
|
176
|
+
downloadUrlChangeEffect = effect(() => {
|
|
177
|
+
const downloadUrl = this.downloadUrlSignal();
|
|
178
|
+
this.downloadUrlChange.emit(downloadUrl);
|
|
179
|
+
});
|
|
180
|
+
// Handlers
|
|
181
|
+
handleGetDownloadUrl = (value, context) => {
|
|
182
|
+
const source = this.source();
|
|
183
|
+
const { customSource, handleGetDownloadUrl } = source ?? {};
|
|
184
|
+
if (handleGetDownloadUrl) {
|
|
185
|
+
handleGetDownloadUrl(value, context);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
context.startWorkingWithObservable(this.dbxFirebaseStorageFileDownloadService.downloadPairForStorageFileUsingSource(value, customSource));
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
handleGetDownloadUrlSuccess = (value) => {
|
|
192
|
+
const source = this.source();
|
|
193
|
+
const { handleGetDownloadUrlSuccess } = source ?? {};
|
|
194
|
+
this.downloadUrlSignal.set(value.downloadUrl);
|
|
195
|
+
this.downloadMimeTypeSignal.set(value.mimeType);
|
|
196
|
+
this.downloadUrlExpiresAtSignal.set(value.expiresAt);
|
|
197
|
+
if (handleGetDownloadUrlSuccess) {
|
|
198
|
+
handleGetDownloadUrlSuccess(value);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
handleGetDownloadUrlError = (error) => {
|
|
202
|
+
const source = this.source();
|
|
203
|
+
const { handleGetDownloadUrlError } = source ?? {};
|
|
204
|
+
this.downloadUrlSignal.set(undefined);
|
|
205
|
+
this.downloadMimeTypeSignal.set(undefined);
|
|
206
|
+
this.downloadUrlExpiresAtSignal.set(undefined);
|
|
207
|
+
if (handleGetDownloadUrlError) {
|
|
208
|
+
handleGetDownloadUrlError(error);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
212
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DbxFirebaseStorageFileDownloadButton, isStandalone: true, selector: "dbx-firebase-storagefile-download-button", inputs: { storageFileKey: { classPropertyName: "storageFileKey", publicName: "storageFileKey", isSignal: true, isRequired: false, transformFunction: null }, storageFileDownloadUrl: { classPropertyName: "storageFileDownloadUrl", publicName: "storageFileDownloadUrl", isSignal: true, isRequired: false, transformFunction: null }, embedMimeType: { classPropertyName: "embedMimeType", publicName: "embedMimeType", isSignal: true, isRequired: false, transformFunction: null }, showPreviewButton: { classPropertyName: "showPreviewButton", publicName: "showPreviewButton", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { downloadUrlChange: "downloadUrlChange" }, ngImport: i0, template: `
|
|
213
|
+
<dbx-anchor dbxActionAnchor [anchor]="anchorSignal()" dbxAction [dbxActionAutoTrigger]="preloadSignal()" dbxActionSnackbarError [dbxActionDisabled]="!storageFileKeySignal()" [dbxActionValue]="storageFileKeySignal()" [dbxActionHandler]="handleGetDownloadUrl" [dbxActionSuccessHandler]="handleGetDownloadUrlSuccess" [dbxActionErrorHandler]="handleGetDownloadUrlError">
|
|
214
|
+
<dbx-button dbxActionButton [buttonStyle]="buttonStyleSignal()" [icon]="iconSignal()" [text]="textSignal()"></dbx-button>
|
|
215
|
+
</dbx-anchor>
|
|
216
|
+
@if (showPreviewButtonSignal()) {
|
|
217
|
+
<ng-container dbxAction [dbxActionDialog]="handleOpenPreviewDialog" dbxActionHandlerValue>
|
|
218
|
+
<span class="dbx-button-spacer"></span>
|
|
219
|
+
<dbx-button dbxActionButton [buttonStyle]="previewButtonStyleSignal()" [icon]="previewIconSignal()" [text]="previewTextSignal()"></dbx-button>
|
|
220
|
+
</ng-container>
|
|
221
|
+
}
|
|
222
|
+
`, isInline: true, dependencies: [{ kind: "component", type: DbxButtonComponent, selector: "dbx-button", inputs: ["bar", "type", "buttonStyle", "color", "spinnerColor", "customButtonColor", "customTextColor", "customSpinnerColor", "basic", "raised", "stroked", "flat", "iconOnly", "fab", "mode"] }, { kind: "ngmodule", type: DbxActionModule }, { kind: "directive", type: i1.DbxActionDirective, selector: "dbx-action,[dbxAction],dbx-action-context,[dbxActionContext]", exportAs: ["action", "dbxAction"] }, { kind: "directive", type: i1.DbxActionHandlerDirective, selector: "[dbxActionHandler]", inputs: ["dbxActionHandler"] }, { kind: "directive", type: i1.DbxActionHandlerValueDirective, selector: "[dbxActionHandlerValue]", inputs: ["dbxActionHandlerValue"] }, { kind: "directive", type: i1.DbxActionDisabledDirective, selector: "[dbxActionDisabled]", inputs: ["dbxActionDisabled"] }, { kind: "directive", type: i1.DbxActionAutoTriggerDirective, selector: "dbxActionAutoTrigger,[dbxActionAutoTrigger]", inputs: ["triggerDebounce", "triggerThrottle", "triggerErrorThrottle", "maxErrorsForThrottle", "triggerLimit", "dbxActionAutoTrigger", "useFastTriggerPreset", "useInstantTriggerPreset"] }, { kind: "directive", type: i1.DbxActionValueDirective, selector: "dbxActionValue,[dbxActionValue]", inputs: ["dbxActionValue"] }, { kind: "directive", type: i1.DbxActionSuccessHandlerDirective, selector: "[dbxActionSuccessHandler]", inputs: ["dbxActionSuccessHandler"] }, { kind: "directive", type: i1.DbxActionErrorHandlerDirective, selector: "[dbxActionErrorHandler]", inputs: ["dbxActionErrorHandler"] }, { kind: "directive", type: i1.DbxActionButtonDirective, selector: "[dbxActionButton]" }, { kind: "directive", type: DbxActionSnackbarErrorDirective, selector: "[dbxActionSnackbarError]", inputs: ["dbxActionSnackbarError"] }, { kind: "directive", type: DbxActionDialogDirective, selector: "[dbxActionDialog]", inputs: ["dbxActionDialog", "dbxActionDialogIsModified", "dbxActionDialogIsEqual"], exportAs: ["dbxActionDialog"] }, { kind: "component", type: DbxAnchorComponent, selector: "dbx-anchor, [dbx-anchor]", inputs: ["block"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
223
|
+
}
|
|
224
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadButton, decorators: [{
|
|
225
|
+
type: Component,
|
|
226
|
+
args: [{
|
|
227
|
+
selector: 'dbx-firebase-storagefile-download-button',
|
|
228
|
+
template: `
|
|
229
|
+
<dbx-anchor dbxActionAnchor [anchor]="anchorSignal()" dbxAction [dbxActionAutoTrigger]="preloadSignal()" dbxActionSnackbarError [dbxActionDisabled]="!storageFileKeySignal()" [dbxActionValue]="storageFileKeySignal()" [dbxActionHandler]="handleGetDownloadUrl" [dbxActionSuccessHandler]="handleGetDownloadUrlSuccess" [dbxActionErrorHandler]="handleGetDownloadUrlError">
|
|
230
|
+
<dbx-button dbxActionButton [buttonStyle]="buttonStyleSignal()" [icon]="iconSignal()" [text]="textSignal()"></dbx-button>
|
|
231
|
+
</dbx-anchor>
|
|
232
|
+
@if (showPreviewButtonSignal()) {
|
|
233
|
+
<ng-container dbxAction [dbxActionDialog]="handleOpenPreviewDialog" dbxActionHandlerValue>
|
|
234
|
+
<span class="dbx-button-spacer"></span>
|
|
235
|
+
<dbx-button dbxActionButton [buttonStyle]="previewButtonStyleSignal()" [icon]="previewIconSignal()" [text]="previewTextSignal()"></dbx-button>
|
|
236
|
+
</ng-container>
|
|
237
|
+
}
|
|
238
|
+
`,
|
|
239
|
+
imports: [DbxButtonComponent, DbxActionModule, DbxActionSnackbarErrorDirective, DbxActionDialogDirective, DbxAnchorComponent],
|
|
240
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
241
|
+
standalone: true
|
|
242
|
+
}]
|
|
243
|
+
}] });
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG93bmxvYWQuYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvY29udGFpbmVyL3N0b3JhZ2VmaWxlLmRvd25sb2FkLmJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsd0JBQXdCLEVBQTJCLGVBQWUsRUFBRSwrQkFBK0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBa0Isd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6TixPQUFPLEVBQXVCLCtCQUErQixFQUFtQyxNQUFNLEVBQVMsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25KLE9BQU8sRUFBRSxxQ0FBcUMsRUFBcUQsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuSixPQUFPLEVBQTBCLCtCQUErQixFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsSCxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLDBCQUEwQixDQUFDOzs7QUFnRm5FLE1BQU0sT0FBTyxvQ0FBb0M7SUFDdEMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU5Qix3QkFBd0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM1RCxxQ0FBcUMsR0FBRyxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUUvRjs7T0FFRztJQUNNLGNBQWMsR0FBRyxLQUFLLEVBQXlCLENBQUM7SUFFekQ7O09BRUc7SUFDTSxzQkFBc0IsR0FBRyxLQUFLLEVBQWlDLENBQUM7SUFFekU7O09BRUc7SUFDTSxhQUFhLEdBQUcsS0FBSyxFQUF1QyxDQUFDO0lBRXRFOzs7O09BSUc7SUFDTSxpQkFBaUIsR0FBRyxLQUFLLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBRXpEOztPQUVHO0lBQ00saUJBQWlCLEdBQUcsTUFBTSxFQUFpQyxDQUFDO0lBRTVELE1BQU0sR0FBRyxLQUFLLEVBQXFELENBQUM7SUFDcEUsTUFBTSxHQUFHLEtBQUssRUFBcUQsQ0FBQztJQUVwRSxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVwQyxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFN0IsTUFBTSxNQUFNLEdBQStDO1lBQ3pELFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVztZQUNoQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsa0JBQWtCO1lBQzlDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLGdCQUFnQjtZQUN0QyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxnQkFBZ0I7WUFDdEMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixJQUFJLFVBQVU7WUFDMUQsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixJQUFJLFdBQVc7WUFDM0QsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLElBQUksU0FBUztZQUM3QyxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsSUFBSSxXQUFXO1NBQ2hELENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztJQUVNLGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBRU0saUJBQWlCLEdBQUcsTUFBTSxDQUFnQyxTQUFTLENBQUMsQ0FBQztJQUNyRSxzQkFBc0IsR0FBRyxNQUFNLENBQTZCLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZFLDBCQUEwQixHQUFHLE1BQU0sQ0FBeUMsU0FBUyxDQUFDLENBQUM7SUFFdkYsd0JBQXdCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUxRyx5QkFBeUIsR0FBc0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3ZGLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUN2QywrQkFBK0IsRUFBRSxFQUNqQyxvQkFBb0IsRUFBRSxFQUN0QixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztJQUVPLGVBQWUsR0FBc0MsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMvSSxHQUFHLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLHdCQUF3QixDQUFDLEVBQUUsRUFBRTtRQUMxRCxPQUFPLHVCQUF1QixJQUFJLHdCQUF3QixDQUFDO0lBQzdELENBQUMsQ0FBQyxFQUNGLG9CQUFvQixFQUFFLEVBQ3RCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO0lBRU8sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUV0RCxvQkFBb0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV6RSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVuQyxNQUFNLE1BQU0sR0FBbUI7WUFDN0IsSUFBSSxFQUFFLFFBQVE7WUFDZCxHQUFHLE1BQU0sQ0FBQyxXQUFXO1NBQ3RCLENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztJQUVNLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRW5DLE1BQU0sTUFBTSxHQUFtQjtZQUM3QixJQUFJLEVBQUUsUUFBUTtZQUNkLEdBQUcsTUFBTSxDQUFDLGtCQUFrQjtTQUM3QixDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFFTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDbkQsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNsRixDQUFDLENBQUMsQ0FBQztJQUVNLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNuRCxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBRU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFN0MsSUFBSSxNQUE4QixDQUFDO1FBRW5DLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxHQUFHO2dCQUNQLEdBQUcsRUFBRSxXQUFXO2FBQ2pCLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFFTSw0QkFBNEIsR0FBRyxNQUFNLENBQzVDLEdBQUcsRUFBRTtRQUNILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRWxELElBQUksV0FBVyxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDLEVBQ0Q7UUFDRSxpQkFBaUIsRUFBRSxJQUFJO0tBQ3hCLENBQ0YsQ0FBQztJQUVGLFVBQVU7SUFDRCx1QkFBdUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNuRCxPQUFPLGNBQWMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUMsQ0FBQztJQUVNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ25DLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRU0sdUJBQXVCLEdBQTRCLEdBQUcsRUFBRTtRQUMvRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUVuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQVksQ0FBQztRQUNsRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLGtCQUFrQixJQUFJLGdCQUFnQixDQUFDO1FBRTdELE9BQU8sV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDeEgsQ0FBQyxDQUFDO0lBRUYsb0JBQW9CO0lBQ3BCLG1IQUFtSDtJQUMxRywyQkFBMkIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDOUQsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLG1DQUFtQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUMxSCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztJQUVPLGdDQUFnQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUU5RSxlQUFlLEdBQUcsTUFBTSxDQUMvQixHQUFHLEVBQUU7UUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUUzRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUMsRUFDRDtRQUNFLGlCQUFpQixFQUFFLElBQUk7S0FDeEIsQ0FDRixDQUFDO0lBRUYsb0JBQW9CO0lBQ1gscUJBQXFCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpKLHNCQUFzQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQy9ELFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ2QsSUFBSSxHQUF3QixDQUFDO1FBRTdCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDTixHQUFHLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FDL0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNwQixvQkFBb0IsRUFBRSxFQUN0QixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsRUFDRixvQkFBb0IsRUFBRSxFQUN0QixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztJQUVPLDJCQUEyQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNwRSwyQkFBMkIsR0FBRyxNQUFNLENBQzNDLEdBQUcsRUFBRTtRQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBRW5ELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQyxFQUNEO1FBQ0UsaUJBQWlCLEVBQUUsSUFBSTtLQUN4QixDQUNGLENBQUM7SUFFRixnQkFBZ0I7SUFDUCx1QkFBdUIsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1FBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxXQUFXO0lBQ0Ysb0JBQW9CLEdBQTRFLENBQUMsS0FBcUIsRUFBRSxPQUE0RSxFQUFFLEVBQUU7UUFDL00sTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE1BQU0sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRTVELElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLHFDQUFxQyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzVJLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFTywyQkFBMkIsR0FBRyxDQUFDLEtBQTRDLEVBQUUsRUFBRTtRQUN0RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsTUFBTSxFQUFFLDJCQUEyQixFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUVyRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyRCxJQUFJLDJCQUEyQixFQUFFLENBQUM7WUFDaEMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVPLHlCQUF5QixHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE1BQU0sRUFBRSx5QkFBeUIsRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFbkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFL0MsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1lBQzlCLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDLENBQUM7d0dBNVJTLG9DQUFvQzs0RkFBcEMsb0NBQW9DLHFnQ0FmckM7Ozs7Ozs7Ozs7R0FVVCw0REFDUyxrQkFBa0Isc1BBQUUsZUFBZSxpMkNBQUUsK0JBQStCLHlHQUFFLHdCQUF3QixpTEFBRSxrQkFBa0I7OzRGQUlqSCxvQ0FBb0M7a0JBakJoRCxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQ0FBMEM7b0JBQ3BELFFBQVEsRUFBRTs7Ozs7Ozs7OztHQVVUO29CQUNELE9BQU8sRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSwrQkFBK0IsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQztvQkFDN0gsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYnhBY3Rpb25EaWFsb2dEaXJlY3RpdmUsIERieEFjdGlvbkRpYWxvZ0Z1bmN0aW9uLCBEYnhBY3Rpb25Nb2R1bGUsIERieEFjdGlvblNuYWNrYmFyRXJyb3JEaXJlY3RpdmUsIERieEFuY2hvckNvbXBvbmVudCwgRGJ4QnV0dG9uQ29tcG9uZW50LCBEYnhCdXR0b25TdHlsZSwgRGJ4V2ViRmlsZVByZXZpZXdTZXJ2aWNlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LXdlYic7XG5pbXBvcnQgeyBTdG9yYWdlRmlsZURvd25sb2FkVXJsLCBTdG9yYWdlRmlsZUtleSB9IGZyb20gJ0BkZXJlZWtiL2ZpcmViYXNlJztcbmltcG9ydCB7IENvbnRlbnRUeXBlTWltZVR5cGUsIGRhdGVGcm9tRGF0ZU9yVGltZVNlY29uZHNOdW1iZXIsIERhdGVPclVuaXhEYXRlVGltZVNlY29uZHNOdW1iZXIsIGlzUGFzdCwgTWF5YmUsIE1TX0lOX1NFQ09ORCB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZSwgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZSB9IGZyb20gJy4uL3NlcnZpY2Uvc3RvcmFnZWZpbGUuZG93bmxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBDbGlja2FibGVBbmNob3IgfSBmcm9tICdAZGVyZWVrYi9kYngtY29yZSc7XG5pbXBvcnQgeyBNYXliZU9ic2VydmFibGVPclZhbHVlLCBtYXliZVZhbHVlRnJvbU9ic2VydmFibGVPclZhbHVlLCBXb3JrSW5zdGFuY2UsIFdvcmtVc2luZ0NvbnRleHQgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgaW50ZXJ2YWwsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXIgfSBmcm9tICcuLi9zZXJ2aWNlL3N0b3JhZ2VmaWxlLmRvd25sb2FkLnN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkQnV0dG9uU291cmNlIHtcbiAgLyoqXG4gICAqIEEgc3RhdGljIFN0b3JhZ2VGaWxlS2V5IHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VGaWxlS2V5PzogTWF5YmVPYnNlcnZhYmxlT3JWYWx1ZTxTdG9yYWdlRmlsZUtleT47XG4gIC8qKlxuICAgKiBUaGUgZXhwZWN0ZWQgbWltZSB0eXBlIG9mIHRoZSBTdG9yYWdlRmlsZSB0byB1c2Ugd2hlbiBwcmV2aWV3aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVFbWJlZE1pbWVUeXBlPzogTWF5YmVPYnNlcnZhYmxlT3JWYWx1ZTxDb250ZW50VHlwZU1pbWVUeXBlIHwgc3RyaW5nPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBzb3VyY2UgdG8gdXNlIHdpdGggdGhlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UuIEEgbW9yZSBzaW1wbGUgYWx0ZXJuYXRpdmUgdG8gdXNpbmcgaGFuZGxlR2V0RG93bmxvYWRVcmwoKS5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVNvdXJjZT86IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2VDdXN0b21Tb3VyY2U+O1xuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIHdvcmsgdG8gdXNlIHRvIGdldCB0aGUgZG93bmxvYWQgVVJMLlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgY3VzdG9tU291cmNlIGlzIGlnbm9yZWQuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVHZXREb3dubG9hZFVybD86IE1heWJlPFdvcmtVc2luZ0NvbnRleHQ8U3RvcmFnZUZpbGVLZXksIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+PjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGN1c3RvbSBzdWNjZXNzIGhhbmRsZXIgZm9yIHRoZSBkb3dubG9hZCBVUkwuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVHZXREb3dubG9hZFVybFN1Y2Nlc3M/OiAodmFsdWU6IERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXIpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gZXJyb3IgaGFuZGxlciBmb3IgdGhlIGRvd25sb2FkIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZUdldERvd25sb2FkVXJsRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZEJ1dHRvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWcge1xuICByZWFkb25seSBidXR0b25TdHlsZT86IE1heWJlPERieEJ1dHRvblN0eWxlPjtcbiAgcmVhZG9ubHkgcHJldmlld0J1dHRvblN0eWxlPzogTWF5YmU8RGJ4QnV0dG9uU3R5bGU+O1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcHJlLWxvYWQgdGhlIGRvd25sb2FkIHVybCBmcm9tIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlbG9hZD86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gc2hvdyBhIHByZXZpZXcgYnV0dG9uLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1ByZXZpZXdCdXR0b24/OiBNYXliZTxib29sZWFuPjtcbiAgcmVhZG9ubHkgaWNvbj86IE1heWJlPHN0cmluZz47XG4gIHJlYWRvbmx5IHRleHQ/OiBNYXliZTxzdHJpbmc+O1xuICByZWFkb25seSBkb3dubG9hZFJlYWR5SWNvbj86IE1heWJlPHN0cmluZz47XG4gIHJlYWRvbmx5IGRvd25sb2FkUmVhZHlUZXh0PzogTWF5YmU8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJldmlld0ljb24/OiBNYXliZTxzdHJpbmc+O1xuICByZWFkb25seSBwcmV2aWV3VGV4dD86IE1heWJlPHN0cmluZz47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gZnVuY3Rpb24gdG8gb3BlbiBhIHByZXZpZXcgZGlhbG9nLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IHByZXZpZXcgZGlhbG9nIHByb3ZpZGVkIGJ5IHRoZSBEYnhXZWJGaWxlUHJldmlld1NlcnZpY2Ugd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gY2FuIHJldHVybiB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgcHJldmlldyBkaWFsb2cgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlbkN1c3RvbVByZXZpZXc/OiBNYXliZTwoZG93bmxvYWRVcmw6IFN0b3JhZ2VGaWxlRG93bmxvYWRVcmwsIGVtYmVkTWltZVR5cGU/OiBNYXliZTxzdHJpbmc+KSA9PiBNYXliZTxNYXREaWFsb2dSZWY8YW55Pj4+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYngtZmlyZWJhc2Utc3RvcmFnZWZpbGUtZG93bmxvYWQtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGJ4LWFuY2hvciBkYnhBY3Rpb25BbmNob3IgW2FuY2hvcl09XCJhbmNob3JTaWduYWwoKVwiIGRieEFjdGlvbiBbZGJ4QWN0aW9uQXV0b1RyaWdnZXJdPVwicHJlbG9hZFNpZ25hbCgpXCIgZGJ4QWN0aW9uU25hY2tiYXJFcnJvciBbZGJ4QWN0aW9uRGlzYWJsZWRdPVwiIXN0b3JhZ2VGaWxlS2V5U2lnbmFsKClcIiBbZGJ4QWN0aW9uVmFsdWVdPVwic3RvcmFnZUZpbGVLZXlTaWduYWwoKVwiIFtkYnhBY3Rpb25IYW5kbGVyXT1cImhhbmRsZUdldERvd25sb2FkVXJsXCIgW2RieEFjdGlvblN1Y2Nlc3NIYW5kbGVyXT1cImhhbmRsZUdldERvd25sb2FkVXJsU3VjY2Vzc1wiIFtkYnhBY3Rpb25FcnJvckhhbmRsZXJdPVwiaGFuZGxlR2V0RG93bmxvYWRVcmxFcnJvclwiPlxuICAgICAgPGRieC1idXR0b24gZGJ4QWN0aW9uQnV0dG9uIFtidXR0b25TdHlsZV09XCJidXR0b25TdHlsZVNpZ25hbCgpXCIgW2ljb25dPVwiaWNvblNpZ25hbCgpXCIgW3RleHRdPVwidGV4dFNpZ25hbCgpXCI+PC9kYngtYnV0dG9uPlxuICAgIDwvZGJ4LWFuY2hvcj5cbiAgICBAaWYgKHNob3dQcmV2aWV3QnV0dG9uU2lnbmFsKCkpIHtcbiAgICAgIDxuZy1jb250YWluZXIgZGJ4QWN0aW9uIFtkYnhBY3Rpb25EaWFsb2ddPVwiaGFuZGxlT3BlblByZXZpZXdEaWFsb2dcIiBkYnhBY3Rpb25IYW5kbGVyVmFsdWU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGJ4LWJ1dHRvbi1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgIDxkYngtYnV0dG9uIGRieEFjdGlvbkJ1dHRvbiBbYnV0dG9uU3R5bGVdPVwicHJldmlld0J1dHRvblN0eWxlU2lnbmFsKClcIiBbaWNvbl09XCJwcmV2aWV3SWNvblNpZ25hbCgpXCIgW3RleHRdPVwicHJldmlld1RleHRTaWduYWwoKVwiPjwvZGJ4LWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgYCxcbiAgaW1wb3J0czogW0RieEJ1dHRvbkNvbXBvbmVudCwgRGJ4QWN0aW9uTW9kdWxlLCBEYnhBY3Rpb25TbmFja2JhckVycm9yRGlyZWN0aXZlLCBEYnhBY3Rpb25EaWFsb2dEaXJlY3RpdmUsIERieEFuY2hvckNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZEJ1dHRvbiB7XG4gIHJlYWRvbmx5IG1hdERpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuXG4gIHJlYWRvbmx5IGRieFdlYkZpbGVQcmV2aWV3U2VydmljZSA9IGluamVjdChEYnhXZWJGaWxlUHJldmlld1NlcnZpY2UpO1xuICByZWFkb25seSBkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlID0gaW5qZWN0KERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBUaGUgU3RvcmFnZUZpbGVLZXkgdG8gc2V0IHVwIHRoZSBkb3dubG9hZCBidXR0b24gZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVLZXkgPSBpbnB1dDxNYXliZTxTdG9yYWdlRmlsZUtleT4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBkb3dubG9hZCBVUkwgdG8gdXNlIGZvciB0aGUgZG93bmxvYWQgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVEb3dubG9hZFVybCA9IGlucHV0PE1heWJlPFN0b3JhZ2VGaWxlRG93bmxvYWRVcmw+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgTUlNRSB0eXBlIHRvIHVzZSB0aGUgZW1iZWQgY29tcG9uZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZW1iZWRNaW1lVHlwZSA9IGlucHV0PE1heWJlPENvbnRlbnRUeXBlTWltZVR5cGUgfCBzdHJpbmc+PigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IGEgcHJldmlldyBidXR0b24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICByZWFkb25seSBzaG93UHJldmlld0J1dHRvbiA9IGlucHV0PE1heWJlPGJvb2xlYW4+Pih0cnVlKTtcblxuICAvKipcbiAgICogT3V0cHV0IGV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZG93bmxvYWQgVVJMIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBkb3dubG9hZFVybENoYW5nZSA9IG91dHB1dDxNYXliZTxTdG9yYWdlRmlsZURvd25sb2FkVXJsPj4oKTtcblxuICByZWFkb25seSBjb25maWcgPSBpbnB1dDxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWc+PigpO1xuICByZWFkb25seSBzb3VyY2UgPSBpbnB1dDxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Tb3VyY2U+PigpO1xuXG4gIHJlYWRvbmx5IHNvdXJjZSQgPSB0b09ic2VydmFibGUodGhpcy5zb3VyY2UpO1xuXG4gIHJlYWRvbmx5IGNvbmZpZ1NpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZygpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWcgPSB7XG4gICAgICBidXR0b25TdHlsZTogY29uZmlnPy5idXR0b25TdHlsZSxcbiAgICAgIHByZXZpZXdCdXR0b25TdHlsZTogY29uZmlnPy5wcmV2aWV3QnV0dG9uU3R5bGUsXG4gICAgICBpY29uOiBjb25maWc/Lmljb24gPz8gJ2Nsb3VkX2Rvd25sb2FkJyxcbiAgICAgIHRleHQ6IGNvbmZpZz8udGV4dCA/PyAnU3RhcnQgRG93bmxvYWQnLFxuICAgICAgZG93bmxvYWRSZWFkeUljb246IGNvbmZpZz8uZG93bmxvYWRSZWFkeUljb24gPz8gJ2Rvd25sb2FkJyxcbiAgICAgIGRvd25sb2FkUmVhZHlUZXh0OiBjb25maWc/LmRvd25sb2FkUmVhZHlUZXh0ID8/ICdTYXZlIEZpbGUnLFxuICAgICAgcHJldmlld0ljb246IGNvbmZpZz8ucHJldmlld0ljb24gPz8gJ3ByZXZpZXcnLFxuICAgICAgcHJldmlld1RleHQ6IGNvbmZpZz8ucHJldmlld1RleHQgPz8gJ1ZpZXcgRmlsZSdcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcHJlbG9hZFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIHJldHVybiBjb25maWcucHJlbG9hZCA/PyBmYWxzZTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZG93bmxvYWRVcmxTaWduYWwgPSBzaWduYWw8TWF5YmU8U3RvcmFnZUZpbGVEb3dubG9hZFVybD4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRvd25sb2FkTWltZVR5cGVTaWduYWwgPSBzaWduYWw8TWF5YmU8Q29udGVudFR5cGVNaW1lVHlwZT4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsID0gc2lnbmFsPE1heWJlPERhdGVPclVuaXhEYXRlVGltZVNlY29uZHNOdW1iZXI+Pih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IHN0b3JhZ2VGaWxlS2V5RnJvbUlucHV0JCA9IHRvT2JzZXJ2YWJsZSh0aGlzLnN0b3JhZ2VGaWxlS2V5KS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUtleUZyb21Tb3VyY2UkOiBPYnNlcnZhYmxlPE1heWJlPFN0b3JhZ2VGaWxlS2V5Pj4gPSB0aGlzLnNvdXJjZSQucGlwZShcbiAgICBtYXAoKHNvdXJjZSkgPT4gc291cmNlPy5zdG9yYWdlRmlsZUtleSksXG4gICAgbWF5YmVWYWx1ZUZyb21PYnNlcnZhYmxlT3JWYWx1ZSgpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUtleSQ6IE9ic2VydmFibGU8TWF5YmU8U3RvcmFnZUZpbGVLZXk+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc3RvcmFnZUZpbGVLZXlGcm9tSW5wdXQkLCB0aGlzLnN0b3JhZ2VGaWxlS2V5RnJvbVNvdXJjZSRdKS5waXBlKFxuICAgIG1hcCgoW3N0b3JhZ2VGaWxlS2V5RnJvbUlucHV0LCBzdG9yYWdlRmlsZUtleUZyb21Tb3VyY2VdKSA9PiB7XG4gICAgICByZXR1cm4gc3RvcmFnZUZpbGVLZXlGcm9tSW5wdXQgPz8gc3RvcmFnZUZpbGVLZXlGcm9tU291cmNlO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUtleVNpZ25hbCA9IHRvU2lnbmFsKHRoaXMuc3RvcmFnZUZpbGVLZXkkKTtcblxuICByZWFkb25seSBoYXNEb3dubG9hZFVybFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IEJvb2xlYW4odGhpcy5kb3dubG9hZFVybFNpZ25hbCgpKSk7XG5cbiAgcmVhZG9ubHkgYnV0dG9uU3R5bGVTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogRGJ4QnV0dG9uU3R5bGUgPSB7XG4gICAgICB0eXBlOiAncmFpc2VkJyxcbiAgICAgIC4uLmNvbmZpZy5idXR0b25TdHlsZVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICByZWFkb25seSBwcmV2aWV3QnV0dG9uU3R5bGVTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogRGJ4QnV0dG9uU3R5bGUgPSB7XG4gICAgICB0eXBlOiAncmFpc2VkJyxcbiAgICAgIC4uLmNvbmZpZy5wcmV2aWV3QnV0dG9uU3R5bGVcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaWNvblNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIGNvbnN0IGhhc0Rvd25sb2FkVXJsID0gdGhpcy5oYXNEb3dubG9hZFVybFNpZ25hbCgpO1xuICAgIHJldHVybiBoYXNEb3dubG9hZFVybCA/IChjb25maWcuZG93bmxvYWRSZWFkeUljb24gPz8gY29uZmlnLmljb24pIDogY29uZmlnLmljb247XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRleHRTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICBjb25zdCBoYXNEb3dubG9hZFVybCA9IHRoaXMuaGFzRG93bmxvYWRVcmxTaWduYWwoKTtcbiAgICByZXR1cm4gaGFzRG93bmxvYWRVcmwgPyAoY29uZmlnLmRvd25sb2FkUmVhZHlUZXh0ID8/IGNvbmZpZy50ZXh0KSA6IGNvbmZpZy50ZXh0O1xuICB9KTtcblxuICByZWFkb25seSBwcmV2aWV3SWNvblNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIHJldHVybiBjb25maWcucHJldmlld0ljb247XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHByZXZpZXdUZXh0U2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2lnbmFsKCk7XG4gICAgcmV0dXJuIGNvbmZpZy5wcmV2aWV3VGV4dDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYW5jaG9yU2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRvd25sb2FkVXJsID0gdGhpcy5kb3dubG9hZFVybFNpZ25hbCgpO1xuXG4gICAgbGV0IHJlc3VsdDogTWF5YmU8Q2xpY2thYmxlQW5jaG9yPjtcblxuICAgIGlmIChkb3dubG9hZFVybCkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICB1cmw6IGRvd25sb2FkVXJsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN0b3JhZ2VGaWxlRG93bmxvYWRVcmxFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLnN0b3JhZ2VGaWxlRG93bmxvYWRVcmwoKTtcblxuICAgICAgaWYgKGRvd25sb2FkVXJsIHx8IGRvd25sb2FkVXJsID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KGRvd25sb2FkVXJsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlXG4gICAgfVxuICApO1xuXG4gIC8vIFByZXZpZXdcbiAgcmVhZG9ubHkgc2hvd1ByZXZpZXdCdXR0b25TaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICBjb25zdCBoYXNEb3dubG9hZFVybCA9IHRoaXMuaGFzRG93bmxvYWRVcmxTaWduYWwoKTtcbiAgICByZXR1cm4gaGFzRG93bmxvYWRVcmwgJiYgKGNvbmZpZy5zaG93UHJldmlld0J1dHRvbiA/PyB0cnVlKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgb3BlbkN1c3RvbVByZXZpZXdTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICByZXR1cm4gY29uZmlnLm9wZW5DdXN0b21QcmV2aWV3O1xuICB9KTtcblxuICByZWFkb25seSBoYW5kbGVPcGVuUHJldmlld0RpYWxvZzogRGJ4QWN0aW9uRGlhbG9nRnVuY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3Qgb3BlblByZXZpZXcgPSB0aGlzLm9wZW5DdXN0b21QcmV2aWV3U2lnbmFsKCk7XG5cbiAgICBjb25zdCBzcmNVcmwgPSB0aGlzLmRvd25sb2FkVXJsU2lnbmFsKCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGlucHV0RW1iZWRNaW1lVHlwZSA9IHRoaXMuZW1iZWRNaW1lVHlwZSgpO1xuICAgIGNvbnN0IGRvd25sb2FkTWltZVR5cGUgPSB0aGlzLmRvd25sb2FkTWltZVR5cGVTaWduYWwoKTtcbiAgICBjb25zdCBlbWJlZE1pbWVUeXBlID0gaW5wdXRFbWJlZE1pbWVUeXBlID8/IGRvd25sb2FkTWltZVR5cGU7XG5cbiAgICByZXR1cm4gb3BlblByZXZpZXc/LihzcmNVcmwsIGVtYmVkTWltZVR5cGUpID8/IHRoaXMuZGJ4V2ViRmlsZVByZXZpZXdTZXJ2aWNlLm9wZW5QcmV2aWV3RGlhbG9nKHNyY1VybCwgZW1iZWRNaW1lVHlwZSk7XG4gIH07XG5cbiAgLy8gQ2FjaGVkIFVybCBFZmZlY3RcbiAgLy8gV2hlbiB0aGUga2V5IGNoYW5nZXMsIGNoZWNrIHRoZSBjYWNoZSB0byBzZWUgaWYgaXQgaXMgYWxyZWFkeSBhdmFpbGFibGUsIGFuZCBwb3B1bGF0ZSB0aGUgZG93bmxvYWQgdXJsIGlmIGl0IGlzLlxuICByZWFkb25seSBjYWNoZWRVcmxGb3JTdG9yYWdlRmlsZUtleSQgPSB0aGlzLnN0b3JhZ2VGaWxlS2V5JC5waXBlKFxuICAgIHN3aXRjaE1hcCgoa2V5KSA9PiAoa2V5ID8gdGhpcy5kYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlLmdldENhY2hlZERvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKGtleSkgOiBvZihudWxsKSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY2FjaGVkVXJsRm9yU3RvcmFnZUZpbGVLZXlTaWduYWwgPSB0b1NpZ25hbCh0aGlzLmNhY2hlZFVybEZvclN0b3JhZ2VGaWxlS2V5JCk7XG5cbiAgcmVhZG9ubHkgY2FjaGVkVXJsRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlZFBhaXIgPSB0aGlzLmNhY2hlZFVybEZvclN0b3JhZ2VGaWxlS2V5U2lnbmFsKCk7XG5cbiAgICAgIGlmIChjYWNoZWRQYWlyKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KGNhY2hlZFBhaXIuZG93bmxvYWRVcmwpO1xuICAgICAgICB0aGlzLmRvd25sb2FkTWltZVR5cGVTaWduYWwuc2V0KGNhY2hlZFBhaXIubWltZVR5cGUpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldChjYWNoZWRQYWlyLmV4cGlyZXNBdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZVxuICAgIH1cbiAgKTtcblxuICAvLyBFeHBpcmF0aW9uIEVmZmVjdFxuICByZWFkb25seSBkb3dubG9hZFVybEV4cGlyZXNBdCQgPSB0b09ic2VydmFibGUodGhpcy5kb3dubG9hZFVybEV4cGlyZXNBdFNpZ25hbCkucGlwZShtYXAoZGF0ZUZyb21EYXRlT3JUaW1lU2Vjb25kc051bWJlciksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBkb3dubG9hZFVybEhhc0V4cGlyZWQkID0gdGhpcy5kb3dubG9hZFVybEV4cGlyZXNBdCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICAgIGlmICh4KSB7XG4gICAgICAgIG9icyA9IGludGVydmFsKE1TX0lOX1NFQ09ORCkucGlwZShcbiAgICAgICAgICBtYXAoKCkgPT4gaXNQYXN0KHgpKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnMgPSBvZihmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnM7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsSGFzRXhwaXJlZFNpZ25hbCA9IHRvU2lnbmFsKHRoaXMuZG93bmxvYWRVcmxIYXNFeHBpcmVkJCk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsSGFzRXhwaXJlZEVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBleHBpcmVkID0gdGhpcy5kb3dubG9hZFVybEhhc0V4cGlyZWRTaWduYWwoKTtcblxuICAgICAgaWYgKGV4cGlyZWQpIHtcbiAgICAgICAgdGhpcy5kb3dubG9hZFVybFNpZ25hbC5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kb3dubG9hZE1pbWVUeXBlU2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgYWxsb3dTaWduYWxXcml0ZXM6IHRydWVcbiAgICB9XG4gICk7XG5cbiAgLy8gT3V0cHV0IEVmZmVjdFxuICByZWFkb25seSBkb3dubG9hZFVybENoYW5nZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLmRvd25sb2FkVXJsU2lnbmFsKCk7XG4gICAgdGhpcy5kb3dubG9hZFVybENoYW5nZS5lbWl0KGRvd25sb2FkVXJsKTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlcnNcbiAgcmVhZG9ubHkgaGFuZGxlR2V0RG93bmxvYWRVcmw6IFdvcmtVc2luZ0NvbnRleHQ8U3RvcmFnZUZpbGVLZXksIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+ID0gKHZhbHVlOiBTdG9yYWdlRmlsZUtleSwgY29udGV4dDogV29ya0luc3RhbmNlPFN0b3JhZ2VGaWxlS2V5LCBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPikgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlKCk7XG4gICAgY29uc3QgeyBjdXN0b21Tb3VyY2UsIGhhbmRsZUdldERvd25sb2FkVXJsIH0gPSBzb3VyY2UgPz8ge307XG5cbiAgICBpZiAoaGFuZGxlR2V0RG93bmxvYWRVcmwpIHtcbiAgICAgIGhhbmRsZUdldERvd25sb2FkVXJsKHZhbHVlLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5zdGFydFdvcmtpbmdXaXRoT2JzZXJ2YWJsZSh0aGlzLmRieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UuZG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGVVc2luZ1NvdXJjZSh2YWx1ZSwgY3VzdG9tU291cmNlKSk7XG4gICAgfVxuICB9O1xuXG4gIHJlYWRvbmx5IGhhbmRsZUdldERvd25sb2FkVXJsU3VjY2VzcyA9ICh2YWx1ZTogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcikgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlKCk7XG4gICAgY29uc3QgeyBoYW5kbGVHZXREb3dubG9hZFVybFN1Y2Nlc3MgfSA9IHNvdXJjZSA/PyB7fTtcblxuICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KHZhbHVlLmRvd25sb2FkVXJsKTtcbiAgICB0aGlzLmRvd25sb2FkTWltZVR5cGVTaWduYWwuc2V0KHZhbHVlLm1pbWVUeXBlKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh2YWx1ZS5leHBpcmVzQXQpO1xuXG4gICAgaWYgKGhhbmRsZUdldERvd25sb2FkVXJsU3VjY2Vzcykge1xuICAgICAgaGFuZGxlR2V0RG93bmxvYWRVcmxTdWNjZXNzKHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmVhZG9ubHkgaGFuZGxlR2V0RG93bmxvYWRVcmxFcnJvciA9IChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlKCk7XG4gICAgY29uc3QgeyBoYW5kbGVHZXREb3dubG9hZFVybEVycm9yIH0gPSBzb3VyY2UgPz8ge307XG5cbiAgICB0aGlzLmRvd25sb2FkVXJsU2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuZG93bmxvYWRNaW1lVHlwZVNpZ25hbC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh1bmRlZmluZWQpO1xuXG4gICAgaWYgKGhhbmRsZUdldERvd25sb2FkVXJsRXJyb3IpIHtcbiAgICAgIGhhbmRsZUdldERvd25sb2FkVXJsRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * from './container';
|
|
2
2
|
export * from './store';
|
|
3
|
+
export * from './service';
|
|
3
4
|
export * from './storagefile.upload.module';
|
|
4
|
-
|
|
5
|
+
export * from './storagefile.providers';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnByb3ZpZGVycyc7XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './storagefile.download.service';
|
|
2
|
+
export * from './storagefile.download.storage.service';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL3NlcnZpY2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHdDQUF3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUuZG93bmxvYWQuc3RvcmFnZS5zZXJ2aWNlJztcbiJdfQ==
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { StorageFileFunctions, firestoreModelId, firestoreModelKey, storageFileIdentity } from '@dereekb/firebase';
|
|
3
|
+
import { addMilliseconds, MS_IN_DAY, MS_IN_HOUR, MS_IN_MINUTE, SECONDS_IN_MINUTE, unixDateTimeSecondsNumberForNow, unixDateTimeSecondsNumberFromDate } from '@dereekb/util';
|
|
4
|
+
import { DbxFirebaseStorageFileDownloadStorage } from './storagefile.download.storage.service';
|
|
5
|
+
import { first, firstValueFrom, from, interval, map, of, shareReplay, startWith, switchMap, tap } from 'rxjs';
|
|
6
|
+
import { throwErrorFromLoadingStateError, valueFromFinishedLoadingState } from '@dereekb/rxjs';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export function dbxFirebaseStorageFileDownloadServiceCustomSourceFromObs(obsForInput) {
|
|
9
|
+
return {
|
|
10
|
+
downloadStorageFileResult: (params, storageFileId) => firstValueFrom(obsForInput(params, storageFileId).pipe(throwErrorFromLoadingStateError(), valueFromFinishedLoadingState()))
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Service used for retrieving download links for StorageFiles.
|
|
15
|
+
*/
|
|
16
|
+
export class DbxFirebaseStorageFileDownloadService {
|
|
17
|
+
/**
|
|
18
|
+
* Expiration duration for cached download URLs.
|
|
19
|
+
*/
|
|
20
|
+
_expiresAfterTime = MS_IN_HOUR * 12;
|
|
21
|
+
/**
|
|
22
|
+
* When reading cached values, this buffer is added to the expiration time to prevent the URL from expiring while it is being used.
|
|
23
|
+
*/
|
|
24
|
+
_expiresAfterTimeBuffer = SECONDS_IN_MINUTE * 10;
|
|
25
|
+
storageFileFunctions = inject(StorageFileFunctions);
|
|
26
|
+
storageFileDownloadStorage = inject(DbxFirebaseStorageFileDownloadStorage);
|
|
27
|
+
// MARK: Config
|
|
28
|
+
getExpiresAfterTime() {
|
|
29
|
+
return this._expiresAfterTime;
|
|
30
|
+
}
|
|
31
|
+
setExpiresAfterTime(expiresAfter) {
|
|
32
|
+
const maxAllowed = MS_IN_DAY * 20;
|
|
33
|
+
if (expiresAfter > maxAllowed) {
|
|
34
|
+
throw new Error(`Expires after time cannot be greater than 20 days.`);
|
|
35
|
+
}
|
|
36
|
+
else if (expiresAfter < MS_IN_HOUR) {
|
|
37
|
+
throw new Error(`Expires after time cannot be less than 1 hour.`);
|
|
38
|
+
}
|
|
39
|
+
this._expiresAfterTime = expiresAfter;
|
|
40
|
+
}
|
|
41
|
+
// MARK: Download
|
|
42
|
+
/**
|
|
43
|
+
* Returns an observable that returns the cached download URL pair for the StorageFile, and emits null once it expires.
|
|
44
|
+
*
|
|
45
|
+
* @param storageFileIdOrKey
|
|
46
|
+
* @returns
|
|
47
|
+
*/
|
|
48
|
+
getCachedDownloadPairForStorageFile(storageFileIdOrKey) {
|
|
49
|
+
const storageFileId = firestoreModelId(storageFileIdOrKey);
|
|
50
|
+
return this.storageFileDownloadStorage.getDownloadUrlPair(storageFileId).pipe(switchMap((pair) => {
|
|
51
|
+
let result;
|
|
52
|
+
if (pair) {
|
|
53
|
+
const expiresAt = pair.expiresAt - this._expiresAfterTimeBuffer;
|
|
54
|
+
function pairIfNotExpired() {
|
|
55
|
+
const now = unixDateTimeSecondsNumberForNow();
|
|
56
|
+
const isExpired = now > expiresAt;
|
|
57
|
+
return isExpired ? null : pair;
|
|
58
|
+
}
|
|
59
|
+
const initialPair = pairIfNotExpired();
|
|
60
|
+
if (initialPair) {
|
|
61
|
+
// every minute emit the result again
|
|
62
|
+
result = interval(MS_IN_MINUTE).pipe(map(pairIfNotExpired), first((x) => x == null), // only emit the first null value
|
|
63
|
+
startWith(initialPair), // send the initial value first
|
|
64
|
+
shareReplay(1));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
result = of(null);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
result = of(null);
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Retrieves the download URL for the StorageFile using the default parameters.
|
|
78
|
+
*
|
|
79
|
+
* These URLs are cached locally to prevent extra/redundant calls to the server.
|
|
80
|
+
*
|
|
81
|
+
* @param storageFileIdOrKey
|
|
82
|
+
* @returns
|
|
83
|
+
*/
|
|
84
|
+
downloadPairForStorageFile(storageFileIdOrKey) {
|
|
85
|
+
return this.downloadPairForStorageFileUsingSource(storageFileIdOrKey, undefined);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Retrieves the download URL for the StorageFile using the default parameters and pulled from the input source, if applicable.
|
|
89
|
+
*
|
|
90
|
+
* If no source is provided, uses the default internal source.
|
|
91
|
+
*
|
|
92
|
+
* These URLs are cached locally to prevent extra/redundant calls to the server.
|
|
93
|
+
*
|
|
94
|
+
* @param storageFileIdOrKey
|
|
95
|
+
* @returns
|
|
96
|
+
*/
|
|
97
|
+
downloadPairForStorageFileUsingSource(storageFileIdOrKey, source) {
|
|
98
|
+
const storageFileId = firestoreModelId(storageFileIdOrKey);
|
|
99
|
+
const obs = this.getCachedDownloadPairForStorageFile(storageFileId).pipe(switchMap((cachedPair) => {
|
|
100
|
+
let result;
|
|
101
|
+
const downloadAndCacheResult = () => {
|
|
102
|
+
return from(this._createDownloadPairForStorageFileUsingSource(source, storageFileIdOrKey)).pipe(tap((downloadUrlPair) => {
|
|
103
|
+
this.addPairForStorageFileToCache(downloadUrlPair);
|
|
104
|
+
}));
|
|
105
|
+
};
|
|
106
|
+
if (cachedPair) {
|
|
107
|
+
result = of(cachedPair);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
result = downloadAndCacheResult();
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
}), first(), shareReplay(1));
|
|
114
|
+
return obs;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Adds the given download URL pair to the cache.
|
|
118
|
+
*/
|
|
119
|
+
addPairForStorageFileToCache(downloadUrlPair) {
|
|
120
|
+
this.storageFileDownloadStorage.addDownloadUrl(downloadUrlPair).pipe(first()).subscribe();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Creates a new download URL for the StorageFile.
|
|
124
|
+
*
|
|
125
|
+
* @param storageFileIdOrKey
|
|
126
|
+
* @param inputParams
|
|
127
|
+
* @returns
|
|
128
|
+
*/
|
|
129
|
+
createDownloadPairForStorageFile(storageFileIdOrKey, inputParams) {
|
|
130
|
+
return this._createDownloadPairForStorageFileUsingSource(undefined, storageFileIdOrKey, inputParams);
|
|
131
|
+
}
|
|
132
|
+
_createDownloadPairForStorageFileUsingSource(inputSource, storageFileIdOrKey, inputParams) {
|
|
133
|
+
const source = inputSource ?? {
|
|
134
|
+
downloadStorageFileResult: (params) => this.storageFileFunctions.storageFile.readStorageFile.download(params)
|
|
135
|
+
};
|
|
136
|
+
const storageFileId = firestoreModelId(storageFileIdOrKey);
|
|
137
|
+
const expiresAt = inputParams?.expiresAt ?? addMilliseconds(new Date(), this._expiresAfterTime);
|
|
138
|
+
const params = {
|
|
139
|
+
...inputParams,
|
|
140
|
+
expiresAt,
|
|
141
|
+
key: firestoreModelKey(storageFileIdentity, storageFileId)
|
|
142
|
+
};
|
|
143
|
+
return source.downloadStorageFileResult(params, storageFileId).then((x) => {
|
|
144
|
+
return {
|
|
145
|
+
id: storageFileId,
|
|
146
|
+
downloadUrl: x.url,
|
|
147
|
+
mimeType: x.mimeType,
|
|
148
|
+
expiresAt: x.expiresAt ?? unixDateTimeSecondsNumberFromDate(expiresAt)
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
153
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService });
|
|
154
|
+
}
|
|
155
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService, decorators: [{
|
|
156
|
+
type: Injectable
|
|
157
|
+
}] });
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG93bmxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvc2VydmljZS9zdG9yYWdlZmlsZS5kb3dubG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBNEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQTZCLE1BQU0sbUJBQW1CLENBQUM7QUFDeE0sT0FBTyxFQUFFLGVBQWUsRUFBdUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQVcsaUJBQWlCLEVBQUUsK0JBQStCLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMU0sT0FBTyxFQUFFLHFDQUFxQyxFQUF5QyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RJLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUgsT0FBTyxFQUFnQiwrQkFBK0IsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFpQjdHLE1BQU0sVUFBVSx3REFBd0QsQ0FBQyxXQUFxSTtJQUM1TSxPQUFPO1FBQ0wseUJBQXlCLEVBQUUsQ0FBQyxNQUFpQyxFQUFFLGFBQTRCLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxFQUFFLDZCQUE2QixFQUFFLENBQUMsQ0FBdUM7S0FDbFEsQ0FB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QUFxRSxFQUFFLGtCQUFrRCxFQUFFLFdBQW9EO1FBQ2xPLE1BQU0sTUFBTSxHQUFHLFdBQVcsSUFBSTtZQUM1Qix5QkFBeUIsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUM5RyxDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWhHLE1BQU0sTUFBTSxHQUE4QjtZQUN4QyxHQUFHLFdBQVc7WUFDZCxTQUFTO1lBQ1QsR0FBRyxFQUFFLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQztTQUMzRCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hFLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLFdBQVcsRUFBRSxDQUFDLENBQUMsR0FBRztnQkFDbEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO2dCQUNwQixTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxpQ0FBaUMsQ0FBQyxTQUFTLENBQUM7YUFDdkUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F0S1UscUNBQXFDOzRHQUFyQyxxQ0FBcUM7OzRGQUFyQyxxQ0FBcUM7a0JBRGpELFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JhZ2VGaWxlRnVuY3Rpb25zLCBEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCBTdG9yYWdlRmlsZUtleSwgU3RvcmFnZUZpbGVJZCwgZmlyZXN0b3JlTW9kZWxJZCwgZmlyZXN0b3JlTW9kZWxLZXksIHN0b3JhZ2VGaWxlSWRlbnRpdHksIERvd25sb2FkU3RvcmFnZUZpbGVSZXN1bHQgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5pbXBvcnQgeyBhZGRNaWxsaXNlY29uZHMsIE1heWJlLCBNaWxsaXNlY29uZHMsIE1TX0lOX0RBWSwgTVNfSU5fSE9VUiwgTVNfSU5fTUlOVVRFLCBTZWNvbmRzLCBTRUNPTkRTX0lOX01JTlVURSwgdW5peERhdGVUaW1lU2Vjb25kc051bWJlckZvck5vdywgdW5peERhdGVUaW1lU2Vjb25kc051bWJlckZyb21EYXRlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTdG9yYWdlLCBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyIH0gZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZmlyc3QsIGZpcnN0VmFsdWVGcm9tLCBmcm9tLCBpbnRlcnZhbCwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZSwgdGhyb3dFcnJvckZyb21Mb2FkaW5nU3RhdGVFcnJvciwgdmFsdWVGcm9tRmluaXNoZWRMb2FkaW5nU3RhdGUgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcblxuZXhwb3J0IHR5cGUgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZURvd25sb2FkRnVuY3Rpb24gPSAocGFyYW1zOiBEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCBzdG9yYWdlRmlsZUlkOiBTdG9yYWdlRmlsZUlkKSA9PiBQcm9taXNlPERvd25sb2FkU3RvcmFnZUZpbGVSZXN1bHQ+O1xuXG4vKipcbiAqIFVzZWQgYXMgYSBjdXN0b20gc291cmNlIGZvciBkb3dubG9hZGluZyBTdG9yYWdlRmlsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGRvd25sb2FkIHJlc3VsdCBmb3IgdGhlIFN0b3JhZ2VGaWxlIHVzaW5nIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RvcmFnZUZpbGVJZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdDogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZURvd25sb2FkRnVuY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlQ3VzdG9tU291cmNlRnJvbU9icyhvYnNGb3JJbnB1dDogKHBhcmFtczogRG93bmxvYWRTdG9yYWdlRmlsZVBhcmFtcywgc3RvcmFnZUZpbGVJZDogU3RvcmFnZUZpbGVJZCkgPT4gT2JzZXJ2YWJsZTxMb2FkaW5nU3RhdGU8RG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdD4+KTogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZSB7XG4gIHJldHVybiB7XG4gICAgZG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdDogKHBhcmFtczogRG93bmxvYWRTdG9yYWdlRmlsZVBhcmFtcywgc3RvcmFnZUZpbGVJZDogU3RvcmFnZUZpbGVJZCkgPT4gZmlyc3RWYWx1ZUZyb20ob2JzRm9ySW5wdXQocGFyYW1zLCBzdG9yYWdlRmlsZUlkKS5waXBlKHRocm93RXJyb3JGcm9tTG9hZGluZ1N0YXRlRXJyb3IoKSwgdmFsdWVGcm9tRmluaXNoZWRMb2FkaW5nU3RhdGUoKSkpIGFzIFByb21pc2U8RG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdD5cbiAgfTtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHVzZWQgZm9yIHJldHJpZXZpbmcgZG93bmxvYWQgbGlua3MgZm9yIFN0b3JhZ2VGaWxlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2Uge1xuICAvKipcbiAgICogRXhwaXJhdGlvbiBkdXJhdGlvbiBmb3IgY2FjaGVkIGRvd25sb2FkIFVSTHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2V4cGlyZXNBZnRlclRpbWU6IE1pbGxpc2Vjb25kcyA9IE1TX0lOX0hPVVIgKiAxMjtcblxuICAvKipcbiAgICogV2hlbiByZWFkaW5nIGNhY2hlZCB2YWx1ZXMsIHRoaXMgYnVmZmVyIGlzIGFkZGVkIHRvIHRoZSBleHBpcmF0aW9uIHRpbWUgdG8gcHJldmVudCB0aGUgVVJMIGZyb20gZXhwaXJpbmcgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfZXhwaXJlc0FmdGVyVGltZUJ1ZmZlcjogU2Vjb25kcyA9IFNFQ09ORFNfSU5fTUlOVVRFICogMTA7XG5cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVGdW5jdGlvbnMgPSBpbmplY3QoU3RvcmFnZUZpbGVGdW5jdGlvbnMpO1xuICByZWFkb25seSBzdG9yYWdlRmlsZURvd25sb2FkU3RvcmFnZSA9IGluamVjdChEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTdG9yYWdlKTtcblxuICAvLyBNQVJLOiBDb25maWdcbiAgZ2V0RXhwaXJlc0FmdGVyVGltZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHBpcmVzQWZ0ZXJUaW1lO1xuICB9XG5cbiAgc2V0RXhwaXJlc0FmdGVyVGltZShleHBpcmVzQWZ0ZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG1heEFsbG93ZWQgPSBNU19JTl9EQVkgKiAyMDtcblxuICAgIGlmIChleHBpcmVzQWZ0ZXIgPiBtYXhBbGxvd2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGlyZXMgYWZ0ZXIgdGltZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDIwIGRheXMuYCk7XG4gICAgfSBlbHNlIGlmIChleHBpcmVzQWZ0ZXIgPCBNU19JTl9IT1VSKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGlyZXMgYWZ0ZXIgdGltZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDEgaG91ci5gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9leHBpcmVzQWZ0ZXJUaW1lID0gZXhwaXJlc0FmdGVyO1xuICB9XG5cbiAgLy8gTUFSSzogRG93bmxvYWRcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSB0aGF0IHJldHVybnMgdGhlIGNhY2hlZCBkb3dubG9hZCBVUkwgcGFpciBmb3IgdGhlIFN0b3JhZ2VGaWxlLCBhbmQgZW1pdHMgbnVsbCBvbmNlIGl0IGV4cGlyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzdG9yYWdlRmlsZUlkT3JLZXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldENhY2hlZERvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKHN0b3JhZ2VGaWxlSWRPcktleTogU3RvcmFnZUZpbGVJZCB8IFN0b3JhZ2VGaWxlS2V5KTogT2JzZXJ2YWJsZTxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPj4ge1xuICAgIGNvbnN0IHN0b3JhZ2VGaWxlSWQgPSBmaXJlc3RvcmVNb2RlbElkKHN0b3JhZ2VGaWxlSWRPcktleSk7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2UuZ2V0RG93bmxvYWRVcmxQYWlyKHN0b3JhZ2VGaWxlSWQpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHBhaXIpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogT2JzZXJ2YWJsZTxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPj47XG5cbiAgICAgICAgaWYgKHBhaXIpIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBwYWlyLmV4cGlyZXNBdCAtIHRoaXMuX2V4cGlyZXNBZnRlclRpbWVCdWZmZXI7XG5cbiAgICAgICAgICBmdW5jdGlvbiBwYWlySWZOb3RFeHBpcmVkKCk6IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHVuaXhEYXRlVGltZVNlY29uZHNOdW1iZXJGb3JOb3coKTtcbiAgICAgICAgICAgIGNvbnN0IGlzRXhwaXJlZCA9IG5vdyA+IGV4cGlyZXNBdDtcbiAgICAgICAgICAgIHJldHVybiBpc0V4cGlyZWQgPyBudWxsIDogcGFpcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbml0aWFsUGFpciA9IHBhaXJJZk5vdEV4cGlyZWQoKTtcblxuICAgICAgICAgIGlmIChpbml0aWFsUGFpcikge1xuICAgICAgICAgICAgLy8gZXZlcnkgbWludXRlIGVtaXQgdGhlIHJlc3VsdCBhZ2FpblxuICAgICAgICAgICAgcmVzdWx0ID0gaW50ZXJ2YWwoTVNfSU5fTUlOVVRFKS5waXBlKFxuICAgICAgICAgICAgICBtYXAocGFpcklmTm90RXhwaXJlZCksXG4gICAgICAgICAgICAgIGZpcnN0KCh4KSA9PiB4ID09IG51bGwpLCAvLyBvbmx5IGVtaXQgdGhlIGZpcnN0IG51bGwgdmFsdWVcbiAgICAgICAgICAgICAgc3RhcnRXaXRoKGluaXRpYWxQYWlyKSwgLy8gc2VuZCB0aGUgaW5pdGlhbCB2YWx1ZSBmaXJzdFxuICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gb2YobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IG9mKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGRvd25sb2FkIFVSTCBmb3IgdGhlIFN0b3JhZ2VGaWxlIHVzaW5nIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIFRoZXNlIFVSTHMgYXJlIGNhY2hlZCBsb2NhbGx5IHRvIHByZXZlbnQgZXh0cmEvcmVkdW5kYW50IGNhbGxzIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzdG9yYWdlRmlsZUlkT3JLZXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIGRvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKHN0b3JhZ2VGaWxlSWRPcktleTogU3RvcmFnZUZpbGVJZCB8IFN0b3JhZ2VGaWxlS2V5KTogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPiB7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGVVc2luZ1NvdXJjZShzdG9yYWdlRmlsZUlkT3JLZXksIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBkb3dubG9hZCBVUkwgZm9yIHRoZSBTdG9yYWdlRmlsZSB1c2luZyB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBwdWxsZWQgZnJvbSB0aGUgaW5wdXQgc291cmNlLCBpZiBhcHBsaWNhYmxlLlxuICAgKlxuICAgKiBJZiBubyBzb3VyY2UgaXMgcHJvdmlkZWQsIHVzZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc291cmNlLlxuICAgKlxuICAgKiBUaGVzZSBVUkxzIGFyZSBjYWNoZWQgbG9jYWxseSB0byBwcmV2ZW50IGV4dHJhL3JlZHVuZGFudCBjYWxscyB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gc3RvcmFnZUZpbGVJZE9yS2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBkb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZVVzaW5nU291cmNlKHN0b3JhZ2VGaWxlSWRPcktleTogU3RvcmFnZUZpbGVJZCB8IFN0b3JhZ2VGaWxlS2V5LCBzb3VyY2U6IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2VDdXN0b21Tb3VyY2U+KTogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPiB7XG4gICAgY29uc3Qgc3RvcmFnZUZpbGVJZCA9IGZpcmVzdG9yZU1vZGVsSWQoc3RvcmFnZUZpbGVJZE9yS2V5KTtcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcj4gPSB0aGlzLmdldENhY2hlZERvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKHN0b3JhZ2VGaWxlSWQpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGNhY2hlZFBhaXIpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPjtcblxuICAgICAgICBjb25zdCBkb3dubG9hZEFuZENhY2hlUmVzdWx0ID0gKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuX2NyZWF0ZURvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlVXNpbmdTb3VyY2Uoc291cmNlLCBzdG9yYWdlRmlsZUlkT3JLZXkpKS5waXBlKFxuICAgICAgICAgICAgdGFwKChkb3dubG9hZFVybFBhaXIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRQYWlyRm9yU3RvcmFnZUZpbGVUb0NhY2hlKGRvd25sb2FkVXJsUGFpcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNhY2hlZFBhaXIpIHtcbiAgICAgICAgICByZXN1bHQgPSBvZihjYWNoZWRQYWlyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBkb3dubG9hZEFuZENhY2hlUmVzdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICBmaXJzdCgpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG9icztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBnaXZlbiBkb3dubG9hZCBVUkwgcGFpciB0byB0aGUgY2FjaGUuXG4gICAqL1xuICBhZGRQYWlyRm9yU3RvcmFnZUZpbGVUb0NhY2hlKGRvd25sb2FkVXJsUGFpcjogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2UuYWRkRG93bmxvYWRVcmwoZG93bmxvYWRVcmxQYWlyKS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZG93bmxvYWQgVVJMIGZvciB0aGUgU3RvcmFnZUZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBzdG9yYWdlRmlsZUlkT3JLZXlcbiAgICogQHBhcmFtIGlucHV0UGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVEb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZShzdG9yYWdlRmlsZUlkT3JLZXk6IFN0b3JhZ2VGaWxlSWQgfCBTdG9yYWdlRmlsZUtleSwgaW5wdXRQYXJhbXM/OiBPbWl0PERvd25sb2FkU3RvcmFnZUZpbGVQYXJhbXMsICdrZXknPik6IFByb21pc2U8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcj4ge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVEb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZVVzaW5nU291cmNlKHVuZGVmaW5lZCwgc3RvcmFnZUZpbGVJZE9yS2V5LCBpbnB1dFBhcmFtcyk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZVVzaW5nU291cmNlKGlucHV0U291cmNlOiBNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlQ3VzdG9tU291cmNlPiwgc3RvcmFnZUZpbGVJZE9yS2V5OiBTdG9yYWdlRmlsZUlkIHwgU3RvcmFnZUZpbGVLZXksIGlucHV0UGFyYW1zPzogT21pdDxEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCAna2V5Jz4pOiBQcm9taXNlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBpbnB1dFNvdXJjZSA/PyB7XG4gICAgICBkb3dubG9hZFN0b3JhZ2VGaWxlUmVzdWx0OiAocGFyYW1zKSA9PiB0aGlzLnN0b3JhZ2VGaWxlRnVuY3Rpb25zLnN0b3JhZ2VGaWxlLnJlYWRTdG9yYWdlRmlsZS5kb3dubG9hZChwYXJhbXMpXG4gICAgfTtcblxuICAgIGNvbnN0IHN0b3JhZ2VGaWxlSWQgPSBmaXJlc3RvcmVNb2RlbElkKHN0b3JhZ2VGaWxlSWRPcktleSk7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gaW5wdXRQYXJhbXM/LmV4cGlyZXNBdCA/PyBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoKSwgdGhpcy5fZXhwaXJlc0FmdGVyVGltZSk7XG5cbiAgICBjb25zdCBwYXJhbXM6IERvd25sb2FkU3RvcmFnZUZpbGVQYXJhbXMgPSB7XG4gICAgICAuLi5pbnB1dFBhcmFtcyxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICAgIGtleTogZmlyZXN0b3JlTW9kZWxLZXkoc3RvcmFnZUZpbGVJZGVudGl0eSwgc3RvcmFnZUZpbGVJZClcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNvdXJjZS5kb3dubG9hZFN0b3JhZ2VGaWxlUmVzdWx0KHBhcmFtcywgc3RvcmFnZUZpbGVJZCkudGhlbigoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHN0b3JhZ2VGaWxlSWQsXG4gICAgICAgIGRvd25sb2FkVXJsOiB4LnVybCxcbiAgICAgICAgbWltZVR5cGU6IHgubWltZVR5cGUsXG4gICAgICAgIGV4cGlyZXNBdDogeC5leHBpcmVzQXQgPz8gdW5peERhdGVUaW1lU2Vjb25kc051bWJlckZyb21EYXRlKGV4cGlyZXNBdClcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|