@lifeready/core 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +62 -62
  2. package/bundles/lifeready-core.umd.js +15445 -15445
  3. package/bundles/lifeready-core.umd.js.map +1 -1
  4. package/bundles/lifeready-core.umd.min.js +1 -1
  5. package/bundles/lifeready-core.umd.min.js.map +1 -1
  6. package/esm2015/lib/_common/ast.js +40 -40
  7. package/esm2015/lib/_common/deferred-promise.js +24 -24
  8. package/esm2015/lib/_common/exceptions.js +157 -157
  9. package/esm2015/lib/_common/queries.gql.js +190 -190
  10. package/esm2015/lib/_common/run-outside-angular.js +79 -79
  11. package/esm2015/lib/_common/types.js +1 -1
  12. package/esm2015/lib/_common/utils.js +44 -44
  13. package/esm2015/lib/api/contact-card.gql.js +79 -79
  14. package/esm2015/lib/api/contact-card.service.js +154 -154
  15. package/esm2015/lib/api/contact-card2.gql.js +60 -60
  16. package/esm2015/lib/api/contact-card2.service.js +103 -103
  17. package/esm2015/lib/api/file.service.js +74 -74
  18. package/esm2015/lib/api/item2.gql.js +110 -110
  19. package/esm2015/lib/api/item2.service.js +311 -311
  20. package/esm2015/lib/api/key-exchange.gql.js +188 -188
  21. package/esm2015/lib/api/key-exchange.service.js +442 -442
  22. package/esm2015/lib/api/key-exchange.types.js +18 -18
  23. package/esm2015/lib/api/key-exchange2.gql.js +171 -171
  24. package/esm2015/lib/api/key-exchange2.service.js +479 -479
  25. package/esm2015/lib/api/lock.gql.js +40 -40
  26. package/esm2015/lib/api/lock.service.js +64 -64
  27. package/esm2015/lib/api/lr-apollo.service.js +46 -46
  28. package/esm2015/lib/api/lr-graphql/index.js +6 -6
  29. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -155
  30. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -213
  31. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -51
  32. package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -48
  33. package/esm2015/lib/api/lr-graphql/lr.service.js +18 -18
  34. package/esm2015/lib/api/message.service.js +138 -138
  35. package/esm2015/lib/api/persist.service.js +181 -181
  36. package/esm2015/lib/api/query-processor/common-processors.service.js +93 -93
  37. package/esm2015/lib/api/query-processor/index.js +3 -3
  38. package/esm2015/lib/api/query-processor/query-processor.service.js +192 -192
  39. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -109
  40. package/esm2015/lib/api/shared-contact-card.service.js +119 -119
  41. package/esm2015/lib/api/shared-contact-card2.gql.js +41 -41
  42. package/esm2015/lib/api/shared-contact-card2.service.js +117 -117
  43. package/esm2015/lib/api/time.service.js +146 -146
  44. package/esm2015/lib/api/types/graphql.types.js +7 -7
  45. package/esm2015/lib/api/types/index.js +3 -3
  46. package/esm2015/lib/api/types/lr-graphql.types.js +71 -71
  47. package/esm2015/lib/auth/auth.config.js +57 -57
  48. package/esm2015/lib/auth/auth.gql.js +48 -48
  49. package/esm2015/lib/auth/auth.types.js +27 -27
  50. package/esm2015/lib/auth/idle.service.js +168 -168
  51. package/esm2015/lib/auth/idle.types.js +7 -7
  52. package/esm2015/lib/auth/lbop.service.js +355 -355
  53. package/esm2015/lib/auth/life-ready-auth.service.js +500 -500
  54. package/esm2015/lib/auth/password.service.js +320 -320
  55. package/esm2015/lib/auth/register.service.js +172 -172
  56. package/esm2015/lib/auth/two-factor.service.js +74 -74
  57. package/esm2015/lib/category/category-meta.service.js +99 -99
  58. package/esm2015/lib/category/category.gql.js +406 -406
  59. package/esm2015/lib/category/category.service.js +390 -390
  60. package/esm2015/lib/category/category.types.js +29 -29
  61. package/esm2015/lib/cryptography/cryptography.types.js +11 -11
  62. package/esm2015/lib/cryptography/encryption.service.js +189 -189
  63. package/esm2015/lib/cryptography/key-factory.service.js +237 -237
  64. package/esm2015/lib/cryptography/key-graph.service.js +280 -280
  65. package/esm2015/lib/cryptography/key-meta.service.js +200 -200
  66. package/esm2015/lib/cryptography/key.service.js +124 -124
  67. package/esm2015/lib/cryptography/slip39.service.js +169 -169
  68. package/esm2015/lib/cryptography/web-crypto.service.js +29 -29
  69. package/esm2015/lib/life-ready.config.js +84 -84
  70. package/esm2015/lib/life-ready.module.js +74 -74
  71. package/esm2015/lib/plan/plan.gql.js +123 -123
  72. package/esm2015/lib/plan/plan.service.js +149 -149
  73. package/esm2015/lib/plan/plan.types.js +11 -11
  74. package/esm2015/lib/record/record-attachment.service.js +101 -101
  75. package/esm2015/lib/record/record.gql.js +179 -179
  76. package/esm2015/lib/record/record.service.js +206 -206
  77. package/esm2015/lib/record/record.types.js +15 -15
  78. package/esm2015/lib/record-type/record-type.service.js +75 -75
  79. package/esm2015/lib/record-type/record-type.types.js +28 -28
  80. package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -105
  81. package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -1
  82. package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -300
  83. package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -52
  84. package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -97
  85. package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -1
  86. package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -150
  87. package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -229
  88. package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -1
  89. package/esm2015/lib/scenario/scenario-setup.service.js +269 -269
  90. package/esm2015/lib/scenario/scenario.gql.js +368 -368
  91. package/esm2015/lib/scenario/scenario.service.js +611 -611
  92. package/esm2015/lib/scenario/scenario.types.js +64 -64
  93. package/esm2015/lib/search/search.gql.js +62 -62
  94. package/esm2015/lib/search/search.service.js +156 -156
  95. package/esm2015/lib/search/search.types.js +6 -6
  96. package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -112
  97. package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +129 -129
  98. package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +4 -4
  99. package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -232
  100. package/esm2015/lib/trusted-parties/tp-password-reset.service.js +299 -299
  101. package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -148
  102. package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -326
  103. package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -41
  104. package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -87
  105. package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -215
  106. package/esm2015/lib/users/profile-details.service.js +214 -214
  107. package/esm2015/lib/users/profile.gql.js +97 -97
  108. package/esm2015/lib/users/profile.service.js +169 -169
  109. package/esm2015/lib/users/profile.types.js +34 -34
  110. package/esm2015/lib/users/user.gql.js +60 -60
  111. package/esm2015/lib/users/user.service.js +79 -79
  112. package/esm2015/lib/users/user.types.js +5 -5
  113. package/esm2015/lifeready-core.js +10 -10
  114. package/esm2015/public-api.js +81 -81
  115. package/fesm2015/lifeready-core.js +13088 -13088
  116. package/fesm2015/lifeready-core.js.map +1 -1
  117. package/lib/_common/ast.d.ts +11 -11
  118. package/lib/_common/deferred-promise.d.ts +12 -12
  119. package/lib/_common/exceptions.d.ts +109 -109
  120. package/lib/_common/queries.gql.d.ts +10 -10
  121. package/lib/_common/run-outside-angular.d.ts +14 -14
  122. package/lib/_common/types.d.ts +10 -10
  123. package/lib/_common/utils.d.ts +3 -3
  124. package/lib/api/contact-card.gql.d.ts +7 -7
  125. package/lib/api/contact-card.service.d.ts +52 -52
  126. package/lib/api/contact-card2.gql.d.ts +34 -34
  127. package/lib/api/contact-card2.service.d.ts +49 -49
  128. package/lib/api/file.service.d.ts +18 -18
  129. package/lib/api/item2.gql.d.ts +96 -96
  130. package/lib/api/item2.service.d.ts +177 -177
  131. package/lib/api/key-exchange.gql.d.ts +9 -9
  132. package/lib/api/key-exchange.service.d.ts +39 -39
  133. package/lib/api/key-exchange.types.d.ts +196 -196
  134. package/lib/api/key-exchange2.gql.d.ts +125 -125
  135. package/lib/api/key-exchange2.service.d.ts +187 -187
  136. package/lib/api/lock.gql.d.ts +27 -27
  137. package/lib/api/lock.service.d.ts +25 -25
  138. package/lib/api/lr-apollo.service.d.ts +15 -15
  139. package/lib/api/lr-graphql/index.d.ts +5 -5
  140. package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -60
  141. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -27
  142. package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -28
  143. package/lib/api/lr-graphql/lr-mutation.d.ts +8 -8
  144. package/lib/api/lr-graphql/lr.service.d.ts +9 -9
  145. package/lib/api/message.service.d.ts +58 -58
  146. package/lib/api/persist.service.d.ts +31 -31
  147. package/lib/api/query-processor/common-processors.service.d.ts +36 -36
  148. package/lib/api/query-processor/index.d.ts +2 -2
  149. package/lib/api/query-processor/query-processor.service.d.ts +18 -18
  150. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -15
  151. package/lib/api/shared-contact-card.service.d.ts +33 -33
  152. package/lib/api/shared-contact-card2.gql.d.ts +36 -36
  153. package/lib/api/shared-contact-card2.service.d.ts +45 -45
  154. package/lib/api/time.service.d.ts +16 -16
  155. package/lib/api/types/graphql.types.d.ts +29 -29
  156. package/lib/api/types/index.d.ts +2 -2
  157. package/lib/api/types/lr-graphql.types.d.ts +393 -385
  158. package/lib/auth/auth.config.d.ts +5 -5
  159. package/lib/auth/auth.gql.d.ts +15 -15
  160. package/lib/auth/auth.types.d.ts +66 -66
  161. package/lib/auth/idle.service.d.ts +40 -40
  162. package/lib/auth/idle.types.d.ts +10 -10
  163. package/lib/auth/lbop.service.d.ts +91 -91
  164. package/lib/auth/life-ready-auth.service.d.ts +59 -59
  165. package/lib/auth/password.service.d.ts +78 -78
  166. package/lib/auth/register.service.d.ts +25 -25
  167. package/lib/auth/two-factor.service.d.ts +15 -15
  168. package/lib/category/category-meta.service.d.ts +23 -23
  169. package/lib/category/category.gql.d.ts +45 -45
  170. package/lib/category/category.service.d.ts +67 -67
  171. package/lib/category/category.types.d.ts +79 -79
  172. package/lib/cryptography/cryptography.types.d.ts +83 -83
  173. package/lib/cryptography/encryption.service.d.ts +41 -41
  174. package/lib/cryptography/key-factory.service.d.ts +38 -38
  175. package/lib/cryptography/key-graph.service.d.ts +33 -33
  176. package/lib/cryptography/key-meta.service.d.ts +44 -44
  177. package/lib/cryptography/key.service.d.ts +36 -36
  178. package/lib/cryptography/slip39.service.d.ts +43 -43
  179. package/lib/cryptography/web-crypto.service.d.ts +5 -5
  180. package/lib/life-ready.config.d.ts +14 -14
  181. package/lib/life-ready.module.d.ts +5 -5
  182. package/lib/plan/plan.gql.d.ts +11 -11
  183. package/lib/plan/plan.service.d.ts +33 -33
  184. package/lib/plan/plan.types.d.ts +31 -31
  185. package/lib/record/record-attachment.service.d.ts +16 -16
  186. package/lib/record/record.gql.d.ts +14 -14
  187. package/lib/record/record.service.d.ts +25 -25
  188. package/lib/record/record.types.d.ts +57 -57
  189. package/lib/record-type/record-type.service.d.ts +11 -11
  190. package/lib/record-type/record-type.types.d.ts +50 -50
  191. package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -7
  192. package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -63
  193. package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -32
  194. package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -5
  195. package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -17
  196. package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -18
  197. package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -8
  198. package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -30
  199. package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -54
  200. package/lib/scenario/scenario-setup.service.d.ts +22 -22
  201. package/lib/scenario/scenario.gql.d.ts +34 -34
  202. package/lib/scenario/scenario.service.d.ts +58 -58
  203. package/lib/scenario/scenario.types.d.ts +217 -217
  204. package/lib/search/search.gql.d.ts +1 -1
  205. package/lib/search/search.service.d.ts +25 -25
  206. package/lib/search/search.types.d.ts +20 -20
  207. package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -20
  208. package/lib/trusted-parties/tp-password-reset-user.service.d.ts +35 -35
  209. package/lib/trusted-parties/tp-password-reset.constants.d.ts +3 -3
  210. package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -218
  211. package/lib/trusted-parties/tp-password-reset.service.d.ts +130 -130
  212. package/lib/trusted-parties/trusted-party.gql.d.ts +9 -9
  213. package/lib/trusted-parties/trusted-party.service.d.ts +44 -44
  214. package/lib/trusted-parties/trusted-party.types.d.ts +102 -102
  215. package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -79
  216. package/lib/trusted-parties/trusted-party2.service.d.ts +114 -114
  217. package/lib/users/profile-details.service.d.ts +21 -21
  218. package/lib/users/profile.gql.d.ts +11 -11
  219. package/lib/users/profile.service.d.ts +35 -35
  220. package/lib/users/profile.types.d.ts +96 -96
  221. package/lib/users/user.gql.d.ts +9 -9
  222. package/lib/users/user.service.d.ts +12 -12
  223. package/lib/users/user.types.d.ts +23 -23
  224. package/lifeready-core.d.ts +9 -9
  225. package/package.json +1 -1
  226. package/public-api.d.ts +77 -77
