angular-odata 0.123.0 → 0.125.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/esm2022/lib/api.mjs +1 -1
  2. package/esm2022/lib/cache/cache.mjs +4 -2
  3. package/esm2022/lib/cache/storage.mjs +1 -1
  4. package/esm2022/lib/client.mjs +5 -6
  5. package/esm2022/lib/constants.mjs +2 -1
  6. package/esm2022/lib/helper.mjs +2 -2
  7. package/esm2022/lib/loaders.mjs +1 -1
  8. package/esm2022/lib/models/collection.mjs +83 -93
  9. package/esm2022/lib/models/model.mjs +154 -112
  10. package/esm2022/lib/models/options.mjs +86 -59
  11. package/esm2022/lib/module.mjs +6 -7
  12. package/esm2022/lib/resources/path/segments.mjs +6 -6
  13. package/esm2022/lib/resources/query/builder.mjs +11 -6
  14. package/esm2022/lib/resources/query/expressions/base.mjs +1 -1
  15. package/esm2022/lib/resources/query/expressions/compute.mjs +5 -5
  16. package/esm2022/lib/resources/query/expressions/count.mjs +19 -9
  17. package/esm2022/lib/resources/query/expressions/expand.mjs +15 -9
  18. package/esm2022/lib/resources/query/expressions/filter.mjs +7 -7
  19. package/esm2022/lib/resources/query/expressions/orderby.mjs +7 -7
  20. package/esm2022/lib/resources/query/expressions/search.mjs +5 -5
  21. package/esm2022/lib/resources/query/expressions/select.mjs +5 -5
  22. package/esm2022/lib/resources/query/expressions/syntax.mjs +89 -45
  23. package/esm2022/lib/resources/query/handlers.mjs +1 -1
  24. package/esm2022/lib/resources/query/options.mjs +6 -6
  25. package/esm2022/lib/resources/request.mjs +1 -1
  26. package/esm2022/lib/resources/resource.mjs +11 -5
  27. package/esm2022/lib/resources/responses/annotations.mjs +1 -1
  28. package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +1 -1
  29. package/esm2022/lib/resources/responses/csdl/csdl-entity-container.mjs +1 -1
  30. package/esm2022/lib/resources/responses/csdl/csdl-entity-set.mjs +1 -1
  31. package/esm2022/lib/resources/responses/csdl/csdl-enum-type.mjs +1 -1
  32. package/esm2022/lib/resources/responses/csdl/csdl-function-action.mjs +1 -1
  33. package/esm2022/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +1 -1
  34. package/esm2022/lib/resources/responses/csdl/csdl-reference.mjs +1 -1
  35. package/esm2022/lib/resources/responses/csdl/csdl-schema.mjs +1 -1
  36. package/esm2022/lib/resources/responses/csdl/csdl-singleton.mjs +1 -1
  37. package/esm2022/lib/resources/responses/csdl/csdl-structural-property.mjs +1 -1
  38. package/esm2022/lib/resources/responses/csdl/csdl-structured-type.mjs +1 -1
  39. package/esm2022/lib/resources/responses/csdl/csdl-type-definition.mjs +1 -1
  40. package/esm2022/lib/resources/responses/metadata.mjs +2 -3
  41. package/esm2022/lib/resources/responses/response.mjs +1 -1
  42. package/esm2022/lib/resources/types/action.mjs +1 -1
  43. package/esm2022/lib/resources/types/batch.mjs +1 -1
  44. package/esm2022/lib/resources/types/count.mjs +1 -1
  45. package/esm2022/lib/resources/types/entity-set.mjs +1 -1
  46. package/esm2022/lib/resources/types/entity.mjs +1 -1
  47. package/esm2022/lib/resources/types/function.mjs +1 -1
  48. package/esm2022/lib/resources/types/media.mjs +1 -1
  49. package/esm2022/lib/resources/types/navigation-property.mjs +1 -1
  50. package/esm2022/lib/resources/types/property.mjs +1 -1
  51. package/esm2022/lib/resources/types/reference.mjs +1 -1
  52. package/esm2022/lib/resources/types/singleton.mjs +1 -1
  53. package/esm2022/lib/resources/types/value.mjs +1 -1
  54. package/esm2022/lib/schema/annotation.mjs +1 -1
  55. package/esm2022/lib/schema/callable.mjs +1 -1
  56. package/esm2022/lib/schema/element.mjs +1 -1
  57. package/esm2022/lib/schema/entity-container.mjs +1 -1
  58. package/esm2022/lib/schema/enum-type.mjs +1 -1
  59. package/esm2022/lib/schema/parsers/callable.mjs +1 -1
  60. package/esm2022/lib/schema/parsers/edm.mjs +1 -1
  61. package/esm2022/lib/schema/parsers/enum-type.mjs +1 -1
  62. package/esm2022/lib/schema/parsers/structured-type.mjs +14 -2
  63. package/esm2022/lib/schema/schema.mjs +1 -1
  64. package/esm2022/lib/schema/structured-type.mjs +9 -4
  65. package/esm2022/lib/services/base.mjs +1 -1
  66. package/esm2022/lib/services/entity-set.mjs +1 -1
  67. package/esm2022/lib/services/factory.mjs +5 -6
  68. package/esm2022/lib/services/singleton.mjs +1 -1
  69. package/esm2022/lib/settings.mjs +1 -1
  70. package/esm2022/lib/types.mjs +1 -1
  71. package/esm2022/lib/utils/arrays.mjs +1 -1
  72. package/esm2022/lib/utils/durations.mjs +1 -1
  73. package/esm2022/lib/utils/enums.mjs +1 -1
  74. package/esm2022/lib/utils/http.mjs +1 -1
  75. package/esm2022/lib/utils/objects.mjs +1 -1
  76. package/esm2022/lib/utils/odata.mjs +1 -1
  77. package/esm2022/lib/utils/types.mjs +4 -1
  78. package/fesm2022/angular-odata.mjs +521 -363
  79. package/fesm2022/angular-odata.mjs.map +1 -1
  80. package/lib/constants.d.ts +1 -0
  81. package/lib/helper.d.ts +10 -10
  82. package/lib/models/collection.d.ts +4 -5
  83. package/lib/models/model.d.ts +9 -9
  84. package/lib/models/options.d.ts +31 -10
  85. package/lib/resources/path/segments.d.ts +14 -5
  86. package/lib/resources/query/expressions/base.d.ts +3 -1
  87. package/lib/resources/query/expressions/compute.d.ts +8 -6
  88. package/lib/resources/query/expressions/count.d.ts +11 -8
  89. package/lib/resources/query/expressions/expand.d.ts +15 -12
  90. package/lib/resources/query/expressions/filter.d.ts +7 -5
  91. package/lib/resources/query/expressions/orderby.d.ts +9 -6
  92. package/lib/resources/query/expressions/search.d.ts +9 -6
  93. package/lib/resources/query/expressions/select.d.ts +7 -5
  94. package/lib/resources/query/expressions/syntax.d.ts +16 -13
  95. package/lib/resources/query/options.d.ts +14 -5
  96. package/lib/resources/resource.d.ts +1 -1
  97. package/lib/resources/responses/annotations.d.ts +9 -9
  98. package/lib/schema/parsers/structured-type.d.ts +3 -0
  99. package/lib/schema/structured-type.d.ts +2 -1
  100. package/lib/utils/enums.d.ts +7 -7
  101. package/lib/utils/types.d.ts +1 -0
  102. package/package.json +1 -1
@@ -1,12 +1,11 @@
1
- import { EventEmitter } from '@angular/core';
2
1
  import { forkJoin, Observable, of, throwError } from 'rxjs';
3
2
  import { finalize, map, switchMap } from 'rxjs/operators';
4
3
  import { DEFAULT_VERSION } from '../constants';
5
4
  import { ODataHelper } from '../helper';
6
- import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
5
+ import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
7
6
  import { Types } from '../utils/types';
8
- import { BUBBLING, INCLUDE_DEEP, INCLUDE_SHALLOW, ODataModelEvent, ODataModelEventType, ODataModelOptions, ODataModelState, } from './options';
9
- class ODataCollection {
7
+ import { INCLUDE_DEEP, INCLUDE_SHALLOW, ODataModelEventEmitter, ODataModelEventType, ODataModelOptions, ODataModelState, } from './options';
8
+ export class ODataCollection {
10
9
  static { this.model = null; }
11
10
  models() {
12
11
  return this._entries
@@ -21,8 +20,6 @@ class ODataCollection {
21
20
  this._resource = null;
22
21
  this._resources = [];
23
22
  this._entries = [];
24
- //Events
25
- this.events$ = new EventEmitter();
26
23
  this._sortBy = null;
27
24
  const Klass = this.constructor;
28
25
  if (model === undefined && Klass.model !== null)
@@ -30,6 +27,9 @@ class ODataCollection {
30
27
  if (model === undefined)
31
28
  throw new Error('Collection: Collection need model');
32
29
  this._model = model;
30
+ // Events
31
+ this.events$ = new ODataModelEventEmitter({ collection: this });
32
+ this.events$.subscribe((e) => model.meta.events$.emit(e));
33
33
  // Parent
34
34
  if (parent !== undefined) {
35
35
  this._parent = parent;
@@ -85,11 +85,10 @@ class ODataCollection {
85
85
  const current = this._resource;
86
86
  if (current === null || !current.isEqualTo(resource)) {
87
87
  this._resource = resource;
88
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Attach, {
89
- collection: this,
88
+ this.events$.trigger(ODataModelEventType.Attach, {
90
89
  previous: current,
91
90
  value: resource,
92
- }));
91
+ });
93
92
  }
94
93
  }
95
94
  withResource(resource, ctx) {
@@ -165,20 +164,14 @@ class ODataCollection {
165
164
  annots: this.annots(),
166
165
  });
167
166
  }
168
- _request(obs$, { remove } = {}) {
169
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
170
- collection: this,
167
+ _request(obs$, mapCallback) {
168
+ this.events$.trigger(ODataModelEventType.Request, {
171
169
  options: { observable: obs$ },
172
- }));
173
- return obs$.pipe(map(({ entities, annots }) => {
174
- this._annotations = annots;
175
- const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
176
- this.assign(models, { reset: true, remove });
177
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, {
178
- collection: this,
179
- options: { models, entities, annots },
180
- }));
181
- return models;
170
+ });
171
+ return obs$.pipe(map((response) => {
172
+ let parse = mapCallback(response);
173
+ this.events$.trigger(ODataModelEventType.Sync, { options: response });
174
+ return parse;
182
175
  }));
183
176
  }
184
177
  fetch({ withCount, remove, ...options } = {}) {
@@ -190,18 +183,33 @@ class ODataCollection {
190
183
  withCount,
191
184
  ...options,
192
185
  });
193
- return this._request(obs$, { remove });
186
+ return this._request(obs$, ({ entities, annots }) => {
187
+ this._annotations = annots;
188
+ const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
189
+ this.assign(models, { reset: true, remove: remove ?? true });
190
+ return models;
191
+ });
194
192
  }
195
193
  fetchAll({ withCount, remove, ...options } = {}) {
196
194
  const resource = this.resource();
197
195
  const obs$ = resource.fetchAll({ withCount, ...options });
198
- return this._request(obs$, { remove });
196
+ return this._request(obs$, ({ entities, annots }) => {
197
+ this._annotations = annots;
198
+ const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
199
+ this.assign(models, { reset: true, remove: remove ?? true });
200
+ return models;
201
+ });
199
202
  }
200
203
  fetchMany(top, { withCount, remove, ...options } = {}) {
201
204
  const resource = this.resource();
202
205
  resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
203
206
  const obs$ = resource.fetchMany(top, { withCount, ...options });
204
- return this._request(obs$, { remove: remove ?? false });
207
+ return this._request(obs$, ({ entities, annots }) => {
208
+ this._annotations = annots;
209
+ const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
210
+ this.assign(models, { reset: true, remove: remove ?? false });
211
+ return models;
212
+ });
205
213
  }
206
214
  fetchOne({ withCount, remove, ...options } = {}) {
207
215
  return this.fetchMany(1, { withCount, remove, ...options }).pipe(map((models) => models[0]));
@@ -269,15 +277,14 @@ class ODataCollection {
269
277
  ...toUpdateEntity.map((m) => m.asEntity((e) => e.save({ method, ...options }))),
270
278
  ...toUpdateContained.map((m) => m.save({ method, ...options })),
271
279
  ]);
272
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Request, {
273
- collection: this,
280
+ this.events$.trigger(ODataModelEventType.Request, {
274
281
  options: { observable: obs$ },
275
- }));
282
+ });
276
283
  return obs$.pipe(map(() => {
277
284
  this._entries = this._entries
278
285
  .filter((entry) => entry.state !== ODataModelState.Removed)
279
286
  .map((entry) => ({ ...entry, state: ODataModelState.Unchanged }));
280
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Sync, { collection: this }));
287
+ this.events$.trigger(ODataModelEventType.Sync);
281
288
  return this;
282
289
  }));
283
290
  }
