@dereekb/dbx-firebase 10.2.0 → 11.0.1

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.
Files changed (127) hide show
  1. package/esm2022/lib/analytics/analytics.user.events.mjs +10 -15
  2. package/esm2022/lib/analytics/analytics.user.source.mjs +20 -23
  3. package/esm2022/lib/auth/appcheck/appcheck.interceptor.mjs +13 -17
  4. package/esm2022/lib/auth/firebase.auth.module.mjs +4 -4
  5. package/esm2022/lib/auth/login/firebase.login.module.mjs +14 -11
  6. package/esm2022/lib/auth/login/login.anonymous.component.mjs +4 -7
  7. package/esm2022/lib/auth/login/login.apple.component.mjs +4 -7
  8. package/esm2022/lib/auth/login/login.button.component.mjs +23 -28
  9. package/esm2022/lib/auth/login/login.component.mjs +8 -7
  10. package/esm2022/lib/auth/login/login.context.back.component.mjs +8 -10
  11. package/esm2022/lib/auth/login/login.context.directive.mjs +4 -4
  12. package/esm2022/lib/auth/login/login.email.component.mjs +4 -7
  13. package/esm2022/lib/auth/login/login.email.content.component.mjs +53 -57
  14. package/esm2022/lib/auth/login/login.email.form.component.mjs +9 -12
  15. package/esm2022/lib/auth/login/login.email.recovery.form.component.mjs +5 -8
  16. package/esm2022/lib/auth/login/login.facebook.component.mjs +4 -7
  17. package/esm2022/lib/auth/login/login.github.component.mjs +4 -7
  18. package/esm2022/lib/auth/login/login.google.component.mjs +4 -7
  19. package/esm2022/lib/auth/login/login.list.component.mjs +31 -34
  20. package/esm2022/lib/auth/login/login.microsoft.component.mjs +4 -7
  21. package/esm2022/lib/auth/login/login.service.mjs +11 -15
  22. package/esm2022/lib/auth/login/login.terms.component.mjs +11 -14
  23. package/esm2022/lib/auth/login/login.terms.simple.component.mjs +16 -19
  24. package/esm2022/lib/auth/login/login.twitter.component.mjs +4 -7
  25. package/esm2022/lib/auth/login/register.component.mjs +7 -4
  26. package/esm2022/lib/auth/login/register.email.component.mjs +4 -7
  27. package/esm2022/lib/auth/service/firebase.auth.service.mjs +52 -52
  28. package/esm2022/lib/development/development.module.mjs +10 -11
  29. package/esm2022/lib/development/development.popup.component.mjs +13 -15
  30. package/esm2022/lib/development/development.popup.content.component.mjs +41 -46
  31. package/esm2022/lib/development/development.popup.content.form.component.mjs +17 -20
  32. package/esm2022/lib/development/development.popup.directive.mjs +9 -13
  33. package/esm2022/lib/development/development.scheduler.list.component.mjs +22 -32
  34. package/esm2022/lib/development/development.scheduler.service.mjs +26 -36
  35. package/esm2022/lib/development/development.scheduler.widget.component.mjs +10 -13
  36. package/esm2022/lib/development/development.service.mjs +4 -3
  37. package/esm2022/lib/development/development.widget.service.mjs +8 -9
  38. package/esm2022/lib/firebase/emulators.mjs +12 -1
  39. package/esm2022/lib/firebase/firebase.emulator.module.mjs +4 -4
  40. package/esm2022/lib/firebase/firebase.emulator.service.mjs +6 -9
  41. package/esm2022/lib/firebase/firebase.module.mjs +25 -25
  42. package/esm2022/lib/firestore/firebase.firestore.context.service.mjs +6 -11
  43. package/esm2022/lib/firestore/firebase.firestore.module.mjs +4 -4
  44. package/esm2022/lib/function/firebase.function.module.mjs +4 -4
  45. package/esm2022/lib/model/loader/collection.change.trigger.mjs +5 -3
  46. package/esm2022/lib/model/loader/collection.change.watcher.mjs +30 -32
  47. package/esm2022/lib/model/loader/collection.loader.instance.mjs +48 -43
  48. package/esm2022/lib/model/loader/document.loader.instance.mjs +22 -20
  49. package/esm2022/lib/model/model.module.mjs +4 -4
  50. package/esm2022/lib/model/modules/model/model.history.component.mjs +14 -16
  51. package/esm2022/lib/model/modules/model/model.history.module.mjs +4 -4
  52. package/esm2022/lib/model/modules/model/model.history.popover.button.component.mjs +10 -11
  53. package/esm2022/lib/model/modules/model/model.history.popover.component.mjs +5 -8
  54. package/esm2022/lib/model/modules/model/model.tracker.service.mjs +11 -15
  55. package/esm2022/lib/model/modules/model/model.types.list.component.mjs +12 -15
  56. package/esm2022/lib/model/modules/model/model.types.module.mjs +4 -4
  57. package/esm2022/lib/model/modules/model/model.types.service.mjs +48 -40
  58. package/esm2022/lib/model/modules/model/model.types.view.directive.mjs +10 -15
  59. package/esm2022/lib/model/modules/store/model.store.module.mjs +4 -4
  60. package/esm2022/lib/model/modules/store/store.collection.change.directive.mjs +14 -20
  61. package/esm2022/lib/model/modules/store/store.collection.change.if.directive.mjs +23 -27
  62. package/esm2022/lib/model/modules/store/store.collection.directive.mjs +5 -4
  63. package/esm2022/lib/model/modules/store/store.collection.list.directive.mjs +8 -12
  64. package/esm2022/lib/model/modules/store/store.collection.mjs +39 -42
  65. package/esm2022/lib/model/modules/store/store.document.auth.directive.mjs +7 -14
  66. package/esm2022/lib/model/modules/store/store.document.directive.mjs +35 -19
  67. package/esm2022/lib/model/modules/store/store.document.mjs +125 -128
  68. package/esm2022/lib/model/modules/store/store.document.router.directive.mjs +12 -19
  69. package/esm2022/lib/model/modules/store/store.document.router.key.directive.mjs +13 -20
  70. package/esm2022/lib/model/modules/store/store.subcollection.directive.mjs +3 -3
  71. package/esm2022/lib/model/modules/store/store.subcollection.document.mjs +76 -82
  72. package/esm2022/lib/model/modules/store/store.subcollection.mjs +51 -51
  73. package/esm2022/lib/model/service/model.context.instance.mjs +11 -10
  74. package/esm2022/lib/model/system/systemstate.collection.store.directive.mjs +3 -3
  75. package/esm2022/lib/model/system/systemstate.collection.store.mjs +4 -3
  76. package/esm2022/lib/model/system/systemstate.document.store.accessor.mjs +18 -9
  77. package/esm2022/lib/model/system/systemstate.document.store.directive.mjs +7 -8
  78. package/esm2022/lib/model/system/systemstate.document.store.mjs +4 -3
  79. package/esm2022/lib/module.mjs +4 -4
  80. package/esm2022/lib/pipe/key.pipe.mjs +5 -5
  81. package/esm2022/lib/pipe/pipe.module.mjs +4 -4
  82. package/esm2022/lib/router/id.param.redirect.mjs +58 -62
  83. package/esm2022/lib/storage/firebase.storage.module.mjs +4 -4
  84. package/esm2022/lib/storage/firebase.storage.service.mjs +6 -11
  85. package/fesm2022/dereekb-dbx-firebase.mjs +1210 -1297
  86. package/fesm2022/dereekb-dbx-firebase.mjs.map +1 -1
  87. package/lib/analytics/analytics.user.events.d.ts +0 -1
  88. package/lib/analytics/analytics.user.source.d.ts +0 -1
  89. package/lib/auth/appcheck/appcheck.interceptor.d.ts +1 -5
  90. package/lib/auth/login/firebase.login.module.d.ts +2 -1
  91. package/lib/auth/login/login.button.component.d.ts +0 -1
  92. package/lib/auth/login/login.email.content.component.d.ts +0 -1
  93. package/lib/auth/login/login.list.component.d.ts +0 -1
  94. package/lib/auth/login/login.service.d.ts +2 -2
  95. package/lib/auth/login/login.terms.component.d.ts +0 -1
  96. package/lib/auth/login/login.terms.simple.component.d.ts +0 -1
  97. package/lib/auth/service/firebase.auth.service.d.ts +2 -2
  98. package/lib/development/development.module.d.ts +1 -1
  99. package/lib/development/development.popup.component.d.ts +1 -2
  100. package/lib/development/development.popup.content.component.d.ts +0 -1
  101. package/lib/development/development.popup.directive.d.ts +0 -1
  102. package/lib/development/development.scheduler.list.component.d.ts +1 -2
  103. package/lib/development/development.scheduler.service.d.ts +1 -3
  104. package/lib/development/development.scheduler.widget.component.d.ts +0 -1
  105. package/lib/development/development.widget.service.d.ts +2 -2
  106. package/lib/firebase/firebase.emulator.service.d.ts +0 -1
  107. package/lib/firestore/firebase.firestore.context.service.d.ts +1 -2
  108. package/lib/model/loader/collection.change.trigger.d.ts +1 -1
  109. package/lib/model/loader/collection.change.watcher.d.ts +8 -18
  110. package/lib/model/modules/model/model.history.component.d.ts +0 -1
  111. package/lib/model/modules/model/model.history.popover.button.component.d.ts +2 -3
  112. package/lib/model/modules/model/model.history.popover.component.d.ts +1 -2
  113. package/lib/model/modules/model/model.tracker.service.d.ts +0 -1
  114. package/lib/model/modules/model/model.types.service.d.ts +8 -10
  115. package/lib/model/modules/model/model.types.view.directive.d.ts +1 -2
  116. package/lib/model/modules/store/store.collection.change.directive.d.ts +2 -4
  117. package/lib/model/modules/store/store.collection.change.if.directive.d.ts +2 -3
  118. package/lib/model/modules/store/store.collection.list.directive.d.ts +4 -4
  119. package/lib/model/modules/store/store.document.auth.directive.d.ts +2 -3
  120. package/lib/model/modules/store/store.document.directive.d.ts +14 -7
  121. package/lib/model/modules/store/store.document.router.directive.d.ts +3 -4
  122. package/lib/model/modules/store/store.document.router.key.directive.d.ts +4 -5
  123. package/lib/model/system/systemstate.document.store.accessor.d.ts +5 -2
  124. package/lib/model/system/systemstate.document.store.directive.d.ts +1 -1
  125. package/lib/router/id.param.redirect.d.ts +3 -13
  126. package/lib/storage/firebase.storage.service.d.ts +1 -2
  127. package/package.json +1 -1
@@ -1,39 +1,55 @@
1
1
  import { Directive, forwardRef, Input } from '@angular/core';
2
2
  import { FirestoreAccessorStreamMode } from '@dereekb/firebase';
3
+ import { BehaviorSubject, shareReplay, switchMap } from 'rxjs';
4
+ import { filterMaybe, useFirst } from '@dereekb/rxjs';
3
5
  import * as i0 from "@angular/core";
4
6
  /**
5
7
  * Abstract directive that contains a DbxFirebaseDocumentStore and provides an interface for communicating with other directives.
6
8
  */
7
9
  export class DbxFirebaseDocumentStoreDirective {
10
+ _store = new BehaviorSubject(undefined);
11
+ store$ = this._store.pipe(filterMaybe(), shareReplay(1));
12
+ exists$ = this.store$.pipe(switchMap((x) => x.exists$));
13
+ document$ = this.store$.pipe(switchMap((x) => x.document$));
14
+ documentLoadingState$ = this.store$.pipe(switchMap((x) => x.documentLoadingState$));
15
+ id$ = this.store$.pipe(switchMap((x) => x.id$));
16
+ key$ = this.store$.pipe(switchMap((x) => x.key$));
17
+ ref$ = this.store$.pipe(switchMap((x) => x.ref$));
18
+ snapshot$ = this.store$.pipe(switchMap((x) => x.snapshot$));
19
+ snapshotLoadingState$ = this.store$.pipe(switchMap((x) => x.snapshotLoadingState$));
20
+ modelIdentity$ = this.store$.pipe(switchMap((x) => x.modelIdentity$));
21
+ data$ = this.store$.pipe(switchMap((x) => x.data$));
22
+ loadingState$ = this.store$.pipe(switchMap((x) => x.dataLoadingState$));
8
23
  constructor(store) {
9
- this.store = store;
10
- this.exists$ = this.store.exists$;
11
- this.document$ = this.store.document$;
12
- this.documentLoadingState$ = this.store.documentLoadingState$;
13
- this.id$ = this.store.id$;
14
- this.key$ = this.store.key$;
15
- this.ref$ = this.store.ref$;
16
- this.snapshot$ = this.store.snapshot$;
17
- this.snapshotLoadingState$ = this.store.snapshotLoadingState$;
18
- this.modelIdentity$ = this.store.modelIdentity$;
19
- this.data$ = this.store.data$;
20
- this.loadingState$ = this.store.dataLoadingState$;
24
+ this.replaceStore(store);
25
+ }
26
+ ngOnDestroy() {
27
+ this._store.complete();
28
+ }
29
+ /**
30
+ * Replaces the internal store.
31
+ */
32
+ replaceStore(store) {
33
+ this._store.next(store);
21
34
  }
22
35
  // MARK: Inputs
36
+ get store() {
37
+ return this._store.value;
38
+ }
23
39
  set documentId(documentId) {
24
- this.store.setId(documentId);
40
+ useFirst(this.store$, (x) => x.setId(documentId));
25
41
  }
26
42
  set key(key) {
27
- this.store.setKey(key);
43
+ useFirst(this.store$, (x) => x.setKey(key));
28
44
  }
29
45
  set ref(ref) {
30
- this.store.setRef(ref);
46
+ useFirst(this.store$, (x) => x.setRef(ref));
31
47
  }
32
48
  set streamMode(streamMode) {
33
- this.store.setStreamMode(streamMode);
49
+ useFirst(this.store$, (x) => x.setStreamMode(streamMode));
34
50
  }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFirebaseDocumentStoreDirective, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
36
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: DbxFirebaseDocumentStoreDirective, inputs: { documentId: "documentId", key: "key", ref: "ref", streamMode: "streamMode" }, ngImport: i0 }); }
51
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFirebaseDocumentStoreDirective, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
52
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: DbxFirebaseDocumentStoreDirective, inputs: { documentId: "documentId", key: "key", ref: "ref", streamMode: "streamMode" }, ngImport: i0 });
37
53
  }