@@ -1,192 +1,192 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { Injectable, NgZone } from '@angular/core';
3
- import { LrBadLogicException } from '../../_common/exceptions';
4
- import { mapValuesMayAsync, promiseAllMayAsync } from '../../_common/utils';
5
- import { KeyService } from '../../cryptography/key.service';
6
- import { CommonProcessorsService, DefaultProcessorOptions, } from './common-processors.service';
7
- import { RunOutsideAngular } from '../../_common/run-outside-angular';
8
- import { TpPasswordResetProcessorService } from './tp-password-reset-processor.service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "../../cryptography/key.service";
11
- import * as i2 from "./common-processors.service";
12
- import * as i3 from "./tp-password-reset-processor.service";
13
- function extendPath(context, key) {
14
- return Object.assign(Object.assign({}, context), { path: [...context.path, key] });
15
- }
16
- let QueryProcessorService = class QueryProcessorService {
17
- constructor(ngZone, keyService, common, tpprProcessor) {
18
- this.ngZone = ngZone;
19
- this.keyService = keyService;
20
- this.common = common;
21
- this.tpprProcessor = tpprProcessor;
22
- this.TYPENAME = '__typename';
23
- this.processors = {};
24
- this.registerProcessor('DirectoryNode', common.series([
25
- common.makeJsonParseProcessor({
26
- plainFieldName: 'plainMeta',
27
- }),
28
- common.makeDecryptionProcessor({
29
- cipherFieldName: 'cipherMeta',
30
- }),
31
- ]));
32
- this.registerProcessor('FileStateNode', common.series([
33
- common.makeJsonParseProcessor({
34
- plainFieldName: 'plainMeta',
35
- }),
36
- common.makeDecryptionProcessor({
37
- cipherFieldName: 'cipherMeta',
38
- }),
39
- ]));
40
- this.registerProcessor('ContactCardNode', common.makeDecryptionProcessor({
41
- cipherFieldName: 'cipherData',
42
- }));
43
- this.registerProcessor('SharedContactCardNode', common.series([
44
- common.makeJsonParseProcessor({
45
- plainFieldName: 'ownerPlainData',
46
- }),
47
- common.makeDecryptionProcessor({
48
- cipherFieldName: 'ownerCipherData',
49
- getKeyId: ({ field }) => {
50
- return field.ownerKey.id;
51
- },
52
- }),
53
- common.makeDecryptionProcessor({
54
- cipherFieldName: 'receiverCipherData',
55
- getKeyId: ({ field }) => {
56
- return field.receiverKey.id;
57
- },
58
- }),
59
- common.makeDecryptionProcessor({
60
- cipherFieldName: 'sharedCipherData',
61
- getKeyId: ({ field }) => field.sharedKey.id,
62
- }),
63
- ]));
64
- this.registerProcessor('TpPasswordResetNode', this.tpprProcessor.makeTpPasswordResetNodeProcessor());
65
- this.registerProcessor('SharedTpClaimApproverNode', common.series([
66
- common.makeDecryptionProcessor({
67
- cipherFieldName: 'sharedCipherApprovalData',
68
- getKeyId: ({ field }) => field.sharedKey.id,
69
- }),
70
- common.makeDecryptionProcessor({
71
- cipherFieldName: 'sharedCipherPartialAssemblyKey',
72
- getKeyId: ({ field }) => field.sharedKey.id,
73
- }),
74
- ]));
75
- this.registerProcessor('TpAssemblyAsApproverNode', common.series([
76
- common.makeDecryptionProcessor({
77
- cipherFieldName: 'sharedCipherData',
78
- getKeyId: ({ field }) => field.sharedKey.id,
79
- }),
80
- ]));
81
- }
82
- processQuery(fields, options) {
83
- return __awaiter(this, void 0, void 0, function* () {
84
- options = Object.assign(Object.assign({}, DefaultProcessorOptions), options);
85
- // The top level query does not have __typename
86
- const ret = mapValuesMayAsync(fields, (field, key) => this.processField({
87
- field,
88
- context: {
89
- path: [key],
90
- processChildren: true,
91
- },
92
- options,
93
- }));
94
- return ret;
95
- });
96
- }
97
- // Either returns a Promise, or a value.
98
- // The Promise<any> type is redundant but it shows that it can return a promise
99
- // We are not using async on the function because we don't want auto promotion into a Promise, which
100
- // always defer execution into the event loops. It is costly and unnecessary for objects
101
- // with only native data types.
102
- processField({ field, context, options, }) {
103
- return __awaiter(this, void 0, void 0, function* () {
104
- if (field === null || field === void 0 ? void 0 : field.then) {
105
- throw new LrBadLogicException('processField() should not receive thenable.');
106
- }
107
- if (field == null) {
108
- return null;
109
- }
110
- const newParams = {
111
- field,
112
- context: Object.assign(Object.assign({}, context), {
113
- // Processors modifies this field to communicate back to the caller.
114
- processChildren: true }),
115
- options,
116
- };
117
- // TODO allow registering processors by field name so we can process primitive fields as well.
118
- // We have common fields like "created", "modified" that be processed based on name.
119
- if (field[this.TYPENAME]) {
120
- // It's a custom object type
121
- const processor = this.processors[field[this.TYPENAME]];
122
- if (processor) {
123
- // Returns either a value or a promise.
124
- field = processor(newParams);
125
- }
126
- const processChildren = (childField) => {
127
- if (context.processChildren &&
128
- childField !== null &&
129
- typeof childField === 'object') {
130
- return mapValuesMayAsync(childField, (x, key) => this.processField({
131
- field: x,
132
- context: extendPath(context, key),
133
- options,
134
- }));
135
- }
136
- else {
137
- return childField;
138
- }
139
- };
140
- // Keep processing all child fields
141
- if (field.then) {
142
- // Wait for field to resolve
143
- field = field.then((resolvedField) => {
144
- return processChildren(resolvedField);
145
- });
146
- }
147
- else {
148
- // Field is already resolved
149
- field = processChildren(field);
150
- }
151
- }
152
- else {
153
- // Keep processing all child fields
154
- if (context.processChildren) {
155
- if (Array.isArray(field)) {
156
- field = promiseAllMayAsync(field.map((x, i) => this.processField({
157
- field: x,
158
- context: extendPath(context, i.toString()),
159
- options,
160
- })));
161
- }
162
- }
163
- }
164
- return field;
165
- });
166
- }
167
- registerProcessor(name, processor) {
168
- if (this.processors[name]) {
169
- throw new LrBadLogicException(`Processor for field ${name} already exists.`);
170
- }
171
- this.processors[name] = processor;
172
- }
173
- };
174
- QueryProcessorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function QueryProcessorService_Factory() { return new QueryProcessorService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.KeyService), i0.ɵɵinject(i2.CommonProcessorsService), i0.ɵɵinject(i3.TpPasswordResetProcessorService)); }, token: QueryProcessorService, providedIn: "root" });
175
- QueryProcessorService.decorators = [
176
- { type: Injectable, args: [{
177
- providedIn: 'root',
178
- },] }
179
- ];
180
- QueryProcessorService.ctorParameters = () => [
181
- { type: NgZone },
182
- { type: KeyService },
183
- { type: CommonProcessorsService },
184
- { type: TpPasswordResetProcessorService }
185
- ];
186
- QueryProcessorService = __decorate([
187
- RunOutsideAngular({
188
- ngZoneName: 'ngZone',
189
- })
190
- ], QueryProcessorService);
191
- export { QueryProcessorService };
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcHJvY2Vzc29yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiQzovUHJvamVjdHMvbmV3cmVwby9rYy1jbGllbnQvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYXBpL3F1ZXJ5LXByb2Nlc3Nvci9xdWVyeS1wcm9jZXNzb3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFDTCx1QkFBdUIsRUFNdkIsdUJBQXVCLEdBQ3hCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7O0FBRXhGLFNBQVMsVUFBVSxDQUFDLE9BQXlCLEVBQUUsR0FBVztJQUN4RCx1Q0FDSyxPQUFPLEtBQ1YsSUFBSSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUM1QjtBQUNKLENBQUM7SUFRWSxxQkFBcUIsU0FBckIscUJBQXFCO0lBSWhDLFlBQ1UsTUFBYyxFQUNkLFVBQXNCLEVBQ3RCLE1BQStCLEVBQy9CLGFBQThDO1FBSDlDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQXlCO1FBQy9CLGtCQUFhLEdBQWIsYUFBYSxDQUFpQztRQVAvQyxhQUFRLEdBQUcsWUFBWSxDQUFDO1FBQ3pCLGVBQVUsR0FBeUMs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QUFZLENBQUM7NEJBQ2hCLEtBQUssRUFBRSxDQUFDOzRCQUNSLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDMUMsT0FBTzt5QkFDUixDQUFDLENBQ0gsQ0FDRixDQUFDO3FCQUNIO2lCQUNGO2FBQ0Y7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FBQTtJQUVPLGlCQUFpQixDQUFDLElBQVksRUFBRSxTQUE0QjtRQUNsRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDekIsTUFBTSxJQUFJLG1CQUFtQixDQUMzQix1QkFBdUIsSUFBSSxrQkFBa0IsQ0FDOUMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDcEMsQ0FBQztDQUNGLENBQUE7OztZQXBOQSxVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQTdCb0IsTUFBTTtZQUdsQixVQUFVO1lBRWpCLHVCQUF1QjtZQVVoQiwrQkFBK0I7O0FBZTNCLHFCQUFxQjtJQU5qQyxpQkFBaUIsQ0FBQztRQUNqQixVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDO0dBSVcscUJBQXFCLENBaU5qQztTQWpOWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTHJCYWRMb2dpY0V4Y2VwdGlvbiB9IGZyb20gJy4uLy4uL19jb21tb24vZXhjZXB0aW9ucyc7XHJcbmltcG9ydCB7IG1hcFZhbHVlc01heUFzeW5jLCBwcm9taXNlQWxsTWF5QXN5bmMgfSBmcm9tICcuLi8uLi9fY29tbW9uL3V0aWxzJztcclxuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uLy4uL2NyeXB0b2dyYXBoeS9rZXkuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ29tbW9uUHJvY2Vzc29yc1NlcnZpY2UsXHJcbiAgLy8gRmllbGRDb250ZXh0LFxyXG4gIFByb2Nlc3NvckNhbGxiYWNrLFxyXG4gIFByb2Nlc3NvckNhbGxiYWNrUGFyYW1zLFxyXG4gIFByb2Nlc3NvckNvbnRleHQsXHJcbiAgUHJvY2Vzc29yT3B0aW9ucyxcclxuICBEZWZhdWx0UHJvY2Vzc29yT3B0aW9ucyxcclxufSBmcm9tICcuL2NvbW1vbi1wcm9jZXNzb3JzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcFBhc3N3b3JkUmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdHJ1c3RlZC1wYXJ0aWVzL3RwLXBhc3N3b3JkLXJlc2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSdW5PdXRzaWRlQW5ndWxhciB9IGZyb20gJy4uLy4uL19jb21tb24vcnVuLW91dHNpZGUtYW5ndWxhcic7XHJcbmltcG9ydCB7IFRwUGFzc3dvcmRSZXNldFByb2Nlc3NvclNlcnZpY2UgfSBmcm9tICcuL3RwLXBhc3N3b3JkLXJlc2V0LXByb2Nlc3Nvci5zZXJ2aWNlJztcclxuXHJcbmZ1bmN0aW9uIGV4dGVuZFBhdGgoY29udGV4dDogUHJvY2Vzc29yQ29udGV4dCwga2V5OiBzdHJpbmcpOiBQcm9jZXNzb3JDb250ZXh0IHtcclxuICByZXR1cm4ge1xyXG4gICAgLi4uY29udGV4dCxcclxuICAgIHBhdGg6IFsuLi5jb250ZXh0LnBhdGgsIGtleV0sXHJcbiAgfTtcclxufVxyXG5cclxuQFJ1bk91dHNpZGVBbmd1bGFyKHtcclxuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcclxufSlcclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFF1ZXJ5UHJvY2Vzc29yU2VydmljZSB7XHJcbiAgcmVhZG9ubHkgVFlQRU5BTUUgPSAnX190eXBlbmFtZSc7XHJcbiAgcHJpdmF0ZSBwcm9jZXNzb3JzOiB7IFtrZXk6IHN0cmluZ106IFByb2Nlc3NvckNhbGxiYWNrIH0gPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21tb246IENvbW1vblByb2Nlc3NvcnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cHByUHJvY2Vzc29yOiBUcFBhc3N3b3JkUmVzZXRQcm9jZXNzb3JTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJlZ2lzdGVyUHJvY2Vzc29yKFxyXG4gICAgICAnRGlyZWN0b3J5Tm9kZScsXHJcbiAgICAgIGNvbW1vbi5zZXJpZXMoW1xyXG4gICAgICAgIGNvbW1vbi5tYWtlSnNvblBhcnNlUHJvY2Vzc29yKHtcclxuICAgICAgICAgIHBsYWluRmllbGROYW1lOiAncGxhaW5NZXRhJyxcclxuICAgICAgICB9KSxcclxuICAgICAgICBjb21tb24ubWFrZURlY3J5cHRpb25Qcm9jZXNzb3Ioe1xyXG4gICAgICAgICAgY2lwaGVyRmllbGROYW1lOiAnY2lwaGVyTWV0YScsXHJcbiAgICAgICAgfSksXHJcbiAgICAgIF0pXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZWdpc3RlclByb2Nlc3NvcihcclxuICAgICAgJ0ZpbGVTdGF0ZU5vZGUnLFxyXG4gICAgICBjb21tb24uc2VyaWVzKFtcclxuICAgICAgICBjb21tb24ubWFrZUpzb25QYXJzZVByb2Nlc3Nvcih7XHJcbiAgICAgICAgICBwbGFpbkZpZWxkTmFtZTogJ3BsYWluTWV0YScsXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY29tbW9uLm1ha2VEZWNyeXB0aW9uUHJvY2Vzc29yKHtcclxuICAgICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ2NpcGhlck1ldGEnLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICBdKVxyXG4gICAgKTtcclxuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXHJcbiAgICAgICdDb250YWN0Q2FyZE5vZGUnLFxyXG4gICAgICBjb21tb24ubWFrZURlY3J5cHRpb25Qcm9jZXNzb3Ioe1xyXG4gICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ2NpcGhlckRhdGEnLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXHJcbiAgICAgICdTaGFyZWRDb250YWN0Q2FyZE5vZGUnLFxyXG4gICAgICBjb21tb24uc2VyaWVzKFtcclxuICAgICAgICBjb21tb24ubWFrZUpzb25QYXJzZVByb2Nlc3Nvcih7XHJcbiAgICAgICAgICBwbGFpbkZpZWxkTmFtZTogJ293bmVyUGxhaW5EYXRhJyxcclxuICAgICAgICB9KSxcclxuICAgICAgICBjb21tb24ubWFrZURlY3J5cHRpb25Qcm9jZXNzb3Ioe1xyXG4gICAgICAgICAgY2lwaGVyRmllbGROYW1lOiAnb3duZXJDaXBoZXJEYXRhJyxcclxuICAgICAgICAgIGdldEtleUlkOiAoeyBmaWVsZCB9KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWVsZC5vd25lcktleS5pZDtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY29tbW9uLm1ha2VEZWNyeXB0aW9uUHJvY2Vzc29yKHtcclxuICAgICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ3JlY2VpdmVyQ2lwaGVyRGF0YScsXHJcbiAgICAgICAgICBnZXRLZXlJZDogKHsgZmllbGQgfSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZmllbGQucmVjZWl2ZXJLZXkuaWQ7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNvbW1vbi5tYWtlRGVjcnlwdGlvblByb2Nlc3Nvcih7XHJcbiAgICAgICAgICBjaXBoZXJGaWVsZE5hbWU6ICdzaGFyZWRDaXBoZXJEYXRhJyxcclxuICAgICAgICAgIGdldEtleUlkOiAoeyBmaWVsZCB9KSA9PiBmaWVsZC5zaGFyZWRLZXkuaWQsXHJcbiAgICAgICAgfSksXHJcbiAgICAgIF0pXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZWdpc3RlclByb2Nlc3NvcihcclxuICAgICAgJ1RwUGFzc3dvcmRSZXNldE5vZGUnLFxyXG4gICAgICB0aGlzLnRwcHJQcm9jZXNzb3IubWFrZVRwUGFzc3dvcmRSZXNldE5vZGVQcm9jZXNzb3IoKVxyXG4gICAgKTtcclxuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXHJcbiAgICAgICdTaGFyZWRUcENsYWltQXBwcm92ZXJOb2RlJyxcclxuICAgICAgY29tbW9uLnNlcmllcyhbXHJcbiAgICAgICAgY29tbW9uLm1ha2VEZWNyeXB0aW9uUHJvY2Vzc29yKHtcclxuICAgICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ3NoYXJlZENpcGhlckFwcHJvdmFsRGF0YScsXHJcbiAgICAgICAgICBnZXRLZXlJZDogKHsgZmllbGQgfSkgPT4gZmllbGQuc2hhcmVkS2V5LmlkLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNvbW1vbi5tYWtlRGVjcnlwdGlvblByb2Nlc3Nvcih7XHJcbiAgICAgICAgICBjaXBoZXJGaWVsZE5hbWU6ICdzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXknLFxyXG4gICAgICAgICAgZ2V0S2V5SWQ6ICh7IGZpZWxkIH0pID0+IGZpZWxkLnNoYXJlZEtleS5pZCxcclxuICAgICAgICB9KSxcclxuICAgICAgXSlcclxuICAgICk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyUHJvY2Vzc29yKFxyXG4gICAgICAnVHBBc3NlbWJseUFzQXBwcm92ZXJOb2RlJyxcclxuICAgICAgY29tbW9uLnNlcmllcyhbXHJcbiAgICAgICAgY29tbW9uLm1ha2VEZWNyeXB0aW9uUHJvY2Vzc29yKHtcclxuICAgICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ3NoYXJlZENpcGhlckRhdGEnLFxyXG4gICAgICAgICAgZ2V0S2V5SWQ6ICh7IGZpZWxkIH0pID0+IGZpZWxkLnNoYXJlZEtleS5pZCxcclxuICAgICAgICB9KSxcclxuICAgICAgXSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcm9jZXNzUXVlcnkoXHJcbiAgICBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXHJcbiAgICBvcHRpb25zOiBQcm9jZXNzb3JPcHRpb25zXHJcbiAgKSB7XHJcbiAgICBvcHRpb25zID0ge1xyXG4gICAgICAuLi5EZWZhdWx0UHJvY2Vzc29yT3B0aW9ucyxcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgLy8gVGhlIHRvcCBsZXZlbCBxdWVyeSBkb2VzIG5vdCBoYXZlIF9fdHlwZW5hbWVcclxuICAgIGNvbnN0IHJldCA9IG1hcFZhbHVlc01heUFzeW5jKGZpZWxkcywgKGZpZWxkLCBrZXkpID0+XHJcbiAgICAgIHRoaXMucHJvY2Vzc0ZpZWxkKHtcclxuICAgICAgICBmaWVsZCxcclxuICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICBwYXRoOiBba2V5XSxcclxuICAgICAgICAgIHByb2Nlc3NDaGlsZHJlbjogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wdGlvbnMsXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vIEVpdGhlciByZXR1cm5zIGEgUHJvbWlzZSwgb3IgYSB2YWx1ZS5cclxuICAvLyBUaGUgUHJvbWlzZTxhbnk+IHR5cGUgaXMgcmVkdW5kYW50IGJ1dCBpdCBzaG93cyB0aGF0IGl0IGNhbiByZXR1cm4gYSBwcm9taXNlXHJcbiAgLy8gV2UgYXJlIG5vdCB1c2luZyBhc3luYyBvbiB0aGUgZnVuY3Rpb24gYmVjYXVzZSB3ZSBkb24ndCB3YW50IGF1dG8gcHJvbW90aW9uIGludG8gYSBQcm9taXNlLCB3aGljaFxyXG4gIC8vIGFsd2F5cyBkZWZlciBleGVjdXRpb24gaW50byB0aGUgZXZlbnQgbG9vcHMuIEl0IGlzIGNvc3RseSBhbmQgdW5uZWNlc3NhcnkgZm9yIG9iamVjdHNcclxuICAvLyB3aXRoIG9ubHkgbmF0aXZlIGRhdGEgdHlwZXMuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzRmllbGQoe1xyXG4gICAgZmllbGQsXHJcbiAgICBjb250ZXh0LFxyXG4gICAgb3B0aW9ucyxcclxuICB9OiBQcm9jZXNzb3JDYWxsYmFja1BhcmFtcykge1xyXG4gICAgaWYgKGZpZWxkPy50aGVuKSB7XHJcbiAgICAgIHRocm93IG5ldyBMckJhZExvZ2ljRXhjZXB0aW9uKFxyXG4gICAgICAgICdwcm9jZXNzRmllbGQoKSBzaG91bGQgbm90IHJlY2VpdmUgdGhlbmFibGUuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1BhcmFtczogUHJvY2Vzc29yQ2FsbGJhY2tQYXJhbXMgPSB7XHJcbiAgICAgIGZpZWxkLFxyXG4gICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgLi4uY29udGV4dCxcclxuICAgICAgICAvLyBQcm9jZXNzb3JzIG1vZGlmaWVzIHRoaXMgZmllbGQgdG8gY29tbXVuaWNhdGUgYmFjayB0byB0aGUgY2FsbGVyLlxyXG4gICAgICAgIHByb2Nlc3NDaGlsZHJlbjogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAgb3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgLy8gVE9ETyBhbGxvdyByZWdpc3RlcmluZyBwcm9jZXNzb3JzIGJ5IGZpZWxkIG5hbWUgc28gd2UgY2FuIHByb2Nlc3MgcHJpbWl0aXZlIGZpZWxkcyBhcyB3ZWxsLlxyXG4gICAgLy8gV2UgaGF2ZSBjb21tb24gZmllbGRzIGxpa2UgXCJjcmVhdGVkXCIsIFwibW9kaWZpZWRcIiB0aGF0IGJlIHByb2Nlc3NlZCBiYXNlZCBvbiBuYW1lLlxyXG4gICAgaWYgKGZpZWxkW3RoaXMuVFlQRU5BTUVdKSB7XHJcbiAgICAgIC8vIEl0J3MgYSBjdXN0b20gb2JqZWN0IHR5cGVcclxuICAgICAgY29uc3QgcHJvY2Vzc29yID0gdGhpcy5wcm9jZXNzb3JzW2ZpZWxkW3RoaXMuVFlQRU5BTUVdXTtcclxuICAgICAgaWYgKHByb2Nlc3Nvcikge1xyXG4gICAgICAgIC8vIFJldHVybnMgZWl0aGVyIGEgdmFsdWUgb3IgYSBwcm9taXNlLlxyXG4gICAgICAgIGZpZWxkID0gcHJvY2Vzc29yKG5ld1BhcmFtcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHByb2Nlc3NDaGlsZHJlbiA9IChjaGlsZEZpZWxkKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY29udGV4dC5wcm9jZXNzQ2hpbGRyZW4gJiZcclxuICAgICAgICAgIGNoaWxkRmllbGQgIT09IG51bGwgJiZcclxuICAgICAgICAgIHR5cGVvZiBjaGlsZEZpZWxkID09PSAnb2JqZWN0J1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIG1hcFZhbHVlc01heUFzeW5jKGNoaWxkRmllbGQsICh4LCBrZXkpID0+XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpZWxkKHtcclxuICAgICAgICAgICAgICBmaWVsZDogeCxcclxuICAgICAgICAgICAgICBjb250ZXh0OiBleHRlbmRQYXRoKGNvbnRleHQsIGtleSksXHJcbiAgICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBjaGlsZEZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIEtlZXAgcHJvY2Vzc2luZyBhbGwgY2hpbGQgZmllbGRzXHJcbiAgICAgIGlmIChmaWVsZC50aGVuKSB7XHJcbiAgICAgICAgLy8gV2FpdCBmb3IgZmllbGQgdG8gcmVzb2x2ZVxyXG4gICAgICAgIGZpZWxkID0gZmllbGQudGhlbigocmVzb2x2ZWRGaWVsZCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZHJlbihyZXNvbHZlZEZpZWxkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBGaWVsZCBpcyBhbHJlYWR5IHJlc29sdmVkXHJcbiAgICAgICAgZmllbGQgPSBwcm9jZXNzQ2hpbGRyZW4oZmllbGQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBLZWVwIHByb2Nlc3NpbmcgYWxsIGNoaWxkIGZpZWxkc1xyXG4gICAgICBpZiAoY29udGV4dC5wcm9jZXNzQ2hpbGRyZW4pIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcclxuICAgICAgICAgIGZpZWxkID0gcHJvbWlzZUFsbE1heUFzeW5jKFxyXG4gICAgICAgICAgICAoZmllbGQgYXMgQXJyYXk8YW55PikubWFwKCh4LCBpKSA9PlxyXG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpZWxkKHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiB4LFxyXG4gICAgICAgICAgICAgICAgY29udGV4dDogZXh0ZW5kUGF0aChjb250ZXh0LCBpLnRvU3RyaW5nKCkpLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWVsZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVnaXN0ZXJQcm9jZXNzb3IobmFtZTogc3RyaW5nLCBwcm9jZXNzb3I6IFByb2Nlc3NvckNhbGxiYWNrKSB7XHJcbiAgICBpZiAodGhpcy5wcm9jZXNzb3JzW25hbWVdKSB7XHJcbiAgICAgIHRocm93IG5ldyBMckJhZExvZ2ljRXhjZXB0aW9uKFxyXG4gICAgICAgIGBQcm9jZXNzb3IgZm9yIGZpZWxkICR7bmFtZX0gYWxyZWFkeSBleGlzdHMuYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9jZXNzb3JzW25hbWVdID0gcHJvY2Vzc29yO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { Injectable, NgZone } from '@angular/core';
3
+ import { LrBadLogicException } from '../../_common/exceptions';
4
+ import { mapValuesMayAsync, promiseAllMayAsync } from '../../_common/utils';
5
+ import { KeyService } from '../../cryptography/key.service';
6
+ import { CommonProcessorsService, DefaultProcessorOptions, } from './common-processors.service';
7
+ import { RunOutsideAngular } from '../../_common/run-outside-angular';
8
+ import { TpPasswordResetProcessorService } from './tp-password-reset-processor.service';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../../cryptography/key.service";
11
+ import * as i2 from "./common-processors.service";
12
+ import * as i3 from "./tp-password-reset-processor.service";
13
+ function extendPath(context, key) {
14
+ return Object.assign(Object.assign({}, context), { path: [...context.path, key] });
15
+ }
16
+ let QueryProcessorService = class QueryProcessorService {
17
+ constructor(ngZone, keyService, common, tpprProcessor) {
18
+ this.ngZone = ngZone;
19
+ this.keyService = keyService;
20
+ this.common = common;
21
+ this.tpprProcessor = tpprProcessor;
22
+ this.TYPENAME = '__typename';
23
+ this.processors = {};
24
+ this.registerProcessor('DirectoryNode', common.series([
25
+ common.makeJsonParseProcessor({
26
+ plainFieldName: 'plainMeta',
27
+ }),
28
+ common.makeDecryptionProcessor({
29
+ cipherFieldName: 'cipherMeta',
30
+ }),
31
+ ]));
32
+ this.registerProcessor('FileStateNode', common.series([
33
+ common.makeJsonParseProcessor({
34
+ plainFieldName: 'plainMeta',
35
+ }),
36
+ common.makeDecryptionProcessor({
37
+ cipherFieldName: 'cipherMeta',
38
+ }),
39
+ ]));
40
+ this.registerProcessor('ContactCardNode', common.makeDecryptionProcessor({
41
+ cipherFieldName: 'cipherData',
42
+ }));
43
+ this.registerProcessor('SharedContactCardNode', common.series([
44
+ common.makeJsonParseProcessor({
45
+ plainFieldName: 'ownerPlainData',
46
+ }),
47
+ common.makeDecryptionProcessor({
48
+ cipherFieldName: 'ownerCipherData',
49
+ getKeyId: ({ field }) => {
50
+ return field.ownerKey.id;
51
+ },
52
+ }),
53
+ common.makeDecryptionProcessor({
54
+ cipherFieldName: 'receiverCipherData',
55
+ getKeyId: ({ field }) => {
56
+ return field.receiverKey.id;
57
+ },
58
+ }),
59
+ common.makeDecryptionProcessor({
60
+ cipherFieldName: 'sharedCipherData',
61
+ getKeyId: ({ field }) => field.sharedKey.id,
62
+ }),
63
+ ]));
64
+ this.registerProcessor('TpPasswordResetNode', this.tpprProcessor.makeTpPasswordResetNodeProcessor());
65
+ this.registerProcessor('SharedTpClaimApproverNode', common.series([
66
+ common.makeDecryptionProcessor({
67
+ cipherFieldName: 'sharedCipherApprovalData',
68
+ getKeyId: ({ field }) => field.sharedKey.id,
69
+ }),
70
+ common.makeDecryptionProcessor({
71
+ cipherFieldName: 'sharedCipherPartialAssemblyKey',
72
+ getKeyId: ({ field }) => field.sharedKey.id,
73
+ }),
74
+ ]));
75
+ this.registerProcessor('TpAssemblyAsApproverNode', common.series([
76
+ common.makeDecryptionProcessor({
77
+ cipherFieldName: 'sharedCipherData',
78
+ getKeyId: ({ field }) => field.sharedKey.id,
79
+ }),
80
+ ]));
81
+ }
82
+ processQuery(fields, options) {
83
+ return __awaiter(this, void 0, void 0, function* () {
84
+ options = Object.assign(Object.assign({}, DefaultProcessorOptions), options);
85
+ // The top level query does not have __typename
86
+ const ret = mapValuesMayAsync(fields, (field, key) => this.processField({
87
+ field,
88
+ context: {
89
+ path: [key],
90
+ processChildren: true,
91
+ },
92
+ options,
93
+ }));
94
+ return ret;
95
+ });
96
+ }
97
+ // Either returns a Promise, or a value.
98
+ // The Promise<any> type is redundant but it shows that it can return a promise
99
+ // We are not using async on the function because we don't want auto promotion into a Promise, which
100
+ // always defer execution into the event loops. It is costly and unnecessary for objects
101
+ // with only native data types.
102
+ processField({ field, context, options, }) {
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ if (field === null || field === void 0 ? void 0 : field.then) {
105
+ throw new LrBadLogicException('processField() should not receive thenable.');
106
+ }
107
+ if (field == null) {
108
+ return null;
109
+ }
110
+ const newParams = {
111
+ field,
112
+ context: Object.assign(Object.assign({}, context), {
113
+ // Processors modifies this field to communicate back to the caller.
114
+ processChildren: true }),
115
+ options,
116
+ };
117
+ // TODO allow registering processors by field name so we can process primitive fields as well.
118
+ // We have common fields like "created", "modified" that be processed based on name.
119
+ if (field[this.TYPENAME]) {
120
+ // It's a custom object type
121
+ const processor = this.processors[field[this.TYPENAME]];
122
+ if (processor) {
123
+ // Returns either a value or a promise.
124
+ field = processor(newParams);
125
+ }
126
+ const processChildren = (childField) => {
127
+ if (context.processChildren &&
128
+ childField !== null &&
129
+ typeof childField === 'object') {
130
+ return mapValuesMayAsync(childField, (x, key) => this.processField({
131
+ field: x,
132
+ context: extendPath(context, key),
133
+ options,
134
+ }));
135
+ }
136
+ else {
137
+ return childField;
138
+ }
139
+ };
140
+ // Keep processing all child fields
141
+ if (field.then) {
142
+ // Wait for field to resolve
143
+ field = field.then((resolvedField) => {
144
+ return processChildren(resolvedField);
145
+ });
146
+ }
147
+ else {
148
+ // Field is already resolved
149
+ field = processChildren(field);
150
+ }
151
+ }
152
+ else {
153
+ // Keep processing all child fields
154
+ if (context.processChildren) {
155
+ if (Array.isArray(field)) {
156
+ field = promiseAllMayAsync(field.map((x, i) => this.processField({
157
+ field: x,
158
+ context: extendPath(context, i.toString()),
159
+ options,
160
+ })));
161
+ }
162
+ }
163
+ }
164
+ return field;
165
+ });
166
+ }
167
+ registerProcessor(name, processor) {
168
+ if (this.processors[name]) {
169
+ throw new LrBadLogicException(`Processor for field ${name} already exists.`);
170
+ }
171
+ this.processors[name] = processor;
172
+ }
173
+ };
174
+ QueryProcessorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function QueryProcessorService_Factory() { return new QueryProcessorService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.KeyService), i0.ɵɵinject(i2.CommonProcessorsService), i0.ɵɵinject(i3.TpPasswordResetProcessorService)); }, token: QueryProcessorService, providedIn: "root" });
175
+ QueryProcessorService.decorators = [
176
+ { type: Injectable, args: [{
177
+ providedIn: 'root',
178
+ },] }
179
+ ];
180
+ QueryProcessorService.ctorParameters = () => [
181
+ { type: NgZone },
182
+ { type: KeyService },
183
+ { type: CommonProcessorsService },
184
+ { type: TpPasswordResetProcessorService }
185
+ ];
186
+ QueryProcessorService = __decorate([
187
+ RunOutsideAngular({
188
+ ngZoneName: 'ngZone',
189
+ })
190
+ ], QueryProcessorService);
191
+ export { QueryProcessorService };
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcHJvY2Vzc29yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL29wdC9hdGxhc3NpYW4vcGlwZWxpbmVzL2FnZW50L2J1aWxkL3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2FwaS9xdWVyeS1wcm9jZXNzb3IvcXVlcnktcHJvY2Vzc29yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsdUJBQXVCLEVBTXZCLHVCQUF1QixHQUN4QixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7OztBQUV4RixTQUFTLFVBQVUsQ0FBQyxPQUF5QixFQUFFLEdBQVc7SUFDeEQsdUNBQ0ssT0FBTyxLQUNWLElBQUksRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFDNUI7QUFDSixDQUFDO0lBUVkscUJBQXFCLFNBQXJCLHFCQUFxQjtJQUloQyxZQUNVLE1BQWMsRUFDZCxVQUFzQixFQUN0QixNQUErQixFQUMvQixhQUE4QztRQUg5QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUF5QjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBaUM7UUFQL0MsYUFBUSxHQUFHLFlBQVksQ0FBQztRQUN6QixlQUFV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LENBQUMsWUFBWSxDQUFDOzRCQUNoQixLQUFLLEVBQUUsQ0FBQzs0QkFDUixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQzFDLE9BQU87eUJBQ1IsQ0FBQyxDQUNILENBQ0YsQ0FBQztxQkFDSDtpQkFDRjthQUNGO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQUE7SUFFTyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsU0FBNEI7UUFDbEUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsdUJBQXVCLElBQUksa0JBQWtCLENBQzlDLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7Q0FDRixDQUFBOzs7WUFwTkEsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUE3Qm9CLE1BQU07WUFHbEIsVUFBVTtZQUVqQix1QkFBdUI7WUFVaEIsK0JBQStCOztBQWUzQixxQkFBcUI7SUFOakMsaUJBQWlCLENBQUM7UUFDakIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztHQUlXLHFCQUFxQixDQWlOakM7U0FqTlkscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMckJhZExvZ2ljRXhjZXB0aW9uIH0gZnJvbSAnLi4vLi4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7IG1hcFZhbHVlc01heUFzeW5jLCBwcm9taXNlQWxsTWF5QXN5bmMgfSBmcm9tICcuLi8uLi9fY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jcnlwdG9ncmFwaHkva2V5LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ29tbW9uUHJvY2Vzc29yc1NlcnZpY2UsXG4gIC8vIEZpZWxkQ29udGV4dCxcbiAgUHJvY2Vzc29yQ2FsbGJhY2ssXG4gIFByb2Nlc3NvckNhbGxiYWNrUGFyYW1zLFxuICBQcm9jZXNzb3JDb250ZXh0LFxuICBQcm9jZXNzb3JPcHRpb25zLFxuICBEZWZhdWx0UHJvY2Vzc29yT3B0aW9ucyxcbn0gZnJvbSAnLi9jb21tb24tcHJvY2Vzc29ycy5zZXJ2aWNlJztcbmltcG9ydCB7IFRwUGFzc3dvcmRSZXNldFNlcnZpY2UgfSBmcm9tICcuLi8uLi90cnVzdGVkLXBhcnRpZXMvdHAtcGFzc3dvcmQtcmVzZXQuc2VydmljZSc7XG5pbXBvcnQgeyBSdW5PdXRzaWRlQW5ndWxhciB9IGZyb20gJy4uLy4uL19jb21tb24vcnVuLW91dHNpZGUtYW5ndWxhcic7XG5pbXBvcnQgeyBUcFBhc3N3b3JkUmVzZXRQcm9jZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi90cC1wYXNzd29yZC1yZXNldC1wcm9jZXNzb3Iuc2VydmljZSc7XG5cbmZ1bmN0aW9uIGV4dGVuZFBhdGgoY29udGV4dDogUHJvY2Vzc29yQ29udGV4dCwga2V5OiBzdHJpbmcpOiBQcm9jZXNzb3JDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb250ZXh0LFxuICAgIHBhdGg6IFsuLi5jb250ZXh0LnBhdGgsIGtleV0sXG4gIH07XG59XG5cbkBSdW5PdXRzaWRlQW5ndWxhcih7XG4gIG5nWm9uZU5hbWU6ICduZ1pvbmUnLFxufSlcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBRdWVyeVByb2Nlc3NvclNlcnZpY2Uge1xuICByZWFkb25seSBUWVBFTkFNRSA9ICdfX3R5cGVuYW1lJztcbiAgcHJpdmF0ZSBwcm9jZXNzb3JzOiB7IFtrZXk6IHN0cmluZ106IFByb2Nlc3NvckNhbGxiYWNrIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcbiAgICBwcml2YXRlIGNvbW1vbjogQ29tbW9uUHJvY2Vzc29yc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cHByUHJvY2Vzc29yOiBUcFBhc3N3b3JkUmVzZXRQcm9jZXNzb3JTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXG4gICAgICAnRGlyZWN0b3J5Tm9kZScsXG4gICAgICBjb21tb24uc2VyaWVzKFtcbiAgICAgICAgY29tbW9uLm1ha2VKc29uUGFyc2VQcm9jZXNzb3Ioe1xuICAgICAgICAgIHBsYWluRmllbGROYW1lOiAncGxhaW5NZXRhJyxcbiAgICAgICAgfSksXG4gICAgICAgIGNvbW1vbi5tYWtlRGVjcnlwdGlvblByb2Nlc3Nvcih7XG4gICAgICAgICAgY2lwaGVyRmllbGROYW1lOiAnY2lwaGVyTWV0YScsXG4gICAgICAgIH0pLFxuICAgICAgXSlcbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXG4gICAgICAnRmlsZVN0YXRlTm9kZScsXG4gICAgICBjb21tb24uc2VyaWVzKFtcbiAgICAgICAgY29tbW9uLm1ha2VKc29uUGFyc2VQcm9jZXNzb3Ioe1xuICAgICAgICAgIHBsYWluRmllbGROYW1lOiAncGxhaW5NZXRhJyxcbiAgICAgICAgfSksXG4gICAgICAgIGNvbW1vbi5tYWtlRGVjcnlwdGlvblByb2Nlc3Nvcih7XG4gICAgICAgICAgY2lwaGVyRmllbGROYW1lOiAnY2lwaGVyTWV0YScsXG4gICAgICAgIH0pLFxuICAgICAgXSlcbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXG4gICAgICAnQ29udGFjdENhcmROb2RlJyxcbiAgICAgIGNvbW1vbi5tYWtlRGVjcnlwdGlvblByb2Nlc3Nvcih7XG4gICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ2NpcGhlckRhdGEnLFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXG4gICAgICAnU2hhcmVkQ29udGFjdENhcmROb2RlJyxcbiAgICAgIGNvbW1vbi5zZXJpZXMoW1xuICAgICAgICBjb21tb24ubWFrZUpzb25QYXJzZVByb2Nlc3Nvcih7XG4gICAgICAgICAgcGxhaW5GaWVsZE5hbWU6ICdvd25lclBsYWluRGF0YScsXG4gICAgICAgIH0pLFxuICAgICAgICBjb21tb24ubWFrZURlY3J5cHRpb25Qcm9jZXNzb3Ioe1xuICAgICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ293bmVyQ2lwaGVyRGF0YScsXG4gICAgICAgICAgZ2V0S2V5SWQ6ICh7IGZpZWxkIH0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZC5vd25lcktleS5pZDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgY29tbW9uLm1ha2VEZWNyeXB0aW9uUHJvY2Vzc29yKHtcbiAgICAgICAgICBjaXBoZXJGaWVsZE5hbWU6ICdyZWNlaXZlckNpcGhlckRhdGEnLFxuICAgICAgICAgIGdldEtleUlkOiAoeyBmaWVsZCB9KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGQucmVjZWl2ZXJLZXkuaWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIGNvbW1vbi5tYWtlRGVjcnlwdGlvblByb2Nlc3Nvcih7XG4gICAgICAgICAgY2lwaGVyRmllbGROYW1lOiAnc2hhcmVkQ2lwaGVyRGF0YScsXG4gICAgICAgICAgZ2V0S2V5SWQ6ICh7IGZpZWxkIH0pID0+IGZpZWxkLnNoYXJlZEtleS5pZCxcbiAgICAgICAgfSksXG4gICAgICBdKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlclByb2Nlc3NvcihcbiAgICAgICdUcFBhc3N3b3JkUmVzZXROb2RlJyxcbiAgICAgIHRoaXMudHBwclByb2Nlc3Nvci5tYWtlVHBQYXNzd29yZFJlc2V0Tm9kZVByb2Nlc3NvcigpXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyUHJvY2Vzc29yKFxuICAgICAgJ1NoYXJlZFRwQ2xhaW1BcHByb3Zlck5vZGUnLFxuICAgICAgY29tbW9uLnNlcmllcyhbXG4gICAgICAgIGNvbW1vbi5tYWtlRGVjcnlwdGlvblByb2Nlc3Nvcih7XG4gICAgICAgICAgY2lwaGVyRmllbGROYW1lOiAnc2hhcmVkQ2lwaGVyQXBwcm92YWxEYXRhJyxcbiAgICAgICAgICBnZXRLZXlJZDogKHsgZmllbGQgfSkgPT4gZmllbGQuc2hhcmVkS2V5LmlkLFxuICAgICAgICB9KSxcbiAgICAgICAgY29tbW9uLm1ha2VEZWNyeXB0aW9uUHJvY2Vzc29yKHtcbiAgICAgICAgICBjaXBoZXJGaWVsZE5hbWU6ICdzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXknLFxuICAgICAgICAgIGdldEtleUlkOiAoeyBmaWVsZCB9KSA9PiBmaWVsZC5zaGFyZWRLZXkuaWQsXG4gICAgICAgIH0pLFxuICAgICAgXSlcbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJQcm9jZXNzb3IoXG4gICAgICAnVHBBc3NlbWJseUFzQXBwcm92ZXJOb2RlJyxcbiAgICAgIGNvbW1vbi5zZXJpZXMoW1xuICAgICAgICBjb21tb24ubWFrZURlY3J5cHRpb25Qcm9jZXNzb3Ioe1xuICAgICAgICAgIGNpcGhlckZpZWxkTmFtZTogJ3NoYXJlZENpcGhlckRhdGEnLFxuICAgICAgICAgIGdldEtleUlkOiAoeyBmaWVsZCB9KSA9PiBmaWVsZC5zaGFyZWRLZXkuaWQsXG4gICAgICAgIH0pLFxuICAgICAgXSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc1F1ZXJ5KFxuICAgIGZpZWxkczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAgICBvcHRpb25zOiBQcm9jZXNzb3JPcHRpb25zXG4gICkge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5EZWZhdWx0UHJvY2Vzc29yT3B0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIFRoZSB0b3AgbGV2ZWwgcXVlcnkgZG9lcyBub3QgaGF2ZSBfX3R5cGVuYW1lXG4gICAgY29uc3QgcmV0ID0gbWFwVmFsdWVzTWF5QXN5bmMoZmllbGRzLCAoZmllbGQsIGtleSkgPT5cbiAgICAgIHRoaXMucHJvY2Vzc0ZpZWxkKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBwYXRoOiBba2V5XSxcbiAgICAgICAgICBwcm9jZXNzQ2hpbGRyZW46IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIEVpdGhlciByZXR1cm5zIGEgUHJvbWlzZSwgb3IgYSB2YWx1ZS5cbiAgLy8gVGhlIFByb21pc2U8YW55PiB0eXBlIGlzIHJlZHVuZGFudCBidXQgaXQgc2hvd3MgdGhhdCBpdCBjYW4gcmV0dXJuIGEgcHJvbWlzZVxuICAvLyBXZSBhcmUgbm90IHVzaW5nIGFzeW5jIG9uIHRoZSBmdW5jdGlvbiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYXV0byBwcm9tb3Rpb24gaW50byBhIFByb21pc2UsIHdoaWNoXG4gIC8vIGFsd2F5cyBkZWZlciBleGVjdXRpb24gaW50byB0aGUgZXZlbnQgbG9vcHMuIEl0IGlzIGNvc3RseSBhbmQgdW5uZWNlc3NhcnkgZm9yIG9iamVjdHNcbiAgLy8gd2l0aCBvbmx5IG5hdGl2ZSBkYXRhIHR5cGVzLlxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NGaWVsZCh7XG4gICAgZmllbGQsXG4gICAgY29udGV4dCxcbiAgICBvcHRpb25zLFxuICB9OiBQcm9jZXNzb3JDYWxsYmFja1BhcmFtcykge1xuICAgIGlmIChmaWVsZD8udGhlbikge1xuICAgICAgdGhyb3cgbmV3IExyQmFkTG9naWNFeGNlcHRpb24oXG4gICAgICAgICdwcm9jZXNzRmllbGQoKSBzaG91bGQgbm90IHJlY2VpdmUgdGhlbmFibGUuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGFyYW1zOiBQcm9jZXNzb3JDYWxsYmFja1BhcmFtcyA9IHtcbiAgICAgIGZpZWxkLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAvLyBQcm9jZXNzb3JzIG1vZGlmaWVzIHRoaXMgZmllbGQgdG8gY29tbXVuaWNhdGUgYmFjayB0byB0aGUgY2FsbGVyLlxuICAgICAgICBwcm9jZXNzQ2hpbGRyZW46IHRydWUsXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gVE9ETyBhbGxvdyByZWdpc3RlcmluZyBwcm9jZXNzb3JzIGJ5IGZpZWxkIG5hbWUgc28gd2UgY2FuIHByb2Nlc3MgcHJpbWl0aXZlIGZpZWxkcyBhcyB3ZWxsLlxuICAgIC8vIFdlIGhhdmUgY29tbW9uIGZpZWxkcyBsaWtlIFwiY3JlYXRlZFwiLCBcIm1vZGlmaWVkXCIgdGhhdCBiZSBwcm9jZXNzZWQgYmFzZWQgb24gbmFtZS5cbiAgICBpZiAoZmllbGRbdGhpcy5UWVBFTkFNRV0pIHtcbiAgICAgIC8vIEl0J3MgYSBjdXN0b20gb2JqZWN0IHR5cGVcbiAgICAgIGNvbnN0IHByb2Nlc3NvciA9IHRoaXMucHJvY2Vzc29yc1tmaWVsZFt0aGlzLlRZUEVOQU1FXV07XG4gICAgICBpZiAocHJvY2Vzc29yKSB7XG4gICAgICAgIC8vIFJldHVybnMgZWl0aGVyIGEgdmFsdWUgb3IgYSBwcm9taXNlLlxuICAgICAgICBmaWVsZCA9IHByb2Nlc3NvcihuZXdQYXJhbXMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9jZXNzQ2hpbGRyZW4gPSAoY2hpbGRGaWVsZCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY29udGV4dC5wcm9jZXNzQ2hpbGRyZW4gJiZcbiAgICAgICAgICBjaGlsZEZpZWxkICE9PSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIGNoaWxkRmllbGQgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBtYXBWYWx1ZXNNYXlBc3luYyhjaGlsZEZpZWxkLCAoeCwga2V5KSA9PlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRmllbGQoe1xuICAgICAgICAgICAgICBmaWVsZDogeCxcbiAgICAgICAgICAgICAgY29udGV4dDogZXh0ZW5kUGF0aChjb250ZXh0LCBrZXkpLFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBjaGlsZEZpZWxkO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBLZWVwIHByb2Nlc3NpbmcgYWxsIGNoaWxkIGZpZWxkc1xuICAgICAgaWYgKGZpZWxkLnRoZW4pIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgZmllbGQgdG8gcmVzb2x2ZVxuICAgICAgICBmaWVsZCA9IGZpZWxkLnRoZW4oKHJlc29sdmVkRmllbGQpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkcmVuKHJlc29sdmVkRmllbGQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpZWxkIGlzIGFscmVhZHkgcmVzb2x2ZWRcbiAgICAgICAgZmllbGQgPSBwcm9jZXNzQ2hpbGRyZW4oZmllbGQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBLZWVwIHByb2Nlc3NpbmcgYWxsIGNoaWxkIGZpZWxkc1xuICAgICAgaWYgKGNvbnRleHQucHJvY2Vzc0NoaWxkcmVuKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSkge1xuICAgICAgICAgIGZpZWxkID0gcHJvbWlzZUFsbE1heUFzeW5jKFxuICAgICAgICAgICAgKGZpZWxkIGFzIEFycmF5PGFueT4pLm1hcCgoeCwgaSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRmllbGQoe1xuICAgICAgICAgICAgICAgIGZpZWxkOiB4LFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGV4dGVuZFBhdGgoY29udGV4dCwgaS50b1N0cmluZygpKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyUHJvY2Vzc29yKG5hbWU6IHN0cmluZywgcHJvY2Vzc29yOiBQcm9jZXNzb3JDYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnByb2Nlc3NvcnNbbmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBMckJhZExvZ2ljRXhjZXB0aW9uKFxuICAgICAgICBgUHJvY2Vzc29yIGZvciBmaWVsZCAke25hbWV9IGFscmVhZHkgZXhpc3RzLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucHJvY2Vzc29yc1tuYW1lXSA9IHByb2Nlc3NvcjtcbiAgfVxufVxuIl19