@@ -327,10 +334,7 @@ class ODataCollection {
327
334
  else
328
335
  this._entries.push(entry);
329
336
  if (!silent) {
330
- model.events$.emit(new ODataModelEvent(ODataModelEventType.Add, {
331
- model,
332
- collection: this,
333
- }));
337
+ model.events$.trigger(ODataModelEventType.Add, { collection: this });
334
338
  }
335
339
  return entry.model;
336
340
  }
@@ -345,10 +349,9 @@ class ODataCollection {
345
349
  reparent,
346
350
  });
347
351
  if (!silent && added !== undefined) {
348
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
349
- collection: this,
352
+ this.events$.trigger(ODataModelEventType.Update, {
350
353
  options: { added: [added], removed: [], merged: [] },
351
- }));
354
+ });
352
355
  }
353
356
  return added;
354
357
  }
@@ -394,12 +397,9 @@ class ODataCollection {
394
397
  if (entry === undefined || entry.state === ODataModelState.Removed) {
395
398
  return model;
396
399
  }
397
- // Emit Event
400
+ // Trigger Event
398
401
  if (!silent)
399
- model.events$.emit(new ODataModelEvent(ODataModelEventType.Remove, {
400
- model,
401
- collection: this,
402
- }));
402
+ model.events$.trigger(ODataModelEventType.Remove, { collection: this });
403
403
  // Now remove
404
404
  const index = this._entries.indexOf(entry);
405
405
  this._entries.splice(index, 1);
@@ -414,10 +414,9 @@ class ODataCollection {
414
414
  removeModel(model, { silent = false, reset = false, } = {}) {
415
415
  const removed = this._removeModel(model, { silent, reset });
416
416
  if (!silent && removed !== undefined) {
417
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
418
- collection: this,
417
+ this.events$.trigger(ODataModelEventType.Update, {
419
418
  options: { added: [], removed: [removed], merged: [] },
420
- }));
419
+ });
421
420
  }
422
421
  return removed;
423
422
  }
@@ -476,10 +475,9 @@ class ODataCollection {
476
475
  this._addModel(value, { reparent: true });
477
476
  toAdd.push(model);
478
477
  }
479
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
480
- collection: this,
478
+ this.events$.trigger(ODataModelEventType.Update, {
481
479
  options: { added: toAdd, removed: toRemove, changed: toChange },
482
- }));
480
+ });
483
481
  return value;
484
482
  }
485
483
  }
@@ -541,14 +539,13 @@ class ODataCollection {
541
539
  });
542
540
  if (!silent &&
543
541
  (toAdd.length > 0 || toRemove.length > 0 || toChange.length > 0)) {
544
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Reset, {
545
- collection: this,
542
+ this.events$.trigger(ODataModelEventType.Reset, {
546
543
  options: {
547
544
  added: toAdd.map((e) => e.model),
548
545
  removed: toRemove.map((e) => e.model),
549
546
  changed: toChange.map((e) => e.model),
550
547
  },
551
- }));
548
+ });
552
549
  }
553
550
  }
554
551
  clear({ silent = false } = {}) {
@@ -558,10 +555,9 @@ class ODataCollection {
558
555
  });
559
556
  this._entries = [];
560
557
  if (!silent) {
561
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
562
- collection: this,
558
+ this.events$.trigger(ODataModelEventType.Update, {
563
559
  options: { removed: toRemove },
564
- }));
560
+ });
565
561
  }
566
562
  }
567
563
  assign(objects, { remove = true, reset = false, reparent = false, silent = false, } = {}) {
@@ -605,6 +601,8 @@ class ODataCollection {
605
601
  if (model.hasChanged())
606
602
  toChange.push([model, position]);
607
603
  }
604
+ if (reset)
605
+ entry.state = ODataModelState.Unchanged;
608
606
  // Has Sort or Index Change?
609
607
  if (toSort.length > 0 || position !== this.models().indexOf(model)) {
610
608
  toSort.push([model, position]);
@@ -614,7 +612,9 @@ class ODataCollection {
614
612
  // Add
615
613
  model = isModel
616
614
  ? obj
617
- : this.modelFactory(obj);
615
+ : this.modelFactory(obj, {
616
+ reset,
617
+ });
618
618
  toAdd.push([model, position]);
619
619
  }
620
620
  modelMap.push(model[Model.meta.cid]);
@@ -642,15 +642,14 @@ class ODataCollection {
642
642
  toSort.length > 0)) ||
643
643
  reset) {
644
644
  this._sortBy = null;
645
- this.events$.emit(new ODataModelEvent(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, {
646
- collection: this,
645
+ this.events$.trigger(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, {
647
646
  options: {
648
647
  added: toAdd,
649
648
  removed: toRemove,
650
649
  changed: toChange,
651
650
  sorted: toSort,
652
651
  },
653
- }));
652
+ });
654
653
  }
655
654
  }
