@vendasta/iam 1.17.2 → 2.2.2

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 (99) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +113 -0
  3. package/bundles/vendasta-iam.umd.js +828 -1400
  4. package/bundles/vendasta-iam.umd.js.map +1 -1
  5. package/bundles/vendasta-iam.umd.min.js +2 -2
  6. package/bundles/vendasta-iam.umd.min.js.map +1 -1
  7. package/esm2015/lib/_generated/host.service.js +9 -7
  8. package/esm2015/lib/_generated/index.js +2 -0
  9. package/esm2015/lib/_internal/enums/api.enum.js +1 -1
  10. package/esm2015/lib/_internal/enums/index.js +3 -2
  11. package/esm2015/lib/_internal/enums/policies.enum.js +18 -0
  12. package/esm2015/lib/_internal/enums/resources.enum.js +1 -12
  13. package/esm2015/lib/_internal/enums/subjects.enum.js +1 -1
  14. package/esm2015/lib/_internal/enums/users.enum.js +1 -1
  15. package/esm2015/lib/_internal/iam.api.service.js +10 -8
  16. package/esm2015/lib/_internal/index.js +4 -5
  17. package/esm2015/lib/_internal/interfaces/annotations.interface.js +8 -0
  18. package/esm2015/lib/_internal/interfaces/api.interface.js +1 -1
  19. package/esm2015/lib/_internal/interfaces/attributes.interface.js +8 -0
  20. package/esm2015/lib/_internal/interfaces/field-mask.interface.js +1 -1
  21. package/esm2015/lib/_internal/interfaces/index.js +1 -1
  22. package/esm2015/lib/_internal/interfaces/policies.interface.js +3 -0
  23. package/esm2015/lib/_internal/interfaces/resources.interface.js +1 -1
  24. package/esm2015/lib/_internal/interfaces/security-logs.interface.js +1 -1
  25. package/esm2015/lib/_internal/interfaces/subjects.interface.js +1 -7
  26. package/esm2015/lib/_internal/interfaces/users.interface.js +1 -1
  27. package/esm2015/lib/_internal/objects/annotations.js +30 -0
  28. package/esm2015/lib/_internal/objects/api.js +15 -381
  29. package/esm2015/lib/_internal/objects/attributes.js +158 -0
  30. package/esm2015/lib/_internal/objects/field-mask.js +1 -4
  31. package/esm2015/lib/_internal/objects/index.js +7 -4
  32. package/esm2015/lib/_internal/objects/policies.js +264 -0
  33. package/esm2015/lib/_internal/objects/resources.js +6 -321
  34. package/esm2015/lib/_internal/objects/security-logs.js +1 -8
  35. package/esm2015/lib/_internal/objects/subjects.js +3 -233
  36. package/esm2015/lib/_internal/objects/users.js +1 -32
  37. package/esm2015/lib/_internal/user-iam.api.service.js +10 -8
  38. package/esm2015/lib/http/http.interface.js +1 -1
  39. package/esm2015/lib/http/http.js +1 -1
  40. package/esm2015/lib/http/iam.http.api.service.js +22 -21
  41. package/esm2015/lib/iam.service.js +12 -10
  42. package/esm2015/lib/index.js +3 -4
  43. package/esm2015/lib/personas/account-group.js +1 -1
  44. package/esm2015/lib/personas/base-personas.js +1 -1
  45. package/esm2015/lib/personas/developer.js +1 -1
  46. package/esm2015/lib/personas/digital-agent.js +1 -1
  47. package/esm2015/lib/personas/index.js +1 -1
  48. package/esm2015/lib/personas/partner-app.js +1 -1
  49. package/esm2015/lib/personas/partner.js +14 -13
  50. package/esm2015/lib/personas/persona-type.enum.js +1 -1
  51. package/esm2015/lib/personas/personas.js +1 -1
  52. package/esm2015/lib/personas/salesperson.js +1 -1
  53. package/esm2015/lib/personas/smb.js +1 -1
  54. package/esm2015/lib/personas/success.js +1 -1
  55. package/esm2015/lib/personas/vendor.js +1 -1
  56. package/esm2015/public_api.js +2 -2
  57. package/esm2015/vendasta-iam.js +1 -6
  58. package/fesm2015/vendasta-iam.js +415 -976
  59. package/fesm2015/vendasta-iam.js.map +1 -1
  60. package/lib/_generated/host.service.d.ts +3 -0
  61. package/lib/_generated/index.d.ts +1 -0
  62. package/lib/_internal/enums/index.d.ts +2 -1
  63. package/lib/_internal/enums/policies.enum.d.ts +9 -0
  64. package/lib/_internal/enums/resources.enum.d.ts +0 -9
  65. package/lib/_internal/iam.api.service.d.ts +3 -0
  66. package/lib/_internal/index.d.ts +3 -4
  67. package/lib/_internal/interfaces/annotations.interface.d.ts +4 -0
  68. package/lib/_internal/interfaces/api.interface.d.ts +6 -18
  69. package/lib/_internal/interfaces/attributes.interface.d.ts +26 -0
  70. package/lib/_internal/interfaces/index.d.ts +6 -3
  71. package/lib/_internal/interfaces/policies.interface.d.ts +42 -0
  72. package/lib/_internal/interfaces/resources.interface.d.ts +3 -42
  73. package/lib/_internal/interfaces/subjects.interface.d.ts +2 -27
  74. package/lib/_internal/objects/annotations.d.ts +9 -0
  75. package/lib/_internal/objects/api.d.ts +7 -25
  76. package/lib/_internal/objects/attributes.d.ts +43 -0
  77. package/lib/_internal/objects/field-mask.d.ts +1 -1
  78. package/lib/_internal/objects/index.d.ts +6 -3
  79. package/lib/_internal/objects/policies.d.ts +68 -0
  80. package/lib/_internal/objects/resources.d.ts +4 -67
  81. package/lib/_internal/objects/security-logs.d.ts +1 -1
  82. package/lib/_internal/objects/subjects.d.ts +3 -43
  83. package/lib/_internal/objects/users.d.ts +1 -1
  84. package/lib/_internal/user-iam.api.service.d.ts +3 -0
  85. package/lib/http/iam.http.api.service.d.ts +3 -0
  86. package/lib/iam.service.d.ts +3 -0
  87. package/lib/index.d.ts +2 -3
  88. package/lib/personas/base-personas.d.ts +1 -1
  89. package/lib/personas/partner.d.ts +1 -0
  90. package/package.json +5 -3
  91. package/public_api.d.ts +1 -1
  92. package/vendasta-iam.d.ts +1 -5
  93. package/esm2015/lib/_internal/iam-sso.api.service.js +0 -38
  94. package/esm2015/lib/_internal/iam.module.js +0 -29
  95. package/esm2015/lib/iam.module.js +0 -16
  96. package/lib/_internal/iam-sso.api.service.d.ts +0 -12
  97. package/lib/_internal/iam.module.d.ts +0 -2
  98. package/lib/iam.module.d.ts +0 -2
  99. package/vendasta-iam.metadata.json +0 -1
@@ -1,106 +1,11 @@
1
- import * as e from '../enums/index';
1
+ import { StructAttribute } from './attributes';
2
+ import * as e from '../enums';
2
3
  export function enumStringToValue(enumRef, value) {
3
4
  if (typeof value === 'number') {
4
5
  return value;
5
6
  }
6
7
  return enumRef[value];
7
8
  }