38
54
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxFirebaseDocumentStoreDirective, decorators: [{
39
55
  type: Directive
@@ -58,4 +74,4 @@ export function provideDbxFirebaseDocumentStoreDirective(sourceType, storeType)
58
74
  }
59
75
  return providers;
60
76
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuZG9jdW1lbnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZpcmViYXNlL3NyYy9saWIvbW9kZWwvbW9kdWxlcy9zdG9yZS9zdG9yZS5kb2N1bWVudC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQXFCLDJCQUEyQixFQUEwRCxNQUFNLG1CQUFtQixDQUFDOztBQUkzSTs7R0FFRztBQUVILE1BQU0sT0FBZ0IsaUNBQWlDO0lBQ3JELFlBQXFCLEtBQVE7UUFBUixVQUFLLEdBQUwsS0FBSyxDQUFHO1FBRXBCLFlBQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUU3QixjQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDakMsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztRQUV6RCxRQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDckIsU0FBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLFNBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUV2QixjQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDakMsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztRQUV6RCxtQkFBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLFVBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixrQkFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7SUFoQnRCLENBQUM7SUFrQmpDLGVBQWU7SUFDZixJQUNJLFVBQVUsQ0FBQyxVQUFtQztRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFDSSxHQUFHLENBQUMsR0FBNkI7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELElBQ0ksR0FBRyxDQUFDLEdBQWdDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUNJLFVBQVUsQ0FBQyxVQUF1QztRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2QyxDQUFDOytHQXRDbUIsaUNBQWlDO21HQUFqQyxpQ0FBaUM7OzRGQUFqQyxpQ0FBaUM7a0JBRHRELFNBQVM7NkZBc0JKLFVBQVU7c0JBRGIsS0FBSztnQkFNRixHQUFHO3NCQUROLEtBQUs7Z0JBTUYsR0FBRztzQkFETixLQUFLO2dCQU1GLFVBQVU7c0JBRGIsS0FBSzs7QUFrQlIsTUFBTSxVQUFVLHdDQUF3QyxDQUEwSixVQUFtQixFQUFFLFNBQW1CO0lBQ3hQLE1BQU0sU0FBUyxHQUFlO1FBQzVCO1lBQ0UsT0FBTyxFQUFFLGlDQUFpQztZQUMxQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztTQUMxQztLQUNGLENBQUM7SUFFRixJQUFJLFNBQVMsRUFBRTtRQUNiLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDM0I7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBmb3J3YXJkUmVmLCBJbnB1dCwgUHJvdmlkZXIsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvY3VtZW50UmVmZXJlbmNlLCBGaXJlc3RvcmVBY2Nlc3NvclN0cmVhbU1vZGUsIEZpcmVzdG9yZURvY3VtZW50LCBGaXJlc3RvcmVNb2RlbEtleSwgRmlyZXN0b3JlTW9kZWxJZCB9IGZyb20gJ0BkZXJlZWtiL2ZpcmViYXNlJztcbmltcG9ydCB7IE1heWJlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmUgfSBmcm9tICcuL3N0b3JlLmRvY3VtZW50JztcblxuLyoqXG4gKiBBYnN0cmFjdCBkaXJlY3RpdmUgdGhhdCBjb250YWlucyBhIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZSBhbmQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW5nIHdpdGggb3RoZXIgZGlyZWN0aXZlcy5cbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlPFQgPSB1bmtub3duLCBEIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ8VD4gPSBGaXJlc3RvcmVEb2N1bWVudDxUPiwgUyBleHRlbmRzIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxULCBEPiA9IERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxULCBEPj4ge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBzdG9yZTogUykge31cblxuICByZWFkb25seSBleGlzdHMkID0gdGhpcy5zdG9yZS5leGlzdHMkO1xuXG4gIHJlYWRvbmx5IGRvY3VtZW50JCA9IHRoaXMuc3RvcmUuZG9jdW1lbnQkO1xuICByZWFkb25seSBkb2N1bWVudExvYWRpbmdTdGF0ZSQgPSB0aGlzLnN0b3JlLmRvY3VtZW50TG9hZGluZ1N0YXRlJDtcblxuICByZWFkb25seSBpZCQgPSB0aGlzLnN0b3JlLmlkJDtcbiAgcmVhZG9ubHkga2V5JCA9IHRoaXMuc3RvcmUua2V5JDtcbiAgcmVhZG9ubHkgcmVmJCA9IHRoaXMuc3RvcmUucmVmJDtcblxuICByZWFkb25seSBzbmFwc2hvdCQgPSB0aGlzLnN0b3JlLnNuYXBzaG90JDtcbiAgcmVhZG9ubHkgc25hcHNob3RMb2FkaW5nU3RhdGUkID0gdGhpcy5zdG9yZS5zbmFwc2hvdExvYWRpbmdTdGF0ZSQ7XG5cbiAgcmVhZG9ubHkgbW9kZWxJZGVudGl0eSQgPSB0aGlzLnN0b3JlLm1vZGVsSWRlbnRpdHkkO1xuICByZWFkb25seSBkYXRhJCA9IHRoaXMuc3RvcmUuZGF0YSQ7XG4gIHJlYWRvbmx5IGxvYWRpbmdTdGF0ZSQgPSB0aGlzLnN0b3JlLmRhdGFMb2FkaW5nU3RhdGUkO1xuXG4gIC8vIE1BUks6IElucHV0c1xuICBASW5wdXQoKVxuICBzZXQgZG9jdW1lbnRJZChkb2N1bWVudElkOiBNYXliZTxGaXJlc3RvcmVNb2RlbElkPikge1xuICAgIHRoaXMuc3RvcmUuc2V0SWQoZG9jdW1lbnRJZCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQga2V5KGtleTogTWF5YmU8RmlyZXN0b3JlTW9kZWxLZXk+KSB7XG4gICAgdGhpcy5zdG9yZS5zZXRLZXkoa2V5KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCByZWYocmVmOiBNYXliZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4pIHtcbiAgICB0aGlzLnN0b3JlLnNldFJlZihyZWYpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHN0cmVhbU1vZGUoc3RyZWFtTW9kZTogRmlyZXN0b3JlQWNjZXNzb3JTdHJlYW1Nb2RlKSB7XG4gICAgdGhpcy5zdG9yZS5zZXRTdHJlYW1Nb2RlKHN0cmVhbU1vZGUpO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIFRoZSB1c2Ugb2YgYW55IGhlcmUgZG9lcyBub3QgZGVncmFkZSB0aGUgdHlwZS1zYWZldHk7IHdlIHdhbnQgdG8gc2ltcGx5IG1hdGNoIHRoYXQgdGhlIFN0b3JlIHR5cGUgUyBpcyB1c2VkIGluIHRoZSBEaXJlY3RpdmUgdHlwZSBDIHRvIHByb3ZpZGUgaXQuXG5cbi8qKlxuICogQ29uZmlndXJlcyBwcm92aWRlcnMgZm9yIGEgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlLlxuICpcbiAqIENhbiBvcHRpb25hbGx5IGFsc28gcHJvdmlkZSB0aGUgYWN0dWFsIHN0b3JlIHR5cGUgdG8gaW5jbHVkZSBpbiB0aGUgcHJvdmlkZXJzIGFycmF5IHNvIGl0IGlzIGluc3RhbnRpYXRlZCBieSBBbmd1bGFyLlxuICpcbiAqIEBwYXJhbSBzb3VyY2VUeXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlPFMgZXh0ZW5kcyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8YW55LCBhbnksIGFueT4+KHNvdXJjZVR5cGU6IFR5cGU8Uz4pOiBQcm92aWRlcltdO1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8UyBleHRlbmRzIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxhbnksIGFueT4sIEMgZXh0ZW5kcyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8YW55LCBhbnksIFM+ID0gRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlPGFueSwgYW55LCBTPj4oc291cmNlVHlwZTogVHlwZTxDPiwgc3RvcmVUeXBlOiBUeXBlPFM+KTogUHJvdmlkZXJbXTtcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlPFMgZXh0ZW5kcyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmU8YW55LCBhbnk+LCBDIGV4dGVuZHMgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlPGFueSwgYW55LCBTPiA9IERieEZpcmViYXNlRG9jdW1lbnRTdG9yZURpcmVjdGl2ZTxhbnksIGFueSwgUz4+KHNvdXJjZVR5cGU6IFR5cGU8Qz4sIHN0b3JlVHlwZT86IFR5cGU8Uz4pOiBQcm92aWRlcltdIHtcbiAgY29uc3QgcHJvdmlkZXJzOiBQcm92aWRlcltdID0gW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IERieEZpcmViYXNlRG9jdW1lbnRTdG9yZURpcmVjdGl2ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IHNvdXJjZVR5cGUpXG4gICAgfVxuICBdO1xuXG4gIGlmIChzdG9yZVR5cGUpIHtcbiAgICBwcm92aWRlcnMucHVzaChzdG9yZVR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIHByb3ZpZGVycztcbn1cbiJdfQ==
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuZG9jdW1lbnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZpcmViYXNlL3NyYy9saWIvbW9kZWwvbW9kdWxlcy9zdG9yZS9zdG9yZS5kb2N1bWVudC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQXFCLDJCQUEyQixFQUEwRCxNQUFNLG1CQUFtQixDQUFDO0FBRzNJLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFdEQ7O0dBRUc7QUFFSCxNQUFNLE9BQWdCLGlDQUFpQztJQUNwQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQVcsU0FBUyxDQUFDLENBQUM7SUFDMUQsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpELE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hELFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVELHFCQUFxQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUVwRixHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVsRCxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBcUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFFcEYsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEQsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUVqRixZQUFZLEtBQVE7UUFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLEtBQVE7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGVBQWU7SUFDZixJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBVSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUNJLFVBQVUsQ0FBQyxVQUFtQztRQUNoRCxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUNJLEdBQUcsQ0FBQyxHQUE2QjtRQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUNJLEdBQUcsQ0FBQyxHQUFnQztRQUN0QyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUNJLFVBQVUsQ0FBQyxVQUF1QztRQUNwRCxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7d0dBekRtQixpQ0FBaUM7NEZBQWpDLGlDQUFpQzs7NEZBQWpDLGlDQUFpQztrQkFEdEQsU0FBUzs2RkF5Q0osVUFBVTtzQkFEYixLQUFLO2dCQU1GLEdBQUc7c0JBRE4sS0FBSztnQkFNRixHQUFHO3NCQUROLEtBQUs7Z0JBTUYsVUFBVTtzQkFEYixLQUFLOztBQWtCUixNQUFNLFVBQVUsd0NBQXdDLENBQTBKLFVBQW1CLEVBQUUsU0FBbUI7SUFDeFAsTUFBTSxTQUFTLEdBQWU7UUFDNUI7WUFDRSxPQUFPLEVBQUUsaUNBQWlDO1lBQzFDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO1NBQzFDO0tBQ0YsQ0FBQztJQUVGLElBQUksU0FBUyxFQUFFO1FBQ2IsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUMzQjtJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGZvcndhcmRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIFByb3ZpZGVyLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb2N1bWVudFJlZmVyZW5jZSwgRmlyZXN0b3JlQWNjZXNzb3JTdHJlYW1Nb2RlLCBGaXJlc3RvcmVEb2N1bWVudCwgRmlyZXN0b3JlTW9kZWxLZXksIEZpcmVzdG9yZU1vZGVsSWQgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5pbXBvcnQgeyBNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlIH0gZnJvbSAnLi9zdG9yZS5kb2N1bWVudCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlck1heWJlLCB1c2VGaXJzdCB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuXG4vKipcbiAqIEFic3RyYWN0IGRpcmVjdGl2ZSB0aGF0IGNvbnRhaW5zIGEgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlIGFuZCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBvdGhlciBkaXJlY3RpdmVzLlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8VCA9IHVua25vd24sIEQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudDxUPiA9IEZpcmVzdG9yZURvY3VtZW50PFQ+LCBTIGV4dGVuZHMgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlPFQsIEQ+ID0gRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlPFQsIEQ+PiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0b3JlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxTPj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgc3RvcmUkID0gdGhpcy5fc3RvcmUucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgZXhpc3RzJCA9IHRoaXMuc3RvcmUkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiB4LmV4aXN0cyQpKTtcbiAgcmVhZG9ubHkgZG9jdW1lbnQkID0gdGhpcy5zdG9yZSQucGlwZShzd2l0Y2hNYXAoKHgpID0+IHguZG9jdW1lbnQkKSk7XG4gIHJlYWRvbmx5IGRvY3VtZW50TG9hZGluZ1N0YXRlJCA9IHRoaXMuc3RvcmUkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiB4LmRvY3VtZW50TG9hZGluZ1N0YXRlJCkpO1xuXG4gIHJlYWRvbmx5IGlkJCA9IHRoaXMuc3RvcmUkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiB4LmlkJCkpO1xuICByZWFkb25seSBrZXkkID0gdGhpcy5zdG9yZSQucGlwZShzd2l0Y2hNYXAoKHgpID0+IHgua2V5JCkpO1xuICByZWFkb25seSByZWYkID0gdGhpcy5zdG9yZSQucGlwZShzd2l0Y2hNYXAoKHgpID0+IHgucmVmJCkpO1xuXG4gIHJlYWRvbmx5IHNuYXBzaG90JCA9IHRoaXMuc3RvcmUkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiB4LnNuYXBzaG90JCkpO1xuICByZWFkb25seSBzbmFwc2hvdExvYWRpbmdTdGF0ZSQgPSB0aGlzLnN0b3JlJC5waXBlKHN3aXRjaE1hcCgoeCkgPT4geC5zbmFwc2hvdExvYWRpbmdTdGF0ZSQpKTtcblxuICByZWFkb25seSBtb2RlbElkZW50aXR5JCA9IHRoaXMuc3RvcmUkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiB4Lm1vZGVsSWRlbnRpdHkkKSk7XG4gIHJlYWRvbmx5IGRhdGEkID0gdGhpcy5zdG9yZSQucGlwZShzd2l0Y2hNYXAoKHgpID0+IHguZGF0YSQpKTtcbiAgcmVhZG9ubHkgbG9hZGluZ1N0YXRlJCA9IHRoaXMuc3RvcmUkLnBpcGUoc3dpdGNoTWFwKCh4KSA9PiB4LmRhdGFMb2FkaW5nU3RhdGUkKSk7XG5cbiAgY29uc3RydWN0b3Ioc3RvcmU6IFMpIHtcbiAgICB0aGlzLnJlcGxhY2VTdG9yZShzdG9yZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdG9yZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSBpbnRlcm5hbCBzdG9yZS5cbiAgICovXG4gIHJlcGxhY2VTdG9yZShzdG9yZTogUykge1xuICAgIHRoaXMuX3N0b3JlLm5leHQoc3RvcmUpO1xuICB9XG5cbiAgLy8gTUFSSzogSW5wdXRzXG4gIGdldCBzdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUudmFsdWUgYXMgUztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBkb2N1bWVudElkKGRvY3VtZW50SWQ6IE1heWJlPEZpcmVzdG9yZU1vZGVsSWQ+KSB7XG4gICAgdXNlRmlyc3QodGhpcy5zdG9yZSQsICh4KSA9PiB4LnNldElkKGRvY3VtZW50SWQpKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBrZXkoa2V5OiBNYXliZTxGaXJlc3RvcmVNb2RlbEtleT4pIHtcbiAgICB1c2VGaXJzdCh0aGlzLnN0b3JlJCwgKHgpID0+IHguc2V0S2V5KGtleSkpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHJlZihyZWY6IE1heWJlPERvY3VtZW50UmVmZXJlbmNlPFQ+Pikge1xuICAgIHVzZUZpcnN0KHRoaXMuc3RvcmUkLCAoeCkgPT4geC5zZXRSZWYocmVmKSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc3RyZWFtTW9kZShzdHJlYW1Nb2RlOiBGaXJlc3RvcmVBY2Nlc3NvclN0cmVhbU1vZGUpIHtcbiAgICB1c2VGaXJzdCh0aGlzLnN0b3JlJCwgKHgpID0+IHguc2V0U3RyZWFtTW9kZShzdHJlYW1Nb2RlKSk7XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gVGhlIHVzZSBvZiBhbnkgaGVyZSBkb2VzIG5vdCBkZWdyYWRlIHRoZSB0eXBlLXNhZmV0eTsgd2Ugd2FudCB0byBzaW1wbHkgbWF0Y2ggdGhhdCB0aGUgU3RvcmUgdHlwZSBTIGlzIHVzZWQgaW4gdGhlIERpcmVjdGl2ZSB0eXBlIEMgdG8gcHJvdmlkZSBpdC5cblxuLyoqXG4gKiBDb25maWd1cmVzIHByb3ZpZGVycyBmb3IgYSBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmUuXG4gKlxuICogQ2FuIG9wdGlvbmFsbHkgYWxzbyBwcm92aWRlIHRoZSBhY3R1YWwgc3RvcmUgdHlwZSB0byBpbmNsdWRlIGluIHRoZSBwcm92aWRlcnMgYXJyYXkgc28gaXQgaXMgaW5zdGFudGlhdGVkIGJ5IEFuZ3VsYXIuXG4gKlxuICogQHBhcmFtIHNvdXJjZVR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8UyBleHRlbmRzIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZURpcmVjdGl2ZTxhbnksIGFueSwgYW55Pj4oc291cmNlVHlwZTogVHlwZTxTPik6IFByb3ZpZGVyW107XG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZURieEZpcmViYXNlRG9jdW1lbnRTdG9yZURpcmVjdGl2ZTxTIGV4dGVuZHMgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlPGFueSwgYW55PiwgQyBleHRlbmRzIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZURpcmVjdGl2ZTxhbnksIGFueSwgUz4gPSBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8YW55LCBhbnksIFM+Pihzb3VyY2VUeXBlOiBUeXBlPEM+LCBzdG9yZVR5cGU6IFR5cGU8Uz4pOiBQcm92aWRlcltdO1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8UyBleHRlbmRzIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxhbnksIGFueT4sIEMgZXh0ZW5kcyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVEaXJlY3RpdmU8YW55LCBhbnksIFM+ID0gRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlPGFueSwgYW55LCBTPj4oc291cmNlVHlwZTogVHlwZTxDPiwgc3RvcmVUeXBlPzogVHlwZTxTPik6IFByb3ZpZGVyW10ge1xuICBjb25zdCBwcm92aWRlcnM6IFByb3ZpZGVyW10gPSBbXG4gICAge1xuICAgICAgcHJvdmlkZTogRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlRGlyZWN0aXZlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gc291cmNlVHlwZSlcbiAgICB9XG4gIF07XG5cbiAgaWYgKHN0b3JlVHlwZSkge1xuICAgIHByb3ZpZGVycy5wdXNoKHN0b3JlVHlwZSk7XG4gIH1cblxuICByZXR1cm4gcHJvdmlkZXJzO1xufVxuIl19
@@ -2,107 +2,104 @@ import { __decorate, __metadata, __param } from "tslib";
2
2
  import { Inject, Injectable, Optional } from '@angular/core';
3
3
  import { shareReplay, distinctUntilChanged, map, switchMap, combineLatest, of } from 'rxjs';
4
4
  import { firestoreModelIdsFromKey, firestoreModelKeyPartPairs, firestoreModelKeyPairObject, documentDataWithIdAndKey, FirestoreAccessorStreamMode, inferKeyFromTwoWayFlatFirestoreModelKey, flatFirestoreModelKey, twoWayFlatFirestoreModelKey } from '@dereekb/firebase';
5
- import { filterMaybe, beginLoading, successResult, loadingStateFromObs, errorResult, loadingStateIsLoading } from '@dereekb/rxjs';
5
+ import { filterMaybe, beginLoading, successResult, loadingStateFromObs, errorResult, isLoadingStateLoading } from '@dereekb/rxjs';
6
6
  import { isMaybeSo } from '@dereekb/util';
7
7
  import { LockSetComponentStore } from '@dereekb/dbx-core';
8
8
  import { modelDoesNotExistError } from '../../error';
9
9
  import * as i0 from "@angular/core";
10
10
  export class AbstractDbxFirebaseDocumentStore extends LockSetComponentStore {
11
- constructor() {
12
- super(...arguments);
13
- // MARK: Effects
14
- // MARK: Accessors
15
- this.currentFirestoreCollectionLike$ = this.state$.pipe(map((x) => x.firestoreCollection ?? x.firestoreCollectionLike), distinctUntilChanged(), shareReplay(1));
16
- this.currentFirestoreCollection$ = this.state$.pipe(map((x) => x.firestoreCollection), distinctUntilChanged(), shareReplay(1));
17
- this.firestoreCollectionLike$ = this.currentFirestoreCollectionLike$.pipe(filterMaybe());
18
- this.firestoreCollection$ = this.currentFirestoreCollection$.pipe(filterMaybe());
19
- this.currentInputId$ = this.state$.pipe(map((x) => x.id), distinctUntilChanged(), shareReplay(1));
20
- this.inputId$ = this.currentInputId$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
21
- this.currentInputKey$ = this.state$.pipe(map((x) => x.key), distinctUntilChanged(), shareReplay(1));
22
- this.inputKey$ = this.currentInputKey$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
23
- this.currentInputRef$ = this.state$.pipe(map((x) => x.ref), distinctUntilChanged(), shareReplay(1));
24
- this.inputRef$ = this.currentInputRef$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
25
- this.streamMode$ = this.state$.pipe(map((x) => x.streamMode ?? FirestoreAccessorStreamMode.STREAM), distinctUntilChanged(), shareReplay(1));
26
- this.currentDocument$ = combineLatest([this.currentInputId$, this.currentInputKey$, this.currentInputRef$]).pipe(switchMap(([id, key, ref]) => {
27
- let document;
28
- if (ref) {
29
- document = this.firestoreCollectionLike$.pipe(map((x) => x.documentAccessor().loadDocument(ref)));
30
- }
31
- else if (key) {
32
- document = this.firestoreCollectionLike$.pipe(map((x) => x.documentAccessor().loadDocumentForKey(key)));
33
- }
34
- else if (id) {
35
- document = this.firestoreCollection$.pipe(map((x) => x.documentAccessor().loadDocumentForId(id)));
36
- }
37
- else {
38
- document = of(undefined);
39
- }
40
- return document;
41
- }), distinctUntilChanged(), shareReplay(1));
42
- /**
43
- * Whether or not an id/ref/key has been input and currentDocument is not null.
44
- */
45
- this.hasRef$ = this.currentDocument$.pipe(map((x) => x?.documentRef != null), distinctUntilChanged(), shareReplay(1));
46
- this.document$ = this.currentDocument$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
47
- this.documentLoadingState$ = this.currentDocument$.pipe(map((x) => (x ? successResult(x) : beginLoading())), shareReplay(1));
48
- this.id$ = this.document$.pipe(map((x) => x.id), shareReplay(1));
49
- this.key$ = this.document$.pipe(map((x) => x.key), shareReplay(1));
50
- this.keyModelIds$ = this.key$.pipe(map(firestoreModelIdsFromKey), shareReplay(1));
51
- this.keyPairs$ = this.key$.pipe(map(firestoreModelKeyPartPairs), filterMaybe(), shareReplay(1));
52
- this.keyPairObject$ = this.key$.pipe(map(firestoreModelKeyPairObject), filterMaybe(), shareReplay(1));
53
- this.ref$ = this.document$.pipe(map((x) => x.documentRef), shareReplay(1));
54
- this.flatKey$ = this.key$.pipe(map((x) => flatFirestoreModelKey(x)), shareReplay(1));
55
- this.twoWayFlatKey$ = this.key$.pipe(map((x) => twoWayFlatFirestoreModelKey(x)), shareReplay(1));
56
- this.snapshot$ = combineLatest([this.document$, this.streamMode$]).pipe(switchMap(([x, mode]) => x.snapshotStream(mode)), shareReplay(1));
57
- this.snapshotLoadingState$ = this.currentDocument$.pipe(switchMap(() => loadingStateFromObs(this.snapshot$)), shareReplay(1));
58
- this.currentData$ = this.snapshot$.pipe(map((x) => documentDataWithIdAndKey(x)), shareReplay(1));
59
- this.data$ = this.currentDocument$.pipe(switchMap(() => this.currentData$.pipe(filterMaybe())), shareReplay(1));
60
- this.dataLoadingState$ = this.snapshotLoadingState$.pipe(map((x) => {
61
- let result;
62
- if (x.value) {
63
- const data = documentDataWithIdAndKey(x.value);
64
- if (data) {
65
- result = successResult(data);
66
- }
67
- else {
68
- result = errorResult(modelDoesNotExistError());
69
- }
11
+ // MARK: Effects
12
+ // MARK: Accessors
13
+ currentFirestoreCollectionLike$ = this.state$.pipe(map((x) => x.firestoreCollection ?? x.firestoreCollectionLike), distinctUntilChanged(), shareReplay(1));
14
+ currentFirestoreCollection$ = this.state$.pipe(map((x) => x.firestoreCollection), distinctUntilChanged(), shareReplay(1));
15
+ firestoreCollectionLike$ = this.currentFirestoreCollectionLike$.pipe(filterMaybe());
16
+ firestoreCollection$ = this.currentFirestoreCollection$.pipe(filterMaybe());
17
+ currentInputId$ = this.state$.pipe(map((x) => x.id), distinctUntilChanged(), shareReplay(1));
18
+ inputId$ = this.currentInputId$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
19
+ currentInputKey$ = this.state$.pipe(map((x) => x.key), distinctUntilChanged(), shareReplay(1));
20
+ inputKey$ = this.currentInputKey$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
21
+ currentInputRef$ = this.state$.pipe(map((x) => x.ref), distinctUntilChanged(), shareReplay(1));
22
+ inputRef$ = this.currentInputRef$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
23
+ streamMode$ = this.state$.pipe(map((x) => x.streamMode ?? FirestoreAccessorStreamMode.STREAM), distinctUntilChanged(), shareReplay(1));
24
+ currentDocument$ = combineLatest([this.currentInputId$, this.currentInputKey$, this.currentInputRef$]).pipe(switchMap(([id, key, ref]) => {
25
+ let document;
26
+ if (ref) {
27
+ document = this.firestoreCollectionLike$.pipe(map((x) => x.documentAccessor().loadDocument(ref)));
28
+ }
29
+ else if (key) {
30
+ document = this.firestoreCollectionLike$.pipe(map((x) => x.documentAccessor().loadDocumentForKey(key)));
31
+ }
32
+ else if (id) {
33
+ document = this.firestoreCollection$.pipe(map((x) => x.documentAccessor().loadDocumentForId(id)));
34
+ }
35
+ else {
36
+ document = of(undefined);
37
+ }
38
+ return document;
39
+ }), distinctUntilChanged(), shareReplay(1));
40
+ /**
41
+ * Whether or not an id/ref/key has been input and currentDocument is not null.
42
+ */
43
+ hasRef$ = this.currentDocument$.pipe(map((x) => x?.documentRef != null), distinctUntilChanged(), shareReplay(1));
44
+ document$ = this.currentDocument$.pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));
45
+ documentLoadingState$ = this.currentDocument$.pipe(map((x) => (x ? successResult(x) : beginLoading())), shareReplay(1));
46
+ id$ = this.document$.pipe(map((x) => x.id), shareReplay(1));
47
+ key$ = this.document$.pipe(map((x) => x.key), shareReplay(1));
48
+ keyModelIds$ = this.key$.pipe(map(firestoreModelIdsFromKey), shareReplay(1));
49
+ keyPairs$ = this.key$.pipe(map(firestoreModelKeyPartPairs), filterMaybe(), shareReplay(1));
50
+ keyPairObject$ = this.key$.pipe(map(firestoreModelKeyPairObject), filterMaybe(), shareReplay(1));
51
+ ref$ = this.document$.pipe(map((x) => x.documentRef), shareReplay(1));
52
+ flatKey$ = this.key$.pipe(map((x) => flatFirestoreModelKey(x)), shareReplay(1));
53
+ twoWayFlatKey$ = this.key$.pipe(map((x) => twoWayFlatFirestoreModelKey(x)), shareReplay(1));
54
+ snapshot$ = combineLatest([this.document$, this.streamMode$]).pipe(switchMap(([x, mode]) => x.snapshotStream(mode)), shareReplay(1));
55
+ snapshotLoadingState$ = this.currentDocument$.pipe(switchMap(() => loadingStateFromObs(this.snapshot$)), shareReplay(1));
56
+ currentData$ = this.snapshot$.pipe(map((x) => documentDataWithIdAndKey(x)), shareReplay(1));
57
+ data$ = this.currentDocument$.pipe(switchMap(() => this.currentData$.pipe(filterMaybe())), shareReplay(1));
58
+ dataLoadingState$ = this.snapshotLoadingState$.pipe(map((x) => {
59
+ let result;
60
+ if (x.value) {
61
+ const data = documentDataWithIdAndKey(x.value);
62
+ if (data) {
63
+ result = successResult(data);
70
64
  }
71
65
  else {
72
- result = {
73
- ...x,
74
- value: undefined
75
- };
76
- }
77
- return result;
78
- }), shareReplay(1));
79
- this.isLoadingData$ = this.dataLoadingState$.pipe(map(loadingStateIsLoading), distinctUntilChanged(), shareReplay(1));
80
- /**
81
- * Returns false while hasRef$ is false, and then returns exists$.
82
- */
83
- this.currentExists$ = this.hasRef$.pipe(switchMap((hasRef) => {
84
- if (hasRef) {
85
- return this.exists$;
66
+ result = errorResult(modelDoesNotExistError());
86
67
  }
87
- else {
88
- return of(false);
89
- }
90
- }), shareReplay(1));
91
- this.exists$ = this.currentData$.pipe(map((x) => isMaybeSo(x)), shareReplay(1));
92
- this.doesNotExist$ = this.exists$.pipe(map((x) => !x), shareReplay(1));
93
- this.modelIdentity$ = this.document$.pipe(map((x) => x.modelIdentity), shareReplay(1));
94
- // MARK: State Changes
95
- this.setId = this.updater((state, id) => (id ? { ...state, id, key: undefined, ref: undefined } : { ...state, id }));
96
- this.setKey = this.updater((state, key) => (key ? { ...state, key, id: undefined, ref: undefined } : { ...state, key }));
97
- this.setFlatKey = this.updater((state, key) => (key ? { ...state, key: inferKeyFromTwoWayFlatFirestoreModelKey(key), id: undefined, ref: undefined } : { ...state, key }));
98
- this.setRef = this.updater((state, ref) => (ref ? { ...state, key: undefined, id: undefined, ref } : { ...state, ref }));
99
- this.setStreamMode = this.updater((state, streamMode) => ({ ...state, streamMode }));
100
- this.clearRefs = this.updater((state) => ({ ...state, id: undefined, key: undefined, ref: undefined }));
101
- this.setFirestoreCollection = this.updater((state, firestoreCollection) => ({ ...state, firestoreCollection }));
102
- this.setFirestoreCollectionLike = this.updater((state, firestoreCollectionLike) => ({ ...state, firestoreCollectionLike }));
103
- }
104
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AbstractDbxFirebaseDocumentStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
105
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AbstractDbxFirebaseDocumentStore }); }
68
+ }
69
+ else {
70
+ result = {
71
+ ...x,
72
+ value: undefined
73
+ };
74
+ }
75
+ return result;
76
+ }), shareReplay(1));
77
+ isLoadingData$ = this.dataLoadingState$.pipe(map(isLoadingStateLoading), distinctUntilChanged(), shareReplay(1));
78
+ /**
79
+ * Returns false while hasRef$ is false, and then returns exists$.
80
+ */
81
+ currentExists$ = this.hasRef$.pipe(switchMap((hasRef) => {
82
+ if (hasRef) {
83
+ return this.exists$;
84
+ }
85
+ else {
86
+ return of(false);
87
+ }
88
+ }), shareReplay(1));
89
+ exists$ = this.currentData$.pipe(map((x) => isMaybeSo(x)), shareReplay(1));
90
+ doesNotExist$ = this.exists$.pipe(map((x) => !x), shareReplay(1));
91
+ modelIdentity$ = this.document$.pipe(map((x) => x.modelIdentity), shareReplay(1));
92
+ // MARK: State Changes
93
+ setId = this.updater((state, id) => (id ? { ...state, id, key: undefined, ref: undefined } : { ...state, id }));
94
+ setKey = this.updater((state, key) => (key ? { ...state, key, id: undefined, ref: undefined } : { ...state, key }));
95
+ setFlatKey = this.updater((state, key) => (key ? { ...state, key: inferKeyFromTwoWayFlatFirestoreModelKey(key), id: undefined, ref: undefined } : { ...state, key }));
96
+ setRef = this.updater((state, ref) => (ref ? { ...state, key: undefined, id: undefined, ref } : { ...state, ref }));
97
+ setStreamMode = this.updater((state, streamMode) => ({ ...state, streamMode }));
98
+ clearRefs = this.updater((state) => ({ ...state, id: undefined, key: undefined, ref: undefined }));
99
+ setFirestoreCollection = this.updater((state, firestoreCollection) => ({ ...state, firestoreCollection }));
100
+ setFirestoreCollectionLike = this.updater((state, firestoreCollectionLike) => ({ ...state, firestoreCollectionLike }));
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AbstractDbxFirebaseDocumentStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
102
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AbstractDbxFirebaseDocumentStore });
106
103
  }
