@lifeready/core 0.6.0-beta.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.
- package/README.md +62 -0
- package/bundles/lifeready-core.umd.js +15939 -0
- package/bundles/lifeready-core.umd.js.map +1 -0
- package/bundles/lifeready-core.umd.min.js +2 -0
- package/bundles/lifeready-core.umd.min.js.map +1 -0
- package/esm2015/lib/_common/ast.js +40 -0
- package/esm2015/lib/_common/deferred-promise.js +24 -0
- package/esm2015/lib/_common/exceptions.js +157 -0
- package/esm2015/lib/_common/queries.gql.js +190 -0
- package/esm2015/lib/_common/run-outside-angular.js +79 -0
- package/esm2015/lib/_common/types.js +1 -0
- package/esm2015/lib/_common/utils.js +44 -0
- package/esm2015/lib/api/contact-card.gql.js +79 -0
- package/esm2015/lib/api/contact-card.service.js +154 -0
- package/esm2015/lib/api/contact-card2.gql.js +60 -0
- package/esm2015/lib/api/contact-card2.service.js +103 -0
- package/esm2015/lib/api/file.service.js +74 -0
- package/esm2015/lib/api/item2.gql.js +110 -0
- package/esm2015/lib/api/item2.service.js +311 -0
- package/esm2015/lib/api/key-exchange.gql.js +188 -0
- package/esm2015/lib/api/key-exchange.service.js +442 -0
- package/esm2015/lib/api/key-exchange.types.js +18 -0
- package/esm2015/lib/api/key-exchange2.gql.js +171 -0
- package/esm2015/lib/api/key-exchange2.service.js +479 -0
- package/esm2015/lib/api/lock.gql.js +40 -0
- package/esm2015/lib/api/lock.service.js +64 -0
- package/esm2015/lib/api/lr-apollo.service.js +46 -0
- package/esm2015/lib/api/lr-graphql/index.js +6 -0
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -0
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -0
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -0
- package/esm2015/lib/api/message.service.js +138 -0
- package/esm2015/lib/api/persist.service.js +181 -0
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -0
- package/esm2015/lib/api/query-processor/index.js +3 -0
- package/esm2015/lib/api/query-processor/query-processor.service.js +192 -0
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -0
- package/esm2015/lib/api/shared-contact-card.service.js +119 -0
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/api/time.service.js +146 -0
- package/esm2015/lib/api/types/graphql.types.js +7 -0
- package/esm2015/lib/api/types/index.js +3 -0
- package/esm2015/lib/api/types/lr-graphql.types.js +71 -0
- package/esm2015/lib/auth/auth.config.js +57 -0
- package/esm2015/lib/auth/auth.gql.js +48 -0
- package/esm2015/lib/auth/auth.types.js +27 -0
- package/esm2015/lib/auth/idle.service.js +168 -0
- package/esm2015/lib/auth/idle.types.js +7 -0
- package/esm2015/lib/auth/lbop.service.js +355 -0
- package/esm2015/lib/auth/life-ready-auth.service.js +333 -0
- package/esm2015/lib/auth/password.service.js +320 -0
- package/esm2015/lib/auth/register.service.js +172 -0
- package/esm2015/lib/auth/two-factor.service.js +74 -0
- package/esm2015/lib/category/category-meta.service.js +99 -0
- package/esm2015/lib/category/category.gql.js +406 -0
- package/esm2015/lib/category/category.service.js +390 -0
- package/esm2015/lib/category/category.types.js +29 -0
- package/esm2015/lib/cryptography/cryptography.types.js +11 -0
- package/esm2015/lib/cryptography/encryption.service.js +189 -0
- package/esm2015/lib/cryptography/key-factory.service.js +237 -0
- package/esm2015/lib/cryptography/key-graph.service.js +280 -0
- package/esm2015/lib/cryptography/key-meta.service.js +200 -0
- package/esm2015/lib/cryptography/key.service.js +124 -0
- package/esm2015/lib/cryptography/slip39.service.js +169 -0
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -0
- package/esm2015/lib/life-ready.config.js +84 -0
- package/esm2015/lib/life-ready.module.js +74 -0
- package/esm2015/lib/plan/plan.gql.js +123 -0
- package/esm2015/lib/plan/plan.service.js +149 -0
- package/esm2015/lib/plan/plan.types.js +11 -0
- package/esm2015/lib/record/record-attachment.service.js +101 -0
- package/esm2015/lib/record/record.gql.js +179 -0
- package/esm2015/lib/record/record.service.js +206 -0
- package/esm2015/lib/record/record.types.js +15 -0
- package/esm2015/lib/record-type/record-type.service.js +75 -0
- package/esm2015/lib/record-type/record-type.types.js +28 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -0
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -0
- package/esm2015/lib/scenario/scenario-setup.service.js +269 -0
- package/esm2015/lib/scenario/scenario.gql.js +368 -0
- package/esm2015/lib/scenario/scenario.service.js +611 -0
- package/esm2015/lib/scenario/scenario.types.js +64 -0
- package/esm2015/lib/search/search.gql.js +62 -0
- package/esm2015/lib/search/search.service.js +156 -0
- package/esm2015/lib/search/search.types.js +6 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +266 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +300 -0
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -0
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -0
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -0
- package/esm2015/lib/users/profile-details.service.js +214 -0
- package/esm2015/lib/users/profile.gql.js +97 -0
- package/esm2015/lib/users/profile.service.js +169 -0
- package/esm2015/lib/users/profile.types.js +34 -0
- package/esm2015/lib/users/user.gql.js +60 -0
- package/esm2015/lib/users/user.service.js +79 -0
- package/esm2015/lib/users/user.types.js +5 -0
- package/esm2015/lifeready-core.js +10 -0
- package/esm2015/public-api.js +81 -0
- package/fesm2015/lifeready-core.js +13290 -0
- package/fesm2015/lifeready-core.js.map +1 -0
- package/lib/_common/ast.d.ts +11 -0
- package/lib/_common/deferred-promise.d.ts +12 -0
- package/lib/_common/exceptions.d.ts +109 -0
- package/lib/_common/queries.gql.d.ts +10 -0
- package/lib/_common/run-outside-angular.d.ts +14 -0
- package/lib/_common/types.d.ts +10 -0
- package/lib/_common/utils.d.ts +3 -0
- package/lib/api/contact-card.gql.d.ts +7 -0
- package/lib/api/contact-card.service.d.ts +52 -0
- package/lib/api/contact-card2.gql.d.ts +34 -0
- package/lib/api/contact-card2.service.d.ts +49 -0
- package/lib/api/file.service.d.ts +18 -0
- package/lib/api/item2.gql.d.ts +96 -0
- package/lib/api/item2.service.d.ts +177 -0
- package/lib/api/key-exchange.gql.d.ts +9 -0
- package/lib/api/key-exchange.service.d.ts +39 -0
- package/lib/api/key-exchange.types.d.ts +196 -0
- package/lib/api/key-exchange2.gql.d.ts +125 -0
- package/lib/api/key-exchange2.service.d.ts +187 -0
- package/lib/api/lock.gql.d.ts +27 -0
- package/lib/api/lock.service.d.ts +25 -0
- package/lib/api/lr-apollo.service.d.ts +15 -0
- package/lib/api/lr-graphql/index.d.ts +5 -0
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -0
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -0
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -0
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -0
- package/lib/api/lr-graphql/lr.service.d.ts +9 -0
- package/lib/api/message.service.d.ts +58 -0
- package/lib/api/persist.service.d.ts +31 -0
- package/lib/api/query-processor/common-processors.service.d.ts +36 -0
- package/lib/api/query-processor/index.d.ts +2 -0
- package/lib/api/query-processor/query-processor.service.d.ts +18 -0
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -0
- package/lib/api/shared-contact-card.service.d.ts +33 -0
- package/lib/api/shared-contact-card2.gql.d.ts +36 -0
- package/lib/api/shared-contact-card2.service.d.ts +45 -0
- package/lib/api/time.service.d.ts +16 -0
- package/lib/api/types/graphql.types.d.ts +29 -0
- package/lib/api/types/index.d.ts +2 -0
- package/lib/api/types/lr-graphql.types.d.ts +385 -0
- package/lib/auth/auth.config.d.ts +5 -0
- package/lib/auth/auth.gql.d.ts +15 -0
- package/lib/auth/auth.types.d.ts +66 -0
- package/lib/auth/idle.service.d.ts +40 -0
- package/lib/auth/idle.types.d.ts +10 -0
- package/lib/auth/lbop.service.d.ts +91 -0
- package/lib/auth/life-ready-auth.service.d.ts +46 -0
- package/lib/auth/password.service.d.ts +78 -0
- package/lib/auth/register.service.d.ts +25 -0
- package/lib/auth/two-factor.service.d.ts +15 -0
- package/lib/category/category-meta.service.d.ts +23 -0
- package/lib/category/category.gql.d.ts +45 -0
- package/lib/category/category.service.d.ts +67 -0
- package/lib/category/category.types.d.ts +79 -0
- package/lib/cryptography/cryptography.types.d.ts +83 -0
- package/lib/cryptography/encryption.service.d.ts +41 -0
- package/lib/cryptography/key-factory.service.d.ts +38 -0
- package/lib/cryptography/key-graph.service.d.ts +33 -0
- package/lib/cryptography/key-meta.service.d.ts +44 -0
- package/lib/cryptography/key.service.d.ts +36 -0
- package/lib/cryptography/slip39.service.d.ts +43 -0
- package/lib/cryptography/web-crypto.service.d.ts +5 -0
- package/lib/life-ready.config.d.ts +14 -0
- package/lib/life-ready.module.d.ts +5 -0
- package/lib/plan/plan.gql.d.ts +11 -0
- package/lib/plan/plan.service.d.ts +33 -0
- package/lib/plan/plan.types.d.ts +31 -0
- package/lib/record/record-attachment.service.d.ts +16 -0
- package/lib/record/record.gql.d.ts +14 -0
- package/lib/record/record.service.d.ts +25 -0
- package/lib/record/record.types.d.ts +57 -0
- package/lib/record-type/record-type.service.d.ts +11 -0
- package/lib/record-type/record-type.types.d.ts +50 -0
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -0
- package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -0
- package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -0
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -0
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -0
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -0
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -0
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -0
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -0
- package/lib/scenario/scenario-setup.service.d.ts +22 -0
- package/lib/scenario/scenario.gql.d.ts +34 -0
- package/lib/scenario/scenario.service.d.ts +58 -0
- package/lib/scenario/scenario.types.d.ts +217 -0
- package/lib/search/search.gql.d.ts +1 -0
- package/lib/search/search.service.d.ts +25 -0
- package/lib/search/search.types.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +41 -0
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -0
- package/lib/trusted-parties/tp-password-reset.service.d.ts +131 -0
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -0
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -0
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -0
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -0
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -0
- package/lib/users/profile-details.service.d.ts +21 -0
- package/lib/users/profile.gql.d.ts +11 -0
- package/lib/users/profile.service.d.ts +35 -0
- package/lib/users/profile.types.d.ts +96 -0
- package/lib/users/user.gql.d.ts +9 -0
- package/lib/users/user.service.d.ts +12 -0
- package/lib/users/user.types.d.ts +23 -0
- package/lifeready-core.d.ts +9 -0
- package/lifeready-core.metadata.json +1 -0
- package/package.json +29 -0
- package/public-api.d.ts +77 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
|
+
import { Injectable, NgZone } from '@angular/core';
|
|
3
|
+
import { EncryptionService, JoseSerialization, } from '../cryptography/encryption.service';
|
|
4
|
+
import { KeyFactoryService } from '../cryptography/key-factory.service';
|
|
5
|
+
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
6
|
+
import { KeyService } from '../cryptography/key.service';
|
|
7
|
+
import { LrCodeMismatchException } from '../_common/exceptions';
|
|
8
|
+
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
9
|
+
import { UserService } from './../users/user.service';
|
|
10
|
+
import { CancelKeyExchangeMutation, CompleteKeyExchangeOtkMutation, CurrentUserSharedKeyQuery2, DeclineKeyExchangeMutation, InitiateKeyExchangeOtkMutation, KeyExchangeQuery2, KeyExchangesQuery2, KeyExchangeTokenQuery2, RespondKeyExchangeOtkMutation, } from './key-exchange2.gql';
|
|
11
|
+
import { LrGraphQLService, LrMutation } from './lr-graphql';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "../cryptography/key-factory.service";
|
|
14
|
+
import * as i2 from "../cryptography/key.service";
|
|
15
|
+
import * as i3 from "../cryptography/encryption.service";
|
|
16
|
+
import * as i4 from "../users/user.service";
|
|
17
|
+
import * as i5 from "../cryptography/key-graph.service";
|
|
18
|
+
import * as i6 from "./lr-graphql/lr-graphql.service";
|
|
19
|
+
let KeyExchange2Service = class KeyExchange2Service {
|
|
20
|
+
constructor(ngZone, keyFactory, keyService, encryptionService, userService, keyGraph, lrGraphQL) {
|
|
21
|
+
this.ngZone = ngZone;
|
|
22
|
+
this.keyFactory = keyFactory;
|
|
23
|
+
this.keyService = keyService;
|
|
24
|
+
this.encryptionService = encryptionService;
|
|
25
|
+
this.userService = userService;
|
|
26
|
+
this.keyGraph = keyGraph;
|
|
27
|
+
this.lrGraphQL = lrGraphQL;
|
|
28
|
+
this.CLIENT_NONCE_LENGTH = 32;
|
|
29
|
+
}
|
|
30
|
+
getOtKey(keyExchange, otKeyK) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
if (otKeyK) {
|
|
33
|
+
return yield KeyFactoryService.asKey(Object.assign(Object.assign({}, JSON.parse(keyExchange.otk.otKeyParams)), { k: otKeyK }));
|
|
34
|
+
}
|
|
35
|
+
else if (keyExchange.otk.state === 'OTK_INITIATED' &&
|
|
36
|
+
!keyExchange.isInitiator &&
|
|
37
|
+
keyExchange.otk.responderPbkCipher) {
|
|
38
|
+
// Assuming existing user getting invited where OTK is wrapped in responder's public key.
|
|
39
|
+
const prk = yield this.keyService.getCurrentPxk();
|
|
40
|
+
const decryptedCipher = yield this.encryptionService.decrypt(prk.jwk, JSON.parse(keyExchange.otk.responderPbkCipher), {
|
|
41
|
+
serializations: [JoseSerialization.COMPACT],
|
|
42
|
+
});
|
|
43
|
+
if (decryptedCipher.otKey) {
|
|
44
|
+
return yield KeyFactoryService.asKey(decryptedCipher.otKey);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
decryptOtk(keyExchange, otKeyK) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
const otKey = yield this.getOtKey(keyExchange, otKeyK);
|
|
53
|
+
let otk = keyExchange.otk;
|
|
54
|
+
if (otKey && otk.otKeyCipher) {
|
|
55
|
+
otk = Object.assign(Object.assign({}, otk), { otKey, otKeyCipherClearJson: yield this.encryptionService.decrypt(otKey, keyExchange.otk.otKeyCipher) });
|
|
56
|
+
}
|
|
57
|
+
return Object.assign(Object.assign({}, keyExchange), { otk });
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
decryptResponseCipher(otKey, otPrk, content) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
// The response could be wrapped by the OtK in addition to the OtPbk
|
|
63
|
+
try {
|
|
64
|
+
content = yield this.encryptionService.decrypt(otKey, content);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error.message !== 'no key found') {
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
// Do nothing to support older versions where message is not wrapped with otk.
|
|
71
|
+
}
|
|
72
|
+
// The Prk is single-use and only used to send information from the responder back to the initiator.
|
|
73
|
+
return yield this.encryptionService.decrypt(otPrk, content);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
decryptKeyExchangeAsInitiator(keyExchange) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
79
|
+
// Decrypt using the root key to get the Prk
|
|
80
|
+
const initiatorRootKeyCipherClearJson = (yield this.encryptionService.decrypt(rootKey.jwk, keyExchange.initiatorRootKeyCipher));
|
|
81
|
+
const otKey = yield KeyFactoryService.asKey(initiatorRootKeyCipherClearJson.otKey);
|
|
82
|
+
keyExchange = Object.assign(Object.assign({}, keyExchange), { initiatorRootKeyCipherClearJson });
|
|
83
|
+
let otk = keyExchange.otk;
|
|
84
|
+
if (otk.initiatorOneTimePbkCipher) {
|
|
85
|
+
otk = Object.assign(Object.assign({}, otk), { initiatorOneTimePbkCipherClearJson: yield this.decryptResponseCipher(otKey, yield KeyFactoryService.asKey(initiatorRootKeyCipherClearJson.oneTimePrk), otk.initiatorOneTimePbkCipher) });
|
|
86
|
+
}
|
|
87
|
+
if (otk.otKeyCipher) {
|
|
88
|
+
otk.otKeyCipherClearJson = yield this.encryptionService.decrypt(otKey, otk.otKeyCipher);
|
|
89
|
+
}
|
|
90
|
+
return Object.assign(Object.assign({}, keyExchange), { otk });
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
decryptKeyExchangeAsResponder(keyExchange, otKeyK) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
return this.decryptOtk(keyExchange, otKeyK);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
decryptKeyExchange(keyExchange, otKeyK) {
|
|
99
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
if (keyExchange.isInitiator) {
|
|
101
|
+
return this.decryptKeyExchangeAsInitiator(keyExchange);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
return this.decryptKeyExchangeAsResponder(keyExchange, otKeyK);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
getKeyExchanges({ state } = {}) {
|
|
109
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
110
|
+
const { keyExchanges } = yield this.lrGraphQL.query({
|
|
111
|
+
query: KeyExchangesQuery2,
|
|
112
|
+
variables: {
|
|
113
|
+
state,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
return Promise.all(keyExchanges.edges.map((edge) => this.decryptKeyExchange(edge.node)));
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* @param id If the current user can responder the key exchange if they are either the initiator or the receiver.
|
|
121
|
+
* @param token If not signed in, or not the initiator or responder, 'token' must be given.
|
|
122
|
+
* @param otKeyK Is the raw one-time key (string). If the responder is explicitly specified at time of initiation, then
|
|
123
|
+
* it's possible to have the otKey wrapped by the public key of the responder. In which case, the otKeyK is not needed.
|
|
124
|
+
*/
|
|
125
|
+
getKeyExchange(id, { otKeyK, token } = {}) {
|
|
126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
const res = yield this.lrGraphQL.query({
|
|
128
|
+
query: token ? KeyExchangeTokenQuery2 : KeyExchangeQuery2,
|
|
129
|
+
variables: {
|
|
130
|
+
id,
|
|
131
|
+
token,
|
|
132
|
+
},
|
|
133
|
+
includeKeyGraph: !token,
|
|
134
|
+
});
|
|
135
|
+
return this.decryptKeyExchange(res.keyExchange, otKeyK);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
getCurrentUserSharedKey(input) {
|
|
139
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
140
|
+
return this.lrGraphQL.query({
|
|
141
|
+
query: CurrentUserSharedKeyQuery2,
|
|
142
|
+
variables: {
|
|
143
|
+
username: input.username,
|
|
144
|
+
userId: input.userId,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// TODO: deprecate this
|
|
150
|
+
cancelKeyExchange(id) {
|
|
151
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
152
|
+
return this.cancelKeyExchangeMutation(id);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
cancelKeyExchangeMutation(id) {
|
|
156
|
+
return new LrMutation({
|
|
157
|
+
mutation: CancelKeyExchangeMutation,
|
|
158
|
+
variables: {
|
|
159
|
+
input: {
|
|
160
|
+
id,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
// TODO: deprecate this
|
|
166
|
+
declineKeyExchange(id, token) {
|
|
167
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
168
|
+
return this.declineKeyExchangeMutation(id, token);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
declineKeyExchangeMutation(id, token) {
|
|
172
|
+
return new LrMutation({
|
|
173
|
+
mutation: DeclineKeyExchangeMutation,
|
|
174
|
+
variables: {
|
|
175
|
+
input: {
|
|
176
|
+
id,
|
|
177
|
+
token,
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
initiateOtk({ message, email, contactCard, upgrade, } = {}) {
|
|
183
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
+
const otKey = yield this.keyFactory.createKey();
|
|
185
|
+
const nonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
|
|
186
|
+
// New PKC key for encryption. This key is used only once when the responder sends
|
|
187
|
+
// back their signing public key.
|
|
188
|
+
const initiatorOneTimePrk = yield this.keyFactory.createPkcKey();
|
|
189
|
+
// Option 1: New PKC key for signing
|
|
190
|
+
// const initiatorSigPrk = await this.keyService.createPkcSignKey();
|
|
191
|
+
// Option 2: Use the user's global signing key.
|
|
192
|
+
// This key is used to prove the initiator's identity.
|
|
193
|
+
const initiatorPrk = yield this.keyService.getCurrentPxk();
|
|
194
|
+
const initiatorSigPrk = yield this.keyService.getCurrentSigPxk();
|
|
195
|
+
let initiatorPlainDataSig = null;
|
|
196
|
+
if (contactCard && contactCard.ownerPlainDataJson) {
|
|
197
|
+
initiatorPlainDataSig = yield this.encryptionService.signToString(initiatorSigPrk.jwk, contactCard.ownerPlainDataJson);
|
|
198
|
+
}
|
|
199
|
+
const initiator = {
|
|
200
|
+
message,
|
|
201
|
+
contactCard: contactCard && {
|
|
202
|
+
sharedCipherDataClearJson: contactCard.sharedCipherDataClearJson,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
// Content to be encrypted using the OTK.
|
|
206
|
+
const plainOtKeyCipher = {
|
|
207
|
+
// TODO Make sure we also put the OOB code in here as well since the OOB code is the
|
|
208
|
+
// _only_ information the KC server does not have access to. The server may have
|
|
209
|
+
// access to OTK and hence the nonce here. It's good to have both the nonce and OOB code
|
|
210
|
+
// since the user may not be using the OOB code. And it's simple to always include
|
|
211
|
+
// the nonce, so why not.
|
|
212
|
+
nonce,
|
|
213
|
+
initiator: Object.assign(Object.assign({}, initiator), { oneTimePbk: initiatorOneTimePrk.toJSON(), pbk: initiatorPrk.jwk.toJSON(), sigPbk: initiatorSigPrk.jwk.toJSON() }),
|
|
214
|
+
};
|
|
215
|
+
const otKeyCipher = yield this.keyGraph.encryptToString(otKey, plainOtKeyCipher);
|
|
216
|
+
// Content to be encrypted using the initiator's root key.
|
|
217
|
+
const initiatorRootKeyCipherClearJson = {
|
|
218
|
+
nonce,
|
|
219
|
+
oneTimePrk: initiatorOneTimePrk.toJSON(true),
|
|
220
|
+
// Should not need to keep this encrypted since we are using the global signing key.
|
|
221
|
+
// sigPrk: initiatorSigPrk.toJSON(true),
|
|
222
|
+
// Save it in case the initiator want to decode the otKeyCipher.
|
|
223
|
+
// Since the otKey is only used once, and that otKeyCipher contains only
|
|
224
|
+
// the public key of the initiator, it's safe just leave the otKey stored here.
|
|
225
|
+
otKey: otKey.toJSON(true),
|
|
226
|
+
// These should be storing information such as how the fields of the shared contact card is
|
|
227
|
+
// derived from the master contact card.
|
|
228
|
+
initiatorContactCard: contactCard,
|
|
229
|
+
initiator,
|
|
230
|
+
};
|
|
231
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
232
|
+
const initiatorRootKeyCipher = yield this.keyGraph.encryptToString(rootKey.jwk, initiatorRootKeyCipherClearJson);
|
|
233
|
+
// The raw OTK
|
|
234
|
+
const otKeyK = otKey.toJSON(true).k;
|
|
235
|
+
// API call
|
|
236
|
+
const lrMutation = new LrMutation({
|
|
237
|
+
mutation: InitiateKeyExchangeOtkMutation,
|
|
238
|
+
variables: {
|
|
239
|
+
input: {
|
|
240
|
+
// These will be stored on the server
|
|
241
|
+
initiatorRootKeyCipher,
|
|
242
|
+
initiatorPxkId: initiatorPrk.id,
|
|
243
|
+
initiatorSigPxkId: initiatorSigPrk.id,
|
|
244
|
+
// These will be sent to the responder
|
|
245
|
+
otKeyParams: JSON.stringify(otKey.toJSON()),
|
|
246
|
+
otKeyCipher,
|
|
247
|
+
sendEmail: email && {
|
|
248
|
+
email,
|
|
249
|
+
rawOtKey: otKeyK,
|
|
250
|
+
},
|
|
251
|
+
createTp: true,
|
|
252
|
+
initiatorPlainDataSig,
|
|
253
|
+
upgrade,
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
return { lrMutation, otKeyK };
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
respondOtk({ keyExchangeId, token, decryptedOtk, message, initiatorContactCard, responderContactCard, }) {
|
|
261
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
262
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
263
|
+
const masterKeyId = this.keyService.getCurrentMasterKey().id;
|
|
264
|
+
const masterKey = yield this.keyService.getCurrentMasterKey();
|
|
265
|
+
const sharedKey = yield this.keyFactory.createKey();
|
|
266
|
+
const mkSharedKey = yield this.keyFactory.createKey();
|
|
267
|
+
const rkWrappedSharedKey = yield this.encryptionService.encrypt(rootKey.jwk, sharedKey.toJSON(true));
|
|
268
|
+
const mkWrappedMkSharedKey = yield this.encryptionService.encrypt(masterKey.jwk, mkSharedKey.toJSON(true));
|
|
269
|
+
const initiatorOneTimePbk = yield KeyFactoryService.asKey(decryptedOtk.otKeyCipherClearJson.initiator.oneTimePbk);
|
|
270
|
+
const initiatorPbk = yield KeyFactoryService.asKey(decryptedOtk.otKeyCipherClearJson.initiator.pbk);
|
|
271
|
+
const initiatorSigPbk = yield KeyFactoryService.asKey(decryptedOtk.otKeyCipherClearJson.initiator.sigPbk);
|
|
272
|
+
// Option 1: Using new Prk for each TP pair
|
|
273
|
+
// Create a new public signing key for the responder.
|
|
274
|
+
// const responderSigPrk = await this.keyService.createPkcSignKey()
|
|
275
|
+
// const rkWrappedResponderSigPrk = await this.encrypt(rootKey, responderSigPrk.toJSON(true));
|
|
276
|
+
// Option 2: Responder already has a signing Prk
|
|
277
|
+
const responderPrk = yield this.keyService.getCurrentPxk();
|
|
278
|
+
const responderSigPrk = yield this.keyService.getCurrentSigPxk();
|
|
279
|
+
const signedInitiatorPbk = yield this.encryptionService.sign(responderSigPrk.jwk, initiatorPbk.toJSON());
|
|
280
|
+
const signedInitiatorSigPbk = yield this.encryptionService.sign(responderSigPrk.jwk, initiatorSigPbk.toJSON());
|
|
281
|
+
const initiatorOneTimePbkCipherClearJson = {
|
|
282
|
+
nonce: decryptedOtk.otKeyCipherClearJson.nonce,
|
|
283
|
+
sharedKey: sharedKey.toJSON(true),
|
|
284
|
+
mkSharedKey: mkSharedKey.toJSON(true),
|
|
285
|
+
responder: {
|
|
286
|
+
pbk: responderPrk.jwk.toJSON(),
|
|
287
|
+
sigPbk: responderSigPrk.jwk.toJSON(),
|
|
288
|
+
message,
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
let receivedCardInput;
|
|
292
|
+
if (decryptedOtk.otKeyCipherClearJson.initiator.contactCard) {
|
|
293
|
+
// Set the info about the initiator to be the ones sent by the initiator. We need th responder to do the encryption here
|
|
294
|
+
// because the initiator does not have the shared key yet, and we want the responder to have a functional contact card after
|
|
295
|
+
// this exchange. The initiator can double check the contact details are correct and sign it when it completes the exchange.
|
|
296
|
+
const sharedCipherDataClearJson = decryptedOtk.otKeyCipherClearJson.initiator.contactCard
|
|
297
|
+
.sharedCipherDataClearJson;
|
|
298
|
+
// Create keys
|
|
299
|
+
const receiverKey = yield this.keyFactory.createKey();
|
|
300
|
+
const ccSharedKey = yield this.keyFactory.createKey();
|
|
301
|
+
const sigPxk = yield this.keyService.getCurrentSigPxk();
|
|
302
|
+
receivedCardInput = {
|
|
303
|
+
receiverWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, receiverKey.toJSON(true))),
|
|
304
|
+
receiverWrappingKeyId: rootKey.id,
|
|
305
|
+
receiverCipherData: initiatorContactCard
|
|
306
|
+
? JSON.stringify(yield this.encryptionService.encrypt(receiverKey, initiatorContactCard.receiverCipherDataClearJson))
|
|
307
|
+
: '',
|
|
308
|
+
sharedWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(sharedKey, ccSharedKey.toJSON(true))),
|
|
309
|
+
};
|
|
310
|
+
const sharedCipherData = yield this.encryptionService.encrypt(ccSharedKey, sharedCipherDataClearJson);
|
|
311
|
+
receivedCardInput.sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
|
|
312
|
+
receivedCardInput.sigPxkId = sigPxk.id;
|
|
313
|
+
initiatorOneTimePbkCipherClearJson.responder.contactCard = Object.assign(Object.assign({}, initiatorOneTimePbkCipherClearJson.responder.contactCard), { sharedCipherKey: ccSharedKey.toJSON(true) });
|
|
314
|
+
}
|
|
315
|
+
let responderCardInput;
|
|
316
|
+
if (responderContactCard) {
|
|
317
|
+
// Create keys
|
|
318
|
+
const ownerKey = yield this.keyFactory.createKey();
|
|
319
|
+
const ccSharedKey = yield this.keyFactory.createKey();
|
|
320
|
+
const sigPxk = yield this.keyService.getCurrentSigPxk();
|
|
321
|
+
responderCardInput = {
|
|
322
|
+
ownerWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, ownerKey.toJSON(true))),
|
|
323
|
+
ownerWrappingKeyId: rootKey.id,
|
|
324
|
+
ownerCipherData: responderContactCard.ownerCipherDataClearJson
|
|
325
|
+
? JSON.stringify(yield this.encryptionService.encrypt(ownerKey, responderContactCard.ownerCipherDataClearJson))
|
|
326
|
+
: '',
|
|
327
|
+
sharedWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(sharedKey, ccSharedKey.toJSON(true))),
|
|
328
|
+
};
|
|
329
|
+
const sharedCipherData = yield this.encryptionService.encrypt(ccSharedKey, responderContactCard.sharedCipherDataClearJson);
|
|
330
|
+
responderCardInput.sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
|
|
331
|
+
responderCardInput.sigPxkId = sigPxk.id;
|
|
332
|
+
if (responderContactCard.ownerPlainDataJson) {
|
|
333
|
+
responderCardInput.ownerPlainDataSig = JSON.stringify(yield this.encryptionService.sign(responderSigPrk.jwk, responderContactCard.ownerPlainDataJson));
|
|
334
|
+
}
|
|
335
|
+
// Contact card info readable by the initiator
|
|
336
|
+
initiatorOneTimePbkCipherClearJson.responder.contactCard = Object.assign(Object.assign({}, initiatorOneTimePbkCipherClearJson.responder.contactCard), { sharedCipherDataClearJson: responderContactCard.sharedCipherDataClearJson });
|
|
337
|
+
}
|
|
338
|
+
// Encrypt with one-time public key
|
|
339
|
+
let initiatorOneTimePbkCipher = yield this.encryptionService.encrypt(initiatorOneTimePbk, initiatorOneTimePbkCipherClearJson);
|
|
340
|
+
// Encrypt with the otk again to keep use of asymmetric keys to a minimum.
|
|
341
|
+
initiatorOneTimePbkCipher = yield this.encryptionService.encrypt(decryptedOtk.otKey, initiatorOneTimePbkCipher);
|
|
342
|
+
return new LrMutation({
|
|
343
|
+
mutation: RespondKeyExchangeOtkMutation,
|
|
344
|
+
variables: {
|
|
345
|
+
input: {
|
|
346
|
+
keyExchangeId,
|
|
347
|
+
keyExchangeToken: token,
|
|
348
|
+
rootKeyId: rootKey.id,
|
|
349
|
+
masterKeyId,
|
|
350
|
+
// These will be stored on the server
|
|
351
|
+
responderPxkId: responderPrk.id,
|
|
352
|
+
responderSigPxkId: responderSigPrk.id,
|
|
353
|
+
signedInitiatorPbk: JSON.stringify(signedInitiatorPbk),
|
|
354
|
+
signedInitiatorSigPbk: JSON.stringify(signedInitiatorSigPbk),
|
|
355
|
+
// rkWrappedInitiatorSigPbk: JSON.stringify(rkWrappedInitiatorSigPbk),
|
|
356
|
+
// Option 1: Using new Prk for each TP pair
|
|
357
|
+
// rkWrappedResponderSigPrk: JSON.stringify(rkWrappedResponderSigPrk),
|
|
358
|
+
rkWrappedSharedKey: JSON.stringify(rkWrappedSharedKey),
|
|
359
|
+
mkWrappedMkSharedKey: JSON.stringify(mkWrappedMkSharedKey),
|
|
360
|
+
// These will be sent to the initiator
|
|
361
|
+
initiatorOneTimePbkCipher: JSON.stringify(initiatorOneTimePbkCipher),
|
|
362
|
+
initiatorContactCard: receivedCardInput,
|
|
363
|
+
responderContactCard: responderCardInput,
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
completeOtk({ keyExchangeId, initiatorRootKeyCipher, initiatorOneTimePbkCipher, responderContactCard, initiatorContactCard, }) {
|
|
370
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
371
|
+
const rootKey = yield this.keyService.getCurrentRootKey();
|
|
372
|
+
const masterKey = yield this.keyService.getCurrentMasterKey();
|
|
373
|
+
// Decrypt using the root key to get the Prk
|
|
374
|
+
const initiatorRootKeyCipherClearJson = (yield this.encryptionService.decrypt(rootKey.jwk, initiatorRootKeyCipher));
|
|
375
|
+
// The Prk is single-use and only used to send information from the responder back to the initiator.
|
|
376
|
+
const plainInitiatorOneTimePbkCipher = yield this.decryptResponseCipher(yield KeyFactoryService.asKey(initiatorRootKeyCipherClearJson.otKey), yield KeyFactoryService.asKey(initiatorRootKeyCipherClearJson.oneTimePrk), initiatorOneTimePbkCipher);
|
|
377
|
+
// Check the nonce match to ensure the responder was the one holding the OTK
|
|
378
|
+
if (initiatorRootKeyCipherClearJson.nonce !==
|
|
379
|
+
plainInitiatorOneTimePbkCipher.nonce) {
|
|
380
|
+
throw new LrCodeMismatchException('The nonce returned by responder does not match with the one created by the initiator.');
|
|
381
|
+
}
|
|
382
|
+
// Option 1: Assuming the signing key is unique between users.
|
|
383
|
+
// const initiatorSigPrk = await KFS.asKey(ke.plainInitiatorRootKeyCipher.sigPrk);
|
|
384
|
+
// const rkWrappedInitiatorSigPrk = await this.encrypt(rootKey, initiatorSigPrk.toJSON(true));
|
|
385
|
+
// Option 2: Use the user's global signing key.
|
|
386
|
+
// In this case the initiatorSigPrk is already a part of the key graph.
|
|
387
|
+
// So there's nothing to do here.
|
|
388
|
+
// Protected the signing public key of the responder.
|
|
389
|
+
const initiatorSigPrk = yield this.keyService.getCurrentSigPxk();
|
|
390
|
+
const responderSigPbk = yield KeyFactoryService.asKey(plainInitiatorOneTimePbkCipher.responder.sigPbk);
|
|
391
|
+
const responderPbk = yield KeyFactoryService.asKey(plainInitiatorOneTimePbkCipher.responder.pbk);
|
|
392
|
+
const signedResponderPbk = yield this.encryptionService.sign(initiatorSigPrk.jwk, responderPbk.toJSON());
|
|
393
|
+
const signedResponderSigPbk = yield this.encryptionService.sign(initiatorSigPrk.jwk, responderSigPbk.toJSON());
|
|
394
|
+
const sharedKey = yield KeyFactoryService.asKey(plainInitiatorOneTimePbkCipher.sharedKey);
|
|
395
|
+
const rkWrappedSharedKey = yield this.encryptionService.encrypt(rootKey.jwk, sharedKey.toJSON(true));
|
|
396
|
+
const mkSharedKey = yield KeyFactoryService.asKey(plainInitiatorOneTimePbkCipher.mkSharedKey);
|
|
397
|
+
const mkWrappedMkSharedKey = yield this.encryptionService.encrypt(masterKey.jwk, mkSharedKey.toJSON(true));
|
|
398
|
+
let responderContactCardCipherInput;
|
|
399
|
+
if (responderContactCard) {
|
|
400
|
+
// Create key
|
|
401
|
+
const receiverKey = yield this.keyFactory.createKey();
|
|
402
|
+
responderContactCardCipherInput = {
|
|
403
|
+
receiverWrappedKey: JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, receiverKey.toJSON(true))),
|
|
404
|
+
receiverWrappingKeyId: rootKey.id,
|
|
405
|
+
receiverCipherData: JSON.stringify(yield this.encryptionService.encrypt(receiverKey, responderContactCard.receiverCipherDataClearJson)),
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
// Get the data needed from the initiator's cipher data.
|
|
409
|
+
let initiatorContactCardCipherInput;
|
|
410
|
+
let initiatorContactCardSharedCipherInput;
|
|
411
|
+
if (initiatorRootKeyCipherClearJson.initiatorContactCard) {
|
|
412
|
+
// The initiatorContactCard created during the creation of the invite and encrypted using the initiator's
|
|
413
|
+
// root key
|
|
414
|
+
const initiatorContactCardFromInit = initiatorRootKeyCipherClearJson.initiatorContactCard;
|
|
415
|
+
const ownerKey = yield this.keyFactory.createKey();
|
|
416
|
+
const sharedCipherKey = yield KeyFactoryService.asKey(plainInitiatorOneTimePbkCipher.responder.contactCard.sharedCipherKey);
|
|
417
|
+
const ownerWrappedKey = JSON.stringify(yield this.encryptionService.encrypt(rootKey.jwk, ownerKey.toJSON(true)));
|
|
418
|
+
// Allow the initiatorContactCard parameter to override
|
|
419
|
+
const ownerCipherDataClearJson = (initiatorContactCard === null || initiatorContactCard === void 0 ? void 0 : initiatorContactCard.ownerCipherDataClearJson) ||
|
|
420
|
+
initiatorContactCardFromInit.ownerCipherDataClearJson;
|
|
421
|
+
const ownerCipherData = ownerCipherDataClearJson
|
|
422
|
+
? yield this.keyGraph.encryptToString(ownerKey, ownerCipherDataClearJson)
|
|
423
|
+
: '';
|
|
424
|
+
initiatorContactCardCipherInput = {
|
|
425
|
+
ownerWrappedKey,
|
|
426
|
+
ownerWrappingKeyId: rootKey.id,
|
|
427
|
+
ownerCipherData,
|
|
428
|
+
};
|
|
429
|
+
initiatorContactCardSharedCipherInput = {
|
|
430
|
+
sigPxkId: initiatorSigPrk.id,
|
|
431
|
+
};
|
|
432
|
+
const sharedCipherData = yield this.encryptionService.encrypt(sharedCipherKey, initiatorContactCardFromInit.sharedCipherDataClearJson);
|
|
433
|
+
initiatorContactCardSharedCipherInput.sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(initiatorSigPrk.jwk, sharedCipherData));
|
|
434
|
+
}
|
|
435
|
+
// TODO ideally we update the shared data in the contact card sent to the responder as well since that
|
|
436
|
+
// CC was created by the responder.
|
|
437
|
+
return new LrMutation({
|
|
438
|
+
mutation: CompleteKeyExchangeOtkMutation,
|
|
439
|
+
variables: {
|
|
440
|
+
input: {
|
|
441
|
+
keyExchangeId,
|
|
442
|
+
rootKeyId: rootKey.id,
|
|
443
|
+
masterKeyId: masterKey.id,
|
|
444
|
+
initiatorSigPxkId: initiatorSigPrk.id,
|
|
445
|
+
signedResponderPbk: JSON.stringify(signedResponderPbk),
|
|
446
|
+
signedResponderSigPbk: JSON.stringify(signedResponderSigPbk),
|
|
447
|
+
rkWrappedSharedKey: JSON.stringify(rkWrappedSharedKey),
|
|
448
|
+
mkWrappedMkSharedKey: JSON.stringify(mkWrappedMkSharedKey),
|
|
449
|
+
responderContactCardCipher: responderContactCardCipherInput,
|
|
450
|
+
initiatorContactCardCipher: initiatorContactCardCipherInput,
|
|
451
|
+
initiatorContactCardSharedCipher: initiatorContactCardSharedCipherInput,
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
};
|
|
458
|
+
KeyExchange2Service.ɵprov = i0.ɵɵdefineInjectable({ factory: function KeyExchange2Service_Factory() { return new KeyExchange2Service(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.KeyFactoryService), i0.ɵɵinject(i2.KeyService), i0.ɵɵinject(i3.EncryptionService), i0.ɵɵinject(i4.UserService), i0.ɵɵinject(i5.KeyGraphService), i0.ɵɵinject(i6.LrGraphQLService)); }, token: KeyExchange2Service, providedIn: "root" });
|
|
459
|
+
KeyExchange2Service.decorators = [
|
|
460
|
+
{ type: Injectable, args: [{
|
|
461
|
+
providedIn: 'root',
|
|
462
|
+
},] }
|
|
463
|
+
];
|
|
464
|
+
KeyExchange2Service.ctorParameters = () => [
|
|
465
|
+
{ type: NgZone },
|
|
466
|
+
{ type: KeyFactoryService },
|
|
467
|
+
{ type: KeyService },
|
|
468
|
+
{ type: EncryptionService },
|
|
469
|
+
{ type: UserService },
|
|
470
|
+
{ type: KeyGraphService },
|
|
471
|
+
{ type: LrGraphQLService }
|
|
472
|
+
];
|
|
473
|
+
KeyExchange2Service = __decorate([
|
|
474
|
+
RunOutsideAngular({
|
|
475
|
+
ngZoneName: 'ngZone',
|
|
476
|
+
})
|
|
477
|
+
], KeyExchange2Service);
|
|
478
|
+
export { KeyExchange2Service };
|
|
479
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWV4Y2hhbmdlMi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL3Rlc3QvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYXBpL2tleS1leGNoYW5nZTIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsR0FDbEIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV0RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDhCQUE4QixFQUM5QiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDhCQUE4QixFQUU5QixpQkFBaUIsRUFDakIsa0JBQWtCLEVBRWxCLHNCQUFzQixFQUN0Qiw2QkFBNkIsR0FDOUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7OztJQTZIL0MsbUJBQW1CLFNBQW5CLG1CQUFtQjtJQUc5QixZQUNVLE1BQWMsRUFDZCxVQUE2QixFQUM3QixVQUFzQixFQUN0QixpQkFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsUUFBeUIsRUFDekIsU0FBMkI7UUFOM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVB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QUNqQixVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDO0dBSVcsbUJBQW1CLENBbXRCL0I7U0FudEJZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xyXG5pbXBvcnQge1xyXG4gIEVuY3J5cHRpb25TZXJ2aWNlLFxyXG4gIEpvc2VTZXJpYWxpemF0aW9uLFxyXG59IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9lbmNyeXB0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXktZmFjdG9yeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1ncmFwaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXkuc2VydmljZSc7XHJcbmltcG9ydCB7IExyQ29kZU1pc21hdGNoRXhjZXB0aW9uIH0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcclxuaW1wb3J0IHsgUnVuT3V0c2lkZUFuZ3VsYXIgfSBmcm9tICcuLi9fY29tbW9uL3J1bi1vdXRzaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4vLi4vdXNlcnMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3duZXJQbGFpbkRhdGFKc29uIH0gZnJvbSAnLi9jb250YWN0LWNhcmQyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENhbmNlbEtleUV4Y2hhbmdlTXV0YXRpb24sXHJcbiAgQ29tcGxldGVLZXlFeGNoYW5nZU90a011dGF0aW9uLFxyXG4gIEN1cnJlbnRVc2VyU2hhcmVkS2V5UXVlcnkyLFxyXG4gIERlY2xpbmVLZXlFeGNoYW5nZU11dGF0aW9uLFxyXG4gIEluaXRpYXRlS2V5RXhjaGFuZ2VPdGtNdXRhdGlvbixcclxuICBLZXlFeGNoYW5nZUZyYWdtZW50LFxyXG4gIEtleUV4Y2hhbmdlUXVlcnkyLFxyXG4gIEtleUV4Y2hhbmdlc1F1ZXJ5MixcclxuICBLZXlFeGNoYW5nZVN0YXRlMixcclxuICBLZXlFeGNoYW5nZVRva2VuUXVlcnkyLFxyXG4gIFJlc3BvbmRLZXlFeGNoYW5nZU90a011dGF0aW9uLFxyXG59IGZyb20gJy4va2V5LWV4Y2hhbmdlMi5ncWwnO1xyXG5pbXBvcnQgeyBMckdyYXBoUUxTZXJ2aWNlLCBMck11dGF0aW9uIH0gZnJvbSAnLi9sci1ncmFwaHFsJztcclxuaW1wb3J0IHsgQ29udGFjdENhcmRTaGFyZWRDaXBoZXJEYXRhLCBPdEtleUNpcGhlckNsZWFySnNvbjIgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVjcnlwdGVkIGNvbnRlbnQgb2YgdGhlIG9uZS10aW1lIGtleSBjaXBoZXI7XHJcbiAqIFdoZW4gdXNlciBzdXBwbGllcyB0aGlzIGluZm9ybWF0aW9uIHRoZSBsaWIgZG9lc24ndCBuZWVkIHRvIGRvIGFub3RoZXIgQVBJIGNhbGxcclxuICogdG8gZmV0Y2ggdGhlIGtleSBleGNoYW5nZSBub2RlLiBBbmQgc2luY2UgdGhlIHR5cGljYWwgdXNlIGNhc2UgaXMgdG8gZGlzcGxheVxyXG4gKiBzb21lIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyLCB0aGUga2V5IGV4Y2hhbmdlIG5vZGUgd291bGQgYWxyZWFkeSBoYXZlIGJlZW5cclxuICogZmV0Y2hlZCBhbmQgZGVjcnlwdGVkLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEZWNyeXB0ZWRPdGsyIHtcclxuICBvdEtleUNpcGhlckNsZWFySnNvbjogT3RLZXlDaXBoZXJDbGVhckpzb24yO1xyXG4gIG90S2V5OiBKV0suS2V5OyAvLyBUaGUgb25lLXRpbWUga2V5XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFjdENhcmRSZWNlaXZlckNpcGhlckRhdGEge1xyXG4gIC8vIFRoZSByZWNlaXZlciBvZiB0aGUgY29udGFjdCBjYXJkIGtlZXBzIGEgY29weVxyXG4gIC8vIG9mIHRoZSBvd25lcidzIGNvbnRhY3QgY2FyZCBpbmZvcm1hdGlvbiwgZW5jcnlwdGVkIHVzaW5nIHRoZSByZWNlaXZlcidzIGtleXMuIFNvIHRoYXQgd2hlblxyXG4gIC8vIHRoZSBvd25lciBkZWNpZGVzIHRvIHVwZGF0ZSB0aGVpciBzaGFyZWQgY29udGFjdCBjYXJkIGF0IGEgbGF0ZXIgZGF0ZSwgdGhlIHJlY2VpdmVyIGNhblxyXG4gIC8vIGNvbXBhcmUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgY29udGFjdCBjYXJkIHNlbnQgZHVyaW5nIGtleSBleGNoYW5nZS4gVGhpcyB3YXksIHRoZSBvd25lclxyXG4gIC8vIGNhbid0IHVuaWxhdGVyYWxseSB1cGRhdGUgdGhlaXIgc2hhcmVkIGNvbnRhY3QgY2FyZCB3aXRob3V0IHRoZSByZWNlaXZlciBrbm93aW5nIGFib3V0IGl0LlxyXG4gIHJlY2VpdmVyQ2lwaGVyRGF0YUNsZWFySnNvbjogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhY3RDYXJkT3duZXJQbGFpbkRhdGEge1xyXG4gIC8vIEFjY2Vzc2libGUgYnkgdGhlIHNlcnZlciBhbmQgdGhlIG93bmVyLiBTZXJ2ZXIgc2lkZSBub3RpZmljYXRpb24gZW1haWxzIG5lZWQgdG8ga25vdyBzb21lXHJcbiAgLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIG93bmVyLlxyXG4gIC8vIFRoZSBvd25lciBjb3VsZCBlaXRoZXIgYmUgdGhlIGluaXRpYXRvciBvciB0aGUgcmVzcG9uZGVyLlxyXG4gIG93bmVyUGxhaW5EYXRhSnNvbjogT3duZXJQbGFpbkRhdGFKc29uO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhY3RDYXJkT3duZXJDaXBoZXJEYXRhIHtcclxuICAvLyBPd25lciBvbmx5IGFjY2VzcyB0byB0aGlzIGRhdGFcclxuICBvd25lckNpcGhlckRhdGFDbGVhckpzb246IGFueTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNlbmRpbmcgY29udGFjdCBjYXJkIGluZm9ybWF0aW9uIGZyb20gdGhlIG93bmVyIHRvIHRoZSByZWNlaXZlci5cclxuICovXHJcbmV4cG9ydCB0eXBlIFNlbmRDb250YWN0Q2FyZElucHV0ID0gQ29udGFjdENhcmRPd25lclBsYWluRGF0YSAmXHJcbiAgQ29udGFjdENhcmRPd25lckNpcGhlckRhdGEgJlxyXG4gIENvbnRhY3RDYXJkU2hhcmVkQ2lwaGVyRGF0YTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhdGVPdGtJbnB1dDIge1xyXG4gIC8vIE5vdGUgdGhhdCBpZiBuZWl0aGVyIGVtYWlsIG5vciByZXNwb25kZXJVc2VybmFtZSBhcmUgZ2l2ZW4sIHRoZSBvbmUtdGltZSBrZXlcclxuICAvLyBjYW4gc3RpbGwgYmUgc2VudCB0byB0aGUgcmVzcG9uZGVyIHZpYSBPT0JcclxuICBlbWFpbD86IHN0cmluZztcclxuICBtZXNzYWdlPzogYW55O1xyXG4gIGNvbnRhY3RDYXJkPzogU2VuZENvbnRhY3RDYXJkSW5wdXQ7XHJcbiAgLy8gSWYgVHJ1ZSwgdG8gdXBncmFkZSBhbiBlbWFpbCBpbnZpdGUgdG8gYW4gZXhpc3RpbmcgdXNlciBpbnZpdGUgaWYgdGhlIGVtYWlsXHJcbiAgLy8gaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgdXNlci5cclxuICB1cGdyYWRlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXNwb25kT3RrSW5wdXQyIHtcclxuICBrZXlFeGNoYW5nZUlkOiBzdHJpbmc7XHJcbiAgdG9rZW46IHN0cmluZztcclxuICBkZWNyeXB0ZWRPdGs6IERlY3J5cHRlZE90azI7XHJcbiAgbWVzc2FnZT86IGFueTtcclxuICAvLyBUaGUgaW5pdGlhdG9yIGlzIHRoZSBvd25lciBmbyB0aGUgaW5pdGlhdG9yQ29udGFjdENhcmQsIHRoZSByZXNwb25kZXJcclxuICAvLyBpcyB0aGUgcmVjZWl2ZXIuXHJcbiAgaW5pdGlhdG9yQ29udGFjdENhcmQ/OiBDb250YWN0Q2FyZFJlY2VpdmVyQ2lwaGVyRGF0YTtcclxuICByZXNwb25kZXJDb250YWN0Q2FyZD86IFNlbmRDb250YWN0Q2FyZElucHV0O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRlT3RrSW5wdXQyIHtcclxuICBrZXlFeGNoYW5nZUlkOiBzdHJpbmc7XHJcbiAgLy8gVGhpcyBpcyBhIHBhcnQgb2YgdGhlIGtleSBleGNoYW5nZSBkYXRhLiBJdCdzIGVuY3J5cHRlZCB1c2luZyB0aGUgcm9vdCBrZXlcclxuICBpbml0aWF0b3JSb290S2V5Q2lwaGVyOiBzdHJpbmc7XHJcbiAgLy8gVGhpcyBpcyBhIHBhcnQgb2YgdGhlIGtleSBleGNoYW5nZSBkYXRhLiBJdCdzIGVuY3J5cHRlZCB1c2luZyB0aGUgb25lLXRpbWUga2V5LlxyXG4gIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXI6IHN0cmluZztcclxuICAvLyBUaGUgcmVzcG9uZGVyIGlzIHRoZSBvd25lciBmbyB0aGUgcmVzcG9uZGVyQ29udGFjdENhcmQsIHRoZSBpbml0aWF0b3JcclxuICAvLyBpcyB0aGUgcmVjZWl2ZXIuXHJcbiAgcmVzcG9uZGVyQ29udGFjdENhcmQ/OiBDb250YWN0Q2FyZFJlY2VpdmVyQ2lwaGVyRGF0YTtcclxuICAvLyBUaGUgaW5pdGlhdG9yIGNhbiB1cGRhdGUgdGhlIGNpcGhlciBkYXRhIHRoYXQgYXJlIG9ubHkgdmlzaWJsZSB0byB0aGVtLiBJdCBtYWtlc1xyXG4gIC8vIGxlc3Mgc2Vuc2UgdG8gdXBkYXRlIHRoZSBzaGFyZWQgZGF0YSBiZWNhdXNlIHRoZSByZXNwb25kZXIgd291bGQgaGF2ZSBhbHJlYWR5IHNlZW5cclxuICAvLyB0aGUgc2hhcmVkIGRhdGEgYW5kIGFjY2VwdGVkIHRoYXQgaXQncyBsZWdpdC5cclxuICAvLyBCdXQgaW4gYW55IGNhc2UsIHRoZSBpbml0aWF0b3IgY2FuIHVwZGF0ZSB0aGUgc2hhcmVkIGNvbnRhY3QgY2FyZCBpbmZvIGF0IGFueSB0aW1lLlxyXG4gIGluaXRpYXRvckNvbnRhY3RDYXJkPzogQ29udGFjdENhcmRPd25lckNpcGhlckRhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhdG9yUm9vdEtleUNpcGhlckNsZWFySnNvbjIge1xyXG4gIG5vbmNlOiBzdHJpbmc7XHJcbiAgb25lVGltZVByazogb2JqZWN0OyAvLyBvbmUtdGltZSBwdWJsaWMgZW5jcnlwdGlvbiBrZXkgcmVzcG9uZGVyIHVzZSB0byBzZW5kIGRhdGEgYmFjayB0byBpbml0aWF0b3JcclxuICBvdEtleTogb2JqZWN0OyAvLyBvbmUtdGltZSBzeW1tZXRyaWMga2V5IHRoYXQgbmVlZHMgdG8gYmUgc2hhcmVkIE9PQlxyXG4gIGluaXRpYXRvckNvbnRhY3RDYXJkPzogQ29udGFjdENhcmRPd25lckNpcGhlckRhdGEgJlxyXG4gICAgQ29udGFjdENhcmRTaGFyZWRDaXBoZXJEYXRhO1xyXG4gIGluaXRpYXRvcjoge1xyXG4gICAgbWVzc2FnZT86IGFueTtcclxuICAgIGNvbnRhY3RDYXJkPzogQ29udGFjdENhcmRTaGFyZWRDaXBoZXJEYXRhO1xyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhdG9yT25lVGltZVBia0NpcGhlckNsZWFySnNvbiB7XHJcbiAgbm9uY2U6IHN0cmluZztcclxuICBzaGFyZWRLZXk6IG9iamVjdDtcclxuICBta1NoYXJlZEtleTogb2JqZWN0O1xyXG4gIHJlc3BvbmRlcjoge1xyXG4gICAgcGJrOiBvYmplY3Q7XHJcbiAgICBzaWdQYms6IG9iamVjdDtcclxuICAgIG1lc3NhZ2U/OiBhbnk7XHJcbiAgICBjb250YWN0Q2FyZD86IENvbnRhY3RDYXJkU2hhcmVkQ2lwaGVyRGF0YSAmIHtcclxuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgX25vdF8gdGhlIHNhbWUga2V5IGFzIHRoZSBzaGFyZWRLZXkuIFRoZSBzaGFyZWRLZXkgd3JhcHNcclxuICAgICAgLy8gdGhpcyBrZXkgaW4gdGhlIGtleSBncmFwaC4gQnV0IGJlY2F1c2UgdGhpcyBrZXkgaGFzIG5vdCBiZWVuIGVudGVyZWQgaW50b1xyXG4gICAgICAvLyB0aGUga2V5IGdyYXBoIHdoZW4gdGhlIHJlc3BvbmRlciBjYWxscyB0aGUgQVBJLCB3ZSBwYXNzIHRoZSBKV0sgZGlyZWN0bHkgaGVyZS5cclxuICAgICAgc2hhcmVkQ2lwaGVyS2V5OiBvYmplY3Q7XHJcbiAgICB9O1xyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0S2V5RXhjaGFuZ2VPcHRpb25zMiB7XHJcbiAgLy8gVGhlIG90S2V5IGFzIGEgcmF3IHN0cmluZy4gaS5lLiBrZXkudG9KU09OKHRydWUpLmtcclxuICBvdEtleUs/OiBzdHJpbmc7XHJcbiAgLy8gVXNlciBuZWVkIHRoZSB0b2tlbiBpZiB0aGV5IGhhdmUgbm90IHJlc3BvbmRlZCB0byB0aGUga2V5IGV4Y2hhbmdlIHlldC5cclxuICAvLyBPbmNlIHRoZXkndmUgcmVzcG9uZGVkIChoZW5jZSBwcm92ZW4gdGhleSBoYXZlIHRoZSBPT0IgS2V5KSB0aGV5IGJlY29tZVxyXG4gIC8vIHRoZSBcInJlc3BvbmRlclwiIG9mIHRoaXMgZXhjaGFuZ2UsIGFuZCBjYW4gYWNjZXNzIGl0IHdoZW4gc2lnbmVkIGluLlxyXG4gIHRva2VuPzogc3RyaW5nO1xyXG59XHJcblxyXG5AUnVuT3V0c2lkZUFuZ3VsYXIoe1xyXG4gIG5nWm9uZU5hbWU6ICduZ1pvbmUnLFxyXG59KVxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgS2V5RXhjaGFuZ2UyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBDTElFTlRfTk9OQ0VfTEVOR1RIID0gMzI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIHByaXZhdGUga2V5RmFjdG9yeTogS2V5RmFjdG9yeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBrZXlHcmFwaDogS2V5R3JhcGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsckdyYXBoUUw6IExyR3JhcGhRTFNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3RLZXkoXHJcbiAgICBrZXlFeGNoYW5nZTogS2V5RXhjaGFuZ2VGcmFnbWVudCxcclxuICAgIG90S2V5Sz86IHN0cmluZ1xyXG4gICk6IFByb21pc2U8SldLLktleT4ge1xyXG4gICAgaWYgKG90S2V5Sykge1xyXG4gICAgICByZXR1cm4gYXdhaXQgS2V5RmFjdG9yeVNlcnZpY2UuYXNLZXkoe1xyXG4gICAgICAgIC4uLkpTT04ucGFyc2Uoa2V5RXhjaGFuZ2Uub3RrLm90S2V5UGFyYW1zKSxcclxuICAgICAgICBrOiBvdEtleUssXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAga2V5RXhjaGFuZ2Uub3RrLnN0YXRlID09PSAnT1RLX0lOSVRJQVRFRCcgJiZcclxuICAgICAgIWtleUV4Y2hhbmdlLmlzSW5pdGlhdG9yICYmXHJcbiAgICAgIGtleUV4Y2hhbmdlLm90ay5yZXNwb25kZXJQYmtDaXBoZXJcclxuICAgICkge1xyXG4gICAgICAvLyBBc3N1bWluZyBleGlzdGluZyB1c2VyIGdldHRpbmcgaW52aXRlZCB3aGVyZSBPVEsgaXMgd3JhcHBlZCBpbiByZXNwb25kZXIncyBwdWJsaWMga2V5LlxyXG4gICAgICBjb25zdCBwcmsgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFB4aygpO1xyXG4gICAgICBjb25zdCBkZWNyeXB0ZWRDaXBoZXI6IGFueSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcclxuICAgICAgICBwcmsuandrLFxyXG4gICAgICAgIEpTT04ucGFyc2Uoa2V5RXhjaGFuZ2Uub3RrLnJlc3BvbmRlclBia0NpcGhlciksXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc2VyaWFsaXphdGlvbnM6IFtKb3NlU2VyaWFsaXphdGlvbi5DT01QQUNUXSxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChkZWNyeXB0ZWRDaXBoZXIub3RLZXkpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgS2V5RmFjdG9yeVNlcnZpY2UuYXNLZXkoZGVjcnlwdGVkQ2lwaGVyLm90S2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlY3J5cHRPdGsoXHJcbiAgICBrZXlFeGNoYW5nZTogS2V5RXhjaGFuZ2VGcmFnbWVudCxcclxuICAgIG90S2V5Sz86IHN0cmluZ1xyXG4gICk6IFByb21pc2U8S2V5RXhjaGFuZ2VGcmFnbWVudD4ge1xyXG4gICAgY29uc3Qgb3RLZXkgPSBhd2FpdCB0aGlzLmdldE90S2V5KGtleUV4Y2hhbmdlLCBvdEtleUspO1xyXG5cclxuICAgIGxldCBvdGsgPSBrZXlFeGNoYW5nZS5vdGs7XHJcblxyXG4gICAgaWYgKG90S2V5ICYmIG90ay5vdEtleUNpcGhlcikge1xyXG4gICAgICBvdGsgPSB7XHJcbiAgICAgICAgLi4ub3RrLFxyXG4gICAgICAgIG90S2V5LFxyXG4gICAgICAgIG90S2V5Q2lwaGVyQ2xlYXJKc29uOiBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXHJcbiAgICAgICAgICBvdEtleSxcclxuICAgICAgICAgIGtleUV4Y2hhbmdlLm90ay5vdEtleUNpcGhlclxyXG4gICAgICAgICksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ua2V5RXhjaGFuZ2UsXHJcbiAgICAgIG90ayxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlY3J5cHRSZXNwb25zZUNpcGhlcihcclxuICAgIG90S2V5OiBKV0suS2V5LFxyXG4gICAgb3RQcms6IEpXSy5LZXksXHJcbiAgICBjb250ZW50OiBhbnlcclxuICApOiBQcm9taXNlPEluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXJDbGVhckpzb24+IHtcclxuICAgIC8vIFRoZSByZXNwb25zZSBjb3VsZCBiZSB3cmFwcGVkIGJ5IHRoZSBPdEsgaW4gYWRkaXRpb24gdG8gdGhlIE90UGJrXHJcbiAgICB0cnkge1xyXG4gICAgICBjb250ZW50ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KG90S2V5LCBjb250ZW50KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlICE9PSAnbm8ga2V5IGZvdW5kJykge1xyXG4gICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIERvIG5vdGhpbmcgdG8gc3VwcG9ydCBvbGRlciB2ZXJzaW9ucyB3aGVyZSBtZXNzYWdlIGlzIG5vdCB3cmFwcGVkIHdpdGggb3RrLlxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBQcmsgaXMgc2luZ2xlLXVzZSBhbmQgb25seSB1c2VkIHRvIHNlbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVzcG9uZGVyIGJhY2sgdG8gdGhlIGluaXRpYXRvci5cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQob3RQcmssIGNvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBkZWNyeXB0S2V5RXhjaGFuZ2VBc0luaXRpYXRvcihcclxuICAgIGtleUV4Y2hhbmdlOiBLZXlFeGNoYW5nZUZyYWdtZW50XHJcbiAgKTogUHJvbWlzZTxLZXlFeGNoYW5nZUZyYWdtZW50PiB7XHJcbiAgICBjb25zdCByb290S2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRSb290S2V5KCk7XHJcblxyXG4gICAgLy8gRGVjcnlwdCB1c2luZyB0aGUgcm9vdCBrZXkgdG8gZ2V0IHRoZSBQcmtcclxuICAgIGNvbnN0IGluaXRpYXRvclJvb3RLZXlDaXBoZXJDbGVhckpzb24gPSAoYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxyXG4gICAgICByb290S2V5Lmp3ayxcclxuICAgICAga2V5RXhjaGFuZ2UuaW5pdGlhdG9yUm9vdEtleUNpcGhlclxyXG4gICAgKSkgYXMgSW5pdGlhdG9yUm9vdEtleUNpcGhlckNsZWFySnNvbjI7XHJcblxyXG4gICAgY29uc3Qgb3RLZXkgPSBhd2FpdCBLZXlGYWN0b3J5U2VydmljZS5hc0tleShcclxuICAgICAgaW5pdGlhdG9yUm9vdEtleUNpcGhlckNsZWFySnNvbi5vdEtleVxyXG4gICAgKTtcclxuXHJcbiAgICBrZXlFeGNoYW5nZSA9IHtcclxuICAgICAgLi4ua2V5RXhjaGFuZ2UsXHJcbiAgICAgIGluaXRpYXRvclJvb3RLZXlDaXBoZXJDbGVhckpzb24sXHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBvdGsgPSBrZXlFeGNoYW5nZS5vdGs7XHJcblxyXG4gICAgaWYgKG90ay5pbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyKSB7XHJcbiAgICAgIG90ayA9IHtcclxuICAgICAgICAuLi5vdGssXHJcbiAgICAgICAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlckNsZWFySnNvbjogYXdhaXQgdGhpcy5kZWNyeXB0UmVzcG9uc2VDaXBoZXIoXHJcbiAgICAgICAgICBvdEtleSxcclxuICAgICAgICAgIGF3YWl0IEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KFxyXG4gICAgICAgICAgICBpbml0aWF0b3JSb290S2V5Q2lwaGVyQ2xlYXJKc29uLm9uZVRpbWVQcmtcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBvdGsuaW5pdGlhdG9yT25lVGltZVBia0NpcGhlclxyXG4gICAgICAgICksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG90ay5vdEtleUNpcGhlcikge1xyXG4gICAgICBvdGsub3RLZXlDaXBoZXJDbGVhckpzb24gPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXHJcbiAgICAgICAgb3RLZXksXHJcbiAgICAgICAgb3RrLm90S2V5Q2lwaGVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ua2V5RXhjaGFuZ2UsXHJcbiAgICAgIG90ayxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRlY3J5cHRLZXlFeGNoYW5nZUFzUmVzcG9uZGVyKFxyXG4gICAga2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlRnJhZ21lbnQsXHJcbiAgICBvdEtleUs/OiBzdHJpbmdcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLmRlY3J5cHRPdGsoa2V5RXhjaGFuZ2UsIG90S2V5Syk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWNyeXB0S2V5RXhjaGFuZ2Uoa2V5RXhjaGFuZ2U6IEtleUV4Y2hhbmdlRnJhZ21lbnQsIG90S2V5Sz86IHN0cmluZykge1xyXG4gICAgaWYgKGtleUV4Y2hhbmdlLmlzSW5pdGlhdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRLZXlFeGNoYW5nZUFzSW5pdGlhdG9yKGtleUV4Y2hhbmdlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRLZXlFeGNoYW5nZUFzUmVzcG9uZGVyKGtleUV4Y2hhbmdlLCBvdEtleUspO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0S2V5RXhjaGFuZ2VzKHsgc3RhdGUgfTogeyBzdGF0ZT86IEtleUV4Y2hhbmdlU3RhdGUyIH0gPSB7fSkge1xyXG4gICAgY29uc3QgeyBrZXlFeGNoYW5nZXMgfSA9IGF3YWl0IHRoaXMubHJHcmFwaFFMLnF1ZXJ5KHtcclxuICAgICAgcXVlcnk6IEtleUV4Y2hhbmdlc1F1ZXJ5MixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgc3RhdGUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXHJcbiAgICAgIGtleUV4Y2hhbmdlcy5lZGdlcy5tYXAoKGVkZ2UpID0+IHRoaXMuZGVjcnlwdEtleUV4Y2hhbmdlKGVkZ2Uubm9kZSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIGlkIElmIHRoZSBjdXJyZW50IHVzZXIgY2FuIHJlc3BvbmRlciB0aGUga2V5IGV4Y2hhbmdlIGlmIHRoZXkgYXJlIGVpdGhlciB0aGUgaW5pdGlhdG9yIG9yIHRoZSByZWNlaXZlci5cclxuICAgKiBAcGFyYW0gdG9rZW4gSWYgbm90IHNpZ25lZCBpbiwgb3Igbm90IHRoZSBpbml0aWF0b3Igb3IgcmVzcG9uZGVyLCAndG9rZW4nIG11c3QgYmUgZ2l2ZW4uXHJcbiAgICogQHBhcmFtIG90S2V5SyBJcyB0aGUgcmF3IG9uZS10aW1lIGtleSAoc3RyaW5nKS4gSWYgdGhlIHJlc3BvbmRlciBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhdCB0aW1lIG9mIGluaXRpYXRpb24sIHRoZW5cclxuICAgKiAgIGl0J3MgcG9zc2libGUgdG8gaGF2ZSB0aGUgb3RLZXkgd3JhcHBlZCBieSB0aGUgcHVibGljIGtleSBvZiB0aGUgcmVzcG9uZGVyLiBJbiB3aGljaCBjYXNlLCB0aGUgb3RLZXlLIGlzIG5vdCBuZWVkZWQuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0S2V5RXhjaGFuZ2UoXHJcbiAgICBpZDogc3RyaW5nLFxyXG4gICAgeyBvdEtleUssIHRva2VuIH06IEdldEtleUV4Y2hhbmdlT3B0aW9uczIgPSB7fVxyXG4gICkge1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sckdyYXBoUUwucXVlcnkoe1xyXG4gICAgICBxdWVyeTogdG9rZW4gPyBLZXlFeGNoYW5nZVRva2VuUXVlcnkyIDogS2V5RXhjaGFuZ2VRdWVyeTIsXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlkLFxyXG4gICAgICAgIHRva2VuLFxyXG4gICAgICB9LFxyXG4gICAgICBpbmNsdWRlS2V5R3JhcGg6ICF0b2tlbiwgLy8gaWYgIXRva2VuIHRoZW4gd2UgYXJlIHBvc3QgYXV0aCwgc28gY2FuIGZldGNoIGtleUdyYXBoXHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmRlY3J5cHRLZXlFeGNoYW5nZShyZXMua2V5RXhjaGFuZ2UsIG90S2V5Syk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Q3VycmVudFVzZXJTaGFyZWRLZXkoaW5wdXQ6IHtcclxuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xyXG4gICAgdXNlcklkPzogc3RyaW5nO1xyXG4gIH0pIHtcclxuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5xdWVyeSh7XHJcbiAgICAgIHF1ZXJ5OiBDdXJyZW50VXNlclNoYXJlZEtleVF1ZXJ5MixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgdXNlcm5hbWU6IGlucHV0LnVzZXJuYW1lLFxyXG4gICAgICAgIHVzZXJJZDogaW5wdXQudXNlcklkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpc1xyXG4gIGFzeW5jIGNhbmNlbEtleUV4Y2hhbmdlKGlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmNhbmNlbEtleUV4Y2hhbmdlTXV0YXRpb24oaWQpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsS2V5RXhjaGFuZ2VNdXRhdGlvbihpZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogQ2FuY2VsS2V5RXhjaGFuZ2VNdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzXHJcbiAgYXN5bmMgZGVjbGluZUtleUV4Y2hhbmdlKGlkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmRlY2xpbmVLZXlFeGNoYW5nZU11dGF0aW9uKGlkLCB0b2tlbik7XHJcbiAgfVxyXG5cclxuICBkZWNsaW5lS2V5RXhjaGFuZ2VNdXRhdGlvbihpZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogRGVjbGluZUtleUV4Y2hhbmdlTXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIHRva2VuLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRpYXRlT3RrKHtcclxuICAgIG1lc3NhZ2UsXHJcbiAgICBlbWFpbCxcclxuICAgIGNvbnRhY3RDYXJkLFxyXG4gICAgdXBncmFkZSxcclxuICB9OiBJbml0aWF0ZU90a0lucHV0MiA9IHt9KSB7XHJcbiAgICBjb25zdCBvdEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcclxuICAgIGNvbnN0IG5vbmNlID0gdGhpcy5rZXlGYWN0b3J5LnJhbmRvbVN0cmluZyh0aGlzLkNMSUVOVF9OT05DRV9MRU5HVEgpO1xyXG5cclxuICAgIC8vIE5ldyBQS0Mga2V5IGZvciBlbmNyeXB0aW9uLiBUaGlzIGtleSBpcyB1c2VkIG9ubHkgb25jZSB3aGVuIHRoZSByZXNwb25kZXIgc2VuZHNcclxuICAgIC8vIGJhY2sgdGhlaXIgc2lnbmluZyBwdWJsaWMga2V5LlxyXG4gICAgY29uc3QgaW5pdGlhdG9yT25lVGltZVByayA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVQa2NLZXkoKTtcclxuXHJcbiAgICAvLyBPcHRpb24gMTogTmV3IFBLQyBrZXkgZm9yIHNpZ25pbmdcclxuICAgIC8vIGNvbnN0IGluaXRpYXRvclNpZ1ByayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5jcmVhdGVQa2NTaWduS2V5KCk7XHJcblxyXG4gICAgLy8gT3B0aW9uIDI6IFVzZSB0aGUgdXNlcidzIGdsb2JhbCBzaWduaW5nIGtleS5cclxuICAgIC8vIFRoaXMga2V5IGlzIHVzZWQgdG8gcHJvdmUgdGhlIGluaXRpYXRvcidzIGlkZW50aXR5LlxyXG4gICAgY29uc3QgaW5pdGlhdG9yUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRQeGsoKTtcclxuICAgIGNvbnN0IGluaXRpYXRvclNpZ1ByayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50U2lnUHhrKCk7XHJcblxyXG4gICAgbGV0IGluaXRpYXRvclBsYWluRGF0YVNpZzogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBpZiAoY29udGFjdENhcmQgJiYgY29udGFjdENhcmQub3duZXJQbGFpbkRhdGFKc29uKSB7XHJcbiAgICAgIGluaXRpYXRvclBsYWluRGF0YVNpZyA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnblRvU3RyaW5nKFxyXG4gICAgICAgIGluaXRpYXRvclNpZ1Byay5qd2ssXHJcbiAgICAgICAgY29udGFjdENhcmQub3duZXJQbGFpbkRhdGFKc29uXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5pdGlhdG9yID0ge1xyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICBjb250YWN0Q2FyZDogY29udGFjdENhcmQgJiYge1xyXG4gICAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb246IGNvbnRhY3RDYXJkLnNoYXJlZENpcGhlckRhdGFDbGVhckpzb24sXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENvbnRlbnQgdG8gYmUgZW5jcnlwdGVkIHVzaW5nIHRoZSBPVEsuXHJcbiAgICBjb25zdCBwbGFpbk90S2V5Q2lwaGVyOiBPdEtleUNpcGhlckNsZWFySnNvbjIgPSB7XHJcbiAgICAgIC8vIFRPRE8gTWFrZSBzdXJlIHdlIGFsc28gcHV0IHRoZSBPT0IgY29kZSBpbiBoZXJlIGFzIHdlbGwgc2luY2UgdGhlIE9PQiBjb2RlIGlzIHRoZVxyXG4gICAgICAvLyBfb25seV8gaW5mb3JtYXRpb24gdGhlIEtDIHNlcnZlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0by4gVGhlIHNlcnZlciBtYXkgaGF2ZVxyXG4gICAgICAvLyBhY2Nlc3MgdG8gT1RLIGFuZCBoZW5jZSB0aGUgbm9uY2UgaGVyZS4gSXQncyBnb29kIHRvIGhhdmUgYm90aCB0aGUgbm9uY2UgYW5kIE9PQiBjb2RlXHJcbiAgICAgIC8vIHNpbmNlIHRoZSB1c2VyIG1heSBub3QgYmUgdXNpbmcgdGhlIE9PQiBjb2RlLiBBbmQgaXQncyBzaW1wbGUgdG8gYWx3YXlzIGluY2x1ZGVcclxuICAgICAgLy8gdGhlIG5vbmNlLCBzbyB3aHkgbm90LlxyXG4gICAgICBub25jZSxcclxuICAgICAgaW5pdGlhdG9yOiB7XHJcbiAgICAgICAgLi4uaW5pdGlhdG9yLFxyXG4gICAgICAgIG9uZVRpbWVQYms6IGluaXRpYXRvck9uZVRpbWVQcmsudG9KU09OKCksIC8vIG9uZS10aW1lIHB1YmxpYyBlbmNyeXB0aW9uIGtleSByZXNwb25kZXIgdXNlIHRvIHNlbmQgZGF0YSBiYWNrIHRvIGluaXRpYXRvclxyXG4gICAgICAgIHBiazogaW5pdGlhdG9yUHJrLmp3ay50b0pTT04oKSwgLy8gcHVibGljIGVuY3J5cHRpb24ga2V5XHJcbiAgICAgICAgc2lnUGJrOiBpbml0aWF0b3JTaWdQcmsuandrLnRvSlNPTigpLCAvLyBwdWJsaWMgc2lnbmluZyBrZXlcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgb3RLZXlDaXBoZXIgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmVuY3J5cHRUb1N0cmluZyhcclxuICAgICAgb3RLZXksXHJcbiAgICAgIHBsYWluT3RLZXlDaXBoZXJcclxuICAgICk7XHJcblxyXG4gICAgLy8gQ29udGVudCB0byBiZSBlbmNyeXB0ZWQgdXNpbmcgdGhlIGluaXRpYXRvcidzIHJvb3Qga2V5LlxyXG4gICAgY29uc3QgaW5pdGlhdG9yUm9vdEtleUNpcGhlckNsZWFySnNvbjogSW5pdGlhdG9yUm9vdEtleUNpcGhlckNsZWFySnNvbjIgPSB7XHJcbiAgICAgIG5vbmNlLFxyXG4gICAgICBvbmVUaW1lUHJrOiBpbml0aWF0b3JPbmVUaW1lUHJrLnRvSlNPTih0cnVlKSxcclxuICAgICAgLy8gU2hvdWxkIG5vdCBuZWVkIHRvIGtlZXAgdGhpcyBlbmNyeXB0ZWQgc2luY2Ugd2UgYXJlIHVzaW5nIHRoZSBnbG9iYWwgc2lnbmluZyBrZXkuXHJcbiAgICAgIC8vIHNpZ1ByazogaW5pdGlhdG9yU2lnUHJrLnRvSlNPTih0cnVlKSxcclxuXHJcbiAgICAgIC8vIFNhdmUgaXQgaW4gY2FzZSB0aGUgaW5pdGlhdG9yIHdhbnQgdG8gZGVjb2RlIHRoZSBvdEtleUNpcGhlci5cclxuICAgICAgLy8gU2luY2UgdGhlIG90S2V5IGlzIG9ubHkgdXNlZCBvbmNlLCBhbmQgdGhhdCBvdEtleUNpcGhlciBjb250YWlucyBvbmx5XHJcbiAgICAgIC8vIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBpbml0aWF0b3IsIGl0J3Mgc2FmZSBqdXN0IGxlYXZlIHRoZSBvdEtleSBzdG9yZWQgaGVyZS5cclxuICAgICAgb3RLZXk6IG90S2V5LnRvSlNPTih0cnVlKSxcclxuICAgICAgLy8gVGhlc2Ugc2hvdWxkIGJlIHN0b3JpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBob3cgdGhlIGZpZWxkcyBvZiB0aGUgc2hhcmVkIGNvbnRhY3QgY2FyZCBpc1xyXG4gICAgICAvLyBkZXJpdmVkIGZyb20gdGhlIG1hc3RlciBjb250YWN0IGNhcmQuXHJcbiAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkOiBjb250YWN0Q2FyZCxcclxuICAgICAgaW5pdGlhdG9yLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCByb290S2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRSb290S2V5KCk7XHJcbiAgICBjb25zdCBpbml0aWF0b3JSb290S2V5Q2lwaGVyID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgIHJvb3RLZXkuandrLFxyXG4gICAgICBpbml0aWF0b3JSb290S2V5Q2lwaGVyQ2xlYXJKc29uXHJcbiAgICApO1xyXG5cclxuICAgIC8vIFRoZSByYXcgT1RLXHJcbiAgICBjb25zdCBvdEtleUs6IHN0cmluZyA9IChvdEtleS50b0pTT04odHJ1ZSkgYXMgYW55KS5rO1xyXG5cclxuICAgIC8vIEFQSSBjYWxsXHJcbiAgICBjb25zdCBsck11dGF0aW9uID0gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogSW5pdGlhdGVLZXlFeGNoYW5nZU90a011dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgLy8gVGhlc2Ugd2lsbCBiZSBzdG9yZWQgb24gdGhlIHNlcnZlclxyXG4gICAgICAgICAgaW5pdGlhdG9yUm9vdEtleUNpcGhlcixcclxuICAgICAgICAgIGluaXRpYXRvclB4a0lkOiBpbml0aWF0b3JQcmsuaWQsXHJcbiAgICAgICAgICBpbml0aWF0b3JTaWdQeGtJZDogaW5pdGlhdG9yU2lnUHJrLmlkLFxyXG4gICAgICAgICAgLy8gVGhlc2Ugd2lsbCBiZSBzZW50IHRvIHRoZSByZXNwb25kZXJcclxuICAgICAgICAgIG90S2V5UGFyYW1zOiBKU09OLnN0cmluZ2lmeShvdEtleS50b0pTT04oKSksXHJcbiAgICAgICAgICBvdEtleUNpcGhlcixcclxuICAgICAgICAgIHNlbmRFbWFpbDogZW1haWwgJiYge1xyXG4gICAgICAgICAgICBlbWFpbCxcclxuICAgICAgICAgICAgcmF3T3RLZXk6IG90S2V5SyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjcmVhdGVUcDogdHJ1ZSxcclxuICAgICAgICAgIGluaXRpYXRvclBsYWluRGF0YVNpZyxcclxuICAgICAgICAgIHVwZ3JhZGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IGxyTXV0YXRpb24sIG90S2V5SyB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzcG9uZE90ayh7XHJcbiAgICBrZXlFeGNoYW5nZUlkLFxyXG4gICAgdG9rZW4sXHJcbiAgICBkZWNyeXB0ZWRPdGssXHJcbiAgICBtZXNzYWdlLFxyXG4gICAgaW5pdGlhdG9yQ29udGFjdENhcmQsXHJcbiAgICByZXNwb25kZXJDb250YWN0Q2FyZCxcclxuICB9OiBSZXNwb25kT3RrSW5wdXQyKSB7XHJcbiAgICBjb25zdCByb290S2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRSb290S2V5KCk7XHJcblxyXG4gICAgY29uc3QgbWFzdGVyS2V5SWQgPSB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudE1hc3RlcktleSgpLmlkO1xyXG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRNYXN0ZXJLZXkoKTtcclxuXHJcbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XHJcbiAgICBjb25zdCBta1NoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcclxuXHJcbiAgICBjb25zdCBya1dyYXBwZWRTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgIHJvb3RLZXkuandrLFxyXG4gICAgICBzaGFyZWRLZXkudG9KU09OKHRydWUpXHJcbiAgICApO1xyXG4gICAgY29uc3QgbWtXcmFwcGVkTWtTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgIG1hc3RlcktleS5qd2ssXHJcbiAgICAgIG1rU2hhcmVkS2V5LnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBpbml0aWF0b3JPbmVUaW1lUGJrID0gYXdhaXQgS2V5RmFjdG9yeVNlcnZpY2UuYXNLZXkoXHJcbiAgICAgIGRlY3J5cHRlZE90ay5vdEtleUNpcGhlckNsZWFySnNvbi5pbml0aWF0b3Iub25lVGltZVBia1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBpbml0aWF0b3JQYmsgPSBhd2FpdCBLZXlGYWN0b3J5U2VydmljZS5hc0tleShcclxuICAgICAgZGVjcnlwdGVkT3RrLm90S2V5Q2lwaGVyQ2xlYXJKc29uLmluaXRpYXRvci5wYmtcclxuICAgICk7XHJcbiAgICBjb25zdCBpbml0aWF0b3JTaWdQYmsgPSBhd2FpdCBLZXlGYWN0b3J5U2VydmljZS5hc0tleShcclxuICAgICAgZGVjcnlwdGVkT3RrLm90S2V5Q2lwaGVyQ2xlYXJKc29uLmluaXRpYXRvci5zaWdQYmtcclxuICAgICk7XHJcblxyXG4gICAgLy8gT3B0aW9uIDE6IFVzaW5nIG5ldyBQcmsgZm9yIGVhY2ggVFAgcGFpclxyXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHB1YmxpYyBzaWduaW5nIGtleSBmb3IgdGhlIHJlc3BvbmRlci5cclxuICAgIC8vIGNvbnN0IHJlc3BvbmRlclNpZ1ByayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5jcmVhdGVQa2NTaWduS2V5KClcclxuICAgIC8vIGNvbnN0IHJrV3JhcHBlZFJlc3BvbmRlclNpZ1ByayA9IGF3YWl0IHRoaXMuZW5jcnlwdChyb290S2V5LCByZXNwb25kZXJTaWdQcmsudG9KU09OKHRydWUpKTtcclxuXHJcbiAgICAvLyBPcHRpb24gMjogUmVzcG9uZGVyIGFscmVhZHkgaGFzIGEgc2lnbmluZyBQcmtcclxuICAgIGNvbnN0IHJlc3BvbmRlclByayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50UHhrKCk7XHJcbiAgICBjb25zdCByZXNwb25kZXJTaWdQcmsgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFNpZ1B4aygpO1xyXG5cclxuICAgIGNvbnN0IHNpZ25lZEluaXRpYXRvclBiayA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcclxuICAgICAgcmVzcG9uZGVyU2lnUHJrLmp3ayxcclxuICAgICAgaW5pdGlhdG9yUGJrLnRvSlNPTigpXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2lnbmVkSW5pdGlhdG9yU2lnUGJrID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKFxyXG4gICAgICByZXNwb25kZXJTaWdQcmsuandrLFxyXG4gICAgICBpbml0aWF0b3JTaWdQYmsudG9KU09OKClcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlckNsZWFySnNvbjogSW5pdGlhdG9yT25lVGltZVBia0NpcGhlckNsZWFySnNvbiA9IHtcclxuICAgICAgbm9uY2U6IGRlY3J5cHRlZE90ay5vdEtleUNpcGhlckNsZWFySnNvbi5ub25jZSxcclxuICAgICAgc2hhcmVkS2V5OiBzaGFyZWRLZXkudG9KU09OKHRydWUpLFxyXG4gICAgICBta1NoYXJlZEtleTogbWtTaGFyZWRLZXkudG9KU09OKHRydWUpLFxyXG4gICAgICByZXNwb25kZXI6IHtcclxuICAgICAgICBwYms6IHJlc3BvbmRlclByay5qd2sudG9KU09OKCksIC8vIHB1YmxpYyBrZXlcclxuICAgICAgICBzaWdQYms6IHJlc3BvbmRlclNpZ1Byay5qd2sudG9KU09OKCksIC8vIHB1YmxpYyBrZXlcclxuICAgICAgICBtZXNzYWdlLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgcmVjZWl2ZWRDYXJkSW5wdXQ7XHJcbiAgICBpZiAoZGVjcnlwdGVkT3RrLm90S2V5Q2lwaGVyQ2xlYXJKc29uLmluaXRpYXRvci5jb250YWN0Q2FyZCkge1xyXG4gICAgICAvLyBTZXQgdGhlIGluZm8gYWJvdXQgdGhlIGluaXRpYXRvciB0byBiZSB0aGUgb25lcyBzZW50IGJ5IHRoZSBpbml0aWF0b3IuIFdlIG5lZWQgdGggcmVzcG9uZGVyIHRvIGRvIHRoZSBlbmNyeXB0aW9uIGhlcmVcclxuICAgICAgLy8gYmVjYXVzZSB0aGUgaW5pdGlhdG9yIGRvZXMgbm90IGhhdmUgdGhlIHNoYXJlZCBrZXkgeWV0LCBhbmQgd2Ugd2FudCB0aGUgcmVzcG9uZGVyIHRvIGhhdmUgYSBmdW5jdGlvbmFsIGNvbnRhY3QgY2FyZCBhZnRlclxyXG4gICAgICAvLyB0aGlzIGV4Y2hhbmdlLiBUaGUgaW5pdGlhdG9yIGNhbiBkb3VibGUgY2hlY2sgdGhlIGNvbnRhY3QgZGV0YWlscyBhcmUgY29ycmVjdCBhbmQgc2lnbiBpdCB3aGVuIGl0IGNvbXBsZXRlcyB0aGUgZXhjaGFuZ2UuXHJcbiAgICAgIGNvbnN0IHNoYXJlZENpcGhlckRhdGFDbGVhckpzb24gPVxyXG4gICAgICAgIGRlY3J5cHRlZE90ay5vdEtleUNpcGhlckNsZWFySnNvbi5pbml0aWF0b3IuY29udGFjdENhcmRcclxuICAgICAgICAgIC5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uO1xyXG5cclxuICAgICAgLy8gQ3JlYXRlIGtleXNcclxuICAgICAgY29uc3QgcmVjZWl2ZXJLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XHJcbiAgICAgIGNvbnN0IGNjU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xyXG4gICAgICBjb25zdCBzaWdQeGsgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFNpZ1B4aygpO1xyXG5cclxuICAgICAgcmVjZWl2ZWRDYXJkSW5wdXQgPSB7XHJcbiAgICAgICAgcmVjZWl2ZXJXcmFwcGVkS2V5OiBKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcclxuICAgICAgICAgICAgcm9vdEtleS5qd2ssXHJcbiAgICAgICAgICAgIHJlY2VpdmVyS2V5LnRvSlNPTih0cnVlKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgcmVjZWl2ZXJXcmFwcGluZ0tleUlkOiByb290S2V5LmlkLFxyXG4gICAgICAgIHJlY2VpdmVyQ2lwaGVyRGF0YTogaW5pdGlhdG9yQ29udGFjdENhcmRcclxuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxyXG4gICAgICAgICAgICAgICAgcmVjZWl2ZXJLZXksXHJcbiAgICAgICAgICAgICAgICBpbml0aWF0b3JDb250YWN0Q2FyZC5yZWNlaXZlckNpcGhlckRhdGFDbGVhckpzb25cclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIDogJycsXHJcbiAgICAgICAgc2hhcmVkV3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgICAgICAgIHNoYXJlZEtleSxcclxuICAgICAgICAgICAgY2NTaGFyZWRLZXkudG9KU09OKHRydWUpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHNoYXJlZENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgICAgY2NTaGFyZWRLZXksXHJcbiAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvblxyXG4gICAgICApO1xyXG4gICAgICByZWNlaXZlZENhcmRJbnB1dC5zaGFyZWRDaXBoZXJEYXRhU2lnID0gSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKHNpZ1B4ay5qd2ssIHNoYXJlZENpcGhlckRhdGEpXHJcbiAgICAgICk7XHJcbiAgICAgIHJlY2VpdmVkQ2FyZElucHV0LnNpZ1B4a0lkID0gc2lnUHhrLmlkO1xyXG5cclxuICAgICAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlckNsZWFySnNvbi5yZXNwb25kZXIuY29udGFjdENhcmQgPSB7XHJcbiAgICAgICAgLi4uaW5pdGlhdG9yT25lVGltZVBia0NpcGhlckNsZWFySnNvbi5yZXNwb25kZXIuY29udGFjdENhcmQsXHJcbiAgICAgICAgc2hhcmVkQ2lwaGVyS2V5OiBjY1NoYXJlZEtleS50b0pTT04odHJ1ZSksXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbmRlckNhcmRJbnB1dDtcclxuICAgIGlmIChyZXNwb25kZXJDb250YWN0Q2FyZCkge1xyXG4gICAgICAvLyBDcmVhdGUga2V5c1xyXG4gICAgICBjb25zdCBvd25lcktleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcclxuICAgICAgY29uc3QgY2NTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XHJcbiAgICAgIGNvbnN0IHNpZ1B4ayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50U2lnUHhrKCk7XHJcblxyXG4gICAgICByZXNwb25kZXJDYXJkSW5wdXQgPSB7XHJcbiAgICAgICAgb3duZXJXcmFwcGVkS2V5OiBKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcclxuICAgICAgICAgICAgcm9vdEtleS5qd2ssXHJcbiAgICAgICAgICAgIG93bmVyS2V5LnRvSlNPTih0cnVlKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICksXHJcbiAgICAgICAgb3duZXJXcmFwcGluZ0tleUlkOiByb290S2V5LmlkLFxyXG4gICAgICAgIG93bmVyQ2lwaGVyRGF0YTogcmVzcG9uZGVyQ29udGFjdENhcmQub3duZXJDaXBoZXJEYXRhQ2xlYXJKc29uXHJcbiAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcclxuICAgICAgICAgICAgICAgIG93bmVyS2V5LFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmQub3duZXJDaXBoZXJEYXRhQ2xlYXJKc29uXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICA6ICcnLFxyXG5cclxuICAgICAgICBzaGFyZWRXcmFwcGVkS2V5OiBKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcclxuICAgICAgICAgICAgc2hhcmVkS2V5LFxyXG4gICAgICAgICAgICBjY1NoYXJlZEtleS50b0pTT04odHJ1ZSlcclxuICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3Qgc2hhcmVkQ2lwaGVyRGF0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcclxuICAgICAgICBjY1NoYXJlZEtleSxcclxuICAgICAgICByZXNwb25kZXJDb250YWN0Q2FyZC5zaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uXHJcbiAgICAgICk7XHJcbiAgICAgIHJlc3BvbmRlckNhcmRJbnB1dC5zaGFyZWRDaXBoZXJEYXRhU2lnID0gSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKHNpZ1B4ay5qd2ssIHNoYXJlZENpcGhlckRhdGEpXHJcbiAgICAgICk7XHJcbiAgICAgIHJlc3BvbmRlckNhcmRJbnB1dC5zaWdQeGtJZCA9IHNpZ1B4ay5pZDtcclxuXHJcbiAgICAgIGlmIChyZXNwb25kZXJDb250YWN0Q2FyZC5vd25lclBsYWluRGF0YUpzb24pIHtcclxuICAgICAgICByZXNwb25kZXJDYXJkSW5wdXQub3duZXJQbGFpbkRhdGFTaWcgPSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcclxuICAgICAgICAgICAgcmVzcG9uZGVyU2lnUHJrLmp3ayxcclxuICAgICAgICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmQub3duZXJQbGFpbkRhdGFKc29uXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ29udGFjdCBjYXJkIGluZm8gcmVhZGFibGUgYnkgdGhlIGluaXRpYXRvclxyXG4gICAgICBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyQ2xlYXJKc29uLnJlc3BvbmRlci5jb250YWN0Q2FyZCA9IHtcclxuICAgICAgICAuLi5pbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyQ2xlYXJKc29uLnJlc3BvbmRlci5jb250YWN0Q2FyZCxcclxuICAgICAgICBzaGFyZWRDaXBoZXJEYXRhQ2xlYXJKc29uOlxyXG4gICAgICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmQuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbmNyeXB0IHdpdGggb25lLXRpbWUgcHVibGljIGtleVxyXG4gICAgbGV0IGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgIGluaXRpYXRvck9uZVRpbWVQYmssXHJcbiAgICAgIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXJDbGVhckpzb25cclxuICAgICk7XHJcblxyXG4gICAgLy8gRW5jcnlwdCB3aXRoIHRoZSBvdGsgYWdhaW4gdG8ga2VlcCB1c2Ugb2YgYXN5bW1ldHJpYyBrZXlzIHRvIGEgbWluaW11bS5cclxuICAgIGluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgIGRlY3J5cHRlZE90ay5vdEtleSxcclxuICAgICAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlclxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogUmVzcG9uZEtleUV4Y2hhbmdlT3RrTXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICBrZXlFeGNoYW5nZUlkLFxyXG4gICAgICAgICAga2V5RXhjaGFuZ2VUb2tlbjogdG9rZW4sXHJcbiAgICAgICAgICByb290S2V5SWQ6IHJvb3RLZXkuaWQsXHJcbiAgICAgICAgICBtYXN0ZXJLZXlJZCxcclxuICAgICAgICAgIC8vIFRoZXNlIHdpbGwgYmUgc3RvcmVkIG9uIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgIHJlc3BvbmRlclB4a0lkOiByZXNwb25kZXJQcmsuaWQsXHJcbiAgICAgICAgICByZXNwb25kZXJTaWdQeGtJZDogcmVzcG9uZGVyU2lnUHJrLmlkLFxyXG4gICAgICAgICAgc2lnbmVkSW5pdGlhdG9yUGJrOiBKU09OLnN0cmluZ2lmeShzaWduZWRJbml0aWF0b3JQYmspLFxyXG4gICAgICAgICAgc2lnbmVkSW5pdGlhdG9yU2lnUGJrOiBKU09OLnN0cmluZ2lmeShzaWduZWRJbml0aWF0b3JTaWdQYmspLFxyXG4gICAgICAgICAgLy8gcmtXcmFwcGVkSW5pdGlhdG9yU2lnUGJrOiBKU09OLnN0cmluZ2lmeShya1dyYXBwZWRJbml0aWF0b3JTaWdQYmspLFxyXG5cclxuICAgICAgICAgIC8vIE9wdGlvbiAxOiBVc2luZyBuZXcgUHJrIGZvciBlYWNoIFRQIHBhaXJcclxuICAgICAgICAgIC8vIHJrV3JhcHBlZFJlc3BvbmRlclNpZ1ByazogSlNPTi5zdHJpbmdpZnkocmtXcmFwcGVkUmVzcG9uZGVyU2lnUHJrKSxcclxuICAgICAgICAgIHJrV3JhcHBlZFNoYXJlZEtleTogSlNPTi5zdHJpbmdpZnkocmtXcmFwcGVkU2hhcmVkS2V5KSxcclxuICAgICAgICAgIG1rV3JhcHBlZE1rU2hhcmVkS2V5OiBKU09OLnN0cmluZ2lmeShta1dyYXBwZWRNa1NoYXJlZEtleSksXHJcbiAgICAgICAgICAvLyBUaGVzZSB3aWxsIGJlIHNlbnQgdG8gdGhlIGluaXRpYXRvclxyXG4gICAgICAgICAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlcjogSlNPTi5zdHJpbmdpZnkoaW5pdGlhdG9yT25lVGltZVBia0NpcGhlciksXHJcbiAgICAgICAgICBpbml0aWF0b3JDb250YWN0Q2FyZDogcmVjZWl2ZWRDYXJkSW5wdXQsXHJcbiAgICAgICAgICByZXNwb25kZXJDb250YWN0Q2FyZDogcmVzcG9uZGVyQ2FyZElucHV0LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbXBsZXRlT3RrKHtcclxuICAgIGtleUV4Y2hhbmdlSWQsXHJcbiAgICBpbml0aWF0b3JSb290S2V5Q2lwaGVyLFxyXG4gICAgaW5pdGlhdG9yT25lVGltZVBia0NpcGhlcixcclxuICAgIHJlc3BvbmRlckNvbnRhY3RDYXJkLFxyXG4gICAgaW5pdGlhdG9yQ29udGFjdENhcmQsXHJcbiAgfTogQ29tcGxldGVPdGtJbnB1dDIpIHtcclxuICAgIGNvbnN0IHJvb3RLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFJvb3RLZXkoKTtcclxuICAgIGNvbnN0IG1hc3RlcktleSA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50TWFzdGVyS2V5KCk7XHJcblxyXG4gICAgLy8gRGVjcnlwdCB1c2luZyB0aGUgcm9vdCBrZXkgdG8gZ2V0IHRoZSBQcmtcclxuICAgIGNvbnN0IGluaXRpYXRvclJvb3RLZXlDaXBoZXJDbGVhckpzb24gPSAoYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxyXG4gICAgICByb290S2V5Lmp3ayxcclxuICAgICAgaW5pdGlhdG9yUm9vdEtleUNpcGhlclxyXG4gICAgKSkgYXMgSW5pdGlhdG9yUm9vdEtleUNpcGhlckNsZWFySnNvbjI7XHJcblxyXG4gICAgLy8gVGhlIFByayBpcyBzaW5nbGUtdXNlIGFuZCBvbmx5IHVzZWQgdG8gc2VuZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXNwb25kZXIgYmFjayB0byB0aGUgaW5pdGlhdG9yLlxyXG4gICAgY29uc3QgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyID0gYXdhaXQgdGhpcy5kZWNyeXB0UmVzcG9uc2VDaXBoZXIoXHJcbiAgICAgIGF3YWl0IEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KGluaXRpYXRvclJvb3RLZXlDaXBoZXJDbGVhckpzb24ub3RLZXkpLFxyXG4gICAgICBhd2FpdCBLZXlGYWN0b3J5U2VydmljZS5hc0tleShpbml0aWF0b3JSb290S2V5Q2lwaGVyQ2xlYXJKc29uLm9uZVRpbWVQcmspLFxyXG4gICAgICBpbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyXHJcbiAgICApO1xyXG5cclxuICAgIC8vIENoZWNrIHRoZSBub25jZSBtYXRjaCB0byBlbnN1cmUgdGhlIHJlc3BvbmRlciB3YXMgdGhlIG9uZSBob2xkaW5nIHRoZSBPVEtcclxuICAgIGlmIChcclxuICAgICAgaW5pdGlhdG9yUm9vdEtleUNpcGhlckNsZWFySnNvbi5ub25jZSAhPT1cclxuICAgICAgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLm5vbmNlXHJcbiAgICApIHtcclxuICAgICAgdGhyb3cgbmV3IExyQ29kZU1pc21hdGNoRXhjZXB0aW9uKFxyXG4gICAgICAgICdUaGUgbm9uY2UgcmV0dXJuZWQgYnkgcmVzcG9uZGVyIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIG9uZSBjcmVhdGVkIGJ5IHRoZSBpbml0aWF0b3IuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE9wdGlvbiAxOiBBc3N1bWluZyB0aGUgc2lnbmluZyBrZXkgaXMgdW5pcXVlIGJldHdlZW4gdXNlcnMuXHJcbiAgICAvLyBjb25zdCBpbml0aWF0b3JTaWdQcmsgPSBhd2FpdCBLRlMuYXNLZXkoa2UucGxhaW5Jbml0aWF0b3JSb290S2V5Q2lwaGVyLnNpZ1Byayk7XHJcbiAgICAvLyBjb25zdCBya1dyYXBwZWRJbml0aWF0b3JTaWdQcmsgPSBhd2FpdCB0aGlzLmVuY3J5cHQocm9vdEtleSwgaW5pdGlhdG9yU2lnUHJrLnRvSlNPTih0cnVlKSk7XHJcblxyXG4gICAgLy8gT3B0aW9uIDI6IFVzZSB0aGUgdXNlcidzIGdsb2JhbCBzaWduaW5nIGtleS5cclxuICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgaW5pdGlhdG9yU2lnUHJrIGlzIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSBrZXkgZ3JhcGguXHJcbiAgICAvLyBTbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZS5cclxuXHJcbiAgICAvLyBQcm90ZWN0ZWQgdGhlIHNpZ25pbmcgcHVibGljIGtleSBvZiB0aGUgcmVzcG9uZGVyLlxyXG4gICAgY29uc3QgaW5pdGlhdG9yU2lnUHJrID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRTaWdQeGsoKTtcclxuICAgIGNvbnN0IHJlc3BvbmRlclNpZ1BiayA9IGF3YWl0IEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KFxyXG4gICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIucmVzcG9uZGVyLnNpZ1Bia1xyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlc3BvbmRlclBiayA9IGF3YWl0IEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KFxyXG4gICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIucmVzcG9uZGVyLnBia1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzaWduZWRSZXNwb25kZXJQYmsgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oXHJcbiAgICAgIGluaXRpYXRvclNpZ1Byay5qd2ssXHJcbiAgICAgIHJlc3BvbmRlclBiay50b0pTT04oKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IHNpZ25lZFJlc3BvbmRlclNpZ1BiayA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcclxuICAgICAgaW5pdGlhdG9yU2lnUHJrLmp3ayxcclxuICAgICAgcmVzcG9uZGVyU2lnUGJrLnRvSlNPTigpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KFxyXG4gICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIuc2hhcmVkS2V5XHJcbiAgICApO1xyXG4gICAgY29uc3QgcmtXcmFwcGVkU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxyXG4gICAgICByb290S2V5Lmp3ayxcclxuICAgICAgc2hhcmVkS2V5LnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBta1NoYXJlZEtleSA9IGF3YWl0IEtleUZhY3RvcnlTZXJ2aWNlLmFzS2V5KFxyXG4gICAgICBwbGFpbkluaXRpYXRvck9uZVRpbWVQYmtDaXBoZXIubWtTaGFyZWRLZXlcclxuICAgICk7XHJcbiAgICBjb25zdCBta1dyYXBwZWRNa1NoYXJlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcclxuICAgICAgbWFzdGVyS2V5Lmp3ayxcclxuICAgICAgbWtTaGFyZWRLZXkudG9KU09OKHRydWUpXHJcbiAgICApO1xyXG5cclxuICAgIGxldCByZXNwb25kZXJDb250YWN0Q2FyZENpcGhlcklucHV0O1xyXG4gICAgaWYgKHJlc3BvbmRlckNvbnRhY3RDYXJkKSB7XHJcbiAgICAgIC8vIENyZWF0ZSBrZXlcclxuICAgICAgY29uc3QgcmVjZWl2ZXJLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XHJcblxyXG4gICAgICByZXNwb25kZXJDb250YWN0Q2FyZENpcGhlcklucHV0ID0ge1xyXG4gICAgICAgIHJlY2VpdmVyV3JhcHBlZEtleTogSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgICAgICAgIHJvb3RLZXkuandrLFxyXG4gICAgICAgICAgICByZWNlaXZlcktleS50b0pTT04odHJ1ZSlcclxuICAgICAgICAgIClcclxuICAgICAgICApLFxyXG4gICAgICAgIHJlY2VpdmVyV3JhcHBpbmdLZXlJZDogcm9vdEtleS5pZCxcclxuICAgICAgICByZWNlaXZlckNpcGhlckRhdGE6IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxyXG4gICAgICAgICAgICByZWNlaXZlcktleSxcclxuICAgICAgICAgICAgcmVzcG9uZGVyQ29udGFjdENhcmQucmVjZWl2ZXJDaXBoZXJEYXRhQ2xlYXJKc29uXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgdGhlIGRhdGEgbmVlZGVkIGZyb20gdGhlIGluaXRpYXRvcidzIGNpcGhlciBkYXRhLlxyXG4gICAgbGV0IGluaXRpYXRvckNvbnRhY3RDYXJkQ2lwaGVySW5wdXQ7XHJcbiAgICBsZXQgaW5pdGlhdG9yQ29udGFjdENhcmRTaGFyZWRDaXBoZXJJbnB1dDtcclxuICAgIGlmIChpbml0aWF0b3JSb290S2V5Q2lwaGVyQ2xlYXJKc29uLmluaXRpYXRvckNvbnRhY3RDYXJkKSB7XHJcbiAgICAgIC8vIFRoZSBpbml0aWF0b3JDb250YWN0Q2FyZCBjcmVhdGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIGludml0ZSBhbmQgZW5jcnlwdGVkIHVzaW5nIHRoZSBpbml0aWF0b3Inc1xyXG4gICAgICAvLyByb290IGtleVxyXG4gICAgICBjb25zdCBpbml0aWF0b3JDb250YWN0Q2FyZEZyb21Jbml0ID1cclxuICAgICAgICBpbml0aWF0b3JSb290S2V5Q2lwaGVyQ2xlYXJKc29uLmluaXRpYXRvckNvbnRhY3RDYXJkO1xyXG4gICAgICBjb25zdCBvd25lcktleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcclxuICAgICAgY29uc3Qgc2hhcmVkQ2lwaGVyS2V5ID0gYXdhaXQgS2V5RmFjdG9yeVNlcnZpY2UuYXNLZXkoXHJcbiAgICAgICAgcGxhaW5Jbml0aWF0b3JPbmVUaW1lUGJrQ2lwaGVyLnJlc3BvbmRlci5jb250YWN0Q2FyZC5zaGFyZWRDaXBoZXJLZXlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IG93bmVyV3JhcHBlZEtleSA9IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChyb290S2V5Lmp3aywgb3duZXJLZXkudG9KU09OKHRydWUpKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gQWxsb3cgdGhlIGluaXRpYXRvckNvbnRhY3RDYXJkIHBhcmFtZXRlciB0byBvdmVycmlkZVxyXG4gICAgICBjb25zdCBvd25lckNpcGhlckRhdGFDbGVhckpzb24gPVxyXG4gICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkPy5vd25lckNpcGhlckRhdGFDbGVhckpzb24gfHxcclxuICAgICAgICBpbml0aWF0b3JDb250YWN0Q2FyZEZyb21Jbml0Lm93bmVyQ2lwaGVyRGF0YUNsZWFySnNvbjtcclxuXHJcbiAgICAgIGNvbnN0IG93bmVyQ2lwaGVyRGF0YSA9IG93bmVyQ2lwaGVyRGF0YUNsZWFySnNvblxyXG4gICAgICAgID8gYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgICAgICAgIG93bmVyS2V5LFxyXG4gICAgICAgICAgICBvd25lckNpcGhlckRhdGFDbGVhckpzb25cclxuICAgICAgICAgIClcclxuICAgICAgICA6ICcnO1xyXG5cclxuICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmRDaXBoZXJJbnB1dCA9IHtcclxuICAgICAgICBvd25lcldyYXBwZWRLZXksXHJcbiAgICAgICAgb3duZXJXcmFwcGluZ0tleUlkOiByb290S2V5LmlkLFxyXG4gICAgICAgIG93bmVyQ2lwaGVyRGF0YSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkU2hhcmVkQ2lwaGVySW5wdXQgPSB7XHJcbiAgICAgICAgc2lnUHhrSWQ6IGluaXRpYXRvclNpZ1Byay5pZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHNoYXJlZENpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgICAgc2hhcmVkQ2lwaGVyS2V5LFxyXG4gICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkRnJvbUluaXQuc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvblxyXG4gICAgICApO1xyXG4gICAgICBpbml0aWF0b3JDb250YWN0Q2FyZFNoYXJlZENpcGhlcklucHV0LnNoYXJlZENpcGhlckRhdGFTaWcgPSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oaW5pdGlhdG9yU2lnUHJrLmp3aywgc2hhcmVkQ2lwaGVyRGF0YSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPIGlkZWFsbHkgd2UgdXBkYXRlIHRoZSBzaGFyZWQgZGF0YSBpbiB0aGUgY29udGFjdCBjYXJkIHNlbnQgdG8gdGhlIHJlc3BvbmRlciBhcyB3ZWxsIHNpbmNlIHRoYXRcclxuICAgIC8vIENDIHdhcyBjcmVhdGVkIGJ5IHRoZSByZXNwb25kZXIuXHJcblxyXG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcclxuICAgICAgbXV0YXRpb246IENvbXBsZXRlS2V5RXhjaGFuZ2VPdGtNdXRhdGlvbixcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIGtleUV4Y2hhbmdlSWQsXHJcbiAgICAgICAgICByb290S2V5SWQ6IHJvb3RLZXkuaWQsXHJcbiAgICAgICAgICBtYXN0ZXJLZXlJZDogbWFzdGVyS2V5LmlkLFxyXG4gICAgICAgICAgaW5pdGlhdG9yU2lnUHhrSWQ6IGluaXRpYXRvclNpZ1Byay5pZCxcclxuICAgICAgICAgIHNpZ25lZFJlc3BvbmRlclBiazogSlNPTi5zdHJpbmdpZnkoc2lnbmVkUmVzcG9uZGVyUGJrKSxcclxuICAgICAgICAgIHNpZ25lZFJlc3BvbmRlclNpZ1BiazogSlNPTi5zdHJpbmdpZnkoc2lnbmVkUmVzcG9uZGVyU2lnUGJrKSxcclxuICAgICAgICAgIHJrV3JhcHBlZFNoYXJlZEtleTogSlNPTi5zdHJpbmdpZnkocmtXcmFwcGVkU2hhcmVkS2V5KSxcclxuICAgICAgICAgIG1rV3JhcHBlZE1rU2hhcmVkS2V5OiBKU09OLnN0cmluZ2lmeShta1dyYXBwZWRNa1NoYXJlZEtleSksXHJcbiAgICAgICAgICByZXNwb25kZXJDb250YWN0Q2FyZENpcGhlcjogcmVzcG9uZGVyQ29udGFjdENhcmRDaXBoZXJJbnB1dCxcclxuICAgICAgICAgIGluaXRpYXRvckNvbnRhY3RDYXJkQ2lwaGVyOiBpbml0aWF0b3JDb250YWN0Q2FyZENpcGhlcklucHV0LFxyXG4gICAgICAgICAgaW5pdGlhdG9yQ29udGFjdENhcmRTaGFyZWRDaXBoZXI6IGluaXRpYXRvckNvbnRhY3RDYXJkU2hhcmVkQ2lwaGVySW5wdXQsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|