angular-odata 0.125.0 → 0.127.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 (86) hide show
  1. package/README.md +2 -2
  2. package/esm2022/lib/api.mjs +5 -4
  3. package/esm2022/lib/cache/storage.mjs +3 -3
  4. package/esm2022/lib/client.mjs +7 -7
  5. package/esm2022/lib/loaders.mjs +1 -1
  6. package/esm2022/lib/models/collection.mjs +220 -216
  7. package/esm2022/lib/models/model.mjs +49 -50
  8. package/esm2022/lib/models/options.mjs +149 -117
  9. package/esm2022/lib/module.mjs +20 -7
  10. package/esm2022/lib/options.mjs +2 -1
  11. package/esm2022/lib/resources/path/segments.mjs +35 -13
  12. package/esm2022/lib/resources/query/builder.mjs +17 -5
  13. package/esm2022/lib/resources/query/expressions/apply.mjs +169 -0
  14. package/esm2022/lib/resources/query/expressions/base.mjs +8 -3
  15. package/esm2022/lib/resources/query/expressions/compute.mjs +20 -5
  16. package/esm2022/lib/resources/query/expressions/count.mjs +27 -10
  17. package/esm2022/lib/resources/query/expressions/expand.mjs +36 -14
  18. package/esm2022/lib/resources/query/expressions/filter.mjs +33 -16
  19. package/esm2022/lib/resources/query/expressions/index.mjs +2 -1
  20. package/esm2022/lib/resources/query/expressions/orderby.mjs +32 -9
  21. package/esm2022/lib/resources/query/expressions/search.mjs +34 -15
  22. package/esm2022/lib/resources/query/expressions/select.mjs +17 -5
  23. package/esm2022/lib/resources/query/expressions/syntax.mjs +319 -32
  24. package/esm2022/lib/resources/query/handlers.mjs +90 -55
  25. package/esm2022/lib/resources/query/index.mjs +2 -1
  26. package/esm2022/lib/resources/query/options.mjs +95 -71
  27. package/esm2022/lib/resources/request.mjs +4 -3
  28. package/esm2022/lib/resources/resource.mjs +53 -24
  29. package/esm2022/lib/resources/responses/annotations.mjs +4 -1
  30. package/esm2022/lib/resources/responses/response.mjs +3 -3
  31. package/esm2022/lib/resources/types/batch.mjs +19 -17
  32. package/esm2022/lib/resources/types/count.mjs +7 -4
  33. package/esm2022/lib/resources/types/entity-set.mjs +3 -2
  34. package/esm2022/lib/resources/types/entity.mjs +5 -5
  35. package/esm2022/lib/resources/types/function.mjs +1 -9
  36. package/esm2022/lib/resources/types/navigation-property.mjs +4 -3
  37. package/esm2022/lib/resources/types/options.mjs +1 -1
  38. package/esm2022/lib/resources/types/property.mjs +12 -4
  39. package/esm2022/lib/resources/types/reference.mjs +4 -4
  40. package/esm2022/lib/schema/parsers/enum-type.mjs +14 -7
  41. package/esm2022/lib/schema/parsers/structured-type.mjs +56 -44
  42. package/esm2022/lib/schema/structured-type.mjs +13 -2
  43. package/esm2022/lib/services/base.mjs +4 -4
  44. package/esm2022/lib/services/factory.mjs +4 -4
  45. package/esm2022/lib/types.mjs +12 -1
  46. package/esm2022/lib/utils/http.mjs +8 -6
  47. package/fesm2022/angular-odata.mjs +8885 -8094
  48. package/fesm2022/angular-odata.mjs.map +1 -1
  49. package/lib/api.d.ts +2 -2
  50. package/lib/client.d.ts +1 -1
  51. package/lib/models/collection.d.ts +33 -24
  52. package/lib/models/model.d.ts +18 -9
  53. package/lib/models/options.d.ts +22 -17
  54. package/lib/module.d.ts +2 -1
  55. package/lib/options.d.ts +5 -0
  56. package/lib/resources/path/segments.d.ts +18 -11
  57. package/lib/resources/query/builder.d.ts +6 -5
  58. package/lib/resources/query/expressions/apply.d.ts +103 -0
  59. package/lib/resources/query/expressions/base.d.ts +6 -3
  60. package/lib/resources/query/expressions/compute.d.ts +15 -4
  61. package/lib/resources/query/expressions/count.d.ts +17 -6
  62. package/lib/resources/query/expressions/expand.d.ts +22 -11
  63. package/lib/resources/query/expressions/filter.d.ts +17 -6
  64. package/lib/resources/query/expressions/index.d.ts +1 -0
  65. package/lib/resources/query/expressions/orderby.d.ts +18 -6
  66. package/lib/resources/query/expressions/search.d.ts +15 -6
  67. package/lib/resources/query/expressions/select.d.ts +13 -4
  68. package/lib/resources/query/expressions/syntax.d.ts +138 -19
  69. package/lib/resources/query/handlers.d.ts +33 -10
  70. package/lib/resources/query/index.d.ts +1 -0
  71. package/lib/resources/query/options.d.ts +24 -13
  72. package/lib/resources/request.d.ts +3 -2
  73. package/lib/resources/resource.d.ts +15 -6
  74. package/lib/resources/responses/annotations.d.ts +1 -0
  75. package/lib/resources/responses/response.d.ts +2 -2
  76. package/lib/resources/types/batch.d.ts +9 -4
  77. package/lib/resources/types/count.d.ts +5 -1
  78. package/lib/resources/types/function.d.ts +0 -3
  79. package/lib/resources/types/options.d.ts +2 -1
  80. package/lib/resources/types/property.d.ts +2 -0
  81. package/lib/schema/parsers/enum-type.d.ts +14 -2
  82. package/lib/schema/parsers/structured-type.d.ts +1 -0
  83. package/lib/schema/structured-type.d.ts +2 -1
  84. package/lib/types.d.ts +11 -0
  85. package/lib/utils/http.d.ts +1 -1
  86. package/package.json +1 -1