8
- export class Attribute {
9
- constructor(kwargs) {
10
- if (!kwargs) {
11
- return;
12
- }
13
- Object.assign(this, kwargs);
14
- }
15
- static fromProto(proto) {
16
- let m = new Attribute();
17
- m = Object.assign(m, proto);
18
- if (proto.intAttribute) {
19
- m.intAttribute = parseInt(proto.intAttribute, 10);
20
- }
21
- if (proto.structAttribute) {
22
- m.structAttribute = StructAttribute.fromProto(proto.structAttribute);
23
- }
24
- if (proto.listAttribute) {
25
- m.listAttribute = ListAttribute.fromProto(proto.listAttribute);
26
- }
27
- if (proto.timestampAttribute) {
28
- m.timestampAttribute = new Date(proto.timestampAttribute);
29
- }
30
- if (proto.geopointAttribute) {
31
- m.geopointAttribute = GeoPointAttribute.fromProto(proto.geopointAttribute);
32
- }
33
- return m;
34
- }
35
- toApiJson() {
36
- if (typeof this.intAttribute === 'undefined' &&
37
- typeof this.doubleAttribute === 'undefined' &&
38
- typeof this.stringAttribute === 'undefined' &&
39
- typeof this.boolAttribute === 'undefined' &&
40
- typeof this.structAttribute === 'undefined' &&
41
- typeof this.listAttribute === 'undefined' &&
42
- typeof this.timestampAttribute === 'undefined' &&
43
- typeof this.geopointAttribute === 'undefined') {
44
- return {};
45
- }
46
- const toReturn = {};
47
- if (typeof this.intAttribute !== 'undefined') {
48
- toReturn['intAttribute'] = this.intAttribute;
49
- }
50
- if (typeof this.doubleAttribute !== 'undefined') {
51
- toReturn['doubleAttribute'] = this.doubleAttribute;
52
- }
53
- if (typeof this.stringAttribute !== 'undefined') {
54
- toReturn['stringAttribute'] = this.stringAttribute;
55
- }
56
- if (typeof this.boolAttribute !== 'undefined') {
57
- toReturn['boolAttribute'] = this.boolAttribute;
58
- }
59
- if (typeof this.structAttribute !== 'undefined' && this.structAttribute !== null) {
60
- toReturn['structAttribute'] = 'toApiJson' in this.structAttribute ? this.structAttribute.toApiJson() : this.structAttribute;
61
- }
62
- if (typeof this.listAttribute !== 'undefined' && this.listAttribute !== null) {
63
- toReturn['listAttribute'] = 'toApiJson' in this.listAttribute ? this.listAttribute.toApiJson() : this.listAttribute;
64
- }
65
- if (typeof this.timestampAttribute !== 'undefined' && this.timestampAttribute !== null) {
66
- toReturn['timestampAttribute'] = 'toApiJson' in this.timestampAttribute ? this.timestampAttribute.toApiJson() : this.timestampAttribute;
67
- }
68
- if (typeof this.geopointAttribute !== 'undefined' && this.geopointAttribute !== null) {
69
- toReturn['geopointAttribute'] = 'toApiJson' in this.geopointAttribute ? this.geopointAttribute.toApiJson() : this.geopointAttribute;
70
- }
71
- return toReturn;
72
- }
73
- }
74
- export class StructAttributeAttributesEntry {
75
- constructor(kwargs) {
76
- if (!kwargs) {
77
- return;
78
- }
79
- Object.assign(this, kwargs);
80
- }
81
- static fromProto(proto) {
82
- let m = new StructAttributeAttributesEntry();
83
- m = Object.assign(m, proto);
84
- if (proto.value) {
85
- m.value = Attribute.fromProto(proto.value);
86
- }
87
- return m;
88
- }
89
- toApiJson() {
90
- if (typeof this.key === 'undefined' &&
91
- typeof this.value === 'undefined') {
92
- return {};
93
- }
94
- const toReturn = {};
95
- if (typeof this.key !== 'undefined') {
96
- toReturn['key'] = this.key;
97
- }
98
- if (typeof this.value !== 'undefined' && this.value !== null) {
99
- toReturn['value'] = 'toApiJson' in this.value ? this.value.toApiJson() : this.value;
100
- }
101
- return toReturn;
102
- }
103
- }
104
9
  export class Context {
105
10
  constructor(kwargs) {
106
11
  if (!kwargs) {
@@ -120,10 +25,6 @@ export class Context {
120
25
  return m;
121
26
  }
122
27
  toApiJson() {
123
- if (typeof this.namespaced === 'undefined' &&
124
- typeof this.typed === 'undefined') {
125
- return {};
126
- }
127
28
  const toReturn = {};
128
29
  if (typeof this.namespaced !== 'undefined' && this.namespaced !== null) {
129
30
  toReturn['namespaced'] = 'toApiJson' in this.namespaced ? this.namespaced.toApiJson() : this.namespaced;
@@ -134,59 +35,6 @@ export class Context {
134
35
  return toReturn;
135
36
  }
136
37
  }
137
- export class GeoPointAttribute {
138
- constructor(kwargs) {
139
- if (!kwargs) {
140
- return;
141
- }
142
- Object.assign(this, kwargs);
143
- }
144
- static fromProto(proto) {
145
- let m = new GeoPointAttribute();
146
- m = Object.assign(m, proto);
147
- return m;
148
- }
149
- toApiJson() {
150
- if (typeof this.latitude === 'undefined' &&
151
- typeof this.longitude === 'undefined') {
152
- return {};
153
- }
154
- const toReturn = {};
155
- if (typeof this.latitude !== 'undefined') {
156
- toReturn['latitude'] = this.latitude;
157
- }
158
- if (typeof this.longitude !== 'undefined') {
159
- toReturn['longitude'] = this.longitude;
160
- }
161
- return toReturn;
162
- }
163
- }
164
- export class ListAttribute {
165
- constructor(kwargs) {
166
- if (!kwargs) {
167
- return;
168
- }
169
- Object.assign(this, kwargs);
170
- }
171
- static fromProto(proto) {
172
- let m = new ListAttribute();
173
- m = Object.assign(m, proto);
174
- if (proto.attributes) {
175
- m.attributes = proto.attributes.map(Attribute.fromProto);
176
- }
177
- return m;
178
- }
179
- toApiJson() {
180
- if (typeof this.attributes === 'undefined') {
181
- return {};
182
- }
183
- const toReturn = {};
184
- if (typeof this.attributes !== 'undefined' && this.attributes !== null) {
185
- toReturn['attributes'] = 'toApiJson' in this.attributes ? this.attributes.toApiJson() : this.attributes;
186
- }
187
- return toReturn;
188
- }
189
- }
190
38
  export class MultiValueAttribute {
191
39
  constructor(kwargs) {
192
40
  if (!kwargs) {
@@ -200,10 +48,6 @@ export class MultiValueAttribute {
200
48
  return m;
201
49
  }
202
50
  toApiJson() {
203
- if (typeof this.key === 'undefined' &&
204
- typeof this.values === 'undefined') {
205
- return {};
206
- }
207
51
  const toReturn = {};
208
52
  if (typeof this.key !== 'undefined') {
209
53
  toReturn['key'] = this.key;
@@ -245,15 +89,6 @@ export class Mutation {
245
89
  return m;
246
90
  }
247
91
  toApiJson() {
248
- if (typeof this.add === 'undefined' &&
249
- typeof this.replace === 'undefined' &&
250
- typeof this.remove === 'undefined' &&
251
- typeof this.dropKey === 'undefined' &&
252
- typeof this.replaceAttributes === 'undefined' &&
253
- typeof this.addAttributes === 'undefined' &&
254
- typeof this.removeAttributes === 'undefined') {
255
- return {};
256
- }
257
92
  const toReturn = {};
258
93
  if (typeof this.add !== 'undefined' && this.add !== null) {
259
94
  toReturn['add'] = 'toApiJson' in this.add ? this.add.toApiJson() : this.add;
@@ -292,10 +127,6 @@ export class NamespacedContext {
292
127
  return m;
293
128
  }
294
129
  toApiJson() {
295
- if (typeof this.namespace === 'undefined' &&
296
- typeof this.type === 'undefined') {
297
- return {};
298
- }
299
130
  const toReturn = {};
300
131
  if (typeof this.namespace !== 'undefined') {
301
132
  toReturn['namespace'] = this.namespace;
@@ -325,10 +156,6 @@ export class Persona {
325
156
  return m;
326
157
  }
327
158
  toApiJson() {
328
- if (typeof this.subject === 'undefined' &&
329
- typeof this.context === 'undefined') {
330
- return {};
331
- }
332
159
  const toReturn = {};
333
160
  if (typeof this.subject !== 'undefined' && this.subject !== null) {
334
161
  toReturn['subject'] = 'toApiJson' in this.subject ? this.subject.toApiJson() : this.subject;
@@ -355,11 +182,6 @@ export class PublicKey {
355
182
  return m;
356
183
  }
357
184
  toApiJson() {
358
- if (typeof this.key === 'undefined' &&
359
- typeof this.id === 'undefined' &&
360
- typeof this.algorithmType === 'undefined') {
361
- return {};
362
- }
363
185
  const toReturn = {};
364
186
  if (typeof this.key !== 'undefined') {
365
187
  toReturn['key'] = this.key;
@@ -386,10 +208,6 @@ export class Query {
386
208
  return m;
387
209
  }
388
210
  toApiJson() {
389
- if (typeof this.searchTerm === 'undefined' &&
390
- typeof this.attributeKeys === 'undefined') {
391
- return {};
392
- }
393
211
  const toReturn = {};
394
212
  if (typeof this.searchTerm !== 'undefined') {
395
213
  toReturn['searchTerm'] = this.searchTerm;
@@ -413,10 +231,6 @@ export class SingleValueAttribute {
413
231
  return m;
414
232
  }
415
233
  toApiJson() {
416
- if (typeof this.key === 'undefined' &&
417
- typeof this.value === 'undefined') {
418
- return {};
419
- }
420
234
  const toReturn = {};
421
235
  if (typeof this.key !== 'undefined') {
422
236
  toReturn['key'] = this.key;
@@ -427,32 +241,6 @@ export class SingleValueAttribute {
427
241
  return toReturn;
428
242
  }
429
243
  }
430
- export class StructAttribute {
431
- constructor(kwargs) {
432
- if (!kwargs) {
433
- return;
434
- }
435
- Object.assign(this, kwargs);
436
- }
437
- static fromProto(proto) {
438
- let m = new StructAttribute();
439
- m = Object.assign(m, proto);
440
- if (proto.attributes) {
441
- m.attributes = Object.keys(proto.attributes).reduce((obj, k) => { obj[k] = Attribute.fromProto(proto.attributes[k]); return obj; }, {});
442
- }
443
- return m;
444
- }
445
- toApiJson() {
446
- if (typeof this.attributes === 'undefined') {
447
- return {};
448
- }
449
- const toReturn = {};
450
- if (typeof this.attributes !== 'undefined' && this.attributes !== null) {
451
- toReturn['attributes'] = 'toApiJson' in this.attributes ? this.attributes.toApiJson() : this.attributes;
452
- }
453
- return toReturn;
454
- }
455
- }
456
244
  export class Subject {
457
245
  constructor(kwargs) {
458
246
  if (!kwargs) {
@@ -484,18 +272,6 @@ export class Subject {
484
272
  return m;
485
273
  }
486
274
  toApiJson() {
487
- if (typeof this.subjectId === 'undefined' &&
488
- typeof this.email === 'undefined' &&
489
- typeof this.userId === 'undefined' &&
490
- typeof this.partnerId === 'undefined' &&
491
- typeof this.attributes === 'undefined' &&
492
- typeof this.created === 'undefined' &&
493
- typeof this.updated === 'undefined' &&
494
- typeof this.lastLogin === 'undefined' &&
495
- typeof this.publicKeys === 'undefined' &&
496
- typeof this.structAttributes === 'undefined') {
497
- return {};
498
- }
499
275
  const toReturn = {};
500
276
  if (typeof this.subjectId !== 'undefined') {
501
277
  toReturn['subjectId'] = this.subjectId;
@@ -546,9 +322,6 @@ export class SubjectResult {
546
322
  return m;
547
323
  }
548
324
  toApiJson() {
549
- if (typeof this.subject === 'undefined') {
550
- return {};
551
- }
552
325
  const toReturn = {};
553
326
  if (typeof this.subject !== 'undefined' && this.subject !== null) {
554
327
  toReturn['subject'] = 'toApiJson' in this.subject ? this.subject.toApiJson() : this.subject;
@@ -569,9 +342,6 @@ export class TypedContext {
569
342
  return m;
570
343
  }
571
344
  toApiJson() {
572
- if (typeof this.type === 'undefined') {
573
- return {};
574
- }
575
345
  const toReturn = {};
576
346
  if (typeof this.type !== 'undefined') {
577
347
  toReturn['type'] = this.type;
@@ -579,4 +349,4 @@ export class TypedContext {
579
349
  return toReturn;
580
350
  }
581
351
  }
582
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViamVjdHMuanMiLCJzb3VyY2VSb290IjoiL2NvZGVmcmVzaC92b2x1bWUvSUFNL3Nka3MvdHlwZXNjcmlwdC9zcmMvaWFtX3Nkay9zcmMvIiwic291cmNlcyI6WyJsaWIvX2ludGVybmFsL29iamVjdHMvc3ViamVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxLQUFLLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwQyxNQUFNLFVBQVUsaUJBQWlCLENBQUksT0FBWSxFQUFFLEtBQWE7SUFDOUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLE9BQU8sU0FBUztJQXFCbEIsWUFBWSxNQUE2QjtRQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQWhCRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQVU7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUN4QixDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUFDO1FBQzVFLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUFDLENBQUMsQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7U0FBQztRQUNsRyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFBQyxDQUFDLENBQUMsYUFBYSxH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QUFnQztRQUN4QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQVhELE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFTRCxTQUFTO1FBQ0wsSUFDSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxNQUFNLFFBQVEsR0FFVixFQUFFLENBQUM7UUFFUCxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7WUFBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUFDO1FBQ3JFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gT2JqZWN0cy5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuaW1wb3J0ICogYXMgaSBmcm9tICcuLi9pbnRlcmZhY2VzL2luZGV4JztcblxuaW1wb3J0ICogYXMgZSBmcm9tICcuLi9lbnVtcy9pbmRleCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnVtU3RyaW5nVG9WYWx1ZTxFPihlbnVtUmVmOiBhbnksIHZhbHVlOiBzdHJpbmcpOiBFIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudW1SZWZbdmFsdWVdO1xufVxuXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlIGltcGxlbWVudHMgaS5BdHRyaWJ1dGVJbnRlcmZhY2Uge1xuICAgIGludEF0dHJpYnV0ZTogbnVtYmVyO1xuICAgIGRvdWJsZUF0dHJpYnV0ZTogbnVtYmVyO1xuICAgIHN0cmluZ0F0dHJpYnV0ZTogc3RyaW5nO1xuICAgIGJvb2xBdHRyaWJ1dGU6IGJvb2xlYW47XG4gICAgc3RydWN0QXR0cmlidXRlOiBTdHJ1Y3RBdHRyaWJ1dGU7XG4gICAgbGlzdEF0dHJpYnV0ZTogTGlzdEF0dHJpYnV0ZTtcbiAgICB0aW1lc3RhbXBBdHRyaWJ1dGU6IERhdGU7XG4gICAgZ2VvcG9pbnRBdHRyaWJ1dGU6IEdlb1BvaW50QXR0cmlidXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQXR0cmlidXRlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQXR0cmlidXRlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmludEF0dHJpYnV0ZSkge20uaW50QXR0cmlidXRlID0gcGFyc2VJbnQocHJvdG8uaW50QXR0cmlidXRlLCAxMCk7fVxuICAgICAgICBpZiAocHJvdG8uc3RydWN0QXR0cmlidXRlKSB7bS5zdHJ1Y3RBdHRyaWJ1dGUgPSBTdHJ1Y3RBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnN0cnVjdEF0dHJpYnV0ZSk7fVxuICAgICAgICBpZiAocHJvdG8ubGlzdEF0dHJpYnV0ZSkge20ubGlzdEF0dHJpYnV0ZSA9IExpc3RBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLmxpc3RBdHRyaWJ1dGUpO31cbiAgICAgICAgaWYgKHByb3RvLnRpbWVzdGFtcEF0dHJpYnV0ZSkge20udGltZXN0YW1wQXR0cmlidXRlID0gbmV3IERhdGUocHJvdG8udGltZXN0YW1wQXR0cmlidXRlKTt9XG4gICAgICAgIGlmIChwcm90by5nZW9wb2ludEF0dHJpYnV0ZSkge20uZ2VvcG9pbnRBdHRyaWJ1dGUgPSBHZW9Qb2ludEF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uZ2VvcG9pbnRBdHRyaWJ1dGUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5BdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmludEF0dHJpYnV0ZSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmRvdWJsZUF0dHJpYnV0ZSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnN0cmluZ0F0dHJpYnV0ZSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmJvb2xBdHRyaWJ1dGUgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zdHJ1Y3RBdHRyaWJ1dGUgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5saXN0QXR0cmlidXRlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudGltZXN0YW1wQXR0cmlidXRlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuZ2VvcG9pbnRBdHRyaWJ1dGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbnRBdHRyaWJ1dGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2ludEF0dHJpYnV0ZSddID0gdGhpcy5pbnRBdHRyaWJ1dGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZG91YmxlQXR0cmlidXRlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydkb3VibGVBdHRyaWJ1dGUnXSA9IHRoaXMuZG91YmxlQXR0cmlidXRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0cmluZ0F0dHJpYnV0ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnc3RyaW5nQXR0cmlidXRlJ10gPSB0aGlzLnN0cmluZ0F0dHJpYnV0ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ib29sQXR0cmlidXRlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydib29sQXR0cmlidXRlJ10gPSB0aGlzLmJvb2xBdHRyaWJ1dGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc3RydWN0QXR0cmlidXRlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN0cnVjdEF0dHJpYnV0ZSAhPT0gbnVsbCkge3RvUmV0dXJuWydzdHJ1Y3RBdHRyaWJ1dGUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuc3RydWN0QXR0cmlidXRlID8gKHRoaXMuc3RydWN0QXR0cmlidXRlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0cnVjdEF0dHJpYnV0ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5saXN0QXR0cmlidXRlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmxpc3RBdHRyaWJ1dGUgIT09IG51bGwpIHt0b1JldHVyblsnbGlzdEF0dHJpYnV0ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5saXN0QXR0cmlidXRlID8gKHRoaXMubGlzdEF0dHJpYnV0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5saXN0QXR0cmlidXRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lc3RhbXBBdHRyaWJ1dGUgIT09IG51bGwpIHt0b1JldHVyblsndGltZXN0YW1wQXR0cmlidXRlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZSA/ICh0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lc3RhbXBBdHRyaWJ1dGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ2VvcG9pbnRBdHRyaWJ1dGUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZ2VvcG9pbnRBdHRyaWJ1dGUgIT09IG51bGwpIHt0b1JldHVyblsnZ2VvcG9pbnRBdHRyaWJ1dGUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZ2VvcG9pbnRBdHRyaWJ1dGUgPyAodGhpcy5nZW9wb2ludEF0dHJpYnV0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5nZW9wb2ludEF0dHJpYnV0ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJ1Y3RBdHRyaWJ1dGVBdHRyaWJ1dGVzRW50cnkgaW1wbGVtZW50cyBpLlN0cnVjdEF0dHJpYnV0ZUF0dHJpYnV0ZXNFbnRyeUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IEF0dHJpYnV0ZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFN0cnVjdEF0dHJpYnV0ZUF0dHJpYnV0ZXNFbnRyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IFN0cnVjdEF0dHJpYnV0ZUF0dHJpYnV0ZXNFbnRyeSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by52YWx1ZSkge20udmFsdWUgPSBBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnZhbHVlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU3RydWN0QXR0cmlidXRlQXR0cmlidXRlc0VudHJ5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5rZXkgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy52YWx1ZSAhPT0gbnVsbCkge3RvUmV0dXJuWyd2YWx1ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy52YWx1ZSA/ICh0aGlzLnZhbHVlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRleHQgaW1wbGVtZW50cyBpLkNvbnRleHRJbnRlcmZhY2Uge1xuICAgIG5hbWVzcGFjZWQ6IE5hbWVzcGFjZWRDb250ZXh0O1xuICAgIHR5cGVkOiBUeXBlZENvbnRleHQ7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDb250ZXh0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQ29udGV4dCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5uYW1lc3BhY2VkKSB7bS5uYW1lc3BhY2VkID0gTmFtZXNwYWNlZENvbnRleHQuZnJvbVByb3RvKHByb3RvLm5hbWVzcGFjZWQpO31cbiAgICAgICAgaWYgKHByb3RvLnR5cGVkKSB7bS50eXBlZCA9IFR5cGVkQ29udGV4dC5mcm9tUHJvdG8ocHJvdG8udHlwZWQpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Db250ZXh0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5uYW1lc3BhY2VkID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudHlwZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5uYW1lc3BhY2VkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm5hbWVzcGFjZWQgIT09IG51bGwpIHt0b1JldHVyblsnbmFtZXNwYWNlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5uYW1lc3BhY2VkID8gKHRoaXMubmFtZXNwYWNlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5uYW1lc3BhY2VkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnR5cGVkICE9PSBudWxsKSB7dG9SZXR1cm5bJ3R5cGVkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnR5cGVkID8gKHRoaXMudHlwZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMudHlwZWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2VvUG9pbnRBdHRyaWJ1dGUgaW1wbGVtZW50cyBpLkdlb1BvaW50QXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBsYXRpdHVkZTogbnVtYmVyO1xuICAgIGxvbmdpdHVkZTogbnVtYmVyO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2VvUG9pbnRBdHRyaWJ1dGUge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZW9Qb2ludEF0dHJpYnV0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuR2VvUG9pbnRBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmxhdGl0dWRlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMubG9uZ2l0dWRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGF0aXR1ZGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2xhdGl0dWRlJ10gPSB0aGlzLmxhdGl0dWRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvbmdpdHVkZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbG9uZ2l0dWRlJ10gPSB0aGlzLmxvbmdpdHVkZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0QXR0cmlidXRlIGltcGxlbWVudHMgaS5MaXN0QXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExpc3RBdHRyaWJ1dGUge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0QXR0cmlidXRlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmF0dHJpYnV0ZXMpIHttLmF0dHJpYnV0ZXMgPSBwcm90by5hdHRyaWJ1dGVzLm1hcChBdHRyaWJ1dGUuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTGlzdEF0dHJpYnV0ZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuYXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydhdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmF0dHJpYnV0ZXMgPyAodGhpcy5hdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmF0dHJpYnV0ZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlWYWx1ZUF0dHJpYnV0ZSBpbXBsZW1lbnRzIGkuTXVsdGlWYWx1ZUF0dHJpYnV0ZUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWVzOiBzdHJpbmdbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE11bHRpVmFsdWVBdHRyaWJ1dGUge1xuICAgICAgICBsZXQgbSA9IG5ldyBNdWx0aVZhbHVlQXR0cmlidXRlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5NdWx0aVZhbHVlQXR0cmlidXRlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5rZXkgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWVzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZXMnXSA9IHRoaXMudmFsdWVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uIGltcGxlbWVudHMgaS5NdXRhdGlvbkludGVyZmFjZSB7XG4gICAgYWRkOiBTaW5nbGVWYWx1ZUF0dHJpYnV0ZTtcbiAgICByZXBsYWNlOiBNdWx0aVZhbHVlQXR0cmlidXRlO1xuICAgIHJlbW92ZTogU2luZ2xlVmFsdWVBdHRyaWJ1dGU7XG4gICAgZHJvcEtleTogc3RyaW5nO1xuICAgIHJlcGxhY2VBdHRyaWJ1dGVzOiBTdHJ1Y3RBdHRyaWJ1dGU7XG4gICAgYWRkQXR0cmlidXRlczogU3RydWN0QXR0cmlidXRlO1xuICAgIHJlbW92ZUF0dHJpYnV0ZXM6IFN0cnVjdEF0dHJpYnV0ZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE11dGF0aW9uIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTXV0YXRpb24oKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYWRkKSB7bS5hZGQgPSBTaW5nbGVWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uYWRkKTt9XG4gICAgICAgIGlmIChwcm90by5yZXBsYWNlKSB7bS5yZXBsYWNlID0gTXVsdGlWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8ucmVwbGFjZSk7fVxuICAgICAgICBpZiAocHJvdG8ucmVtb3ZlKSB7bS5yZW1vdmUgPSBTaW5nbGVWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8ucmVtb3ZlKTt9XG4gICAgICAgIGlmIChwcm90by5yZXBsYWNlQXR0cmlidXRlcykge20ucmVwbGFjZUF0dHJpYnV0ZXMgPSBTdHJ1Y3RBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnJlcGxhY2VBdHRyaWJ1dGVzKTt9XG4gICAgICAgIGlmIChwcm90by5hZGRBdHRyaWJ1dGVzKSB7bS5hZGRBdHRyaWJ1dGVzID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5hZGRBdHRyaWJ1dGVzKTt9XG4gICAgICAgIGlmIChwcm90by5yZW1vdmVBdHRyaWJ1dGVzKSB7bS5yZW1vdmVBdHRyaWJ1dGVzID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5yZW1vdmVBdHRyaWJ1dGVzKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTXV0YXRpb25JbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmFkZCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnJlcGxhY2UgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5yZW1vdmUgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5kcm9wS2V5ID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5hZGRBdHRyaWJ1dGVzID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucmVtb3ZlQXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFkZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hZGQgIT09IG51bGwpIHt0b1JldHVyblsnYWRkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmFkZCA/ICh0aGlzLmFkZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hZGQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGFjZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5yZXBsYWNlICE9PSBudWxsKSB7dG9SZXR1cm5bJ3JlcGxhY2UnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVwbGFjZSA/ICh0aGlzLnJlcGxhY2UgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucmVwbGFjZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5yZW1vdmUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVtb3ZlICE9PSBudWxsKSB7dG9SZXR1cm5bJ3JlbW92ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5yZW1vdmUgPyAodGhpcy5yZW1vdmUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucmVtb3ZlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRyb3BLZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2Ryb3BLZXknXSA9IHRoaXMuZHJvcEtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5yZXBsYWNlQXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5yZXBsYWNlQXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydyZXBsYWNlQXR0cmlidXRlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5yZXBsYWNlQXR0cmlidXRlcyA/ICh0aGlzLnJlcGxhY2VBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlcGxhY2VBdHRyaWJ1dGVzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFkZEF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYWRkQXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydhZGRBdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmFkZEF0dHJpYnV0ZXMgPyAodGhpcy5hZGRBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmFkZEF0dHJpYnV0ZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVtb3ZlQXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3JlbW92ZUF0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVtb3ZlQXR0cmlidXRlcyA/ICh0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucmVtb3ZlQXR0cmlidXRlczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOYW1lc3BhY2VkQ29udGV4dCBpbXBsZW1lbnRzIGkuTmFtZXNwYWNlZENvbnRleHRJbnRlcmZhY2Uge1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE5hbWVzcGFjZWRDb250ZXh0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTmFtZXNwYWNlZENvbnRleHQoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk5hbWVzcGFjZWRDb250ZXh0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5uYW1lc3BhY2UgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubmFtZXNwYWNlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyduYW1lc3BhY2UnXSA9IHRoaXMubmFtZXNwYWNlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3R5cGUnXSA9IHRoaXMudHlwZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJzb25hIGltcGxlbWVudHMgaS5QZXJzb25hSW50ZXJmYWNlIHtcbiAgICBzdWJqZWN0OiBTdWJqZWN0O1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBQZXJzb25hIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUGVyc29uYSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zdWJqZWN0KSB7bS5zdWJqZWN0ID0gU3ViamVjdC5mcm9tUHJvdG8ocHJvdG8uc3ViamVjdCk7fVxuICAgICAgICBpZiAocHJvdG8uY29udGV4dCkge20uY29udGV4dCA9IENvbnRleHQuZnJvbVByb3RvKHByb3RvLmNvbnRleHQpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5QZXJzb25hSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zdWJqZWN0ID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuY29udGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3ViamVjdCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdWJqZWN0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN1YmplY3QgPyAodGhpcy5zdWJqZWN0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN1YmplY3Q7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jb250ZXh0ICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NvbnRleHQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY29udGV4dCA/ICh0aGlzLmNvbnRleHQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY29udGV4dDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQdWJsaWNLZXkgaW1wbGVtZW50cyBpLlB1YmxpY0tleUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBhbGdvcml0aG1UeXBlOiBlLkFsZ29yaXRobVR5cGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBQdWJsaWNLZXkge1xuICAgICAgICBsZXQgbSA9IG5ldyBQdWJsaWNLZXkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYWxnb3JpdGhtVHlwZSkge20uYWxnb3JpdGhtVHlwZSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuQWxnb3JpdGhtVHlwZT4oZS5BbGdvcml0aG1UeXBlLCBwcm90by5hbGdvcml0aG1UeXBlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUHVibGljS2V5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5rZXkgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5pZCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmFsZ29yaXRobVR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2lkJ10gPSB0aGlzLmlkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFsZ29yaXRobVR5cGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FsZ29yaXRobVR5cGUnXSA9IHRoaXMuYWxnb3JpdGhtVHlwZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeSBpbXBsZW1lbnRzIGkuUXVlcnlJbnRlcmZhY2Uge1xuICAgIHNlYXJjaFRlcm06IHN0cmluZztcbiAgICBhdHRyaWJ1dGVLZXlzOiBzdHJpbmdbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFF1ZXJ5IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUXVlcnkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlF1ZXJ5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZWFyY2hUZXJtID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuYXR0cmlidXRlS2V5cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXJjaFRlcm0gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NlYXJjaFRlcm0nXSA9IHRoaXMuc2VhcmNoVGVybTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdHRyaWJ1dGVLZXlzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhdHRyaWJ1dGVLZXlzJ10gPSB0aGlzLmF0dHJpYnV0ZUtleXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2luZ2xlVmFsdWVBdHRyaWJ1dGUgaW1wbGVtZW50cyBpLlNpbmdsZVZhbHVlQXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2luZ2xlVmFsdWVBdHRyaWJ1dGUge1xuICAgICAgICBsZXQgbSA9IG5ldyBTaW5nbGVWYWx1ZUF0dHJpYnV0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2luZ2xlVmFsdWVBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmtleSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZSddID0gdGhpcy52YWx1ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJ1Y3RBdHRyaWJ1dGUgaW1wbGVtZW50cyBpLlN0cnVjdEF0dHJpYnV0ZUludGVyZmFjZSB7XG4gICAgYXR0cmlidXRlczoge1trZXk6IHN0cmluZ106IEF0dHJpYnV0ZX07XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTdHJ1Y3RBdHRyaWJ1dGUge1xuICAgICAgICBsZXQgbSA9IG5ldyBTdHJ1Y3RBdHRyaWJ1dGUoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYXR0cmlidXRlcykge20uYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKHByb3RvLmF0dHJpYnV0ZXMpLnJlZHVjZTxhbnk+KChvYmosIGspID0+IHsgb2JqW2tdID0gQXR0cmlidXRlLmZyb21Qcm90byhwcm90by5hdHRyaWJ1dGVzW2tdKTsgcmV0dXJuIG9iajsgfSwge30pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TdHJ1Y3RBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmF0dHJpYnV0ZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsnYXR0cmlidXRlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hdHRyaWJ1dGVzID8gKHRoaXMuYXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hdHRyaWJ1dGVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1YmplY3QgaW1wbGVtZW50cyBpLlN1YmplY3RJbnRlcmZhY2Uge1xuICAgIHN1YmplY3RJZDogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlczogTXVsdGlWYWx1ZUF0dHJpYnV0ZVtdO1xuICAgIGNyZWF0ZWQ6IERhdGU7XG4gICAgdXBkYXRlZDogRGF0ZTtcbiAgICBsYXN0TG9naW46IERhdGU7XG4gICAgcHVibGljS2V5czogUHVibGljS2V5W107XG4gICAgc3RydWN0QXR0cmlidXRlczogU3RydWN0QXR0cmlidXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU3ViamVjdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYXR0cmlidXRlcykge20uYXR0cmlidXRlcyA9IHByb3RvLmF0dHJpYnV0ZXMubWFwKE11bHRpVmFsdWVBdHRyaWJ1dGUuZnJvbVByb3RvKTt9XG4gICAgICAgIGlmIChwcm90by5jcmVhdGVkKSB7bS5jcmVhdGVkID0gbmV3IERhdGUocHJvdG8uY3JlYXRlZCk7fVxuICAgICAgICBpZiAocHJvdG8udXBkYXRlZCkge20udXBkYXRlZCA9IG5ldyBEYXRlKHByb3RvLnVwZGF0ZWQpO31cbiAgICAgICAgaWYgKHByb3RvLmxhc3RMb2dpbikge20ubGFzdExvZ2luID0gbmV3IERhdGUocHJvdG8ubGFzdExvZ2luKTt9XG4gICAgICAgIGlmIChwcm90by5wdWJsaWNLZXlzKSB7bS5wdWJsaWNLZXlzID0gcHJvdG8ucHVibGljS2V5cy5tYXAoUHVibGljS2V5LmZyb21Qcm90byk7fVxuICAgICAgICBpZiAocHJvdG8uc3RydWN0QXR0cmlidXRlcykge20uc3RydWN0QXR0cmlidXRlcyA9IFN0cnVjdEF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uc3RydWN0QXR0cmlidXRlcyk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlN1YmplY3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnN1YmplY3RJZCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmVtYWlsID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudXNlcklkID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucGFydG5lcklkID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuYXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNyZWF0ZWQgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy51cGRhdGVkID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMubGFzdExvZ2luID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHVibGljS2V5cyA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdWJqZWN0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3N1YmplY3RJZCddID0gdGhpcy5zdWJqZWN0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW1haWwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2VtYWlsJ10gPSB0aGlzLmVtYWlsO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVzZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndXNlcklkJ10gPSB0aGlzLnVzZXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0bmVySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhcnRuZXJJZCddID0gdGhpcy5wYXJ0bmVySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hdHRyaWJ1dGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2F0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYXR0cmlidXRlcyA/ICh0aGlzLmF0dHJpYnV0ZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYXR0cmlidXRlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jcmVhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNyZWF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsnY3JlYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jcmVhdGVkID8gKHRoaXMuY3JlYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jcmVhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVwZGF0ZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudXBkYXRlZCAhPT0gbnVsbCkge3RvUmV0dXJuWyd1cGRhdGVkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnVwZGF0ZWQgPyAodGhpcy51cGRhdGVkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnVwZGF0ZWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGFzdExvZ2luICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmxhc3RMb2dpbiAhPT0gbnVsbCkge3RvUmV0dXJuWydsYXN0TG9naW4nXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubGFzdExvZ2luID8gKHRoaXMubGFzdExvZ2luIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmxhc3RMb2dpbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wdWJsaWNLZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnB1YmxpY0tleXMgIT09IG51bGwpIHt0b1JldHVyblsncHVibGljS2V5cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wdWJsaWNLZXlzID8gKHRoaXMucHVibGljS2V5cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wdWJsaWNLZXlzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3RydWN0QXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydzdHJ1Y3RBdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgPyAodGhpcy5zdHJ1Y3RBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3ViamVjdFJlc3VsdCBpbXBsZW1lbnRzIGkuU3ViamVjdFJlc3VsdEludGVyZmFjZSB7XG4gICAgc3ViamVjdDogU3ViamVjdDtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFN1YmplY3RSZXN1bHQge1xuICAgICAgICBsZXQgbSA9IG5ldyBTdWJqZWN0UmVzdWx0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnN1YmplY3QpIHttLnN1YmplY3QgPSBTdWJqZWN0LmZyb21Qcm90byhwcm90by5zdWJqZWN0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU3ViamVjdFJlc3VsdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3ViamVjdCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdWJqZWN0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN1YmplY3QgPyAodGhpcy5zdWJqZWN0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN1YmplY3Q7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZWRDb250ZXh0IGltcGxlbWVudHMgaS5UeXBlZENvbnRleHRJbnRlcmZhY2Uge1xuICAgIHR5cGU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFR5cGVkQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IFR5cGVkQ29udGV4dCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVHlwZWRDb250ZXh0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndHlwZSddID0gdGhpcy50eXBlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIl19
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViamVjdHMuanMiLCJzb3VyY2VSb290IjoiL3dvcmtzcGFjZS9zZGtzL3R5cGVzY3JpcHQvc3JjL2lhbV9zZGsvc3JjLyIsInNvdXJjZXMiOlsibGliL19pbnRlcm5hbC9vYmplY3RzL3N1YmplY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUM7QUFFOUIsTUFBTSxVQUFVLGlCQUFpQixDQUFJLE9BQVksRUFBRSxLQUFhO0lBQzlELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxPQUFPLE9BQU87SUFZaEIsWUFBWSxNQUEyQjtRQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQWJELE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFBQyxDQUFDLENBQUMsVUFBVSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7U0FBQztRQUNyRixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQUM7UUFDakUsT0FBTyxDQUFDLENBQUM7SUFD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Q0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQVNELFNBQVM7UUFDTCxNQUFNLFFBQVEsR0FFVixFQUFFLENBQUM7UUFFUCxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7WUFBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUFDO1FBQ3JFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gT2JqZWN0cy5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuaW1wb3J0ICogYXMgaSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFN0cnVjdEF0dHJpYnV0ZSB9IGZyb20gJy4vYXR0cmlidXRlcyc7XG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IGltcGxlbWVudHMgaS5Db250ZXh0SW50ZXJmYWNlIHtcbiAgICBuYW1lc3BhY2VkOiBOYW1lc3BhY2VkQ29udGV4dDtcbiAgICB0eXBlZDogVHlwZWRDb250ZXh0O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IENvbnRleHQoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubmFtZXNwYWNlZCkge20ubmFtZXNwYWNlZCA9IE5hbWVzcGFjZWRDb250ZXh0LmZyb21Qcm90byhwcm90by5uYW1lc3BhY2VkKTt9XG4gICAgICAgIGlmIChwcm90by50eXBlZCkge20udHlwZWQgPSBUeXBlZENvbnRleHQuZnJvbVByb3RvKHByb3RvLnR5cGVkKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ29udGV4dEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm5hbWVzcGFjZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubmFtZXNwYWNlZCAhPT0gbnVsbCkge3RvUmV0dXJuWyduYW1lc3BhY2VkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm5hbWVzcGFjZWQgPyAodGhpcy5uYW1lc3BhY2VkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm5hbWVzcGFjZWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudHlwZWQgIT09IG51bGwpIHt0b1JldHVyblsndHlwZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudHlwZWQgPyAodGhpcy50eXBlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50eXBlZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aVZhbHVlQXR0cmlidXRlIGltcGxlbWVudHMgaS5NdWx0aVZhbHVlQXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZXM6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTXVsdGlWYWx1ZUF0dHJpYnV0ZSB7XG4gICAgICAgIGxldCBtID0gbmV3IE11bHRpVmFsdWVBdHRyaWJ1dGUoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk11bHRpVmFsdWVBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWVzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZXMnXSA9IHRoaXMudmFsdWVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uIGltcGxlbWVudHMgaS5NdXRhdGlvbkludGVyZmFjZSB7XG4gICAgYWRkOiBTaW5nbGVWYWx1ZUF0dHJpYnV0ZTtcbiAgICByZXBsYWNlOiBNdWx0aVZhbHVlQXR0cmlidXRlO1xuICAgIHJlbW92ZTogU2luZ2xlVmFsdWVBdHRyaWJ1dGU7XG4gICAgZHJvcEtleTogc3RyaW5nO1xuICAgIHJlcGxhY2VBdHRyaWJ1dGVzOiBTdHJ1Y3RBdHRyaWJ1dGU7XG4gICAgYWRkQXR0cmlidXRlczogU3RydWN0QXR0cmlidXRlO1xuICAgIHJlbW92ZUF0dHJpYnV0ZXM6IFN0cnVjdEF0dHJpYnV0ZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE11dGF0aW9uIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTXV0YXRpb24oKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYWRkKSB7bS5hZGQgPSBTaW5nbGVWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uYWRkKTt9XG4gICAgICAgIGlmIChwcm90by5yZXBsYWNlKSB7bS5yZXBsYWNlID0gTXVsdGlWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8ucmVwbGFjZSk7fVxuICAgICAgICBpZiAocHJvdG8ucmVtb3ZlKSB7bS5yZW1vdmUgPSBTaW5nbGVWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8ucmVtb3ZlKTt9XG4gICAgICAgIGlmIChwcm90by5yZXBsYWNlQXR0cmlidXRlcykge20ucmVwbGFjZUF0dHJpYnV0ZXMgPSBTdHJ1Y3RBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnJlcGxhY2VBdHRyaWJ1dGVzKTt9XG4gICAgICAgIGlmIChwcm90by5hZGRBdHRyaWJ1dGVzKSB7bS5hZGRBdHRyaWJ1dGVzID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5hZGRBdHRyaWJ1dGVzKTt9XG4gICAgICAgIGlmIChwcm90by5yZW1vdmVBdHRyaWJ1dGVzKSB7bS5yZW1vdmVBdHRyaWJ1dGVzID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5yZW1vdmVBdHRyaWJ1dGVzKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTXV0YXRpb25JbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYWRkICE9PSBudWxsKSB7dG9SZXR1cm5bJ2FkZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hZGQgPyAodGhpcy5hZGQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYWRkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlcGxhY2UgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVwbGFjZSAhPT0gbnVsbCkge3RvUmV0dXJuWydyZXBsYWNlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnJlcGxhY2UgPyAodGhpcy5yZXBsYWNlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlcGxhY2U7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVtb3ZlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnJlbW92ZSAhPT0gbnVsbCkge3RvUmV0dXJuWydyZW1vdmUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVtb3ZlID8gKHRoaXMucmVtb3ZlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlbW92ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kcm9wS2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydkcm9wS2V5J10gPSB0aGlzLmRyb3BLZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsncmVwbGFjZUF0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgPyAodGhpcy5yZXBsYWNlQXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5yZXBsYWNlQXR0cmlidXRlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGRBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmFkZEF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsnYWRkQXR0cmlidXRlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hZGRBdHRyaWJ1dGVzID8gKHRoaXMuYWRkQXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hZGRBdHRyaWJ1dGVzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVtb3ZlQXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydyZW1vdmVBdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgPyAodGhpcy5yZW1vdmVBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlZENvbnRleHQgaW1wbGVtZW50cyBpLk5hbWVzcGFjZWRDb250ZXh0SW50ZXJmYWNlIHtcbiAgICBuYW1lc3BhY2U6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBOYW1lc3BhY2VkQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IE5hbWVzcGFjZWRDb250ZXh0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5OYW1lc3BhY2VkQ29udGV4dEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm5hbWVzcGFjZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbmFtZXNwYWNlJ10gPSB0aGlzLm5hbWVzcGFjZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0eXBlJ10gPSB0aGlzLnR5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGVyc29uYSBpbXBsZW1lbnRzIGkuUGVyc29uYUludGVyZmFjZSB7XG4gICAgc3ViamVjdDogU3ViamVjdDtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUGVyc29uYSB7XG4gICAgICAgIGxldCBtID0gbmV3IFBlcnNvbmEoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc3ViamVjdCkge20uc3ViamVjdCA9IFN1YmplY3QuZnJvbVByb3RvKHByb3RvLnN1YmplY3QpO31cbiAgICAgICAgaWYgKHByb3RvLmNvbnRleHQpIHttLmNvbnRleHQgPSBDb250ZXh0LmZyb21Qcm90byhwcm90by5jb250ZXh0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUGVyc29uYUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3ViamVjdCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdWJqZWN0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN1YmplY3QgPyAodGhpcy5zdWJqZWN0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN1YmplY3Q7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jb250ZXh0ICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NvbnRleHQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY29udGV4dCA/ICh0aGlzLmNvbnRleHQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY29udGV4dDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQdWJsaWNLZXkgaW1wbGVtZW50cyBpLlB1YmxpY0tleUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBhbGdvcml0aG1UeXBlOiBlLkFsZ29yaXRobVR5cGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBQdWJsaWNLZXkge1xuICAgICAgICBsZXQgbSA9IG5ldyBQdWJsaWNLZXkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYWxnb3JpdGhtVHlwZSkge20uYWxnb3JpdGhtVHlwZSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuQWxnb3JpdGhtVHlwZT4oZS5BbGdvcml0aG1UeXBlLCBwcm90by5hbGdvcml0aG1UeXBlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUHVibGljS2V5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpZCddID0gdGhpcy5pZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hbGdvcml0aG1UeXBlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhbGdvcml0aG1UeXBlJ10gPSB0aGlzLmFsZ29yaXRobVR5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlcnkgaW1wbGVtZW50cyBpLlF1ZXJ5SW50ZXJmYWNlIHtcbiAgICBzZWFyY2hUZXJtOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlS2V5czogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBRdWVyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IFF1ZXJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5RdWVyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXJjaFRlcm0gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NlYXJjaFRlcm0nXSA9IHRoaXMuc2VhcmNoVGVybTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdHRyaWJ1dGVLZXlzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhdHRyaWJ1dGVLZXlzJ10gPSB0aGlzLmF0dHJpYnV0ZUtleXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2luZ2xlVmFsdWVBdHRyaWJ1dGUgaW1wbGVtZW50cyBpLlNpbmdsZVZhbHVlQXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2luZ2xlVmFsdWVBdHRyaWJ1dGUge1xuICAgICAgICBsZXQgbSA9IG5ldyBTaW5nbGVWYWx1ZUF0dHJpYnV0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2luZ2xlVmFsdWVBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3ZhbHVlJ10gPSB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1YmplY3QgaW1wbGVtZW50cyBpLlN1YmplY3RJbnRlcmZhY2Uge1xuICAgIHN1YmplY3RJZDogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlczogTXVsdGlWYWx1ZUF0dHJpYnV0ZVtdO1xuICAgIGNyZWF0ZWQ6IERhdGU7XG4gICAgdXBkYXRlZDogRGF0ZTtcbiAgICBsYXN0TG9naW46IERhdGU7XG4gICAgcHVibGljS2V5czogUHVibGljS2V5W107XG4gICAgc3RydWN0QXR0cmlidXRlczogU3RydWN0QXR0cmlidXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU3ViamVjdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYXR0cmlidXRlcykge20uYXR0cmlidXRlcyA9IHByb3RvLmF0dHJpYnV0ZXMubWFwKE11bHRpVmFsdWVBdHRyaWJ1dGUuZnJvbVByb3RvKTt9XG4gICAgICAgIGlmIChwcm90by5jcmVhdGVkKSB7bS5jcmVhdGVkID0gbmV3IERhdGUocHJvdG8uY3JlYXRlZCk7fVxuICAgICAgICBpZiAocHJvdG8udXBkYXRlZCkge20udXBkYXRlZCA9IG5ldyBEYXRlKHByb3RvLnVwZGF0ZWQpO31cbiAgICAgICAgaWYgKHByb3RvLmxhc3RMb2dpbikge20ubGFzdExvZ2luID0gbmV3IERhdGUocHJvdG8ubGFzdExvZ2luKTt9XG4gICAgICAgIGlmIChwcm90by5wdWJsaWNLZXlzKSB7bS5wdWJsaWNLZXlzID0gcHJvdG8ucHVibGljS2V5cy5tYXAoUHVibGljS2V5LmZyb21Qcm90byk7fVxuICAgICAgICBpZiAocHJvdG8uc3RydWN0QXR0cmlidXRlcykge20uc3RydWN0QXR0cmlidXRlcyA9IFN0cnVjdEF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uc3RydWN0QXR0cmlidXRlcyk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlN1YmplY3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdWJqZWN0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3N1YmplY3RJZCddID0gdGhpcy5zdWJqZWN0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW1haWwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2VtYWlsJ10gPSB0aGlzLmVtYWlsO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVzZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndXNlcklkJ10gPSB0aGlzLnVzZXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0bmVySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhcnRuZXJJZCddID0gdGhpcy5wYXJ0bmVySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hdHRyaWJ1dGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2F0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYXR0cmlidXRlcyA/ICh0aGlzLmF0dHJpYnV0ZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYXR0cmlidXRlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jcmVhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNyZWF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsnY3JlYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jcmVhdGVkID8gKHRoaXMuY3JlYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jcmVhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVwZGF0ZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudXBkYXRlZCAhPT0gbnVsbCkge3RvUmV0dXJuWyd1cGRhdGVkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnVwZGF0ZWQgPyAodGhpcy51cGRhdGVkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnVwZGF0ZWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGFzdExvZ2luICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmxhc3RMb2dpbiAhPT0gbnVsbCkge3RvUmV0dXJuWydsYXN0TG9naW4nXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubGFzdExvZ2luID8gKHRoaXMubGFzdExvZ2luIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmxhc3RMb2dpbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wdWJsaWNLZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnB1YmxpY0tleXMgIT09IG51bGwpIHt0b1JldHVyblsncHVibGljS2V5cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wdWJsaWNLZXlzID8gKHRoaXMucHVibGljS2V5cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wdWJsaWNLZXlzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3RydWN0QXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydzdHJ1Y3RBdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgPyAodGhpcy5zdHJ1Y3RBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3ViamVjdFJlc3VsdCBpbXBsZW1lbnRzIGkuU3ViamVjdFJlc3VsdEludGVyZmFjZSB7XG4gICAgc3ViamVjdDogU3ViamVjdDtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFN1YmplY3RSZXN1bHQge1xuICAgICAgICBsZXQgbSA9IG5ldyBTdWJqZWN0UmVzdWx0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnN1YmplY3QpIHttLnN1YmplY3QgPSBTdWJqZWN0LmZyb21Qcm90byhwcm90by5zdWJqZWN0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU3ViamVjdFJlc3VsdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3ViamVjdCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdWJqZWN0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN1YmplY3QgPyAodGhpcy5zdWJqZWN0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN1YmplY3Q7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZWRDb250ZXh0IGltcGxlbWVudHMgaS5UeXBlZENvbnRleHRJbnRlcmZhY2Uge1xuICAgIHR5cGU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFR5cGVkQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IFR5cGVkQ29udGV4dCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVHlwZWRDb250ZXh0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndHlwZSddID0gdGhpcy50eXBlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIl19