@lifeready/core 9.0.8 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/lifeready-core.mjs +10522 -0
- package/fesm2022/lifeready-core.mjs.map +1 -0
- package/package.json +21 -16
- package/types/lifeready-core.d.ts +5329 -0
- package/bundles/lifeready-core.umd.js +0 -13231
- package/bundles/lifeready-core.umd.js.map +0 -1
- package/bundles/lifeready-core.umd.min.js +0 -2
- package/bundles/lifeready-core.umd.min.js.map +0 -1
- package/esm2015/lib/_common/ast.js +0 -41
- package/esm2015/lib/_common/deferred-promise.js +0 -24
- package/esm2015/lib/_common/exceptions.js +0 -186
- package/esm2015/lib/_common/index.js +0 -3
- package/esm2015/lib/_common/kc-lodash.js +0 -11
- package/esm2015/lib/_common/key.js +0 -28
- package/esm2015/lib/_common/queries.gql.js +0 -43
- package/esm2015/lib/_common/run-outside-angular.js +0 -80
- package/esm2015/lib/_common/storage.js +0 -28
- package/esm2015/lib/_common/types.js +0 -2
- package/esm2015/lib/_common/utils.js +0 -73
- package/esm2015/lib/api/lr-apollo.service.js +0 -47
- package/esm2015/lib/api/lr-graphql/index.js +0 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
- package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
- package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
- package/esm2015/lib/api/query-processor/index.js +0 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
- package/esm2015/lib/api/types/graphql.types.js +0 -8
- package/esm2015/lib/api/types/index.js +0 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
- package/esm2015/lib/auth/auth.config.js +0 -57
- package/esm2015/lib/auth/auth.gql.private.js +0 -85
- package/esm2015/lib/auth/auth.service.js +0 -616
- package/esm2015/lib/auth/auth.types.js +0 -19
- package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
- package/esm2015/lib/contact-card/contact-card.service.js +0 -156
- package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
- package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
- package/esm2015/lib/encryption/encryption.service.js +0 -188
- package/esm2015/lib/file-upload/file-upload.service.js +0 -70
- package/esm2015/lib/file-upload/file-upload.types.js +0 -2
- package/esm2015/lib/idle/idle.service.js +0 -159
- package/esm2015/lib/idle/idle.types.js +0 -7
- package/esm2015/lib/item/item.gql.js +0 -166
- package/esm2015/lib/item/item.gql.private.js +0 -41
- package/esm2015/lib/item/item.service.js +0 -662
- package/esm2015/lib/item/item.types.js +0 -2
- package/esm2015/lib/key/key-factory.service.js +0 -226
- package/esm2015/lib/key/key-graph.service.js +0 -314
- package/esm2015/lib/key/key-meta.service.js +0 -153
- package/esm2015/lib/key/key.service.js +0 -124
- package/esm2015/lib/key/key.types.js +0 -16
- package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
- package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
- package/esm2015/lib/lbop/lbop.service.js +0 -351
- package/esm2015/lib/life-ready.config.js +0 -96
- package/esm2015/lib/life-ready.module.js +0 -42
- package/esm2015/lib/lock/lock.gql.js +0 -40
- package/esm2015/lib/lock/lock.service.js +0 -64
- package/esm2015/lib/notification/notification.gql.js +0 -43
- package/esm2015/lib/notification/notification.service.js +0 -118
- package/esm2015/lib/password/password.gql.js +0 -28
- package/esm2015/lib/password/password.service.js +0 -309
- package/esm2015/lib/persist/persist.service.js +0 -181
- package/esm2015/lib/plan/plan.gql.js +0 -91
- package/esm2015/lib/plan/plan.service.js +0 -191
- package/esm2015/lib/plan/plan.types.js +0 -2
- package/esm2015/lib/profile/profile-details.service.js +0 -261
- package/esm2015/lib/profile/profile.gql.js +0 -170
- package/esm2015/lib/profile/profile.service.js +0 -166
- package/esm2015/lib/profile/profile.types.js +0 -45
- package/esm2015/lib/register/register.service.js +0 -173
- package/esm2015/lib/register/register.types.js +0 -3
- package/esm2015/lib/reminder/reminder.gql.js +0 -27
- package/esm2015/lib/reminder/reminder.service.js +0 -85
- package/esm2015/lib/reminder/reminder.types.js +0 -2
- package/esm2015/lib/scenario/scenario.constants.js +0 -2
- package/esm2015/lib/scenario/scenario.controller.js +0 -34
- package/esm2015/lib/scenario/scenario.gql.js +0 -90
- package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
- package/esm2015/lib/scenario/scenario.service.js +0 -679
- package/esm2015/lib/scenario/scenario.types.js +0 -2
- package/esm2015/lib/server-config/server-config.gql.js +0 -9
- package/esm2015/lib/server-config/server-config.service.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/slip39/slip39.service.js +0 -167
- package/esm2015/lib/time/time.service.js +0 -152
- package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
- package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
- package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
- package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
- package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
- package/esm2015/lib/two-factor/two-factor.service.js +0 -74
- package/esm2015/lib/user/user.gql.js +0 -32
- package/esm2015/lib/user/user.service.js +0 -58
- package/esm2015/lib/user/user.types.js +0 -2
- package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
- package/esm2015/lifeready-core.js +0 -17
- package/esm2015/public-api.js +0 -60
- package/fesm2015/lifeready-core.js +0 -10970
- package/fesm2015/lifeready-core.js.map +0 -1
- package/lib/_common/ast.d.ts +0 -11
- package/lib/_common/deferred-promise.d.ts +0 -12
- package/lib/_common/exceptions.d.ts +0 -126
- package/lib/_common/index.d.ts +0 -2
- package/lib/_common/kc-lodash.d.ts +0 -5
- package/lib/_common/key.d.ts +0 -14
- package/lib/_common/queries.gql.d.ts +0 -4
- package/lib/_common/run-outside-angular.d.ts +0 -14
- package/lib/_common/storage.d.ts +0 -13
- package/lib/_common/types.d.ts +0 -15
- package/lib/_common/utils.d.ts +0 -12
- package/lib/api/lr-apollo.service.d.ts +0 -15
- package/lib/api/lr-graphql/index.d.ts +0 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
- package/lib/api/lr-graphql/lr.service.d.ts +0 -9
- package/lib/api/query-processor/common-processors.service.d.ts +0 -36
- package/lib/api/query-processor/index.d.ts +0 -2
- package/lib/api/query-processor/query-processor.service.d.ts +0 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
- package/lib/api/types/graphql.types.d.ts +0 -30
- package/lib/api/types/index.d.ts +0 -2
- package/lib/api/types/lr-graphql.types.d.ts +0 -807
- package/lib/auth/auth.config.d.ts +0 -5
- package/lib/auth/auth.gql.private.d.ts +0 -25
- package/lib/auth/auth.service.d.ts +0 -72
- package/lib/auth/auth.types.d.ts +0 -70
- package/lib/contact-card/contact-card.gql.d.ts +0 -7
- package/lib/contact-card/contact-card.service.d.ts +0 -53
- package/lib/contact-card/contact-card2.gql.d.ts +0 -25
- package/lib/contact-card/contact-card2.service.d.ts +0 -64
- package/lib/encryption/encryption.service.d.ts +0 -42
- package/lib/file-upload/file-upload.service.d.ts +0 -15
- package/lib/file-upload/file-upload.types.d.ts +0 -5
- package/lib/idle/idle.service.d.ts +0 -47
- package/lib/idle/idle.types.d.ts +0 -10
- package/lib/item/item.gql.d.ts +0 -134
- package/lib/item/item.gql.private.d.ts +0 -35
- package/lib/item/item.service.d.ts +0 -201
- package/lib/item/item.types.d.ts +0 -95
- package/lib/key/key-factory.service.d.ts +0 -40
- package/lib/key/key-graph.service.d.ts +0 -41
- package/lib/key/key-meta.service.d.ts +0 -51
- package/lib/key/key.service.d.ts +0 -36
- package/lib/key/key.types.d.ts +0 -86
- package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
- package/lib/key-exchange/key-exchange.service.d.ts +0 -179
- package/lib/lbop/lbop.service.d.ts +0 -99
- package/lib/life-ready.config.d.ts +0 -26
- package/lib/life-ready.module.d.ts +0 -5
- package/lib/lock/lock.gql.d.ts +0 -27
- package/lib/lock/lock.service.d.ts +0 -34
- package/lib/notification/notification.gql.d.ts +0 -37
- package/lib/notification/notification.service.d.ts +0 -64
- package/lib/password/password.gql.d.ts +0 -3
- package/lib/password/password.service.d.ts +0 -79
- package/lib/persist/persist.service.d.ts +0 -31
- package/lib/plan/plan.gql.d.ts +0 -69
- package/lib/plan/plan.service.d.ts +0 -111
- package/lib/plan/plan.types.d.ts +0 -16
- package/lib/profile/profile-details.service.d.ts +0 -20
- package/lib/profile/profile.gql.d.ts +0 -21
- package/lib/profile/profile.service.d.ts +0 -32
- package/lib/profile/profile.types.d.ts +0 -121
- package/lib/register/register.service.d.ts +0 -25
- package/lib/register/register.types.d.ts +0 -6
- package/lib/reminder/reminder.gql.d.ts +0 -23
- package/lib/reminder/reminder.service.d.ts +0 -33
- package/lib/reminder/reminder.types.d.ts +0 -17
- package/lib/scenario/scenario.constants.d.ts +0 -1
- package/lib/scenario/scenario.controller.d.ts +0 -10
- package/lib/scenario/scenario.gql.d.ts +0 -78
- package/lib/scenario/scenario.private.gql.d.ts +0 -16
- package/lib/scenario/scenario.service.d.ts +0 -655
- package/lib/scenario/scenario.types.d.ts +0 -64
- package/lib/server-config/server-config.gql.d.ts +0 -5
- package/lib/server-config/server-config.service.d.ts +0 -9
- package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
- package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
- package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
- package/lib/slip39/slip39.service.d.ts +0 -42
- package/lib/time/time.service.d.ts +0 -26
- package/lib/tp-assembly/tp-assembly.d.ts +0 -177
- package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
- package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
- package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
- package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
- package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
- package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
- package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
- package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
- package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
- package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
- package/lib/trusted-party/trusted-party.service.d.ts +0 -192
- package/lib/trusted-party/trusted-party.types.d.ts +0 -31
- package/lib/two-factor/two-factor.service.d.ts +0 -15
- package/lib/user/user.gql.d.ts +0 -8
- package/lib/user/user.service.d.ts +0 -9
- package/lib/user/user.types.d.ts +0 -16
- package/lib/web-crypto/web-crypto.service.d.ts +0 -5
- package/lifeready-core.d.ts +0 -16
- package/lifeready-core.metadata.json +0 -1
- package/public-api.d.ts +0 -56
|
@@ -1,662 +0,0 @@
|
|
|
1
|
-
var ItemService_1;
|
|
2
|
-
import { __awaiter, __decorate } from "tslib";
|
|
3
|
-
import { Injectable, Injector, NgZone } from '@angular/core';
|
|
4
|
-
import { LrMutation, LrService } from '../api/lr-graphql';
|
|
5
|
-
import { LinkTypeField } from '../api/types';
|
|
6
|
-
import { AuthService } from '../auth/auth.service';
|
|
7
|
-
import { FileUploadService } from '../file-upload/file-upload.service';
|
|
8
|
-
import { KeyFactoryService } from '../key/key-factory.service';
|
|
9
|
-
import { KeyGraphService } from '../key/key-graph.service';
|
|
10
|
-
import { KeyService } from '../key/key.service';
|
|
11
|
-
import { PayloadType } from '../key/key.types';
|
|
12
|
-
import { LockService } from '../lock/lock.service';
|
|
13
|
-
import { KcBadArgumentException } from '../_common/exceptions';
|
|
14
|
-
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
15
|
-
import { ArchiveDirectoryMutation, ArchiveFileMutation, BeginDeleteChildItemLinksWindowMutation, ChangeDirectoryParentsMutation, ChangeFileParentsMutation, CreateDirectoryMutation, CreateFileMutation, DeleteDirectoryMutation, DeleteFileMutation, RevertFileMutation, SetDirectoryConfidentialMutation, SetFileConfidentialMutation, TempDirectoryQuery, UnarchiveDirectoryMutation, UnarchiveFileMutation, UpdateDirectoryMutation, UpdateFileMutation, } from './item.gql';
|
|
16
|
-
import { DirectoryKeyFromDirectoryShareQuery, DirectoryKeyQuery, FileKeyFromFileShareQuery, FileKeyQuery, FileStateKeyQuery, } from './item.gql.private';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "../file-upload/file-upload.service";
|
|
19
|
-
import * as i2 from "../key/key.service";
|
|
20
|
-
import * as i3 from "../key/key-factory.service";
|
|
21
|
-
import * as i4 from "../key/key-graph.service";
|
|
22
|
-
import * as i5 from "../lock/lock.service";
|
|
23
|
-
import * as i6 from "../auth/auth.service";
|
|
24
|
-
let ItemService = ItemService_1 = class ItemService extends LrService {
|
|
25
|
-
constructor(ngZone, injector, fileUploadService, keyService, keyFactory, keyGraph, lockService, authService) {
|
|
26
|
-
super(injector);
|
|
27
|
-
this.ngZone = ngZone;
|
|
28
|
-
this.injector = injector;
|
|
29
|
-
this.fileUploadService = fileUploadService;
|
|
30
|
-
this.keyService = keyService;
|
|
31
|
-
this.keyFactory = keyFactory;
|
|
32
|
-
this.keyGraph = keyGraph;
|
|
33
|
-
this.lockService = lockService;
|
|
34
|
-
this.authService = authService;
|
|
35
|
-
// Caching the temp directory.
|
|
36
|
-
this.tempDirectory = null;
|
|
37
|
-
this.authService.addLogoutListener(() => this.onLogout());
|
|
38
|
-
}
|
|
39
|
-
downloadFileContent(options) {
|
|
40
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
-
const fileContent = yield this.fileUploadService.downloadEncryptedFile(options.fileStateNodeId);
|
|
42
|
-
const fileStateKey = yield this.keyGraph.getKey(options.fileStateKeyId, () => this.getFileStateKeyId(options.fileStateNodeId));
|
|
43
|
-
return this.keyGraph.decryptFromString(fileStateKey, fileContent, {
|
|
44
|
-
payloadType: PayloadType.UINT_8_ARRAY,
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
getDirectoryKeyId(directoryId) {
|
|
49
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
return (yield this.query({
|
|
51
|
-
query: DirectoryKeyQuery,
|
|
52
|
-
variables: {
|
|
53
|
-
id: directoryId,
|
|
54
|
-
},
|
|
55
|
-
})).directory.keyId;
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
getFileKeyId(fileId) {
|
|
59
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
return (yield this.query({
|
|
61
|
-
query: FileKeyQuery,
|
|
62
|
-
variables: {
|
|
63
|
-
id: fileId,
|
|
64
|
-
},
|
|
65
|
-
})).file.keyId;
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
getDirectoryKeyIdFromDirectoryShare(directoryShareId) {
|
|
69
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
-
return (yield this.query({
|
|
71
|
-
query: DirectoryKeyFromDirectoryShareQuery,
|
|
72
|
-
variables: {
|
|
73
|
-
id: directoryShareId,
|
|
74
|
-
},
|
|
75
|
-
})).directoryShare.item.keyId;
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
getFileKeyIdFromFileShare(fileShareId) {
|
|
79
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
-
return (yield this.query({
|
|
81
|
-
query: FileKeyFromFileShareQuery,
|
|
82
|
-
variables: {
|
|
83
|
-
id: fileShareId,
|
|
84
|
-
},
|
|
85
|
-
})).fileShare.item.keyId;
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
getDirectoryKey(directoryId, directoryKeyId) {
|
|
89
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
-
return this.keyGraph.getKey(directoryKeyId, () => this.getDirectoryKeyId(directoryId));
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
getFileKey(fileId, fileKeyId) {
|
|
94
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
-
return this.keyGraph.getKey(fileKeyId, () => this.getFileKeyId(fileId));
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
createDirectory(options) {
|
|
99
|
-
return this.mutate(this.createDirectoryMutation(options));
|
|
100
|
-
}
|
|
101
|
-
createDirectoryMutation(options) {
|
|
102
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
-
return new LrMutation({
|
|
104
|
-
mutation: CreateDirectoryMutation,
|
|
105
|
-
variables: {
|
|
106
|
-
input: yield this.prepareCreateDirectory(options),
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
updateDirectory(options) {
|
|
112
|
-
return this.mutate(this.updateDirectoryMutation(options));
|
|
113
|
-
}
|
|
114
|
-
updateDirectoryMutation(options) {
|
|
115
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
return new LrMutation({
|
|
117
|
-
mutation: UpdateDirectoryMutation,
|
|
118
|
-
variables: {
|
|
119
|
-
input: yield this.prepareUpdateDirectory(options),
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
deleteDirectory(id) {
|
|
125
|
-
return this.mutate(this.deleteDirectoryMutation(id));
|
|
126
|
-
}
|
|
127
|
-
deleteDirectoryMutation(id) {
|
|
128
|
-
return new LrMutation({
|
|
129
|
-
mutation: DeleteDirectoryMutation,
|
|
130
|
-
variables: {
|
|
131
|
-
input: {
|
|
132
|
-
directoryId: id,
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
createFile(options) {
|
|
138
|
-
return this.mutate(this.createFileMutation(options));
|
|
139
|
-
}
|
|
140
|
-
createFileMutation(options) {
|
|
141
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
-
return new LrMutation({
|
|
143
|
-
mutation: CreateFileMutation,
|
|
144
|
-
variables: {
|
|
145
|
-
input: yield this.prepareCreateFile(options),
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
updateFile(options) {
|
|
151
|
-
return this.mutate(this.updateFileMutation(options));
|
|
152
|
-
}
|
|
153
|
-
updateFileMutation(options) {
|
|
154
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
155
|
-
return new LrMutation({
|
|
156
|
-
mutation: UpdateFileMutation,
|
|
157
|
-
variables: {
|
|
158
|
-
input: yield this.prepareUpdateFile(options),
|
|
159
|
-
},
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
revertFile(options) {
|
|
164
|
-
return this.mutate(this.revertFileMutation(options));
|
|
165
|
-
}
|
|
166
|
-
revertFileMutation(options) {
|
|
167
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
168
|
-
return new LrMutation({
|
|
169
|
-
mutation: RevertFileMutation,
|
|
170
|
-
variables: {
|
|
171
|
-
input: options,
|
|
172
|
-
},
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
deleteFile(id) {
|
|
177
|
-
return this.mutate(this.deleteFileMutation(id));
|
|
178
|
-
}
|
|
179
|
-
deleteFileMutation(id) {
|
|
180
|
-
return new LrMutation({
|
|
181
|
-
mutation: DeleteFileMutation,
|
|
182
|
-
variables: {
|
|
183
|
-
input: {
|
|
184
|
-
fileId: id,
|
|
185
|
-
},
|
|
186
|
-
},
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
archiveDirectory(directoryId, options) {
|
|
190
|
-
return this.mutate(this.archiveDirectoryMutation(directoryId, options));
|
|
191
|
-
}
|
|
192
|
-
archiveDirectoryMutation(directoryId, options) {
|
|
193
|
-
return new LrMutation({
|
|
194
|
-
mutation: ArchiveDirectoryMutation,
|
|
195
|
-
variables: {
|
|
196
|
-
input: {
|
|
197
|
-
directoryId,
|
|
198
|
-
recursive: options.recursive,
|
|
199
|
-
},
|
|
200
|
-
},
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
archiveFile(fileId) {
|
|
204
|
-
return this.mutate(this.archiveFileMutation(fileId));
|
|
205
|
-
}
|
|
206
|
-
archiveFileMutation(fileId) {
|
|
207
|
-
return new LrMutation({
|
|
208
|
-
mutation: ArchiveFileMutation,
|
|
209
|
-
variables: {
|
|
210
|
-
input: {
|
|
211
|
-
fileId,
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
unarchiveDirectory(directoryId, options) {
|
|
217
|
-
return this.mutate(this.unarchiveDirectoryMutation(directoryId, options));
|
|
218
|
-
}
|
|
219
|
-
unarchiveDirectoryMutation(directoryId, options) {
|
|
220
|
-
return new LrMutation({
|
|
221
|
-
mutation: UnarchiveDirectoryMutation,
|
|
222
|
-
variables: {
|
|
223
|
-
input: {
|
|
224
|
-
directoryId,
|
|
225
|
-
recursive: options.recursive,
|
|
226
|
-
},
|
|
227
|
-
},
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
unarchiveFile(fileId) {
|
|
231
|
-
return this.mutate(this.unarchiveFileMutation(fileId));
|
|
232
|
-
}
|
|
233
|
-
unarchiveFileMutation(fileId) {
|
|
234
|
-
return new LrMutation({
|
|
235
|
-
mutation: UnarchiveFileMutation,
|
|
236
|
-
variables: {
|
|
237
|
-
input: {
|
|
238
|
-
fileId,
|
|
239
|
-
},
|
|
240
|
-
},
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
changeDirectoryParents(options) {
|
|
244
|
-
return this.mutate(this.changeDirectoryParentsMutation(options));
|
|
245
|
-
}
|
|
246
|
-
changeDirectoryParentsMutation(options) {
|
|
247
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
-
return new LrMutation({
|
|
249
|
-
mutation: ChangeDirectoryParentsMutation,
|
|
250
|
-
variables: {
|
|
251
|
-
input: yield this.prepareChangeDirectoryParents(options),
|
|
252
|
-
},
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
changeFileParents(options) {
|
|
257
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
258
|
-
return this.mutate(this.changeFileParentsMutation(options));
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
changeFileParentsMutation(options) {
|
|
262
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
263
|
-
return new LrMutation({
|
|
264
|
-
mutation: ChangeFileParentsMutation,
|
|
265
|
-
variables: {
|
|
266
|
-
input: yield this.prepareChangeFileParents(options),
|
|
267
|
-
},
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
beginDeleteChildItemLinksWindow(options) {
|
|
272
|
-
return this.mutate(this.beginDeleteChildItemLinksWindowMutation(options));
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Schedule cleanup of the hard links in a directory.
|
|
276
|
-
* The server will delete all hard link within the directory within a time window: starting from now and
|
|
277
|
-
* ending at requestWindowMs after now.
|
|
278
|
-
* The server decides _when_ it will perform the delete. It's not guaranteed that it will perform
|
|
279
|
-
* the delete at "now + requestWindowMs", but it will happen at some time after "now + requestWindowMs".
|
|
280
|
-
* This allows multiple overlapping calls to this function and the server allocates enough for each request.
|
|
281
|
-
* The server has a setting that allows for a maximum value on requestWindowMs. If the requested value
|
|
282
|
-
* is larger than this maximum, the call will fail.
|
|
283
|
-
*/
|
|
284
|
-
beginDeleteChildItemLinksWindowMutation(options) {
|
|
285
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
286
|
-
return new LrMutation({
|
|
287
|
-
mutation: BeginDeleteChildItemLinksWindowMutation,
|
|
288
|
-
variables: {
|
|
289
|
-
input: options,
|
|
290
|
-
},
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
*
|
|
296
|
-
* This method may raise VERSION_MISMATCH exception if there is a race condition
|
|
297
|
-
* when multiple clients try to create the temp directory.
|
|
298
|
-
*
|
|
299
|
-
* TODO There is a retry mechanism in graphql with exponential back off but that's internal.
|
|
300
|
-
* But need to use an exponential back off lib if we want to retry here.
|
|
301
|
-
*
|
|
302
|
-
* @returns The ID of the temp directory
|
|
303
|
-
*
|
|
304
|
-
*/
|
|
305
|
-
ensureTempDirectory() {
|
|
306
|
-
var _a;
|
|
307
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
308
|
-
if (this.tempDirectory) {
|
|
309
|
-
return this.tempDirectory;
|
|
310
|
-
}
|
|
311
|
-
const existing = yield this.query({
|
|
312
|
-
query: TempDirectoryQuery,
|
|
313
|
-
variables: {
|
|
314
|
-
plainMeta: ItemService_1.TEMP_DIRECTORY_PLAIN_META_FILTER,
|
|
315
|
-
},
|
|
316
|
-
});
|
|
317
|
-
if (existing.rootDirectories.edges.length > 1) {
|
|
318
|
-
console.error(`There is more than 1 temp directory (plainMeta filter: ${ItemService_1.TEMP_DIRECTORY_PLAIN_META_FILTER})`);
|
|
319
|
-
}
|
|
320
|
-
if (existing.rootDirectories.edges.length === 0) {
|
|
321
|
-
// Doesn't exist yet, create it
|
|
322
|
-
const createDirectory = yield this.createDirectoryMutation({
|
|
323
|
-
asRootDirectory: true,
|
|
324
|
-
plainMetaJson: ItemService_1.TEMP_DIRECTORY_PLAIN_META,
|
|
325
|
-
});
|
|
326
|
-
// Optimistic lock on the current user.
|
|
327
|
-
const updateLock = this.lockService.updateLockMutation({
|
|
328
|
-
version: (_a = existing.lock) === null || _a === void 0 ? void 0 : _a.version,
|
|
329
|
-
});
|
|
330
|
-
// Because this.mutate() only handles simple types we need to use the more
|
|
331
|
-
// advanced this.lrGraphQL.lrMutate()
|
|
332
|
-
const [createDirectoryResult] = yield this.lrGraphQL.lrMutate([
|
|
333
|
-
createDirectory,
|
|
334
|
-
updateLock,
|
|
335
|
-
]);
|
|
336
|
-
const { id, keyId } = createDirectoryResult.createDirectory.directory;
|
|
337
|
-
this.tempDirectory = {
|
|
338
|
-
id,
|
|
339
|
-
keyId,
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
else {
|
|
343
|
-
// Return existing temp
|
|
344
|
-
const { id, keyId } = existing.rootDirectories.edges[0].node;
|
|
345
|
-
this.tempDirectory = {
|
|
346
|
-
id,
|
|
347
|
-
keyId,
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
return this.tempDirectory;
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
createDirectoryWithStaging(options) {
|
|
354
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
355
|
-
return this.mutate(this.createDirectoryWithStagingMutation(options));
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* You must run this mutation within the temp directory cleanup window on the
|
|
360
|
-
* server, otherwise the temp directory will get cleaned up.
|
|
361
|
-
*
|
|
362
|
-
*/
|
|
363
|
-
createDirectoryWithStagingMutation(options) {
|
|
364
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
365
|
-
const tempDir = yield this.ensureTempDirectory();
|
|
366
|
-
// Clear the temp directory of the ones we are about to create.
|
|
367
|
-
// NOTE: this mutation can not be merged into a single mutation with the
|
|
368
|
-
// the createDirectory mutation because it uses the current server time to
|
|
369
|
-
// clean up. So it must successfully complete before the creation of the
|
|
370
|
-
// directories.
|
|
371
|
-
yield this.beginDeleteChildItemLinksWindow({
|
|
372
|
-
directoryId: tempDir.id,
|
|
373
|
-
requestWindowMs: options.requestWindowMs,
|
|
374
|
-
});
|
|
375
|
-
// Create the directory that has contents
|
|
376
|
-
const directory = (yield this.createDirectory({
|
|
377
|
-
cipherMetaClearJson: options.cipherMetaClearJson,
|
|
378
|
-
parentDirectories: [
|
|
379
|
-
{
|
|
380
|
-
directory: tempDir,
|
|
381
|
-
},
|
|
382
|
-
],
|
|
383
|
-
plainMetaJson: options.plainMetaJson,
|
|
384
|
-
})).createDirectory.directory;
|
|
385
|
-
// Call back with item that's currently in staging.
|
|
386
|
-
yield options.onCreatedInStaging({
|
|
387
|
-
id: directory.id,
|
|
388
|
-
keyId: directory.keyId,
|
|
389
|
-
});
|
|
390
|
-
// TODO client-side check for timeout on requestWindowMs
|
|
391
|
-
// TODO return the server time where delete is scheduled. Expirable mutation
|
|
392
|
-
// Return the mutation that moves the directory into the dst directories
|
|
393
|
-
return this.changeDirectoryParentsMutation({
|
|
394
|
-
directoryId: directory.id,
|
|
395
|
-
directoryKeyId: directory.keyId,
|
|
396
|
-
parentsToRemove: [tempDir.id],
|
|
397
|
-
parentsToAdd: options.parentDirectories,
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
createFileWithStaging(options) {
|
|
402
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
403
|
-
return this.mutate(this.createFileWithStagingMutation(options));
|
|
404
|
-
});
|
|
405
|
-
}
|
|
406
|
-
createFileWithStagingMutation(options) {
|
|
407
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
408
|
-
const tempDir = yield this.ensureTempDirectory();
|
|
409
|
-
// Clear the temp directory of the ones we are about to create.
|
|
410
|
-
// NOTE: this mutation can not be merged into a single mutation with the
|
|
411
|
-
// the createDirectory mutation because it uses the current server time to
|
|
412
|
-
// clean up. So it must successfully complete before the creation of the
|
|
413
|
-
// directories.
|
|
414
|
-
yield this.beginDeleteChildItemLinksWindow({
|
|
415
|
-
directoryId: tempDir.id,
|
|
416
|
-
requestWindowMs: options.requestWindowMs,
|
|
417
|
-
});
|
|
418
|
-
// Create the file
|
|
419
|
-
const file = (yield this.createFile(Object.assign(Object.assign({}, options), { parentDirectories: [
|
|
420
|
-
{
|
|
421
|
-
directory: tempDir,
|
|
422
|
-
},
|
|
423
|
-
] }))).createFile.file;
|
|
424
|
-
// Call back with item that's currently in staging.
|
|
425
|
-
yield options.onCreatedInStaging({
|
|
426
|
-
id: file.id,
|
|
427
|
-
keyId: file.keyId,
|
|
428
|
-
});
|
|
429
|
-
// TODO client-side check for timeout on requestWindowMs
|
|
430
|
-
// TODO return the server time where delete is scheduled. Expirable mutation
|
|
431
|
-
// Return the mutation that moves the directory into the dst directories
|
|
432
|
-
return this.changeFileParentsMutation({
|
|
433
|
-
file,
|
|
434
|
-
parentsToRemove: [tempDir.id],
|
|
435
|
-
parentsToAdd: options.parentDirectories,
|
|
436
|
-
});
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
setFileConfidential(options) {
|
|
440
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
441
|
-
return this.mutate(this.setFileConfidentialMutation(options));
|
|
442
|
-
});
|
|
443
|
-
}
|
|
444
|
-
setFileConfidentialMutation(options) {
|
|
445
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
446
|
-
return new LrMutation({
|
|
447
|
-
mutation: SetFileConfidentialMutation,
|
|
448
|
-
variables: {
|
|
449
|
-
input: {
|
|
450
|
-
fileId: options.fileId,
|
|
451
|
-
confidential: options.confidential,
|
|
452
|
-
},
|
|
453
|
-
},
|
|
454
|
-
});
|
|
455
|
-
});
|
|
456
|
-
}
|
|
457
|
-
setDirectoryConfidential(options) {
|
|
458
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
459
|
-
return this.mutate(this.setDirectoryConfidentialMutation(options));
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
setDirectoryConfidentialMutation(options) {
|
|
463
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
464
|
-
return new LrMutation({
|
|
465
|
-
mutation: SetDirectoryConfidentialMutation,
|
|
466
|
-
variables: {
|
|
467
|
-
input: {
|
|
468
|
-
directoryId: options.directoryId,
|
|
469
|
-
confidential: options.confidential,
|
|
470
|
-
},
|
|
471
|
-
},
|
|
472
|
-
});
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
// ------------------------------------------------------------------------------
|
|
476
|
-
// ------------------------------------------------------------------------------
|
|
477
|
-
// Helpers
|
|
478
|
-
// ------------------------------------------------------------------------------
|
|
479
|
-
// ------------------------------------------------------------------------------
|
|
480
|
-
prepareParentDirectory(options, newKey) {
|
|
481
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
482
|
-
const { directoryId: _directoryId, wrappingKeyId: _wrappingKeyId, linkType, } = options;
|
|
483
|
-
const directory = options.directory || {
|
|
484
|
-
id: _directoryId,
|
|
485
|
-
keyId: _wrappingKeyId,
|
|
486
|
-
};
|
|
487
|
-
if (linkType == LinkTypeField.REFERENCE) {
|
|
488
|
-
return {
|
|
489
|
-
directoryId: directory.id,
|
|
490
|
-
linkType,
|
|
491
|
-
};
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
// If directory's key is not already in the key graph, then need to
|
|
495
|
-
// fetch the directory's key.
|
|
496
|
-
const wrappingKey = yield this.getDirectoryKey(directory.id, directory.keyId);
|
|
497
|
-
return {
|
|
498
|
-
directoryId: directory.id,
|
|
499
|
-
wrappingKeyId: wrappingKey.id,
|
|
500
|
-
wrappedKey: yield this.keyGraph.wrapKey(wrappingKey, newKey),
|
|
501
|
-
linkType,
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
getFileStateKeyId(fileStateNodeId) {
|
|
507
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
508
|
-
return (yield this.query({
|
|
509
|
-
query: FileStateKeyQuery,
|
|
510
|
-
variables: {
|
|
511
|
-
id: fileStateNodeId,
|
|
512
|
-
},
|
|
513
|
-
})).fileState.keyId;
|
|
514
|
-
});
|
|
515
|
-
}
|
|
516
|
-
prepareCreateFileState(fileKey, options) {
|
|
517
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
518
|
-
// Each version of the file is encrypted using a new key.
|
|
519
|
-
const fileStateKey = yield this.keyFactory.createKey();
|
|
520
|
-
const fileContent = options.file && (yield this.fileUploadService.loadFile(options.file));
|
|
521
|
-
let contentResource;
|
|
522
|
-
if (fileContent) {
|
|
523
|
-
const cipherFileContent = yield this.keyGraph.encryptToString(fileStateKey, fileContent);
|
|
524
|
-
if (options.upload) {
|
|
525
|
-
contentResource = yield options.upload(cipherFileContent);
|
|
526
|
-
}
|
|
527
|
-
else {
|
|
528
|
-
contentResource = yield this.fileUploadService.uploadEncryptedFile({
|
|
529
|
-
encryptedContent: cipherFileContent,
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
return Object.assign(Object.assign({}, (yield this.prepareItem(fileStateKey, options))), { wrappedStateKey: yield this.keyGraph.wrapKey(fileKey, fileStateKey), contentResource });
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
prepareChangeItemParents(options, itemKey) {
|
|
537
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
538
|
-
const parentsToAdd = options.parentsToAdd
|
|
539
|
-
? yield Promise.all(options.parentsToAdd.map((t) => this.prepareParentDirectory(t, itemKey)))
|
|
540
|
-
: [];
|
|
541
|
-
return {
|
|
542
|
-
directoriesToRemove: options.parentsToRemove || [],
|
|
543
|
-
directoriesToAdd: parentsToAdd,
|
|
544
|
-
};
|
|
545
|
-
});
|
|
546
|
-
}
|
|
547
|
-
prepareItem(key, options) {
|
|
548
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
549
|
-
const { plainMetaJson, cipherMetaClearJson } = options;
|
|
550
|
-
return {
|
|
551
|
-
plainMeta: plainMetaJson && JSON.stringify(plainMetaJson),
|
|
552
|
-
cipherMeta: cipherMetaClearJson &&
|
|
553
|
-
(yield this.keyGraph.encryptToString(key, cipherMetaClearJson)),
|
|
554
|
-
};
|
|
555
|
-
});
|
|
556
|
-
}
|
|
557
|
-
prepareCreateDirectory(options) {
|
|
558
|
-
var _a, _b, _c;
|
|
559
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
560
|
-
const directoryKey = yield this.keyFactory.createKey();
|
|
561
|
-
options.parentDirectories = options.parentDirectories || [];
|
|
562
|
-
if (!options.asRootDirectory && !((_a = options.parentDirectories) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
563
|
-
throw new KcBadArgumentException('A new directory must be either a root directory or a sub-directory. So you must provide either parentDirectories or asRootDirectory parameter.');
|
|
564
|
-
}
|
|
565
|
-
if (options.asRootDirectory && ((_b = options.parentDirectories) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
566
|
-
throw new KcBadArgumentException('A new directory must be either a root directory or a sub-directory. So you can only provide either parentDirectories or asRootDirectory parameter.');
|
|
567
|
-
}
|
|
568
|
-
const parentDirectories = yield Promise.all((_c = options.parentDirectories) === null || _c === void 0 ? void 0 : _c.map((t) => this.prepareParentDirectory(t, directoryKey)));
|
|
569
|
-
// TODO this is rather an unfortunate name, change it to asRootDirectory.
|
|
570
|
-
let parentRootDirectory;
|
|
571
|
-
if (options.asRootDirectory) {
|
|
572
|
-
const rootKey = this.keyService.currentRootKey;
|
|
573
|
-
parentRootDirectory = {
|
|
574
|
-
wrappingKeyId: rootKey.id,
|
|
575
|
-
wrappedKey: yield this.keyGraph.wrapKey(rootKey, directoryKey),
|
|
576
|
-
};
|
|
577
|
-
}
|
|
578
|
-
const itemInput = yield this.prepareItem(directoryKey, options);
|
|
579
|
-
return Object.assign(Object.assign({}, itemInput), { parentDirectories,
|
|
580
|
-
parentRootDirectory });
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
prepareUpdateDirectory(options) {
|
|
584
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
585
|
-
const directoryKey = yield this.getDirectoryKey(options.directoryId, options.directoryKeyId);
|
|
586
|
-
const itemInput = yield this.prepareItem(directoryKey.jwk, options);
|
|
587
|
-
return Object.assign(Object.assign({}, itemInput), { directoryId: options.directoryId });
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
prepareCreateFile(options) {
|
|
591
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
592
|
-
const fileKey = yield this.keyFactory.createKey();
|
|
593
|
-
const parentDirectories = yield Promise.all(options.parentDirectories.map((t) => this.prepareParentDirectory(t, fileKey)));
|
|
594
|
-
const input = yield this.prepareCreateFileState(fileKey, options);
|
|
595
|
-
return Object.assign(Object.assign({}, input), { parentDirectories });
|
|
596
|
-
});
|
|
597
|
-
}
|
|
598
|
-
prepareUpdateFile(options) {
|
|
599
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
600
|
-
const fileKey = yield this.getFileKey(options.fileId, options.fileKeyId);
|
|
601
|
-
const input = yield this.prepareCreateFileState(fileKey.jwk, options);
|
|
602
|
-
return Object.assign(Object.assign({}, input), { fileId: options.fileId });
|
|
603
|
-
});
|
|
604
|
-
}
|
|
605
|
-
prepareChangeDirectoryParents(options) {
|
|
606
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
607
|
-
const directory = options.directory || {
|
|
608
|
-
id: options.directoryId,
|
|
609
|
-
keyId: options.directoryKeyId,
|
|
610
|
-
};
|
|
611
|
-
const directoryKey = yield this.getDirectoryKey(directory.id, directory.keyId);
|
|
612
|
-
const input = yield this.prepareChangeItemParents(options, directoryKey.jwk);
|
|
613
|
-
return Object.assign(Object.assign({}, input), { directoryId: directory.id });
|
|
614
|
-
});
|
|
615
|
-
}
|
|
616
|
-
prepareChangeFileParents(options) {
|
|
617
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
618
|
-
const file = options.file || {
|
|
619
|
-
id: options.fileId,
|
|
620
|
-
keyId: options.fileKeyId,
|
|
621
|
-
};
|
|
622
|
-
const fileKey = yield this.getFileKey(file.id, file.keyId);
|
|
623
|
-
const input = yield this.prepareChangeItemParents(options, fileKey.jwk);
|
|
624
|
-
return Object.assign(Object.assign({}, input), { fileId: file.id });
|
|
625
|
-
});
|
|
626
|
-
}
|
|
627
|
-
onLogout() {
|
|
628
|
-
// Clear all cached data.
|
|
629
|
-
this.tempDirectory = null;
|
|
630
|
-
}
|
|
631
|
-
};
|
|
632
|
-
ItemService.TEMP_DIRECTORY_PLAIN_META = { kcType: 'temp' };
|
|
633
|
-
ItemService.TEMP_DIRECTORY_PLAIN_META_FILTER = JSON.stringify({
|
|
634
|
-
filter: [
|
|
635
|
-
{
|
|
636
|
-
contains: ItemService_1.TEMP_DIRECTORY_PLAIN_META,
|
|
637
|
-
},
|
|
638
|
-
],
|
|
639
|
-
});
|
|
640
|
-
ItemService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ItemService_Factory() { return new ItemService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.FileUploadService), i0.ɵɵinject(i2.KeyService), i0.ɵɵinject(i3.KeyFactoryService), i0.ɵɵinject(i4.KeyGraphService), i0.ɵɵinject(i5.LockService), i0.ɵɵinject(i6.AuthService)); }, token: ItemService, providedIn: "root" });
|
|
641
|
-
ItemService.decorators = [
|
|
642
|
-
{ type: Injectable, args: [{
|
|
643
|
-
providedIn: 'root',
|
|
644
|
-
},] }
|
|
645
|
-
];
|
|
646
|
-
ItemService.ctorParameters = () => [
|
|
647
|
-
{ type: NgZone },
|
|
648
|
-
{ type: Injector },
|
|
649
|
-
{ type: FileUploadService },
|
|
650
|
-
{ type: KeyService },
|
|
651
|
-
{ type: KeyFactoryService },
|
|
652
|
-
{ type: KeyGraphService },
|
|
653
|
-
{ type: LockService },
|
|
654
|
-
{ type: AuthService }
|
|
655
|
-
];
|
|
656
|
-
ItemService = ItemService_1 = __decorate([
|
|
657
|
-
RunOutsideAngular({
|
|
658
|
-
ngZoneName: 'ngZone',
|
|
659
|
-
})
|
|
660
|
-
], ItemService);
|
|
661
|
-
export { ItemService };
|
|
662
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2l0ZW0vaXRlbS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxFQUFrQixhQUFhLEVBQWtCLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsdUNBQXVDLEVBQ3ZDLDhCQUE4QixFQUM5Qix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixnQ0FBZ0MsRUFDaEMsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFD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QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV4RSx1Q0FDSyxLQUFLLEtBQ1IsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQ2Y7UUFDSixDQUFDO0tBQUE7SUFFTyxRQUFRO1FBQ2QseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFBO0FBeHVCUSxxQ0FBeUIsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMvQyw0Q0FBZ0MsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZELE1BQU0sRUFBRTtRQUNOO1lBQ0UsUUFBUSxFQUFFLGFBQVcsQ0FBQyx5QkFBeUI7U0FDaEQ7S0FDRjtDQUNGLENBQUMsQ0FBQzs7O1lBNUJKLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBbkU4QixNQUFNO1lBQWhCLFFBQVE7WUFLcEIsaUJBQWlCO1lBR2pCLFVBQVU7WUFGVixpQkFBaUI7WUFDakIsZUFBZTtZQUdmLFdBQVc7WUFOWCxXQUFXOztBQWdFUCxXQUFXO0lBTnZCLGlCQUFpQixDQUFDO1FBQ2pCLFVBQVUsRUFBRSxRQUFRO0tBQ3JCLENBQUM7R0FJVyxXQUFXLENBMHZCdkI7U0ExdkJZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgTHJNdXRhdGlvbiwgTHJTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2xyLWdyYXBocWwnO1xuaW1wb3J0IHsgSUQsIEpTT05PYmplY3QsIExpbmtUeXBlRmllbGQsIExyUmVsYXlJZElucHV0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vYXV0aC9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZFNlcnZpY2UgfSBmcm9tICcuLi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4va2V5L2tleS1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4va2V5L2tleS1ncmFwaC5zZXJ2aWNlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGF5bG9hZFR5cGUgfSBmcm9tICcuLi9rZXkva2V5LnR5cGVzJztcbmltcG9ydCB7IExvY2tTZXJ2aWNlIH0gZnJvbSAnLi4vbG9jay9sb2NrLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbiB9IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyBSdW5PdXRzaWRlQW5ndWxhciB9IGZyb20gJy4uL19jb21tb24vcnVuLW91dHNpZGUtYW5ndWxhcic7XG5pbXBvcnQge1xuICBBcmNoaXZlRGlyZWN0b3J5TXV0YXRpb24sXG4gIEFyY2hpdmVGaWxlTXV0YXRpb24sXG4gIEJlZ2luRGVsZXRlQ2hpbGRJdGVtTGlua3NXaW5kb3dNdXRhdGlvbixcbiAgQ2hhbmdlRGlyZWN0b3J5UGFyZW50c011dGF0aW9uLFxuICBDaGFuZ2VGaWxlUGFyZW50c011dGF0aW9uLFxuICBDcmVhdGVEaXJlY3RvcnlNdXRhdGlvbixcbiAgQ3JlYXRlRmlsZU11dGF0aW9uLFxuICBEZWxldGVEaXJlY3RvcnlNdXRhdGlvbixcbiAgRGVsZXRlRmlsZU11dGF0aW9uLFxuICBSZXZlcnRGaWxlTXV0YXRpb24sXG4gIFNldERpcmVjdG9yeUNvbmZpZGVudGlhbE11dGF0aW9uLFxuICBTZXRGaWxlQ29uZmlkZW50aWFsTXV0YXRpb24sXG4gIFRlbXBEaXJlY3RvcnlRdWVyeSxcbiAgVW5hcmNoaXZlRGlyZWN0b3J5TXV0YXRpb24sXG4gIFVuYXJjaGl2ZUZpbGVNdXRhdGlvbixcbiAgVXBkYXRlRGlyZWN0b3J5TXV0YXRpb24sXG4gIFVwZGF0ZUZpbGVNdXRhdGlvbixcbn0gZnJvbSAnLi9pdGVtLmdxbCc7XG5pbXBvcnQge1xuICBEaXJlY3RvcnlLZXlGcm9tRGlyZWN0b3J5U2hhcmVRdWVyeSxcbiAgRGlyZWN0b3J5S2V5UXVlcnksXG4gIEZpbGVLZXlGcm9tRmlsZVNoYXJlUXVlcnksXG4gIEZpbGVLZXlRdWVyeSxcbiAgRmlsZVN0YXRlS2V5UXVlcnksXG59IGZyb20gJy4vaXRlbS5ncWwucHJpdmF0ZSc7XG5pbXBvcnQge1xuICBBcmNoaXZlRGlyZWN0b3J5T3B0aW9ucyxcbiAgQmVnaW5EZWxldGVDaGlsZEl0ZW1MaW5rc1dpbmRvd09wdGlvbnMsXG4gIENoYW5nZURpcmVjdG9yeVBhcmVudHNPcHRpb25zLFxuICBDaGFuZ2VGaWxlUGFyZW50c09wdGlvbnMsXG4gIENoYW5nZUl0ZW1QYXJlbnRzT3B0aW9ucyxcbiAgQ3JlYXRlRGlyZWN0b3J5T3B0aW9ucyxcbiAgQ3JlYXRlRGlyZWN0b3J5V2l0aFN0YWdpbmdPcHRpb25zLFxuICBDcmVhdGVGaWxlT3B0aW9ucyxcbiAgQ3JlYXRlRmlsZVdpdGhTdGFnaW5nT3B0aW9ucyxcbiAgRG93bmxvYWRGaWxlQ29udGVudE9wdGlvbnMsXG4gIElkS2V5UGFpcixcbiAgUGFyZW50RGlyZWN0b3J5SW5wdXQsXG4gIFBhcmVudERpcmVjdG9yeU9wdGlvbnMsXG4gIFBhcmVudFJvb3REaXJlY3RvcnlJbnB1dCxcbiAgUmV2ZXJ0RmlsZU9wdGlvbnMsXG4gIFNldERpcmVjdG9yeUNvbmZpZGVudGlhbE9wdGlvbnMsXG4gIFNldEZpbGVDb25maWRlbnRpYWxPcHRpb25zLFxuICBVbmFyY2hpdmVEaXJlY3RvcnlPcHRpb25zLFxuICBVcGRhdGVEaXJlY3RvcnlPcHRpb25zLFxuICBVcGRhdGVGaWxlT3B0aW9ucyxcbn0gZnJvbSAnLi9pdGVtLnR5cGVzJztcblxuQFJ1bk91dHNpZGVBbmd1bGFyKHtcbiAgbmdab25lTmFtZTogJ25nWm9uZScsXG59KVxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1TZXJ2aWNlIGV4dGVuZHMgTHJTZXJ2aWNlIHtcbiAgLy8gQ2FjaGluZyB0aGUgdGVtcCBkaXJlY3RvcnkuXG4gIHByaXZhdGUgdGVtcERpcmVjdG9yeTogSWRLZXlQYWlyID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgZmlsZVVwbG9hZFNlcnZpY2U6IEZpbGVVcGxvYWRTZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcbiAgICBwcml2YXRlIGtleUZhY3Rvcnk6IEtleUZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5R3JhcGg6IEtleUdyYXBoU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2tTZXJ2aWNlOiBMb2NrU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZVxuICApIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgdGhpcy5hdXRoU2VydmljZS5hZGRMb2dvdXRMaXN0ZW5lcigoKSA9PiB0aGlzLm9uTG9nb3V0KCkpO1xuICB9XG5cbiAgc3RhdGljIFRFTVBfRElSRUNUT1JZX1BMQUlOX01FVEEgPSB7IGtjVHlwZTogJ3RlbXAnIH07XG4gIHN0YXRpYyBURU1QX0RJUkVDVE9SWV9QTEFJTl9NRVRBX0ZJTFRFUiA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBmaWx0ZXI6IFtcbiAgICAgIHtcbiAgICAgICAgY29udGFpbnM6IEl0ZW1TZXJ2aWNlLlRFTVBfRElSRUNUT1JZX1BMQUlOX01FVEEsXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIGFzeW5jIGRvd25sb2FkRmlsZUNvbnRlbnQoXG4gICAgb3B0aW9uczogRG93bmxvYWRGaWxlQ29udGVudE9wdGlvbnNcbiAgKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVVcGxvYWRTZXJ2aWNlLmRvd25sb2FkRW5jcnlwdGVkRmlsZShcbiAgICAgIG9wdGlvbnMuZmlsZVN0YXRlTm9kZUlkXG4gICAgKTtcblxuICAgIGNvbnN0IGZpbGVTdGF0ZUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KFxuICAgICAgb3B0aW9ucy5maWxlU3RhdGVLZXlJZCxcbiAgICAgICgpID0+IHRoaXMuZ2V0RmlsZVN0YXRlS2V5SWQob3B0aW9ucy5maWxlU3RhdGVOb2RlSWQpXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLmtleUdyYXBoLmRlY3J5cHRGcm9tU3RyaW5nKGZpbGVTdGF0ZUtleSwgZmlsZUNvbnRlbnQsIHtcbiAgICAgIHBheWxvYWRUeXBlOiBQYXlsb2FkVHlwZS5VSU5UXzhfQVJSQVksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXREaXJlY3RvcnlLZXlJZChkaXJlY3RvcnlJZDogTHJSZWxheUlkSW5wdXQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgdGhpcy5xdWVyeSh7XG4gICAgICAgIHF1ZXJ5OiBEaXJlY3RvcnlLZXlRdWVyeSxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgaWQ6IGRpcmVjdG9yeUlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLmRpcmVjdG9yeS5rZXlJZDtcbiAgfVxuXG4gIGFzeW5jIGdldEZpbGVLZXlJZChmaWxlSWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoe1xuICAgICAgICBxdWVyeTogRmlsZUtleVF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLmZpbGUua2V5SWQ7XG4gIH1cblxuICBhc3luYyBnZXREaXJlY3RvcnlLZXlJZEZyb21EaXJlY3RvcnlTaGFyZShkaXJlY3RvcnlTaGFyZUlkOiBMclJlbGF5SWRJbnB1dCkge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KHtcbiAgICAgICAgcXVlcnk6IERpcmVjdG9yeUtleUZyb21EaXJlY3RvcnlTaGFyZVF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBpZDogZGlyZWN0b3J5U2hhcmVJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKS5kaXJlY3RvcnlTaGFyZS5pdGVtLmtleUlkO1xuICB9XG5cbiAgYXN5bmMgZ2V0RmlsZUtleUlkRnJvbUZpbGVTaGFyZShmaWxlU2hhcmVJZDogTHJSZWxheUlkSW5wdXQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgdGhpcy5xdWVyeSh7XG4gICAgICAgIHF1ZXJ5OiBGaWxlS2V5RnJvbUZpbGVTaGFyZVF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBpZDogZmlsZVNoYXJlSWQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICkuZmlsZVNoYXJlLml0ZW0ua2V5SWQ7XG4gIH1cblxuICBhc3luYyBnZXREaXJlY3RvcnlLZXkoXG4gICAgZGlyZWN0b3J5SWQ6IExyUmVsYXlJZElucHV0LFxuICAgIGRpcmVjdG9yeUtleUlkPzogTHJSZWxheUlkSW5wdXRcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMua2V5R3JhcGguZ2V0S2V5KGRpcmVjdG9yeUtleUlkLCAoKSA9PlxuICAgICAgdGhpcy5nZXREaXJlY3RvcnlLZXlJZChkaXJlY3RvcnlJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0RmlsZUtleShmaWxlSWQ6IExyUmVsYXlJZElucHV0LCBmaWxlS2V5SWQ/OiBMclJlbGF5SWRJbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmtleUdyYXBoLmdldEtleShmaWxlS2V5SWQsICgpID0+IHRoaXMuZ2V0RmlsZUtleUlkKGZpbGVJZCkpO1xuICB9XG5cbiAgY3JlYXRlRGlyZWN0b3J5KG9wdGlvbnM6IENyZWF0ZURpcmVjdG9yeU9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5jcmVhdGVEaXJlY3RvcnlNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVEaXJlY3RvcnlNdXRhdGlvbihvcHRpb25zOiBDcmVhdGVEaXJlY3RvcnlPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBDcmVhdGVEaXJlY3RvcnlNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDogYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlRGlyZWN0b3J5KG9wdGlvbnMpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZURpcmVjdG9yeShvcHRpb25zOiBVcGRhdGVEaXJlY3RvcnlPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMudXBkYXRlRGlyZWN0b3J5TXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGlyZWN0b3J5TXV0YXRpb24ob3B0aW9uczogVXBkYXRlRGlyZWN0b3J5T3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlRGlyZWN0b3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZURpcmVjdG9yeShvcHRpb25zKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBkZWxldGVEaXJlY3RvcnkoaWQ6IElEKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuZGVsZXRlRGlyZWN0b3J5TXV0YXRpb24oaWQpKTtcbiAgfVxuXG4gIGRlbGV0ZURpcmVjdG9yeU11dGF0aW9uKGlkOiBJRCkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogRGVsZXRlRGlyZWN0b3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBkaXJlY3RvcnlJZDogaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRmlsZShvcHRpb25zOiBDcmVhdGVGaWxlT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNyZWF0ZUZpbGVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaWxlTXV0YXRpb24ob3B0aW9uczogQ3JlYXRlRmlsZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IENyZWF0ZUZpbGVNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDogYXdhaXQgdGhpcy5wcmVwYXJlQ3JlYXRlRmlsZShvcHRpb25zKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVGaWxlKG9wdGlvbnM6IFVwZGF0ZUZpbGVPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMudXBkYXRlRmlsZU11dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpbGVNdXRhdGlvbihvcHRpb25zOiBVcGRhdGVGaWxlT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlRmlsZU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVGaWxlKG9wdGlvbnMpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldmVydEZpbGUob3B0aW9uczogUmV2ZXJ0RmlsZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5yZXZlcnRGaWxlTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgcmV2ZXJ0RmlsZU11dGF0aW9uKG9wdGlvbnM6IFJldmVydEZpbGVPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBSZXZlcnRGaWxlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlRmlsZShpZDogSUQpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5kZWxldGVGaWxlTXV0YXRpb24oaWQpKTtcbiAgfVxuXG4gIGRlbGV0ZUZpbGVNdXRhdGlvbihpZDogSUQpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IERlbGV0ZUZpbGVNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGZpbGVJZDogaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXJjaGl2ZURpcmVjdG9yeShkaXJlY3RvcnlJZDogc3RyaW5nLCBvcHRpb25zOiBBcmNoaXZlRGlyZWN0b3J5T3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmFyY2hpdmVEaXJlY3RvcnlNdXRhdGlvbihkaXJlY3RvcnlJZCwgb3B0aW9ucykpO1xuICB9XG5cbiAgYXJjaGl2ZURpcmVjdG9yeU11dGF0aW9uKFxuICAgIGRpcmVjdG9yeUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogQXJjaGl2ZURpcmVjdG9yeU9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBBcmNoaXZlRGlyZWN0b3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBkaXJlY3RvcnlJZCxcbiAgICAgICAgICByZWN1cnNpdmU6IG9wdGlvbnMucmVjdXJzaXZlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFyY2hpdmVGaWxlKGZpbGVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuYXJjaGl2ZUZpbGVNdXRhdGlvbihmaWxlSWQpKTtcbiAgfVxuXG4gIGFyY2hpdmVGaWxlTXV0YXRpb24oZmlsZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IEFyY2hpdmVGaWxlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBmaWxlSWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdW5hcmNoaXZlRGlyZWN0b3J5KGRpcmVjdG9yeUlkOiBzdHJpbmcsIG9wdGlvbnM6IFVuYXJjaGl2ZURpcmVjdG9yeU9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy51bmFyY2hpdmVEaXJlY3RvcnlNdXRhdGlvbihkaXJlY3RvcnlJZCwgb3B0aW9ucykpO1xuICB9XG5cbiAgdW5hcmNoaXZlRGlyZWN0b3J5TXV0YXRpb24oXG4gICAgZGlyZWN0b3J5SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBVbmFyY2hpdmVEaXJlY3RvcnlPcHRpb25zXG4gICkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVW5hcmNoaXZlRGlyZWN0b3J5TXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBkaXJlY3RvcnlJZCxcbiAgICAgICAgICByZWN1cnNpdmU6IG9wdGlvbnMucmVjdXJzaXZlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHVuYXJjaGl2ZUZpbGUoZmlsZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy51bmFyY2hpdmVGaWxlTXV0YXRpb24oZmlsZUlkKSk7XG4gIH1cblxuICB1bmFyY2hpdmVGaWxlTXV0YXRpb24oZmlsZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFVuYXJjaGl2ZUZpbGVNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGZpbGVJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VEaXJlY3RvcnlQYXJlbnRzKG9wdGlvbnM6IENoYW5nZURpcmVjdG9yeVBhcmVudHNPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY2hhbmdlRGlyZWN0b3J5UGFyZW50c011dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIGNoYW5nZURpcmVjdG9yeVBhcmVudHNNdXRhdGlvbihvcHRpb25zOiBDaGFuZ2VEaXJlY3RvcnlQYXJlbnRzT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogQ2hhbmdlRGlyZWN0b3J5UGFyZW50c011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiBhd2FpdCB0aGlzLnByZXBhcmVDaGFuZ2VEaXJlY3RvcnlQYXJlbnRzKG9wdGlvbnMpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNoYW5nZUZpbGVQYXJlbnRzKG9wdGlvbnM6IENoYW5nZUZpbGVQYXJlbnRzT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNoYW5nZUZpbGVQYXJlbnRzTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgY2hhbmdlRmlsZVBhcmVudHNNdXRhdGlvbihvcHRpb25zOiBDaGFuZ2VGaWxlUGFyZW50c09wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IENoYW5nZUZpbGVQYXJlbnRzTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IGF3YWl0IHRoaXMucHJlcGFyZUNoYW5nZUZpbGVQYXJlbnRzKG9wdGlvbnMpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGJlZ2luRGVsZXRlQ2hpbGRJdGVtTGlua3NXaW5kb3coXG4gICAgb3B0aW9uczogQmVnaW5EZWxldGVDaGlsZEl0ZW1MaW5rc1dpbmRvd09wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuYmVnaW5EZWxldGVDaGlsZEl0ZW1MaW5rc1dpbmRvd011dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZSBjbGVhbnVwIG9mIHRoZSBoYXJkIGxpbmtzIGluIGEgZGlyZWN0b3J5LlxuICAgKiBUaGUgc2VydmVyIHdpbGwgZGVsZXRlIGFsbCBoYXJkIGxpbmsgd2l0aGluIHRoZSBkaXJlY3Rvcnkgd2l0aGluIGEgdGltZSB3aW5kb3c6IHN0YXJ0aW5nIGZyb20gbm93IGFuZFxuICAgKiBlbmRpbmcgYXQgcmVxdWVzdFdpbmRvd01zIGFmdGVyIG5vdy5cbiAgICogVGhlIHNlcnZlciBkZWNpZGVzIF93aGVuXyBpdCB3aWxsIHBlcmZvcm0gdGhlIGRlbGV0ZS4gSXQncyBub3QgZ3VhcmFudGVlZCB0aGF0IGl0IHdpbGwgcGVyZm9ybVxuICAgKiB0aGUgZGVsZXRlIGF0IFwibm93ICsgcmVxdWVzdFdpbmRvd01zXCIsIGJ1dCBpdCB3aWxsIGhhcHBlbiBhdCBzb21lIHRpbWUgYWZ0ZXIgXCJub3cgKyByZXF1ZXN0V2luZG93TXNcIi5cbiAgICogVGhpcyBhbGxvd3MgbXVsdGlwbGUgb3ZlcmxhcHBpbmcgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBhbmQgdGhlIHNlcnZlciBhbGxvY2F0ZXMgZW5vdWdoIGZvciBlYWNoIHJlcXVlc3QuXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIGEgc2V0dGluZyB0aGF0IGFsbG93cyBmb3IgYSBtYXhpbXVtIHZhbHVlIG9uIHJlcXVlc3RXaW5kb3dNcy4gSWYgdGhlIHJlcXVlc3RlZCB2YWx1ZVxuICAgKiBpcyBsYXJnZXIgdGhhbiB0aGlzIG1heGltdW0sIHRoZSBjYWxsIHdpbGwgZmFpbC5cbiAgICovXG4gIGFzeW5jIGJlZ2luRGVsZXRlQ2hpbGRJdGVtTGlua3NXaW5kb3dNdXRhdGlvbihcbiAgICBvcHRpb25zOiBCZWdpbkRlbGV0ZUNoaWxkSXRlbUxpbmtzV2luZG93T3B0aW9uc1xuICApIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IEJlZ2luRGVsZXRlQ2hpbGRJdGVtTGlua3NXaW5kb3dNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDogb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgbWF5IHJhaXNlIFZFUlNJT05fTUlTTUFUQ0ggZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb25cbiAgICogd2hlbiBtdWx0aXBsZSBjbGllbnRzIHRyeSB0byBjcmVhdGUgdGhlIHRlbXAgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBUT0RPIFRoZXJlIGlzIGEgcmV0cnkgbWVjaGFuaXNtIGluIGdyYXBocWwgd2l0aCBleHBvbmVudGlhbCBiYWNrIG9mZiBidXQgdGhhdCdzIGludGVybmFsLlxuICAgKiBCdXQgbmVlZCB0byB1c2UgYW4gZXhwb25lbnRpYWwgYmFjayBvZmYgbGliIGlmIHdlIHdhbnQgdG8gcmV0cnkgaGVyZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIElEIG9mIHRoZSB0ZW1wIGRpcmVjdG9yeVxuICAgKlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlVGVtcERpcmVjdG9yeSgpOiBQcm9taXNlPElkS2V5UGFpcj4ge1xuICAgIGlmICh0aGlzLnRlbXBEaXJlY3RvcnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRlbXBEaXJlY3Rvcnk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnF1ZXJ5KHtcbiAgICAgIHF1ZXJ5OiBUZW1wRGlyZWN0b3J5UXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgcGxhaW5NZXRhOiBJdGVtU2VydmljZS5URU1QX0RJUkVDVE9SWV9QTEFJTl9NRVRBX0ZJTFRFUixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoZXhpc3Rpbmcucm9vdERpcmVjdG9yaWVzLmVkZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBUaGVyZSBpcyBtb3JlIHRoYW4gMSB0ZW1wIGRpcmVjdG9yeSAocGxhaW5NZXRhIGZpbHRlcjogJHtJdGVtU2VydmljZS5URU1QX0RJUkVDVE9SWV9QTEFJTl9NRVRBX0ZJTFRFUn0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3Rpbmcucm9vdERpcmVjdG9yaWVzLmVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRG9lc24ndCBleGlzdCB5ZXQsIGNyZWF0ZSBpdFxuICAgICAgY29uc3QgY3JlYXRlRGlyZWN0b3J5ID0gYXdhaXQgdGhpcy5jcmVhdGVEaXJlY3RvcnlNdXRhdGlvbih7XG4gICAgICAgIGFzUm9vdERpcmVjdG9yeTogdHJ1ZSxcbiAgICAgICAgcGxhaW5NZXRhSnNvbjogSXRlbVNlcnZpY2UuVEVNUF9ESVJFQ1RPUllfUExBSU5fTUVUQSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBPcHRpbWlzdGljIGxvY2sgb24gdGhlIGN1cnJlbnQgdXNlci5cbiAgICAgIGNvbnN0IHVwZGF0ZUxvY2sgPSB0aGlzLmxvY2tTZXJ2aWNlLnVwZGF0ZUxvY2tNdXRhdGlvbih7XG4gICAgICAgIHZlcnNpb246IGV4aXN0aW5nLmxvY2s/LnZlcnNpb24sXG4gICAgICB9KTtcblxuICAgICAgLy8gQmVjYXVzZSB0aGlzLm11dGF0ZSgpIG9ubHkgaGFuZGxlcyBzaW1wbGUgdHlwZXMgd2UgbmVlZCB0byB1c2UgdGhlIG1vcmVcbiAgICAgIC8vIGFkdmFuY2VkIHRoaXMubHJHcmFwaFFMLmxyTXV0YXRlKClcbiAgICAgIGNvbnN0IFtjcmVhdGVEaXJlY3RvcnlSZXN1bHRdID0gYXdhaXQgdGhpcy5sckdyYXBoUUwubHJNdXRhdGUoW1xuICAgICAgICBjcmVhdGVEaXJlY3RvcnksXG4gICAgICAgIHVwZGF0ZUxvY2ssXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgeyBpZCwga2V5SWQgfSA9IGNyZWF0ZURpcmVjdG9yeVJlc3VsdC5jcmVhdGVEaXJlY3RvcnkuZGlyZWN0b3J5O1xuXG4gICAgICB0aGlzLnRlbXBEaXJlY3RvcnkgPSB7XG4gICAgICAgIGlkLFxuICAgICAgICBrZXlJZCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldHVybiBleGlzdGluZyB0ZW1wXG4gICAgICBjb25zdCB7IGlkLCBrZXlJZCB9ID0gZXhpc3Rpbmcucm9vdERpcmVjdG9yaWVzLmVkZ2VzWzBdLm5vZGU7XG5cbiAgICAgIHRoaXMudGVtcERpcmVjdG9yeSA9IHtcbiAgICAgICAgaWQsXG4gICAgICAgIGtleUlkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50ZW1wRGlyZWN0b3J5O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRGlyZWN0b3J5V2l0aFN0YWdpbmcob3B0aW9uczogQ3JlYXRlRGlyZWN0b3J5V2l0aFN0YWdpbmdPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlRGlyZWN0b3J5V2l0aFN0YWdpbmdNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogWW91IG11c3QgcnVuIHRoaXMgbXV0YXRpb24gd2l0aGluIHRoZSB0ZW1wIGRpcmVjdG9yeSBjbGVhbnVwIHdpbmRvdyBvbiB0aGVcbiAgICogc2VydmVyLCBvdGhlcndpc2UgdGhlIHRlbXAgZGlyZWN0b3J5IHdpbGwgZ2V0IGNsZWFuZWQgdXAuXG4gICAqXG4gICAqL1xuICBhc3luYyBjcmVhdGVEaXJlY3RvcnlXaXRoU3RhZ2luZ011dGF0aW9uKFxuICAgIG9wdGlvbnM6IENyZWF0ZURpcmVjdG9yeVdpdGhTdGFnaW5nT3B0aW9uc1xuICApIHtcbiAgICBjb25zdCB0ZW1wRGlyID0gYXdhaXQgdGhpcy5lbnN1cmVUZW1wRGlyZWN0b3J5KCk7XG5cbiAgICAvLyBDbGVhciB0aGUgdGVtcCBkaXJlY3Rvcnkgb2YgdGhlIG9uZXMgd2UgYXJlIGFib3V0IHRvIGNyZWF0ZS5cbiAgICAvLyBOT1RFOiB0aGlzIG11dGF0aW9uIGNhbiBub3QgYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgbXV0YXRpb24gd2l0aCB0aGVcbiAgICAvLyB0aGUgY3JlYXRlRGlyZWN0b3J5IG11dGF0aW9uIGJlY2F1c2UgaXQgdXNlcyB0aGUgY3VycmVudCBzZXJ2ZXIgdGltZSB0b1xuICAgIC8vIGNsZWFuIHVwLiBTbyBpdCBtdXN0IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZSBiZWZvcmUgdGhlIGNyZWF0aW9uIG9mIHRoZVxuICAgIC8vIGRpcmVjdG9yaWVzLlxuICAgIGF3YWl0IHRoaXMuYmVnaW5EZWxldGVDaGlsZEl0ZW1MaW5rc1dpbmRvdyh7XG4gICAgICBkaXJlY3RvcnlJZDogdGVtcERpci5pZCxcbiAgICAgIHJlcXVlc3RXaW5kb3dNczogb3B0aW9ucy5yZXF1ZXN0V2luZG93TXMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSB0aGF0IGhhcyBjb250ZW50c1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IChcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGlyZWN0b3J5KHtcbiAgICAgICAgY2lwaGVyTWV0YUNsZWFySnNvbjogb3B0aW9ucy5jaXBoZXJNZXRhQ2xlYXJKc29uLFxuICAgICAgICBwYXJlbnREaXJlY3RvcmllczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogdGVtcERpcixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBwbGFpbk1ldGFKc29uOiBvcHRpb25zLnBsYWluTWV0YUpzb24sXG4gICAgICB9KVxuICAgICkuY3JlYXRlRGlyZWN0b3J5LmRpcmVjdG9yeTtcblxuICAgIC8vIENhbGwgYmFjayB3aXRoIGl0ZW0gdGhhdCdzIGN1cnJlbnRseSBpbiBzdGFnaW5nLlxuICAgIGF3YWl0IG9wdGlvbnMub25DcmVhdGVkSW5TdGFnaW5nKHtcbiAgICAgIGlkOiBkaXJlY3RvcnkuaWQsXG4gICAgICBrZXlJZDogZGlyZWN0b3J5LmtleUlkLFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETyBjbGllbnQtc2lkZSBjaGVjayBmb3IgdGltZW91dCBvbiByZXF1ZXN0V2luZG93TXNcbiAgICAvLyBUT0RPIHJldHVybiB0aGUgc2VydmVyIHRpbWUgd2hlcmUgZGVsZXRlIGlzIHNjaGVkdWxlZC4gRXhwaXJhYmxlIG11dGF0aW9uXG5cbiAgICAvLyBSZXR1cm4gdGhlIG11dGF0aW9uIHRoYXQgbW92ZXMgdGhlIGRpcmVjdG9yeSBpbnRvIHRoZSBkc3QgZGlyZWN0b3JpZXNcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VEaXJlY3RvcnlQYXJlbnRzTXV0YXRpb24oe1xuICAgICAgZGlyZWN0b3J5SWQ6IGRpcmVjdG9yeS5pZCxcbiAgICAgIGRpcmVjdG9yeUtleUlkOiBkaXJlY3Rvcnkua2V5SWQsXG4gICAgICBwYXJlbnRzVG9SZW1vdmU6IFt0ZW1wRGlyLmlkXSxcbiAgICAgIHBhcmVudHNUb0FkZDogb3B0aW9ucy5wYXJlbnREaXJlY3RvcmllcyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpbGVXaXRoU3RhZ2luZyhvcHRpb25zOiBDcmVhdGVGaWxlV2l0aFN0YWdpbmdPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlRmlsZVdpdGhTdGFnaW5nTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRmlsZVdpdGhTdGFnaW5nTXV0YXRpb24ob3B0aW9uczogQ3JlYXRlRmlsZVdpdGhTdGFnaW5nT3B0aW9ucykge1xuICAgIGNvbnN0IHRlbXBEaXIgPSBhd2FpdCB0aGlzLmVuc3VyZVRlbXBEaXJlY3RvcnkoKTtcblxuICAgIC8vIENsZWFyIHRoZSB0ZW1wIGRpcmVjdG9yeSBvZiB0aGUgb25lcyB3ZSBhcmUgYWJvdXQgdG8gY3JlYXRlLlxuICAgIC8vIE5PVEU6IHRoaXMgbXV0YXRpb24gY2FuIG5vdCBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBtdXRhdGlvbiB3aXRoIHRoZVxuICAgIC8vIHRoZSBjcmVhdGVEaXJlY3RvcnkgbXV0YXRpb24gYmVjYXVzZSBpdCB1c2VzIHRoZSBjdXJyZW50IHNlcnZlciB0aW1lIHRvXG4gICAgLy8gY2xlYW4gdXAuIFNvIGl0IG11c3Qgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlIGJlZm9yZSB0aGUgY3JlYXRpb24gb2YgdGhlXG4gICAgLy8gZGlyZWN0b3JpZXMuXG4gICAgYXdhaXQgdGhpcy5iZWdpbkRlbGV0ZUNoaWxkSXRlbUxpbmtzV2luZG93KHtcbiAgICAgIGRpcmVjdG9yeUlkOiB0ZW1wRGlyLmlkLFxuICAgICAgcmVxdWVzdFdpbmRvd01zOiBvcHRpb25zLnJlcXVlc3RXaW5kb3dNcyxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSB0aGUgZmlsZVxuICAgIGNvbnN0IGZpbGUgPSAoXG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUZpbGUoe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBwYXJlbnREaXJlY3RvcmllczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogdGVtcERpcixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICApLmNyZWF0ZUZpbGUuZmlsZTtcblxuICAgIC8vIENhbGwgYmFjayB3aXRoIGl0ZW0gdGhhdCdzIGN1cnJlbnRseSBpbiBzdGFnaW5nLlxuICAgIGF3YWl0IG9wdGlvbnMub25DcmVhdGVkSW5TdGFnaW5nKHtcbiAgICAgIGlkOiBmaWxlLmlkLFxuICAgICAga2V5SWQ6IGZpbGUua2V5SWQsXG4gICAgfSk7XG5cbiAgICAvLyBUT0RPIGNsaWVudC1zaWRlIGNoZWNrIGZvciB0aW1lb3V0IG9uIHJlcXVlc3RXaW5kb3dNc1xuICAgIC8vIFRPRE8gcmV0dXJuIHRoZSBzZXJ2ZXIgdGltZSB3aGVyZSBkZWxldGUgaXMgc2NoZWR1bGVkLiBFeHBpcmFibGUgbXV0YXRpb25cblxuICAgIC8vIFJldHVybiB0aGUgbXV0YXRpb24gdGhhdCBtb3ZlcyB0aGUgZGlyZWN0b3J5IGludG8gdGhlIGRzdCBkaXJlY3Rvcmllc1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUZpbGVQYXJlbnRzTXV0YXRpb24oe1xuICAgICAgZmlsZSxcbiAgICAgIHBhcmVudHNUb1JlbW92ZTogW3RlbXBEaXIuaWRdLFxuICAgICAgcGFyZW50c1RvQWRkOiBvcHRpb25zLnBhcmVudERpcmVjdG9yaWVzLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2V0RmlsZUNvbmZpZGVudGlhbChvcHRpb25zOiBTZXRGaWxlQ29uZmlkZW50aWFsT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnNldEZpbGVDb25maWRlbnRpYWxNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBzZXRGaWxlQ29uZmlkZW50aWFsTXV0YXRpb24ob3B0aW9uczogU2V0RmlsZUNvbmZpZGVudGlhbE9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFNldEZpbGVDb25maWRlbnRpYWxNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGZpbGVJZDogb3B0aW9ucy5maWxlSWQsXG4gICAgICAgICAgY29uZmlkZW50aWFsOiBvcHRpb25zLmNvbmZpZGVudGlhbCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzZXREaXJlY3RvcnlDb25maWRlbnRpYWwob3B0aW9uczogU2V0RGlyZWN0b3J5Q29uZmlkZW50aWFsT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnNldERpcmVjdG9yeUNvbmZpZGVudGlhbE11dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIHNldERpcmVjdG9yeUNvbmZpZGVudGlhbE11dGF0aW9uKFxuICAgIG9wdGlvbnM6IFNldERpcmVjdG9yeUNvbmZpZGVudGlhbE9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBTZXREaXJlY3RvcnlDb25maWRlbnRpYWxNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGRpcmVjdG9yeUlkOiBvcHRpb25zLmRpcmVjdG9yeUlkLFxuICAgICAgICAgIGNvbmZpZGVudGlhbDogb3B0aW9ucy5jb25maWRlbnRpYWwsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBIZWxwZXJzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVQYXJlbnREaXJlY3RvcnkoXG4gICAgb3B0aW9uczogUGFyZW50RGlyZWN0b3J5T3B0aW9ucyxcbiAgICBuZXdLZXk6IEpXSy5LZXlcbiAgKTogUHJvbWlzZTxQYXJlbnREaXJlY3RvcnlJbnB1dD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGRpcmVjdG9yeUlkOiBfZGlyZWN0b3J5SWQsXG4gICAgICB3cmFwcGluZ0tleUlkOiBfd3JhcHBpbmdLZXlJZCxcbiAgICAgIGxpbmtUeXBlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgZGlyZWN0b3J5OiBJZEtleVBhaXIgPSBvcHRpb25zLmRpcmVjdG9yeSB8fCB7XG4gICAgICBpZDogX2RpcmVjdG9yeUlkLFxuICAgICAga2V5SWQ6IF93cmFwcGluZ0tleUlkLFxuICAgIH07XG5cbiAgICBpZiAobGlua1R5cGUgPT0gTGlua1R5cGVGaWVsZC5SRUZFUkVOQ0UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpcmVjdG9yeUlkOiBkaXJlY3RvcnkuaWQsXG4gICAgICAgIGxpbmtUeXBlLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgZGlyZWN0b3J5J3Mga2V5IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBrZXkgZ3JhcGgsIHRoZW4gbmVlZCB0b1xuICAgICAgLy8gZmV0Y2ggdGhlIGRpcmVjdG9yeSdzIGtleS5cbiAgICAgIGNvbnN0IHdyYXBwaW5nS2V5ID0gYXdhaXQgdGhpcy5nZXREaXJlY3RvcnlLZXkoXG4gICAgICAgIGRpcmVjdG9yeS5pZCxcbiAgICAgICAgZGlyZWN0b3J5LmtleUlkXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXJlY3RvcnlJZDogZGlyZWN0b3J5LmlkLFxuICAgICAgICB3cmFwcGluZ0tleUlkOiB3cmFwcGluZ0tleS5pZCxcbiAgICAgICAgd3JhcHBlZEtleTogYXdhaXQgdGhpcy5rZXlHcmFwaC53cmFwS2V5KHdyYXBwaW5nS2V5LCBuZXdLZXkpLFxuICAgICAgICBsaW5rVHlwZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRGaWxlU3RhdGVLZXlJZChmaWxlU3RhdGVOb2RlSWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoe1xuICAgICAgICBxdWVyeTogRmlsZVN0YXRlS2V5UXVlcnksXG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgIGlkOiBmaWxlU3RhdGVOb2RlSWQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICkuZmlsZVN0YXRlLmtleUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlRmlsZVN0YXRlKFxuICAgIGZpbGVLZXk6IEpXSy5LZXksXG4gICAgb3B0aW9uczogQ3JlYXRlRmlsZU9wdGlvbnMgfCBVcGRhdGVGaWxlT3B0aW9uc1xuICApIHtcbiAgICAvLyBFYWNoIHZlcnNpb24gb2YgdGhlIGZpbGUgaXMgZW5jcnlwdGVkIHVzaW5nIGEgbmV3IGtleS5cbiAgICBjb25zdCBmaWxlU3RhdGVLZXkgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlS2V5KCk7XG5cbiAgICBjb25zdCBmaWxlQ29udGVudCA9XG4gICAgICBvcHRpb25zLmZpbGUgJiYgKGF3YWl0IHRoaXMuZmlsZVVwbG9hZFNlcnZpY2UubG9hZEZpbGUob3B0aW9ucy5maWxlKSk7XG5cbiAgICBsZXQgY29udGVudFJlc291cmNlOiBzdHJpbmc7XG4gICAgaWYgKGZpbGVDb250ZW50KSB7XG4gICAgICBjb25zdCBjaXBoZXJGaWxlQ29udGVudCA9IGF3YWl0IHRoaXMua2V5R3JhcGguZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgICBmaWxlU3RhdGVLZXksXG4gICAgICAgIGZpbGVDb250ZW50XG4gICAgICApO1xuICAgICAgaWYgKG9wdGlvbnMudXBsb2FkKSB7XG4gICAgICAgIGNvbnRlbnRSZXNvdXJjZSA9IGF3YWl0IG9wdGlvbnMudXBsb2FkKGNpcGhlckZpbGVDb250ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnRSZXNvdXJjZSA9IGF3YWl0IHRoaXMuZmlsZVVwbG9hZFNlcnZpY2UudXBsb2FkRW5jcnlwdGVkRmlsZSh7XG4gICAgICAgICAgZW5jcnlwdGVkQ29udGVudDogY2lwaGVyRmlsZUNvbnRlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi4oYXdhaXQgdGhpcy5wcmVwYXJlSXRlbShmaWxlU3RhdGVLZXksIG9wdGlvbnMpKSxcbiAgICAgIHdyYXBwZWRTdGF0ZUtleTogYXdhaXQgdGhpcy5rZXlHcmFwaC53cmFwS2V5KGZpbGVLZXksIGZpbGVTdGF0ZUtleSksXG4gICAgICBjb250ZW50UmVzb3VyY2UsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNoYW5nZUl0ZW1QYXJlbnRzKFxuICAgIG9wdGlvbnM6IENoYW5nZUl0ZW1QYXJlbnRzT3B0aW9ucyxcbiAgICBpdGVtS2V5OiBKV0suS2V5XG4gICkge1xuICAgIGNvbnN0IHBhcmVudHNUb0FkZCA9IG9wdGlvbnMucGFyZW50c1RvQWRkXG4gICAgICA/IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG9wdGlvbnMucGFyZW50c1RvQWRkLm1hcCgodCkgPT5cbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVBhcmVudERpcmVjdG9yeSh0LCBpdGVtS2V5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgOiBbXTtcblxuICAgIHJldHVybiB7XG4gICAgICBkaXJlY3Rvcmllc1RvUmVtb3ZlOiBvcHRpb25zLnBhcmVudHNUb1JlbW92ZSB8fCBbXSxcbiAgICAgIGRpcmVjdG9yaWVzVG9BZGQ6IHBhcmVudHNUb0FkZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlSXRlbShcbiAgICBrZXk6IEpXSy5LZXksXG4gICAgb3B0aW9uczogeyBwbGFpbk1ldGFKc29uPzogSlNPTk9iamVjdDsgY2lwaGVyTWV0YUNsZWFySnNvbj86IEpTT05PYmplY3QgfVxuICApIHtcbiAgICBjb25zdCB7IHBsYWluTWV0YUpzb24sIGNpcGhlck1ldGFDbGVhckpzb24gfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGxhaW5NZXRhOiBwbGFpbk1ldGFKc29uICYmIEpTT04uc3RyaW5naWZ5KHBsYWluTWV0YUpzb24pLFxuICAgICAgY2lwaGVyTWV0YTpcbiAgICAgICAgY2lwaGVyTWV0YUNsZWFySnNvbiAmJlxuICAgICAgICAoYXdhaXQgdGhpcy5rZXlHcmFwaC5lbmNyeXB0VG9TdHJpbmcoa2V5LCBjaXBoZXJNZXRhQ2xlYXJKc29uKSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNyZWF0ZURpcmVjdG9yeShvcHRpb25zOiBDcmVhdGVEaXJlY3RvcnlPcHRpb25zKSB7XG4gICAgY29uc3QgZGlyZWN0b3J5S2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuICAgIG9wdGlvbnMucGFyZW50RGlyZWN0b3JpZXMgPSBvcHRpb25zLnBhcmVudERpcmVjdG9yaWVzIHx8IFtdO1xuICAgIGlmICghb3B0aW9ucy5hc1Jvb3REaXJlY3RvcnkgJiYgIW9wdGlvbnMucGFyZW50RGlyZWN0b3JpZXM/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEtjQmFkQXJndW1lbnRFeGNlcHRpb24oXG4gICAgICAgICdBIG5ldyBkaXJlY3RvcnkgbXVzdCBiZSBlaXRoZXIgYSByb290IGRpcmVjdG9yeSBvciBhIHN1Yi1kaXJlY3RvcnkuIFNvIHlvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIHBhcmVudERpcmVjdG9yaWVzIG9yIGFzUm9vdERpcmVjdG9yeSBwYXJhbWV0ZXIuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hc1Jvb3REaXJlY3RvcnkgJiYgb3B0aW9ucy5wYXJlbnREaXJlY3Rvcmllcz8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgJ0EgbmV3IGRpcmVjdG9yeSBtdXN0IGJlIGVpdGhlciBhIHJvb3QgZGlyZWN0b3J5IG9yIGEgc3ViLWRpcmVjdG9yeS4gU28geW91IGNhbiBvbmx5IHByb3ZpZGUgZWl0aGVyIHBhcmVudERpcmVjdG9yaWVzIG9yIGFzUm9vdERpcmVjdG9yeSBwYXJhbWV0ZXIuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnREaXJlY3RvcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgb3B0aW9ucy5wYXJlbnREaXJlY3Rvcmllcz8ubWFwKCh0KSA9PlxuICAgICAgICB0aGlzLnByZXBhcmVQYXJlbnREaXJlY3RvcnkodCwgZGlyZWN0b3J5S2V5KVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBUT0RPIHRoaXMgaXMgcmF0aGVyIGFuIHVuZm9ydHVuYXRlIG5hbWUsIGNoYW5nZSBpdCB0byBhc1Jvb3REaXJlY3RvcnkuXG4gICAgbGV0IHBhcmVudFJvb3REaXJlY3Rvcnk6IFBhcmVudFJvb3REaXJlY3RvcnlJbnB1dDtcbiAgICBpZiAob3B0aW9ucy5hc1Jvb3REaXJlY3RvcnkpIHtcbiAgICAgIGNvbnN0IHJvb3RLZXkgPSB0aGlzLmtleVNlcnZpY2UuY3VycmVudFJvb3RLZXk7XG4gICAgICBwYXJlbnRSb290RGlyZWN0b3J5ID0ge1xuICAgICAgICB3cmFwcGluZ0tleUlkOiByb290S2V5LmlkLFxuICAgICAgICB3cmFwcGVkS2V5OiBhd2FpdCB0aGlzLmtleUdyYXBoLndyYXBLZXkocm9vdEtleSwgZGlyZWN0b3J5S2V5KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbUlucHV0ID0gYXdhaXQgdGhpcy5wcmVwYXJlSXRlbShkaXJlY3RvcnlLZXksIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLml0ZW1JbnB1dCxcbiAgICAgIHBhcmVudERpcmVjdG9yaWVzLFxuICAgICAgcGFyZW50Um9vdERpcmVjdG9yeSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlRGlyZWN0b3J5KG9wdGlvbnM6IFVwZGF0ZURpcmVjdG9yeU9wdGlvbnMpIHtcbiAgICBjb25zdCBkaXJlY3RvcnlLZXkgPSBhd2FpdCB0aGlzLmdldERpcmVjdG9yeUtleShcbiAgICAgIG9wdGlvbnMuZGlyZWN0b3J5SWQsXG4gICAgICBvcHRpb25zLmRpcmVjdG9yeUtleUlkXG4gICAgKTtcblxuICAgIGNvbnN0IGl0ZW1JbnB1dCA9IGF3YWl0IHRoaXMucHJlcGFyZUl0ZW0oZGlyZWN0b3J5S2V5Lmp3aywgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaXRlbUlucHV0LFxuICAgICAgZGlyZWN0b3J5SWQ6IG9wdGlvbnMuZGlyZWN0b3J5SWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNyZWF0ZUZpbGUob3B0aW9uczogQ3JlYXRlRmlsZU9wdGlvbnMpIHtcbiAgICBjb25zdCBmaWxlS2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xuXG4gICAgY29uc3QgcGFyZW50RGlyZWN0b3JpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG9wdGlvbnMucGFyZW50RGlyZWN0b3JpZXMubWFwKCh0KSA9PlxuICAgICAgICB0aGlzLnByZXBhcmVQYXJlbnREaXJlY3RvcnkodCwgZmlsZUtleSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLnByZXBhcmVDcmVhdGVGaWxlU3RhdGUoZmlsZUtleSwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5wdXQsXG4gICAgICBwYXJlbnREaXJlY3RvcmllcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlRmlsZShvcHRpb25zOiBVcGRhdGVGaWxlT3B0aW9ucykge1xuICAgIGNvbnN0IGZpbGVLZXkgPSBhd2FpdCB0aGlzLmdldEZpbGVLZXkob3B0aW9ucy5maWxlSWQsIG9wdGlvbnMuZmlsZUtleUlkKTtcbiAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMucHJlcGFyZUNyZWF0ZUZpbGVTdGF0ZShmaWxlS2V5Lmp3aywgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5wdXQsXG4gICAgICBmaWxlSWQ6IG9wdGlvbnMuZmlsZUlkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVDaGFuZ2VEaXJlY3RvcnlQYXJlbnRzKFxuICAgIG9wdGlvbnM6IENoYW5nZURpcmVjdG9yeVBhcmVudHNPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IGRpcmVjdG9yeTogSWRLZXlQYWlyID0gb3B0aW9ucy5kaXJlY3RvcnkgfHwge1xuICAgICAgaWQ6IG9wdGlvbnMuZGlyZWN0b3J5SWQsXG4gICAgICBrZXlJZDogb3B0aW9ucy5kaXJlY3RvcnlLZXlJZCxcbiAgICB9O1xuXG4gICAgY29uc3QgZGlyZWN0b3J5S2V5ID0gYXdhaXQgdGhpcy5nZXREaXJlY3RvcnlLZXkoXG4gICAgICBkaXJlY3RvcnkuaWQsXG4gICAgICBkaXJlY3Rvcnkua2V5SWRcbiAgICApO1xuXG4gICAgY29uc3QgaW5wdXQgPSBhd2FpdCB0aGlzLnByZXBhcmVDaGFuZ2VJdGVtUGFyZW50cyhcbiAgICAgIG9wdGlvbnMsXG4gICAgICBkaXJlY3RvcnlLZXkuandrXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIGRpcmVjdG9yeUlkOiBkaXJlY3RvcnkuaWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUNoYW5nZUZpbGVQYXJlbnRzKG9wdGlvbnM6IENoYW5nZUZpbGVQYXJlbnRzT3B0aW9ucykge1xuICAgIGNvbnN0IGZpbGU6IElkS2V5UGFpciA9IG9wdGlvbnMuZmlsZSB8fCB7XG4gICAgICBpZDogb3B0aW9ucy5maWxlSWQsXG4gICAgICBrZXlJZDogb3B0aW9ucy5maWxlS2V5SWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGZpbGVLZXkgPSBhd2FpdCB0aGlzLmdldEZpbGVLZXkoZmlsZS5pZCwgZmlsZS5rZXlJZCk7XG5cbiAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHRoaXMucHJlcGFyZUNoYW5nZUl0ZW1QYXJlbnRzKG9wdGlvbnMsIGZpbGVLZXkuandrKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIGZpbGVJZDogZmlsZS5pZCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBvbkxvZ291dCgpIHtcbiAgICAvLyBDbGVhciBhbGwgY2FjaGVkIGRhdGEuXG4gICAgdGhpcy50ZW1wRGlyZWN0b3J5ID0gbnVsbDtcbiAgfVxufVxuIl19
|