107
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AbstractDbxFirebaseDocumentStore, decorators: [{
108
105
  type: Injectable
@@ -122,47 +119,47 @@ function injectSingleItemIdIntoState(state) {
122
119
  export let AbstractRootSingleItemDbxFirebaseDocument = class AbstractRootSingleItemDbxFirebaseDocument extends AbstractDbxFirebaseDocumentStore {
123
120
  constructor(initialState) {
124
121
  super(injectSingleItemIdIntoState(initialState));
125
- /**
126
- * Sets the SingleItemFirestoreCollection to use.
127
- */
128
- this.setFirestoreCollection = this.updater((state, firestoreCollection) => {
129
- if (firestoreCollection != null) {
130
- const id = firestoreCollection.singleItemIdentifier;
131
- if (id != null) {
132
- return { ...state, firestoreCollection, id };
133
- }
134
- else {
135
- throw new Error('AbstractRootSingleItemDbxFirebaseDocument only accepts RootSingleItemFirestoreCollection values with a singleItemIdentifier set for setFirestoreCollection.');
136
- }
122
+ }
123
+ /**
124
+ * Sets the SingleItemFirestoreCollection to use.
125
+ */
126
+ setFirestoreCollection = this.updater((state, firestoreCollection) => {
127
+ if (firestoreCollection != null) {
128
+ const id = firestoreCollection.singleItemIdentifier;
129
+ if (id != null) {
130
+ return { ...state, firestoreCollection, id };
137
131
  }
138
132
  else {
139
- return { ...state, firestoreCollection: null };
133
+ throw new Error('AbstractRootSingleItemDbxFirebaseDocument only accepts RootSingleItemFirestoreCollection values with a singleItemIdentifier set for setFirestoreCollection.');
140
134
  }
141
- });
142
- /**
143
- * Does nothing on a AbstractRootSingleItemDbxFirebaseDocument.
144
- *
145
- * Ref is set with the FirestoreCollection
146
- */
147
- this.setId = this.updater((state, id) => state);
148
- /**
149
- * Does nothing on a AbstractRootSingleItemDbxFirebaseDocument.
150
- *
151
- * Ref is set with the FirestoreCollection
152
- */
153
- this.setKey = this.updater((state, key) => state);
154
- /**
155
- * Does nothing on a AbstractRootSingleItemDbxFirebaseDocument.
156
- *
157
- * Ref is set with the FirestoreCollection
158
- */
159
- this.setRef = this.updater((state, ref) => state);
160
- this.clearRefs = this.updater((state) => state);
161
- }
135
+ }
136
+ else {
137
+ return { ...state, firestoreCollection: null };
138
+ }
139
+ });
140
+ /**
141
+ * Does nothing on a AbstractRootSingleItemDbxFirebaseDocument.
142
+ *
143
+ * Ref is set with the FirestoreCollection
144
+ */
145
+ setId = this.updater((state, id) => state);
146
+ /**
147
+ * Does nothing on a AbstractRootSingleItemDbxFirebaseDocument.
148
+ *
149
+ * Ref is set with the FirestoreCollection
150
+ */
151
+ setKey = this.updater((state, key) => state);
152
+ /**
153
+ * Does nothing on a AbstractRootSingleItemDbxFirebaseDocument.
154
+ *
155
+ * Ref is set with the FirestoreCollection
156
+ */
157
+ setRef = this.updater((state, ref) => state);
158
+ clearRefs = this.updater((state) => state);
162
159
  };
163
160
  AbstractRootSingleItemDbxFirebaseDocument = __decorate([
164
161
  __param(0, Inject(null)),
165
162
  __param(0, Optional()),
166
163
  __metadata("design:paramtypes", [Object])
167
164
  ], AbstractRootSingleItemDbxFirebaseDocument);
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2RlbC9tb2R1bGVzL3N0b3JlL3N0b3JlLmRvY3VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFjLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBZ0IsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RILE9BQU8sRUFVTCx3QkFBd0IsRUFDeEIsMEJBQTBCLEVBRTFCLDJCQUEyQixFQUUzQix3QkFBd0IsRUFDeEIsMkJBQTJCLEVBRTNCLHVDQUF1QyxFQUd2QyxxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzVCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFdBQVcsRUFBZ0IsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQXFCLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25LLE9BQU8sRUFBUyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFvQixxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUEwRnJELE1BQU0sT0FBTyxnQ0FBOEwsU0FBUSxxQkFBd0I7SUFEM087O1FBRUUsZ0JBQWdCO1FBRWhCLGtCQUFrQjtRQUNULG9DQUErQixHQUFxRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDLHVCQUF1QixDQUFD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RyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQTZCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBbUYsQ0FBQztRQUUzSzs7OztXQUlHO1FBQ2UsV0FBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBZ0MsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUErRyxDQUFDO1FBRXhMLGNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQXhDN0QsQ0FBQztDQXlDRixDQUFBO0FBNUNZLHlDQUF5QztJQUM3QixXQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUFFLFdBQUEsUUFBUSxFQUFFLENBQUE7O0dBRHBDLHlDQUF5QyxDQTRDckQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3dpdGNoTWFwLCBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBEb2N1bWVudFNuYXBzaG90LFxuICBEb2N1bWVudFJlZmVyZW5jZSxcbiAgRmlyZXN0b3JlQ29sbGVjdGlvbixcbiAgRmlyZXN0b3JlRG9jdW1lbnQsXG4gIERvY3VtZW50RGF0YVdpdGhJZEFuZEtleSxcbiAgRmlyZXN0b3JlTW9kZWxJZCxcbiAgRmlyZXN0b3JlTW9kZWxLZXksXG4gIEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlLFxuICBGaXJlc3RvcmVNb2RlbElkZW50aXR5LFxuICBmaXJlc3RvcmVNb2RlbElkc0Zyb21LZXksXG4gIGZpcmVzdG9yZU1vZGVsS2V5UGFydFBhaXJzLFxuICBGaXJlc3RvcmVNb2RlbENvbGxlY3Rpb25BbmRJZFBhaXIsXG4gIGZpcmVzdG9yZU1vZGVsS2V5UGFpck9iamVjdCxcbiAgRmlyZXN0b3JlTW9kZWxDb2xsZWN0aW9uQW5kSWRQYWlyT2JqZWN0LFxuICBkb2N1bWVudERhdGFXaXRoSWRBbmRLZXksXG4gIEZpcmVzdG9yZUFjY2Vzc29yU3RyZWFtTW9kZSxcbiAgVHdvV2F5RmxhdEZpcmVzdG9yZU1vZGVsS2V5LFxuICBpbmZlcktleUZyb21Ud29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXksXG4gIFJvb3RTaW5nbGVJdGVtRmlyZXN0b3JlQ29sbGVjdGlvbixcbiAgRmxhdEZpcmVzdG9yZU1vZGVsS2V5LFxuICBmbGF0RmlyZXN0b3JlTW9kZWxLZXksXG4gIHR3b1dheUZsYXRGaXJlc3RvcmVNb2RlbEtleVxufSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5pbXBvcnQgeyBmaWx0ZXJNYXliZSwgTG9hZGluZ1N0YXRlLCBiZWdpbkxvYWRpbmcsIHN1Y2Nlc3NSZXN1bHQsIGxvYWRpbmdTdGF0ZUZyb21PYnMsIGVycm9yUmVzdWx0LCBPYnNlcnZhYmxlT3JWYWx1ZSwgbG9hZGluZ1N0YXRlSXNMb2FkaW5nIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBNYXliZSwgaXNNYXliZVNvIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBMb2NrU2V0Q29tcG9uZW50LCBMb2NrU2V0Q29tcG9uZW50U3RvcmUgfSBmcm9tICdAZGVyZWVrYi9kYngtY29yZSc7XG5pbXBvcnQgeyBtb2RlbERvZXNOb3RFeGlzdEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxULCBEIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ8VD4gPSBGaXJlc3RvcmVEb2N1bWVudDxUPj4gZXh0ZW5kcyBMb2NrU2V0Q29tcG9uZW50IHtcbiAgcmVhZG9ubHkgZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlPFQsIEQ+PjtcbiAgcmVhZG9ubHkgZmlyZXN0b3JlQ29sbGVjdGlvbiQ6IE9ic2VydmFibGU8RmlyZXN0b3JlQ29sbGVjdGlvbjxULCBEPj47XG5cbiAgcmVhZG9ubHkgY3VycmVudElucHV0SWQkOiBPYnNlcnZhYmxlPE1heWJlPEZpcmVzdG9yZU1vZGVsSWQ+PjtcbiAgcmVhZG9ubHkgaW5wdXRJZCQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxJZD47XG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dEtleSQ6IE9ic2VydmFibGU8TWF5YmU8RmlyZXN0b3JlTW9kZWxLZXk+PjtcbiAgcmVhZG9ubHkgaW5wdXRLZXkkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsS2V5PjtcbiAgcmVhZG9ubHkgY3VycmVudElucHV0UmVmJDogT2JzZXJ2YWJsZTxNYXliZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4+O1xuICByZWFkb25seSBpbnB1dFJlZiQ6IE9ic2VydmFibGU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+O1xuXG4gIHJlYWRvbmx5IHN0cmVhbU1vZGUkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZUFjY2Vzc29yU3RyZWFtTW9kZT47XG5cbiAgcmVhZG9ubHkgY3VycmVudERvY3VtZW50JDogT2JzZXJ2YWJsZTxNYXliZTxEPj47XG4gIHJlYWRvbmx5IGRvY3VtZW50JDogT2JzZXJ2YWJsZTxEPjtcbiAgcmVhZG9ubHkgaWQkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWQ+O1xuICByZWFkb25seSBrZXkkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsS2V5PjtcbiAgcmVhZG9ubHkgcmVmJDogT2JzZXJ2YWJsZTxEb2N1bWVudFJlZmVyZW5jZTxUPj47XG4gIHJlYWRvbmx5IGhhc1JlZiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IGZsYXRLZXkkOiBPYnNlcnZhYmxlPEZsYXRGaXJlc3RvcmVNb2RlbEtleT47XG4gIHJlYWRvbmx5IHR3b1dheUZsYXRLZXkkOiBPYnNlcnZhYmxlPFR3b1dheUZsYXRGaXJlc3RvcmVNb2RlbEtleT47XG5cbiAgcmVhZG9ubHkga2V5TW9kZWxJZHMkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWRbXT47XG4gIHJlYWRvbmx5IGtleVBhaXJzJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbENvbGxlY3Rpb25BbmRJZFBhaXJbXT47XG4gIHJlYWRvbmx5IGtleVBhaXJPYmplY3QkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsQ29sbGVjdGlvbkFuZElkUGFpck9iamVjdD47XG5cbiAgcmVhZG9ubHkgZG9jdW1lbnRMb2FkaW5nU3RhdGUkOiBPYnNlcnZhYmxlPExvYWRpbmdTdGF0ZTxEPj47XG4gIHJlYWRvbmx5IHNuYXBzaG90JDogT2JzZXJ2YWJsZTxEb2N1bWVudFNuYXBzaG90PFQ+PjtcbiAgcmVhZG9ubHkgc25hcHNob3RMb2FkaW5nU3RhdGUkOiBPYnNlcnZhYmxlPExvYWRpbmdTdGF0ZTxEb2N1bWVudFNuYXBzaG90PFQ+Pj47XG4gIHJlYWRvbmx5IGN1cnJlbnREYXRhJDogT2JzZXJ2YWJsZTxNYXliZTxEb2N1bWVudERhdGFXaXRoSWRBbmRLZXk8VD4+PjtcbiAgcmVhZG9ubHkgZGF0YSQ6IE9ic2VydmFibGU8RG9jdW1lbnREYXRhV2l0aElkQW5kS2V5PFQ+PjtcbiAgcmVhZG9ubHkgZGF0YUxvYWRpbmdTdGF0ZSQ6IE9ic2VydmFibGU8TG9hZGluZ1N0YXRlPERvY3VtZW50RGF0YVdpdGhJZEFuZEtleTxUPj4+O1xuICByZWFkb25seSBpc0xvYWRpbmdEYXRhJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcmVhZG9ubHkgY3VycmVudEV4aXN0cyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IGV4aXN0cyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IG1vZGVsSWRlbnRpdHkkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWRlbnRpdHk+O1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpZCBvZiB0aGUgZG9jdW1lbnQgdG8gbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHNldElkOiAob2JzZXJ2YWJsZU9yVmFsdWU6IE9ic2VydmFibGVPclZhbHVlPE1heWJlPEZpcmVzdG9yZU1vZGVsSWQ+PikgPT4gU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBrZXkgb2YgdGhlIGRvY3VtZW50IHRvIGxvYWQuXG4gICAqL1xuICByZWFkb25seSBzZXRLZXk6IChvYnNlcnZhYmxlT3JWYWx1ZTogT2JzZXJ2YWJsZU9yVmFsdWU8TWF5YmU8RmlyZXN0b3JlTW9kZWxLZXk+PikgPT4gU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBrZXkgb2YgdGhlIGRvY3VtZW50IHRvIGxvYWQgdXNpbmcgYSBUd29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXkuXG4gICAqL1xuICByZWFkb25seSBzZXRGbGF0S2V5OiAob2JzZXJ2YWJsZU9yVmFsdWU6IE9ic2VydmFibGVPclZhbHVlPE1heWJlPFR3b1dheUZsYXRGaXJlc3RvcmVNb2RlbEtleT4+KSA9PiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJlZiBvZiB0aGUgZG9jdW1lbnQgdG8gbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHNldFJlZjogKG9ic2VydmFibGVPclZhbHVlOiBPYnNlcnZhYmxlT3JWYWx1ZTxNYXliZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4+KSA9PiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUga2V5L2lkL3JlZiBhbmQgY3VycmVudCBkb2N1bWVudCBmcm9tIHRoZSBzdG9yZS5cbiAgICovXG4gIHJlYWRvbmx5IGNsZWFyUmVmczogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgc3RyZWFtIG1vZGUuXG4gICAqL1xuICByZWFkb25seSBzZXRTdHJlYW1Nb2RlOiAob2JzZXJ2YWJsZU9yVmFsdWU6IE9ic2VydmFibGVPclZhbHVlPEZpcmVzdG9yZUFjY2Vzc29yU3RyZWFtTW9kZT4pID0+IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgRmlyZXN0b3JlQ29sbGVjdGlvbiB0byByZXRyaWV2ZSBkb2N1bWVudHMgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNldEZpcmVzdG9yZUNvbGxlY3Rpb246ICgoKSA9PiB2b2lkKSB8ICgob2JzZXJ2YWJsZU9yVmFsdWU6IE9ic2VydmFibGVPclZhbHVlPE1heWJlPEZpcmVzdG9yZUNvbGxlY3Rpb248VCwgRD4+PikgPT4gU3Vic2NyaXB0aW9uKTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgRmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UgdG8gcmV0cmlldmUgZG9jdW1lbnRzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzZXRGaXJlc3RvcmVDb2xsZWN0aW9uTGlrZTogKCgpID0+IHZvaWQpIHwgKChvYnNlcnZhYmxlT3JWYWx1ZTogT2JzZXJ2YWJsZU9yVmFsdWU8TWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbkxpa2U8VCwgRD4+PikgPT4gU3Vic2NyaXB0aW9uKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVDb250ZXh0U3RhdGU8VCwgRCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PFQ+ID0gRmlyZXN0b3JlRG9jdW1lbnQ8VD4+IHtcbiAgcmVhZG9ubHkgZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2U/OiBNYXliZTxGaXJlc3RvcmVDb2xsZWN0aW9uTGlrZTxULCBEPj47XG4gIHJlYWRvbmx5IGZpcmVzdG9yZUNvbGxlY3Rpb24/OiBNYXliZTxGaXJlc3RvcmVDb2xsZWN0aW9uPFQsIEQ+PjtcbiAgcmVhZG9ubHkgc3RyZWFtTW9kZT86IEZpcmVzdG9yZUFjY2Vzc29yU3RyZWFtTW9kZTtcbiAgcmVhZG9ubHkgaWQ/OiBNYXliZTxGaXJlc3RvcmVNb2RlbElkPjtcbiAgcmVhZG9ubHkga2V5PzogTWF5YmU8RmlyZXN0b3JlTW9kZWxLZXk+O1xuICByZWFkb25seSByZWY/OiBNYXliZTxEb2N1bWVudFJlZmVyZW5jZTxUPj47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBYnN0cmFjdERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxULCBEIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ8VD4gPSBGaXJlc3RvcmVEb2N1bWVudDxUPiwgQyBleHRlbmRzIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZUNvbnRleHRTdGF0ZTxULCBEPiA9IERieEZpcmViYXNlRG9jdW1lbnRTdG9yZUNvbnRleHRTdGF0ZTxULCBEPj4gZXh0ZW5kcyBMb2NrU2V0Q29tcG9uZW50U3RvcmU8Qz4gaW1wbGVtZW50cyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmU8VCwgRD4ge1xuICAvLyBNQVJLOiBFZmZlY3RzXG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IGN1cnJlbnRGaXJlc3RvcmVDb2xsZWN0aW9uTGlrZSQ6IE9ic2VydmFibGU8TWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbkxpa2U8VCwgRD4+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmZpcmVzdG9yZUNvbGxlY3Rpb24gPz8geC5maXJlc3RvcmVDb2xsZWN0aW9uTGlrZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRGaXJlc3RvcmVDb2xsZWN0aW9uJDogT2JzZXJ2YWJsZTxNYXliZTxGaXJlc3RvcmVDb2xsZWN0aW9uPFQsIEQ+Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maXJlc3RvcmVDb2xsZWN0aW9uKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlPFQsIEQ+PiA9IHRoaXMuY3VycmVudEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlJC5waXBlKGZpbHRlck1heWJlKCkpO1xuICByZWFkb25seSBmaXJlc3RvcmVDb2xsZWN0aW9uJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVDb2xsZWN0aW9uPFQsIEQ+PiA9IHRoaXMuY3VycmVudEZpcmVzdG9yZUNvbGxlY3Rpb24kLnBpcGUoZmlsdGVyTWF5YmUoKSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudElucHV0SWQkOiBPYnNlcnZhYmxlPE1heWJlPEZpcmVzdG9yZU1vZGVsSWQ+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlkKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRJZCQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxJZD4gPSB0aGlzLmN1cnJlbnRJbnB1dElkJC5waXBlKGZpbHRlck1heWJlKCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBjdXJyZW50SW5wdXRLZXkkOiBPYnNlcnZhYmxlPE1heWJlPEZpcmVzdG9yZU1vZGVsS2V5Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5rZXkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dEtleSQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxLZXk+ID0gdGhpcy5jdXJyZW50SW5wdXRLZXkkLnBpcGUoZmlsdGVyTWF5YmUoKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dFJlZiQ6IE9ic2VydmFibGU8TWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnJlZiksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0UmVmJDogT2JzZXJ2YWJsZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4gPSB0aGlzLmN1cnJlbnRJbnB1dFJlZiQucGlwZShmaWx0ZXJNYXliZSgpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgc3RyZWFtTW9kZSQ6IE9ic2VydmFibGU8RmlyZXN0b3JlQWNjZXNzb3JTdHJlYW1Nb2RlPiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnN0cmVhbU1vZGUgPz8gRmlyZXN0b3JlQWNjZXNzb3JTdHJlYW1Nb2RlLlNUUkVBTSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREb2N1bWVudCQ6IE9ic2VydmFibGU8TWF5YmU8RD4+ID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50SW5wdXRJZCQsIHRoaXMuY3VycmVudElucHV0S2V5JCwgdGhpcy5jdXJyZW50SW5wdXRSZWYkXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFtpZCwga2V5LCByZWZdKSA9PiB7XG4gICAgICBsZXQgZG9jdW1lbnQ6IE9ic2VydmFibGU8TWF5YmU8RD4+O1xuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRvY3VtZW50ID0gdGhpcy5maXJlc3RvcmVDb2xsZWN0aW9uTGlrZSQucGlwZShtYXAoKHgpID0+IHguZG9jdW1lbnRBY2Nlc3NvcigpLmxvYWREb2N1bWVudChyZWYpKSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSkge1xuICAgICAgICBkb2N1bWVudCA9IHRoaXMuZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UkLnBpcGUobWFwKCh4KSA9PiB4LmRvY3VtZW50QWNjZXNzb3IoKS5sb2FkRG9jdW1lbnRGb3JLZXkoa2V5KSkpO1xuICAgICAgfSBlbHNlIGlmIChpZCkge1xuICAgICAgICBkb2N1bWVudCA9IHRoaXMuZmlyZXN0b3JlQ29sbGVjdGlvbiQucGlwZShtYXAoKHgpID0+IHguZG9jdW1lbnRBY2Nlc3NvcigpLmxvYWREb2N1bWVudEZvcklkKGlkKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQgPSBvZih1bmRlZmluZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBhbiBpZC9yZWYva2V5IGhhcyBiZWVuIGlucHV0IGFuZCBjdXJyZW50RG9jdW1lbnQgaXMgbm90IG51bGwuXG4gICAqL1xuICByZWFkb25seSBoYXNSZWYkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5jdXJyZW50RG9jdW1lbnQkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5kb2N1bWVudFJlZiAhPSBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZG9jdW1lbnQkOiBPYnNlcnZhYmxlPEQ+ID0gdGhpcy5jdXJyZW50RG9jdW1lbnQkLnBpcGUoZmlsdGVyTWF5YmUoKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGRvY3VtZW50TG9hZGluZ1N0YXRlJDogT2JzZXJ2YWJsZTxMb2FkaW5nU3RhdGU8RD4+ID0gdGhpcy5jdXJyZW50RG9jdW1lbnQkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IHN1Y2Nlc3NSZXN1bHQoeCkgOiBiZWdpbkxvYWRpbmc8RD4oKSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaWQkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWQ+ID0gdGhpcy5kb2N1bWVudCQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaWQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkga2V5JDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbEtleT4gPSB0aGlzLmRvY3VtZW50JC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5rZXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkga2V5TW9kZWxJZHMkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWRbXT4gPSB0aGlzLmtleSQucGlwZShtYXAoZmlyZXN0b3JlTW9kZWxJZHNGcm9tS2V5KSwgc2hhcmVSZXBsYXkoMSkpO1xuICByZWFkb25seSBrZXlQYWlycyQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxDb2xsZWN0aW9uQW5kSWRQYWlyW10+ID0gdGhpcy5rZXkkLnBpcGUobWFwKGZpcmVzdG9yZU1vZGVsS2V5UGFydFBhaXJzKSwgZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuICByZWFkb25seSBrZXlQYWlyT2JqZWN0JDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbENvbGxlY3Rpb25BbmRJZFBhaXJPYmplY3Q+ID0gdGhpcy5rZXkkLnBpcGUobWFwKGZpcmVzdG9yZU1vZGVsS2V5UGFpck9iamVjdCksIGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSByZWYkOiBPYnNlcnZhYmxlPERvY3VtZW50UmVmZXJlbmNlPFQ+PiA9IHRoaXMuZG9jdW1lbnQkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmRvY3VtZW50UmVmKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGZsYXRLZXkkOiBPYnNlcnZhYmxlPEZsYXRGaXJlc3RvcmVNb2RlbEtleT4gPSB0aGlzLmtleSQucGlwZShcbiAgICBtYXAoKHgpID0+IGZsYXRGaXJlc3RvcmVNb2RlbEtleSh4KSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0d29XYXlGbGF0S2V5JDogT2JzZXJ2YWJsZTxGbGF0RmlyZXN0b3JlTW9kZWxLZXk+ID0gdGhpcy5rZXkkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB0d29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXkoeCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc25hcHNob3QkOiBPYnNlcnZhYmxlPERvY3VtZW50U25hcHNob3Q8VD4+ID0gY29tYmluZUxhdGVzdChbdGhpcy5kb2N1bWVudCQsIHRoaXMuc3RyZWFtTW9kZSRdKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoW3gsIG1vZGVdKSA9PiB4LnNuYXBzaG90U3RyZWFtKG1vZGUpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNuYXBzaG90TG9hZGluZ1N0YXRlJDogT2JzZXJ2YWJsZTxMb2FkaW5nU3RhdGU8RG9jdW1lbnRTbmFwc2hvdDxUPj4+ID0gdGhpcy5jdXJyZW50RG9jdW1lbnQkLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+IGxvYWRpbmdTdGF0ZUZyb21PYnModGhpcy5zbmFwc2hvdCQpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRhJDogT2JzZXJ2YWJsZTxNYXliZTxEb2N1bWVudERhdGFXaXRoSWRBbmRLZXk8VD4+PiA9IHRoaXMuc25hcHNob3QkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBkb2N1bWVudERhdGFXaXRoSWRBbmRLZXkoeCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0YSQ6IE9ic2VydmFibGU8RG9jdW1lbnREYXRhV2l0aElkQW5kS2V5PFQ+PiA9IHRoaXMuY3VycmVudERvY3VtZW50JC5waXBlKFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmN1cnJlbnREYXRhJC5waXBlKGZpbHRlck1heWJlKCkpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGFMb2FkaW5nU3RhdGUkOiBPYnNlcnZhYmxlPExvYWRpbmdTdGF0ZTxEb2N1bWVudERhdGFXaXRoSWRBbmRLZXk8VD4+PiA9IHRoaXMuc25hcHNob3RMb2FkaW5nU3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBMb2FkaW5nU3RhdGU8RG9jdW1lbnREYXRhV2l0aElkQW5kS2V5PFQ+PjtcblxuICAgICAgaWYgKHgudmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGRvY3VtZW50RGF0YVdpdGhJZEFuZEtleSh4LnZhbHVlKTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHJlc3VsdCA9IHN1Y2Nlc3NSZXN1bHQoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gZXJyb3JSZXN1bHQobW9kZWxEb2VzTm90RXhpc3RFcnJvcigpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNMb2FkaW5nRGF0YSQgPSB0aGlzLmRhdGFMb2FkaW5nU3RhdGUkLnBpcGUobWFwKGxvYWRpbmdTdGF0ZUlzTG9hZGluZyksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICAvKipcbiAgICogUmV0dXJucyBmYWxzZSB3aGlsZSBoYXNSZWYkIGlzIGZhbHNlLCBhbmQgdGhlbiByZXR1cm5zIGV4aXN0cyQuXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50RXhpc3RzJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaGFzUmVmJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoaGFzUmVmKSA9PiB7XG4gICAgICBpZiAoaGFzUmVmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4aXN0cyQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZXhpc3RzJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuY3VycmVudERhdGEkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBpc01heWJlU28oeCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZG9lc05vdEV4aXN0JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuZXhpc3RzJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gIXgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgbW9kZWxJZGVudGl0eSQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxJZGVudGl0eT4gPSB0aGlzLmRvY3VtZW50JC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5tb2RlbElkZW50aXR5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IFN0YXRlIENoYW5nZXNcbiAgcmVhZG9ubHkgc2V0SWQgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBpZDogTWF5YmU8RmlyZXN0b3JlTW9kZWxJZD4pID0+IChpZCA/IHsgLi4uc3RhdGUsIGlkLCBrZXk6IHVuZGVmaW5lZCwgcmVmOiB1bmRlZmluZWQgfSA6IHsgLi4uc3RhdGUsIGlkIH0pKSBhcyAob2JzZXJ2YWJsZU9yVmFsdWU6IE1heWJlPHN0cmluZz4gfCBPYnNlcnZhYmxlPE1heWJlPHN0cmluZz4+KSA9PiBTdWJzY3JpcHRpb247XG4gIHJlYWRvbmx5IHNldEtleSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGtleTogTWF5YmU8RmlyZXN0b3JlTW9kZWxLZXk+KSA9PiAoa2V5ID8geyAuLi5zdGF0ZSwga2V5LCBpZDogdW5kZWZpbmVkLCByZWY6IHVuZGVmaW5lZCB9IDogeyAuLi5zdGF0ZSwga2V5IH0pKSBhcyAob2JzZXJ2YWJsZU9yVmFsdWU6IE1heWJlPHN0cmluZz4gfCBPYnNlcnZhYmxlPE1heWJlPHN0cmluZz4+KSA9PiBTdWJzY3JpcHRpb247XG4gIHJlYWRvbmx5IHNldEZsYXRLZXkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBrZXk6IE1heWJlPFR3b1dheUZsYXRGaXJlc3RvcmVNb2RlbEtleT4pID0+IChrZXkgPyB7IC4uLnN0YXRlLCBrZXk6IGluZmVyS2V5RnJvbVR3b1dheUZsYXRGaXJlc3RvcmVNb2RlbEtleShrZXkpLCBpZDogdW5kZWZpbmVkLCByZWY6IHVuZGVmaW5lZCB9IDogeyAuLi5zdGF0ZSwga2V5IH0pKSBhcyAob2JzZXJ2YWJsZU9yVmFsdWU6IE1heWJlPHN0cmluZz4gfCBPYnNlcnZhYmxlPE1heWJlPHN0cmluZz4+KSA9PiBTdWJzY3JpcHRpb247XG4gIHJlYWRvbmx5IHNldFJlZiA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHJlZjogTWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+KSA9PiAocmVmID8geyAuLi5zdGF0ZSwga2V5OiB1bmRlZmluZWQsIGlkOiB1bmRlZmluZWQsIHJlZiB9IDogeyAuLi5zdGF0ZSwgcmVmIH0pKSBhcyAob2JzZXJ2YWJsZU9yVmFsdWU6IE1heWJlPERvY3VtZW50UmVmZXJlbmNlPFQ+PiB8IE9ic2VydmFibGU8TWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+PikgPT4gU3Vic2NyaXB0aW9uO1xuXG4gIHJlYWRvbmx5IHNldFN0cmVhbU1vZGUgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzdHJlYW1Nb2RlOiBGaXJlc3RvcmVBY2Nlc3NvclN0cmVhbU1vZGUpID0+ICh7IC4uLnN0YXRlLCBzdHJlYW1Nb2RlIH0pKTtcblxuICByZWFkb25seSBjbGVhclJlZnMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiAoeyAuLi5zdGF0ZSwgaWQ6IHVuZGVmaW5lZCwga2V5OiB1bmRlZmluZWQsIHJlZjogdW5kZWZpbmVkIH0pKTtcblxuICByZWFkb25seSBzZXRGaXJlc3RvcmVDb2xsZWN0aW9uID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZmlyZXN0b3JlQ29sbGVjdGlvbjogTWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbjxULCBEPj4pID0+ICh7IC4uLnN0YXRlLCBmaXJlc3RvcmVDb2xsZWN0aW9uIH0pKTtcbiAgcmVhZG9ubHkgc2V0RmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBmaXJlc3RvcmVDb2xsZWN0aW9uTGlrZTogTWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbkxpa2U8VCwgRD4+KSA9PiAoeyAuLi5zdGF0ZSwgZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UgfSkpO1xufVxuXG5mdW5jdGlvbiBpbmplY3RTaW5nbGVJdGVtSWRJbnRvU3RhdGU8VCwgRCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PFQ+ID0gRmlyZXN0b3JlRG9jdW1lbnQ8VD4sIEMgZXh0ZW5kcyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVDb250ZXh0U3RhdGU8VCwgRD4gPSBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVDb250ZXh0U3RhdGU8VCwgRD4+KHN0YXRlPzogQyB8IHVuZGVmaW5lZCk6IEMgfCB1bmRlZmluZWQge1xuICBjb25zdCBpZCA9IChzdGF0ZT8uZmlyZXN0b3JlQ29sbGVjdGlvbiBhcyBSb290U2luZ2xlSXRlbUZpcmVzdG9yZUNvbGxlY3Rpb248VCwgRD4pPy5zaW5nbGVJdGVtSWRlbnRpZmllcjtcblxuICBpZiAoc3RhdGUgJiYgaWQgIT0gbnVsbCkge1xuICAgIHJldHVybiB7IC4uLnN0YXRlLCBpZCB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG4vKipcbiAqIEFic3RyYWN0RGJ4RmlyZWJhc2VEb2N1bWVudFdpdGhQYXJlbnRTdG9yZSBleHRlbnNpb24gZm9yIHVzZSB3aXRoIFJvb3RTaW5nbGVJdGVtRmlyZXN0b3JlQ29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0Um9vdFNpbmdsZUl0ZW1EYnhGaXJlYmFzZURvY3VtZW50PFQsIEQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudDxUPiA9IEZpcmVzdG9yZURvY3VtZW50PFQ+LCBDIGV4dGVuZHMgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlQ29udGV4dFN0YXRlPFQsIEQ+ID0gRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlQ29udGV4dFN0YXRlPFQsIEQ+PiBleHRlbmRzIEFic3RyYWN0RGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlPFQsIEQsIEM+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKEBJbmplY3QobnVsbCkgQE9wdGlvbmFsKCkgaW5pdGlhbFN0YXRlPzogQykge1xuICAgIHN1cGVyKGluamVjdFNpbmdsZUl0ZW1JZEludG9TdGF0ZTxULCBELCBDPihpbml0aWFsU3RhdGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBTaW5nbGVJdGVtRmlyZXN0b3JlQ29sbGVjdGlvbiB0byB1c2UuXG4gICAqL1xuICBvdmVycmlkZSByZWFkb25seSBzZXRGaXJlc3RvcmVDb2xsZWN0aW9uID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZmlyZXN0b3JlQ29sbGVjdGlvbjogTWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbjxULCBEPj4pID0+IHtcbiAgICBpZiAoZmlyZXN0b3JlQ29sbGVjdGlvbiAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpZCA9IChmaXJlc3RvcmVDb2xsZWN0aW9uIGFzIFJvb3RTaW5nbGVJdGVtRmlyZXN0b3JlQ29sbGVjdGlvbjxULCBEPikuc2luZ2xlSXRlbUlkZW50aWZpZXI7XG5cbiAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBmaXJlc3RvcmVDb2xsZWN0aW9uLCBpZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBYnN0cmFjdFJvb3RTaW5nbGVJdGVtRGJ4RmlyZWJhc2VEb2N1bWVudCBvbmx5IGFjY2VwdHMgUm9vdFNpbmdsZUl0ZW1GaXJlc3RvcmVDb2xsZWN0aW9uIHZhbHVlcyB3aXRoIGEgc2luZ2xlSXRlbUlkZW50aWZpZXIgc2V0IGZvciBzZXRGaXJlc3RvcmVDb2xsZWN0aW9uLicpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZmlyZXN0b3JlQ29sbGVjdGlvbjogbnVsbCB9O1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIERvZXMgbm90aGluZyBvbiBhIEFic3RyYWN0Um9vdFNpbmdsZUl0ZW1EYnhGaXJlYmFzZURvY3VtZW50LlxuICAgKlxuICAgKiBSZWYgaXMgc2V0IHdpdGggdGhlIEZpcmVzdG9yZUNvbGxlY3Rpb25cbiAgICovXG4gIG92ZXJyaWRlIHJlYWRvbmx5IHNldElkID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgaWQ6IE1heWJlPEZpcmVzdG9yZU1vZGVsSWQ+KSA9PiBzdGF0ZSkgYXMgKG9ic2VydmFibGVPclZhbHVlOiBNYXliZTxzdHJpbmc+IHwgT2JzZXJ2YWJsZTxNYXliZTxzdHJpbmc+PikgPT4gU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBEb2VzIG5vdGhpbmcgb24gYSBBYnN0cmFjdFJvb3RTaW5nbGVJdGVtRGJ4RmlyZWJhc2VEb2N1bWVudC5cbiAgICpcbiAgICogUmVmIGlzIHNldCB3aXRoIHRoZSBGaXJlc3RvcmVDb2xsZWN0aW9uXG4gICAqL1xuICBvdmVycmlkZSByZWFkb25seSBzZXRLZXkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBrZXk6IE1heWJlPEZpcmVzdG9yZU1vZGVsS2V5PikgPT4gc3RhdGUpIGFzIChvYnNlcnZhYmxlT3JWYWx1ZTogTWF5YmU8c3RyaW5nPiB8IE9ic2VydmFibGU8TWF5YmU8c3RyaW5nPj4pID0+IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogRG9lcyBub3RoaW5nIG9uIGEgQWJzdHJhY3RSb290U2luZ2xlSXRlbURieEZpcmViYXNlRG9jdW1lbnQuXG4gICAqXG4gICAqIFJlZiBpcyBzZXQgd2l0aCB0aGUgRmlyZXN0b3JlQ29sbGVjdGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc2V0UmVmID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgcmVmOiBNYXliZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4pID0+IHN0YXRlKSBhcyAob2JzZXJ2YWJsZU9yVmFsdWU6IE1heWJlPERvY3VtZW50UmVmZXJlbmNlPFQ+PiB8IE9ic2VydmFibGU8TWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+PikgPT4gU3Vic2NyaXB0aW9uO1xuXG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNsZWFyUmVmcyA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHN0YXRlKTtcbn1cbiJdfQ==
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2RlbC9tb2R1bGVzL3N0b3JlL3N0b3JlLmRvY3VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFjLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBZ0IsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RILE9BQU8sRUFVTCx3QkFBd0IsRUFDeEIsMEJBQTBCLEVBRTFCLDJCQUEyQixFQUUzQix3QkFBd0IsRUFDeEIsMkJBQTJCLEVBRTNCLHVDQUF1QyxFQUd2QyxxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzVCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFdBQVcsRUFBZ0IsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQXFCLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25LLE9BQU8sRUFBUyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFvQixxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUEwRnJELE1BQU0sT0FBTyxnQ0FBOEwsU0FBUSxxQkFBd0I7SUFDek8sZ0JBQWdCO0lBRWhCLGtCQUFrQjtJQUNULCtCQUErQixHQUFxRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQzlE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RSxHQUE2QixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQW1GLENBQUM7SUFFM0s7Ozs7T0FJRztJQUNlLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQWdDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBK0csQ0FBQztJQUV4TCxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDOUQsQ0FBQTtBQTVDWSx5Q0FBeUM7SUFDN0IsV0FBQSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFBRSxXQUFBLFFBQVEsRUFBRSxDQUFBOztHQURwQyx5Q0FBeUMsQ0E0Q3JEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXksIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcCwgY29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9uLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRTbmFwc2hvdCxcbiAgRG9jdW1lbnRSZWZlcmVuY2UsXG4gIEZpcmVzdG9yZUNvbGxlY3Rpb24sXG4gIEZpcmVzdG9yZURvY3VtZW50LFxuICBEb2N1bWVudERhdGFXaXRoSWRBbmRLZXksXG4gIEZpcmVzdG9yZU1vZGVsSWQsXG4gIEZpcmVzdG9yZU1vZGVsS2V5LFxuICBGaXJlc3RvcmVDb2xsZWN0aW9uTGlrZSxcbiAgRmlyZXN0b3JlTW9kZWxJZGVudGl0eSxcbiAgZmlyZXN0b3JlTW9kZWxJZHNGcm9tS2V5LFxuICBmaXJlc3RvcmVNb2RlbEtleVBhcnRQYWlycyxcbiAgRmlyZXN0b3JlTW9kZWxDb2xsZWN0aW9uQW5kSWRQYWlyLFxuICBmaXJlc3RvcmVNb2RlbEtleVBhaXJPYmplY3QsXG4gIEZpcmVzdG9yZU1vZGVsQ29sbGVjdGlvbkFuZElkUGFpck9iamVjdCxcbiAgZG9jdW1lbnREYXRhV2l0aElkQW5kS2V5LFxuICBGaXJlc3RvcmVBY2Nlc3NvclN0cmVhbU1vZGUsXG4gIFR3b1dheUZsYXRGaXJlc3RvcmVNb2RlbEtleSxcbiAgaW5mZXJLZXlGcm9tVHdvV2F5RmxhdEZpcmVzdG9yZU1vZGVsS2V5LFxuICBSb290U2luZ2xlSXRlbUZpcmVzdG9yZUNvbGxlY3Rpb24sXG4gIEZsYXRGaXJlc3RvcmVNb2RlbEtleSxcbiAgZmxhdEZpcmVzdG9yZU1vZGVsS2V5LFxuICB0d29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXlcbn0gZnJvbSAnQGRlcmVla2IvZmlyZWJhc2UnO1xuaW1wb3J0IHsgZmlsdGVyTWF5YmUsIExvYWRpbmdTdGF0ZSwgYmVnaW5Mb2FkaW5nLCBzdWNjZXNzUmVzdWx0LCBsb2FkaW5nU3RhdGVGcm9tT2JzLCBlcnJvclJlc3VsdCwgT2JzZXJ2YWJsZU9yVmFsdWUsIGlzTG9hZGluZ1N0YXRlTG9hZGluZyB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgTWF5YmUsIGlzTWF5YmVTbyB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgTG9ja1NldENvbXBvbmVudCwgTG9ja1NldENvbXBvbmVudFN0b3JlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LWNvcmUnO1xuaW1wb3J0IHsgbW9kZWxEb2VzTm90RXhpc3RFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9yJztcblxuZXhwb3J0IGludGVyZmFjZSBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmU8VCwgRCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PFQ+ID0gRmlyZXN0b3JlRG9jdW1lbnQ8VD4+IGV4dGVuZHMgTG9ja1NldENvbXBvbmVudCB7XG4gIHJlYWRvbmx5IGZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVDb2xsZWN0aW9uTGlrZTxULCBEPj47XG4gIHJlYWRvbmx5IGZpcmVzdG9yZUNvbGxlY3Rpb24kOiBPYnNlcnZhYmxlPEZpcmVzdG9yZUNvbGxlY3Rpb248VCwgRD4+O1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dElkJDogT2JzZXJ2YWJsZTxNYXliZTxGaXJlc3RvcmVNb2RlbElkPj47XG4gIHJlYWRvbmx5IGlucHV0SWQkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWQ+O1xuICByZWFkb25seSBjdXJyZW50SW5wdXRLZXkkOiBPYnNlcnZhYmxlPE1heWJlPEZpcmVzdG9yZU1vZGVsS2V5Pj47XG4gIHJlYWRvbmx5IGlucHV0S2V5JDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbEtleT47XG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dFJlZiQ6IE9ic2VydmFibGU8TWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+PjtcbiAgcmVhZG9ubHkgaW5wdXRSZWYkOiBPYnNlcnZhYmxlPERvY3VtZW50UmVmZXJlbmNlPFQ+PjtcblxuICByZWFkb25seSBzdHJlYW1Nb2RlJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVBY2Nlc3NvclN0cmVhbU1vZGU+O1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREb2N1bWVudCQ6IE9ic2VydmFibGU8TWF5YmU8RD4+O1xuICByZWFkb25seSBkb2N1bWVudCQ6IE9ic2VydmFibGU8RD47XG4gIHJlYWRvbmx5IGlkJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbElkPjtcbiAgcmVhZG9ubHkga2V5JDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbEtleT47XG4gIHJlYWRvbmx5IHJlZiQ6IE9ic2VydmFibGU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+O1xuICByZWFkb25seSBoYXNSZWYkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICByZWFkb25seSBmbGF0S2V5JDogT2JzZXJ2YWJsZTxGbGF0RmlyZXN0b3JlTW9kZWxLZXk+O1xuICByZWFkb25seSB0d29XYXlGbGF0S2V5JDogT2JzZXJ2YWJsZTxUd29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXk+O1xuXG4gIHJlYWRvbmx5IGtleU1vZGVsSWRzJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbElkW10+O1xuICByZWFkb25seSBrZXlQYWlycyQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxDb2xsZWN0aW9uQW5kSWRQYWlyW10+O1xuICByZWFkb25seSBrZXlQYWlyT2JqZWN0JDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbENvbGxlY3Rpb25BbmRJZFBhaXJPYmplY3Q+O1xuXG4gIHJlYWRvbmx5IGRvY3VtZW50TG9hZGluZ1N0YXRlJDogT2JzZXJ2YWJsZTxMb2FkaW5nU3RhdGU8RD4+O1xuICByZWFkb25seSBzbmFwc2hvdCQ6IE9ic2VydmFibGU8RG9jdW1lbnRTbmFwc2hvdDxUPj47XG4gIHJlYWRvbmx5IHNuYXBzaG90TG9hZGluZ1N0YXRlJDogT2JzZXJ2YWJsZTxMb2FkaW5nU3RhdGU8RG9jdW1lbnRTbmFwc2hvdDxUPj4+O1xuICByZWFkb25seSBjdXJyZW50RGF0YSQ6IE9ic2VydmFibGU8TWF5YmU8RG9jdW1lbnREYXRhV2l0aElkQW5kS2V5PFQ+Pj47XG4gIHJlYWRvbmx5IGRhdGEkOiBPYnNlcnZhYmxlPERvY3VtZW50RGF0YVdpdGhJZEFuZEtleTxUPj47XG4gIHJlYWRvbmx5IGRhdGFMb2FkaW5nU3RhdGUkOiBPYnNlcnZhYmxlPExvYWRpbmdTdGF0ZTxEb2N1bWVudERhdGFXaXRoSWRBbmRLZXk8VD4+PjtcbiAgcmVhZG9ubHkgaXNMb2FkaW5nRGF0YSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IGN1cnJlbnRFeGlzdHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICByZWFkb25seSBleGlzdHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICByZWFkb25seSBtb2RlbElkZW50aXR5JDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbElkZW50aXR5PjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgaWQgb2YgdGhlIGRvY3VtZW50IHRvIGxvYWQuXG4gICAqL1xuICByZWFkb25seSBzZXRJZDogKG9ic2VydmFibGVPclZhbHVlOiBPYnNlcnZhYmxlT3JWYWx1ZTxNYXliZTxGaXJlc3RvcmVNb2RlbElkPj4pID0+IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUga2V5IG9mIHRoZSBkb2N1bWVudCB0byBsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0S2V5OiAob2JzZXJ2YWJsZU9yVmFsdWU6IE9ic2VydmFibGVPclZhbHVlPE1heWJlPEZpcmVzdG9yZU1vZGVsS2V5Pj4pID0+IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUga2V5IG9mIHRoZSBkb2N1bWVudCB0byBsb2FkIHVzaW5nIGEgVHdvV2F5RmxhdEZpcmVzdG9yZU1vZGVsS2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0RmxhdEtleTogKG9ic2VydmFibGVPclZhbHVlOiBPYnNlcnZhYmxlT3JWYWx1ZTxNYXliZTxUd29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXk+PikgPT4gU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZWYgb2YgdGhlIGRvY3VtZW50IHRvIGxvYWQuXG4gICAqL1xuICByZWFkb25seSBzZXRSZWY6IChvYnNlcnZhYmxlT3JWYWx1ZTogT2JzZXJ2YWJsZU9yVmFsdWU8TWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+PikgPT4gU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGtleS9pZC9yZWYgYW5kIGN1cnJlbnQgZG9jdW1lbnQgZnJvbSB0aGUgc3RvcmUuXG4gICAqL1xuICByZWFkb25seSBjbGVhclJlZnM6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0cmVhbSBtb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0U3RyZWFtTW9kZTogKG9ic2VydmFibGVPclZhbHVlOiBPYnNlcnZhYmxlT3JWYWx1ZTxGaXJlc3RvcmVBY2Nlc3NvclN0cmVhbU1vZGU+KSA9PiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIEZpcmVzdG9yZUNvbGxlY3Rpb24gdG8gcmV0cmlldmUgZG9jdW1lbnRzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzZXRGaXJlc3RvcmVDb2xsZWN0aW9uOiAoKCkgPT4gdm9pZCkgfCAoKG9ic2VydmFibGVPclZhbHVlOiBPYnNlcnZhYmxlT3JWYWx1ZTxNYXliZTxGaXJlc3RvcmVDb2xsZWN0aW9uPFQsIEQ+Pj4pID0+IFN1YnNjcmlwdGlvbik7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlIHRvIHJldHJpZXZlIGRvY3VtZW50cyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0RmlyZXN0b3JlQ29sbGVjdGlvbkxpa2U6ICgoKSA9PiB2b2lkKSB8ICgob2JzZXJ2YWJsZU9yVmFsdWU6IE9ic2VydmFibGVPclZhbHVlPE1heWJlPEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlPFQsIEQ+Pj4pID0+IFN1YnNjcmlwdGlvbik7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlQ29udGV4dFN0YXRlPFQsIEQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudDxUPiA9IEZpcmVzdG9yZURvY3VtZW50PFQ+PiB7XG4gIHJlYWRvbmx5IGZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlPzogTWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbkxpa2U8VCwgRD4+O1xuICByZWFkb25seSBmaXJlc3RvcmVDb2xsZWN0aW9uPzogTWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbjxULCBEPj47XG4gIHJlYWRvbmx5IHN0cmVhbU1vZGU/OiBGaXJlc3RvcmVBY2Nlc3NvclN0cmVhbU1vZGU7XG4gIHJlYWRvbmx5IGlkPzogTWF5YmU8RmlyZXN0b3JlTW9kZWxJZD47XG4gIHJlYWRvbmx5IGtleT86IE1heWJlPEZpcmVzdG9yZU1vZGVsS2V5PjtcbiAgcmVhZG9ubHkgcmVmPzogTWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQWJzdHJhY3REYnhGaXJlYmFzZURvY3VtZW50U3RvcmU8VCwgRCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PFQ+ID0gRmlyZXN0b3JlRG9jdW1lbnQ8VD4sIEMgZXh0ZW5kcyBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVDb250ZXh0U3RhdGU8VCwgRD4gPSBEYnhGaXJlYmFzZURvY3VtZW50U3RvcmVDb250ZXh0U3RhdGU8VCwgRD4+IGV4dGVuZHMgTG9ja1NldENvbXBvbmVudFN0b3JlPEM+IGltcGxlbWVudHMgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlPFQsIEQ+IHtcbiAgLy8gTUFSSzogRWZmZWN0c1xuXG4gIC8vIE1BUks6IEFjY2Vzc29yc1xuICByZWFkb25seSBjdXJyZW50RmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UkOiBPYnNlcnZhYmxlPE1heWJlPEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlPFQsIEQ+Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maXJlc3RvcmVDb2xsZWN0aW9uID8/IHguZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RmlyZXN0b3JlQ29sbGVjdGlvbiQ6IE9ic2VydmFibGU8TWF5YmU8RmlyZXN0b3JlQ29sbGVjdGlvbjxULCBEPj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguZmlyZXN0b3JlQ29sbGVjdGlvbiksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVDb2xsZWN0aW9uTGlrZTxULCBEPj4gPSB0aGlzLmN1cnJlbnRGaXJlc3RvcmVDb2xsZWN0aW9uTGlrZSQucGlwZShmaWx0ZXJNYXliZSgpKTtcbiAgcmVhZG9ubHkgZmlyZXN0b3JlQ29sbGVjdGlvbiQ6IE9ic2VydmFibGU8RmlyZXN0b3JlQ29sbGVjdGlvbjxULCBEPj4gPSB0aGlzLmN1cnJlbnRGaXJlc3RvcmVDb2xsZWN0aW9uJC5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dElkJDogT2JzZXJ2YWJsZTxNYXliZTxGaXJlc3RvcmVNb2RlbElkPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pZCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0SWQkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWQ+ID0gdGhpcy5jdXJyZW50SW5wdXRJZCQucGlwZShmaWx0ZXJNYXliZSgpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgY3VycmVudElucHV0S2V5JDogT2JzZXJ2YWJsZTxNYXliZTxGaXJlc3RvcmVNb2RlbEtleT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHgua2V5KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRLZXkkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsS2V5PiA9IHRoaXMuY3VycmVudElucHV0S2V5JC5waXBlKGZpbHRlck1heWJlKCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBjdXJyZW50SW5wdXRSZWYkOiBPYnNlcnZhYmxlPE1heWJlPERvY3VtZW50UmVmZXJlbmNlPFQ+Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5yZWYpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFJlZiQ6IE9ic2VydmFibGU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+ID0gdGhpcy5jdXJyZW50SW5wdXRSZWYkLnBpcGUoZmlsdGVyTWF5YmUoKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHN0cmVhbU1vZGUkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZUFjY2Vzc29yU3RyZWFtTW9kZT4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5zdHJlYW1Nb2RlID8/IEZpcmVzdG9yZUFjY2Vzc29yU3RyZWFtTW9kZS5TVFJFQU0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RG9jdW1lbnQkOiBPYnNlcnZhYmxlPE1heWJlPEQ+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuY3VycmVudElucHV0SWQkLCB0aGlzLmN1cnJlbnRJbnB1dEtleSQsIHRoaXMuY3VycmVudElucHV0UmVmJF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbaWQsIGtleSwgcmVmXSkgPT4ge1xuICAgICAgbGV0IGRvY3VtZW50OiBPYnNlcnZhYmxlPE1heWJlPEQ+PjtcblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkb2N1bWVudCA9IHRoaXMuZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2UkLnBpcGUobWFwKCh4KSA9PiB4LmRvY3VtZW50QWNjZXNzb3IoKS5sb2FkRG9jdW1lbnQocmVmKSkpO1xuICAgICAgfSBlbHNlIGlmIChrZXkpIHtcbiAgICAgICAgZG9jdW1lbnQgPSB0aGlzLmZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlJC5waXBlKG1hcCgoeCkgPT4geC5kb2N1bWVudEFjY2Vzc29yKCkubG9hZERvY3VtZW50Rm9yS2V5KGtleSkpKTtcbiAgICAgIH0gZWxzZSBpZiAoaWQpIHtcbiAgICAgICAgZG9jdW1lbnQgPSB0aGlzLmZpcmVzdG9yZUNvbGxlY3Rpb24kLnBpcGUobWFwKCh4KSA9PiB4LmRvY3VtZW50QWNjZXNzb3IoKS5sb2FkRG9jdW1lbnRGb3JJZChpZCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50ID0gb2YodW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgYW4gaWQvcmVmL2tleSBoYXMgYmVlbiBpbnB1dCBhbmQgY3VycmVudERvY3VtZW50IGlzIG5vdCBudWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzUmVmJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuY3VycmVudERvY3VtZW50JC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZG9jdW1lbnRSZWYgIT0gbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRvY3VtZW50JDogT2JzZXJ2YWJsZTxEPiA9IHRoaXMuY3VycmVudERvY3VtZW50JC5waXBlKGZpbHRlck1heWJlKCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBkb2N1bWVudExvYWRpbmdTdGF0ZSQ6IE9ic2VydmFibGU8TG9hZGluZ1N0YXRlPEQ+PiA9IHRoaXMuY3VycmVudERvY3VtZW50JC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHggPyBzdWNjZXNzUmVzdWx0KHgpIDogYmVnaW5Mb2FkaW5nPEQ+KCkpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlkJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbElkPiA9IHRoaXMuZG9jdW1lbnQkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlkKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGtleSQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxLZXk+ID0gdGhpcy5kb2N1bWVudCQucGlwZShcbiAgICBtYXAoKHgpID0+IHgua2V5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGtleU1vZGVsSWRzJDogT2JzZXJ2YWJsZTxGaXJlc3RvcmVNb2RlbElkW10+ID0gdGhpcy5rZXkkLnBpcGUobWFwKGZpcmVzdG9yZU1vZGVsSWRzRnJvbUtleSksIHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkga2V5UGFpcnMkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsQ29sbGVjdGlvbkFuZElkUGFpcltdPiA9IHRoaXMua2V5JC5waXBlKG1hcChmaXJlc3RvcmVNb2RlbEtleVBhcnRQYWlycyksIGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkga2V5UGFpck9iamVjdCQ6IE9ic2VydmFibGU8RmlyZXN0b3JlTW9kZWxDb2xsZWN0aW9uQW5kSWRQYWlyT2JqZWN0PiA9IHRoaXMua2V5JC5waXBlKG1hcChmaXJlc3RvcmVNb2RlbEtleVBhaXJPYmplY3QpLCBmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgcmVmJDogT2JzZXJ2YWJsZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4gPSB0aGlzLmRvY3VtZW50JC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5kb2N1bWVudFJlZiksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBmbGF0S2V5JDogT2JzZXJ2YWJsZTxGbGF0RmlyZXN0b3JlTW9kZWxLZXk+ID0gdGhpcy5rZXkkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBmbGF0RmlyZXN0b3JlTW9kZWxLZXkoeCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdHdvV2F5RmxhdEtleSQ6IE9ic2VydmFibGU8RmxhdEZpcmVzdG9yZU1vZGVsS2V5PiA9IHRoaXMua2V5JC5waXBlKFxuICAgIG1hcCgoeCkgPT4gdHdvV2F5RmxhdEZpcmVzdG9yZU1vZGVsS2V5KHgpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNuYXBzaG90JDogT2JzZXJ2YWJsZTxEb2N1bWVudFNuYXBzaG90PFQ+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZG9jdW1lbnQkLCB0aGlzLnN0cmVhbU1vZGUkXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFt4LCBtb2RlXSkgPT4geC5zbmFwc2hvdFN0cmVhbShtb2RlKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzbmFwc2hvdExvYWRpbmdTdGF0ZSQ6IE9ic2VydmFibGU8TG9hZGluZ1N0YXRlPERvY3VtZW50U25hcHNob3Q8VD4+PiA9IHRoaXMuY3VycmVudERvY3VtZW50JC5waXBlKFxuICAgIHN3aXRjaE1hcCgoKSA9PiBsb2FkaW5nU3RhdGVGcm9tT2JzKHRoaXMuc25hcHNob3QkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0YSQ6IE9ic2VydmFibGU8TWF5YmU8RG9jdW1lbnREYXRhV2l0aElkQW5kS2V5PFQ+Pj4gPSB0aGlzLnNuYXBzaG90JC5waXBlKFxuICAgIG1hcCgoeCkgPT4gZG9jdW1lbnREYXRhV2l0aElkQW5kS2V5KHgpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGEkOiBPYnNlcnZhYmxlPERvY3VtZW50RGF0YVdpdGhJZEFuZEtleTxUPj4gPSB0aGlzLmN1cnJlbnREb2N1bWVudCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jdXJyZW50RGF0YSQucGlwZShmaWx0ZXJNYXliZSgpKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRhTG9hZGluZ1N0YXRlJDogT2JzZXJ2YWJsZTxMb2FkaW5nU3RhdGU8RG9jdW1lbnREYXRhV2l0aElkQW5kS2V5PFQ+Pj4gPSB0aGlzLnNuYXBzaG90TG9hZGluZ1N0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogTG9hZGluZ1N0YXRlPERvY3VtZW50RGF0YVdpdGhJZEFuZEtleTxUPj47XG5cbiAgICAgIGlmICh4LnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkb2N1bWVudERhdGFXaXRoSWRBbmRLZXkoeC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICByZXN1bHQgPSBzdWNjZXNzUmVzdWx0KGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGVycm9yUmVzdWx0KG1vZGVsRG9lc05vdEV4aXN0RXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzTG9hZGluZ0RhdGEkID0gdGhpcy5kYXRhTG9hZGluZ1N0YXRlJC5waXBlKG1hcChpc0xvYWRpbmdTdGF0ZUxvYWRpbmcpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmFsc2Ugd2hpbGUgaGFzUmVmJCBpcyBmYWxzZSwgYW5kIHRoZW4gcmV0dXJucyBleGlzdHMkLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEV4aXN0cyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmhhc1JlZiQucGlwZShcbiAgICBzd2l0Y2hNYXAoKGhhc1JlZikgPT4ge1xuICAgICAgaWYgKGhhc1JlZikge1xuICAgICAgICByZXR1cm4gdGhpcy5leGlzdHMkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGV4aXN0cyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmN1cnJlbnREYXRhJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gaXNNYXliZVNvKHgpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRvZXNOb3RFeGlzdCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmV4aXN0cyQucGlwZShcbiAgICBtYXAoKHgpID0+ICF4KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1vZGVsSWRlbnRpdHkkOiBPYnNlcnZhYmxlPEZpcmVzdG9yZU1vZGVsSWRlbnRpdHk+ID0gdGhpcy5kb2N1bWVudCQucGlwZShcbiAgICBtYXAoKHgpID0+IHgubW9kZWxJZGVudGl0eSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvLyBNQVJLOiBTdGF0ZSBDaGFuZ2VzXG4gIHJlYWRvbmx5IHNldElkID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgaWQ6IE1heWJlPEZpcmVzdG9yZU1vZGVsSWQ+KSA9PiAoaWQgPyB7IC4uLnN0YXRlLCBpZCwga2V5OiB1bmRlZmluZWQsIHJlZjogdW5kZWZpbmVkIH0gOiB7IC4uLnN0YXRlLCBpZCB9KSkgYXMgKG9ic2VydmFibGVPclZhbHVlOiBNYXliZTxzdHJpbmc+IHwgT2JzZXJ2YWJsZTxNYXliZTxzdHJpbmc+PikgPT4gU3Vic2NyaXB0aW9uO1xuICByZWFkb25seSBzZXRLZXkgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBrZXk6IE1heWJlPEZpcmVzdG9yZU1vZGVsS2V5PikgPT4gKGtleSA/IHsgLi4uc3RhdGUsIGtleSwgaWQ6IHVuZGVmaW5lZCwgcmVmOiB1bmRlZmluZWQgfSA6IHsgLi4uc3RhdGUsIGtleSB9KSkgYXMgKG9ic2VydmFibGVPclZhbHVlOiBNYXliZTxzdHJpbmc+IHwgT2JzZXJ2YWJsZTxNYXliZTxzdHJpbmc+PikgPT4gU3Vic2NyaXB0aW9uO1xuICByZWFkb25seSBzZXRGbGF0S2V5ID0gdGhpcy51cGRhdGVyKChzdGF0ZSwga2V5OiBNYXliZTxUd29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXk+KSA9PiAoa2V5ID8geyAuLi5zdGF0ZSwga2V5OiBpbmZlcktleUZyb21Ud29XYXlGbGF0RmlyZXN0b3JlTW9kZWxLZXkoa2V5KSwgaWQ6IHVuZGVmaW5lZCwgcmVmOiB1bmRlZmluZWQgfSA6IHsgLi4uc3RhdGUsIGtleSB9KSkgYXMgKG9ic2VydmFibGVPclZhbHVlOiBNYXliZTxzdHJpbmc+IHwgT2JzZXJ2YWJsZTxNYXliZTxzdHJpbmc+PikgPT4gU3Vic2NyaXB0aW9uO1xuICByZWFkb25seSBzZXRSZWYgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCByZWY6IE1heWJlPERvY3VtZW50UmVmZXJlbmNlPFQ+PikgPT4gKHJlZiA/IHsgLi4uc3RhdGUsIGtleTogdW5kZWZpbmVkLCBpZDogdW5kZWZpbmVkLCByZWYgfSA6IHsgLi4uc3RhdGUsIHJlZiB9KSkgYXMgKG9ic2VydmFibGVPclZhbHVlOiBNYXliZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4gfCBPYnNlcnZhYmxlPE1heWJlPERvY3VtZW50UmVmZXJlbmNlPFQ+Pj4pID0+IFN1YnNjcmlwdGlvbjtcblxuICByZWFkb25seSBzZXRTdHJlYW1Nb2RlID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc3RyZWFtTW9kZTogRmlyZXN0b3JlQWNjZXNzb3JTdHJlYW1Nb2RlKSA9PiAoeyAuLi5zdGF0ZSwgc3RyZWFtTW9kZSB9KSk7XG5cbiAgcmVhZG9ubHkgY2xlYXJSZWZzID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gKHsgLi4uc3RhdGUsIGlkOiB1bmRlZmluZWQsIGtleTogdW5kZWZpbmVkLCByZWY6IHVuZGVmaW5lZCB9KSk7XG5cbiAgcmVhZG9ubHkgc2V0RmlyZXN0b3JlQ29sbGVjdGlvbiA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGZpcmVzdG9yZUNvbGxlY3Rpb246IE1heWJlPEZpcmVzdG9yZUNvbGxlY3Rpb248VCwgRD4+KSA9PiAoeyAuLi5zdGF0ZSwgZmlyZXN0b3JlQ29sbGVjdGlvbiB9KSk7XG4gIHJlYWRvbmx5IHNldEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZmlyZXN0b3JlQ29sbGVjdGlvbkxpa2U6IE1heWJlPEZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlPFQsIEQ+PikgPT4gKHsgLi4uc3RhdGUsIGZpcmVzdG9yZUNvbGxlY3Rpb25MaWtlIH0pKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0U2luZ2xlSXRlbUlkSW50b1N0YXRlPFQsIEQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudDxUPiA9IEZpcmVzdG9yZURvY3VtZW50PFQ+LCBDIGV4dGVuZHMgRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlQ29udGV4dFN0YXRlPFQsIEQ+ID0gRGJ4RmlyZWJhc2VEb2N1bWVudFN0b3JlQ29udGV4dFN0YXRlPFQsIEQ+PihzdGF0ZT86IEMgfCB1bmRlZmluZWQpOiBDIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaWQgPSAoc3RhdGU/LmZpcmVzdG9yZUNvbGxlY3Rpb24gYXMgUm9vdFNpbmdsZUl0ZW1GaXJlc3RvcmVDb2xsZWN0aW9uPFQsIEQ+KT8uc2luZ2xlSXRlbUlkZW50aWZpZXI7XG5cbiAgaWYgKHN0YXRlICYmIGlkICE9IG51bGwpIHtcbiAgICByZXR1cm4geyAuLi5zdGF0ZSwgaWQgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBBYnN0cmFjdERieEZpcmViYXNlRG9jdW1lbnRXaXRoUGFyZW50U3RvcmUgZXh0ZW5zaW9uIGZvciB1c2Ugd2l0aCBSb290U2luZ2xlSXRlbUZpcmVzdG9yZUNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFJvb3RTaW5nbGVJdGVtRGJ4RmlyZWJhc2VEb2N1bWVudDxULCBEIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ8VD4gPSBGaXJlc3RvcmVEb2N1bWVudDxUPiwgQyBleHRlbmRzIERieEZpcmViYXNlRG9jdW1lbnRTdG9yZUNvbnRleHRTdGF0ZTxULCBEPiA9IERieEZpcmViYXNlRG9jdW1lbnRTdG9yZUNvbnRleHRTdGF0ZTxULCBEPj4gZXh0ZW5kcyBBYnN0cmFjdERieEZpcmViYXNlRG9jdW1lbnRTdG9yZTxULCBELCBDPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihASW5qZWN0KG51bGwpIEBPcHRpb25hbCgpIGluaXRpYWxTdGF0ZT86IEMpIHtcbiAgICBzdXBlcihpbmplY3RTaW5nbGVJdGVtSWRJbnRvU3RhdGU8VCwgRCwgQz4oaW5pdGlhbFN0YXRlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgU2luZ2xlSXRlbUZpcmVzdG9yZUNvbGxlY3Rpb24gdG8gdXNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc2V0RmlyZXN0b3JlQ29sbGVjdGlvbiA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGZpcmVzdG9yZUNvbGxlY3Rpb246IE1heWJlPEZpcmVzdG9yZUNvbGxlY3Rpb248VCwgRD4+KSA9PiB7XG4gICAgaWYgKGZpcmVzdG9yZUNvbGxlY3Rpb24gIT0gbnVsbCkge1xuICAgICAgY29uc3QgaWQgPSAoZmlyZXN0b3JlQ29sbGVjdGlvbiBhcyBSb290U2luZ2xlSXRlbUZpcmVzdG9yZUNvbGxlY3Rpb248VCwgRD4pLnNpbmdsZUl0ZW1JZGVudGlmaWVyO1xuXG4gICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZmlyZXN0b3JlQ29sbGVjdGlvbiwgaWQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3RSb290U2luZ2xlSXRlbURieEZpcmViYXNlRG9jdW1lbnQgb25seSBhY2NlcHRzIFJvb3RTaW5nbGVJdGVtRmlyZXN0b3JlQ29sbGVjdGlvbiB2YWx1ZXMgd2l0aCBhIHNpbmdsZUl0ZW1JZGVudGlmaWVyIHNldCBmb3Igc2V0RmlyZXN0b3JlQ29sbGVjdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGZpcmVzdG9yZUNvbGxlY3Rpb246IG51bGwgfTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEb2VzIG5vdGhpbmcgb24gYSBBYnN0cmFjdFJvb3RTaW5nbGVJdGVtRGJ4RmlyZWJhc2VEb2N1bWVudC5cbiAgICpcbiAgICogUmVmIGlzIHNldCB3aXRoIHRoZSBGaXJlc3RvcmVDb2xsZWN0aW9uXG4gICAqL1xuICBvdmVycmlkZSByZWFkb25seSBzZXRJZCA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGlkOiBNYXliZTxGaXJlc3RvcmVNb2RlbElkPikgPT4gc3RhdGUpIGFzIChvYnNlcnZhYmxlT3JWYWx1ZTogTWF5YmU8c3RyaW5nPiB8IE9ic2VydmFibGU8TWF5YmU8c3RyaW5nPj4pID0+IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogRG9lcyBub3RoaW5nIG9uIGEgQWJzdHJhY3RSb290U2luZ2xlSXRlbURieEZpcmViYXNlRG9jdW1lbnQuXG4gICAqXG4gICAqIFJlZiBpcyBzZXQgd2l0aCB0aGUgRmlyZXN0b3JlQ29sbGVjdGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc2V0S2V5ID0gdGhpcy51cGRhdGVyKChzdGF0ZSwga2V5OiBNYXliZTxGaXJlc3RvcmVNb2RlbEtleT4pID0+IHN0YXRlKSBhcyAob2JzZXJ2YWJsZU9yVmFsdWU6IE1heWJlPHN0cmluZz4gfCBPYnNlcnZhYmxlPE1heWJlPHN0cmluZz4+KSA9PiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIERvZXMgbm90aGluZyBvbiBhIEFic3RyYWN0Um9vdFNpbmdsZUl0ZW1EYnhGaXJlYmFzZURvY3VtZW50LlxuICAgKlxuICAgKiBSZWYgaXMgc2V0IHdpdGggdGhlIEZpcmVzdG9yZUNvbGxlY3Rpb25cbiAgICovXG4gIG92ZXJyaWRlIHJlYWRvbmx5IHNldFJlZiA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHJlZjogTWF5YmU8RG9jdW1lbnRSZWZlcmVuY2U8VD4+KSA9PiBzdGF0ZSkgYXMgKG9ic2VydmFibGVPclZhbHVlOiBNYXliZTxEb2N1bWVudFJlZmVyZW5jZTxUPj4gfCBPYnNlcnZhYmxlPE1heWJlPERvY3VtZW50UmVmZXJlbmNlPFQ+Pj4pID0+IFN1YnNjcmlwdGlvbjtcblxuICBvdmVycmlkZSByZWFkb25seSBjbGVhclJlZnMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiBzdGF0ZSk7XG59XG4iXX0=