@@ -5,12 +5,15 @@ import { ODataHelper } from '../helper';
5
5
  import { ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
6
6
  import { EdmType } from '../types';
7
7
  import { Objects, Types } from '../utils';
8
+ import { ODataCollection } from './collection';
9
+ import { ODataModel } from './model';
8
10
  import { EventEmitter } from '@angular/core';
9
11
  export var ODataModelEventType;
10
12
  (function (ODataModelEventType) {
11
13
  ODataModelEventType["Change"] = "change";
12
14
  ODataModelEventType["Reset"] = "reset";
13
15
  ODataModelEventType["Update"] = "update";
16
+ ODataModelEventType["Sort"] = "sort";
14
17
  ODataModelEventType["Destroy"] = "destroy";
15
18
  ODataModelEventType["Add"] = "add";
16
19
  ODataModelEventType["Remove"] = "remove";
@@ -20,8 +23,8 @@ export var ODataModelEventType;
20
23
  ODataModelEventType["Attach"] = "attach";
21
24
  })(ODataModelEventType || (ODataModelEventType = {}));
22
25
  export class ODataModelEvent {
23
- constructor(name, { model, collection, previous, value, attr, options, bubbly, chain, } = {}) {
24
- this.name = name;
26
+ constructor(type, { model, collection, previous, value, attr, options, bubbles, chain, } = {}) {
27
+ this.type = type;
25
28
  this.model = model;
26
29
  this.collection = collection;
27
30
  this.previous = previous;
@@ -33,28 +36,35 @@ export class ODataModelEvent {
33
36
  attr || null,
34
37
  ],
35
38
  ];
36
- this.bubbly = bubbly ?? true;
39
+ this.bubbles = bubbles ?? BUBBLES.indexOf(this.type) !== -1;
37
40
  }
38
41
  push(model, attr) {
39
- return new ODataModelEvent(this.name, {
40
- model: this.model,
41
- collection: this.collection,
42
+ return new ODataModelEvent(this.type, {
43
+ model: this.model ??
44
+ (model instanceof ODataModel ? model : undefined),
45
+ collection: this.collection ??
46
+ (model instanceof ODataCollection
47
+ ? model
48
+ : undefined),
42
49
  previous: this.previous,
43
50
  value: this.value,
44
- options: this.options,
45
- bubbly: this.bubbly,
51
+ options: {
52
+ ...this.options,
53
+ index: attr instanceof ODataModelAttribute ? attr.name : attr,
54
+ },
55
+ bubbles: this.bubbles,
46
56
  chain: [[model, attr], ...this.chain],
47
57
  });
48
58
  }
49
59
  stopPropagation() {
50
- this.bubbly = false;
60
+ this.bubbles = false;
51
61
  }
52
62
  visited(model) {
53
63
  return (this.chain.some((c) => c[0] === model) &&
54
64
  this.chain[this.chain.length - 1][0] !== model);
55
65
  }
56
66
  canContinueWith(self) {
57
- return this.bubbly && !this.visited(self);
67
+ return this.bubbles && !this.visited(self);
58
68
  }
59
69
  get path() {
60
70
  return this.chain
@@ -88,12 +98,12 @@ export class ODataModelEventEmitter extends EventEmitter {
88
98
  }
89
99
  /*
90
100
  override emit(event: ODataModelEvent<T>): void {
91
- if (event.bubbly && ((this.collection || this.model) === undefined || !event.visited((this.collection || this.model)!))) {
101
+ if (event.bubbles && ((this.collection || this.model) === undefined || !event.visited((this.collection || this.model)!))) {
92
102
  super.emit(event);
93
103
  }
94
104
  }
95
105
  */
96
- trigger(type, { collection, previous, value, attr, options, bubbly, } = {}) {
106
+ trigger(type, { collection, previous, value, attr, options, bubbles, } = {}) {
97
107
  const _trigger = (name) => this.emit(new ODataModelEvent(name, {
98
108
  model: this.model,
99
109
  collection: collection ?? this.collection,
@@ -101,10 +111,10 @@ export class ODataModelEventEmitter extends EventEmitter {
101
111
  value,
102
112
  attr,
103
113
  options,
104
- bubbly,
114
+ bubbles,
105
115
  }));
106
116
  if (type && EVENT_SPLITTER.test(type)) {
107
- for (let name of type.split(EVENT_SPLITTER)) {
117
+ for (const name of type.split(EVENT_SPLITTER)) {
108
118
  _trigger(name);
109
119
  }
110
120
  }
@@ -113,10 +123,19 @@ export class ODataModelEventEmitter extends EventEmitter {
113
123
  }
114
124
  }
115
125
  }
126
+ export const BUBBLES = [
127
+ ODataModelEventType.Change,
128
+ ODataModelEventType.Reset,
129
+ ODataModelEventType.Update,
130
+ ODataModelEventType.Destroy,
131
+ ODataModelEventType.Add,
132
+ ODataModelEventType.Remove,
133
+ ];
116
134
  export const INCLUDE_SHALLOW = {
117
135
  include_concurrency: true,
118
136
  include_computed: true,
119
137
  include_key: true,
138
+ include_id: false,
120
139
  };
121
140
  export const INCLUDE_DEEP = {
122
141
  include_navigation: true,
@@ -202,7 +221,7 @@ export class ODataModelField {
202
221
  return this.parser.isStructuredType();
203
222
  }
204
223
  structured() {
205
- let structuredType = this.api.findStructuredTypeForType(this.parser.type);
224
+ const structuredType = this.api.findStructuredTypeForType(this.parser.type);
206
225
  //Throw error if not found
207
226
  if (!structuredType)
208
227
  throw new Error(`Could not find structured type for ${this.parser.type}`);
@@ -212,7 +231,7 @@ export class ODataModelField {
212
231
  return this.parser.isEnumType();
213
232
  }
214
233
  enum() {
215
- let enumType = this.api.findEnumTypeForType(this.parser.type);
234
+ const enumType = this.api.findEnumTypeForType(this.parser.type);
216
235
  //Throw error if not found
217
236
  if (!enumType)
218
237
  throw new Error(`Could not find enum type for ${this.parser.type}`);
@@ -231,7 +250,7 @@ export class ODataModelField {
231
250
  }
232
251
  else {
233
252
  const computed = this.annotatedValue(COMPUTED);
234
- let errors = this.parser?.validate(value, { method, navigation }) || [];
253
+ const errors = this.parser?.validate(value, { method, navigation }) || [];
235
254
  if (this.required &&
236
255
  (value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
237
256
  !(computed && method === 'create') // Not (Is Computed field and create) ?
@@ -310,7 +329,7 @@ export class ODataModelField {
310
329
  annots.update(value);
311
330
  }
312
331
  if (annots?.type !== undefined && Model.meta !== null) {
313
- let schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.schema;
332
+ const schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.schema;
314
333
  if (schema !== undefined && schema.model !== undefined)
315
334
  // Change to child model
316
335
  Model = schema.model;
@@ -371,7 +390,9 @@ export class ODataModelAttribute {
371
390
  const current = this.get();
372
391
  if (ODataModelOptions.isModel(current) ||
373
392
  ODataModelOptions.isCollection(current))
374
- this.unlink(current);
393
+ this.unlink(current
394
+ //this.value !== current
395
+ );
375
396
  const changed = ODataModelOptions.isModel(current) && ODataModelOptions.isModel(value)
376
397
  ? !current.equals(value)
377
398
  : ODataModelOptions.isCollection(current) &&
@@ -461,12 +482,12 @@ export class ODataModelOptions {
461
482
  }
462
483
  isModelFor(entity) {
463
484
  // Resolve By Type
464
- let type = this.api.options.helper.type(entity);
485
+ const type = this.api.options.helper.type(entity);
465
486
  if (type && this.isTypeOf(type))
466
487
  return true;
467
488
  // Resolve By fields
468
- let keys = Object.keys(entity);
469
- let names = this.fields({
489
+ const keys = Object.keys(entity);
490
+ const names = this.fields({
470
491
  include_navigation: true,
471
492
  include_parents: true,
472
493
  }).map((f) => f.name);
@@ -476,7 +497,7 @@ export class ODataModelOptions {
476
497
  if (predicate(this))
477
498
  return this;
478
499
  let match;
479
- for (let ch of this.children) {
500
+ for (const ch of this.children) {
480
501
  match = ch.findChildOptions(predicate);
481
502
  if (match !== undefined)
482
503
  break;
@@ -496,7 +517,7 @@ export class ODataModelOptions {
496
517
  this.entitySet.annotatedValue(OPTIMISTIC_CONCURRENCY) || [];
497
518
  }
498
519
  this._fields.forEach((field) => {
499
- let concurrency = concurrencyFields.indexOf(field.field) !== -1;
520
+ const concurrency = concurrencyFields.indexOf(field.field) !== -1;
500
521
  field.configure({
501
522
  findOptionsForType,
502
523
  concurrency,
@@ -513,9 +534,9 @@ export class ODataModelOptions {
513
534
  ];
514
535
  }
515
536
  field(name) {
516
- let field = this.findField(name);
537
+ const field = this.findField(name);
517
538
  //Throw error if not found
518
- if (field === undefined)
539
+ if (!field)
519
540
  throw new Error(`No field with name ${name}`);
520
541
  return field;
521
542
  }
@@ -594,39 +615,46 @@ export class ODataModelOptions {
594
615
  static resource(child) {
595
616
  let resource = null;
596
617
  let prevField = null;
597
- for (let [model, field] of ODataModelOptions.chain(child)) {
618
+ for (const [model, field] of ODataModelOptions.chain(child)) {
598
619
  resource = resource || model._resource;
599
620
  if (resource === null)
600
621
  break;
601
622
  if (ODataModelOptions.isModel(model) &&
602
623
  (prevField === null || prevField.collection)) {
624
+ const m = model;
625
+ // Resolve subtype if collection not is from field
626
+ // FIXME
627
+ /*
628
+ if (field === null) {
629
+ const r = m._meta.modelResourceFactory(resource.cloneQuery<T>());
630
+ if (r !== null && !r.isTypeOf(resource) && r.isSubtypeOf(resource)) {
631
+ resource = r;
632
+ }
633
+ }
634
+ */
603
635
  // Resolve key
604
- let modelKey = model.key({
605
- field_mapping: true,
606
- });
607
- if (modelKey !== undefined)
636
+ const mKey = m.key({ field_mapping: true });
637
+ if (mKey !== undefined) {
608
638
  resource =
609
639
  resource instanceof ODataEntitySetResource
610
- ? resource.entity(modelKey)
611
- : resource.key(modelKey);
640
+ ? resource.entity(mKey)
641
+ : resource.key(mKey);
642
+ }
612
643
  }
613
644
  prevField = field;
614
- if (field === null) {
645
+ if (field === null && model._resource !== null) {
615
646
  // Apply the query from model to new resource
616
- const query = model._resource?.cloneQuery().toQueryArguments();
617
- if (query !== undefined)
618
- resource.query((q) => q.apply(query));
619
- continue;
647
+ model._resource.query((qs) => resource?.query((qd) => qd.restore(qs.store())));
648
+ }
649
+ else if (field !== null) {
650
+ resource = field.resourceFactory(resource);
620
651
  }
621
- resource = field.resourceFactory(resource);
622
652
  }
623
- if (resource === null)
624
- throw new Error(`Can't build resource for ${child}`);
625
653
  return resource;
626
654
  }
627
655
  collectionResourceFactory(query) {
628
656
  if (this.entitySet === undefined)
629
- return undefined;
657
+ return null;
630
658
  return ODataEntitySetResource.factory(this.api, {
631
659
  path: this.entitySet.name,
632
660
  schema: this.schema,
@@ -639,15 +667,6 @@ export class ODataModelOptions {
639
667
  return resource.entity();
640
668
  return resource;
641
669
  }
642
- entityResource(self) {
643
- let resource = this.modelResourceFactory(self._resource !== null ? self._resource.cloneQuery() : undefined);
644
- if (resource === undefined)
645
- throw new Error(`Can't build resource for ${self}`);
646
- const key = self.key({ field_mapping: true });
647
- if (key !== undefined)
648
- return resource.key(key);
649
- return resource;
650
- }
651
670
  //#endregion
652
671
  bind(self, { parent, resource, annots, } = {}) {
653
672
  // Events
@@ -659,12 +678,12 @@ export class ODataModelOptions {
659
678
  // Resource
660
679
  if (self._parent === null && resource === undefined)
661
680
  resource = this.modelResourceFactory();
662
- if (resource !== undefined) {
681
+ if (resource) {
663
682
  this.attach(self, resource);
664
683
  }
665
684
  // Annotations
666
685
  self._annotations =
667
- annots || new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
686
+ annots ?? new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
668
687
  // Fields
669
688
  this.fields({
670
689
  include_navigation: true,
@@ -685,11 +704,11 @@ export class ODataModelOptions {
685
704
  resolveKey(value, { field_mapping = false, resolve = true, single = true, } = {}) {
686
705
  const keyTypes = this.schema.keys({ include_parents: true });
687
706
  const key = new Map();
688
- for (let kt of keyTypes) {
707
+ for (const kt of keyTypes) {
689
708
  let v = value;
690
709
  let options = this;
691
710
  let field;
692
- for (let name of kt.name.split('/')) {
711
+ for (const name of kt.name.split('/')) {
693
712
  if (options === undefined)
694
713
  break;
695
714
  field = options
@@ -718,16 +737,16 @@ export class ODataModelOptions {
718
737
  }
719
738
  resolveReferential(value, attr, { field_mapping = false, resolve = true, single = false, } = {}) {
720
739
  const referential = new Map();
721
- for (let ref of attr.referentials) {
722
- let from = this.fields({
740
+ for (const ref of attr.referentials) {
741
+ const from = this.fields({
723
742
  include_navigation: false,
724
743
  include_parents: true,
725
744
  }).find((p) => p.field === ref.referencedProperty);
726
- let to = attr.options
745
+ const to = attr.options
727
746
  .fields({ include_navigation: false, include_parents: true })
728
747
  .find((field) => field.field === ref.property);
729
748
  if (from !== undefined && to !== undefined) {
730
- let name = field_mapping ? to.field : to.name;
749
+ const name = field_mapping ? to.field : to.name;
731
750
  referential.set(name, value && value[from.name]);
732
751
  }
733
752
  }
@@ -741,16 +760,16 @@ export class ODataModelOptions {
741
760
  }
742
761
  resolveReferenced(value, attr, { field_mapping = false, resolve = true, single = false, } = {}) {
743
762
  const referenced = new Map();
744
- for (let ref of attr.referentials) {
745
- let from = this.fields({
763
+ for (const ref of attr.referentials) {
764
+ const from = this.fields({
746
765
  include_navigation: false,
747
766
  include_parents: true,
748
767
  }).find((field) => field.field === ref.property);
749
- let to = attr.meta
768
+ const to = attr.meta
750
769
  .fields({ include_navigation: false, include_parents: true })
751
770
  .find((field) => field.field === ref.referencedProperty);
752
771
  if (from !== undefined && to !== undefined) {
753
- let name = field_mapping ? to.field : to.name;
772
+ const name = field_mapping ? to.field : to.name;
754
773
  referenced.set(name, value && value[from.name]);
755
774
  }
756
775
  }
@@ -767,8 +786,8 @@ export class ODataModelOptions {
767
786
  include_parents: true,
768
787
  include_navigation: navigation,
769
788
  }).reduce((acc, field) => {
770
- let value = self[field.name];
771
- let errs = field.validate(value, { method });
789
+ const value = self[field.name];
790
+ const errs = field.validate(value, { method });
772
791
  return errs !== undefined
773
792
  ? Object.assign(acc, { [field.name]: errs })
774
793
  : acc;
@@ -780,7 +799,7 @@ export class ODataModelOptions {
780
799
  include_navigation: false,
781
800
  include_parents: true,
782
801
  }).reduce((acc, field) => {
783
- let value = field.defaults();
802
+ const value = field.defaults();
784
803
  return value !== undefined
785
804
  ? Object.assign(acc, { [field.name]: value })
786
805
  : acc;
@@ -814,14 +833,17 @@ export class ODataModelOptions {
814
833
  }
815
834
  }
816
835
  asEntity(self, ctx) {
836
+ // Clone query from him or parent
837
+ let query = self._resource?.cloneQuery();
838
+ if (query === undefined &&
839
+ self._parent &&
840
+ self._parent[0] instanceof ODataCollection)
841
+ query = self._parent[0]._resource?.cloneQuery();
817
842
  // Build new resource
818
- const query = self._resource?.cloneQuery();
819
- let resource = this.modelResourceFactory(query);
820
- if (resource === undefined)
821
- throw new Error('Model does not have associated Entity endpoint');
843
+ const resource = this.modelResourceFactory(query);
822
844
  return this.withResource(self, resource, ctx);
823
845
  }
824
- toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
846
+ toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_id = false, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
825
847
  let entity = [...self._attributes.values()]
826
848
  .filter(
827
849
  // Chain
@@ -850,6 +872,7 @@ export class ODataModelOptions {
850
872
  field_mapping,
851
873
  changes_only: changes_only && !!navigation,
852
874
  include_key: include_key && !!navigation,
875
+ include_id: include_id && !!navigation,
853
876
  chain: [self, ...chain],
854
877
  });
855
878
  }
@@ -863,6 +886,7 @@ export class ODataModelOptions {
863
886
  field_mapping,
864
887
  changes_only: changes_only && !!navigation,
865
888
  include_key: include_key && !!navigation,
889
+ include_id: include_id && !!navigation,
866
890
  chain: [self, ...chain],
867
891
  });
868
892
  }
@@ -899,6 +923,14 @@ export class ODataModelOptions {
899
923
  ...this.resolveKey(self, { field_mapping, resolve: false }),
900
924
  };
901
925
  }
926
+ // Add id
927
+ if (include_id) {
928
+ self.asEntity((e) => {
929
+ const resource = e.resource();
930
+ if (resource)
931
+ entity[this.api.options.helper.ODATA_ID] = `${resource.clearQuery()}`;
932
+ });
933
+ }
902
934
  // Add type
903
935
  if (self._parent !== null &&
904
936
  ((ODataModelOptions.isModel(self._parent[0]) &&
@@ -940,20 +972,29 @@ export class ODataModelOptions {
940
972
  self.events$.trigger(ODataModelEventType.Reset, { options: { changes } });
941
973
  }
942
974
  }
943
- assign(self, entity, { reset = false, reparent = false, silent = false, } = {}) {
944
- self._reset = reset;
945
- self._reparent = reparent;
946
- self._silent = silent;
975
+ assign(self, entity, { add = true, merge = true, remove = true, reset = false, reparent = false, silent = false, } = {}) {
976
+ self._assign = {
977
+ add,
978
+ merge,
979
+ remove,
980
+ reset,
981
+ reparent,
982
+ silent,
983
+ };
947
984
  const changes = [];
948
- // Apply entity
985
+ // The model
949
986
  const model = self;
950
- Object.entries(entity)
987
+ // Update annotations
988
+ model.annots().update(entity);
989
+ // Update attributes
990
+ const attrs = model.annots().attributes(entity, 'full');
991
+ Object.entries(attrs)
951
992
  .filter(([, value]) => value !== undefined) // Filter undefined
952
993
  .forEach(([key, value]) => {
953
994
  const field = this.fields({
954
995
  include_parents: true,
955
996
  include_navigation: true,
956
- }).find((field) => (self._reset && field.field === key) || field.name === key);
997
+ }).find((field) => (self._assign.reset && field.field === key) || field.name === key);
957
998
  if (field !== undefined) {
958
999
  // Delegated to private setter
959
1000
  if (this.set(self, field, value)) {
@@ -968,12 +1009,17 @@ export class ODataModelOptions {
968
1009
  changes.push(key);
969
1010
  }
970
1011
  });
971
- if ((!self._silent && changes.length > 0) || self._reset) {
972
- self.events$.trigger(self._reset ? ODataModelEventType.Reset : ODataModelEventType.Update, { options: { changes } });
1012
+ if (!self._assign.silent && changes.length > 0) {
1013
+ self.events$.trigger(self._assign.reset ? ODataModelEventType.Reset : ODataModelEventType.Update, { options: { changes } });
973
1014
  }
974
- self._reset = false;
975
- self._reparent = false;
976
- self._silent = false;
1015
+ self._assign = {
1016
+ add: false,
1017
+ merge: false,
1018
+ remove: false,
1019
+ reset: false,
1020
+ reparent: false,
1021
+ silent: false
1022
+ };
977
1023
  }
978
1024
  static isModel(obj) {
979
1025
  return Types.rawType(obj) === 'Model';
@@ -981,24 +1027,6 @@ export class ODataModelOptions {
981
1027
  static isCollection(obj) {
982
1028
  return Types.rawType(obj) === 'Collection';
983
1029
  }
984
- _updateCollection(self, field, collection, value) {
985
- collection._annotations = field.annotationsFactory(self.annots());
986
- collection.assign(value, {
987
- reset: self._reset,
988
- reparent: self._reparent,
989
- silent: self._silent,
990
- });
991
- return collection.hasChanged();
992
- }
993
- _updateModel(self, field, model, value) {
994
- model._annotations = field.annotationsFactory(self.annots());
995
- model.assign(value, {
996
- reset: self._reset,
997
- reparent: self._reparent,
998
- silent: self._silent,
999
- });
1000
- return model.hasChanged();
1001
- }
1002
1030
  get(self, field) {
1003
1031
  const attr = self._attributes.get(field instanceof ODataModelField ? field.name : field);
1004
1032
  if (attr !== undefined) {
@@ -1052,29 +1080,33 @@ export class ODataModelOptions {
1052
1080
  if (modelField.isStructuredType()) {
1053
1081
  if (value === null) {
1054
1082
  // New value is null
1055
- changed = attr.set(value, self._reset, self._reparent);
1083
+ changed = attr.set(value, self._assign.reset, self._assign.reparent);
1056
1084
  }
1057
1085
  else if (ODataModelOptions.isCollection(current)) {
1058
1086
  // Current is collection
1059
- let currentCollection = current;
1087
+ const currentCollection = current;
1060
1088
  if (ODataModelOptions.isCollection(value)) {
1061
1089
  // New value is collection
1062
- changed = attr.set(value, self._reset, self._reparent);
1090
+ changed = attr.set(value, self._assign.reset, self._assign.reparent);
1063
1091
  }
1064
1092
  else if (Types.isArray(value)) {
1065
1093
  // New value is array
1066
- changed = this._updateCollection(self, modelField, currentCollection, value);
1094
+ currentCollection._annotations = modelField.annotationsFactory(self.annots());
1095
+ currentCollection.assign(value, self._assign);
1096
+ changed = currentCollection.hasChanged();
1067
1097
  }
1068
1098
  }
1069
1099
  else if (ODataModelOptions.isModel(current)) {
1070
1100
  // Current is model
1071
- let currentModel = current;
1101
+ const currentModel = current;
1072
1102
  if (ODataModelOptions.isModel(value)) {
1073
1103
  // New value is model
1074
- changed = attr.set(value, self._reset, self._reparent);
1104
+ changed = attr.set(value, self._assign.reset, self._assign.reparent);
1075
1105
  }
1076
1106
  else if (Types.isPlainObject(value)) {
1077
- changed = this._updateModel(self, modelField, currentModel, value);
1107
+ currentModel._annotations = modelField.annotationsFactory(self.annots());
1108
+ currentModel.assign(value, self._assign);
1109
+ changed = currentModel.hasChanged();
1078
1110
  }
1079
1111
  }
1080
1112
  else {
@@ -1087,26 +1119,26 @@ export class ODataModelOptions {
1087
1119
  ? modelField.collectionFactory({
1088
1120
  parent: self,
1089
1121
  value: value,
1090
- reset: self._reset,
1122
+ reset: self._assign.reset,
1091
1123
  })
1092
1124
  : modelField.modelFactory({
1093
1125
  parent: self,
1094
1126
  value: value,
1095
- reset: self._reset,
1096
- }), self._reset, self._reparent);
1127
+ reset: self._assign.reset,
1128
+ }), self._assign.reset, self._assign.reparent);
1097
1129
  }
1098
1130
  // Resolve referentials
1099
1131
  if (!ODataModelOptions.isCollection(attr.get())) {
1100
- let ref = modelField.meta?.resolveReferential(attr.get(), attr);
1132
+ const ref = modelField.meta?.resolveReferential(attr.get(), attr);
1101
1133
  if (ref !== null && ref !== undefined) {
1102
1134
  Object.assign(self, ref);
1103
1135
  }
1104
1136
  }
1105
1137
  }
1106
1138
  else {
1107
- changed = attr.set(value, self._reset, self._reparent);
1139
+ changed = attr.set(value, self._assign.reset, self._assign.reparent);
1108
1140
  }
1109
- if (!self._silent && changed) {
1141
+ if (!self._assign.silent && changed) {
1110
1142
  self.events$.trigger(ODataModelEventType.Change, {
1111
1143
  attr,
1112
1144
  value,
@@ -1120,10 +1152,10 @@ export class ODataModelOptions {
1120
1152
  attr.events$.subscribe((event) => {
1121
1153
  if (event.canContinueWith(self)) {
1122
1154
  if (event.model === attr.get()) {
1123
- if (event.name === ODataModelEventType.Change &&
1155
+ if (event.type === ODataModelEventType.Change &&
1124
1156
  attr.navigation &&
1125
1157
  event.options?.key) {
1126
- let ref = attr.get().referential(attr);
1158
+ const ref = attr.get().referential(attr);
1127
1159
  if (ref !== null && ref !== undefined) {
1128
1160
  Object.assign(self, ref);
1129
1161
  }
@@ -1134,4 +1166,4 @@ export class ODataModelOptions {
1134
1166
  });
1135
1167
  }
1136
1168
  }
1137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUNMLGNBQWMsRUFDZCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixjQUFjLEdBQ2YsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBR0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsK0JBQStCLEVBQy9CLHFCQUFxQixHQUt0QixNQUFNLGNBQWMsQ0FBQztBQU10QixPQUFPLEVBQUUsT0FBTyxFQUF5QixNQUFNLFVBQVUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE1BQU0sQ0FBTixJQUFZLG1CQVdYO0FBWEQsV0FBWSxtQkFBbUI7SUFDN0Isd0NBQWlCLENBQUE7SUFDakIsc0NBQWUsQ0FBQTtJQUNmLHdDQUFpQixDQUFBO0lBQ2pCLDBDQUFtQixDQUFBO0lBQ25CLGtDQUFXLENBQUE7SUFDWCx3Q0FBaUIsQ0FBQTtJQUNqQiwwQ0FBbUIsQ0FBQTtJQUNuQiwwQ0FBbUIsQ0FBQTtJQUNuQixvQ0FBYSxDQUFBO0lBQ2Isd0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVhXLG1CQUFtQixLQUFuQixtQkFBbUIsUUFXOUI7QUFFRCxNQUFNLE9BQU8sZUFBZTtJQU0xQixZQUNFLElBQWtDLEVBQ2xDLEVBQ0UsS0FBSyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLElBQUksRUFDSixPQUFPLEVBQ1AsTUFBTSxFQUNOLEtBQUssTUFhSCxFQUFFO1FBRU4sSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUk7WUFDcEI7Z0JBQ0UsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBRVc7Z0JBQ3pDLElBQUksSUFBSSxJQUFJO2FBQ2I7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFPRCxJQUFJLENBQ0YsS0FBOEQsRUFDOUQsSUFBdUM7UUFFdkMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3BDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsZUFBZTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBOEQ7UUFDcEUsT0FBTyxDQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUF1RDtRQUNyRSxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3ZCLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFDdEIsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHO1lBQ2IsQ0FBQyxDQUFDLElBQUksWUFBWSxtQkFBbUI7Z0JBQ3JDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztvQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ1gsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDbkIsQ0FBQyxDQUFDLEVBQUUsQ0FDUDthQUNBLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUM7SUFJRCw0Q0FBNEM7SUFDNUMsSUFBSSxZQUFZO1FBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLENBQUMsQ0FBcUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZFLENBQUM7SUFJRCxpREFBaUQ7SUFDakQsSUFBSSxpQkFBaUI7UUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sSUFBSSxLQUFLLFNBQVM7WUFDdkIsQ0FBQyxDQUFFLElBQUksQ0FBQyxDQUFDLENBQTJDO1lBQ3BELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHNCQUEwQixTQUFRLFlBRTlDO0lBSUMsWUFBWSxFQUNWLEtBQUssRUFDTCxVQUFVLE1BSVIsRUFBRTtRQUNKLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7TUFNRTtJQUVGLE9BQU8sQ0FDTCxJQUFrQyxFQUNsQyxFQUNFLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLElBQUksRUFDSixPQUFPLEVBQ1AsTUFBTSxNQVFKLEVBQUU7UUFFTixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQ2hDLElBQUksQ0FBQyxJQUFJLENBQ1AsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFO1lBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixVQUFVLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQ3pDLFFBQVE7WUFDUixLQUFLO1lBQ0wsSUFBSTtZQUNKLE9BQU87WUFDUCxNQUFNO1NBQ1AsQ0FBQyxDQUNILENBQUM7UUFDSixJQUFJLElBQUksSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDM0MsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hCO1NBQ0Y7YUFBTTtZQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQjtJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixtQkFBbUIsRUFBRSxJQUFJO0lBQ3pCLGdCQUFnQixFQUFFLElBQUk7SUFDdEIsV0FBVyxFQUFFLElBQUk7Q0FDbEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsR0FBRyxlQUFlO0NBQ25CLENBQUM7QUFFRixNQUFNLENBQU4sSUFBWSxlQUlYO0FBSkQsV0FBWSxlQUFlO0lBQ3pCLHVEQUFLLENBQUE7SUFDTCwyREFBTyxDQUFBO0lBQ1AsK0RBQVMsQ0FBQTtBQUNYLENBQUMsRUFKVyxlQUFlLEtBQWYsZUFBZSxRQUkxQjtBQW9CRCxNQUFNLFVBQVUsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLGNBQWMsS0FBdUIsRUFBRTtJQUNuRSxPQUFPLENBQXlDLFdBQWMsRUFBRSxFQUFFO1FBQ2hFLE1BQU0sS0FBSyxHQUFRLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDbEMsS0FBSyxDQUFDLE9BQU8sR0FBRztnQkFDZCxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQTZCO2FBQzdCLENBQUM7UUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLEVBQ3pCLElBQUksRUFDSixHQUFHLE9BQU8sS0FDK0IsRUFBRTtJQUMzQyxPQUFPLENBQUMsTUFBVyxFQUFFLEdBQVcsRUFBUSxFQUFFO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQ2xDLEtBQUssQ0FBQyxPQUFPLEdBQUc7Z0JBQ2QsTUFBTSxFQUFFLElBQUksR0FBRyxFQUE2QjthQUM3QixDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUM1QixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFRRCxNQUFNLE9BQU8sZUFBZTtJQWdCMUIsWUFDRSxPQUErQixFQUMvQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUE2QjtRQUUzRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELGNBQWMsQ0FBSSxJQUFxQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFJLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxTQUFTLENBQUMsRUFDUixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLE9BQU8sR0FLUjtRQUNDLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUM3QixJQUFJLFdBQVc7WUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUztZQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNsQyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDakIsQ0FBQztRQUNGLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsY0FBYztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUUsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxRQUFRO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxRQUFRLENBQ04sS0FBVSxFQUNWLEVBQ0UsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLE1BSWhCLEVBQUU7UUFFTixJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDM0U7YUFBTSxJQUFJLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNoRCxPQUFPLEtBQUs7aUJBQ1QsTUFBTSxFQUFFO2lCQUNSLElBQUksQ0FBQyxDQUFDLENBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDZjthQUFNO1lBQ0wsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBVSxRQUFRLENBQUMsQ0FBQztZQUN4RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEUsSUFDRSxJQUFJLENBQUMsUUFBUTtnQkFDYixDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxJQUFJLHNDQUFzQztnQkFDMUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsdUNBQXVDO2NBQzFFO2dCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQ0UsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTO2dCQUM1QixPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUN6QixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQzdCO2dCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM3QjtZQUNELElBQ0UsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTO2dCQUM1QixPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUN6QixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQzdCO2dCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM3QjtZQUNELElBQ0UsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTO2dCQUN0QixPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUN6QixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFDaEI7Z0JBQ0EsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZCO1lBQ0QsSUFDRSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVM7Z0JBQ3RCLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUNoQjtnQkFDQSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkI7WUFDRCxJQUNFLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUztnQkFDMUIsT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFDekIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDekI7Z0JBQ0EsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzNCO1lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUN2RCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFVLEVBQUUsT0FBdUI7UUFDN0MsTUFBTSxhQUFhLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFRLEVBQUUsT0FBdUI7UUFDekMsTUFBTSxhQUFhLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFRLEVBQUUsT0FBdUI7UUFDdEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGVBQWUsQ0FDYixJQUFzQjtRQUV0QixJQUNFLENBQUMsQ0FDQyxJQUFJLFlBQVksbUJBQW1CO1lBQ25DLElBQUksWUFBWSwrQkFBK0I7WUFDL0MsSUFBSSxZQUFZLHFCQUFxQixDQUN0QztZQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RSxPQUFPLElBQUksQ0FBQyxVQUFVO1lBQ3BCLENBQUMsQ0FBRSxJQUErQixDQUFDLGtCQUFrQixDQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFFLENBQUMsQ0FBRSxJQUErQixDQUFDLFFBQVEsQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxrQkFBa0IsQ0FDaEIsSUFBK0I7UUFFL0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFlLEVBQUUsWUFBWSxDQUFDO1lBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxhQUFhLENBQ1gsSUFBNEI7UUFFNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELFlBQVksQ0FBSSxFQUNkLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxHQUtOO1FBQ0MsUUFBUTtRQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDcEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUNhLENBQUM7UUFDL0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsTUFBTSxLQUFLLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsSUFBSSxNQUFNLEVBQUUsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUNyRCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDN0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBYyxDQUFDLENBQ2xDLEVBQUUsTUFBTSxDQUFDO1lBQ1YsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFDcEQsd0JBQXdCO2dCQUN4QixLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUN4QjtRQUVELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUF5QyxFQUFFO1lBQ3RFLE1BQU07WUFDTixLQUFLO1lBQ0wsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCLENBQUksRUFDbkIsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEdBS047UUFDQyxxQkFBcUI7UUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNwQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQ2UsQ0FBQztRQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxVQUFVLEtBQUssU0FBUztZQUMxQixNQUFNLEtBQUssQ0FBQywwQkFBMEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLFVBQVUsQ0FDbkIsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUE2QyxFQUN6RDtZQUNFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSztZQUNMLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7U0FDdkIsQ0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLG1CQUFtQjtJQU05QixZQUNVLE1BQXVCLEVBQ3ZCLE1BQTBCO1FBRDFCLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBSnBDLFlBQU8sR0FBRyxJQUFJLHNCQUFzQixFQUFLLENBQUM7SUFLdkMsQ0FBQztJQUVKLElBQUksVUFBVTtRQUNaLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQVUsUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELEdBQUc7UUFNRCxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzlELENBQUM7SUFFRCxHQUFHLENBQ0QsS0FLYSxFQUNiLFFBQWlCLEtBQUssRUFDdEIsV0FBb0IsS0FBSztRQUV6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFM0IsSUFDRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ2xDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7WUFFdkMsSUFBSSxDQUFDLE1BQU0sQ0FDVCxPQUE0RCxDQUU3RCxDQUFDO1FBRUosTUFBTSxPQUFPLEdBQ1gsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUUsT0FBeUIsQ0FBQyxNQUFNLENBQUMsS0FBc0IsQ0FBQztZQUM1RCxDQUFDLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztnQkFDdkMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLENBQUUsT0FBNkMsQ0FBQyxNQUFNLENBQ3BELEtBQTBDLENBQzNDO2dCQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7U0FDekI7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztTQUN6QjthQUFNLElBQUksT0FBTyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBQ0QsSUFDRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2hDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFDckM7WUFDQSxJQUFJLENBQUMsSUFBSSxDQUNQLEtBQTBELEVBQzFELFFBQVEsQ0FDVCxDQUFDO1NBQ0g7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQ1Isa0JBQWtCLEdBQUcsS0FBSyxNQUNVLEVBQUU7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE9BQU8sQ0FDTCxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDekIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFdEMsT0FDRCxDQUFDLFVBQVUsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUs7UUFDSCxJQUNFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3RDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBRTNDLElBQUksQ0FBQyxNQUFNLENBQ1QsSUFBSSxDQUFDLE1BQTJELENBQ2pFLENBQUM7UUFDSixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUNFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBRTFDLElBQUksQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLEtBQTBELENBQ2hFLENBQUM7SUFDTixDQUFDO0lBRU8sSUFBSSxDQUNWLEtBQXdELEVBQ3hELFdBQW9CLEtBQUs7UUFFekIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLFFBQVEsRUFBRTtZQUNaLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFTyxNQUFNLENBQ1osS0FBd0QsRUFDeEQsV0FBb0IsS0FBSztRQUV6QixJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzlCLElBQUksUUFBUSxFQUFFO1lBQ1osS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDdEI7SUFDSCxDQUFDO0NBQ0Y7QUFTRCxNQUFNLE9BQU8saUJBQWlCO0lBWTVCLFlBQVksRUFDVixPQUFPLEVBQ1AsTUFBTSxHQUlQO1FBZE8sWUFBTyxHQUEyQixFQUFFLENBQUM7UUFLN0MsYUFBUSxHQUE2QixFQUFFLENBQUM7UUFDeEMsWUFBTyxHQUFHLElBQUksc0JBQXNCLEVBQUssQ0FBQztRQW1KMUMsWUFBTyxHQUE0QjtZQUNqQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3JCLE1BQU0sRUFBRSxPQUFPLENBQUMsS0FBSztZQUNyQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87U0FDekIsQ0FBQztRQS9JQSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUM7UUFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFNLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxLQUEwQixFQUFFO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBbUM7UUFDNUMsa0JBQWtCO1FBQ2xCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBaUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0Msb0JBQW9CO1FBQ3BCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBaUMsQ0FBQyxDQUFDO1FBQzFELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdEIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGdCQUFnQixDQUNkLFNBQXVEO1FBRXZELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2pDLElBQUksS0FBeUMsQ0FBQztRQUM5QyxLQUFLLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDNUIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2QyxJQUFJLEtBQUssS0FBSyxTQUFTO2dCQUFFLE1BQU07U0FDaEM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxTQUFTLENBQUMsRUFDUixPQUFPLEVBQ1AsYUFBYSxFQUNiLGtCQUFrQixHQUtuQjtRQUNDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQTJCLENBQUM7WUFDdkUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdEI7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxpQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxpQkFBaUI7Z0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQVcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDekU7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzdCLElBQUksV0FBVyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDaEUsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDZCxrQkFBa0I7Z0JBQ2xCLFdBQVc7Z0JBQ1gsT0FBTzthQUNSLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEdBSWhCO1FBQ0MsT0FBTztZQUNMLEdBQUcsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTO2dCQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsQ0FBQztnQkFDN0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3BCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQ25EO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUksSUFBc0I7UUFDN0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBSSxJQUFJLENBQUMsQ0FBQztRQUNwQywwQkFBMEI7UUFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUztZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sS0FBMkIsQ0FBQztJQUNyQyxDQUFDO0lBRUQsU0FBUyxDQUFJLElBQXNCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNqQixlQUFlLEVBQUUsSUFBSTtZQUNyQixrQkFBa0IsRUFBRSxJQUFJO1NBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQ0wsQ0FBQyxVQUE4QixFQUFFLEVBQUUsQ0FDakMsVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQ3RCLENBQUM7SUFDdEMsQ0FBQztJQUVELFFBQVEsQ0FBSSxJQUFZLEVBQUUsT0FBMEI7UUFDbEQsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDM0MsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUMxRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUksS0FBZ0IsQ0FBQyxDQUFDO1FBQ3JFLElBQUksV0FBVyxLQUFLLFNBQVM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBSSxJQUFJLEVBQUU7WUFDOUMsSUFBSTtZQUNKLEtBQUs7WUFDTCxNQUFNLEVBQUUsV0FBVztZQUNuQixHQUFHLElBQUk7U0FDUixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBUU8saUJBQWlCLENBQ3ZCLElBQW1CLEVBQ25CLElBQVksRUFDWixJQUFzQjtRQUV0QixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFJLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUscUJBQXFCLENBQUMsU0FBUyxDQUFDO1lBQzlCLGtCQUFrQixFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztZQUN2RSxhQUFhLEVBQUUsQ0FBQyxJQUFzQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDdkUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTztTQUMxQixDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFJLElBQUksRUFBRTtZQUN4QyxLQUFLLEVBQUUsSUFBSTtZQUNYLE1BQU0sRUFBRSxxQkFBcUI7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLFNBQVMsQ0FBQztZQUNuQixrQkFBa0IsRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDdkUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTztZQUN6QixXQUFXLEVBQUUsS0FBSztTQUNuQixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQzNDLFlBQVksRUFBRSxJQUFJO1lBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFrQyxDQUFDO1lBQzdELEdBQUcsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQWtDLEVBQUUsS0FBSyxDQUFDO1NBQzVELENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxNQUFNLENBQ0osSUFBbUIsRUFDbkIsUUFJNkI7UUFFN0IsSUFDRSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUk7WUFDdkIsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ3pDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBRXJDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0JBQWdCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzlELENBQUM7UUFFSixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQy9CLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFO2dCQUMvQyxRQUFRLEVBQUUsT0FBTztnQkFDakIsS0FBSyxFQUFFLFFBQVE7YUFDaEIsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLE1BQU0sQ0FBQyxLQUFLLENBQ1YsS0FBOEQ7UUFLOUQsTUFBTSxLQUFLLEdBQUcsRUFBVyxDQUFDO1FBQzFCLElBQUksS0FBSyxHQUtFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxLQUFLLElBQUksRUFBRTtZQUNyQixNQUFNLE1BQU0sR0FBRyxLQUdkLENBQUM7WUFDRixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsTUFBTTtZQUNqRCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7U0FDMUI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUNiLEtBQXdEO1FBRXhELElBQUksUUFBUSxHQUE4QixJQUFJLENBQUM7UUFDL0MsSUFBSSxTQUFTLEdBQWdDLElBQUksQ0FBQztRQUNsRCxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pELFFBQVEsR0FBRyxRQUFRLElBQUssS0FBSyxDQUFDLFNBQThCLENBQUM7WUFDN0QsSUFBSSxRQUFRLEtBQUssSUFBSTtnQkFBRSxNQUFNO1lBQzdCLElBQ0UsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDaEMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFDNUM7Z0JBQ0EsY0FBYztnQkFDZCxJQUFJLFFBQVEsR0FBSSxLQUF5QixDQUFDLEdBQUcsQ0FBQztvQkFDNUMsYUFBYSxFQUFFLElBQUk7aUJBQ3BCLENBQW1CLENBQUM7Z0JBQ3JCLElBQUksUUFBUSxLQUFLLFNBQVM7b0JBQ3hCLFFBQVE7d0JBQ04sUUFBUSxZQUFZLHNCQUFzQjs0QkFDeEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDOzRCQUMzQixDQUFDLENBQUUsUUFBbUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDNUQ7WUFDRCxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtnQkFDbEIsNkNBQTZDO2dCQUM3QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ2xFLElBQUksS0FBSyxLQUFLLFNBQVM7b0JBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxTQUFTO2FBQ1Y7WUFDRCxRQUFRLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBVyxRQUFRLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksUUFBUSxLQUFLLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCx5QkFBeUIsQ0FDdkIsS0FBNEI7UUFNNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNuRCxPQUFPLHNCQUFzQixDQUFDLE9BQU8sQ0FBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2pELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7WUFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUs7U0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CLENBQ2xCLEtBQTRCO1FBTzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLFFBQVEsWUFBWSxzQkFBc0I7WUFBRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6RSxPQUFPLFFBS00sQ0FBQztJQUNoQixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQW1CO1FBQ2hDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FDdEMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDbEUsQ0FBQztRQUNGLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFpQixDQUFDO1FBQzlELElBQUksR0FBRyxLQUFLLFNBQVM7WUFBRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsT0FBTyxRQUE0QixDQUFDO0lBQ3RDLENBQUM7SUFDRCxZQUFZO0lBRVosSUFBSSxDQUNGLElBQW1CLEVBQ25CLEVBQ0UsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLE1BUUosRUFBRTtRQUVOLFNBQVM7UUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRCxTQUFTO1FBQ1QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQ3ZCO1FBRUQsV0FBVztRQUNYLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDakQsUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUNULElBQUksRUFDSixRQUk2QixDQUM5QixDQUFDO1NBQ0g7UUFFRCxjQUFjO1FBQ2QsSUFBSSxDQUFDLFlBQVk7WUFDZixNQUFNLElBQUksSUFBSSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUVyRSxTQUFTO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNWLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RDLFlBQVksRUFBRSxJQUFJO2dCQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBNkIsQ0FBQztnQkFDeEQsR0FBRyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBNkIsRUFBRSxLQUFLLENBQUM7YUFDdkQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUNILElBQW1CLEVBQ25CLFFBSTZCLEVBQzdCLElBQTBFO1FBRTFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUNSLEtBQWtELEVBQ2xELEVBQ0UsYUFBYSxHQUFHLEtBQUssRUFDckIsT0FBTyxHQUFHLElBQUksRUFDZCxNQUFNLEdBQUcsSUFBSSxNQUN1RCxFQUFFO1FBRXhFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUNuQyxLQUFLLElBQUksRUFBRSxJQUFJLFFBQVEsRUFBRTtZQUN2QixJQUFJLENBQUMsR0FBRyxLQUFZLENBQUM7WUFDckIsSUFBSSxPQUFPLEdBQUcsSUFBOEIsQ0FBQztZQUM3QyxJQUFJLEtBQXVDLENBQUM7WUFDNUMsS0FBSyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbkMsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFBRSxNQUFNO2dCQUNqQyxLQUFLLEdBQUcsT0FBTztxQkFDWixNQUFNLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO3FCQUM1RCxJQUFJLENBQUMsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQ3ZCLENBQUM7d0JBQ0MsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzRCQUNwRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7NEJBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDUixPQUFPLEdBQUcsS0FBSyxDQUFDLElBQThCLENBQUM7aUJBQ2hEO2FBQ0Y7WUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQzFDLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNwRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUM1QyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNsQjtRQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDckMsT0FBTyxPQUFPO1lBQ1osQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGtCQUFrQixDQUNoQixLQUF5RCxFQUN6RCxJQUFxRCxFQUNyRCxFQUNFLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLE9BQU8sR0FBRyxJQUFJLEVBQ2QsTUFBTSxHQUFHLEtBQUssTUFDc0QsRUFBRTtRQUV4RSxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBQzNDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNyQixrQkFBa0IsRUFBRSxLQUFLO2dCQUN6QixlQUFlLEVBQUUsSUFBSTthQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3hELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPO2lCQUNsQixNQUFNLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUM1RCxJQUFJLENBQUMsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRTtnQkFDMUMsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUM5QyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUssS0FBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQ3hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsT0FBTyxPQUFPO1lBQ1osQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGlCQUFpQixDQUNmLEtBQXlELEVBQ3pELElBQXFELEVBQ3JELEVBQ0UsYUFBYSxHQUFHLEtBQUssRUFDckIsT0FBTyxHQUFHLElBQUksRUFDZCxNQUFNLEdBQUcsS0FBSyxNQUNzRCxFQUFFO1FBRXhFLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFDMUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3JCLGtCQUFrQixFQUFFLEtBQUs7Z0JBQ3pCLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RSxJQUFJLEVBQUUsR0FBSSxJQUFJLENBQUMsSUFBK0I7aUJBQzNDLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzVELElBQUksQ0FDSCxDQUFDLEtBQTJCLEVBQUUsRUFBRSxDQUM5QixLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxrQkFBa0IsQ0FDekMsQ0FBQztZQUNKLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO2dCQUMxQyxJQUFJLElBQUksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0JBQzlDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSyxLQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDMUQ7U0FDRjtRQUNELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDdEUsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLE9BQU87WUFDWixDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM1QyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUSxDQUNOLElBQW1CLEVBQ25CLEVBQ0UsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLE1BSWhCLEVBQUU7UUFFTixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3pCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLGtCQUFrQixFQUFFLFVBQVU7U0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2QixJQUFJLEtBQUssR0FBSSxJQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM3QyxPQUFPLElBQUksS0FBSyxTQUFTO2dCQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNWLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdkIsa0JBQWtCLEVBQUUsS0FBSztZQUN6QixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLEtBQUssS0FBSyxTQUFTO2dCQUN4QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNWLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsVUFBVSxDQUNSLElBQW1CLEVBQ25CLEVBQUUsa0JBQWtCLEdBQUcsS0FBSyxLQUF1QyxFQUFFO1FBRXJFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDbEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksa0JBQWtCLENBQUM7YUFDeEQsSUFBSSxDQUNILENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxDQUFDLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUN6QyxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQzdDLENBQUM7SUFFRCxZQUFZLENBQ1YsSUFBTyxFQUNQLFFBSTZCLEVBQzdCLEdBQW9CO1FBRXBCLE9BQU87UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLG1CQUFtQjtRQUNuQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxNQUFNLFlBQVksVUFBVSxFQUFFO1lBQ2hDLE9BQVEsTUFBYyxDQUFDLElBQUksQ0FDekIsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDWixNQUFNO2dCQUNOLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLE1BQU07WUFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7U0FDZjtJQUNILENBQUM7SUFDRCxRQUFRLENBQTZCLElBQU8sRUFBRSxHQUFvQjtRQUNoRSxxQkFBcUI7UUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUssQ0FBQztRQUM5QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxRQUFRLEtBQUssU0FBUztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFFBQVEsQ0FDTixJQUFtQixFQUNuQixFQUNFLFNBQVMsR0FBRyxLQUFLLEVBQ2pCLGtCQUFrQixHQUFHLEtBQUssRUFDMUIsbUJBQW1CLEdBQUcsS0FBSyxFQUMzQixnQkFBZ0IsR0FBRyxLQUFLLEVBQ3hCLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLGlCQUFpQixHQUFHLEtBQUssRUFDekIsWUFBWSxHQUFHLEtBQUssRUFDcEIsYUFBYSxHQUFHLEtBQUssRUFDckIsS0FBSyxHQUFHLEVBQUUsTUFXUixFQUFFO1FBRU4sSUFBSSxNQUFNLEdBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDN0MsTUFBTTtRQUNMLFFBQVE7UUFDUixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUMvQzthQUNBLE1BQU07UUFDTCxlQUFlO1FBQ2YsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLENBQUMsWUFBWTtZQUNiLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FDM0Q7YUFDQSxNQUFNLENBQ0wsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNQLGFBQWE7UUFDYixDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQztZQUM5RCxDQUFDLElBQUksQ0FBQyxVQUFVLENBQ25CO2FBQ0EsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN4RCxJQUFJLEtBQUssR0FBUSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDckMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BDLEtBQUssR0FBSSxLQUF5QixDQUFDLFFBQVEsQ0FBQztvQkFDMUMsU0FBUztvQkFDVCxrQkFBa0I7b0JBQ2xCLG1CQUFtQjtvQkFDbkIsZ0JBQWdCO29CQUNoQixpQkFBaUI7b0JBQ2pCLGFBQWE7b0JBQ2IsWUFBWSxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsVUFBVTtvQkFDMUMsV0FBVyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsVUFBVTtvQkFDeEMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO2lCQUN4QixDQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEQsS0FBSyxHQUFJLEtBQStDLENBQUMsVUFBVSxDQUFDO29CQUNsRSxTQUFTO29CQUNULGtCQUFrQjtvQkFDbEIsbUJBQW1CO29CQUNuQixnQkFBZ0I7b0JBQ2hCLGlCQUFpQjtvQkFDakIsYUFBYTtvQkFDYixZQUFZLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxVQUFVO29CQUMxQyxXQUFXLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxVQUFVO29CQUN4QyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7aUJBQ3hCLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxtQkFBbUIsSUFBSSxXQUFXLEVBQUU7Z0JBQ3RDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDOUM7aUJBQU0sSUFBSSxnQkFBZ0IsSUFBSSxRQUFRLEVBQUU7Z0JBQ3ZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDOUM7aUJBQU0sSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUMzQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQzlDO2lCQUFNLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDOUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVULElBQUksaUJBQWlCLEVBQUU7WUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxpREFBaUQ7WUFDakQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7aUJBQ3ZDLE1BQU0sQ0FDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNOLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FDcEU7aUJBQ0EsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvRCxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO1NBQzFDO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksU0FBUyxFQUFFO1lBQ1AsTUFBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBUyxJQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsVUFBVTtRQUNWLElBQUksV0FBVyxFQUFFO1lBQ2YsTUFBTSxHQUFHO2dCQUNQLEdBQUcsTUFBTTtnQkFDVCxHQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBUTthQUNwRSxDQUFDO1NBQ0g7UUFFRCxXQUFXO1FBQ1gsSUFDRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7WUFDckIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBMEIsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDOUQsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQTJDLENBQUMsTUFBTTt5QkFDOUQsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM1QjtZQUNBLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDdkU7UUFFRCxPQUFPLE1BQXFDLENBQUM7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FDSCxJQUFtQixFQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxLQUEwQyxFQUFFO1FBRWxFLElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsY0FBYztZQUNkLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLElBQ0UsU0FBUyxLQUFLLFNBQVM7Z0JBQ3ZCLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUNqRDtnQkFDQSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xCO2lCQUFNLElBQUksU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFO2dCQUNqQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xCO1NBQ0Y7YUFBTTtZQUNMLFlBQVk7WUFDWixPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2Qyx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNuQjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMzRTtJQUNILENBQUM7SUFFRCxNQUFNLENBQ0osSUFBbUIsRUFDbkIsTUFBNEMsRUFDNUMsRUFDRSxLQUFLLEdBQUcsS0FBSyxFQUNiLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLE1BQU0sR0FBRyxLQUFLLE1BS1osRUFBRTtRQUVOLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXRCLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUU3QixlQUFlO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBVyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLG1CQUFtQjthQUM5RCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3hCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixrQkFBa0IsRUFBRSxJQUFJO2FBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQ0wsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FDOUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQzdELENBQUM7WUFFRixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0JBQ3ZCLDhCQUE4QjtnQkFDOUIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMxQjthQUNGO2lCQUFNO2dCQUNMLG1CQUFtQjtnQkFDbkIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNuQixJQUFJLE9BQU8sS0FBSyxLQUFLO29CQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDMUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFDcEUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUN6QixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFRO1FBQ3JCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxPQUFPLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBUTtRQUMxQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssWUFBWSxDQUFDO0lBQzdDLENBQUM7SUFFTyxpQkFBaUIsQ0FDdkIsSUFBbUIsRUFDbkIsS0FBeUIsRUFDekIsVUFBNkMsRUFDN0MsS0FBK0M7UUFFL0MsVUFBVSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQ2hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDaUIsQ0FBQztRQUNqQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQWlELEVBQUU7WUFDbkUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDckIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLFlBQVksQ0FDbEIsSUFBbUIsRUFDbkIsS0FBeUIsRUFDekIsS0FBb0IsRUFDcEIsS0FBa0M7UUFFbEMsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDZSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBb0MsRUFBRTtZQUNqRCxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbEIsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztTQUNyQixDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsR0FBRyxDQUNELElBQW1CLEVBQ25CLEtBQWtDO1FBRWxDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUMvQixLQUFLLFlBQVksZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ3RELENBQUM7UUFDRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQ0UsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7Z0JBQ25DLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFDaEM7Z0JBQ0Esc0JBQXNCO2dCQUN0QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO29CQUNwRSxLQUF1QixDQUFDLE1BQU0sQ0FBQyxVQUF3QixFQUFFO3dCQUN4RCxNQUFNLEVBQUUsSUFBSTtxQkFDYixDQUFDLENBQUM7aUJBQ0o7cUJBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7b0JBQ2hELG9CQUFvQjtvQkFDbkIsSUFBK0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVDO3FCQUFNLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO29CQUNoRCx5QkFBeUI7b0JBQ3hCLElBQStCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNqRDthQUNGO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNLElBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQ3RCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFDcEI7WUFDQSxPQUFRLElBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxHQUFHLENBQ0QsSUFBbUIsRUFDbkIsS0FBa0MsRUFDbEMsS0FPUSxFQUNSLEVBQUUsSUFBSSxLQUF3QixFQUFFO1FBRWhDLElBQUksVUFBVSxHQUNaLEtBQUssWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBSSxLQUFLLENBQUMsQ0FBQztRQUN0RSxJQUNFLFVBQVUsS0FBSyxTQUFTO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsT0FBTyxLQUFLLEtBQUssUUFBUSxFQUN6QjtZQUNBLElBQUksR0FBRyxJQUFJLElBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssQ0FBYSxJQUFJLEVBQUUsQ0FBQztZQUM3RCxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFJLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDM0Q7UUFDRCxJQUFJLFVBQVUsS0FBSyxTQUFTO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEtBQWUsRUFBRSxDQUFDLENBQUM7UUFFM0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRCxvQ0FBb0M7UUFDcEMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RCLElBQUksR0FBRyxJQUFJLG1CQUFtQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTNCLElBQUksVUFBVSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDakMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNsQixvQkFBb0I7Z0JBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNoRTtpQkFBTSxJQUFJLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDbEQsd0JBQXdCO2dCQUN4QixJQUFJLGlCQUFpQixHQUFHLE9BQTRDLENBQUM7Z0JBQ3JFLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN6QywwQkFBMEI7b0JBQzFCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNoQixLQUEwQyxFQUMxQyxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztpQkFDSDtxQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQy9CLHFCQUFxQjtvQkFDckIsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDOUIsSUFBSSxFQUNKLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsS0FBd0MsQ0FDekMsQ0FBQztpQkFDSDthQUNGO2lCQUFNLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM3QyxtQkFBbUI7Z0JBQ25CLElBQUksWUFBWSxHQUFHLE9BQXdCLENBQUM7Z0JBQzVDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNwQyxxQkFBcUI7b0JBQ3JCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNoQixLQUFzQixFQUN0QixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztpQkFDSDtxQkFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUN6QixJQUFJLEVBQ0osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFvQyxDQUNyQyxDQUFDO2lCQUNIO2FBQ0Y7aUJBQU07Z0JBQ0wsK0JBQStCO2dCQUMvQiw4Q0FBOEM7Z0JBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNoQixpQkFBaUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO29CQUNuQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNoQyxDQUFDLENBQUUsS0FBMkQ7b0JBQzlELENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVTt3QkFDdkIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBSTs0QkFDOUIsTUFBTSxFQUFFLElBQUk7NEJBQ1osS0FBSyxFQUFFLEtBQXdDOzRCQUMvQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07eUJBQ25CLENBQUM7d0JBQ0osQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUk7NEJBQ3pCLE1BQU0sRUFBRSxJQUFJOzRCQUNaLEtBQUssRUFBRSxLQUFLOzRCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTt5QkFDbkIsQ0FBQyxFQUNOLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FDZixDQUFDO2FBQ0g7WUFFRCx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtnQkFDL0MsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hFLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO29CQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDMUI7YUFDRjtTQUNGO2FBQU07WUFDTCxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFO2dCQUMvQyxJQUFJO2dCQUNKLEtBQUs7Z0JBQ0wsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUU7YUFDckMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFJLElBQW1CLEVBQUUsSUFBNEI7UUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUEyQixFQUFFLEVBQUU7WUFDckQsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUM5QixJQUNFLEtBQUssQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsTUFBTTt3QkFDekMsSUFBSSxDQUFDLFVBQVU7d0JBQ2YsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQ2xCO3dCQUNBLElBQUksR0FBRyxHQUFJLElBQUksQ0FBQyxHQUFHLEVBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTs0QkFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7eUJBQzFCO3FCQUNGO2lCQUNGO2dCQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDM0M7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENJRF9GSUVMRF9OQU1FLFxuICBDT01QVVRFRCxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBPUFRJTUlTVElDX0NPTkNVUlJFTkNZLFxuICBFVkVOVF9TUExJVFRFUixcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlPcHRpb25zLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0eVNldCxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZSxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyLFxufSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgRWRtVHlwZSwgUGFyc2VyLCBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgT2JqZWN0cywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGVudW0gT0RhdGFNb2RlbEV2ZW50VHlwZSB7XG4gIENoYW5nZSA9ICdjaGFuZ2UnLFxuICBSZXNldCA9ICdyZXNldCcsXG4gIFVwZGF0ZSA9ICd1cGRhdGUnLFxuICBEZXN0cm95ID0gJ2Rlc3Ryb3knLFxuICBBZGQgPSAnYWRkJyxcbiAgUmVtb3ZlID0gJ3JlbW92ZScsXG4gIEludmFsaWQgPSAnaW52YWxpZCcsXG4gIFJlcXVlc3QgPSAncmVxdWVzdCcsXG4gIFN5bmMgPSAnc3luYycsXG4gIEF0dGFjaCA9ICdhdHRhY2gnLFxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbEV2ZW50PFQ+IHtcbiAgbmFtZTogT0RhdGFNb2RlbEV2ZW50VHlwZSB8IHN0cmluZztcbiAgdmFsdWU/OiBhbnk7XG4gIHByZXZpb3VzPzogYW55O1xuICBvcHRpb25zPzogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG5hbWU6IE9EYXRhTW9kZWxFdmVudFR5cGUgfCBzdHJpbmcsXG4gICAge1xuICAgICAgbW9kZWwsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcHJldmlvdXMsXG4gICAgICB2YWx1ZSxcbiAgICAgIGF0dHIsXG4gICAgICBvcHRpb25zLFxuICAgICAgYnViYmx5LFxuICAgICAgY2hhaW4sXG4gICAgfToge1xuICAgICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgICAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcbiAgICAgIGF0dHI/OiBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBudW1iZXI7XG4gICAgICBwcmV2aW91cz86IGFueTtcbiAgICAgIHZhbHVlPzogYW55O1xuICAgICAgb3B0aW9ucz86IGFueTtcbiAgICAgIGJ1YmJseT86IGJvb2xlYW47XG4gICAgICBjaGFpbj86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgbnVtYmVyIHwgbnVsbCxcbiAgICAgIF1bXTtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY2hhaW4gPSBjaGFpbiA/PyBbXG4gICAgICBbXG4gICAgICAgICh0aGlzLm1vZGVsIHx8IHRoaXMuY29sbGVjdGlvbikgYXNcbiAgICAgICAgICB8IE9EYXRhTW9kZWw8YW55PlxuICAgICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgYXR0ciB8fCBudWxsLFxuICAgICAgXSxcbiAgICBdO1xuICAgIHRoaXMuYnViYmx5ID0gYnViYmx5ID8/IHRydWU7XG4gIH1cblxuICBjaGFpbjogW1xuICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgbnVtYmVyIHwgbnVsbCxcbiAgXVtdO1xuXG4gIHB1c2goXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgbnVtYmVyLFxuICApIHtcbiAgICByZXR1cm4gbmV3IE9EYXRhTW9kZWxFdmVudCh0aGlzLm5hbWUsIHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgY29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLFxuICAgICAgcHJldmlvdXM6IHRoaXMucHJldmlvdXMsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIGJ1YmJseTogdGhpcy5idWJibHksXG4gICAgICBjaGFpbjogW1ttb2RlbCwgYXR0cl0sIC4uLnRoaXMuY2hhaW5dLFxuICAgIH0pO1xuICB9XG5cbiAgYnViYmx5OiBib29sZWFuO1xuICBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5idWJibHkgPSBmYWxzZTtcbiAgfVxuXG4gIHZpc2l0ZWQobW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jaGFpbi5zb21lKChjKSA9PiBjWzBdID09PSBtb2RlbCkgJiZcbiAgICAgIHRoaXMuY2hhaW5bdGhpcy5jaGFpbi5sZW5ndGggLSAxXVswXSAhPT0gbW9kZWxcbiAgICApO1xuICB9XG5cbiAgY2FuQ29udGludWVXaXRoKHNlbGY6IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pIHtcbiAgICByZXR1cm4gdGhpcy5idWJibHkgJiYgIXRoaXMudmlzaXRlZChzZWxmKTtcbiAgfVxuXG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmNoYWluXG4gICAgICAubWFwKChbLCBhdHRyXSwgaW5kZXgpID0+XG4gICAgICAgIHR5cGVvZiBhdHRyID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gYFske2F0dHJ9XWBcbiAgICAgICAgICA6IGF0dHIgaW5zdGFuY2VvZiBPRGF0YU1vZGVsQXR0cmlidXRlXG4gICAgICAgICAgPyBpbmRleCA9PT0gMFxuICAgICAgICAgICAgPyBhdHRyLm5hbWVcbiAgICAgICAgICAgIDogYC4ke2F0dHIubmFtZX1gXG4gICAgICAgICAgOiAnJyxcbiAgICAgIClcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxuXG4gIC8vUmVmZXJlbmNlIHRvIHRoZSBtb2RlbCB3aGljaCB0aGUgZXZlbnQgd2FzIGRpc3BhdGNoZWRcbiAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAvL0lkZW50aWZpZXMgdGhlIGN1cnJlbnQgbW9kZWwgZm9yIHRoZSBldmVudFxuICBnZXQgY3VycmVudE1vZGVsKCk6IE9EYXRhTW9kZWw8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGluayA9IHRoaXMuY2hhaW4uZmluZCgoYykgPT4gT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChjWzBdKSk7XG4gICAgcmV0dXJuIGxpbmsgIT09IHVuZGVmaW5lZCA/IChsaW5rWzBdIGFzIE9EYXRhTW9kZWw8YW55PikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvL1JlZmVyZW5jZSB0byB0aGUgY29sbGVjdGlvbiB3aGljaCB0aGUgZXZlbnQgd2FzIGRpc3BhdGNoZWRcbiAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcbiAgLy9JZGVudGlmaWVzIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gZm9yIHRoZSBldmVudFxuICBnZXQgY3VycmVudENvbGxlY3Rpb24oKTogT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGluayA9IHRoaXMuY2hhaW4uZmluZCgoYykgPT4gT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKGNbMF0pKTtcbiAgICByZXR1cm4gbGluayAhPT0gdW5kZWZpbmVkXG4gICAgICA/IChsaW5rWzBdIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxcbiAgT0RhdGFNb2RlbEV2ZW50PFQ+XG4+IHtcbiAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBtb2RlbCxcbiAgICBjb2xsZWN0aW9uLFxuICB9OiB7XG4gICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gIH1cblxuICAvKlxuICBvdmVycmlkZSBlbWl0KGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYnViYmx5ICYmICgodGhpcy5jb2xsZWN0aW9uIHx8IHRoaXMubW9kZWwpID09PSB1bmRlZmluZWQgfHwgIWV2ZW50LnZpc2l0ZWQoKHRoaXMuY29sbGVjdGlvbiB8fCB0aGlzLm1vZGVsKSEpKSkge1xuICAgICAgc3VwZXIuZW1pdChldmVudCk7XG4gICAgfSAgXG4gIH1cbiAgKi9cblxuICB0cmlnZ2VyKFxuICAgIHR5cGU6IE9EYXRhTW9kZWxFdmVudFR5cGUgfCBzdHJpbmcsXG4gICAge1xuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHByZXZpb3VzLFxuICAgICAgdmFsdWUsXG4gICAgICBhdHRyLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGJ1YmJseSxcbiAgICB9OiB7XG4gICAgICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICAgICAgYXR0cj86IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IG51bWJlcjtcbiAgICAgIHByZXZpb3VzPzogYW55O1xuICAgICAgdmFsdWU/OiBhbnk7XG4gICAgICBvcHRpb25zPzogYW55O1xuICAgICAgYnViYmx5PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IF90cmlnZ2VyID0gKG5hbWU6IHN0cmluZykgPT5cbiAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChuYW1lLCB7XG4gICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbiA/PyB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgYXR0cixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGJ1YmJseSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIGlmICh0eXBlICYmIEVWRU5UX1NQTElUVEVSLnRlc3QodHlwZSkpIHtcbiAgICAgIGZvciAobGV0IG5hbWUgb2YgdHlwZS5zcGxpdChFVkVOVF9TUExJVFRFUikpIHtcbiAgICAgICAgX3RyaWdnZXIobmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF90cmlnZ2VyKHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSU5DTFVERV9TSEFMTE9XID0ge1xuICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICBpbmNsdWRlX2tleTogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX0RFRVAgPSB7XG4gIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgaW5jbHVkZV9ub25fZmllbGQ6IHRydWUsXG4gIC4uLklOQ0xVREVfU0hBTExPVyxcbn07XG5cbmV4cG9ydCBlbnVtIE9EYXRhTW9kZWxTdGF0ZSB7XG4gIEFkZGVkLFxuICBSZW1vdmVkLFxuICBVbmNoYW5nZWQsXG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsT3B0aW9ucyA9IHtcbiAgY2lkPzogc3RyaW5nO1xuICBmaWVsZHM6IE1hcDxzdHJpbmcsIE1vZGVsRmllbGRPcHRpb25zPjtcbn07XG5cbmV4cG9ydCB0eXBlIE1vZGVsRmllbGRPcHRpb25zID0ge1xuICBmaWVsZD86IHN0cmluZztcbiAgcGFyc2VyPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT47XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHBhdHRlcm4/OiBSZWdFeHA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kZWwoeyBjaWQgPSBDSURfRklFTERfTkFNRSB9OiB7IGNpZD86IHN0cmluZyB9ID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKToge30gfT4oY29uc3RydWN0b3I6IFQpID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IDxhbnk+Y29uc3RydWN0b3I7XG4gICAgaWYgKCFLbGFzcy5oYXNPd25Qcm9wZXJ0eSgnb3B0aW9ucycpKVxuICAgICAgS2xhc3Mub3B0aW9ucyA9IHtcbiAgICAgICAgZmllbGRzOiBuZXcgTWFwPHN0cmluZywgTW9kZWxGaWVsZE9wdGlvbnM+KCksXG4gICAgICB9IGFzIE1vZGVsT3B0aW9ucztcbiAgICBLbGFzcy5vcHRpb25zLmNpZCA9IGNpZDtcbiAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbEZpZWxkKHtcbiAgbmFtZSxcbiAgLi4ub3B0aW9uc1xufTogeyBuYW1lPzogc3RyaW5nIH0gJiBNb2RlbEZpZWxkT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgS2xhc3MgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gICAgaWYgKCFLbGFzcy5oYXNPd25Qcm9wZXJ0eSgnb3B0aW9ucycpKVxuICAgICAgS2xhc3Mub3B0aW9ucyA9IHtcbiAgICAgICAgZmllbGRzOiBuZXcgTWFwPHN0cmluZywgTW9kZWxGaWVsZE9wdGlvbnM+KCksXG4gICAgICB9IGFzIE1vZGVsT3B0aW9ucztcbiAgICBvcHRpb25zLmZpZWxkID0gbmFtZSB8fCBrZXk7XG4gICAgS2xhc3Mub3B0aW9ucy5maWVsZHMuc2V0KGtleSwgb3B0aW9ucyk7XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxGaWVsZE9wdGlvbnM8Rj4gPSBNb2RlbEZpZWxkT3B0aW9ucyAmIHtcbiAgbmFtZTogc3RyaW5nO1xuICBmaWVsZDogc3RyaW5nO1xuICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsRmllbGQ8Rj4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xuICBvcHRpb25zOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBtZXRhPzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgZGVmYXVsdD86IGFueTtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGNvbmN1cnJlbmN5OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHBhdHRlcm4/OiBSZWdFeHA7XG4gIHBhcnNlck9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4sXG4gICAgeyBuYW1lLCBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH06IE9EYXRhTW9kZWxGaWVsZE9wdGlvbnM8Rj4sXG4gICkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy5kZWZhdWx0ID0gb3B0cy5kZWZhdWx0IHx8IHBhcnNlci5kZWZhdWx0O1xuICAgIHRoaXMucmVxdWlyZWQgPSBCb29sZWFuKG9wdHMucmVxdWlyZWQgfHwgIXBhcnNlci5udWxsYWJsZSk7XG4gICAgdGhpcy5jb25jdXJyZW5jeSA9IEJvb2xlYW4ob3B0cy5jb25jdXJyZW5jeSk7XG4gICAgdGhpcy5tYXhMZW5ndGggPSBvcHRzLm1heExlbmd0aCB8fCBwYXJzZXIubWF4TGVuZ3RoO1xuICAgIHRoaXMubWluTGVuZ3RoID0gb3B0cy5taW5MZW5ndGg7XG4gICAgdGhpcy5taW4gPSBvcHRzLm1pbjtcbiAgICB0aGlzLm1heCA9IG9wdHMubWF4O1xuICAgIHRoaXMucGF0dGVybiA9IG9wdHMucGF0dGVybjtcbiAgfVxuXG4gIGdldCBhcGkoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcGk7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIudHlwZTtcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMucGFyc2VyLm5hdmlnYXRpb24pO1xuICB9XG5cbiAgZ2V0IGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXJzZXIuY29sbGVjdGlvbik7XG4gIH1cblxuICBhbm5vdGF0ZWRWYWx1ZTxUPih0ZXJtOiBzdHJpbmcgfCBSZWdFeHApIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuYW5ub3RhdGVkVmFsdWU8VD4odGVybSk7XG4gIH1cblxuICBjb25maWd1cmUoe1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgICBjb25jdXJyZW5jeSxcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbmN1cnJlbmN5OiBib29sZWFuO1xuICAgIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG4gIH0pIHtcbiAgICB0aGlzLm1ldGEgPSBmaW5kT3B0aW9uc0ZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG4gICAgdGhpcy5wYXJzZXJPcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAoY29uY3VycmVuY3kpIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgICBpZiAodGhpcy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlc2VyaWFsaXplKHRoaXMuZGVmYXVsdCwgb3B0aW9ucyk7XG4gIH1cblxuICBpc0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNLZXkoKTtcbiAgfVxuXG4gIGhhc1JlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaGFzUmVmZXJlbnRpYWxzKCk7XG4gIH1cblxuICBnZXQgcmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5yZWZlcmVudGlhbHM7XG4gIH1cblxuICBpc1N0cnVjdHVyZWRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc1N0cnVjdHVyZWRUeXBlKCk7XG4gIH1cblxuICBzdHJ1Y3R1cmVkKCkge1xuICAgIGxldCBzdHJ1Y3R1cmVkVHlwZSA9IHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8Rj4oXG4gICAgICB0aGlzLnBhcnNlci50eXBlLFxuICAgICk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoIXN0cnVjdHVyZWRUeXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBzdHJ1Y3R1cmVkIHR5cGUgZm9yICR7dGhpcy5wYXJzZXIudHlwZX1gKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc0VudW1UeXBlKCk7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIGxldCBlbnVtVHlwZSA9IHRoaXMuYXBpLmZpbmRFbnVtVHlwZUZvclR5cGU8Rj4odGhpcy5wYXJzZXIudHlwZSk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoIWVudW1UeXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBlbnVtIHR5cGUgZm9yICR7dGhpcy5wYXJzZXIudHlwZX1gKTtcbiAgICByZXR1cm4gZW51bVR5cGU7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuICF2YWx1ZS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pID8gdmFsdWUuX2Vycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAubW9kZWxzKClcbiAgICAgICAgLnNvbWUoKG06IE9EYXRhTW9kZWw8YW55PikgPT4gIW0uaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSlcbiAgICAgICAgPyB2YWx1ZS5tb2RlbHMoKS5tYXAoKG06IE9EYXRhTW9kZWw8YW55PikgPT4gbS5fZXJyb3JzKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmFubm90YXRlZFZhbHVlPGJvb2xlYW4+KENPTVBVVEVEKTtcbiAgICAgIGxldCBlcnJvcnMgPSB0aGlzLnBhcnNlcj8udmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pIHx8IFtdO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnJlcXVpcmVkICYmXG4gICAgICAgICh2YWx1ZSA9PT0gbnVsbCB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBtZXRob2QgIT09ICdtb2RpZnknKSkgJiYgLy8gSXMgbnVsbCBvciB1bmRlZmluZWQgd2l0aG91dCBwYXRjaD9cbiAgICAgICAgIShjb21wdXRlZCAmJiBtZXRob2QgPT09ICdjcmVhdGUnKSAvLyBOb3QgKElzIENvbXB1dGVkIGZpZWxkIGFuZCBjcmVhdGUpID9cbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgcmVxdWlyZWRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1heGxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgbWlubGVuZ3RoYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA8IHRoaXMubWluXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1pbmApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1heCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiB0aGlzLm1heFxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtYXhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wYXR0ZXJuICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAhdGhpcy5wYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGRlZmF1bHRzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIHRoaXMubWV0YSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMubWV0YS5kZWZhdWx0cygpXG4gICAgICA6IHRoaXMuZGVmYXVsdDtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogRiB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5wYXJzZXJPcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5kZXNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICBzZXJpYWxpemUodmFsdWU6IEYsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLnBhcnNlck9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICBlbmNvZGUodmFsdWU6IEYsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLnBhcnNlck9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICByZXNvdXJjZUZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFSZXNvdXJjZTxUPixcbiAgKTogT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxGPiB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxGPiB7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgfHxcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGJ1aWxkIHJlc291cmNlIGZvciBub24gY29tcGF0aWJsZSBiYXNlIHR5cGVcIik7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblxuICAgICAgPyAoYmFzZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5uYXZpZ2F0aW9uUHJvcGVydHk8Rj4odGhpcy5wYXJzZXIubmFtZSlcbiAgICAgIDogKGJhc2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikucHJvcGVydHk8Rj4odGhpcy5wYXJzZXIubmFtZSk7XG4gIH1cblxuICBhbm5vdGF0aW9uc0ZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPixcbiAgKTogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxGPiB8IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxGPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmNvbGxlY3Rpb25cbiAgICAgID8gYmFzZS5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lIGFzIGtleW9mIFQsICdjb2xsZWN0aW9uJylcbiAgICAgIDogYmFzZS5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lIGFzIGtleW9mIFQsICdzaW5nbGUnKTtcbiAgfVxuXG4gIHNjaGVtYUZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPixcbiAgKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxGPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG4gIH1cblxuICBtb2RlbEZhY3Rvcnk8Rj4oe1xuICAgIHBhcmVudCxcbiAgICB2YWx1ZSxcbiAgICByZXNldCxcbiAgfToge1xuICAgIHBhcmVudDogT0RhdGFNb2RlbDxhbnk+O1xuICAgIHZhbHVlPzogUGFydGlhbDxGPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgfSk6IE9EYXRhTW9kZWw8Rj4ge1xuICAgIC8vIE1vZGVsXG4gICAgY29uc3QgYW5ub3RzID0gdGhpcy5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBwYXJlbnQuYW5ub3RzKCksXG4gICAgKSBhcyBPRGF0YUVudGl0eUFubm90YXRpb25zPEY+O1xuICAgIGxldCBNb2RlbCA9IHRoaXMuYXBpLm1vZGVsRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgICBpZiAoTW9kZWwgPT09IHVuZGVmaW5lZCkgdGhyb3cgRXJyb3IoYE5vIE1vZGVsIHR5cGUgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdHMudXBkYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHNjaGVtYSA9IE1vZGVsLm1ldGEuZmluZENoaWxkT3B0aW9ucygobykgPT5cbiAgICAgICAgby5pc1R5cGVPZihhbm5vdHMudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgKT8uc2NoZW1hO1xuICAgICAgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYS5tb2RlbCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAvLyBDaGFuZ2UgdG8gY2hpbGQgbW9kZWxcbiAgICAgICAgTW9kZWwgPSBzY2hlbWEubW9kZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbCgodmFsdWUgfHwge30pIGFzIFBhcnRpYWw8Rj4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQsXG4gICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgIH0pO1xuICB9XG5cbiAgY29sbGVjdGlvbkZhY3Rvcnk8Rj4oe1xuICAgIHBhcmVudCxcbiAgICB2YWx1ZSxcbiAgICByZXNldCxcbiAgfToge1xuICAgIHBhcmVudDogT0RhdGFNb2RlbDxhbnk+O1xuICAgIHZhbHVlPzogUGFydGlhbDxGPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4ge1xuICAgIC8vIENvbGxlY3Rpb24gRmFjdG9yeVxuICAgIGNvbnN0IGFubm90cyA9IHRoaXMuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgcGFyZW50LmFubm90cygpLFxuICAgICkgYXMgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPEY+O1xuICAgIGNvbnN0IENvbGxlY3Rpb24gPSB0aGlzLmFwaS5jb2xsZWN0aW9uRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgICBpZiAoQ29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgRXJyb3IoYE5vIENvbGxlY3Rpb24gdHlwZSBmb3IgJHt0aGlzLm5hbWV9YCk7XG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKFxuICAgICAgKHZhbHVlIHx8IFtdKSBhcyBQYXJ0aWFsPEY+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdLFxuICAgICAge1xuICAgICAgICBhbm5vdHM6IGFubm90cyxcbiAgICAgICAgcmVzZXQsXG4gICAgICAgIHBhcmVudDogW3BhcmVudCwgdGhpc10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxBdHRyaWJ1dGU8VD4ge1xuICBwcml2YXRlIHZhbHVlPzogVCB8IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4gfCBudWxsO1xuICBwcml2YXRlIGNoYW5nZT86IFQgfCBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+IHwgbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGV2ZW50cyQgPSBuZXcgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX21vZGVsOiBPRGF0YU1vZGVsPGFueT4sXG4gICAgcHJpdmF0ZSBfZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxUPixcbiAgKSB7fVxuXG4gIGdldCBuYXZpZ2F0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2ZpZWxkLm5hdmlnYXRpb24pO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9maWVsZC5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gIH1cblxuICBnZXQgY29uY3VycmVuY3koKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZmllbGQuY29uY3VycmVuY3kpO1xuICB9XG5cbiAgZ2V0IHJlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQucmVmZXJlbnRpYWxzO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkLm9wdGlvbnM7XG4gIH1cblxuICBnZXQgbWV0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQubWV0YTtcbiAgfVxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWVsZC5uYW1lO1xuICB9XG5cbiAgZ2V0IGZpZWxkTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQuZmllbGQ7XG4gIH1cblxuICBnZXQoKTpcbiAgICB8IFRcbiAgICB8IE9EYXRhTW9kZWw8VD5cbiAgICB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2UgIT09IHVuZGVmaW5lZCA/IHRoaXMuY2hhbmdlIDogdGhpcy52YWx1ZTtcbiAgfVxuXG4gIHNldChcbiAgICB2YWx1ZTpcbiAgICAgIHwgVFxuICAgICAgfCBPRGF0YU1vZGVsPFQ+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZCxcbiAgICByZXNldDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHJlcGFyZW50OiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldCgpO1xuXG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChjdXJyZW50KSB8fFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKGN1cnJlbnQpXG4gICAgKVxuICAgICAgdGhpcy51bmxpbmsoXG4gICAgICAgIGN1cnJlbnQgYXMgT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PixcbiAgICAgICAgLy90aGlzLnZhbHVlICE9PSBjdXJyZW50XG4gICAgICApO1xuXG4gICAgY29uc3QgY2hhbmdlZCA9XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpXG4gICAgICAgID8gIShjdXJyZW50IGFzIE9EYXRhTW9kZWw8VD4pLmVxdWFscyh2YWx1ZSBhcyBPRGF0YU1vZGVsPFQ+KVxuICAgICAgICA6IE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50KSAmJlxuICAgICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICAgICAgPyAhKGN1cnJlbnQgYXMgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KS5lcXVhbHMoXG4gICAgICAgICAgICB2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgICAgICAgKVxuICAgICAgICA6ICFUeXBlcy5pc0VxdWFsKGN1cnJlbnQsIHZhbHVlKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNFcXVhbCh2YWx1ZSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuY2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlZCkge1xuICAgICAgdGhpcy5jaGFuZ2UgPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMubGluayhcbiAgICAgICAgdmFsdWUgYXMgT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PixcbiAgICAgICAgcmVwYXJlbnQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIGlzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXQoKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jaGFuZ2UgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgKChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpIHx8XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50KSkgJiZcbiAgICAgICAgKFxuICAgICAgICAgIGN1cnJlbnQgYXMgT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICAgICAgICApLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodGhpcy5jaGFuZ2UpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odGhpcy5jaGFuZ2UpXG4gICAgKVxuICAgICAgdGhpcy51bmxpbmsoXG4gICAgICAgIHRoaXMuY2hhbmdlIGFzIE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgICApO1xuICAgIHRoaXMuY2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodGhpcy52YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih0aGlzLnZhbHVlKVxuICAgIClcbiAgICAgIHRoaXMubGluayhcbiAgICAgICAgdGhpcy52YWx1ZSBhcyBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+LFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbGluayhcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PixcbiAgICByZXBhcmVudDogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHZhbHVlLmV2ZW50cyQuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmV2ZW50cyQuZW1pdChlKSk7XG4gICAgaWYgKHJlcGFyZW50KSB7XG4gICAgICB2YWx1ZS5fcGFyZW50ID0gW3RoaXMuX21vZGVsLCB0aGlzLl9maWVsZF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bmxpbmsoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcGFyZW50KSB7XG4gICAgICB2YWx1ZS5fcGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEVudHJ5PFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PiA9IHtcbiAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZTtcbiAgbW9kZWw6IE07XG4gIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbE9wdGlvbnM8VD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNpZDogc3RyaW5nO1xuICBiYXNlPzogc3RyaW5nO1xuICBwcml2YXRlIF9maWVsZHM6IE9EYXRhTW9kZWxGaWVsZDxhbnk+W10gPSBbXTtcbiAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICBlbnRpdHlTZXQ/OiBPRGF0YUVudGl0eVNldDtcbiAgLy8gSGllcmFyY2h5XG4gIHBhcmVudD86IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIGNoaWxkcmVuOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+W10gPSBbXTtcbiAgZXZlbnRzJCA9IG5ldyBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIG9wdGlvbnMsXG4gICAgc2NoZW1hLFxuICB9OiB7XG4gICAgb3B0aW9uczogTW9kZWxPcHRpb25zO1xuICAgIHNjaGVtYTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjtcbiAgfSkge1xuICAgIHRoaXMubmFtZSA9IHNjaGVtYS5uYW1lO1xuICAgIHRoaXMuYmFzZSA9IHNjaGVtYS5iYXNlO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMuY2lkID0gb3B0aW9ucz8uY2lkIHx8IENJRF9GSUVMRF9OQU1FO1xuICAgIG9wdGlvbnMuZmllbGRzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHRoaXMuYWRkRmllbGQ8YW55PihrZXksIHZhbHVlKSk7XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5hcGk7XG4gIH1cblxuICB0eXBlKHsgYWxpYXMgPSBmYWxzZSB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEudHlwZSh7IGFsaWFzIH0pO1xuICB9XG5cbiAgaXNPcGVuVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEuaXNPcGVuVHlwZSgpO1xuICB9XG5cbiAgaXNFbnRpdHlUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5pc0VudGl0eVR5cGUoKTtcbiAgfVxuXG4gIGlzQ29tcGxleFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmlzQ29tcGxleFR5cGUoKTtcbiAgfVxuXG4gIGlzVHlwZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5pc1R5cGVPZih0eXBlKTtcbiAgfVxuXG4gIGlzTW9kZWxGb3IoZW50aXR5OiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pIHtcbiAgICAvLyBSZXNvbHZlIEJ5IFR5cGVcbiAgICBsZXQgdHlwZSA9IHRoaXMuYXBpLm9wdGlvbnMuaGVscGVyLnR5cGUoZW50aXR5IGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9KTtcbiAgICBpZiAodHlwZSAmJiB0aGlzLmlzVHlwZU9mKHR5cGUpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBSZXNvbHZlIEJ5IGZpZWxkc1xuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoZW50aXR5IGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9KTtcbiAgICBsZXQgbmFtZXMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSkubWFwKChmKSA9PiBmLm5hbWUpO1xuICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IG5hbWVzLmluY2x1ZGVzKGtleSkpO1xuICB9XG5cbiAgZmluZENoaWxkT3B0aW9ucyhcbiAgICBwcmVkaWNhdGU6IChvcHRpb25zOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+KSA9PiBib29sZWFuLFxuICApOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJlZGljYXRlKHRoaXMpKSByZXR1cm4gdGhpcztcbiAgICBsZXQgbWF0Y2g6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRPcHRpb25zKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgb3B0aW9ucyxcbiAgICBwYXJzZXJGb3JUeXBlLFxuICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgfToge1xuICAgIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICB9KSB7XG4gICAgaWYgKHRoaXMuYmFzZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMuYmFzZSkgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5U2V0ID0gdGhpcy5hcGkuZmluZEVudGl0eVNldEZvckVudGl0eVR5cGUodGhpcy50eXBlKCkpO1xuICAgIGxldCBjb25jdXJyZW5jeUZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5lbnRpdHlTZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uY3VycmVuY3lGaWVsZHMgPVxuICAgICAgICB0aGlzLmVudGl0eVNldC5hbm5vdGF0ZWRWYWx1ZTxzdHJpbmdbXT4oT1BUSU1JU1RJQ19DT05DVVJSRU5DWSkgfHwgW107XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgbGV0IGNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3lGaWVsZHMuaW5kZXhPZihmaWVsZC5maWVsZCkgIT09IC0xO1xuICAgICAgZmllbGQuY29uZmlndXJlKHtcbiAgICAgICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICAgICAgICBjb25jdXJyZW5jeSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZmllbGRzKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgaW5jbHVkZV9wYXJlbnRzLFxuICB9OiB7XG4gICAgaW5jbHVkZV9wYXJlbnRzOiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogYm9vbGVhbjtcbiAgfSk6IE9EYXRhTW9kZWxGaWVsZDxhbnk+W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4oaW5jbHVkZV9wYXJlbnRzICYmIHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnBhcmVudC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb24sIGluY2x1ZGVfcGFyZW50cyB9KVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLnRoaXMuX2ZpZWxkcy5maWx0ZXIoXG4gICAgICAgIChmaWVsZCkgPT4gaW5jbHVkZV9uYXZpZ2F0aW9uIHx8ICFmaWVsZC5uYXZpZ2F0aW9uLFxuICAgICAgKSxcbiAgICBdO1xuICB9XG5cbiAgZmllbGQ8Rj4obmFtZToga2V5b2YgVCB8IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IHRoaXMuZmluZEZpZWxkPEY+KG5hbWUpO1xuICAgIC8vVGhyb3cgZXJyb3IgaWYgbm90IGZvdW5kXG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpZWxkIHdpdGggbmFtZSAke25hbWUgYXMgc3RyaW5nfWApO1xuICAgIHJldHVybiBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8Rj47XG4gIH1cblxuICBmaW5kRmllbGQ8Rj4obmFtZToga2V5b2YgVCB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZChcbiAgICAgIChtb2RlbEZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4pID0+XG4gICAgICAgIG1vZGVsRmllbGQubmFtZSA9PT0gbmFtZSB8fCBtb2RlbEZpZWxkLmZpZWxkID09PSBuYW1lLFxuICAgICkgYXMgT0RhdGFNb2RlbEZpZWxkPEY+IHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgYWRkRmllbGQ8Rj4obmFtZTogc3RyaW5nLCBvcHRpb25zOiBNb2RlbEZpZWxkT3B0aW9ucykge1xuICAgIGNvbnN0IHsgZmllbGQsIHBhcnNlciwgLi4ub3B0cyB9ID0gb3B0aW9ucztcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBuYW1lID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZGVsIFByb3BlcnRpZXMgbmVlZCBuYW1lIGFuZCBmaWVsZCcpO1xuICAgIGNvbnN0IGZpZWxkUGFyc2VyID0gcGFyc2VyID8/IHRoaXMuc2NoZW1hLmZpZWxkPEY+KGZpZWxkIGFzIGtleW9mIFQpO1xuICAgIGlmIChmaWVsZFBhcnNlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwYXJzZXIgZm9yICR7ZmllbGR9IHdpdGggbmFtZSA9ICR7bmFtZX1gKTtcbiAgICBjb25zdCBtb2RlbEZpZWxkID0gbmV3IE9EYXRhTW9kZWxGaWVsZDxGPih0aGlzLCB7XG4gICAgICBuYW1lLFxuICAgICAgZmllbGQsXG4gICAgICBwYXJzZXI6IGZpZWxkUGFyc2VyLFxuICAgICAgLi4ub3B0cyxcbiAgICB9KTtcbiAgICB0aGlzLl9maWVsZHMucHVzaChtb2RlbEZpZWxkKTtcbiAgICByZXR1cm4gbW9kZWxGaWVsZDtcbiAgfVxuXG4gIHRzVG9FZG06IFJlY29yZDxzdHJpbmcsIEVkbVR5cGU+ID0ge1xuICAgIHN0cmluZzogRWRtVHlwZS5TdHJpbmcsXG4gICAgbnVtYmVyOiBFZG1UeXBlLkludDMyLFxuICAgIGJpZ2ludDogRWRtVHlwZS5JbnQ2NCxcbiAgICBib29sZWFuOiBFZG1UeXBlLkJvb2xlYW4sXG4gIH07XG4gIHByaXZhdGUgbW9kZWxGaWVsZEZhY3Rvcnk8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nIHwgRWRtVHlwZSxcbiAgKSB7XG4gICAgY29uc3Qgc3RydWN0dXJlZEZpZWxkUGFyc2VyID0gdGhpcy5zY2hlbWEuYWRkRmllbGQ8Rj4obmFtZSwgeyB0eXBlIH0pO1xuICAgIHN0cnVjdHVyZWRGaWVsZFBhcnNlci5jb25maWd1cmUoe1xuICAgICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiB0aGlzLmFwaS5maW5kT3B0aW9uc0ZvclR5cGUodHlwZSksXG4gICAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nIHwgRWRtVHlwZSkgPT4gdGhpcy5hcGkucGFyc2VyRm9yVHlwZSh0eXBlKSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuYXBpLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgY29uc3QgbW9kZWxGaWVsZCA9IHRoaXMuYWRkRmllbGQ8Rj4obmFtZSwge1xuICAgICAgZmllbGQ6IG5hbWUsXG4gICAgICBwYXJzZXI6IHN0cnVjdHVyZWRGaWVsZFBhcnNlcixcbiAgICB9KTtcbiAgICBtb2RlbEZpZWxkLmNvbmZpZ3VyZSh7XG4gICAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IHRoaXMuYXBpLmZpbmRPcHRpb25zRm9yVHlwZSh0eXBlKSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuYXBpLm9wdGlvbnMsXG4gICAgICBjb25jdXJyZW5jeTogZmFsc2UsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIG1vZGVsRmllbGQubmFtZSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiAoKSA9PiB0aGlzLmdldChzZWxmLCBtb2RlbEZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+KSxcbiAgICAgIHNldDogKHZhbHVlOiBhbnkpID0+XG4gICAgICAgIHRoaXMuc2V0KHNlbGYsIG1vZGVsRmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4sIHZhbHVlKSxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWxGaWVsZDtcbiAgfVxuXG4gIGF0dGFjaChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICkge1xuICAgIGlmIChcbiAgICAgIHNlbGYuX3Jlc291cmNlICE9PSBudWxsICYmXG4gICAgICByZXNvdXJjZS50eXBlKCkgIT09IHNlbGYuX3Jlc291cmNlLnR5cGUoKSAmJlxuICAgICAgIXNlbGYuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGF0dGFjaCAke3Jlc291cmNlLnR5cGUoKX0gdG8gJHtzZWxmLl9yZXNvdXJjZS50eXBlKCl9YCxcbiAgICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gc2VsZi5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgIWN1cnJlbnQuaXNFcXVhbFRvKHJlc291cmNlKSkge1xuICAgICAgc2VsZi5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAgIHNlbGYuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuQXR0YWNoLCB7XG4gICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyMgcmVnaW9uIFJlc291cmNlXG4gIHN0YXRpYyBjaGFpbihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgKTogW1xuICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICBdW10ge1xuICAgIGNvbnN0IGNoYWluID0gW10gYXMgYW55W107XG4gICAgbGV0IHR1cGxlOlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwsXG4gICAgICAgIF1cbiAgICAgIHwgbnVsbCA9IFtjaGlsZCwgbnVsbF07XG4gICAgd2hpbGUgKHR1cGxlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0dXBsZSBhcyBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF07XG4gICAgICBpZiAoY2hhaW4uc29tZSgocCkgPT4gcFswXSA9PT0gcGFyZW50WzBdKSkgYnJlYWs7XG4gICAgICBjaGFpbi5zcGxpY2UoMCwgMCwgcGFyZW50KTtcbiAgICAgIHR1cGxlID0gdHVwbGVbMF0uX3BhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYWluO1xuICB9XG5cbiAgc3RhdGljIHJlc291cmNlPFQ+KFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+LFxuICApOiBPRGF0YVJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBwcmV2RmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChsZXQgW21vZGVsLCBmaWVsZF0gb2YgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpKSB7XG4gICAgICByZXNvdXJjZSA9IHJlc291cmNlIHx8IChtb2RlbC5fcmVzb3VyY2UgYXMgT0RhdGFSZXNvdXJjZTxUPik7XG4gICAgICBpZiAocmVzb3VyY2UgPT09IG51bGwpIGJyZWFrO1xuICAgICAgaWYgKFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSAmJlxuICAgICAgICAocHJldkZpZWxkID09PSBudWxsIHx8IHByZXZGaWVsZC5jb2xsZWN0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlc29sdmUga2V5XG4gICAgICAgIGxldCBtb2RlbEtleSA9IChtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLmtleSh7XG4gICAgICAgICAgZmllbGRfbWFwcGluZzogdHJ1ZSxcbiAgICAgICAgfSkgYXMgRW50aXR5S2V5PGFueT47XG4gICAgICAgIGlmIChtb2RlbEtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJlc291cmNlID1cbiAgICAgICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICAgICAgICA/IHJlc291cmNlLmVudGl0eShtb2RlbEtleSlcbiAgICAgICAgICAgICAgOiAocmVzb3VyY2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikua2V5KG1vZGVsS2V5KTtcbiAgICAgIH1cbiAgICAgIHByZXZGaWVsZCA9IGZpZWxkO1xuICAgICAgaWYgKGZpZWxkID09PSBudWxsKSB7XG4gICAgICAgIC8vIEFwcGx5IHRoZSBxdWVyeSBmcm9tIG1vZGVsIHRvIG5ldyByZXNvdXJjZVxuICAgICAgICBjb25zdCBxdWVyeSA9IG1vZGVsLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpLnRvUXVlcnlBcmd1bWVudHMoKTtcbiAgICAgICAgaWYgKHF1ZXJ5ICE9PSB1bmRlZmluZWQpIHJlc291cmNlLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KHF1ZXJ5KSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzb3VyY2UgPSBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8YW55LCBhbnk+KHJlc291cmNlKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGJ1aWxkIHJlc291cmNlIGZvciAke2NoaWxkfWApO1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG4gICAgcXVlcnk/OiBPRGF0YVF1ZXJ5T3B0aW9uczxUPixcbiAgKTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5lbnRpdHlTZXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT0RhdGFFbnRpdHlTZXRSZXNvdXJjZS5mYWN0b3J5PFQ+KHRoaXMuYXBpLCB7XG4gICAgICBwYXRoOiB0aGlzLmVudGl0eVNldC5uYW1lLFxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHF1ZXJ5LFxuICAgIH0pO1xuICB9XG5cbiAgbW9kZWxSZXNvdXJjZUZhY3RvcnkoXG4gICAgcXVlcnk/OiBPRGF0YVF1ZXJ5T3B0aW9uczxUPixcbiAgKTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShxdWVyeSk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkgcmV0dXJuIHJlc291cmNlLmVudGl0eSgpO1xuICAgIHJldHVybiByZXNvdXJjZSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgZW50aXR5UmVzb3VyY2Uoc2VsZjogT0RhdGFNb2RlbDxUPik6IE9EYXRhUmVzb3VyY2U8VD4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkoXG4gICAgICBzZWxmLl9yZXNvdXJjZSAhPT0gbnVsbCA/IHNlbGYuX3Jlc291cmNlLmNsb25lUXVlcnkoKSA6IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBidWlsZCByZXNvdXJjZSBmb3IgJHtzZWxmfWApO1xuICAgIGNvbnN0IGtleSA9IHNlbGYua2V5KHsgZmllbGRfbWFwcGluZzogdHJ1ZSB9KSBhcyBFbnRpdHlLZXk8VD47XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcmVzb3VyY2Uua2V5KGtleSk7XG4gICAgcmV0dXJuIHJlc291cmNlIGFzIE9EYXRhUmVzb3VyY2U8VD47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgYmluZChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgXTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICAvLyBFdmVudHNcbiAgICBzZWxmLmV2ZW50cyQuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmV2ZW50cyQuZW1pdChlKSk7XG5cbiAgICAvLyBQYXJlbnRcbiAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZVxuICAgIGlmIChzZWxmLl9wYXJlbnQgPT09IG51bGwgJiYgcmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJlc291cmNlID0gdGhpcy5tb2RlbFJlc291cmNlRmFjdG9yeSgpO1xuICAgIGlmIChyZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmF0dGFjaChcbiAgICAgICAgc2VsZixcbiAgICAgICAgcmVzb3VyY2UgYXNcbiAgICAgICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICBzZWxmLl9hbm5vdGF0aW9ucyA9XG4gICAgICBhbm5vdHMgfHwgbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMoT0RhdGFIZWxwZXJbREVGQVVMVF9WRVJTSU9OXSk7XG5cbiAgICAvLyBGaWVsZHNcbiAgICB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSkuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBmaWVsZC5uYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLmdldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiksXG4gICAgICAgIHNldDogKHZhbHVlOiBhbnkpID0+XG4gICAgICAgICAgdGhpcy5zZXQoc2VsZiwgZmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4sIHZhbHVlKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcXVlcnkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+LFxuICAgIGZ1bmM6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkLFxuICApIHtcbiAgICByZXNvdXJjZS5xdWVyeShmdW5jKTtcbiAgICB0aGlzLmF0dGFjaChzZWxmLCByZXNvdXJjZSk7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICByZXNvbHZlS2V5KFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgICAgc2luZ2xlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbjsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXlUeXBlcyA9IHRoaXMuc2NoZW1hLmtleXMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSk7XG4gICAgY29uc3Qga2V5ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBmb3IgKGxldCBrdCBvZiBrZXlUeXBlcykge1xuICAgICAgbGV0IHYgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICBsZXQgb3B0aW9ucyA9IHRoaXMgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgIGxldCBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGxldCBuYW1lIG9mIGt0Lm5hbWUuc3BsaXQoJy8nKSkge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgZmllbGQgPSBvcHRpb25zXG4gICAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAgIC5maW5kKChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2ID1cbiAgICAgICAgICAgIFR5cGVzLmlzUGxhaW5PYmplY3QodikgfHwgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2KVxuICAgICAgICAgICAgICA/IHZbZmllbGQubmFtZV1cbiAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgIG9wdGlvbnMgPSBmaWVsZC5tZXRhIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gZmllbGQuZmllbGQgOiBmaWVsZC5uYW1lO1xuICAgICAgaWYgKGt0LmFsaWFzICE9PSB1bmRlZmluZWQpIG5hbWUgPSBrdC5hbGlhcztcbiAgICAgIGtleS5zZXQobmFtZSwgdik7XG4gICAgfVxuICAgIGlmIChrZXkuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkoa2V5LCB7IHNpbmdsZSB9KVxuICAgICAgOiBPYmplY3QuZnJvbUVudHJpZXMoa2V5KTtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVudGlhbChcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgICBzaW5nbGUgPSBmYWxzZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbjsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbnRpYWwgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAobGV0IHJlZiBvZiBhdHRyLnJlZmVyZW50aWFscykge1xuICAgICAgbGV0IGZyb20gPSB0aGlzLmZpZWxkcyh7XG4gICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsXG4gICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIH0pLmZpbmQoKHA6IGFueSkgPT4gcC5maWVsZCA9PT0gcmVmLnJlZmVyZW5jZWRQcm9wZXJ0eSk7XG4gICAgICBsZXQgdG8gPSBhdHRyLm9wdGlvbnNcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gcmVmLnByb3BlcnR5KTtcbiAgICAgIGlmIChmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyB0by5maWVsZCA6IHRvLm5hbWU7XG4gICAgICAgIHJlZmVyZW50aWFsLnNldChuYW1lLCB2YWx1ZSAmJiAodmFsdWUgYXMgYW55KVtmcm9tLm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZmVyZW50aWFsLnNpemUgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHJlZmVyZW50aWFsLnNpemUgPT09IDEgJiYgQXJyYXkuZnJvbShyZWZlcmVudGlhbC52YWx1ZXMoKSlbMF0gPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbnRpYWwsIHsgc2luZ2xlIH0pXG4gICAgICA6IE9iamVjdC5mcm9tRW50cmllcyhyZWZlcmVudGlhbCk7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbmNlZChcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgICBzaW5nbGUgPSBmYWxzZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbjsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgZm9yIChsZXQgcmVmIG9mIGF0dHIucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHtcbiAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgfSkuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gcmVmLnByb3BlcnR5KTtcbiAgICAgIGxldCB0byA9IChhdHRyLm1ldGEgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PilcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PlxuICAgICAgICAgICAgZmllbGQuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHksXG4gICAgICAgICk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gdG8uZmllbGQgOiB0by5uYW1lO1xuICAgICAgICByZWZlcmVuY2VkLnNldChuYW1lLCB2YWx1ZSAmJiAodmFsdWUgYXMgYW55KVtmcm9tLm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZWQuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocmVmZXJlbmNlZC5zaXplID09PSAxICYmIEFycmF5LmZyb20ocmVmZXJlbmNlZC52YWx1ZXMoKSlbMF0gPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbmNlZCwgeyBzaW5nbGUgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHJlZmVyZW5jZWQpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IG5hdmlnYXRpb24sXG4gICAgfSkucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSAoc2VsZiBhcyBhbnkpW2ZpZWxkLm5hbWVdO1xuICAgICAgbGV0IGVycnMgPSBmaWVsZC52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QgfSk7XG4gICAgICByZXR1cm4gZXJycyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2ZpZWxkLm5hbWVdOiBlcnJzIH0pXG4gICAgICAgIDogYWNjO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlZmF1bHRzKCk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGVmcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSkucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBmaWVsZC5kZWZhdWx0cygpO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IHZhbHVlIH0pXG4gICAgICAgIDogYWNjO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZGVmcykgPyBkZWZzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaGFzQ2hhbmdlZChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHsgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UgfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFsuLi5zZWxmLl9hdHRyaWJ1dGVzLnZhbHVlcygpXVxuICAgICAgLmZpbHRlcigoYXR0cikgPT4gIWF0dHIubmF2aWdhdGlvbiB8fCBpbmNsdWRlX25hdmlnYXRpb24pXG4gICAgICAuc29tZShcbiAgICAgICAgKGF0dHIpID0+XG4gICAgICAgICAgKCFpbmNsdWRlX25hdmlnYXRpb24gfHwgYXR0ci5uYXZpZ2F0aW9uKSAmJlxuICAgICAgICAgIGF0dHIuaXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIGhhc0tleShzZWxmOiBPRGF0YU1vZGVsPFQ+KSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUtleShzZWxmKSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgd2l0aFJlc291cmNlPFIsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PihcbiAgICBzZWxmOiBNLFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICAgY3R4OiAobW9kZWw6IE0pID0+IFIsXG4gICk6IFIge1xuICAgIC8vIFB1c2hcbiAgICBzZWxmLnB1c2hSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgLy8gRXhlY3V0ZSBmdW5jdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGN0eChzZWxmKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gUG9wXG4gICAgICAgICAgc2VsZi5wb3BSZXNvdXJjZSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvcFxuICAgICAgc2VsZi5wb3BSZXNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgYXNFbnRpdHk8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KHNlbGY6IE0sIGN0eDogKG1vZGVsOiBNKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcXVlcnkgPSBzZWxmLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpO1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgRW50aXR5IGVuZHBvaW50Jyk7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHNlbGYsIHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgdG9FbnRpdHkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgY2hhaW4gPSBbXSxcbiAgICB9OiB7XG4gICAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICAgIH0gPSB7fSxcbiAgKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgZW50aXR5OiBhbnkgPSBbLi4uc2VsZi5fYXR0cmlidXRlcy52YWx1ZXMoKV1cbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYWluXG4gICAgICAgIChhdHRyKSA9PiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gYXR0ci5nZXQoKSksXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAvLyBDaGFuZ2VzIG9ubHlcbiAgICAgICAgKGF0dHIpID0+XG4gICAgICAgICAgIWNoYW5nZXNfb25seSB8fFxuICAgICAgICAgIChjaGFuZ2VzX29ubHkgJiYgYXR0ci5pc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGF0dHIpID0+XG4gICAgICAgICAgLy8gTmF2aWdhdGlvblxuICAgICAgICAgIChpbmNsdWRlX25hdmlnYXRpb24gJiYgYXR0ci5uYXZpZ2F0aW9uICYmIGF0dHIuZ2V0KCkgIT09IG51bGwpIHx8XG4gICAgICAgICAgIWF0dHIubmF2aWdhdGlvbixcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjYywgYXR0cikgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGF0dHIuZmllbGROYW1lIDogYXR0ci5uYW1lO1xuICAgICAgICBsZXQgdmFsdWU6IGFueSA9IGF0dHIuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkID0gYXR0ci5jb21wdXRlZDtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbiA9IGF0dHIubmF2aWdhdGlvbjtcbiAgICAgICAgY29uc3QgY29uY3VycmVuY3kgPSBhdHRyLmNvbmN1cnJlbmN5O1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBPRGF0YU1vZGVsPGFueT4pLnRvRW50aXR5KHtcbiAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzX29ubHkgJiYgISFuYXZpZ2F0aW9uLFxuICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVfa2V5ICYmICEhbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS50b0VudGl0aWVzKHtcbiAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzX29ubHkgJiYgISFuYXZpZ2F0aW9uLFxuICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVfa2V5ICYmICEhbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlX2NvbmN1cnJlbmN5ICYmIGNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZV9jb21wdXRlZCAmJiBjb21wdXRlZCkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZXNfb25seSAmJiBhdHRyLmlzQ2hhbmdlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNoYW5nZXNfb25seSAmJiAhY29uY3VycmVuY3kgJiYgIWNvbXB1dGVkKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcblxuICAgIGlmIChpbmNsdWRlX25vbl9maWVsZCkge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkpO1xuICAgICAgLy8gQXR0cmlidXRlcyBmcm9tIG9iamVjdCAoYXR0cmlidXRlcyBmb3Igb2JqZWN0KVxuICAgICAgY29uc3Qgbm9uRmllbGRBdHRycyA9IE9iamVjdC5lbnRyaWVzKHNlbGYpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICAgIG5hbWVzLmluZGV4T2YoaykgPT09IC0xICYmICFrLnN0YXJ0c1dpdGgoJ18nKSAmJiAhay5lbmRzV2l0aCgnJCcpLFxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgW2ssIHZdKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBba106IHYgfSksIHt9KTtcbiAgICAgIGVudGl0eSA9IHsgLi4uZW50aXR5LCAuLi5ub25GaWVsZEF0dHJzIH07XG4gICAgfVxuXG4gICAgLy8gQWRkIGNsaWVudF9pZFxuICAgIGlmIChjbGllbnRfaWQpIHtcbiAgICAgICg8YW55PmVudGl0eSlbdGhpcy5jaWRdID0gKDxhbnk+c2VsZilbdGhpcy5jaWRdO1xuICAgIH1cblxuICAgIC8vIEFkZCBrZXlcbiAgICBpZiAoaW5jbHVkZV9rZXkpIHtcbiAgICAgIGVudGl0eSA9IHtcbiAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAuLi4odGhpcy5yZXNvbHZlS2V5KHNlbGYsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZTogZmFsc2UgfSkgYXMge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdHlwZVxuICAgIGlmIChcbiAgICAgIHNlbGYuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgKChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHNlbGYuX3BhcmVudFswXSkgJiZcbiAgICAgICAgKHNlbGYuX3BhcmVudFsxXSBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PikubWV0YSAhPT0gc2VsZi5fbWV0YSkgfHxcbiAgICAgICAgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihzZWxmLl9wYXJlbnRbMF0pICYmXG4gICAgICAgICAgKHNlbGYuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS5fbW9kZWxcbiAgICAgICAgICAgIC5tZXRhICE9PSBzZWxmLl9tZXRhKSlcbiAgICApIHtcbiAgICAgIGVudGl0eVt0aGlzLmFwaS5vcHRpb25zLmhlbHBlci5PREFUQV9UWVBFXSA9IGAjJHt0aGlzLnNjaGVtYS50eXBlKCl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5IGFzIFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfVxuXG4gIHJlc2V0KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBuYW1lLCBzaWxlbnQgPSBmYWxzZSB9OiB7IG5hbWU/OiBzdHJpbmc7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICBsZXQgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCB2YWx1ZVxuICAgICAgY29uc3QgYXR0cmlidXRlID0gc2VsZi5fYXR0cmlidXRlcy5nZXQobmFtZSk7XG4gICAgICBpZiAoXG4gICAgICAgIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGF0dHJpYnV0ZS5pc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb246IHRydWUgfSlcbiAgICAgICkge1xuICAgICAgICBhdHRyaWJ1dGUucmVzZXQoKTtcbiAgICAgICAgY2hhbmdlcyA9IFtuYW1lXTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlPy5pc0NoYW5nZWQoKSkge1xuICAgICAgICBhdHRyaWJ1dGUucmVzZXQoKTtcbiAgICAgICAgY2hhbmdlcyA9IFtuYW1lXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZXQgYWxsXG4gICAgICBjaGFuZ2VzID0gWy4uLnNlbGYuX2F0dHJpYnV0ZXMua2V5cygpXTtcbiAgICAgIC8vc2VsZi5fY2hhbmdlcy5jbGVhcigpO1xuICAgICAgc2VsZi5fYXR0cmlidXRlcy5mb3JFYWNoKChhdHRyLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGF0dHIuaXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlIH0pKSB7XG4gICAgICAgICAgYXR0ci5yZXNldCgpO1xuICAgICAgICAgIGNoYW5nZXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFzaWxlbnQgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzZWxmLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlJlc2V0LCB7IG9wdGlvbnM6IHsgY2hhbmdlcyB9IH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHNlbGYuX3Jlc2V0ID0gcmVzZXQ7XG4gICAgc2VsZi5fcmVwYXJlbnQgPSByZXBhcmVudDtcbiAgICBzZWxmLl9zaWxlbnQgPSBzaWxlbnQ7XG5cbiAgICBjb25zdCBjaGFuZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQXBwbHkgZW50aXR5XG4gICAgY29uc3QgbW9kZWwgPSBzZWxmIGFzIGFueTtcbiAgICBPYmplY3QuZW50cmllcyhlbnRpdHkpXG4gICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpIC8vIEZpbHRlciB1bmRlZmluZWRcbiAgICAgIC5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcyh7XG4gICAgICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSkuZmluZChcbiAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PlxuICAgICAgICAgICAgKHNlbGYuX3Jlc2V0ICYmIGZpZWxkLmZpZWxkID09PSBrZXkpIHx8IGZpZWxkLm5hbWUgPT09IGtleSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIERlbGVnYXRlZCB0byBwcml2YXRlIHNldHRlclxuICAgICAgICAgIGlmICh0aGlzLnNldChzZWxmLCBmaWVsZCwgdmFsdWUpKSB7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goZmllbGQubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEJhc2ljIGFzc2lnbm1lbnRcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gbW9kZWxba2V5XTtcbiAgICAgICAgICBtb2RlbFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IHZhbHVlKSBjaGFuZ2VzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAoKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB8fCBzZWxmLl9yZXNldCkge1xuICAgICAgc2VsZi5ldmVudHMkLnRyaWdnZXIoXG4gICAgICAgIHNlbGYuX3Jlc2V0ID8gT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCA6IE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLFxuICAgICAgICB7IG9wdGlvbnM6IHsgY2hhbmdlcyB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICBzZWxmLl9yZXNldCA9IGZhbHNlO1xuICAgIHNlbGYuX3JlcGFyZW50ID0gZmFsc2U7XG4gICAgc2VsZi5fc2lsZW50ID0gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgaXNNb2RlbChvYmo6IGFueSkge1xuICAgIHJldHVybiBUeXBlcy5yYXdUeXBlKG9iaikgPT09ICdNb2RlbCc7XG4gIH1cblxuICBzdGF0aWMgaXNDb2xsZWN0aW9uKG9iajogYW55KSB7XG4gICAgcmV0dXJuIFR5cGVzLnJhd1R5cGUob2JqKSA9PT0gJ0NvbGxlY3Rpb24nO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ29sbGVjdGlvbjxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgY29sbGVjdGlvbjogT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgIHZhbHVlOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdLFxuICApIHtcbiAgICBjb2xsZWN0aW9uLl9hbm5vdGF0aW9ucyA9IGZpZWxkLmFubm90YXRpb25zRmFjdG9yeShcbiAgICAgIHNlbGYuYW5ub3RzKCksXG4gICAgKSBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8Rj47XG4gICAgY29sbGVjdGlvbi5hc3NpZ24odmFsdWUgYXMgUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgcmVwYXJlbnQ6IHNlbGYuX3JlcGFyZW50LFxuICAgICAgc2lsZW50OiBzZWxmLl9zaWxlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTW9kZWw8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPEY+LFxuICAgIHZhbHVlOiBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICkge1xuICAgIG1vZGVsLl9hbm5vdGF0aW9ucyA9IGZpZWxkLmFubm90YXRpb25zRmFjdG9yeShcbiAgICAgIHNlbGYuYW5ub3RzKCksXG4gICAgKSBhcyBPRGF0YUVudGl0eUFubm90YXRpb25zPEY+O1xuICAgIG1vZGVsLmFzc2lnbih2YWx1ZSBhcyBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sIHtcbiAgICAgIHJlc2V0OiBzZWxmLl9yZXNldCxcbiAgICAgIHJlcGFyZW50OiBzZWxmLl9yZXBhcmVudCxcbiAgICAgIHNpbGVudDogc2VsZi5fc2lsZW50LFxuICAgIH0pO1xuICAgIHJldHVybiBtb2RlbC5oYXNDaGFuZ2VkKCk7XG4gIH1cblxuICBnZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+IHwgc3RyaW5nLFxuICApOiBGIHwgT0RhdGFNb2RlbDxGPiB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PiB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGF0dHIgPSBzZWxmLl9hdHRyaWJ1dGVzLmdldChcbiAgICAgIGZpZWxkIGluc3RhbmNlb2YgT0RhdGFNb2RlbEZpZWxkID8gZmllbGQubmFtZSA6IGZpZWxkLFxuICAgICk7XG4gICAgaWYgKGF0dHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBhdHRyLmdldCgpO1xuICAgICAgaWYgKFxuICAgICAgICAoYXR0ci5uYXZpZ2F0aW9uICYmIHZhbHVlID09PSBudWxsKSB8fFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciByZWZlcmVuY2VcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlZCA9IHRoaXMucmVzb2x2ZVJlZmVyZW5jZWQoc2VsZiwgYXR0cik7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiByZWZlcmVuY2VkICE9PSBudWxsICYmIHJlZmVyZW5jZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICh2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+KS5hc3NpZ24ocmVmZXJlbmNlZCBhcyBQYXJ0aWFsPEY+LCB7XG4gICAgICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgcmVmZXJlbmNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIE5ldyB2YWx1ZSBpcyBudWxsXG4gICAgICAgICAgKGF0dHIgYXMgT0RhdGFNb2RlbEF0dHJpYnV0ZTxGPikuc2V0KG51bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsICYmIHJlZmVyZW5jZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBOZXcgdmFsdWUgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgKGF0dHIgYXMgT0RhdGFNb2RlbEF0dHJpYnV0ZTxGPikuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJyAmJlxuICAgICAgIWZpZWxkLnN0YXJ0c1dpdGgoJ18nKSAmJlxuICAgICAgIWZpZWxkLmVuZHNXaXRoKCckJylcbiAgICApIHtcbiAgICAgIHJldHVybiAoc2VsZiBhcyBhbnkpW2ZpZWxkXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHNldDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4gfCBzdHJpbmcsXG4gICAgdmFsdWU6XG4gICAgICB8IEZcbiAgICAgIHwgRltdXG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgIHwgbnVsbCxcbiAgICB7IHR5cGUgfTogeyB0eXBlPzogc3RyaW5nIH0gPSB7fSxcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IG1vZGVsRmllbGQgPVxuICAgICAgZmllbGQgaW5zdGFuY2VvZiBPRGF0YU1vZGVsRmllbGQgPyBmaWVsZCA6IHRoaXMuZmluZEZpZWxkPEY+KGZpZWxkKTtcbiAgICBpZiAoXG4gICAgICBtb2RlbEZpZWxkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuaXNPcGVuVHlwZSgpICYmXG4gICAgICB0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnXG4gICAgKSB7XG4gICAgICB0eXBlID0gdHlwZSA/PyAodGhpcy50c1RvRWRtW3R5cGVvZiB2YWx1ZV0gYXMgRWRtVHlwZSkgPz8gJyc7XG4gICAgICBtb2RlbEZpZWxkID0gdGhpcy5tb2RlbEZpZWxkRmFjdG9yeTxGPihzZWxmLCBmaWVsZCwgdHlwZSk7XG4gICAgfVxuICAgIGlmIChtb2RlbEZpZWxkID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpZWxkIHdpdGggbmFtZSAke2ZpZWxkIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgbGV0IGF0dHIgPSBzZWxmLl9hdHRyaWJ1dGVzLmdldChtb2RlbEZpZWxkLm5hbWUpO1xuXG4gICAgLy8gRW5zdXJlcyB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzXG4gICAgaWYgKGF0dHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXR0ciA9IG5ldyBPRGF0YU1vZGVsQXR0cmlidXRlKHNlbGYsIG1vZGVsRmllbGQpO1xuICAgICAgdGhpcy5fbGluayhzZWxmLCBhdHRyKTtcbiAgICAgIHNlbGYuX2F0dHJpYnV0ZXMuc2V0KG1vZGVsRmllbGQubmFtZSwgYXR0cik7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGF0dHIuZ2V0KCk7XG5cbiAgICBpZiAobW9kZWxGaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBOZXcgdmFsdWUgaXMgbnVsbFxuICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQodmFsdWUgYXMgbnVsbCwgc2VsZi5fcmVzZXQsIHNlbGYuX3JlcGFyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKGN1cnJlbnQpKSB7XG4gICAgICAgIC8vIEN1cnJlbnQgaXMgY29sbGVjdGlvblxuICAgICAgICBsZXQgY3VycmVudENvbGxlY3Rpb24gPSBjdXJyZW50IGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PjtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBOZXcgdmFsdWUgaXMgY29sbGVjdGlvblxuICAgICAgICAgIGNoYW5nZWQgPSBhdHRyLnNldChcbiAgICAgICAgICAgIHZhbHVlIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PixcbiAgICAgICAgICAgIHNlbGYuX3Jlc2V0LFxuICAgICAgICAgICAgc2VsZi5fcmVwYXJlbnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChUeXBlcy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIC8vIE5ldyB2YWx1ZSBpcyBhcnJheVxuICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLl91cGRhdGVDb2xsZWN0aW9uPEY+KFxuICAgICAgICAgICAgc2VsZixcbiAgICAgICAgICAgIG1vZGVsRmllbGQsXG4gICAgICAgICAgICBjdXJyZW50Q29sbGVjdGlvbixcbiAgICAgICAgICAgIHZhbHVlIGFzIFRbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpKSB7XG4gICAgICAgIC8vIEN1cnJlbnQgaXMgbW9kZWxcbiAgICAgICAgbGV0IGN1cnJlbnRNb2RlbCA9IGN1cnJlbnQgYXMgT0RhdGFNb2RlbDxGPjtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIG1vZGVsXG4gICAgICAgICAgY2hhbmdlZCA9IGF0dHIuc2V0KFxuICAgICAgICAgICAgdmFsdWUgYXMgT0RhdGFNb2RlbDxGPixcbiAgICAgICAgICAgIHNlbGYuX3Jlc2V0LFxuICAgICAgICAgICAgc2VsZi5fcmVwYXJlbnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLl91cGRhdGVNb2RlbDxGPihcbiAgICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgICBtb2RlbEZpZWxkLFxuICAgICAgICAgICAgY3VycmVudE1vZGVsLFxuICAgICAgICAgICAgdmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEN1cnJlbnQgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBtb2RlbC9jb2xsZWN0aW9uIGZvciBnaXZlbiB2YWx1ZVxuICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQoXG4gICAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSB8fFxuICAgICAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSlcbiAgICAgICAgICAgID8gKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4pXG4gICAgICAgICAgICA6IG1vZGVsRmllbGQuY29sbGVjdGlvblxuICAgICAgICAgICAgPyBtb2RlbEZpZWxkLmNvbGxlY3Rpb25GYWN0b3J5PEY+KHtcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHNlbGYsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlIGFzIEZbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sXG4gICAgICAgICAgICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBtb2RlbEZpZWxkLm1vZGVsRmFjdG9yeTxGPih7XG4gICAgICAgICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICByZXNldDogc2VsZi5fcmVzZXQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIHNlbGYuX3Jlc2V0LFxuICAgICAgICAgIHNlbGYuX3JlcGFyZW50LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHJlZmVyZW50aWFsc1xuICAgICAgaWYgKCFPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oYXR0ci5nZXQoKSkpIHtcbiAgICAgICAgbGV0IHJlZiA9IG1vZGVsRmllbGQubWV0YT8ucmVzb2x2ZVJlZmVyZW50aWFsKGF0dHIuZ2V0KCksIGF0dHIpO1xuICAgICAgICBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxmLCByZWYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWQgPSBhdHRyLnNldCh2YWx1ZSwgc2VsZi5fcmVzZXQsIHNlbGYuX3JlcGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGYuX3NpbGVudCAmJiBjaGFuZ2VkKSB7XG4gICAgICBzZWxmLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkNoYW5nZSwge1xuICAgICAgICBhdHRyLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcHJldmlvdXM6IGN1cnJlbnQsXG4gICAgICAgIG9wdGlvbnM6IHsga2V5OiBtb2RlbEZpZWxkLmlzS2V5KCkgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGluazxGPihzZWxmOiBPRGF0YU1vZGVsPFQ+LCBhdHRyOiBPRGF0YU1vZGVsQXR0cmlidXRlPEY+KSB7XG4gICAgYXR0ci5ldmVudHMkLnN1YnNjcmliZSgoZXZlbnQ6IE9EYXRhTW9kZWxFdmVudDxhbnk+KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuY2FuQ29udGludWVXaXRoKHNlbGYpKSB7XG4gICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gYXR0ci5nZXQoKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50Lm5hbWUgPT09IE9EYXRhTW9kZWxFdmVudFR5cGUuQ2hhbmdlICYmXG4gICAgICAgICAgICBhdHRyLm5hdmlnYXRpb24gJiZcbiAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnM/LmtleVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbGV0IHJlZiA9IChhdHRyLmdldCgpIGFzIE9EYXRhTW9kZWw8YW55PikucmVmZXJlbnRpYWwoYXR0cik7XG4gICAgICAgICAgICBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2VsZiwgcmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChldmVudC5wdXNoKHNlbGYsIGF0dHIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
1169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixjQUFjLEdBQ2YsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBR0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsK0JBQStCLEVBQy9CLHFCQUFxQixHQUt0QixNQUFNLGNBQWMsQ0FBQztBQU10QixPQUFPLEVBQUUsT0FBTyxFQUF5QixNQUFNLFVBQVUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxNQUFNLENBQU4sSUFBWSxtQkFZWDtBQVpELFdBQVksbUJBQW1CO0lBQzdCLHdDQUFpQixDQUFBO0lBQ2pCLHNDQUFlLENBQUE7SUFDZix3Q0FBaUIsQ0FBQTtJQUNqQixvQ0FBYSxDQUFBO0lBQ2IsMENBQW1CLENBQUE7SUFDbkIsa0NBQVcsQ0FBQTtJQUNYLHdDQUFpQixDQUFBO0lBQ2pCLDBDQUFtQixDQUFBO0lBQ25CLDBDQUFtQixDQUFBO0lBQ25CLG9DQUFhLENBQUE7SUFDYix3Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBWlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQVk5QjtBQUVELE1BQU0sT0FBTyxlQUFlO0lBTTFCLFlBQ0UsSUFBa0MsRUFDbEMsRUFDRSxLQUFLLEVBQ0wsVUFBVSxFQUNWLFFBQVEsRUFDUixLQUFLLEVBQ0wsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxNQWFILEVBQUU7UUFFTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSTtZQUNwQjtnQkFDRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FFUztnQkFDdkMsSUFBSSxJQUFJLElBQUk7YUFDYjtTQUNGLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBT0QsSUFBSSxDQUNGLEtBQThELEVBQzlELElBQXVDO1FBRXZDLE9BQU8sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNwQyxLQUFLLEVBQ0gsSUFBSSxDQUFDLEtBQUs7Z0JBQ1YsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBRSxLQUF5QixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDeEUsVUFBVSxFQUNSLElBQUksQ0FBQyxVQUFVO2dCQUNmLENBQUMsS0FBSyxZQUFZLGVBQWU7b0JBQy9CLENBQUMsQ0FBRSxLQUErQztvQkFDbEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxHQUFHLElBQUksQ0FBQyxPQUFPO2dCQUNmLEtBQUssRUFBRSxJQUFJLFlBQVksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7YUFDOUQ7WUFDRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3RDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUE4RDtRQUNwRSxPQUFPLENBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQy9DLENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZSxDQUFDLElBQXVEO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDdkIsT0FBTyxJQUFJLEtBQUssUUFBUTtZQUN0QixDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUc7WUFDYixDQUFDLENBQUMsSUFBSSxZQUFZLG1CQUFtQjtnQkFDbkMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO29CQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDWCxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNuQixDQUFDLENBQUMsRUFBRSxDQUNUO2FBQ0EsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUlELDRDQUE0QztJQUM1QyxJQUFJLFlBQVk7UUFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsT0FBTyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsQ0FBQyxDQUFxQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdkUsQ0FBQztJQUlELGlEQUFpRDtJQUNqRCxJQUFJLGlCQUFpQjtRQUNuQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTyxJQUFJLEtBQUssU0FBUztZQUN2QixDQUFDLENBQUUsSUFBSSxDQUFDLENBQUMsQ0FBMkM7WUFDcEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sc0JBQTBCLFNBQVEsWUFFOUM7SUFJQyxZQUFZLEVBQ1YsS0FBSyxFQUNMLFVBQVUsTUFJUixFQUFFO1FBQ0osS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztNQU1FO0lBRUYsT0FBTyxDQUNMLElBQWtDLEVBQ2xDLEVBQ0UsVUFBVSxFQUNWLFFBQVEsRUFDUixLQUFLLEVBQ0wsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLE1BUUwsRUFBRTtRQUVOLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDaEMsSUFBSSxDQUFDLElBQUksQ0FDUCxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFVBQVUsRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVU7WUFDekMsUUFBUTtZQUNSLEtBQUs7WUFDTCxJQUFJO1lBQ0osT0FBTztZQUNQLE9BQU87U0FDUixDQUFDLENBQ0gsQ0FBQztRQUNKLElBQUksSUFBSSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUM3QyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEI7U0FDRjthQUFNO1lBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFxQztJQUN2RCxtQkFBbUIsQ0FBQyxNQUFNO0lBQzFCLG1CQUFtQixDQUFDLEtBQUs7SUFDekIsbUJBQW1CLENBQUMsTUFBTTtJQUMxQixtQkFBbUIsQ0FBQyxPQUFPO0lBQzNCLG1CQUFtQixDQUFDLEdBQUc7SUFDdkIsbUJBQW1CLENBQUMsTUFBTTtDQUMzQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLG1CQUFtQixFQUFFLElBQUk7SUFDekIsZ0JBQWdCLEVBQUUsSUFBSTtJQUN0QixXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixHQUFHLGVBQWU7Q0FDbkIsQ0FBQztBQUVGLE1BQU0sQ0FBTixJQUFZLGVBSVg7QUFKRCxXQUFZLGVBQWU7SUFDekIsdURBQUssQ0FBQTtJQUNMLDJEQUFPLENBQUE7SUFDUCwrREFBUyxDQUFBO0FBQ1gsQ0FBQyxFQUpXLGVBQWUsS0FBZixlQUFlLFFBSTFCO0FBb0JELE1BQU0sVUFBVSxLQUFLLENBQUMsRUFBRSxHQUFHLEdBQUcsY0FBYyxLQUF1QixFQUFFO0lBQ25FLE9BQU8sQ0FBd0MsV0FBYyxFQUFFLEVBQUU7UUFDL0QsTUFBTSxLQUFLLEdBQVEsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUNsQyxLQUFLLENBQUMsT0FBTyxHQUFHO2dCQUNkLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBNkI7YUFDN0IsQ0FBQztRQUNwQixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDeEIsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsRUFDekIsSUFBSSxFQUNKLEdBQUcsT0FBTyxLQUMrQixFQUFFO0lBQzNDLE9BQU8sQ0FBQyxNQUFXLEVBQUUsR0FBVyxFQUFRLEVBQUU7UUFDeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDbEMsS0FBSyxDQUFDLE9BQU8sR0FBRztnQkFDZCxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQTZCO2FBQzdCLENBQUM7UUFDcEIsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDO1FBQzVCLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVFELE1BQU0sT0FBTyxlQUFlO0lBZ0IxQixZQUNFLE9BQStCLEVBQy9CLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQTZCO1FBRTNELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsY0FBYyxDQUFJLElBQXFCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUksSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUNSLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsT0FBTyxHQUtSO1FBQ0MsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQzdCLElBQUksV0FBVztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsVUFBVTtRQUNSLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNqQixDQUFDO1FBQ0YsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxjQUFjO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RSxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSTtRQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLFFBQVE7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFFBQVEsQ0FDTixLQUFVLEVBQ1YsRUFDRSxNQUFNLEVBQ04sVUFBVSxHQUFHLEtBQUssTUFJaEIsRUFBRTtRQUVOLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUMzRTthQUFNLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hELE9BQU8sS0FBSztpQkFDVCxNQUFNLEVBQUU7aUJBQ1IsSUFBSSxDQUFDLENBQUMsQ0FBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUNmO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFVLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxRSxJQUNFLElBQUksQ0FBQyxRQUFRO2dCQUNiLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksc0NBQXNDO2dCQUMxRyxDQUFDLENBQUMsUUFBUSxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyx1Q0FBdUM7Y0FDMUU7Z0JBQ0EsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsSUFDRSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVM7Z0JBQzVCLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3pCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFDN0I7Z0JBQ0EsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsSUFDRSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVM7Z0JBQzVCLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3pCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFDN0I7Z0JBQ0EsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsSUFDRSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVM7Z0JBQ3RCLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUNoQjtnQkFDQSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkI7WUFDRCxJQUNFLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUztnQkFDdEIsT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFDekIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQ2hCO2dCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QjtZQUNELElBQ0UsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO2dCQUMxQixPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUN6QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUN6QjtnQkFDQSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDM0I7WUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDcEQ7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTO1lBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVUsRUFBRSxPQUF1QjtRQUM3QyxNQUFNLGFBQWEsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQVEsRUFBRSxPQUF1QjtRQUN6QyxNQUFNLGFBQWEsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQVEsRUFBRSxPQUF1QjtRQUN0QyxNQUFNLGFBQWEsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsZUFBZSxDQUNiLElBQXNCO1FBRXRCLElBQ0UsQ0FBQyxDQUNDLElBQUksWUFBWSxtQkFBbUI7WUFDbkMsSUFBSSxZQUFZLCtCQUErQjtZQUMvQyxJQUFJLFlBQVkscUJBQXFCLENBQ3RDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLFVBQVU7WUFDcEIsQ0FBQyxDQUFFLElBQStCLENBQUMsa0JBQWtCLENBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUUsQ0FBQyxDQUFFLElBQStCLENBQUMsUUFBUSxDQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGtCQUFrQixDQUNoQixJQUErQjtRQUUvQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQWUsRUFBRSxZQUFZLENBQUM7WUFDMUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELGFBQWEsQ0FDWCxJQUE0QjtRQUU1QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsWUFBWSxDQUFJLEVBQ2QsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEdBS047UUFDQyxRQUFRO1FBQ1IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNwQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQ2EsQ0FBQztRQUMvQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7UUFFRCxJQUFJLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3JELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUMvQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFjLENBQUMsQ0FDbEMsRUFBRSxNQUFNLENBQUM7WUFDVixJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUNwRCx3QkFBd0I7Z0JBQ3hCLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQXlDLEVBQUU7WUFDdEUsTUFBTTtZQUNOLEtBQUs7WUFDTCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBSSxFQUNuQixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssR0FLTjtRQUNDLHFCQUFxQjtRQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3BDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDZSxDQUFDO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLFVBQVUsS0FBSyxTQUFTO1lBQzFCLE1BQU0sS0FBSyxDQUFDLDBCQUEwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksVUFBVSxDQUNuQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQTZDLEVBQ3pEO1lBQ0UsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLO1lBQ0wsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztTQUN2QixDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sbUJBQW1CO0lBTTlCLFlBQ1UsTUFBdUIsRUFDdkIsTUFBMEI7UUFEMUIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFKcEMsWUFBTyxHQUFHLElBQUksc0JBQXNCLEVBQUssQ0FBQztJQUt0QyxDQUFDO0lBRUwsSUFBSSxVQUFVO1FBQ1osT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBVSxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsR0FBRztRQU1ELE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDOUQsQ0FBQztJQUVELEdBQUcsQ0FDRCxLQUthLEVBQ2IsUUFBaUIsS0FBSyxFQUN0QixXQUFvQixLQUFLO1FBRXpCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUUzQixJQUNFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDbEMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUV2QyxJQUFJLENBQUMsTUFBTSxDQUNULE9BQTREO1lBQzVELHdCQUF3QjthQUN6QixDQUFDO1FBRUosTUFBTSxPQUFPLEdBQ1gsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUUsT0FBeUIsQ0FBQyxNQUFNLENBQUMsS0FBc0IsQ0FBQztZQUM1RCxDQUFDLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztnQkFDdkMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDckMsQ0FBQyxDQUFDLENBQUUsT0FBNkMsQ0FBQyxNQUFNLENBQ3RELEtBQTBDLENBQzNDO2dCQUNELENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7U0FDekI7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztTQUN6QjthQUFNLElBQUksT0FBTyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBQ0QsSUFDRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2hDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFDckM7WUFDQSxJQUFJLENBQUMsSUFBSSxDQUNQLEtBQTBELEVBQzFELFFBQVEsQ0FDVCxDQUFDO1NBQ0g7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQ1Isa0JBQWtCLEdBQUcsS0FBSyxNQUNVLEVBQUU7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE9BQU8sQ0FDTCxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDekIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFdEMsT0FDRCxDQUFDLFVBQVUsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUs7UUFDSCxJQUNFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3RDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBRTNDLElBQUksQ0FBQyxNQUFNLENBQ1QsSUFBSSxDQUFDLE1BQTJELENBQ2pFLENBQUM7UUFDSixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUNFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBRTFDLElBQUksQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLEtBQTBELENBQ2hFLENBQUM7SUFDTixDQUFDO0lBRU8sSUFBSSxDQUNWLEtBQXdELEVBQ3hELFdBQW9CLEtBQUs7UUFFekIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLFFBQVEsRUFBRTtZQUNaLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFTyxNQUFNLENBQ1osS0FBd0QsRUFDeEQsV0FBb0IsS0FBSztRQUV6QixJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzlCLElBQUksUUFBUSxFQUFFO1lBQ1osS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDdEI7SUFDSCxDQUFDO0NBQ0Y7QUFTRCxNQUFNLE9BQU8saUJBQWlCO0lBWTVCLFlBQVksRUFDVixPQUFPLEVBQ1AsTUFBTSxHQUlQO1FBZE8sWUFBTyxHQUEyQixFQUFFLENBQUM7UUFLN0MsYUFBUSxHQUE2QixFQUFFLENBQUM7UUFDeEMsWUFBTyxHQUFHLElBQUksc0JBQXNCLEVBQUssQ0FBQztRQW9KMUMsWUFBTyxHQUE0QjtZQUNqQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3JCLE1BQU0sRUFBRSxPQUFPLENBQUMsS0FBSztZQUNyQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87U0FDekIsQ0FBQztRQWhKQSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUM7UUFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFNLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxLQUEwQixFQUFFO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBbUM7UUFDNUMsa0JBQWtCO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3ZDLE1BQWlDLENBQ2xDLENBQUM7UUFDRixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzdDLG9CQUFvQjtRQUNwQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQWlDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3hCLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxnQkFBZ0IsQ0FDZCxTQUF1RDtRQUV2RCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNqQyxJQUFJLEtBQXlDLENBQUM7UUFDOUMsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzlCLEtBQUssR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRSxNQUFNO1NBQ2hDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQ1IsT0FBTyxFQUNQLGFBQWEsRUFDYixrQkFBa0IsR0FLbkI7UUFDQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUEyQixDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksaUJBQWlCLEdBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsaUJBQWlCO2dCQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFXLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3pFO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM3QixNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLEtBQUssQ0FBQyxTQUFTLENBQUM7Z0JBQ2Qsa0JBQWtCO2dCQUNsQixXQUFXO2dCQUNYLE9BQU87YUFDUixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsRUFDTCxrQkFBa0IsRUFDbEIsZUFBZSxHQUloQjtRQUNDLE9BQU87WUFDTCxHQUFHLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztnQkFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLENBQUM7Z0JBQzdELENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNwQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsa0JBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUNuRDtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFJLElBQXNCO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUksSUFBSSxDQUFDLENBQUM7UUFDdEMsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsSUFBYyxFQUFFLENBQUMsQ0FBQztRQUNwRSxPQUFPLEtBQTJCLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVMsQ0FBSSxJQUFzQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDakIsZUFBZSxFQUFFLElBQUk7WUFDckIsa0JBQWtCLEVBQUUsSUFBSTtTQUN6QixDQUFDLENBQUMsSUFBSSxDQUNMLENBQUMsVUFBOEIsRUFBRSxFQUFFLENBQ2pDLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUN0QixDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRLENBQUksSUFBWSxFQUFFLE9BQTBCO1FBQ2xELE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzNDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssU0FBUztZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFJLEtBQWdCLENBQUMsQ0FBQztRQUNyRSxJQUFJLFdBQVcsS0FBSyxTQUFTO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLENBQUksSUFBSSxFQUFFO1lBQzlDLElBQUk7WUFDSixLQUFLO1lBQ0wsTUFBTSxFQUFFLFdBQVc7WUFDbkIsR0FBRyxJQUFJO1NBQ1IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUIsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQVFPLGlCQUFpQixDQUN2QixJQUFtQixFQUNuQixJQUFZLEVBQ1osSUFBc0I7UUFFdEIsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQztZQUM5QixrQkFBa0IsRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDdkUsYUFBYSxFQUFFLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3ZFLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU87U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBSSxJQUFJLEVBQUU7WUFDeEMsS0FBSyxFQUFFLElBQUk7WUFDWCxNQUFNLEVBQUUscUJBQXFCO1NBQzlCLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDbkIsa0JBQWtCLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQ3ZFLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRTtZQUMzQyxZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBa0MsQ0FBQztZQUM3RCxHQUFHLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFrQyxFQUFFLEtBQUssQ0FBQztTQUM1RCxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUNKLElBQW1CLEVBQ25CLFFBSTZCO1FBRTdCLElBQ0UsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJO1lBQ3ZCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtZQUN6QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUVyQyxNQUFNLElBQUksS0FBSyxDQUNiLGdCQUFnQixRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM5RCxDQUFDO1FBRUosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMvQixJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtnQkFDL0MsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLEtBQUssRUFBRSxRQUFRO2FBQ2hCLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixNQUFNLENBQUMsS0FBSyxDQUNWLEtBQThEO1FBSzlELE1BQU0sS0FBSyxHQUFHLEVBQVcsQ0FBQztRQUMxQixJQUFJLEtBQUssR0FLRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDckIsTUFBTSxNQUFNLEdBQUcsS0FHZCxDQUFDO1lBQ0YsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE1BQU07WUFDakQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FDYixLQUF3RDtRQUV4RCxJQUFJLFFBQVEsR0FBOEIsSUFBSSxDQUFDO1FBQy9DLElBQUksU0FBUyxHQUFnQyxJQUFJLENBQUM7UUFDbEQsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzRCxRQUFRLEdBQUcsUUFBUSxJQUFLLEtBQUssQ0FBQyxTQUE4QixDQUFDO1lBQzdELElBQUksUUFBUSxLQUFLLElBQUk7Z0JBQUUsTUFBTTtZQUM3QixJQUNFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQzVDO2dCQUNBLE1BQU0sQ0FBQyxHQUFHLEtBQXdCLENBQUM7Z0JBQ25DLGtEQUFrRDtnQkFDbEQsUUFBUTtnQkFDUjs7Ozs7OztrQkFPRTtnQkFDRixjQUFjO2dCQUNkLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQW1CLENBQUM7Z0JBQzlELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtvQkFDdEIsUUFBUTt3QkFDTixRQUFRLFlBQVksc0JBQXNCOzRCQUN4QyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7NEJBQ3ZCLENBQUMsQ0FBRSxRQUFtQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdEQ7YUFDRjtZQUNELFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO2dCQUM5Qyw2Q0FBNkM7Z0JBQzdDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDM0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUNoRCxDQUFDO2FBQ0g7aUJBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBVyxRQUFRLENBQUMsQ0FBQzthQUN0RDtTQUNGO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELHlCQUF5QixDQUN2QixLQUE0QjtRQU01QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlDLE9BQU8sc0JBQXNCLENBQUMsT0FBTyxDQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDakQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxvQkFBb0IsQ0FDbEIsS0FBNEI7UUFPNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELElBQUksUUFBUSxZQUFZLHNCQUFzQjtZQUFFLE9BQU8sUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pFLE9BQU8sUUFLQyxDQUFDO0lBQ1gsQ0FBQztJQUNELFlBQVk7SUFFWixJQUFJLENBQ0YsSUFBbUIsRUFDbkIsRUFDRSxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sTUFRSixFQUFFO1FBRU4sU0FBUztRQUNULElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBELFNBQVM7UUFDVCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7UUFFRCxXQUFXO1FBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUztZQUNqRCxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDekMsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLENBQUMsTUFBTSxDQUNULElBQUksRUFDSixRQUkyQixDQUM1QixDQUFDO1NBQ0g7UUFFRCxjQUFjO1FBQ2QsSUFBSSxDQUFDLFlBQVk7WUFDZixNQUFNLElBQUksSUFBSSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUVyRSxTQUFTO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNWLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RDLFlBQVksRUFBRSxJQUFJO2dCQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBNkIsQ0FBQztnQkFDeEQsR0FBRyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBNkIsRUFBRSxLQUFLLENBQUM7YUFDdkQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUNILElBQW1CLEVBQ25CLFFBSTZCLEVBQzdCLElBQTBFO1FBRTFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUNSLEtBQWtELEVBQ2xELEVBQ0UsYUFBYSxHQUFHLEtBQUssRUFDckIsT0FBTyxHQUFHLElBQUksRUFDZCxNQUFNLEdBQUcsSUFBSSxNQUN1RCxFQUFFO1FBRXhFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUNuQyxLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsR0FBRyxLQUFZLENBQUM7WUFDckIsSUFBSSxPQUFPLEdBQUcsSUFBOEIsQ0FBQztZQUM3QyxJQUFJLEtBQXVDLENBQUM7WUFDNUMsS0FBSyxNQUFNLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckMsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFBRSxNQUFNO2dCQUNqQyxLQUFLLEdBQUcsT0FBTztxQkFDWixNQUFNLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO3FCQUM1RCxJQUFJLENBQUMsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQ3ZCLENBQUM7d0JBQ0MsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzRCQUNwRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7NEJBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDUixPQUFPLEdBQUcsS0FBSyxDQUFDLElBQThCLENBQUM7aUJBQ2hEO2FBQ0Y7WUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQzFDLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNwRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUM1QyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNsQjtRQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDckMsT0FBTyxPQUFPO1lBQ1osQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGtCQUFrQixDQUNoQixLQUF5RCxFQUN6RCxJQUFxRCxFQUNyRCxFQUNFLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLE9BQU8sR0FBRyxJQUFJLEVBQ2QsTUFBTSxHQUFHLEtBQUssTUFDc0QsRUFBRTtRQUV4RSxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBQzNDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN2QixrQkFBa0IsRUFBRSxLQUFLO2dCQUN6QixlQUFlLEVBQUUsSUFBSTthQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPO2lCQUNwQixNQUFNLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUM1RCxJQUFJLENBQUMsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRTtnQkFDMUMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNoRCxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUssS0FBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO1lBQ3hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsT0FBTyxPQUFPO1lBQ1osQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGlCQUFpQixDQUNmLEtBQXlELEVBQ3pELElBQXFELEVBQ3JELEVBQ0UsYUFBYSxHQUFHLEtBQUssRUFDckIsT0FBTyxHQUFHLElBQUksRUFDZCxNQUFNLEdBQUcsS0FBSyxNQUNzRCxFQUFFO1FBRXhFLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFDMUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZCLGtCQUFrQixFQUFFLEtBQUs7Z0JBQ3pCLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RSxNQUFNLEVBQUUsR0FBSSxJQUFJLENBQUMsSUFBK0I7aUJBQzdDLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzVELElBQUksQ0FDSCxDQUFDLEtBQTJCLEVBQUUsRUFBRSxDQUM5QixLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxrQkFBa0IsQ0FDekMsQ0FBQztZQUNKLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO2dCQUMxQyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSyxLQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDMUQ7U0FDRjtRQUNELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDdEUsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLE9BQU87WUFDWixDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM1QyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUSxDQUNOLElBQW1CLEVBQ25CLEVBQ0UsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLE1BSWhCLEVBQUU7UUFFTixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3pCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLGtCQUFrQixFQUFFLFVBQVU7U0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2QixNQUFNLEtBQUssR0FBSSxJQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMvQyxPQUFPLElBQUksS0FBSyxTQUFTO2dCQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNWLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdkIsa0JBQWtCLEVBQUUsS0FBSztZQUN6QixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssS0FBSyxTQUFTO2dCQUN4QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNWLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsVUFBVSxDQUNSLElBQW1CLEVBQ25CLEVBQUUsa0JBQWtCLEdBQUcsS0FBSyxLQUF1QyxFQUFFO1FBRXJFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDbEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksa0JBQWtCLENBQUM7YUFDeEQsSUFBSSxDQUNILENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxDQUFDLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUN6QyxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQzdDLENBQUM7SUFFRCxZQUFZLENBQ1YsSUFBTyxFQUNQLFFBS1EsRUFDUixHQUFvQjtRQUVwQixPQUFPO1FBQ1AsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixtQkFBbUI7UUFDbkIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksTUFBTSxZQUFZLFVBQVUsRUFBRTtZQUNoQyxPQUFRLE1BQWMsQ0FBQyxJQUFJLENBQ3pCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osTUFBTTtnQkFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNO1lBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBQ0QsUUFBUSxDQUE2QixJQUFPLEVBQUUsR0FBb0I7UUFDaEUsaUNBQWlDO1FBQ2pDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFLLENBQUM7UUFDNUMsSUFDRSxLQUFLLEtBQUssU0FBUztZQUNuQixJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksZUFBZTtZQUUxQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFLLENBQUM7UUFDckQscUJBQXFCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsUUFBUSxDQUNOLElBQW1CLEVBQ25CLEVBQ0UsU0FBUyxHQUFHLEtBQUssRUFDakIsa0JBQWtCLEdBQUcsS0FBSyxFQUMxQixtQkFBbUIsR0FBRyxLQUFLLEVBQzNCLGdCQUFnQixHQUFHLEtBQUssRUFDeEIsV0FBVyxHQUFHLElBQUksRUFDbEIsVUFBVSxHQUFHLEtBQUssRUFDbEIsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixZQUFZLEdBQUcsS0FBSyxFQUNwQixhQUFhLEdBQUcsS0FBSyxFQUNyQixLQUFLLEdBQUcsRUFBRSxNQVlSLEVBQUU7UUFFTixJQUFJLE1BQU0sR0FBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUM3QyxNQUFNO1FBQ0wsUUFBUTtRQUNSLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQy9DO2FBQ0EsTUFBTTtRQUNMLGVBQWU7UUFDZixDQUFDLElBQUksRUFBRSxFQUFFLENBQ1AsQ0FBQyxZQUFZO1lBQ2IsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUMzRDthQUNBLE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ1AsYUFBYTtRQUNiLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDO1lBQzlELENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FDbkI7YUFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3hELElBQUksS0FBSyxHQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNyQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDcEMsS0FBSyxHQUFJLEtBQXlCLENBQUMsUUFBUSxDQUFDO29CQUMxQyxTQUFTO29CQUNULGtCQUFrQjtvQkFDbEIsbUJBQW1CO29CQUNuQixnQkFBZ0I7b0JBQ2hCLGlCQUFpQjtvQkFDakIsYUFBYTtvQkFDYixZQUFZLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxVQUFVO29CQUMxQyxXQUFXLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxVQUFVO29CQUN4QyxVQUFVLEVBQUUsVUFBVSxJQUFJLENBQUMsQ0FBQyxVQUFVO29CQUN0QyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7aUJBQ3hCLENBQUMsQ0FBQzthQUNKO2lCQUFNLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNoRCxLQUFLLEdBQUksS0FBK0MsQ0FBQyxVQUFVLENBQUM7b0JBQ2xFLFNBQVM7b0JBQ1Qsa0JBQWtCO29CQUNsQixtQkFBbUI7b0JBQ25CLGdCQUFnQjtvQkFDaEIsaUJBQWlCO29CQUNqQixhQUFhO29CQUNiLFlBQVksRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDLFVBQVU7b0JBQzFDLFdBQVcsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDLFVBQVU7b0JBQ3hDLFVBQVUsRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDLFVBQVU7b0JBQ3RDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztpQkFDeEIsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLG1CQUFtQixJQUFJLFdBQVcsRUFBRTtnQkFDdEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUM5QztpQkFBTSxJQUFJLGdCQUFnQixJQUFJLFFBQVEsRUFBRTtnQkFDdkMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUM5QztpQkFBTSxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQzNDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDOUM7aUJBQU0sSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDckQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUM5QztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRVQsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLGlEQUFpRDtZQUNqRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztpQkFDdkMsTUFBTSxDQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ04sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUNwRTtpQkFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUM7U0FDMUM7UUFFRCxnQkFBZ0I7UUFDaEIsSUFBSSxTQUFTLEVBQUU7WUFDUCxNQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFTLElBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDakQ7UUFFRCxVQUFVO1FBQ1YsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLEdBQUc7Z0JBQ1AsR0FBRyxNQUFNO2dCQUNULEdBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFRO2FBQ3BFLENBQUM7U0FDSDtRQUVELFNBQVM7UUFDVCxJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixJQUFJLFFBQVE7b0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzFFLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxXQUFXO1FBQ1gsSUFDRSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7WUFDckIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBMEIsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDOUQsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQTJDLENBQUMsTUFBTTt5QkFDOUQsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM1QjtZQUNBLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDdkU7UUFFRCxPQUFPLE1BQXFDLENBQUM7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FDSCxJQUFtQixFQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxLQUEwQyxFQUFFO1FBRWxFLElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsY0FBYztZQUNkLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLElBQ0UsU0FBUyxLQUFLLFNBQVM7Z0JBQ3ZCLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUNqRDtnQkFDQSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xCO2lCQUFNLElBQUksU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFO2dCQUNqQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xCO1NBQ0Y7YUFBTTtZQUNMLFlBQVk7WUFDWixPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2Qyx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNuQjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMzRTtJQUNILENBQUM7SUFFRCxNQUFNLENBQ0osSUFBbUIsRUFDbkIsTUFBNEMsRUFDNUMsRUFDRSxHQUFHLEdBQUcsSUFBSSxFQUNWLEtBQUssR0FBRyxJQUFJLEVBQ1osTUFBTSxHQUFHLElBQUksRUFDYixLQUFLLEdBQUcsS0FBSyxFQUNiLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLE1BQU0sR0FBRyxLQUFLLE1BUVosRUFBRTtRQUVOLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixHQUFHO1lBQ0gsS0FBSztZQUNMLE1BQU07WUFDTixLQUFLO1lBQ0wsUUFBUTtZQUNSLE1BQU07U0FDUCxDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBRTdCLGFBQWE7UUFDYixNQUFNLEtBQUssR0FBRyxJQUFXLENBQUM7UUFDMUIscUJBQXFCO1FBQ3JCLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsb0JBQW9CO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2FBQ2xCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLG1CQUFtQjthQUM5RCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ3hCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixrQkFBa0IsRUFBRSxJQUFJO2FBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQ0wsQ0FBQyxLQUEyQixFQUFFLEVBQUUsQ0FDOUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUNwRSxDQUFDO1lBRUYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUN2Qiw4QkFBOEI7Z0JBQzlCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO29CQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUI7YUFDRjtpQkFBTTtnQkFDTCxtQkFBbUI7Z0JBQ25CLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDbkIsSUFBSSxPQUFPLEtBQUssS0FBSztvQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFDM0UsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUN6QixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsR0FBRyxFQUFFLEtBQUs7WUFDVixLQUFLLEVBQUUsS0FBSztZQUNaLE1BQU0sRUFBRSxLQUFLO1lBQ2IsS0FBSyxFQUFFLEtBQUs7WUFDWixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQVE7UUFDckIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQztJQUN4QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFRO1FBQzFCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxZQUFZLENBQUM7SUFDN0MsQ0FBQztJQUVELEdBQUcsQ0FDRCxJQUFtQixFQUNuQixLQUFrQztRQUVsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FDL0IsS0FBSyxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUN0RCxDQUFDO1FBQ0YsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUNFLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO2dCQUNuQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ2hDO2dCQUNBLHNCQUFzQjtnQkFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtvQkFDcEUsS0FBdUIsQ0FBQyxNQUFNLENBQUMsVUFBd0IsRUFBRTt3QkFDeEQsTUFBTSxFQUFFLElBQUk7cUJBQ2IsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO29CQUNoRCxvQkFBb0I7b0JBQ25CLElBQStCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM1QztxQkFBTSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtvQkFDaEQseUJBQXlCO29CQUN4QixJQUErQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDakQ7YUFDRjtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7YUFBTSxJQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUN0QixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQ3BCO1lBQ0EsT0FBUSxJQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsR0FBRyxDQUNELElBQW1CLEVBQ25CLEtBQWtDLEVBQ2xDLEtBT1EsRUFDUixFQUFFLElBQUksS0FBd0IsRUFBRTtRQUVoQyxJQUFJLFVBQVUsR0FDWixLQUFLLFlBQVksZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUksS0FBSyxDQUFDLENBQUM7UUFDdEUsSUFDRSxVQUFVLEtBQUssU0FBUztZQUN4QixJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFDekI7WUFDQSxJQUFJLEdBQUcsSUFBSSxJQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLENBQWEsSUFBSSxFQUFFLENBQUM7WUFDN0QsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxVQUFVLEtBQUssU0FBUztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixLQUFlLEVBQUUsQ0FBQyxDQUFDO1FBRTNELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakQsb0NBQW9DO1FBQ3BDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0QixJQUFJLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM3QztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUUzQixJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQ2pDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtnQkFDbEIsb0JBQW9CO2dCQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5RTtpQkFBTSxJQUFJLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDbEQsd0JBQXdCO2dCQUN4QixNQUFNLGlCQUFpQixHQUFHLE9BQTRDLENBQUM7Z0JBQ3ZFLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN6QywwQkFBMEI7b0JBQzFCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNoQixLQUEwQyxFQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQ3RCLENBQUM7aUJBQ0g7cUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMvQixxQkFBcUI7b0JBQ3JCLGlCQUFpQixDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsa0JBQWtCLENBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDaUIsQ0FBQztvQkFDakMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQWlELEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMxRixPQUFPLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQzFDO2FBQ0Y7aUJBQU0sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzdDLG1CQUFtQjtnQkFDbkIsTUFBTSxZQUFZLEdBQUcsT0FBd0IsQ0FBQztnQkFDOUMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3BDLHFCQUFxQjtvQkFDckIsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2hCLEtBQXNCLEVBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FDdEIsQ0FBQztpQkFDSDtxQkFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ25DLFlBQVksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUN2RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQ2UsQ0FBQztvQkFDL0IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFvQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEUsT0FBTyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFDdkM7YUFDRjtpQkFBTTtnQkFDTCwrQkFBK0I7Z0JBQy9CLDhDQUE4QztnQkFDOUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2hCLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7b0JBQ25DLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ2hDLENBQUMsQ0FBRSxLQUEyRDtvQkFDOUQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVO3dCQUNyQixDQUFDLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFJOzRCQUNoQyxNQUFNLEVBQUUsSUFBSTs0QkFDWixLQUFLLEVBQUUsS0FBd0M7NEJBQy9DLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7eUJBQzFCLENBQUM7d0JBQ0YsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUk7NEJBQzNCLE1BQU0sRUFBRSxJQUFJOzRCQUNaLEtBQUssRUFBRSxLQUFLOzRCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7eUJBQzFCLENBQUMsRUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQ3RCLENBQUM7YUFDSDtZQUVELHVCQUF1QjtZQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO2dCQUMvQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7b0JBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUMxQjthQUNGO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7Z0JBQy9DLElBQUk7Z0JBQ0osS0FBSztnQkFDTCxRQUFRLEVBQUUsT0FBTztnQkFDakIsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRTthQUNyQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxLQUFLLENBQUksSUFBbUIsRUFBRSxJQUE0QjtRQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQTJCLEVBQUUsRUFBRTtZQUNyRCxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9CLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQzlCLElBQ0UsS0FBSyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxNQUFNO3dCQUN6QyxJQUFJLENBQUMsVUFBVTt3QkFDZixLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFDbEI7d0JBQ0EsTUFBTSxHQUFHLEdBQUksSUFBSSxDQUFDLEdBQUcsRUFBc0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzlELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFOzRCQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzt5QkFDMUI7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUMzQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENJRF9GSUVMRF9OQU1FLFxuICBDT01QVVRFRCxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBPUFRJTUlTVElDX0NPTkNVUlJFTkNZLFxuICBFVkVOVF9TUExJVFRFUixcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlPcHRpb25zLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0eVNldCxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZSxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyLFxufSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgRWRtVHlwZSwgUGFyc2VyLCBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgT2JqZWN0cywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgT0RhdGFNb2RlbCB9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBlbnVtIE9EYXRhTW9kZWxFdmVudFR5cGUge1xuICBDaGFuZ2UgPSAnY2hhbmdlJyxcbiAgUmVzZXQgPSAncmVzZXQnLFxuICBVcGRhdGUgPSAndXBkYXRlJyxcbiAgU29ydCA9ICdzb3J0JyxcbiAgRGVzdHJveSA9ICdkZXN0cm95JyxcbiAgQWRkID0gJ2FkZCcsXG4gIFJlbW92ZSA9ICdyZW1vdmUnLFxuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBSZXF1ZXN0ID0gJ3JlcXVlc3QnLFxuICBTeW5jID0gJ3N5bmMnLFxuICBBdHRhY2ggPSAnYXR0YWNoJyxcbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxFdmVudDxUPiB7XG4gIHR5cGU6IE9EYXRhTW9kZWxFdmVudFR5cGUgfCBzdHJpbmc7XG4gIHZhbHVlPzogYW55O1xuICBwcmV2aW91cz86IGFueTtcbiAgb3B0aW9ucz86IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0eXBlOiBPRGF0YU1vZGVsRXZlbnRUeXBlIHwgc3RyaW5nLFxuICAgIHtcbiAgICAgIG1vZGVsLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHByZXZpb3VzLFxuICAgICAgdmFsdWUsXG4gICAgICBhdHRyLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGJ1YmJsZXMsXG4gICAgICBjaGFpbixcbiAgICB9OiB7XG4gICAgICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gICAgICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICAgICAgYXR0cj86IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IG51bWJlcjtcbiAgICAgIHByZXZpb3VzPzogYW55O1xuICAgICAgdmFsdWU/OiBhbnk7XG4gICAgICBvcHRpb25zPzogYW55O1xuICAgICAgYnViYmxlcz86IGJvb2xlYW47XG4gICAgICBjaGFpbj86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgbnVtYmVyIHwgbnVsbFxuICAgICAgXVtdO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgIHRoaXMucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmNoYWluID0gY2hhaW4gPz8gW1xuICAgICAgW1xuICAgICAgICAodGhpcy5tb2RlbCB8fCB0aGlzLmNvbGxlY3Rpb24pIGFzXG4gICAgICAgIHwgT0RhdGFNb2RlbDxhbnk+XG4gICAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgYXR0ciB8fCBudWxsLFxuICAgICAgXSxcbiAgICBdO1xuICAgIHRoaXMuYnViYmxlcyA9IGJ1YmJsZXMgPz8gQlVCQkxFUy5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xO1xuICB9XG5cbiAgY2hhaW46IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IG51bWJlciB8IG51bGxcbiAgXVtdO1xuXG4gIHB1c2goXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgbnVtYmVyXG4gICkge1xuICAgIHJldHVybiBuZXcgT0RhdGFNb2RlbEV2ZW50KHRoaXMudHlwZSwge1xuICAgICAgbW9kZWw6XG4gICAgICAgIHRoaXMubW9kZWwgPz9cbiAgICAgICAgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCA/IChtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pIDogdW5kZWZpbmVkKSxcbiAgICAgIGNvbGxlY3Rpb246XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA/P1xuICAgICAgICAobW9kZWwgaW5zdGFuY2VvZiBPRGF0YUNvbGxlY3Rpb25cbiAgICAgICAgICA/IChtb2RlbCBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVxuICAgICAgICAgIDogdW5kZWZpbmVkKSxcbiAgICAgIHByZXZpb3VzOiB0aGlzLnByZXZpb3VzLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgICAgaW5kZXg6IGF0dHIgaW5zdGFuY2VvZiBPRGF0YU1vZGVsQXR0cmlidXRlID8gYXR0ci5uYW1lIDogYXR0cixcbiAgICAgIH0sXG4gICAgICBidWJibGVzOiB0aGlzLmJ1YmJsZXMsXG4gICAgICBjaGFpbjogW1ttb2RlbCwgYXR0cl0sIC4uLnRoaXMuY2hhaW5dLFxuICAgIH0pO1xuICB9XG5cbiAgYnViYmxlczogYm9vbGVhbjtcbiAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuYnViYmxlcyA9IGZhbHNlO1xuICB9XG5cbiAgdmlzaXRlZChtb2RlbDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+Pikge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNoYWluLnNvbWUoKGMpID0+IGNbMF0gPT09IG1vZGVsKSAmJlxuICAgICAgdGhpcy5jaGFpblt0aGlzLmNoYWluLmxlbmd0aCAtIDFdWzBdICE9PSBtb2RlbFxuICAgICk7XG4gIH1cblxuICBjYW5Db250aW51ZVdpdGgoc2VsZjogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+Pikge1xuICAgIHJldHVybiB0aGlzLmJ1YmJsZXMgJiYgIXRoaXMudmlzaXRlZChzZWxmKTtcbiAgfVxuXG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmNoYWluXG4gICAgICAubWFwKChbLCBhdHRyXSwgaW5kZXgpID0+XG4gICAgICAgIHR5cGVvZiBhdHRyID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gYFske2F0dHJ9XWBcbiAgICAgICAgICA6IGF0dHIgaW5zdGFuY2VvZiBPRGF0YU1vZGVsQXR0cmlidXRlXG4gICAgICAgICAgICA/IGluZGV4ID09PSAwXG4gICAgICAgICAgICAgID8gYXR0ci5uYW1lXG4gICAgICAgICAgICAgIDogYC4ke2F0dHIubmFtZX1gXG4gICAgICAgICAgICA6ICcnXG4gICAgICApXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvL1JlZmVyZW5jZSB0byB0aGUgbW9kZWwgd2hpY2ggdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkXG4gIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgLy9JZGVudGlmaWVzIHRoZSBjdXJyZW50IG1vZGVsIGZvciB0aGUgZXZlbnRcbiAgZ2V0IGN1cnJlbnRNb2RlbCgpOiBPRGF0YU1vZGVsPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNoYWluLmZpbmQoKGMpID0+IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoY1swXSkpO1xuICAgIHJldHVybiBsaW5rICE9PSB1bmRlZmluZWQgPyAobGlua1swXSBhcyBPRGF0YU1vZGVsPGFueT4pIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy9SZWZlcmVuY2UgdG8gdGhlIGNvbGxlY3Rpb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkXG4gIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gIC8vSWRlbnRpZmllcyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIGZvciB0aGUgZXZlbnRcbiAgZ2V0IGN1cnJlbnRDb2xsZWN0aW9uKCk6IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNoYWluLmZpbmQoKGMpID0+IE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjWzBdKSk7XG4gICAgcmV0dXJuIGxpbmsgIT09IHVuZGVmaW5lZFxuICAgICAgPyAobGlua1swXSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD4gZXh0ZW5kcyBFdmVudEVtaXR0ZXI8XG4gIE9EYXRhTW9kZWxFdmVudDxUPlxuPiB7XG4gIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgbW9kZWwsXG4gICAgY29sbGVjdGlvbixcbiAgfToge1xuICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICB9XG5cbiAgLypcbiAgb3ZlcnJpZGUgZW1pdChldmVudDogT0RhdGFNb2RlbEV2ZW50PFQ+KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmJ1YmJsZXMgJiYgKCh0aGlzLmNvbGxlY3Rpb24gfHwgdGhpcy5tb2RlbCkgPT09IHVuZGVmaW5lZCB8fCAhZXZlbnQudmlzaXRlZCgodGhpcy5jb2xsZWN0aW9uIHx8IHRoaXMubW9kZWwpISkpKSB7XG4gICAgICBzdXBlci5lbWl0KGV2ZW50KTtcbiAgICB9ICBcbiAgfVxuICAqL1xuXG4gIHRyaWdnZXIoXG4gICAgdHlwZTogT0RhdGFNb2RlbEV2ZW50VHlwZSB8IHN0cmluZyxcbiAgICB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcHJldmlvdXMsXG4gICAgICB2YWx1ZSxcbiAgICAgIGF0dHIsXG4gICAgICBvcHRpb25zLFxuICAgICAgYnViYmxlcyxcbiAgICB9OiB7XG4gICAgICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICAgICAgYXR0cj86IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IG51bWJlcjtcbiAgICAgIHByZXZpb3VzPzogYW55O1xuICAgICAgdmFsdWU/OiBhbnk7XG4gICAgICBvcHRpb25zPzogYW55O1xuICAgICAgYnViYmxlcz86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IF90cmlnZ2VyID0gKG5hbWU6IHN0cmluZykgPT5cbiAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChuYW1lLCB7XG4gICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbiA/PyB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgYXR0cixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGJ1YmJsZXMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIGlmICh0eXBlICYmIEVWRU5UX1NQTElUVEVSLnRlc3QodHlwZSkpIHtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiB0eXBlLnNwbGl0KEVWRU5UX1NQTElUVEVSKSkge1xuICAgICAgICBfdHJpZ2dlcihuYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3RyaWdnZXIodHlwZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBCVUJCTEVTOiAoT0RhdGFNb2RlbEV2ZW50VHlwZSB8IHN0cmluZylbXSA9IFtcbiAgT0RhdGFNb2RlbEV2ZW50VHlwZS5DaGFuZ2UsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUuUmVzZXQsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLkRlc3Ryb3ksXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUuQWRkLFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLlJlbW92ZSxcbl07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX1NIQUxMT1cgPSB7XG4gIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gIGluY2x1ZGVfa2V5OiB0cnVlLFxuICBpbmNsdWRlX2lkOiBmYWxzZSxcbn07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX0RFRVAgPSB7XG4gIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgaW5jbHVkZV9ub25fZmllbGQ6IHRydWUsXG4gIC4uLklOQ0xVREVfU0hBTExPVyxcbn07XG5cbmV4cG9ydCBlbnVtIE9EYXRhTW9kZWxTdGF0ZSB7XG4gIEFkZGVkLFxuICBSZW1vdmVkLFxuICBVbmNoYW5nZWQsXG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsT3B0aW9ucyA9IHtcbiAgY2lkPzogc3RyaW5nO1xuICBmaWVsZHM6IE1hcDxzdHJpbmcsIE1vZGVsRmllbGRPcHRpb25zPjtcbn07XG5cbmV4cG9ydCB0eXBlIE1vZGVsRmllbGRPcHRpb25zID0ge1xuICBmaWVsZD86IHN0cmluZztcbiAgcGFyc2VyPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT47XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHBhdHRlcm4/OiBSZWdFeHA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kZWwoeyBjaWQgPSBDSURfRklFTERfTkFNRSB9OiB7IGNpZD86IHN0cmluZyB9ID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgeyBuZXcoLi4uYXJnczogYW55W10pOiB7fSB9Pihjb25zdHJ1Y3RvcjogVCkgPT4ge1xuICAgIGNvbnN0IEtsYXNzID0gPGFueT5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0ge1xuICAgICAgICBmaWVsZHM6IG5ldyBNYXA8c3RyaW5nLCBNb2RlbEZpZWxkT3B0aW9ucz4oKSxcbiAgICAgIH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIEtsYXNzLm9wdGlvbnMuY2lkID0gY2lkO1xuICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsRmllbGQoe1xuICBuYW1lLFxuICAuLi5vcHRpb25zXG59OiB7IG5hbWU/OiBzdHJpbmcgfSAmIE1vZGVsRmllbGRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0ge1xuICAgICAgICBmaWVsZHM6IG5ldyBNYXA8c3RyaW5nLCBNb2RlbEZpZWxkT3B0aW9ucz4oKSxcbiAgICAgIH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIG9wdGlvbnMuZmllbGQgPSBuYW1lIHx8IGtleTtcbiAgICBLbGFzcy5vcHRpb25zLmZpZWxkcy5zZXQoa2V5LCBvcHRpb25zKTtcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPiA9IE1vZGVsRmllbGRPcHRpb25zICYge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxGaWVsZDxGPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj47XG4gIG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIG1ldGE/OiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZDogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbiAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PixcbiAgICB7IG5hbWUsIGZpZWxkLCBwYXJzZXIsIC4uLm9wdHMgfTogT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPlxuICApIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5maWVsZCA9IGZpZWxkO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIHRoaXMuZGVmYXVsdCA9IG9wdHMuZGVmYXVsdCB8fCBwYXJzZXIuZGVmYXVsdDtcbiAgICB0aGlzLnJlcXVpcmVkID0gQm9vbGVhbihvcHRzLnJlcXVpcmVkIHx8ICFwYXJzZXIubnVsbGFibGUpO1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBCb29sZWFuKG9wdHMuY29uY3VycmVuY3kpO1xuICAgIHRoaXMubWF4TGVuZ3RoID0gb3B0cy5tYXhMZW5ndGggfHwgcGFyc2VyLm1heExlbmd0aDtcbiAgICB0aGlzLm1pbkxlbmd0aCA9IG9wdHMubWluTGVuZ3RoO1xuICAgIHRoaXMubWluID0gb3B0cy5taW47XG4gICAgdGhpcy5tYXggPSBvcHRzLm1heDtcbiAgICB0aGlzLnBhdHRlcm4gPSBvcHRzLnBhdHRlcm47XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXBpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnR5cGU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcnNlci5uYXZpZ2F0aW9uKTtcbiAgfVxuXG4gIGdldCBjb2xsZWN0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMucGFyc2VyLmNvbGxlY3Rpb24pO1xuICB9XG5cbiAgYW5ub3RhdGVkVmFsdWU8VD4odGVybTogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmFubm90YXRlZFZhbHVlPFQ+KHRlcm0pO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gICAgY29uY3VycmVuY3ksXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25jdXJyZW5jeTogYm9vbGVhbjtcbiAgICBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICB9KSB7XG4gICAgdGhpcy5tZXRhID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMucGFyc2VyLnR5cGUpO1xuICAgIHRoaXMucGFyc2VyT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKGNvbmN1cnJlbmN5KSB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZXNlcmlhbGl6ZSh0aGlzLmRlZmF1bHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzS2V5KCk7XG4gIH1cblxuICBoYXNSZWZlcmVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmhhc1JlZmVyZW50aWFscygpO1xuICB9XG5cbiAgZ2V0IHJlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucmVmZXJlbnRpYWxzO1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNTdHJ1Y3R1cmVkVHlwZSgpO1xuICB9XG5cbiAgc3RydWN0dXJlZCgpIHtcbiAgICBjb25zdCBzdHJ1Y3R1cmVkVHlwZSA9IHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8Rj4oXG4gICAgICB0aGlzLnBhcnNlci50eXBlXG4gICAgKTtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmICghc3RydWN0dXJlZFR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHN0cnVjdHVyZWQgdHlwZSBmb3IgJHt0aGlzLnBhcnNlci50eXBlfWApO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkVHlwZTtcbiAgfVxuXG4gIGlzRW51bVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzRW51bVR5cGUoKTtcbiAgfVxuXG4gIGVudW0oKSB7XG4gICAgY29uc3QgZW51bVR5cGUgPSB0aGlzLmFwaS5maW5kRW51bVR5cGVGb3JUeXBlPEY+KHRoaXMucGFyc2VyLnR5cGUpO1xuICAgIC8vVGhyb3cgZXJyb3IgaWYgbm90IGZvdW5kXG4gICAgaWYgKCFlbnVtVHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgZW51bSB0eXBlIGZvciAke3RoaXMucGFyc2VyLnR5cGV9YCk7XG4gICAgcmV0dXJuIGVudW1UeXBlO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuICF2YWx1ZS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pID8gdmFsdWUuX2Vycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAubW9kZWxzKClcbiAgICAgICAgLnNvbWUoKG06IE9EYXRhTW9kZWw8YW55PikgPT4gIW0uaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSlcbiAgICAgICAgPyB2YWx1ZS5tb2RlbHMoKS5tYXAoKG06IE9EYXRhTW9kZWw8YW55PikgPT4gbS5fZXJyb3JzKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmFubm90YXRlZFZhbHVlPGJvb2xlYW4+KENPTVBVVEVEKTtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMucGFyc2VyPy52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgfHwgW107XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucmVxdWlyZWQgJiZcbiAgICAgICAgKHZhbHVlID09PSBudWxsIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG1ldGhvZCAhPT0gJ21vZGlmeScpKSAmJiAvLyBJcyBudWxsIG9yIHVuZGVmaW5lZCB3aXRob3V0IHBhdGNoP1xuICAgICAgICAhKGNvbXB1dGVkICYmIG1ldGhvZCA9PT0gJ2NyZWF0ZScpIC8vIE5vdCAoSXMgQ29tcHV0ZWQgZmllbGQgYW5kIGNyZWF0ZSkgP1xuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGByZXF1aXJlZGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgbWF4bGVuZ3RoYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWluTGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbkxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtaW5sZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5taW4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlIDwgdGhpcy5taW5cbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgbWluYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA+IHRoaXMubWF4XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1heGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnBhdHRlcm4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICF0aGlzLnBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgcGF0dGVybmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGVycm9ycykgPyBlcnJvcnMgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZGVmYXVsdHMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pc1N0cnVjdHVyZWRUeXBlKCkgJiYgdGhpcy5tZXRhICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5tZXRhLmRlZmF1bHRzKClcbiAgICAgIDogdGhpcy5kZWZhdWx0O1xuICB9XG5cbiAgZGVzZXJpYWxpemUodmFsdWU6IGFueSwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBGIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLnBhcnNlck9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSh2YWx1ZTogRiwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMucGFyc2VyT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIGVuY29kZSh2YWx1ZTogRiwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMucGFyc2VyT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZW5jb2RlKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIHJlc291cmNlRmFjdG9yeTxULCBGPihcbiAgICBiYXNlOiBPRGF0YVJlc291cmNlPFQ+XG4gICk6IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Rj4gfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Rj4ge1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGJhc2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlIHx8XG4gICAgICAgIGJhc2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIHx8XG4gICAgICAgIGJhc2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBidWlsZCByZXNvdXJjZSBmb3Igbm9uIGNvbXBhdGlibGUgYmFzZSB0eXBlXCIpO1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25cbiAgICAgID8gKGJhc2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikubmF2aWdhdGlvblByb3BlcnR5PEY+KHRoaXMucGFyc2VyLm5hbWUpXG4gICAgICA6IChiYXNlIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pLnByb3BlcnR5PEY+KHRoaXMucGFyc2VyLm5hbWUpO1xuICB9XG5cbiAgYW5ub3RhdGlvbnNGYWN0b3J5PFQsIEY+KFxuICAgIGJhc2U6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD5cbiAgKTogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxGPiB8IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxGPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmNvbGxlY3Rpb25cbiAgICAgID8gYmFzZS5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lIGFzIGtleW9mIFQsICdjb2xsZWN0aW9uJylcbiAgICAgIDogYmFzZS5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lIGFzIGtleW9mIFQsICdzaW5nbGUnKTtcbiAgfVxuXG4gIHNjaGVtYUZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlPEY+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcGkuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgfVxuXG4gIG1vZGVsRmFjdG9yeTxGPih7XG4gICAgcGFyZW50LFxuICAgIHZhbHVlLFxuICAgIHJlc2V0LFxuICB9OiB7XG4gICAgcGFyZW50OiBPRGF0YU1vZGVsPGFueT47XG4gICAgdmFsdWU/OiBQYXJ0aWFsPEY+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gICAgcmVzZXQ/OiBib29sZWFuO1xuICB9KTogT0RhdGFNb2RlbDxGPiB7XG4gICAgLy8gTW9kZWxcbiAgICBjb25zdCBhbm5vdHMgPSB0aGlzLmFubm90YXRpb25zRmFjdG9yeShcbiAgICAgIHBhcmVudC5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxGPjtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLmFwaS5tb2RlbEZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQpIHRocm93IEVycm9yKGBObyBNb2RlbCB0eXBlIGZvciAke3RoaXMubmFtZX1gKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYW5ub3RzLnVwZGF0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFubm90cz8udHlwZSAhPT0gdW5kZWZpbmVkICYmIE1vZGVsLm1ldGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IE1vZGVsLm1ldGEuZmluZENoaWxkT3B0aW9ucygobykgPT5cbiAgICAgICAgby5pc1R5cGVPZihhbm5vdHMudHlwZSBhcyBzdHJpbmcpXG4gICAgICApPy5zY2hlbWE7XG4gICAgICBpZiAoc2NoZW1hICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IHNjaGVtYS5tb2RlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsKCh2YWx1ZSB8fCB7fSkgYXMgUGFydGlhbDxGPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCxcbiAgICAgIHBhcmVudDogW3BhcmVudCwgdGhpc10sXG4gICAgfSk7XG4gIH1cblxuICBjb2xsZWN0aW9uRmFjdG9yeTxGPih7XG4gICAgcGFyZW50LFxuICAgIHZhbHVlLFxuICAgIHJlc2V0LFxuICB9OiB7XG4gICAgcGFyZW50OiBPRGF0YU1vZGVsPGFueT47XG4gICAgdmFsdWU/OiBQYXJ0aWFsPEY+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdO1xuICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgfSk6IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PiB7XG4gICAgLy8gQ29sbGVjdGlvbiBGYWN0b3J5XG4gICAgY29uc3QgYW5ub3RzID0gdGhpcy5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBwYXJlbnQuYW5ub3RzKClcbiAgICApIGFzIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxGPjtcbiAgICBjb25zdCBDb2xsZWN0aW9uID0gdGhpcy5hcGkuY29sbGVjdGlvbkZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG4gICAgaWYgKENvbGxlY3Rpb24gPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IEVycm9yKGBObyBDb2xsZWN0aW9uIHR5cGUgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbihcbiAgICAgICh2YWx1ZSB8fCBbXSkgYXMgUGFydGlhbDxGPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSxcbiAgICAgIHtcbiAgICAgICAgYW5ub3RzOiBhbm5vdHMsXG4gICAgICAgIHJlc2V0LFxuICAgICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxBdHRyaWJ1dGU8VD4ge1xuICBwcml2YXRlIHZhbHVlPzogVCB8IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4gfCBudWxsO1xuICBwcml2YXRlIGNoYW5nZT86IFQgfCBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+IHwgbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIGV2ZW50cyQgPSBuZXcgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX21vZGVsOiBPRGF0YU1vZGVsPGFueT4sXG4gICAgcHJpdmF0ZSBfZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxUPlxuICApIHsgfVxuXG4gIGdldCBuYXZpZ2F0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2ZpZWxkLm5hdmlnYXRpb24pO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9maWVsZC5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gIH1cblxuICBnZXQgY29uY3VycmVuY3koKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZmllbGQuY29uY3VycmVuY3kpO1xuICB9XG5cbiAgZ2V0IHJlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQucmVmZXJlbnRpYWxzO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkLm9wdGlvbnM7XG4gIH1cblxuICBnZXQgbWV0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQubWV0YTtcbiAgfVxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWVsZC5uYW1lO1xuICB9XG5cbiAgZ2V0IGZpZWxkTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQuZmllbGQ7XG4gIH1cblxuICBnZXQoKTpcbiAgICB8IFRcbiAgICB8IE9EYXRhTW9kZWw8VD5cbiAgICB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2UgIT09IHVuZGVmaW5lZCA/IHRoaXMuY2hhbmdlIDogdGhpcy52YWx1ZTtcbiAgfVxuXG4gIHNldChcbiAgICB2YWx1ZTpcbiAgICAgIHwgVFxuICAgICAgfCBPRGF0YU1vZGVsPFQ+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZCxcbiAgICByZXNldDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHJlcGFyZW50OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0KCk7XG5cbiAgICBpZiAoXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oY3VycmVudClcbiAgICApXG4gICAgICB0aGlzLnVubGluayhcbiAgICAgICAgY3VycmVudCBhcyBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+XG4gICAgICAgIC8vdGhpcy52YWx1ZSAhPT0gY3VycmVudFxuICAgICAgKTtcblxuICAgIGNvbnN0IGNoYW5nZWQgPVxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChjdXJyZW50KSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKVxuICAgICAgICA/ICEoY3VycmVudCBhcyBPRGF0YU1vZGVsPFQ+KS5lcXVhbHModmFsdWUgYXMgT0RhdGFNb2RlbDxUPilcbiAgICAgICAgOiBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oY3VycmVudCkgJiZcbiAgICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgICAgICAgPyAhKGN1cnJlbnQgYXMgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KS5lcXVhbHMoXG4gICAgICAgICAgICB2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj5cbiAgICAgICAgICApXG4gICAgICAgICAgOiAhVHlwZXMuaXNFcXVhbChjdXJyZW50LCB2YWx1ZSk7XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKFR5cGVzLmlzRXF1YWwodmFsdWUsIHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLmNoYW5nZSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlID0gdmFsdWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLmxpbmsoXG4gICAgICAgIHZhbHVlIGFzIE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgICAgIHJlcGFyZW50XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIGlzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXQoKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jaGFuZ2UgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgKChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpIHx8XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50KSkgJiZcbiAgICAgICAgKFxuICAgICAgICAgIGN1cnJlbnQgYXMgT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICAgICAgICApLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodGhpcy5jaGFuZ2UpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odGhpcy5jaGFuZ2UpXG4gICAgKVxuICAgICAgdGhpcy51bmxpbmsoXG4gICAgICAgIHRoaXMuY2hhbmdlIGFzIE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj5cbiAgICAgICk7XG4gICAgdGhpcy5jaGFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh0aGlzLnZhbHVlKSB8fFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMudmFsdWUpXG4gICAgKVxuICAgICAgdGhpcy5saW5rKFxuICAgICAgICB0aGlzLnZhbHVlIGFzIE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj5cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxpbmsoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHZhbHVlLmV2ZW50cyQuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmV2ZW50cyQuZW1pdChlKSk7XG4gICAgaWYgKHJlcGFyZW50KSB7XG4gICAgICB2YWx1ZS5fcGFyZW50ID0gW3RoaXMuX21vZGVsLCB0aGlzLl9maWVsZF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bmxpbmsoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwYXJlbnQpIHtcbiAgICAgIHZhbHVlLl9wYXJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsRW50cnk8VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+ID0ge1xuICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlO1xuICBtb2RlbDogTTtcbiAga2V5PzogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsT3B0aW9uczxUPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgY2lkOiBzdHJpbmc7XG4gIGJhc2U/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2ZpZWxkczogT0RhdGFNb2RlbEZpZWxkPGFueT5bXSA9IFtdO1xuICBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIGVudGl0eVNldD86IE9EYXRhRW50aXR5U2V0O1xuICAvLyBIaWVyYXJjaHlcbiAgcGFyZW50PzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgY2hpbGRyZW46IE9EYXRhTW9kZWxPcHRpb25zPGFueT5bXSA9IFtdO1xuICBldmVudHMkID0gbmV3IE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD4oKTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgb3B0aW9ucyxcbiAgICBzY2hlbWEsXG4gIH06IHtcbiAgICBvcHRpb25zOiBNb2RlbE9wdGlvbnM7XG4gICAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICB9KSB7XG4gICAgdGhpcy5uYW1lID0gc2NoZW1hLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gc2NoZW1hLmJhc2U7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5jaWQgPSBvcHRpb25zPy5jaWQgfHwgQ0lEX0ZJRUxEX05BTUU7XG4gICAgb3B0aW9ucy5maWVsZHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gdGhpcy5hZGRGaWVsZDxhbnk+KGtleSwgdmFsdWUpKTtcbiAgfVxuXG4gIGdldCBhcGkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmFwaTtcbiAgfVxuXG4gIHR5cGUoeyBhbGlhcyA9IGZhbHNlIH06IHsgYWxpYXM/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS50eXBlKHsgYWxpYXMgfSk7XG4gIH1cblxuICBpc09wZW5UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5pc09wZW5UeXBlKCk7XG4gIH1cblxuICBpc0VudGl0eVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmlzRW50aXR5VHlwZSgpO1xuICB9XG5cbiAgaXNDb21wbGV4VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEuaXNDb21wbGV4VHlwZSgpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmlzVHlwZU9mKHR5cGUpO1xuICB9XG5cbiAgaXNNb2RlbEZvcihlbnRpdHk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSkge1xuICAgIC8vIFJlc29sdmUgQnkgVHlwZVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmFwaS5vcHRpb25zLmhlbHBlci50eXBlKFxuICAgICAgZW50aXR5IGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgKTtcbiAgICBpZiAodHlwZSAmJiB0aGlzLmlzVHlwZU9mKHR5cGUpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBSZXNvbHZlIEJ5IGZpZWxkc1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pO1xuICAgIGNvbnN0IG5hbWVzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLm1hcCgoZikgPT4gZi5uYW1lKTtcbiAgICByZXR1cm4ga2V5cy5ldmVyeSgoa2V5KSA9PiBuYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgfVxuXG4gIGZpbmRDaGlsZE9wdGlvbnMoXG4gICAgcHJlZGljYXRlOiAob3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PikgPT4gYm9vbGVhblxuICApOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJlZGljYXRlKHRoaXMpKSByZXR1cm4gdGhpcztcbiAgICBsZXQgbWF0Y2g6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBtYXRjaCA9IGNoLmZpbmRDaGlsZE9wdGlvbnMocHJlZGljYXRlKTtcbiAgICAgIGlmIChtYXRjaCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBvcHRpb25zLFxuICAgIHBhcnNlckZvclR5cGUsXG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICB9OiB7XG4gICAgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcbiAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBQYXJzZXI8YW55PjtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gIH0pIHtcbiAgICBpZiAodGhpcy5iYXNlKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBmaW5kT3B0aW9uc0ZvclR5cGUodGhpcy5iYXNlKSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgdGhpcy5lbnRpdHlTZXQgPSB0aGlzLmFwaS5maW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZSh0aGlzLnR5cGUoKSk7XG4gICAgbGV0IGNvbmN1cnJlbmN5RmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLmVudGl0eVNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25jdXJyZW5jeUZpZWxkcyA9XG4gICAgICAgIHRoaXMuZW50aXR5U2V0LmFubm90YXRlZFZhbHVlPHN0cmluZ1tdPihPUFRJTUlTVElDX0NPTkNVUlJFTkNZKSB8fCBbXTtcbiAgICB9XG4gICAgdGhpcy5fZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5RmllbGRzLmluZGV4T2YoZmllbGQuZmllbGQpICE9PSAtMTtcbiAgICAgIGZpZWxkLmNvbmZpZ3VyZSh7XG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpZWxkcyh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgIGluY2x1ZGVfcGFyZW50cyxcbiAgfToge1xuICAgIGluY2x1ZGVfcGFyZW50czogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb246IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsRmllbGQ8YW55PltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKGluY2x1ZGVfcGFyZW50cyAmJiB0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5wYXJlbnQuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uLCBpbmNsdWRlX3BhcmVudHMgfSlcbiAgICAgICAgOiBbXSksXG4gICAgICAuLi50aGlzLl9maWVsZHMuZmlsdGVyKFxuICAgICAgICAoZmllbGQpID0+IGluY2x1ZGVfbmF2aWdhdGlvbiB8fCAhZmllbGQubmF2aWdhdGlvblxuICAgICAgKSxcbiAgICBdO1xuICB9XG5cbiAgZmllbGQ8Rj4obmFtZToga2V5b2YgVCB8IHN0cmluZykge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maW5kRmllbGQ8Rj4obmFtZSk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoIWZpZWxkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpZWxkIHdpdGggbmFtZSAke25hbWUgYXMgc3RyaW5nfWApO1xuICAgIHJldHVybiBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8Rj47XG4gIH1cblxuICBmaW5kRmllbGQ8Rj4obmFtZToga2V5b2YgVCB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZChcbiAgICAgIChtb2RlbEZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4pID0+XG4gICAgICAgIG1vZGVsRmllbGQubmFtZSA9PT0gbmFtZSB8fCBtb2RlbEZpZWxkLmZpZWxkID09PSBuYW1lXG4gICAgKSBhcyBPRGF0YU1vZGVsRmllbGQ8Rj4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICBhZGRGaWVsZDxGPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IE1vZGVsRmllbGRPcHRpb25zKSB7XG4gICAgY29uc3QgeyBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH0gPSBvcHRpb25zO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgUHJvcGVydGllcyBuZWVkIG5hbWUgYW5kIGZpZWxkJyk7XG4gICAgY29uc3QgZmllbGRQYXJzZXIgPSBwYXJzZXIgPz8gdGhpcy5zY2hlbWEuZmllbGQ8Rj4oZmllbGQgYXMga2V5b2YgVCk7XG4gICAgaWYgKGZpZWxkUGFyc2VyID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBhcnNlciBmb3IgJHtmaWVsZH0gd2l0aCBuYW1lID0gJHtuYW1lfWApO1xuICAgIGNvbnN0IG1vZGVsRmllbGQgPSBuZXcgT0RhdGFNb2RlbEZpZWxkPEY+KHRoaXMsIHtcbiAgICAgIG5hbWUsXG4gICAgICBmaWVsZCxcbiAgICAgIHBhcnNlcjogZmllbGRQYXJzZXIsXG4gICAgICAuLi5vcHRzLFxuICAgIH0pO1xuICAgIHRoaXMuX2ZpZWxkcy5wdXNoKG1vZGVsRmllbGQpO1xuICAgIHJldHVybiBtb2RlbEZpZWxkO1xuICB9XG5cbiAgdHNUb0VkbTogUmVjb3JkPHN0cmluZywgRWRtVHlwZT4gPSB7XG4gICAgc3RyaW5nOiBFZG1UeXBlLlN0cmluZyxcbiAgICBudW1iZXI6IEVkbVR5cGUuSW50MzIsXG4gICAgYmlnaW50OiBFZG1UeXBlLkludDY0LFxuICAgIGJvb2xlYW46IEVkbVR5cGUuQm9vbGVhbixcbiAgfTtcbiAgcHJpdmF0ZSBtb2RlbEZpZWxkRmFjdG9yeTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcgfCBFZG1UeXBlXG4gICkge1xuICAgIGNvbnN0IHN0cnVjdHVyZWRGaWVsZFBhcnNlciA9IHRoaXMuc2NoZW1hLmFkZEZpZWxkPEY+KG5hbWUsIHsgdHlwZSB9KTtcbiAgICBzdHJ1Y3R1cmVkRmllbGRQYXJzZXIuY29uZmlndXJlKHtcbiAgICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gdGhpcy5hcGkuZmluZE9wdGlvbnNGb3JUeXBlKHR5cGUpLFxuICAgICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZyB8IEVkbVR5cGUpID0+IHRoaXMuYXBpLnBhcnNlckZvclR5cGUodHlwZSksXG4gICAgICBvcHRpb25zOiB0aGlzLmFwaS5vcHRpb25zLFxuICAgIH0pO1xuICAgIGNvbnN0IG1vZGVsRmllbGQgPSB0aGlzLmFkZEZpZWxkPEY+KG5hbWUsIHtcbiAgICAgIGZpZWxkOiBuYW1lLFxuICAgICAgcGFyc2VyOiBzdHJ1Y3R1cmVkRmllbGRQYXJzZXIsXG4gICAgfSk7XG4gICAgbW9kZWxGaWVsZC5jb25maWd1cmUoe1xuICAgICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiB0aGlzLmFwaS5maW5kT3B0aW9uc0ZvclR5cGUodHlwZSksXG4gICAgICBvcHRpb25zOiB0aGlzLmFwaS5vcHRpb25zLFxuICAgICAgY29uY3VycmVuY3k6IGZhbHNlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBtb2RlbEZpZWxkLm5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogKCkgPT4gdGhpcy5nZXQoc2VsZiwgbW9kZWxGaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiksXG4gICAgICBzZXQ6ICh2YWx1ZTogYW55KSA9PlxuICAgICAgICB0aGlzLnNldChzZWxmLCBtb2RlbEZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+LCB2YWx1ZSksXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVsRmllbGQ7XG4gIH1cblxuICBhdHRhY2goXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICkge1xuICAgIGlmIChcbiAgICAgIHNlbGYuX3Jlc291cmNlICE9PSBudWxsICYmXG4gICAgICByZXNvdXJjZS50eXBlKCkgIT09IHNlbGYuX3Jlc291cmNlLnR5cGUoKSAmJlxuICAgICAgIXNlbGYuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGF0dGFjaCAke3Jlc291cmNlLnR5cGUoKX0gdG8gJHtzZWxmLl9yZXNvdXJjZS50eXBlKCl9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxmLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICBzZWxmLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgc2VsZi5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5BdHRhY2gsIHtcbiAgICAgICAgcHJldmlvdXM6IGN1cnJlbnQsXG4gICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIyByZWdpb24gUmVzb3VyY2VcbiAgc3RhdGljIGNoYWluKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICBdW10ge1xuICAgIGNvbnN0IGNoYWluID0gW10gYXMgYW55W107XG4gICAgbGV0IHR1cGxlOlxuICAgICAgfCBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgXVxuICAgICAgfCBudWxsID0gW2NoaWxkLCBudWxsXTtcbiAgICB3aGlsZSAodHVwbGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHR1cGxlIGFzIFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgaWYgKGNoYWluLnNvbWUoKHApID0+IHBbMF0gPT09IHBhcmVudFswXSkpIGJyZWFrO1xuICAgICAgY2hhaW4uc3BsaWNlKDAsIDAsIHBhcmVudCk7XG4gICAgICB0dXBsZSA9IHR1cGxlWzBdLl9wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFpbjtcbiAgfVxuXG4gIHN0YXRpYyByZXNvdXJjZTxUPihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICApOiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbCB7XG4gICAgbGV0IHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcHJldkZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW21vZGVsLCBmaWVsZF0gb2YgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpKSB7XG4gICAgICByZXNvdXJjZSA9IHJlc291cmNlIHx8IChtb2RlbC5fcmVzb3VyY2UgYXMgT0RhdGFSZXNvdXJjZTxUPik7XG4gICAgICBpZiAocmVzb3VyY2UgPT09IG51bGwpIGJyZWFrO1xuICAgICAgaWYgKFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSAmJlxuICAgICAgICAocHJldkZpZWxkID09PSBudWxsIHx8IHByZXZGaWVsZC5jb2xsZWN0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG0gPSBtb2RlbCBhcyBPRGF0YU1vZGVsPGFueT47XG4gICAgICAgIC8vIFJlc29sdmUgc3VidHlwZSBpZiBjb2xsZWN0aW9uIG5vdCBpcyBmcm9tIGZpZWxkXG4gICAgICAgIC8vIEZJWE1FXG4gICAgICAgIC8qXG4gICAgICAgIGlmIChmaWVsZCA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHIgPSBtLl9tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KHJlc291cmNlLmNsb25lUXVlcnk8VD4oKSk7XG4gICAgICAgICAgaWYgKHIgIT09IG51bGwgJiYgIXIuaXNUeXBlT2YocmVzb3VyY2UpICYmIHIuaXNTdWJ0eXBlT2YocmVzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IHI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICovXG4gICAgICAgIC8vIFJlc29sdmUga2V5XG4gICAgICAgIGNvbnN0IG1LZXkgPSBtLmtleSh7IGZpZWxkX21hcHBpbmc6IHRydWUgfSkgYXMgRW50aXR5S2V5PGFueT47XG4gICAgICAgIGlmIChtS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXNvdXJjZSA9XG4gICAgICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2VcbiAgICAgICAgICAgICAgPyByZXNvdXJjZS5lbnRpdHkobUtleSlcbiAgICAgICAgICAgICAgOiAocmVzb3VyY2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikua2V5KG1LZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcmV2RmllbGQgPSBmaWVsZDtcbiAgICAgIGlmIChmaWVsZCA9PT0gbnVsbCAmJiBtb2RlbC5fcmVzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQXBwbHkgdGhlIHF1ZXJ5IGZyb20gbW9kZWwgdG8gbmV3IHJlc291cmNlXG4gICAgICAgIG1vZGVsLl9yZXNvdXJjZS5xdWVyeSgocXMpID0+XG4gICAgICAgICAgcmVzb3VyY2U/LnF1ZXJ5KChxZCkgPT4gcWQucmVzdG9yZShxcy5zdG9yZSgpKSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQgIT09IG51bGwpIHtcbiAgICAgICAgcmVzb3VyY2UgPSBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8YW55LCBhbnk+KHJlc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShcbiAgICBxdWVyeT86IE9EYXRhUXVlcnlPcHRpb25zPFQ+XG4gICk6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwge1xuICAgIGlmICh0aGlzLmVudGl0eVNldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gT0RhdGFFbnRpdHlTZXRSZXNvdXJjZS5mYWN0b3J5PFQ+KHRoaXMuYXBpLCB7XG4gICAgICBwYXRoOiB0aGlzLmVudGl0eVNldC5uYW1lLFxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHF1ZXJ5LFxuICAgIH0pO1xuICB9XG5cbiAgbW9kZWxSZXNvdXJjZUZhY3RvcnkoXG4gICAgcXVlcnk/OiBPRGF0YVF1ZXJ5T3B0aW9uczxUPlxuICApOlxuICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgfCBudWxsIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShxdWVyeSk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkgcmV0dXJuIHJlc291cmNlLmVudGl0eSgpO1xuICAgIHJldHVybiByZXNvdXJjZSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBiaW5kKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgLy8gRXZlbnRzXG4gICAgc2VsZi5ldmVudHMkLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5ldmVudHMkLmVtaXQoZSkpO1xuXG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VcbiAgICBpZiAoc2VsZi5fcGFyZW50ID09PSBudWxsICYmIHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkoKTtcbiAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuYXR0YWNoKFxuICAgICAgICBzZWxmLFxuICAgICAgICByZXNvdXJjZSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHNlbGYuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyA/PyBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhPRGF0YUhlbHBlcltERUZBVUxUX1ZFUlNJT05dKTtcblxuICAgIC8vIEZpZWxkc1xuICAgIHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIGZpZWxkLm5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuZ2V0KHNlbGYsIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+KSxcbiAgICAgICAgc2V0OiAodmFsdWU6IGFueSkgPT5cbiAgICAgICAgICB0aGlzLnNldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiwgdmFsdWUpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBxdWVyeShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICAgZnVuYzogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWRcbiAgKSB7XG4gICAgcmVzb3VyY2UucXVlcnkoZnVuYyk7XG4gICAgdGhpcy5hdHRhY2goc2VsZiwgcmVzb3VyY2UpO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgcmVzb2x2ZUtleShcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICAgIHNpbmdsZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW47IHNpbmdsZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXlUeXBlcyA9IHRoaXMuc2NoZW1hLmtleXMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSk7XG4gICAgY29uc3Qga2V5ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBmb3IgKGNvbnN0IGt0IG9mIGtleVR5cGVzKSB7XG4gICAgICBsZXQgdiA9IHZhbHVlIGFzIGFueTtcbiAgICAgIGxldCBvcHRpb25zID0gdGhpcyBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgbGV0IGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBrdC5uYW1lLnNwbGl0KCcvJykpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgIGZpZWxkID0gb3B0aW9uc1xuICAgICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgICAuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdiA9XG4gICAgICAgICAgICBUeXBlcy5pc1BsYWluT2JqZWN0KHYpIHx8IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodilcbiAgICAgICAgICAgICAgPyB2W2ZpZWxkLm5hbWVdXG4gICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICBvcHRpb25zID0gZmllbGQubWV0YSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGZpZWxkLmZpZWxkIDogZmllbGQubmFtZTtcbiAgICAgIGlmIChrdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSBuYW1lID0ga3QuYWxpYXM7XG4gICAgICBrZXkuc2V0KG5hbWUsIHYpO1xuICAgIH1cbiAgICBpZiAoa2V5LnNpemUgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVcbiAgICAgID8gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSwgeyBzaW5nbGUgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKGtleSk7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbnRpYWwoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsLFxuICAgIGF0dHI6IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgICAgc2luZ2xlID0gZmFsc2UsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW47IHNpbmdsZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbnRpYWwgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAoY29uc3QgcmVmIG9mIGF0dHIucmVmZXJlbnRpYWxzKSB7XG4gICAgICBjb25zdCBmcm9tID0gdGhpcy5maWVsZHMoe1xuICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLFxuICAgICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICB9KS5maW5kKChwOiBhbnkpID0+IHAuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHkpO1xuICAgICAgY29uc3QgdG8gPSBhdHRyLm9wdGlvbnNcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gcmVmLnByb3BlcnR5KTtcbiAgICAgIGlmIChmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbnRpYWwuc2V0KG5hbWUsIHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmZXJlbnRpYWwuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocmVmZXJlbnRpYWwuc2l6ZSA9PT0gMSAmJiBBcnJheS5mcm9tKHJlZmVyZW50aWFsLnZhbHVlcygpKVswXSA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShyZWZlcmVudGlhbCwgeyBzaW5nbGUgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHJlZmVyZW50aWFsKTtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVuY2VkKFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBhdHRyOiBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICAgIHNpbmdsZSA9IGZhbHNlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuOyBzaW5nbGU/OiBib29sZWFuIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAoY29uc3QgcmVmIG9mIGF0dHIucmVmZXJlbnRpYWxzKSB7XG4gICAgICBjb25zdCBmcm9tID0gdGhpcy5maWVsZHMoe1xuICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLFxuICAgICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICB9KS5maW5kKChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSByZWYucHJvcGVydHkpO1xuICAgICAgY29uc3QgdG8gPSAoYXR0ci5tZXRhIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT4pXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIGZpZWxkLmZpZWxkID09PSByZWYucmVmZXJlbmNlZFByb3BlcnR5XG4gICAgICAgICk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyB0by5maWVsZCA6IHRvLm5hbWU7XG4gICAgICAgIHJlZmVyZW5jZWQuc2V0KG5hbWUsIHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmZXJlbmNlZC5zaXplID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChyZWZlcmVuY2VkLnNpemUgPT09IDEgJiYgQXJyYXkuZnJvbShyZWZlcmVuY2VkLnZhbHVlcygpKVswXSA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShyZWZlcmVuY2VkLCB7IHNpbmdsZSB9KVxuICAgICAgOiBPYmplY3QuZnJvbUVudHJpZXMocmVmZXJlbmNlZCk7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBuYXZpZ2F0aW9uLFxuICAgIH0pLnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSAoc2VsZiBhcyBhbnkpW2ZpZWxkLm5hbWVdO1xuICAgICAgY29uc3QgZXJycyA9IGZpZWxkLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCB9KTtcbiAgICAgIHJldHVybiBlcnJzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IGVycnMgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWZzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdHMoKTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2ZpZWxkLm5hbWVdOiB2YWx1ZSB9KVxuICAgICAgICA6IGFjYztcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGRlZnMpID8gZGVmcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhc0NoYW5nZWQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7IGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFsuLi5zZWxmLl9hdHRyaWJ1dGVzLnZhbHVlcygpXVxuICAgICAgLmZpbHRlcigoYXR0cikgPT4gIWF0dHIubmF2aWdhdGlvbiB8fCBpbmNsdWRlX25hdmlnYXRpb24pXG4gICAgICAuc29tZShcbiAgICAgICAgKGF0dHIpID0+XG4gICAgICAgICAgKCFpbmNsdWRlX25hdmlnYXRpb24gfHwgYXR0ci5uYXZpZ2F0aW9uKSAmJlxuICAgICAgICAgIGF0dHIuaXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pXG4gICAgICApO1xuICB9XG5cbiAgaGFzS2V5KHNlbGY6IE9EYXRhTW9kZWw8VD4pIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlS2V5KHNlbGYpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICB3aXRoUmVzb3VyY2U8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KFxuICAgIHNlbGY6IE0sXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICAgICAgfCBudWxsLFxuICAgIGN0eDogKG1vZGVsOiBNKSA9PiBSXG4gICk6IFIge1xuICAgIC8vIFB1c2hcbiAgICBzZWxmLnB1c2hSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgLy8gRXhlY3V0ZSBmdW5jdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGN0eChzZWxmKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gUG9wXG4gICAgICAgICAgc2VsZi5wb3BSZXNvdXJjZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9wXG4gICAgICBzZWxmLnBvcFJlc291cmNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICBhc0VudGl0eTxSLCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4oc2VsZjogTSwgY3R4OiAobW9kZWw6IE0pID0+IFIpOiBSIHtcbiAgICAvLyBDbG9uZSBxdWVyeSBmcm9tIGhpbSBvciBwYXJlbnRcbiAgICBsZXQgcXVlcnkgPSBzZWxmLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpO1xuICAgIGlmIChcbiAgICAgIHF1ZXJ5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHNlbGYuX3BhcmVudCAmJlxuICAgICAgc2VsZi5fcGFyZW50WzBdIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uXG4gICAgKVxuICAgICAgcXVlcnkgPSBzZWxmLl9wYXJlbnRbMF0uX3Jlc291cmNlPy5jbG9uZVF1ZXJ5PFQ+KCk7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KHF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy53aXRoUmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2UsIGN0eCk7XG4gIH1cblxuICB0b0VudGl0eShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgICBpbmNsdWRlX2lkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICBjaGFpbiA9IFtdLFxuICAgIH06IHtcbiAgICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfaWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgICB9ID0ge31cbiAgKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgZW50aXR5OiBhbnkgPSBbLi4uc2VsZi5fYXR0cmlidXRlcy52YWx1ZXMoKV1cbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYWluXG4gICAgICAgIChhdHRyKSA9PiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gYXR0ci5nZXQoKSlcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYW5nZXMgb25seVxuICAgICAgICAoYXR0cikgPT5cbiAgICAgICAgICAhY2hhbmdlc19vbmx5IHx8XG4gICAgICAgICAgKGNoYW5nZXNfb25seSAmJiBhdHRyLmlzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSlcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChhdHRyKSA9PlxuICAgICAgICAgIC8vIE5hdmlnYXRpb25cbiAgICAgICAgICAoaW5jbHVkZV9uYXZpZ2F0aW9uICYmIGF0dHIubmF2aWdhdGlvbiAmJiBhdHRyLmdldCgpICE9PSBudWxsKSB8fFxuICAgICAgICAgICFhdHRyLm5hdmlnYXRpb25cbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjYywgYXR0cikgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGF0dHIuZmllbGROYW1lIDogYXR0ci5uYW1lO1xuICAgICAgICBsZXQgdmFsdWU6IGFueSA9IGF0dHIuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkID0gYXR0ci5jb21wdXRlZDtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbiA9IGF0dHIubmF2aWdhdGlvbjtcbiAgICAgICAgY29uc3QgY29uY3VycmVuY3kgPSBhdHRyLmNvbmN1cnJlbmN5O1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBPRGF0YU1vZGVsPGFueT4pLnRvRW50aXR5KHtcbiAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzX29ubHkgJiYgISFuYXZpZ2F0aW9uLFxuICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVfa2V5ICYmICEhbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGluY2x1ZGVfaWQ6IGluY2x1ZGVfaWQgJiYgISFuYXZpZ2F0aW9uLFxuICAgICAgICAgICAgY2hhaW46IFtzZWxmLCAuLi5jaGFpbl0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gKHZhbHVlIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pLnRvRW50aXRpZXMoe1xuICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNfb25seSAmJiAhIW5hdmlnYXRpb24sXG4gICAgICAgICAgICBpbmNsdWRlX2tleTogaW5jbHVkZV9rZXkgJiYgISFuYXZpZ2F0aW9uLFxuICAgICAgICAgICAgaW5jbHVkZV9pZDogaW5jbHVkZV9pZCAmJiAhIW5hdmlnYXRpb24sXG4gICAgICAgICAgICBjaGFpbjogW3NlbGYsIC4uLmNoYWluXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZV9jb25jdXJyZW5jeSAmJiBjb25jdXJyZW5jeSkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVfY29tcHV0ZWQgJiYgY29tcHV0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzX29ubHkgJiYgYXR0ci5pc0NoYW5nZWQoKSkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFjaGFuZ2VzX29ubHkgJiYgIWNvbmN1cnJlbmN5ICYmICFjb21wdXRlZCkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG5cbiAgICBpZiAoaW5jbHVkZV9ub25fZmllbGQpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoZW50aXR5KTtcbiAgICAgIC8vIEF0dHJpYnV0ZXMgZnJvbSBvYmplY3QgKGF0dHJpYnV0ZXMgZm9yIG9iamVjdClcbiAgICAgIGNvbnN0IG5vbkZpZWxkQXR0cnMgPSBPYmplY3QuZW50cmllcyhzZWxmKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICBuYW1lcy5pbmRleE9mKGspID09PSAtMSAmJiAhay5zdGFydHNXaXRoKCdfJykgJiYgIWsuZW5kc1dpdGgoJyQnKVxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgW2ssIHZdKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBba106IHYgfSksIHt9KTtcbiAgICAgIGVudGl0eSA9IHsgLi4uZW50aXR5LCAuLi5ub25GaWVsZEF0dHJzIH07XG4gICAgfVxuXG4gICAgLy8gQWRkIGNsaWVudF9pZFxuICAgIGlmIChjbGllbnRfaWQpIHtcbiAgICAgICg8YW55PmVudGl0eSlbdGhpcy5jaWRdID0gKDxhbnk+c2VsZilbdGhpcy5jaWRdO1xuICAgIH1cblxuICAgIC8vIEFkZCBrZXlcbiAgICBpZiAoaW5jbHVkZV9rZXkpIHtcbiAgICAgIGVudGl0eSA9IHtcbiAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAuLi4odGhpcy5yZXNvbHZlS2V5KHNlbGYsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZTogZmFsc2UgfSkgYXMge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgaWRcbiAgICBpZiAoaW5jbHVkZV9pZCkge1xuICAgICAgc2VsZi5hc0VudGl0eSgoZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IGUucmVzb3VyY2UoKTtcbiAgICAgICAgaWYgKHJlc291cmNlKVxuICAgICAgICAgIGVudGl0eVt0aGlzLmFwaS5vcHRpb25zLmhlbHBlci5PREFUQV9JRF0gPSBgJHtyZXNvdXJjZS5jbGVhclF1ZXJ5KCl9YDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB0eXBlXG4gICAgaWYgKFxuICAgICAgc2VsZi5fcGFyZW50ICE9PSBudWxsICYmXG4gICAgICAoKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoc2VsZi5fcGFyZW50WzBdKSAmJlxuICAgICAgICAoc2VsZi5fcGFyZW50WzFdIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+KS5tZXRhICE9PSBzZWxmLl9tZXRhKSB8fFxuICAgICAgICAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHNlbGYuX3BhcmVudFswXSkgJiZcbiAgICAgICAgICAoc2VsZi5fcGFyZW50WzBdIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pLl9tb2RlbFxuICAgICAgICAgICAgLm1ldGEgIT09IHNlbGYuX21ldGEpKVxuICAgICkge1xuICAgICAgZW50aXR5W3RoaXMuYXBpLm9wdGlvbnMuaGVscGVyLk9EQVRBX1RZUEVdID0gYCMke3RoaXMuc2NoZW1hLnR5cGUoKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRpdHkgYXMgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9XG5cbiAgcmVzZXQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7IG5hbWUsIHNpbGVudCA9IGZhbHNlIH06IHsgbmFtZT86IHN0cmluZzsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgbGV0IGNoYW5nZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzZXQgdmFsdWVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKFxuICAgICAgICBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBhdHRyaWJ1dGUuaXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlIH0pXG4gICAgICApIHtcbiAgICAgICAgYXR0cmlidXRlLnJlc2V0KCk7XG4gICAgICAgIGNoYW5nZXMgPSBbbmFtZV07XG4gICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZT8uaXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgYXR0cmlidXRlLnJlc2V0KCk7XG4gICAgICAgIGNoYW5nZXMgPSBbbmFtZV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlc2V0IGFsbFxuICAgICAgY2hhbmdlcyA9IFsuLi5zZWxmLl9hdHRyaWJ1dGVzLmtleXMoKV07XG4gICAgICAvL3NlbGYuX2NoYW5nZXMuY2xlYXIoKTtcbiAgICAgIHNlbGYuX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0ciwga2V5KSA9PiB7XG4gICAgICAgIGlmIChhdHRyLmlzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSB9KSkge1xuICAgICAgICAgIGF0dHIucmVzZXQoKTtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghc2lsZW50ICYmIGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgc2VsZi5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCwgeyBvcHRpb25zOiB7IGNoYW5nZXMgfSB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBlbnRpdHk6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICBhZGQgPSB0cnVlLFxuICAgICAgbWVyZ2UgPSB0cnVlLFxuICAgICAgcmVtb3ZlID0gdHJ1ZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgYWRkPzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBzZWxmLl9hc3NpZ24gPSB7XG4gICAgICBhZGQsXG4gICAgICBtZXJnZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIHJlc2V0LFxuICAgICAgcmVwYXJlbnQsXG4gICAgICBzaWxlbnQsXG4gICAgfTtcblxuICAgIGNvbnN0IGNoYW5nZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBUaGUgbW9kZWwgXG4gICAgY29uc3QgbW9kZWwgPSBzZWxmIGFzIGFueTtcbiAgICAvLyBVcGRhdGUgYW5ub3RhdGlvbnNcbiAgICBtb2RlbC5hbm5vdHMoKS51cGRhdGUoZW50aXR5KTtcbiAgICAvLyBVcGRhdGUgYXR0cmlidXRlc1xuICAgIGNvbnN0IGF0dHJzID0gbW9kZWwuYW5ub3RzKCkuYXR0cmlidXRlcyhlbnRpdHksICdmdWxsJyk7XG4gICAgT2JqZWN0LmVudHJpZXMoYXR0cnMpXG4gICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpIC8vIEZpbHRlciB1bmRlZmluZWRcbiAgICAgIC5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcyh7XG4gICAgICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSkuZmluZChcbiAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PlxuICAgICAgICAgICAgKHNlbGYuX2Fzc2lnbi5yZXNldCAmJiBmaWVsZC5maWVsZCA9PT0ga2V5KSB8fCBmaWVsZC5uYW1lID09PSBrZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIERlbGVnYXRlZCB0byBwcml2YXRlIHNldHRlclxuICAgICAgICAgIGlmICh0aGlzLnNldChzZWxmLCBmaWVsZCwgdmFsdWUpKSB7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goZmllbGQubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEJhc2ljIGFzc2lnbm1lbnRcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gbW9kZWxba2V5XTtcbiAgICAgICAgICBtb2RlbFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IHZhbHVlKSBjaGFuZ2VzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAoIXNlbGYuX2Fzc2lnbi5zaWxlbnQgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzZWxmLmV2ZW50cyQudHJpZ2dlcihcbiAgICAgICAgc2VsZi5fYXNzaWduLnJlc2V0ID8gT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCA6IE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLFxuICAgICAgICB7IG9wdGlvbnM6IHsgY2hhbmdlcyB9IH1cbiAgICAgICk7XG4gICAgfVxuICAgIHNlbGYuX2Fzc2lnbiA9IHtcbiAgICAgIGFkZDogZmFsc2UsXG4gICAgICBtZXJnZTogZmFsc2UsXG4gICAgICByZW1vdmU6IGZhbHNlLFxuICAgICAgcmVzZXQ6IGZhbHNlLFxuICAgICAgcmVwYXJlbnQ6IGZhbHNlLFxuICAgICAgc2lsZW50OiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpc01vZGVsKG9iajogYW55KSB7XG4gICAgcmV0dXJuIFR5cGVzLnJhd1R5cGUob2JqKSA9PT0gJ01vZGVsJztcbiAgfVxuXG4gIHN0YXRpYyBpc0NvbGxlY3Rpb24ob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gVHlwZXMucmF3VHlwZShvYmopID09PSAnQ29sbGVjdGlvbic7XG4gIH1cblxuICBnZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+IHwgc3RyaW5nXG4gICk6IEYgfCBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXR0ciA9IHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KFxuICAgICAgZmllbGQgaW5zdGFuY2VvZiBPRGF0YU1vZGVsRmllbGQgPyBmaWVsZC5uYW1lIDogZmllbGRcbiAgICApO1xuICAgIGlmIChhdHRyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXR0ci5nZXQoKTtcbiAgICAgIGlmIChcbiAgICAgICAgKGF0dHIubmF2aWdhdGlvbiAmJiB2YWx1ZSA9PT0gbnVsbCkgfHxcbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICAvLyBDaGVjayBmb3IgcmVmZXJlbmNlXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZWQgPSB0aGlzLnJlc29sdmVSZWZlcmVuY2VkKHNlbGYsIGF0dHIpO1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgcmVmZXJlbmNlZCAhPT0gbnVsbCAmJiByZWZlcmVuY2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAodmFsdWUgYXMgT0RhdGFNb2RlbDxGPikuYXNzaWduKHJlZmVyZW5jZWQgYXMgUGFydGlhbDxGPiwge1xuICAgICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHJlZmVyZW5jZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBOZXcgdmFsdWUgaXMgbnVsbFxuICAgICAgICAgIChhdHRyIGFzIE9EYXRhTW9kZWxBdHRyaWJ1dGU8Rj4pLnNldChudWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiByZWZlcmVuY2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgICAgICAgIChhdHRyIGFzIE9EYXRhTW9kZWxBdHRyaWJ1dGU8Rj4pLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICFmaWVsZC5zdGFydHNXaXRoKCdfJykgJiZcbiAgICAgICFmaWVsZC5lbmRzV2l0aCgnJCcpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHNlbGYgYXMgYW55KVtmaWVsZF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBzZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+IHwgc3RyaW5nLFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGwsXG4gICAgeyB0eXBlIH06IHsgdHlwZT86IHN0cmluZyB9ID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IG1vZGVsRmllbGQgPVxuICAgICAgZmllbGQgaW5zdGFuY2VvZiBPRGF0YU1vZGVsRmllbGQgPyBmaWVsZCA6IHRoaXMuZmluZEZpZWxkPEY+KGZpZWxkKTtcbiAgICBpZiAoXG4gICAgICBtb2RlbEZpZWxkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuaXNPcGVuVHlwZSgpICYmXG4gICAgICB0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnXG4gICAgKSB7XG4gICAgICB0eXBlID0gdHlwZSA/PyAodGhpcy50c1RvRWRtW3R5cGVvZiB2YWx1ZV0gYXMgRWRtVHlwZSkgPz8gJyc7XG4gICAgICBtb2RlbEZpZWxkID0gdGhpcy5tb2RlbEZpZWxkRmFjdG9yeTxGPihzZWxmLCBmaWVsZCwgdHlwZSk7XG4gICAgfVxuICAgIGlmIChtb2RlbEZpZWxkID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpZWxkIHdpdGggbmFtZSAke2ZpZWxkIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgbGV0IGF0dHIgPSBzZWxmLl9hdHRyaWJ1dGVzLmdldChtb2RlbEZpZWxkLm5hbWUpO1xuXG4gICAgLy8gRW5zdXJlcyB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzXG4gICAgaWYgKGF0dHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXR0ciA9IG5ldyBPRGF0YU1vZGVsQXR0cmlidXRlKHNlbGYsIG1vZGVsRmllbGQpO1xuICAgICAgdGhpcy5fbGluayhzZWxmLCBhdHRyKTtcbiAgICAgIHNlbGYuX2F0dHJpYnV0ZXMuc2V0KG1vZGVsRmllbGQubmFtZSwgYXR0cik7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGF0dHIuZ2V0KCk7XG5cbiAgICBpZiAobW9kZWxGaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBOZXcgdmFsdWUgaXMgbnVsbFxuICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQodmFsdWUgYXMgbnVsbCwgc2VsZi5fYXNzaWduLnJlc2V0LCBzZWxmLl9hc3NpZ24ucmVwYXJlbnQpO1xuICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oY3VycmVudCkpIHtcbiAgICAgICAgLy8gQ3VycmVudCBpcyBjb2xsZWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb2xsZWN0aW9uID0gY3VycmVudCBhcyBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj47XG4gICAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIGNvbGxlY3Rpb25cbiAgICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQoXG4gICAgICAgICAgICB2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4sXG4gICAgICAgICAgICBzZWxmLl9hc3NpZ24ucmVzZXQsXG4gICAgICAgICAgICBzZWxmLl9hc3NpZ24ucmVwYXJlbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFR5cGVzLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIGFycmF5XG4gICAgICAgICAgY3VycmVudENvbGxlY3Rpb24uX2Fubm90YXRpb25zID0gbW9kZWxGaWVsZC5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICAgICAgICBzZWxmLmFubm90cygpXG4gICAgICAgICAgKSBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8Rj47XG4gICAgICAgICAgY3VycmVudENvbGxlY3Rpb24uYXNzaWduKHZhbHVlIGFzIFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sIHNlbGYuX2Fzc2lnbik7XG4gICAgICAgICAgY2hhbmdlZCA9IGN1cnJlbnRDb2xsZWN0aW9uLmhhc0NoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpKSB7XG4gICAgICAgIC8vIEN1cnJlbnQgaXMgbW9kZWxcbiAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3VycmVudCBhcyBPRGF0YU1vZGVsPEY+O1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBOZXcgdmFsdWUgaXMgbW9kZWxcbiAgICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQoXG4gICAgICAgICAgICB2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+LFxuICAgICAgICAgICAgc2VsZi5fYXNzaWduLnJlc2V0LFxuICAgICAgICAgICAgc2VsZi5fYXNzaWduLnJlcGFyZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgY3VycmVudE1vZGVsLl9hbm5vdGF0aW9ucyA9IG1vZGVsRmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgICAgICAgICBzZWxmLmFubm90cygpXG4gICAgICAgICAgICApIGFzIE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8Rj47XG4gICAgICAgICAgICBjdXJyZW50TW9kZWwuYXNzaWduKHZhbHVlIGFzIEYgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwgc2VsZi5fYXNzaWduKTtcbiAgICAgICAgICAgIGNoYW5nZWQgPSBjdXJyZW50TW9kZWwuaGFzQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDdXJyZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgbW9kZWwvY29sbGVjdGlvbiBmb3IgZ2l2ZW4gdmFsdWVcbiAgICAgICAgY2hhbmdlZCA9IGF0dHIuc2V0KFxuICAgICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkgfHxcbiAgICAgICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpXG4gICAgICAgICAgICA/ICh2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+KVxuICAgICAgICAgICAgOiBtb2RlbEZpZWxkLmNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgPyBtb2RlbEZpZWxkLmNvbGxlY3Rpb25GYWN0b3J5PEY+KHtcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHNlbGYsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlIGFzIEZbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sXG4gICAgICAgICAgICAgICAgcmVzZXQ6IHNlbGYuX2Fzc2lnbi5yZXNldCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBtb2RlbEZpZWxkLm1vZGVsRmFjdG9yeTxGPih7XG4gICAgICAgICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICByZXNldDogc2VsZi5fYXNzaWduLnJlc2V0LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICBzZWxmLl9hc3NpZ24ucmVzZXQsXG4gICAgICAgICAgc2VsZi5fYXNzaWduLnJlcGFyZW50XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgcmVmZXJlbnRpYWxzXG4gICAgICBpZiAoIU9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihhdHRyLmdldCgpKSkge1xuICAgICAgICBjb25zdCByZWYgPSBtb2RlbEZpZWxkLm1ldGE/LnJlc29sdmVSZWZlcmVudGlhbChhdHRyLmdldCgpLCBhdHRyKTtcbiAgICAgICAgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2VsZiwgcmVmKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkID0gYXR0ci5zZXQodmFsdWUsIHNlbGYuX2Fzc2lnbi5yZXNldCwgc2VsZi5fYXNzaWduLnJlcGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGYuX2Fzc2lnbi5zaWxlbnQgJiYgY2hhbmdlZCkge1xuICAgICAgc2VsZi5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5DaGFuZ2UsIHtcbiAgICAgICAgYXR0cixcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICBvcHRpb25zOiB7IGtleTogbW9kZWxGaWVsZC5pc0tleSgpIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgX2xpbms8Rj4oc2VsZjogT0RhdGFNb2RlbDxUPiwgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxGPikge1xuICAgIGF0dHIuZXZlbnRzJC5zdWJzY3JpYmUoKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8YW55PikgPT4ge1xuICAgICAgaWYgKGV2ZW50LmNhbkNvbnRpbnVlV2l0aChzZWxmKSkge1xuICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IGF0dHIuZ2V0KCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBldmVudC50eXBlID09PSBPRGF0YU1vZGVsRXZlbnRUeXBlLkNoYW5nZSAmJlxuICAgICAgICAgICAgYXR0ci5uYXZpZ2F0aW9uICYmXG4gICAgICAgICAgICBldmVudC5vcHRpb25zPy5rZXlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IChhdHRyLmdldCgpIGFzIE9EYXRhTW9kZWw8YW55PikucmVmZXJlbnRpYWwoYXR0cik7XG4gICAgICAgICAgICBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2VsZiwgcmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChldmVudC5wdXNoKHNlbGYsIGF0dHIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19