656
655
  query(ctx) {
@@ -659,40 +658,37 @@ class ODataCollection {
659
658
  this.attach(resource);
660
659
  return this;
661
660
  }
662
- callFunction(name, params, responseType, { ...options } = {}) {
661
+ callFunction(name, params, responseType, options = {}) {
663
662
  const resource = this.resource();
664
- if (resource instanceof ODataEntitySetResource) {
665
- const func = resource.function(name);
666
- func.query((q) => q.apply(options));
667
- switch (responseType) {
668
- case 'property':
669
- return func.callProperty(params, options);
670
- case 'model':
671
- return func.callModel(params, options);
672
- case 'collection':
673
- return func.callCollection(params, options);
674
- default:
675
- return func.call(params, { responseType, ...options });
676
- }
663
+ if (!(resource instanceof ODataEntityResource))
664
+ return throwError(() => new Error("callFunction: Can't call function without ODataEntitySetResource"));
665
+ const func = resource.function(name).query((q) => q.apply(options));
666
+ switch (responseType) {
667
+ case 'property':
668
+ return this._request(func.callProperty(params, options), (resp) => resp);
669
+ case 'model':
670
+ return this._request(func.callModel(params, options), (resp) => resp);
671
+ case 'collection':
672
+ return this._request(func.callCollection(params, options), (resp) => resp);
673
+ default:
674
+ return this._request(func.call(params, { responseType, ...options }), (resp) => resp);
677
675
  }
678
- return throwError(() => new Error(`callFunction: Can't function without ODataEntitySetResource`));
679
676
  }
680
- callAction(name, params, responseType, { ...options } = {}) {
677
+ callAction(name, params, responseType, options = {}) {
681
678
  const resource = this.resource();
682
679
  if (!(resource instanceof ODataEntitySetResource)) {
683
- return throwError(() => new Error(`callAction: Can't action without ODataEntitySetResource`));
680
+ return throwError(() => new Error(`callAction: Can't call action without ODataEntitySetResource`));
684
681
  }
685
- const action = resource.action(name);
686
- action.query((q) => q.apply(options));
682
+ const action = resource.action(name).query((q) => q.apply(options));
687
683
  switch (responseType) {
688
684
  case 'property':
689
- return action.callProperty(params, options);
685
+ return this._request(action.callProperty(params, options), (resp) => resp);
690
686
  case 'model':
691
- return action.callModel(params, options);
687
+ return this._request(action.callModel(params, options), (resp) => resp);
692
688
  case 'collection':
693
- return action.callCollection(params, options);
689
+ return this._request(action.callCollection(params, options), (resp) => resp);
694
690
  default:
695
- return action.call(params, { responseType, ...options });
691
+ return this._request(action.call(params, { responseType, ...options }), (resp) => resp);
696
692
  }
697
693
  }
698
694
  _unlink(entry) {
@@ -706,14 +702,13 @@ class ODataCollection {
706
702
  throw new Error('Collection: Subscription already exists');
707
703
  }
708
704
  entry.subscription = entry.model.events$.subscribe((event) => {
709
- if (BUBBLING.indexOf(event.name) !== -1 &&
710
- event.bubbling &&
711
- !event.visited(this)) {
705
+ if (event.canContinueWith(this)) {
712
706
  if (event.model === entry.model) {
713
- if (event.name === 'destroy') {
707
+ if (event.name === ODataModelEventType.Destroy) {
714
708
  this.removeModel(entry.model, { reset: true });
715
709
  }
716
- else if (event.name === 'change' && event.options?.key) {
710
+ else if (event.name === ODataModelEventType.Change &&
711
+ event.options?.key) {
717
712
  entry.key = entry.model.key();
718
713
  }
719
714
  }
@@ -800,9 +795,7 @@ class ODataCollection {
800
795
  }
801
796
  isEmpty() {
802
797
  // Local length and if exists remote length
803
- return (this.length === 0 &&
804
- this.annots().count !== undefined &&
805
- this.annots().count === 0);
798
+ return this.length === 0;
806
799
  }
807
800
  //#region Sort
808
801
  _bisect(model) {
@@ -852,11 +845,8 @@ class ODataCollection {
852
845
  this._sortBy = by;
853
846
  this._entries = this._entries.sort((e1, e2) => this._compare(e1, e2, by, 0));
854
847
  if (!silent) {
855
- this.events$.emit(new ODataModelEvent(ODataModelEventType.Update, {
856
- collection: this,
857
- }));
848
+ this.events$.trigger(ODataModelEventType.Update);
858
849
  }
859
850
  }
860
851
  }
861
- export { ODataCollection };
862
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFJTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBRXRCLHNCQUFzQixFQUV0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBR2YsZUFBZSxFQUNmLG1CQUFtQixFQUVuQixpQkFBaUIsRUFDakIsZUFBZSxHQUNoQixNQUFNLFdBQVcsQ0FBQztBQUVuQixNQUFhLGVBQWU7YUFHbkIsVUFBSyxHQUE2QixJQUFJLEFBQWpDLENBQWtDO0lBNkI5QyxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUTthQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sQ0FBQzthQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixD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QUFVLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQ0gsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7U0E5eENVLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFBY3Rpb25PcHRpb25zLFxuICBPRGF0YUVudGl0aWVzLFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25PcHRpb25zLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxuICBPRGF0YVJlc291cmNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFTdHJ1Y3R1cmVkVHlwZSB9IGZyb20gJy4uL3NjaGVtYS9zdHJ1Y3R1cmVkLXR5cGUnO1xuaW1wb3J0IHsgVHlwZXMgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQge1xuICBCVUJCTElORyxcbiAgSU5DTFVERV9ERUVQLFxuICBJTkNMVURFX1NIQUxMT1csXG4gIE1vZGVsRmllbGRPcHRpb25zLFxuICBPRGF0YU1vZGVsRW50cnksXG4gIE9EYXRhTW9kZWxFdmVudCxcbiAgT0RhdGFNb2RlbEV2ZW50VHlwZSxcbiAgT0RhdGFNb2RlbEZpZWxkLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbFN0YXRlLFxufSBmcm9tICcuL29wdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFDb2xsZWN0aW9uPFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PlxuICBpbXBsZW1lbnRzIEl0ZXJhYmxlPE0+XG57XG4gIHN0YXRpYyBtb2RlbDogdHlwZW9mIE9EYXRhTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlOlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlczoge1xuICAgIHBhcmVudDpcbiAgICAgIHwgW1xuICAgICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICAgIF1cbiAgICAgIHwgbnVsbDtcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBudWxsO1xuICB9W10gPSBbXTtcbiAgX2Fubm90YXRpb25zITogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICBfZW50cmllczogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgX21vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbDtcblxuICBtb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKVxuICAgICAgLm1hcCgoZSkgPT4gZS5tb2RlbCk7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkubGVuZ3RoO1xuICB9XG5cbiAgLy9FdmVudHNcbiAgZXZlbnRzJCA9IG5ldyBFdmVudEVtaXR0ZXI8T0RhdGFNb2RlbEV2ZW50PFQ+PigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdGllczogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSA9IFtdLFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgbW9kZWwsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtPRGF0YU1vZGVsPGFueT4sIE9EYXRhTW9kZWxGaWVsZDxhbnk+XTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPjtcbiAgICAgIG1vZGVsPzogdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IEtsYXNzID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIGlmIChtb2RlbCA9PT0gdW5kZWZpbmVkICYmIEtsYXNzLm1vZGVsICE9PSBudWxsKSBtb2RlbCA9IEtsYXNzLm1vZGVsO1xuICAgIGlmIChtb2RlbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uOiBDb2xsZWN0aW9uIG5lZWQgbW9kZWwnKTtcbiAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuXG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VcbiAgICBpZiAodGhpcy5fcGFyZW50ID09PSBudWxsICYmIHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXNvdXJjZSA9IHRoaXMuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSgpIGFzXG4gICAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXR0YWNoKFxuICAgICAgICByZXNvdXJjZSBhc1xuICAgICAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFubm90YXRpb25zXG4gICAgdGhpcy5fYW5ub3RhdGlvbnMgPVxuICAgICAgYW5ub3RzIHx8XG4gICAgICBuZXcgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zKFxuICAgICAgICBPRGF0YUhlbHBlcltyZXNvdXJjZT8uYXBpPy5vcHRpb25zLnZlcnNpb24gfHwgREVGQVVMVF9WRVJTSU9OXVxuICAgICAgKTtcblxuICAgIGVudGl0aWVzID0gZW50aXRpZXMgfHwgW107XG4gICAgdGhpcy5hc3NpZ24oZW50aXRpZXMsIHsgcmVzZXQgfSk7XG4gIH1cblxuICBpc1BhcmVudE9mKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpLnNvbWUoKHApID0+IHBbMF0gPT09IHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIHJlc291cmNlKCk6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD4ge1xuICAgIHJldHVybiBPRGF0YU1vZGVsT3B0aW9ucy5yZXNvdXJjZTxUPih0aGlzKSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+O1xuICB9XG5cbiAgcHVzaFJlc291cmNlKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICkge1xuICAgIC8vIFB1c2ggY3VycmVudCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcmVzb3VyY2VzLnB1c2goeyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH0pO1xuICAgIC8vIFJlcGxhY2UgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgfVxuXG4gIHBvcFJlc291cmNlKCkge1xuICAgIC8vIFBvcCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgY29uc3QgcG9wID0gdGhpcy5fcmVzb3VyY2VzLnBvcCgpO1xuICAgIGlmIChwb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9O1xuICAgICAgdGhpcy5fcGFyZW50ID0gcG9wLnBhcmVudDtcbiAgICAgIHRoaXMuX3Jlc291cmNlID0gcG9wLnJlc291cmNlO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fcmVzb3VyY2UgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX3Jlc291cmNlLnR5cGUoKSAhPT0gcmVzb3VyY2UudHlwZSgpICYmXG4gICAgICAhdGhpcy5fcmVzb3VyY2UuaXNTdWJ0eXBlT2YocmVzb3VyY2UpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYXR0YWNoOiBDYW4ndCByZWF0dGFjaCAke3RoaXMuX3Jlc291cmNlLnR5cGUoKX0gdG8gJHtyZXNvdXJjZS50eXBlKCl9YFxuICAgICAgKTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCB9KSA9PiB7XG4gICAgICBjb25zdCBtb2RlbFJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5tb2RlbFJlc291cmNlRmFjdG9yeShcbiAgICAgICAgcmVzb3VyY2UuY2xvbmVRdWVyeTxUPigpXG4gICAgICApIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD47XG4gICAgICBpZiAobW9kZWxSZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSBtb2RlbC5hdHRhY2gobW9kZWxSZXNvdXJjZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgIWN1cnJlbnQuaXNFcXVhbFRvKHJlc291cmNlKSkge1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuQXR0YWNoLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB3aXRoUmVzb3VyY2U8Uj4oXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD4sXG4gICAgY3R4OiAoY29sbGVjdGlvbjogdGhpcykgPT4gUlxuICApOiBSIHtcbiAgICAvLyBQdXNoXG4gICAgdGhpcy5wdXNoUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgIC8vIEV4ZWN1dGVcbiAgICBjb25zdCByZXN1bHQgPSBjdHgodGhpcyk7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHJldHVybiAocmVzdWx0IGFzIGFueSkucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLnBvcFJlc291cmNlKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9wXG4gICAgICB0aGlzLnBvcFJlc291cmNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGFzRW50aXR5U2V0PFI+KGN0eDogKGNvbGxlY3Rpb246IHRoaXMpID0+IFIpOiBSIHtcbiAgICAvLyBCdWlsZCBuZXcgcmVzb3VyY2VcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuX3Jlc291cmNlPy5jbG9uZVF1ZXJ5PFQ+KCk7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KHF1ZXJ5KTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2FzRW50aXR5U2V0OiBDb2xsZWN0aW9uIGRvZXMgbm90IGhhdmUgYXNzb2NpYXRlZCBFbnRpdHlTZXQgZW5kcG9pbnQnXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLndpdGhSZXNvdXJjZShyZXNvdXJjZSwgY3R4KTtcbiAgfVxuXG4gIGFubm90cygpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIG1vZGVsRmFjdG9yeShcbiAgICBkYXRhOiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAgeyByZXNldCA9IGZhbHNlIH06IHsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fVxuICApOiBNIHtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyh0aGlzLl9hbm5vdGF0aW9ucy5oZWxwZXIpO1xuICAgIGFubm90cy51cGRhdGUoZGF0YSk7XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHNjaGVtYSA9IE1vZGVsLm1ldGEuZmluZENoaWxkT3B0aW9ucygobykgPT5cbiAgICAgICAgby5pc1R5cGVPZihhbm5vdHMudHlwZSBhcyBzdHJpbmcpXG4gICAgICApPy5zY2hlbWE7XG4gICAgICBpZiAoc2NoZW1hICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IHNjaGVtYS5tb2RlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsKGRhdGEsIHtcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0LFxuICAgICAgcGFyZW50OiBbdGhpcywgbnVsbF0sXG4gICAgfSkgYXMgTTtcbiAgfVxuXG4gIHRvRW50aXRpZXMoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIGNoYWluID0gW10sXG4gIH06IHtcbiAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gIH0gPSB7fSk6IChQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoeyBtb2RlbCwgc3RhdGUgfSkgPT5cbiAgICAgICAgICBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQgJiYgY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKVxuICAgICAgKVxuICAgICAgLm1hcCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgICB2YXIgY2hhbmdlc09ubHkgPSBjaGFuZ2VzX29ubHkgJiYgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZDtcbiAgICAgICAgcmV0dXJuIG1vZGVsLnRvRW50aXR5KHtcbiAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgICAgICBpbmNsdWRlX2tleSxcbiAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgY2hhaW46IFt0aGlzLCAuLi5jaGFpbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdGllcygpO1xuICB9XG5cbiAgaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2VudHJpZXMuc29tZSgoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCkgfHxcbiAgICAgIHRoaXMubW9kZWxzKCkuc29tZSgobSkgPT4gbS5oYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pKVxuICAgICk7XG4gIH1cblxuICBjbG9uZTxDIGV4dGVuZHMgT0RhdGFDb2xsZWN0aW9uPFQsIE0+PigpIHtcbiAgICBsZXQgQ3RvciA9IDx0eXBlb2YgT0RhdGFDb2xsZWN0aW9uPnRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHRoaXMudG9FbnRpdGllcyhJTkNMVURFX1NIQUxMT1cpLCB7XG4gICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSgpLFxuICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpLFxuICAgIH0pIGFzIEM7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0KFxuICAgIG9icyQ6IE9ic2VydmFibGU8T0RhdGFFbnRpdGllczxhbnk+PixcbiAgICB7IHJlbW92ZSB9OiB7IHJlbW92ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuUmVxdWVzdCwge1xuICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PiB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICBjb25zdCBtb2RlbHMgPSAoZW50aXRpZXMgfHwgW10pLm1hcChcbiAgICAgICAgICAoZW50aXR5KSA9PiB0aGlzLm1vZGVsRmFjdG9yeShlbnRpdHksIHsgcmVzZXQ6IHRydWUgfSkgYXMgTVxuICAgICAgICApIGFzIE1bXTtcbiAgICAgICAgdGhpcy5hc3NpZ24obW9kZWxzLCB7IHJlc2V0OiB0cnVlLCByZW1vdmUgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5TeW5jLCB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgb3B0aW9uczogeyBtb2RlbHMsIGVudGl0aWVzLCBhbm5vdHMgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbW9kZWxzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2goe1xuICAgIHdpdGhDb3VudCxcbiAgICByZW1vdmUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuXG4gICAgY29uc3Qgb2JzJCA9XG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2VcbiAgICAgICAgPyByZXNvdXJjZS5mZXRjaCh7IHdpdGhDb3VudCwgLi4ub3B0aW9ucyB9KVxuICAgICAgICA6IHJlc291cmNlLmZldGNoKHtcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2VudGl0aWVzJyxcbiAgICAgICAgICAgIHdpdGhDb3VudCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCB7IHJlbW92ZSB9KTtcbiAgfVxuXG4gIGZldGNoQWxsKHtcbiAgICB3aXRoQ291bnQsXG4gICAgcmVtb3ZlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcblxuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZS5mZXRjaEFsbCh7IHdpdGhDb3VudCwgLi4ub3B0aW9ucyB9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIHsgcmVtb3ZlIH0pO1xuICB9XG5cbiAgZmV0Y2hNYW55KFxuICAgIHRvcDogbnVtYmVyLFxuICAgIHtcbiAgICAgIHdpdGhDb3VudCxcbiAgICAgIHJlbW92ZSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICByZXNvdXJjZS5xdWVyeSgocSkgPT5cbiAgICAgIHJlbW92ZSB8fCB0aGlzLmxlbmd0aCA9PSAwID8gcS5za2lwKCkuY2xlYXIoKSA6IHEuc2tpcCh0aGlzLmxlbmd0aClcbiAgICApO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoTWFueSh0b3AsIHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgeyByZW1vdmU6IHJlbW92ZSA/PyBmYWxzZSB9KTtcbiAgfVxuXG4gIGZldGNoT25lKHtcbiAgICB3aXRoQ291bnQsXG4gICAgcmVtb3ZlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hNYW55KDEsIHsgd2l0aENvdW50LCByZW1vdmUsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgobW9kZWxzKSA9PiBtb2RlbHNbMF0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFsbCBtb2RlbHMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHJlbE1vZGVsIFRoZSBtb2RlbCBpcyByZWxhdGlvbnNoaXBcbiAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIHVzZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBIdHRwT3B0aW9uc1xuICAgKi9cbiAgc2F2ZSh7XG4gICAgcmVsTW9kZWwgPSBmYWxzZSxcbiAgICBtZXRob2QsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVsTW9kZWw/OiBib29sZWFuO1xuICAgIG1ldGhvZD86ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhUHJvcGVydHlSZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIE9EYXRhUHJvcGVydHlSZXNvdXJjZScpXG4gICAgICApO1xuXG4gICAgbGV0IHRvRGVzdHJveUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvUmVtb3ZlUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9EZXN0cm95Q29udGFpbmVkOiBNW10gPSBbXTtcbiAgICBsZXQgdG9DcmVhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGxldCB0b0FkZFJlZmVyZW5jZTogTVtdID0gW107XG4gICAgbGV0IHRvQ3JlYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcbiAgICBsZXQgdG9VcGRhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGxldCB0b1VwZGF0ZUNvbnRhaW5lZDogTVtdID0gW107XG5cbiAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKHsgbW9kZWwsIHN0YXRlIH0pID0+IHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgICAgaWYgKHJlbE1vZGVsKSB7XG4gICAgICAgICAgdG9EZXN0cm95RW50aXR5LnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5pc05ldygpKSB7XG4gICAgICAgICAgdG9SZW1vdmVSZWZlcmVuY2UucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9EZXN0cm95Q29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpIHtcbiAgICAgICAgaWYgKHJlbE1vZGVsKSB7XG4gICAgICAgICAgdG9DcmVhdGVFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b0FkZFJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0NyZWF0ZUNvbnRhaW5lZC5wdXNoKG1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtb2RlbC5oYXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgdG9VcGRhdGVFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgdG9EZXN0cm95RW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvUmVtb3ZlUmVmZXJlbmNlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvRGVzdHJveUNvbnRhaW5lZC5sZW5ndGggPiAwIHx8XG4gICAgICB0b0NyZWF0ZUVudGl0eS5sZW5ndGggPiAwIHx8XG4gICAgICB0b0FkZFJlZmVyZW5jZS5sZW5ndGggPiAwIHx8XG4gICAgICB0b0NyZWF0ZUNvbnRhaW5lZC5sZW5ndGggPiAwIHx8XG4gICAgICB0b1VwZGF0ZUVudGl0eS5sZW5ndGggPiAwIHx8XG4gICAgICB0b1VwZGF0ZUNvbnRhaW5lZC5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBvYnMkID0gZm9ya0pvaW4oW1xuICAgICAgICAuLi50b0Rlc3Ryb3lFbnRpdHkubWFwKChtKSA9PiBtLmFzRW50aXR5KChlKSA9PiBlLmRlc3Ryb3kob3B0aW9ucykpKSxcbiAgICAgICAgLi4udG9SZW1vdmVSZWZlcmVuY2UubWFwKChtKSA9PiB0aGlzLnJlbW92ZVJlZmVyZW5jZShtLCBvcHRpb25zKSksXG4gICAgICAgIC4uLnRvRGVzdHJveUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uZGVzdHJveShvcHRpb25zKSksXG4gICAgICAgIC4uLnRvQ3JlYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2Q6ICdjcmVhdGUnLCAuLi5vcHRpb25zIH0pKVxuICAgICAgICApLFxuICAgICAgICAuLi50b0FkZFJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMuYWRkUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVDb250YWluZWQubWFwKChtKSA9PlxuICAgICAgICAgIG0uc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSlcbiAgICAgICAgKSxcbiAgICAgICAgLi4udG9VcGRhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKSxcbiAgICAgICAgLi4udG9VcGRhdGVDb250YWluZWQubWFwKChtKSA9PiBtLnNhdmUoeyBtZXRob2QsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgXSk7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlJlcXVlc3QsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAgICAgICAubWFwKChlbnRyeSkgPT4gKHsgLi4uZW50cnksIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkIH0pKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5TeW5jLCB7IGNvbGxlY3Rpb246IHRoaXMgfSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIW1vZGVsLmlzTmV3KCkgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgIC5hZGQoXG4gICAgICAgICAgbW9kZWwuX21ldGEuZW50aXR5UmVzb3VyY2UobW9kZWwpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4sXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge31cbiAgKTogTSB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWwua2V5KCk7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHtcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgY2lkOiAoPGFueT5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdLFxuICAgIH0pO1xuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIGVudHJ5Lm1vZGVsLmFzc2lnbihtb2RlbC50b0VudGl0eSgpIGFzIFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICAgIH1cblxuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBFbnRyeVxuICAgIGVudHJ5ID0ge1xuICAgICAgc3RhdGU6IHJlc2V0ID8gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCA6IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCxcbiAgICAgIG1vZGVsLFxuICAgICAga2V5OiBtb2RlbC5rZXkoKSxcbiAgICB9O1xuICAgIC8vIFNldCBQYXJlbnRcbiAgICBpZiAocmVwYXJlbnQpIG1vZGVsLl9wYXJlbnQgPSBbdGhpcywgbnVsbF07XG4gICAgLy8gU3Vic2NyaWJlXG4gICAgdGhpcy5fbGluayhlbnRyeSk7XG4gICAgLy8gTm93IGFkZFxuICAgIGlmIChwb3NpdGlvbiA+PSAwKSB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuICAgIGVsc2UgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBtb2RlbC5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5BZGQsIHtcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uID0gLTEsXG4gICAgfToge1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiBNIHtcbiAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbiA9IHRoaXMuX2Jpc2VjdChtb2RlbCk7XG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9hZGRNb2RlbChtb2RlbCwge1xuICAgICAgc2lsZW50LFxuICAgICAgcmVzZXQsXG4gICAgICBtZXJnZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcmVwYXJlbnQsXG4gICAgfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFthZGRlZF0sIHJlbW92ZWQ6IFtdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYWRkZWQ7XG4gIH1cblxuICBhZGQoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzZXJ2ZXI/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9XG4gICk6IE9ic2VydmFibGU8TT4ge1xuICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFJlZmVyZW5jZShtb2RlbCkucGlwZShcbiAgICAgICAgbWFwKChtb2RlbCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFkZE1vZGVsKG1vZGVsLCB7XG4gICAgICAgICAgICBzaWxlbnQsXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIHJlcGFyZW50LFxuICAgICAgICAgICAgbWVyZ2UsXG4gICAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmFkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcG9zaXRpb24sIG1lcmdlLCByZXBhcmVudCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFtb2RlbC5pc05ldygpICYmIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgbGV0IHRhcmdldCA9XG4gICAgICAgIHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdpZCdcbiAgICAgICAgICA/IChtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAncGF0aCcpIHtcbiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5rZXkobW9kZWwua2V5KCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc291cmNlXG4gICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAucmVtb3ZlKHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBFbWl0IEV2ZW50XG4gICAgaWYgKCFzaWxlbnQpXG4gICAgICBtb2RlbC5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZW1vdmUsIHtcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIC8vIE5vdyByZW1vdmVcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICghKHJlc2V0IHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpKSB7XG4gICAgICAvLyBNb3ZlIHRvIGVuZCBvZiBhcnJheSBhbmQgbWFyayBhcyByZW1vdmVkXG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkO1xuICAgICAgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgdGhpcy5fdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbiB9ID0ge31cbiAgKTogTSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3JlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgcmVtb3ZlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSwge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyBhZGRlZDogW10sIHJlbW92ZWQ6IFtyZW1vdmVkXSwgbWVyZ2VkOiBbXSB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbW92ZWQ7XG4gIH1cblxuICByZW1vdmUoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICBzZXJ2ZXIgPSB0cnVlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgc2VydmVyPzogYm9vbGVhbiB9ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgaWYgKHNlcnZlcikge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlUmVmZXJlbmNlKG1vZGVsKS5waXBlKFxuICAgICAgICBtYXAoKG1vZGVsKSA9PiB0aGlzLnJlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQ6IHRydWUgfSkpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQgfSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX21vdmVNb2RlbChtb2RlbDogTSwgcG9zaXRpb246IG51bWJlcik6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBOb3cgcmVtb3ZlXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuXG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgY3JlYXRlKFxuICAgIGF0dHJzOiBUID0ge30gYXMgVCxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxGYWN0b3J5KGF0dHJzKTtcbiAgICByZXR1cm4gKG1vZGVsLmlzVmFsaWQoKSAmJiBzZXJ2ZXIgPyBtb2RlbC5zYXZlKCkgOiBvZihtb2RlbCkpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKG1vZGVsKSA9PiB0aGlzLmFkZChtb2RlbCwgeyBzaWxlbnQsIHNlcnZlciB9KSksXG4gICAgICBtYXAoKCkgPT4gbW9kZWwpXG4gICAgKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgdmFsdWU6IGFueSwge306IHt9ICYgTW9kZWxGaWVsZE9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZW50cmllc1tOdW1iZXIocGF0aEFycmF5WzBdKV0ubW9kZWw7XG4gICAgICByZXR1cm4gbW9kZWwuc2V0KHBhdGhBcnJheS5zbGljZSgxKSwgdmFsdWUsIHt9KTtcbiAgICB9XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDEgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIGxldCB0b0FkZDogTVtdID0gW107XG4gICAgICBsZXQgdG9DaGFuZ2U6IE1bXSA9IFtdO1xuICAgICAgbGV0IHRvUmVtb3ZlOiBNW10gPSBbXTtcbiAgICAgIGxldCBpbmRleCA9IE51bWJlcihwYXRoQXJyYXlbMF0pO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscygpW2luZGV4XTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHsgbW9kZWwgfSk7XG4gICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1RPRE86IFJlbW92ZS9BZGQgb3IgTWVyZ2U/XG4gICAgICAgIC8vIE1lcmdlXG4gICAgICAgIGVudHJ5Lm1vZGVsLmFzc2lnbihcbiAgICAgICAgICB2YWx1ZS50b0VudGl0eSh7IGNsaWVudF9pZDogdHJ1ZSwgLi4uSU5DTFVERV9ERUVQIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKCkpIHRvQ2hhbmdlLnB1c2gobW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIHRoaXMuX2FkZE1vZGVsKHZhbHVlLCB7IHJlcGFyZW50OiB0cnVlIH0pO1xuICAgICAgICB0b0FkZC5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IGFkZGVkOiB0b0FkZCwgcmVtb3ZlZDogdG9SZW1vdmUsIGNoYW5nZWQ6IHRvQ2hhbmdlIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldChwYXRoOiBudW1iZXIpOiBNIHwgdW5kZWZpbmVkO1xuICBnZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBhbnk7XG4gIGdldChwYXRoOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1vZGVscygpW051bWJlcihwYXRoQXJyYXlbMF0pXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5nZXQocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaGFzKHBhdGg6IG51bWJlciB8IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbHMoKVtOdW1iZXIocGF0aEFycmF5WzBdKV07XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaGFzKHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVzZXQoe1xuICAgIHBhdGgsXG4gICAgc2lsZW50ID0gZmFsc2UsXG4gIH06IHsgcGF0aD86IHN0cmluZyB8IHN0cmluZ1tdOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGxldCB0b0FkZDogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgICBsZXQgdG9DaGFuZ2U6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG4gICAgbGV0IHRvUmVtb3ZlOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuXG4gICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzZXQgYnkgcGF0aFxuICAgICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICAgICkgYXMgYW55W107XG4gICAgICBjb25zdCBpbmRleCA9IE51bWJlcihwYXRoQXJyYXlbMF0pO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHMoKVtpbmRleF07XG4gICAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSkge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHsgbW9kZWwgfSkgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkICYmXG4gICAgICAgICAgICBlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRvQ2hhbmdlID0gW2VudHJ5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aCA9IHBhdGhBcnJheS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBhbGxcbiAgICAgIHRvQWRkID0gdGhpcy5fZW50cmllcy5maWx0ZXIoKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKTtcbiAgICAgIHRvQ2hhbmdlID0gdGhpcy5fZW50cmllcy5maWx0ZXIoXG4gICAgICAgIChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkICYmIGUubW9kZWwuaGFzQ2hhbmdlZCgpXG4gICAgICApO1xuICAgICAgdG9SZW1vdmUgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkKTtcbiAgICB9XG5cbiAgICB0b1JlbW92ZS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwoZW50cnkubW9kZWwsIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRvQWRkLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLl9hZGRNb2RlbChlbnRyeS5tb2RlbCwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdG9DaGFuZ2UuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGVudHJ5Lm1vZGVsLnJlc2V0KHsgcGF0aCwgc2lsZW50IH0pO1xuICAgICAgZW50cnkuc3RhdGUgPSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICFzaWxlbnQgJiZcbiAgICAgICh0b0FkZC5sZW5ndGggPiAwIHx8IHRvUmVtb3ZlLmxlbmd0aCA+IDAgfHwgdG9DaGFuZ2UubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuUmVzZXQsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFkZGVkOiB0b0FkZC5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgICAgcmVtb3ZlZDogdG9SZW1vdmUubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICAgIGNoYW5nZWQ6IHRvQ2hhbmdlLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoeyBzaWxlbnQgPSBmYWxzZSB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgbGV0IHRvUmVtb3ZlOiBNW10gPSB0aGlzLm1vZGVscygpO1xuICAgIHRvUmVtb3ZlLmZvckVhY2goKG0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG0sIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX2VudHJpZXMgPSBbXTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgcmVtb3ZlZDogdG9SZW1vdmUgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIG9iamVjdHM6IFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10gfCBNW10sXG4gICAge1xuICAgICAgcmVtb3ZlID0gdHJ1ZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IE1vZGVsID0gdGhpcy5fbW9kZWw7XG4gICAgY29uc3Qgb2Zmc2V0ID0gcmVtb3ZlID8gMCA6IHRoaXMubGVuZ3RoO1xuXG4gICAgbGV0IHRvQWRkOiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IHRvQ2hhbmdlOiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IHRvUmVtb3ZlOiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IHRvU29ydDogW00sIG51bWJlcl1bXSA9IFtdO1xuICAgIGxldCBtb2RlbE1hcDogc3RyaW5nW10gPSBbXTtcbiAgICBvYmplY3RzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlzTW9kZWwgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG9iaik7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGluZGV4ICsgb2Zmc2V0O1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgICAgTW9kZWwgIT09IG51bGwgJiYgTW9kZWwubWV0YSA/IE1vZGVsLm1ldGEucmVzb2x2ZUtleShvYmopIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY2lkID1cbiAgICAgICAgTW9kZWwubWV0YS5jaWQgaW4gb2JqID8gKDxhbnk+b2JqKVtNb2RlbC5tZXRhLmNpZF0gOiB1bmRlZmluZWQ7XG4gICAgICAvLyBUcnkgZmluZCBlbnRyeVxuICAgICAgY29uc3QgZW50cnkgPSBpc01vZGVsXG4gICAgICAgID8gdGhpcy5fZmluZEVudHJ5KHsgbW9kZWw6IG9iaiBhcyBNIH0pIC8vIEJ5IE1vZGVsXG4gICAgICAgIDogdGhpcy5fZmluZEVudHJ5KHsgY2lkLCBrZXkgfSk7IC8vIEJ5IENpZCBvciBLZXlcblxuICAgICAgbGV0IG1vZGVsOiBNO1xuICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgbW9kZWwgPSBlbnRyeS5tb2RlbDtcbiAgICAgICAgaWYgKG1vZGVsICE9PSBvYmopIHtcbiAgICAgICAgICAvLyBHZXQgZW50aXR5IGZyb20gbW9kZWxcbiAgICAgICAgICBpZiAoaXNNb2RlbCkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gKG9iaiBhcyBNKS50b0VudGl0eSh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZDogdHJ1ZSxcbiAgICAgICAgICAgICAgLi4uSU5DTFVERV9ERUVQLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2RlbC5hc3NpZ24oZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBlciA9IHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcjtcbiAgICAgICAgICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+KFxuICAgICAgICAgICAgICBoZWxwZXIsXG4gICAgICAgICAgICAgIGhlbHBlci5hbm5vdGF0aW9ucyhvYmopXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gYW5ub3RzLmF0dHJpYnV0ZXMob2JqLCAnZnVsbCcpO1xuICAgICAgICAgICAgbW9kZWwuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICAgICAgbW9kZWwuYXNzaWduKGVudGl0eSwgeyByZXNldCwgc2lsZW50IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNb2RlbCBDaGFuZ2U/XG4gICAgICAgICAgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkgdG9DaGFuZ2UucHVzaChbbW9kZWwsIHBvc2l0aW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFzIFNvcnQgb3IgSW5kZXggQ2hhbmdlP1xuICAgICAgICBpZiAodG9Tb3J0Lmxlbmd0aCA+IDAgfHwgcG9zaXRpb24gIT09IHRoaXMubW9kZWxzKCkuaW5kZXhPZihtb2RlbCkpIHtcbiAgICAgICAgICB0b1NvcnQucHVzaChbbW9kZWwsIHBvc2l0aW9uXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFkZFxuICAgICAgICBtb2RlbCA9IGlzTW9kZWxcbiAgICAgICAgICA/IChvYmogYXMgTSlcbiAgICAgICAgICA6IHRoaXMubW9kZWxGYWN0b3J5KG9iaiBhcyBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pO1xuICAgICAgICB0b0FkZC5wdXNoKFttb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgIH1cbiAgICAgIG1vZGVsTWFwLnB1c2goKDxhbnk+bW9kZWwpW01vZGVsLm1ldGEuY2lkXSk7XG4gICAgfSk7XG5cbiAgICBpZiAocmVtb3ZlKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKGVudHJ5LCBwb3NpdGlvbikgPT4ge1xuICAgICAgICBpZiAobW9kZWxNYXAuaW5kZXhPZigoPGFueT5lbnRyeS5tb2RlbClbTW9kZWwubWV0YS5jaWRdKSA9PT0gLTEpXG4gICAgICAgICAgdG9SZW1vdmUucHVzaChbZW50cnkubW9kZWwsIHBvc2l0aW9uXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSByZW1vdmUsIGFkZCBhbmQgc29ydFxuICAgIHRvUmVtb3ZlLmZvckVhY2goKFttb2RlbCwgcG9zaXRpb25dKSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0IH0pO1xuICAgIH0pO1xuICAgIHRvQWRkLmZvckVhY2goKFttb2RlbCwgcG9zaXRpb25dKSA9PiB7XG4gICAgICB0aGlzLl9hZGRNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0LCByZXBhcmVudCwgcG9zaXRpb24gfSk7XG4gICAgfSk7XG4gICAgdG9Tb3J0LmZvckVhY2goKFttb2RlbCwgcG9zaXRpb25dKSA9PiB7XG4gICAgICB0aGlzLl9tb3ZlTW9kZWwobW9kZWwsIHBvc2l0aW9uKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgICghc2lsZW50ICYmXG4gICAgICAgICh0b0FkZC5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9SZW1vdmUubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHRvQ2hhbmdlLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b1NvcnQubGVuZ3RoID4gMCkpIHx8XG4gICAgICByZXNldFxuICAgICkge1xuICAgICAgdGhpcy5fc29ydEJ5ID0gbnVsbDtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KFxuICAgICAgICAgIHJlc2V0ID8gT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCA6IE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIGFkZGVkOiB0b0FkZCxcbiAgICAgICAgICAgICAgcmVtb3ZlZDogdG9SZW1vdmUsXG4gICAgICAgICAgICAgIGNoYW5nZWQ6IHRvQ2hhbmdlLFxuICAgICAgICAgICAgICBzb3J0ZWQ6IHRvU29ydCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5KFxuICAgIGN0eDogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWRcbiAgKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgcmVzb3VyY2UucXVlcnkoY3R4KTtcbiAgICB0aGlzLmF0dGFjaChyZXNvdXJjZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjYWxsRnVuY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YUZ1bmN0aW9uT3B0aW9uczxSPiA9IHt9XG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkge1xuICAgICAgY29uc3QgZnVuYyA9IHJlc291cmNlLmZ1bmN0aW9uPFAsIFI+KG5hbWUpO1xuICAgICAgZnVuYy5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IEVycm9yKGBjYWxsRnVuY3Rpb246IENhbid0IGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZWApXG4gICAgKTtcbiAgfVxuXG4gIGNhbGxBY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YUFjdGlvbk9wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihgY2FsbEFjdGlvbjogQ2FuJ3QgYWN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZWApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5hY3Rpb248UCwgUj4obmFtZSk7XG4gICAgYWN0aW9uLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VubGluayhlbnRyeTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSB7XG4gICAgaWYgKGVudHJ5LnN1YnNjcmlwdGlvbikge1xuICAgICAgZW50cnkuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGluayhlbnRyeTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSB7XG4gICAgaWYgKGVudHJ5LnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uOiBTdWJzY3JpcHRpb24gYWxyZWFkeSBleGlzdHMnKTtcbiAgICB9XG4gICAgZW50cnkuc3Vic2NyaXB0aW9uID0gZW50cnkubW9kZWwuZXZlbnRzJC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQ6IE9EYXRhTW9kZWxFdmVudDxUPikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgQlVCQkxJTkcuaW5kZXhPZihldmVudC5uYW1lKSAhPT0gLTEgJiZcbiAgICAgICAgICBldmVudC5idWJibGluZyAmJlxuICAgICAgICAgICFldmVudC52aXNpdGVkKHRoaXMpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gZW50cnkubW9kZWwpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5uYW1lID09PSAnZGVzdHJveScpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVNb2RlbChlbnRyeS5tb2RlbCwgeyByZXNldDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2NoYW5nZScgJiYgZXZlbnQub3B0aW9ucz8ua2V5KSB7XG4gICAgICAgICAgICAgIGVudHJ5LmtleSA9IGVudHJ5Lm1vZGVsLmtleSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tb2RlbHMoKS5pbmRleE9mKGVudHJ5Lm1vZGVsKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChldmVudC5wdXNoKHRoaXMsIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEVudHJ5KHtcbiAgICBtb2RlbCxcbiAgICBjaWQsXG4gICAga2V5LFxuICB9OiB7XG4gICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgIGNpZD86IHN0cmluZztcbiAgICBrZXk/OiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuZmluZCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGJ5TW9kZWwgPSBtb2RlbCAhPT0gdW5kZWZpbmVkICYmIGVudHJ5Lm1vZGVsLmVxdWFscyhtb2RlbCk7XG4gICAgICBjb25zdCBieUNpZCA9XG4gICAgICAgIGNpZCAhPT0gdW5kZWZpbmVkICYmICg8YW55PmVudHJ5Lm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0gPT09IGNpZDtcbiAgICAgIGNvbnN0IGJ5S2V5ID1cbiAgICAgICAga2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50cnkua2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgVHlwZXMuaXNFcXVhbChlbnRyeS5rZXksIGtleSk7XG4gICAgICByZXR1cm4gYnlNb2RlbCB8fCBieUNpZCB8fCBieUtleTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENvbGxlY3Rpb24gZnVuY3Rpb25zXG4gIGVxdWFscyhvdGhlcjogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMgPT09IG90aGVyO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQ29sbGVjdGlvbic7XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgbGV0IHBvaW50ZXIgPSAwO1xuICAgIGxldCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCk6IEl0ZXJhdG9yUmVzdWx0PE0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkb25lOiBwb2ludGVyID09PSBtb2RlbHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbHNbcG9pbnRlcisrXSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZpbHRlcihcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gdW5rbm93bixcbiAgICB0aGlzQXJnPzogYW55XG4gICk6IE1bXSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICBtYXA8VT4oXG4gICAgY2FsbGJhY2tmbjogKHZhbHVlOiBNLCBpbmRleDogbnVtYmVyLCBhcnJheTogTVtdKSA9PiBVLFxuICAgIHRoaXNBcmc/OiBhbnlcbiAgKTogVVtdIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5tYXAoY2FsbGJhY2tmbiwgdGhpc0FyZyk7XG4gIH1cblxuICBmaW5kKFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBNLCBpbmRleDogbnVtYmVyLCBvYmo6IE1bXSkgPT4gdW5rbm93bixcbiAgICB0aGlzQXJnPzogYW55XG4gICk6IE0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIHJlZHVjZTxVPihcbiAgICBjYWxsYmFja2ZuOiAoXG4gICAgICBwcmV2aW91c1ZhbHVlOiBVLFxuICAgICAgY3VycmVudFZhbHVlOiBNLFxuICAgICAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gICAgICBhcnJheTogTVtdXG4gICAgKSA9PiBVLFxuICAgIGluaXRpYWxWYWx1ZTogVVxuICApOiBVIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5yZWR1Y2UoY2FsbGJhY2tmbiwgaW5pdGlhbFZhbHVlKTtcbiAgfVxuXG4gIGZpcnN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpWzBdO1xuICB9XG5cbiAgbGFzdCgpOiBNIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiBtb2RlbHNbbW9kZWxzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgbmV4dChtb2RlbDogTSk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleE9mKG1vZGVsKTtcbiAgICBpZiAoaW5kZXggPT09IC0xIHx8IGluZGV4ID09PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldChpbmRleCArIDEpO1xuICB9XG5cbiAgcHJldihtb2RlbDogTSk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleE9mKG1vZGVsKTtcbiAgICBpZiAoaW5kZXggPD0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4IC0gMSk7XG4gIH1cblxuICBldmVyeShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZXZlcnkocHJlZGljYXRlKTtcbiAgfVxuXG4gIHNvbWUocHJlZGljYXRlOiAobTogTSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnNvbWUocHJlZGljYXRlKTtcbiAgfVxuXG4gIGNvbnRhaW5zKG1vZGVsOiBNKSB7XG4gICAgcmV0dXJuIHRoaXMuc29tZSgobSkgPT4gbS5lcXVhbHMobW9kZWwpKTtcbiAgfVxuXG4gIGluZGV4T2YobW9kZWw6IE0pOiBudW1iZXIge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgY29uc3QgbSA9IG1vZGVscy5maW5kKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICAgIHJldHVybiBtID09PSB1bmRlZmluZWQgPyAtMSA6IG1vZGVscy5pbmRleE9mKG0pO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICAvLyBMb2NhbCBsZW5ndGggYW5kIGlmIGV4aXN0cyByZW1vdGUgbGVuZ3RoXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubGVuZ3RoID09PSAwICYmXG4gICAgICB0aGlzLmFubm90cygpLmNvdW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuYW5ub3RzKCkuY291bnQgPT09IDBcbiAgICApO1xuICB9XG5cbiAgLy8jcmVnaW9uIFNvcnRcbiAgcHJpdmF0ZSBfYmlzZWN0KG1vZGVsOiBNKSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgaWYgKHRoaXMuX3NvcnRCeSAhPT0gbnVsbCkge1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBhcmUobW9kZWwsIHRoaXMuX2VudHJpZXNbaW5kZXhdLCB0aGlzLl9zb3J0QnksIDApIDwgMCkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIF9jb21wYXJlKFxuICAgIGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4gfCBNLFxuICAgIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4gfCBNLFxuICAgIGJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10sXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBtMSA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTEpXG4gICAgICA/IChlMSBhcyBNKVxuICAgICAgOiAoZTEgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBsZXQgbTIgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUyKVxuICAgICAgPyAoZTIgYXMgTSlcbiAgICAgIDogKGUyIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgbGV0IHZhbHVlMSA9IG0xLmdldChieVtpbmRleF0uZmllbGQgYXMgc3RyaW5nKTtcbiAgICBsZXQgdmFsdWUyID0gbTIuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XG5cbiAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpIHJlc3VsdCA9IC0xO1xuICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAxO1xuICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAwO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT0gJ3N0cmluZycgfHwgdmFsdWUxIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBpZiAodmFsdWUxLmxvY2FsZUNvbXBhcmUgJiYgdmFsdWUxICE9IHZhbHVlMikge1xuICAgICAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xuICAgICAgcmV0dXJuIGJ5Lmxlbmd0aCAtIDEgPiBpbmRleCA/IHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgaW5kZXggKyAxKSA6IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChieVtpbmRleF0ub3JkZXIgfHwgMSkgKiByZXN1bHQ7XG4gIH1cblxuICBfc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10gfCBudWxsID0gbnVsbDtcbiAgaXNTb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeSAhPT0gbnVsbDtcbiAgfVxuXG4gIHNvcnQoXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICB7IHNpbGVudCB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIHRoaXMuX3NvcnRCeSA9IGJ5O1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLnNvcnQoXG4gICAgICAoZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiwgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikgPT5cbiAgICAgICAgdGhpcy5fY29tcGFyZShlMSwgZTIsIGJ5LCAwKVxuICAgICk7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vI2VuZHJlZ2lvblxufVxuIl19
852
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBSUwsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBRXRCLCtCQUErQixFQUUvQixxQkFBcUIsR0FHdEIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUlmLHNCQUFzQixFQUN0QixtQkFBbUIsRUFFbkIsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsTUFBTSxPQUFPLGVBQWU7YUFHbkIsVUFBSyxHQUE2QixJQUFJLEFBQWpDLENBQWtDO0lBNkI5QyxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUTthQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sQ0FBQzthQUNsRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJ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QUksTUFBTSxFQUFFO1lBQ3BCLE9BQU8sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pDLENBQUM7SUFHRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxDQUNGLEVBQWlELEVBQ2pELEVBQUUsTUFBTSxLQUEyQixFQUFFO1FBRXJDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hDLENBQUMsRUFBeUIsRUFBRSxFQUF5QixFQUFFLEVBQUUsQ0FDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FDL0IsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERFRkFVTFRfVkVSU0lPTiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcic7XG5pbXBvcnQge1xuICBFbnRpdHlLZXksXG4gIE9EYXRhQWN0aW9uT3B0aW9ucyxcbiAgT0RhdGFFbnRpdGllcyxcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uT3B0aW9ucyxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEvc3RydWN0dXJlZC10eXBlJztcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFNb2RlbCB9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgSU5DTFVERV9ERUVQLFxuICBJTkNMVURFX1NIQUxMT1csXG4gIE1vZGVsRmllbGRPcHRpb25zLFxuICBPRGF0YU1vZGVsRW50cnksXG4gIE9EYXRhTW9kZWxFdmVudCxcbiAgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcixcbiAgT0RhdGFNb2RlbEV2ZW50VHlwZSxcbiAgT0RhdGFNb2RlbEZpZWxkLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbFN0YXRlLFxufSBmcm9tICcuL29wdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFDb2xsZWN0aW9uPFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PlxuICBpbXBsZW1lbnRzIEl0ZXJhYmxlPE0+XG57XG4gIHN0YXRpYyBtb2RlbDogdHlwZW9mIE9EYXRhTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgXVxuICAgIHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZXM6IHtcbiAgICBwYXJlbnQ6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgICAgXVxuICAgICAgfCBudWxsO1xuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGw7XG4gIH1bXSA9IFtdO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8VD47XG4gIF9lbnRyaWVzOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICBfbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsO1xuXG4gIG1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAubWFwKChlKSA9PiBlLm1vZGVsKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5sZW5ndGg7XG4gIH1cblxuICAvL0V2ZW50c1xuICBldmVudHMkOiBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+O1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdGllczogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSA9IFtdLFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgbW9kZWwsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtPRGF0YU1vZGVsPGFueT4sIE9EYXRhTW9kZWxGaWVsZDxhbnk+XTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPjtcbiAgICAgIG1vZGVsPzogdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCAmJiBLbGFzcy5tb2RlbCAhPT0gbnVsbCkgbW9kZWwgPSBLbGFzcy5tb2RlbDtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbjogQ29sbGVjdGlvbiBuZWVkIG1vZGVsJyk7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcblxuICAgIC8vIEV2ZW50c1xuICAgIHRoaXMuZXZlbnRzJCA9IG5ldyBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+KHsgY29sbGVjdGlvbjogdGhpcyB9KTtcbiAgICB0aGlzLmV2ZW50cyQuc3Vic2NyaWJlKChlKSA9PiBtb2RlbCEubWV0YS5ldmVudHMkLmVtaXQoZSkpO1xuXG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VcbiAgICBpZiAodGhpcy5fcGFyZW50ID09PSBudWxsICYmIHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXNvdXJjZSA9IHRoaXMuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSgpIGFzXG4gICAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXR0YWNoKFxuICAgICAgICByZXNvdXJjZSBhc1xuICAgICAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHRoaXMuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyB8fFxuICAgICAgbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyhcbiAgICAgICAgT0RhdGFIZWxwZXJbcmVzb3VyY2U/LmFwaT8ub3B0aW9ucy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTl0sXG4gICAgICApO1xuXG4gICAgZW50aXRpZXMgPSBlbnRpdGllcyB8fCBbXTtcbiAgICB0aGlzLmFzc2lnbihlbnRpdGllcywgeyByZXNldCB9KTtcbiAgfVxuXG4gIGlzUGFyZW50T2YoXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpLnNvbWUoKHApID0+IHBbMF0gPT09IHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIHJlc291cmNlKCk6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD4ge1xuICAgIHJldHVybiBPRGF0YU1vZGVsT3B0aW9ucy5yZXNvdXJjZTxUPih0aGlzKSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+O1xuICB9XG5cbiAgcHVzaFJlc291cmNlKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+LFxuICApIHtcbiAgICAvLyBQdXNoIGN1cnJlbnQgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3Jlc291cmNlcy5wdXNoKHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9KTtcbiAgICAvLyBSZXBsYWNlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICBwb3BSZXNvdXJjZSgpIHtcbiAgICAvLyBQb3AgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIGNvbnN0IHBvcCA9IHRoaXMuX3Jlc291cmNlcy5wb3AoKTtcbiAgICBpZiAocG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBvcC5wYXJlbnQ7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHBvcC5yZXNvdXJjZTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYXR0YWNoKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+LFxuICApIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXNvdXJjZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5fcmVzb3VyY2UudHlwZSgpICE9PSByZXNvdXJjZS50eXBlKCkgJiZcbiAgICAgICF0aGlzLl9yZXNvdXJjZS5pc1N1YnR5cGVPZihyZXNvdXJjZSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBhdHRhY2g6IENhbid0IHJlYXR0YWNoICR7dGhpcy5fcmVzb3VyY2UudHlwZSgpfSB0byAke3Jlc291cmNlLnR5cGUoKX1gLFxuICAgICAgKTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCB9KSA9PiB7XG4gICAgICBjb25zdCBtb2RlbFJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5tb2RlbFJlc291cmNlRmFjdG9yeShcbiAgICAgICAgcmVzb3VyY2UuY2xvbmVRdWVyeTxUPigpLFxuICAgICAgKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+O1xuICAgICAgaWYgKG1vZGVsUmVzb3VyY2UgIT09IHVuZGVmaW5lZCkgbW9kZWwuYXR0YWNoKG1vZGVsUmVzb3VyY2UpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX3Jlc291cmNlO1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8ICFjdXJyZW50LmlzRXF1YWxUbyhyZXNvdXJjZSkpIHtcbiAgICAgIHRoaXMuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkF0dGFjaCwge1xuICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgdmFsdWU6IHJlc291cmNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHdpdGhSZXNvdXJjZTxSPihcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgICBjdHg6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSLFxuICApOiBSIHtcbiAgICAvLyBQdXNoXG4gICAgdGhpcy5wdXNoUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgIC8vIEV4ZWN1dGVcbiAgICBjb25zdCByZXN1bHQgPSBjdHgodGhpcyk7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHJldHVybiAocmVzdWx0IGFzIGFueSkucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLnBvcFJlc291cmNlKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9wXG4gICAgICB0aGlzLnBvcFJlc291cmNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGFzRW50aXR5U2V0PFI+KGN0eDogKGNvbGxlY3Rpb246IHRoaXMpID0+IFIpOiBSIHtcbiAgICAvLyBCdWlsZCBuZXcgcmVzb3VyY2VcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuX3Jlc291cmNlPy5jbG9uZVF1ZXJ5PFQ+KCk7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KHF1ZXJ5KTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2FzRW50aXR5U2V0OiBDb2xsZWN0aW9uIGRvZXMgbm90IGhhdmUgYXNzb2NpYXRlZCBFbnRpdHlTZXQgZW5kcG9pbnQnLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy53aXRoUmVzb3VyY2UocmVzb3VyY2UsIGN0eCk7XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBtb2RlbEZhY3RvcnkoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHsgcmVzZXQgPSBmYWxzZSB9OiB7IHJlc2V0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE0ge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcik7XG4gICAgYW5ub3RzLnVwZGF0ZShkYXRhKTtcblxuICAgIGlmIChhbm5vdHM/LnR5cGUgIT09IHVuZGVmaW5lZCAmJiBNb2RlbC5tZXRhICE9PSBudWxsKSB7XG4gICAgICBsZXQgc2NoZW1hID0gTW9kZWwubWV0YS5maW5kQ2hpbGRPcHRpb25zKChvKSA9PlxuICAgICAgICBvLmlzVHlwZU9mKGFubm90cy50eXBlIGFzIHN0cmluZyksXG4gICAgICApPy5zY2hlbWE7XG4gICAgICBpZiAoc2NoZW1hICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IHNjaGVtYS5tb2RlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsKGRhdGEsIHtcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0LFxuICAgICAgcGFyZW50OiBbdGhpcywgbnVsbF0sXG4gICAgfSkgYXMgTTtcbiAgfVxuXG4gIHRvRW50aXRpZXMoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIGNoYWluID0gW10sXG4gIH06IHtcbiAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gIH0gPSB7fSk6IChQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoeyBtb2RlbCwgc3RhdGUgfSkgPT5cbiAgICAgICAgICBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQgJiYgY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHsgbW9kZWwsIHN0YXRlIH0pID0+IHtcbiAgICAgICAgdmFyIGNoYW5nZXNPbmx5ID0gY2hhbmdlc19vbmx5ICYmIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQ7XG4gICAgICAgIHJldHVybiBtb2RlbC50b0VudGl0eSh7XG4gICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICAgICAgaW5jbHVkZV9rZXksXG4gICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNPbmx5LFxuICAgICAgICAgIGNoYWluOiBbdGhpcywgLi4uY2hhaW5dLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvRW50aXRpZXMoKTtcbiAgfVxuXG4gIGhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9lbnRyaWVzLnNvbWUoKGUpID0+IGUuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQpIHx8XG4gICAgICB0aGlzLm1vZGVscygpLnNvbWUoKG0pID0+IG0uaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSlcbiAgICApO1xuICB9XG5cbiAgY2xvbmU8QyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxULCBNPj4oKSB7XG4gICAgbGV0IEN0b3IgPSA8dHlwZW9mIE9EYXRhQ29sbGVjdGlvbj50aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBuZXcgQ3Rvcih0aGlzLnRvRW50aXRpZXMoSU5DTFVERV9TSEFMTE9XKSwge1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSxcbiAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICB9KSBhcyBDO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdDxULCBSPihcbiAgICBvYnMkOiBPYnNlcnZhYmxlPFQ+LFxuICAgIG1hcENhbGxiYWNrOiAocmVzcG9uc2U6IFQpID0+IFIsXG4gICk6IE9ic2VydmFibGU8Uj4ge1xuICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuUmVxdWVzdCwge1xuICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgbGV0IHBhcnNlID0gbWFwQ2FsbGJhY2socmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlN5bmMsIHsgb3B0aW9uczogcmVzcG9uc2UgfSk7XG4gICAgICAgIHJldHVybiBwYXJzZTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmZXRjaCh7XG4gICAgd2l0aENvdW50LFxuICAgIHJlbW92ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG5cbiAgICBjb25zdCBvYnMkID1cbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICA/IHJlc291cmNlLmZldGNoKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pXG4gICAgICAgIDogcmVzb3VyY2UuZmV0Y2goe1xuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLFxuICAgICAgICAgICAgd2l0aENvdW50LFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICBjb25zdCBtb2RlbHMgPSAoZW50aXRpZXMgfHwgW10pLm1hcChcbiAgICAgICAgKGVudGl0eSkgPT4gdGhpcy5tb2RlbEZhY3RvcnkoZW50aXR5LCB7IHJlc2V0OiB0cnVlIH0pIGFzIE0sXG4gICAgICApIGFzIE1bXTtcbiAgICAgIHRoaXMuYXNzaWduKG1vZGVscywgeyByZXNldDogdHJ1ZSwgcmVtb3ZlOiByZW1vdmUgPz8gdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgfSk7XG4gIH1cblxuICBmZXRjaEFsbCh7XG4gICAgd2l0aENvdW50LFxuICAgIHJlbW92ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hBbGwoeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgY29uc3QgbW9kZWxzID0gKGVudGl0aWVzIHx8IFtdKS5tYXAoXG4gICAgICAgIChlbnRpdHkpID0+IHRoaXMubW9kZWxGYWN0b3J5KGVudGl0eSwgeyByZXNldDogdHJ1ZSB9KSBhcyBNLFxuICAgICAgKSBhcyBNW107XG4gICAgICB0aGlzLmFzc2lnbihtb2RlbHMsIHsgcmVzZXQ6IHRydWUsIHJlbW92ZTogcmVtb3ZlID8/IHRydWUgfSk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0pO1xuICB9XG5cbiAgZmV0Y2hNYW55KFxuICAgIHRvcDogbnVtYmVyLFxuICAgIHtcbiAgICAgIHdpdGhDb3VudCxcbiAgICAgIHJlbW92ZSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgcmVzb3VyY2UucXVlcnkoKHEpID0+XG4gICAgICByZW1vdmUgfHwgdGhpcy5sZW5ndGggPT0gMCA/IHEuc2tpcCgpLmNsZWFyKCkgOiBxLnNraXAodGhpcy5sZW5ndGgpLFxuICAgICk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hNYW55KHRvcCwgeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgY29uc3QgbW9kZWxzID0gKGVudGl0aWVzIHx8IFtdKS5tYXAoXG4gICAgICAgIChlbnRpdHkpID0+IHRoaXMubW9kZWxGYWN0b3J5KGVudGl0eSwgeyByZXNldDogdHJ1ZSB9KSBhcyBNLFxuICAgICAgKSBhcyBNW107XG4gICAgICB0aGlzLmFzc2lnbihtb2RlbHMsIHsgcmVzZXQ6IHRydWUsIHJlbW92ZTogcmVtb3ZlID8/IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuIG1vZGVscztcbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoT25lKHtcbiAgICB3aXRoQ291bnQsXG4gICAgcmVtb3ZlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hNYW55KDEsIHsgd2l0aENvdW50LCByZW1vdmUsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgobW9kZWxzKSA9PiBtb2RlbHNbMF0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhbGwgbW9kZWxzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSByZWxNb2RlbCBUaGUgbW9kZWwgaXMgcmVsYXRpb25zaGlwXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byB1c2VcbiAgICogQHBhcmFtIG9wdGlvbnMgSHR0cE9wdGlvbnNcbiAgICovXG4gIHNhdmUoe1xuICAgIHJlbE1vZGVsID0gZmFsc2UsXG4gICAgbWV0aG9kLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbE1vZGVsPzogYm9vbGVhbjtcbiAgICBtZXRob2Q/OiAndXBkYXRlJyB8ICdtb2RpZnknO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBSZXNvdXJjZSBpcyBPRGF0YVByb3BlcnR5UmVzb3VyY2UnKSxcbiAgICAgICk7XG5cbiAgICBsZXQgdG9EZXN0cm95RW50aXR5OiBNW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmVSZWZlcmVuY2U6IE1bXSA9IFtdO1xuICAgIGxldCB0b0Rlc3Ryb3lDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b0NyZWF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvQWRkUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9DcmVhdGVDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b1VwZGF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvVXBkYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b1JlbW92ZVJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lDb250YWluZWQucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0NyZWF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAgIHRvQWRkUmVmZXJlbmNlLnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkge1xuICAgICAgICB0b1VwZGF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICB0b0Rlc3Ryb3lFbnRpdHkubGVuZ3RoID4gMCB8fFxuICAgICAgdG9SZW1vdmVSZWZlcmVuY2UubGVuZ3RoID4gMCB8fFxuICAgICAgdG9EZXN0cm95Q29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQWRkUmVmZXJlbmNlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlQ29udGFpbmVkLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IG9icyQgPSBmb3JrSm9pbihbXG4gICAgICAgIC4uLnRvRGVzdHJveUVudGl0eS5tYXAoKG0pID0+IG0uYXNFbnRpdHkoKGUpID0+IGUuZGVzdHJveShvcHRpb25zKSkpLFxuICAgICAgICAuLi50b1JlbW92ZVJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMucmVtb3ZlUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9EZXN0cm95Q29udGFpbmVkLm1hcCgobSkgPT4gbS5kZXN0cm95KG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgICApLFxuICAgICAgICAuLi50b0FkZFJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMuYWRkUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVDb250YWluZWQubWFwKChtKSA9PlxuICAgICAgICAgIG0uc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvVXBkYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2QsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSksXG4gICAgICBdKTtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuUmVxdWVzdCwge1xuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllc1xuICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZClcbiAgICAgICAgICAgIC5tYXAoKGVudHJ5KSA9PiAoeyAuLi5lbnRyeSwgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgfSkpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuU3luYyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIW1vZGVsLmlzTmV3KCkgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgIC5hZGQoXG4gICAgICAgICAgbW9kZWwuX21ldGEuZW50aXR5UmVzb3VyY2UobW9kZWwpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4sXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKVxuICAgICAgICAucGlwZShtYXAoKCkgPT4gbW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKG1vZGVsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZE1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9LFxuICApOiBNIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbC5rZXkoKTtcbiAgICBsZXQgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoe1xuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICBjaWQ6ICg8YW55Pm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0sXG4gICAgfSk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKG1vZGVsLnRvRW50aXR5KCkgYXMgVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIEVudHJ5XG4gICAgZW50cnkgPSB7XG4gICAgICBzdGF0ZTogcmVzZXQgPyBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkIDogT0RhdGFNb2RlbFN0YXRlLkFkZGVkLFxuICAgICAgbW9kZWwsXG4gICAgICBrZXk6IG1vZGVsLmtleSgpLFxuICAgIH07XG4gICAgLy8gU2V0IFBhcmVudFxuICAgIGlmIChyZXBhcmVudCkgbW9kZWwuX3BhcmVudCA9IFt0aGlzLCBudWxsXTtcbiAgICAvLyBTdWJzY3JpYmVcbiAgICB0aGlzLl9saW5rKGVudHJ5KTtcbiAgICAvLyBOb3cgYWRkXG4gICAgaWYgKHBvc2l0aW9uID49IDApIHRoaXMuX2VudHJpZXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBlbnRyeSk7XG4gICAgZWxzZSB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIG1vZGVsLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkFkZCwgeyBjb2xsZWN0aW9uOiB0aGlzIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBwcml2YXRlIGFkZE1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9LFxuICApOiBNIHtcbiAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbiA9IHRoaXMuX2Jpc2VjdChtb2RlbCk7XG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9hZGRNb2RlbChtb2RlbCwge1xuICAgICAgc2lsZW50LFxuICAgICAgcmVzZXQsXG4gICAgICBtZXJnZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcmVwYXJlbnQsXG4gICAgfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgb3B0aW9uczogeyBhZGRlZDogW2FkZGVkXSwgcmVtb3ZlZDogW10sIG1lcmdlZDogW10gfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYWRkZWQ7XG4gIH1cblxuICBhZGQoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzZXJ2ZXI/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZGRNb2RlbChtb2RlbCwge1xuICAgICAgICAgICAgc2lsZW50LFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICByZXBhcmVudCxcbiAgICAgICAgICAgIG1lcmdlLFxuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuYWRkTW9kZWwobW9kZWwsIHsgc2lsZW50LCBwb3NpdGlvbiwgbWVyZ2UsIHJlcGFyZW50IH0pKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlZmVyZW5jZShtb2RlbDogTSwgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIW1vZGVsLmlzTmV3KCkgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBsZXQgdGFyZ2V0ID1cbiAgICAgICAgdGhpcy5fbW9kZWwubWV0YS5hcGkub3B0aW9ucy5kZWxldGVSZWZCeSA9PT0gJ2lkJ1xuICAgICAgICAgID8gKG1vZGVsLl9tZXRhLmVudGl0eVJlc291cmNlKG1vZGVsKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdwYXRoJykge1xuICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlLmtleShtb2RlbC5rZXkoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgIC5yZW1vdmUodGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICAucGlwZShtYXAoKCkgPT4gbW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKG1vZGVsKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZU1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIEV2ZW50XG4gICAgaWYgKCFzaWxlbnQpXG4gICAgICBtb2RlbC5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZW1vdmUsIHsgY29sbGVjdGlvbjogdGhpcyB9KTtcblxuICAgIC8vIE5vdyByZW1vdmVcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICghKHJlc2V0IHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpKSB7XG4gICAgICAvLyBNb3ZlIHRvIGVuZCBvZiBhcnJheSBhbmQgbWFyayBhcyByZW1vdmVkXG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkO1xuICAgICAgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgdGhpcy5fdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE0ge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl9yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0IH0pO1xuICAgIGlmICghc2lsZW50ICYmIHJlbW92ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUsIHtcbiAgICAgICAgb3B0aW9uczogeyBhZGRlZDogW10sIHJlbW92ZWQ6IFtyZW1vdmVkXSwgbWVyZ2VkOiBbXSB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZW1vdmVkO1xuICB9XG5cbiAgcmVtb3ZlKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHRoaXMucmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldDogdHJ1ZSB9KSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQgfSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX21vdmVNb2RlbChtb2RlbDogTSwgcG9zaXRpb246IG51bWJlcik6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBOb3cgcmVtb3ZlXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuXG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgY3JlYXRlKFxuICAgIGF0dHJzOiBUID0ge30gYXMgVCxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRmFjdG9yeShhdHRycyk7XG4gICAgcmV0dXJuIChtb2RlbC5pc1ZhbGlkKCkgJiYgc2VydmVyID8gbW9kZWwuc2F2ZSgpIDogb2YobW9kZWwpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChtb2RlbCkgPT4gdGhpcy5hZGQobW9kZWwsIHsgc2lsZW50LCBzZXJ2ZXIgfSkpLFxuICAgICAgbWFwKCgpID0+IG1vZGVsKSxcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55LCB7fToge30gJiBNb2RlbEZpZWxkT3B0aW9ucykge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9lbnRyaWVzW051bWJlcihwYXRoQXJyYXlbMF0pXS5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgbGV0IHRvQWRkOiBNW10gPSBbXTtcbiAgICAgIGxldCB0b0NoYW5nZTogTVtdID0gW107XG4gICAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgICAgbGV0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KTtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vVE9ETzogUmVtb3ZlL0FkZCBvciBNZXJnZT9cbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKFxuICAgICAgICAgIHZhbHVlLnRvRW50aXR5KHsgY2xpZW50X2lkOiB0cnVlLCAuLi5JTkNMVURFX0RFRVAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKCkpIHRvQ2hhbmdlLnB1c2gobW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIHRoaXMuX2FkZE1vZGVsKHZhbHVlLCB7IHJlcGFyZW50OiB0cnVlIH0pO1xuICAgICAgICB0b0FkZC5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLCB7XG4gICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IHRvQWRkLCByZW1vdmVkOiB0b1JlbW92ZSwgY2hhbmdlZDogdG9DaGFuZ2UgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldChwYXRoOiBudW1iZXIpOiBNIHwgdW5kZWZpbmVkO1xuICBnZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBhbnk7XG4gIGdldChwYXRoOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1vZGVscygpW051bWJlcihwYXRoQXJyYXlbMF0pXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5nZXQocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaGFzKHBhdGg6IG51bWJlciB8IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbHMoKVtOdW1iZXIocGF0aEFycmF5WzBdKV07XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaGFzKHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVzZXQoe1xuICAgIHBhdGgsXG4gICAgc2lsZW50ID0gZmFsc2UsXG4gIH06IHsgcGF0aD86IHN0cmluZyB8IHN0cmluZ1tdOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGxldCB0b0FkZDogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgICBsZXQgdG9DaGFuZ2U6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG4gICAgbGV0IHRvUmVtb3ZlOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuXG4gICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzZXQgYnkgcGF0aFxuICAgICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICAgICkgYXMgYW55W107XG4gICAgICBjb25zdCBpbmRleCA9IE51bWJlcihwYXRoQXJyYXlbMF0pO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHMoKVtpbmRleF07XG4gICAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSkge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHsgbW9kZWwgfSkgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkICYmXG4gICAgICAgICAgICBlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRvQ2hhbmdlID0gW2VudHJ5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aCA9IHBhdGhBcnJheS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBhbGxcbiAgICAgIHRvQWRkID0gdGhpcy5fZW50cmllcy5maWx0ZXIoKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKTtcbiAgICAgIHRvQ2hhbmdlID0gdGhpcy5fZW50cmllcy5maWx0ZXIoXG4gICAgICAgIChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkICYmIGUubW9kZWwuaGFzQ2hhbmdlZCgpLFxuICAgICAgKTtcbiAgICAgIHRvUmVtb3ZlID0gdGhpcy5fZW50cmllcy5maWx0ZXIoKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCk7XG4gICAgfVxuXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0b0FkZC5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgdGhpcy5fYWRkTW9kZWwoZW50cnkubW9kZWwsIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRvQ2hhbmdlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBlbnRyeS5tb2RlbC5yZXNldCh7IHBhdGgsIHNpbGVudCB9KTtcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZDtcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAhc2lsZW50ICYmXG4gICAgICAodG9BZGQubGVuZ3RoID4gMCB8fCB0b1JlbW92ZS5sZW5ndGggPiAwIHx8IHRvQ2hhbmdlLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlJlc2V0LCB7XG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBhZGRlZDogdG9BZGQubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZS5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgIGNoYW5nZWQ6IHRvQ2hhbmdlLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IHRoaXMubW9kZWxzKCk7XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwobSwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fZW50cmllcyA9IFtdO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSwge1xuICAgICAgICBvcHRpb25zOiB7IHJlbW92ZWQ6IHRvUmVtb3ZlIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgb2JqZWN0czogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSB8IE1bXSxcbiAgICB7XG4gICAgICByZW1vdmUgPSB0cnVlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IE1vZGVsID0gdGhpcy5fbW9kZWw7XG4gICAgY29uc3Qgb2Zmc2V0ID0gcmVtb3ZlID8gMCA6IHRoaXMubGVuZ3RoO1xuXG4gICAgbGV0IHRvQWRkOiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IHRvQ2hhbmdlOiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IHRvUmVtb3ZlOiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IHRvU29ydDogW00sIG51bWJlcl1bXSA9IFtdO1xuICAgIGxldCBtb2RlbE1hcDogc3RyaW5nW10gPSBbXTtcbiAgICBvYmplY3RzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlzTW9kZWwgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG9iaik7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGluZGV4ICsgb2Zmc2V0O1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgICAgTW9kZWwgIT09IG51bGwgJiYgTW9kZWwubWV0YSA/IE1vZGVsLm1ldGEucmVzb2x2ZUtleShvYmopIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY2lkID1cbiAgICAgICAgTW9kZWwubWV0YS5jaWQgaW4gb2JqID8gKDxhbnk+b2JqKVtNb2RlbC5tZXRhLmNpZF0gOiB1bmRlZmluZWQ7XG4gICAgICAvLyBUcnkgZmluZCBlbnRyeVxuICAgICAgY29uc3QgZW50cnkgPSBpc01vZGVsXG4gICAgICAgID8gdGhpcy5fZmluZEVudHJ5KHsgbW9kZWw6IG9iaiBhcyBNIH0pIC8vIEJ5IE1vZGVsXG4gICAgICAgIDogdGhpcy5fZmluZEVudHJ5KHsgY2lkLCBrZXkgfSk7IC8vIEJ5IENpZCBvciBLZXlcblxuICAgICAgbGV0IG1vZGVsOiBNO1xuICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgbW9kZWwgPSBlbnRyeS5tb2RlbDtcbiAgICAgICAgaWYgKG1vZGVsICE9PSBvYmopIHtcbiAgICAgICAgICAvLyBHZXQgZW50aXR5IGZyb20gbW9kZWxcbiAgICAgICAgICBpZiAoaXNNb2RlbCkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gKG9iaiBhcyBNKS50b0VudGl0eSh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZDogdHJ1ZSxcbiAgICAgICAgICAgICAgLi4uSU5DTFVERV9ERUVQLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2RlbC5hc3NpZ24oZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBlciA9IHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcjtcbiAgICAgICAgICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+KFxuICAgICAgICAgICAgICBoZWxwZXIsXG4gICAgICAgICAgICAgIGhlbHBlci5hbm5vdGF0aW9ucyhvYmopLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IGFubm90cy5hdHRyaWJ1dGVzKG9iaiwgJ2Z1bGwnKTtcbiAgICAgICAgICAgIG1vZGVsLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgICAgICAgIG1vZGVsLmFzc2lnbihlbnRpdHksIHsgcmVzZXQsIHNpbGVudCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTW9kZWwgQ2hhbmdlP1xuICAgICAgICAgIGlmIChtb2RlbC5oYXNDaGFuZ2VkKCkpIHRvQ2hhbmdlLnB1c2goW21vZGVsLCBwb3NpdGlvbl0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNldCkgZW50cnkuc3RhdGUgPSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkO1xuICAgICAgICAvLyBIYXMgU29ydCBvciBJbmRleCBDaGFuZ2U/XG4gICAgICAgIGlmICh0b1NvcnQubGVuZ3RoID4gMCB8fCBwb3NpdGlvbiAhPT0gdGhpcy5tb2RlbHMoKS5pbmRleE9mKG1vZGVsKSkge1xuICAgICAgICAgIHRvU29ydC5wdXNoKFttb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIG1vZGVsID0gaXNNb2RlbFxuICAgICAgICAgID8gKG9iaiBhcyBNKVxuICAgICAgICAgIDogdGhpcy5tb2RlbEZhY3Rvcnkob2JqIGFzIFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgICAgICAgICByZXNldCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0b0FkZC5wdXNoKFttb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgIH1cbiAgICAgIG1vZGVsTWFwLnB1c2goKDxhbnk+bW9kZWwpW01vZGVsLm1ldGEuY2lkXSk7XG4gICAgfSk7XG5cbiAgICBpZiAocmVtb3ZlKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKGVudHJ5LCBwb3NpdGlvbikgPT4ge1xuICAgICAgICBpZiAobW9kZWxNYXAuaW5kZXhPZigoPGFueT5lbnRyeS5tb2RlbClbTW9kZWwubWV0YS5jaWRdKSA9PT0gLTEpXG4gICAgICAgICAgdG9SZW1vdmUucHVzaChbZW50cnkubW9kZWwsIHBvc2l0aW9uXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSByZW1vdmUsIGFkZCBhbmQgc29ydFxuICAgIHRvUmVtb3ZlLmZvckVhY2goKFttb2RlbCwgcG9zaXRpb25dKSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0IH0pO1xuICAgIH0pO1xuICAgIHRvQWRkLmZvckVhY2goKFttb2RlbCwgcG9zaXRpb25dKSA9PiB7XG4gICAgICB0aGlzLl9hZGRNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0LCByZXBhcmVudCwgcG9zaXRpb24gfSk7XG4gICAgfSk7XG4gICAgdG9Tb3J0LmZvckVhY2goKFttb2RlbCwgcG9zaXRpb25dKSA9PiB7XG4gICAgICB0aGlzLl9tb3ZlTW9kZWwobW9kZWwsIHBvc2l0aW9uKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgICghc2lsZW50ICYmXG4gICAgICAgICh0b0FkZC5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9SZW1vdmUubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHRvQ2hhbmdlLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b1NvcnQubGVuZ3RoID4gMCkpIHx8XG4gICAgICByZXNldFxuICAgICkge1xuICAgICAgdGhpcy5fc29ydEJ5ID0gbnVsbDtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKFxuICAgICAgICByZXNldCA/IE9EYXRhTW9kZWxFdmVudFR5cGUuUmVzZXQgOiBPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSxcbiAgICAgICAge1xuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFkZGVkOiB0b0FkZCxcbiAgICAgICAgICAgIHJlbW92ZWQ6IHRvUmVtb3ZlLFxuICAgICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UsXG4gICAgICAgICAgICBzb3J0ZWQ6IHRvU29ydCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBjdHg6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICByZXNvdXJjZS5xdWVyeShjdHgpO1xuICAgIHRoaXMuYXR0YWNoKHJlc291cmNlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIG9wdGlvbnM6IE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEZ1bmN0aW9uOiBDYW4ndCBjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVwiLFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHJlc291cmNlLmZ1bmN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBmdW5jLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIG9wdGlvbnM6IE9EYXRhQWN0aW9uT3B0aW9uczxSPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBjYWxsQWN0aW9uOiBDYW4ndCBjYWxsIGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VgLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5hY3Rpb248UCwgUj4obmFtZSkucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoYWN0aW9uLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgYWN0aW9uLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VubGluayhlbnRyeTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSB7XG4gICAgaWYgKGVudHJ5LnN1YnNjcmlwdGlvbikge1xuICAgICAgZW50cnkuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGluayhlbnRyeTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSB7XG4gICAgaWYgKGVudHJ5LnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uOiBTdWJzY3JpcHRpb24gYWxyZWFkeSBleGlzdHMnKTtcbiAgICB9XG4gICAgZW50cnkuc3Vic2NyaXB0aW9uID0gZW50cnkubW9kZWwuZXZlbnRzJC5zdWJzY3JpYmUoXG4gICAgICAoZXZlbnQ6IE9EYXRhTW9kZWxFdmVudDxUPikgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuY2FuQ29udGludWVXaXRoKHRoaXMpKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGVsID09PSBlbnRyeS5tb2RlbCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm5hbWUgPT09IE9EYXRhTW9kZWxFdmVudFR5cGUuRGVzdHJveSkge1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgZXZlbnQubmFtZSA9PT0gT0RhdGFNb2RlbEV2ZW50VHlwZS5DaGFuZ2UgJiZcbiAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucz8ua2V5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZW50cnkua2V5ID0gZW50cnkubW9kZWwua2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVscygpLmluZGV4T2YoZW50cnkubW9kZWwpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KGV2ZW50LnB1c2godGhpcywgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEVudHJ5KHtcbiAgICBtb2RlbCxcbiAgICBjaWQsXG4gICAga2V5LFxuICB9OiB7XG4gICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgIGNpZD86IHN0cmluZztcbiAgICBrZXk/OiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuZmluZCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGJ5TW9kZWwgPSBtb2RlbCAhPT0gdW5kZWZpbmVkICYmIGVudHJ5Lm1vZGVsLmVxdWFscyhtb2RlbCk7XG4gICAgICBjb25zdCBieUNpZCA9XG4gICAgICAgIGNpZCAhPT0gdW5kZWZpbmVkICYmICg8YW55PmVudHJ5Lm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0gPT09IGNpZDtcbiAgICAgIGNvbnN0IGJ5S2V5ID1cbiAgICAgICAga2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZW50cnkua2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgVHlwZXMuaXNFcXVhbChlbnRyeS5rZXksIGtleSk7XG4gICAgICByZXR1cm4gYnlNb2RlbCB8fCBieUNpZCB8fCBieUtleTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENvbGxlY3Rpb24gZnVuY3Rpb25zXG4gIGVxdWFscyhvdGhlcjogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMgPT09IG90aGVyO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQ29sbGVjdGlvbic7XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgbGV0IHBvaW50ZXIgPSAwO1xuICAgIGxldCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCk6IEl0ZXJhdG9yUmVzdWx0PE0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkb25lOiBwb2ludGVyID09PSBtb2RlbHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbHNbcG9pbnRlcisrXSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZpbHRlcihcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gdW5rbm93bixcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBNW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgbWFwPFU+KFxuICAgIGNhbGxiYWNrZm46ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gVSxcbiAgICB0aGlzQXJnPzogYW55LFxuICApOiBVW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLm1hcChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcbiAgfVxuXG4gIGZpbmQoXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIG9iajogTVtdKSA9PiB1bmtub3duLFxuICAgIHRoaXNBcmc/OiBhbnksXG4gICk6IE0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIHJlZHVjZTxVPihcbiAgICBjYWxsYmFja2ZuOiAoXG4gICAgICBwcmV2aW91c1ZhbHVlOiBVLFxuICAgICAgY3VycmVudFZhbHVlOiBNLFxuICAgICAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gICAgICBhcnJheTogTVtdLFxuICAgICkgPT4gVSxcbiAgICBpbml0aWFsVmFsdWU6IFUsXG4gICk6IFUge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnJlZHVjZShjYWxsYmFja2ZuLCBpbml0aWFsVmFsdWUpO1xuICB9XG5cbiAgZmlyc3QoKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKClbMF07XG4gIH1cblxuICBsYXN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIG1vZGVsc1ttb2RlbHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBuZXh0KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4ICsgMSk7XG4gIH1cblxuICBwcmV2KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA8PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIGV2ZXJ5KHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5ldmVyeShwcmVkaWNhdGUpO1xuICB9XG5cbiAgc29tZShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuc29tZShwcmVkaWNhdGUpO1xuICB9XG5cbiAgY29udGFpbnMobW9kZWw6IE0pIHtcbiAgICByZXR1cm4gdGhpcy5zb21lKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICB9XG5cbiAgaW5kZXhPZihtb2RlbDogTSk6IG51bWJlciB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICBjb25zdCBtID0gbW9kZWxzLmZpbmQoKG0pID0+IG0uZXF1YWxzKG1vZGVsKSk7XG4gICAgcmV0dXJuIG0gPT09IHVuZGVmaW5lZCA/IC0xIDogbW9kZWxzLmluZGV4T2YobSk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIC8vIExvY2FsIGxlbmd0aCBhbmQgaWYgZXhpc3RzIHJlbW90ZSBsZW5ndGhcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvLyNyZWdpb24gU29ydFxuICBwcml2YXRlIF9iaXNlY3QobW9kZWw6IE0pIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBpZiAodGhpcy5fc29ydEJ5ICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9lbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAodGhpcy5fY29tcGFyZShtb2RlbCwgdGhpcy5fZW50cmllc1tpbmRleF0sIHRoaXMuX3NvcnRCeSwgMCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmUoXG4gICAgZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGxldCBtMSA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTEpXG4gICAgICA/IChlMSBhcyBNKVxuICAgICAgOiAoZTEgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBsZXQgbTIgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUyKVxuICAgICAgPyAoZTIgYXMgTSlcbiAgICAgIDogKGUyIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgbGV0IHZhbHVlMSA9IG0xLmdldChieVtpbmRleF0uZmllbGQgYXMgc3RyaW5nKTtcbiAgICBsZXQgdmFsdWUyID0gbTIuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XG5cbiAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpIHJlc3VsdCA9IC0xO1xuICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAxO1xuICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAwO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT0gJ3N0cmluZycgfHwgdmFsdWUxIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBpZiAodmFsdWUxLmxvY2FsZUNvbXBhcmUgJiYgdmFsdWUxICE9IHZhbHVlMikge1xuICAgICAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xuICAgICAgcmV0dXJuIGJ5Lmxlbmd0aCAtIDEgPiBpbmRleCA/IHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgaW5kZXggKyAxKSA6IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChieVtpbmRleF0ub3JkZXIgfHwgMSkgKiByZXN1bHQ7XG4gIH1cblxuICBfc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10gfCBudWxsID0gbnVsbDtcbiAgaXNTb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeSAhPT0gbnVsbDtcbiAgfVxuXG4gIHNvcnQoXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICB7IHNpbGVudCB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLl9zb3J0QnkgPSBieTtcbiAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllcy5zb3J0KFxuICAgICAgKGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4sIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pID0+XG4gICAgICAgIHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgMCksXG4gICAgKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5VcGRhdGUpO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==