@decaf-ts/for-typeorm 0.0.14 → 0.0.15

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.
@@ -1197,6 +1197,69 @@
1197
1197
  const pattern = regex.source;
1198
1198
  return pattern;
1199
1199
  }
1200
+ function splitEagerRelations(m, cache = {}) {
1201
+ let instance;
1202
+ try {
1203
+ instance = new m();
1204
+ }
1205
+ catch (e) {
1206
+ throw new dbDecorators.InternalError(`Could not instantiate model ${m.name} for eager relation calculation: ${e}`);
1207
+ }
1208
+ const rels = core.Repository.relations(m);
1209
+ const log = logging.Logging.for(splitEagerRelations);
1210
+ cache[m.name] = cache[m.name] || undefined;
1211
+ if (cache[m.name]) {
1212
+ log.info(`Returning cached relations for ${m.name}`);
1213
+ return cache[m.name];
1214
+ }
1215
+ const relations = rels.reduce((accum, attr) => {
1216
+ log.info(`Retrieving decorators for property ${attr} on model ${m.name}`);
1217
+ const decorators = reflection.Reflection.getPropertyDecorators(core.Repository.key(core.PersistenceKeys.RELATION), instance, attr, true);
1218
+ if (!decorators ||
1219
+ !decorators.decorators ||
1220
+ !decorators.decorators.length)
1221
+ throw new dbDecorators.InternalError(`No decorators found for property ${attr} on model ${m.name}`);
1222
+ if (decorators.decorators.length > 1)
1223
+ throw new dbDecorators.InternalError(`Multiple decorators found for property ${attr} on model ${m.name}`);
1224
+ log.info(`Decorators found: ${JSON.stringify(decorators.decorators, null, 2)}`);
1225
+ const decorator = decorators.decorators[0];
1226
+ const eager = decorator.props.populate;
1227
+ let clazz = decorator.props.class;
1228
+ if (typeof clazz === "string")
1229
+ clazz = decoratorValidation.Model.get(clazz);
1230
+ if (typeof clazz === "function" && !clazz.name)
1231
+ clazz = clazz();
1232
+ if (!clazz)
1233
+ throw new dbDecorators.InternalError(`Could not find class for property ${attr} on model ${m.name}`);
1234
+ log.info(`Relation on prop ${attr} of ${m.name} found: ${clazz.name} with eager: ${eager}`);
1235
+ if (!eager) {
1236
+ accum.nonEager.push(attr);
1237
+ }
1238
+ else {
1239
+ accum.relations.push(attr);
1240
+ }
1241
+ if (accum.relations.includes(attr)) {
1242
+ log.info(`Getting relations for ${clazz.name} in prop ${attr} of ${m.name} with eager: ${eager}`);
1243
+ const { nonEager, relations } = splitEagerRelations(clazz, cache);
1244
+ log.info(`Relations for ${attr} of ${clazz.name}: ${JSON.stringify(relations, null, 2)}`);
1245
+ log.info(`Non eager for ${attr} of ${clazz.name}: ${JSON.stringify(nonEager, null, 2)}`);
1246
+ if (nonEager.length && accum.relations.includes(attr)) {
1247
+ const nonEagerRelations = nonEager.map((ne) => `${attr}.${ne}`);
1248
+ accum.nonEager.push(...nonEagerRelations);
1249
+ }
1250
+ if (relations.length) {
1251
+ const rels = relations.map((ne) => `${attr}.${ne}`);
1252
+ accum.relations.push(...rels);
1253
+ }
1254
+ log.info(`calculated Relations for ${attr} of ${clazz.name}: ${JSON.stringify(relations, null, 2)}`);
1255
+ log.info(`calculated Non eager for ${attr} of ${clazz.name}: ${JSON.stringify(nonEager, null, 2)}`);
1256
+ }
1257
+ return accum;
1258
+ }, { nonEager: [], relations: [] });
1259
+ cache[m.name] = relations;
1260
+ logging.Logging.for(splitEagerRelations).info(`Relations for ${m.name}: ${JSON.stringify(relations, null, 2)}`);
1261
+ return relations;
1262
+ }
1200
1263
 
1201
1264
  function extractForRelations(target, property, columns) {
1202
1265
  let index = 0;
@@ -1221,9 +1284,15 @@
1221
1284
  return accum;
1222
1285
  }, {});
1223
1286
  }
1224
- function aggregateOrNewColumn(target, property, columns, options = {}, mode = "regular", relations) {
1287
+ function aggregateOrNewColumn(target, property, columns, options = {}, mode = "regular", relations, indexes) {
1225
1288
  const cols = columns.filter((c) => c.target === target && c.propertyName === property);
1226
1289
  const rels = relations.filter((c) => c.target === target && c.propertyName === property);
1290
+ if (indexes) {
1291
+ const indx = indexes.filter((c) => c.target === target && c.columns.includes(property));
1292
+ indx.forEach((i) => {
1293
+ Object.assign(i, options);
1294
+ });
1295
+ }
1227
1296
  if (cols.length > 1)
1228
1297
  throw new dbDecorators.InternalError(`Multiple columns for ${property} found for given target: ${columns.map((c) => c.propertyName).join(", ")}`);
1229
1298
  if (rels.length > 1)
@@ -1321,7 +1390,7 @@
1321
1390
  columns: [propertyName],
1322
1391
  });
1323
1392
  const metadata = typeorm.getMetadataArgsStorage();
1324
- aggregateOrNewColumn(object.constructor, propertyName, metadata.columns, options, "regular", metadata.relations);
1393
+ aggregateOrNewColumn(object.constructor, propertyName, metadata.columns, options, "regular", metadata.relations, options.unique ? metadata.indices : undefined);
1325
1394
  if (options.generated) {
1326
1395
  typeorm.getMetadataArgsStorage().generations.push({
1327
1396
  target: object.constructor,
@@ -2033,18 +2102,21 @@
2033
2102
  let result;
2034
2103
  try {
2035
2104
  const repo = this.dataSource.getRepository(m);
2105
+ const { nonEager, relations } = splitEagerRelations(m);
2036
2106
  const q = {
2037
2107
  where: {
2038
2108
  [pk]: id,
2039
2109
  },
2110
+ relations: relations,
2111
+ loadRelationIds: {
2112
+ relations: nonEager,
2113
+ },
2040
2114
  };
2041
- result = (await repo.findOne(q));
2115
+ result = (await repo.findOneOrFail(q));
2042
2116
  }
2043
2117
  catch (e) {
2044
2118
  throw this.parseError(e);
2045
2119
  }
2046
- if (!result)
2047
- throw new dbDecorators.NotFoundError(`Record with id: ${id} not found in table ${typeof tableName === "string" ? tableName : core.Repository.table(tableName)}`);
2048
2120
  return result;
2049
2121
  }
2050
2122
  /**
@@ -2084,6 +2156,7 @@
2084
2156
  const model = await this.read(tableName, id, pk);
2085
2157
  try {
2086
2158
  const repo = this.dataSource.getRepository(m);
2159
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2087
2160
  const res = await repo.delete(id);
2088
2161
  return model;
2089
2162
  }
@@ -2224,7 +2297,7 @@
2224
2297
  const code = typeof err === "string" ? err : err.message;
2225
2298
  if (code.match(/duplicate key|already exists/g))
2226
2299
  return new dbDecorators.ConflictError(code);
2227
- if (code.match(/does not exist|not found/g))
2300
+ if (code.match(/does not exist|not found|Could not find/g))
2228
2301
  return new dbDecorators.NotFoundError(code);
2229
2302
  // PostgreSQL error codes: https://www.postgresql.org/docs/current/errcodes-appendix.html
2230
2303
  switch (code.toString()) {
@@ -2702,12 +2775,14 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2702
2775
  decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
2703
2776
  .for(oneToOneKey)
2704
2777
  .define({
2705
- decorator: function oneToOne(clazz, cascade, populate, fk) {
2778
+ decorator: function oneToOne(clazz, cascade, populate, joinColumnOpts, fk) {
2706
2779
  const metadata = {
2707
- class: (clazz.name ? clazz.name : clazz),
2780
+ class: clazz.name ? clazz.name : clazz,
2708
2781
  cascade: cascade,
2709
2782
  populate: populate,
2710
2783
  };
2784
+ if (joinColumnOpts)
2785
+ metadata.joinTable = joinColumnOpts;
2711
2786
  if (fk)
2712
2787
  metadata.name = fk;
2713
2788
  const ormMeta = {
@@ -2734,7 +2809,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2734
2809
  }, (model) => {
2735
2810
  const pk = dbDecorators.findPrimaryKey(new clazz()).id;
2736
2811
  return model[pk];
2737
- }, ormMeta), typeorm.JoinColumn(metadata.name
2812
+ }, ormMeta), typeorm.JoinColumn(joinColumnOpts || metadata.name
2738
2813
  ? {
2739
2814
  foreignKeyConstraintName: metadata.name,
2740
2815
  }
@@ -2747,47 +2822,57 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2747
2822
  decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
2748
2823
  .for(oneToManyKey)
2749
2824
  .define({
2750
- decorator: function oneToMany(clazz, cascade, populate) {
2751
- const metadata = {
2752
- class: (clazz.name ? clazz.name : clazz),
2825
+ decorator: function oneToMany(clazz, cascade, populate, joinTableOpts, fk) {
2826
+ const meta = {
2827
+ class: clazz.name ? clazz.name : clazz,
2753
2828
  cascade: cascade,
2754
2829
  populate: populate,
2755
2830
  };
2756
- return reflection.apply(decoratorValidation.prop(core.PersistenceKeys.RELATIONS), decoratorValidation.list(clazz), decoratorValidation.propMetadata(oneToManyKey, metadata), function OneToManyWrapper(obj, prop) {
2757
- const ormMeta = {
2758
- cascade: cascade.update === core.Cascade.CASCADE ||
2759
- cascade.delete === core.Cascade.CASCADE,
2760
- onDelete: cascade.delete ? "CASCADE" : "DEFAULT",
2761
- onUpdate: cascade.update ? "CASCADE" : "DEFAULT",
2762
- nullable: true,
2763
- eager: populate,
2764
- };
2765
- return OneToMany(() => {
2766
- if (!clazz.name)
2767
- clazz = clazz();
2768
- if (!clazz[decoratorValidation.ModelKeys.ANCHOR])
2769
- throw new dbDecorators.InternalError("Original Model not found in constructor");
2770
- return clazz[decoratorValidation.ModelKeys.ANCHOR];
2771
- }, (model) => {
2772
- if (!clazz.name)
2773
- clazz = clazz();
2774
- const m = new clazz();
2775
- const crossRelationKey = Object.keys(m).find((k) => {
2776
- const decs = reflection.Reflection.getPropertyDecorators(core.Repository.key(core.PersistenceKeys.MANY_TO_ONE), m, k, true);
2777
- if (!decs || !decs.decorators || !decs.decorators.length)
2778
- return false;
2779
- const dec = decs.decorators[0];
2780
- const clazz = typeof dec.props.class === "function" &&
2781
- !dec.props.class.name
2782
- ? dec.props.class()
2783
- : dec.props.class;
2784
- return clazz.name === obj.constructor.name;
2785
- });
2786
- if (!crossRelationKey)
2787
- throw new dbDecorators.InternalError(`Cross relation not found. Did you use @manyToOne on the ${clazz.name}?`);
2788
- return model[crossRelationKey];
2789
- }, ormMeta)(obj, prop);
2790
- });
2831
+ if (joinTableOpts)
2832
+ meta.joinTable = joinTableOpts;
2833
+ if (fk)
2834
+ meta.name = fk;
2835
+ const decorators = [
2836
+ decoratorValidation.prop(core.PersistenceKeys.RELATIONS),
2837
+ decoratorValidation.list(clazz),
2838
+ decoratorValidation.propMetadata(oneToManyKey, meta),
2839
+ function OneToManyWrapper(obj, prop) {
2840
+ const ormMeta = {
2841
+ cascade: cascade.update === core.Cascade.CASCADE ||
2842
+ cascade.delete === core.Cascade.CASCADE,
2843
+ onDelete: cascade.delete ? "CASCADE" : "DEFAULT",
2844
+ onUpdate: cascade.update ? "CASCADE" : "DEFAULT",
2845
+ nullable: true,
2846
+ eager: populate,
2847
+ };
2848
+ return OneToMany(() => {
2849
+ if (!clazz.name)
2850
+ clazz = clazz();
2851
+ if (!clazz[decoratorValidation.ModelKeys.ANCHOR])
2852
+ throw new dbDecorators.InternalError("Original Model not found in constructor");
2853
+ return clazz[decoratorValidation.ModelKeys.ANCHOR];
2854
+ }, (model) => {
2855
+ if (!clazz.name)
2856
+ clazz = clazz();
2857
+ const m = new clazz();
2858
+ const crossRelationKey = Object.keys(m).find((k) => {
2859
+ const decs = reflection.Reflection.getPropertyDecorators(core.Repository.key(core.PersistenceKeys.MANY_TO_ONE), m, k, true);
2860
+ if (!decs || !decs.decorators || !decs.decorators.length)
2861
+ return false;
2862
+ const dec = decs.decorators[0];
2863
+ const clazz = typeof dec.props.class === "function" &&
2864
+ !dec.props.class.name
2865
+ ? dec.props.class()
2866
+ : dec.props.class;
2867
+ return clazz.name === obj.constructor.name;
2868
+ });
2869
+ if (!crossRelationKey)
2870
+ throw new dbDecorators.InternalError(`Cross relation not found. Did you use @manyToOne on the ${clazz.name}?`);
2871
+ return model[crossRelationKey];
2872
+ }, ormMeta)(obj, prop);
2873
+ },
2874
+ ];
2875
+ return reflection.apply(...decorators);
2791
2876
  },
2792
2877
  })
2793
2878
  .apply();
@@ -2796,17 +2881,24 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2796
2881
  decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
2797
2882
  .for(manyToOneKey)
2798
2883
  .define({
2799
- decorator: function manyToOne(clazz, cascade, populate) {
2884
+ decorator: function manyToOne(clazz, cascade, populate, joinTableOpts, fk) {
2800
2885
  const metadata = {
2801
2886
  class: (clazz.name ? clazz.name : clazz),
2802
2887
  cascade: cascade,
2803
2888
  populate: populate,
2804
2889
  };
2805
- ({
2890
+ if (joinTableOpts)
2891
+ metadata.joinTable = joinTableOpts;
2892
+ if (fk)
2893
+ metadata.name = fk;
2894
+ const ormMeta = {
2806
2895
  cascade: cascade.update === core.Cascade.CASCADE ||
2807
2896
  cascade.delete === core.Cascade.CASCADE,
2808
- onDelete: cascade.delete ? "CASCADE" : "DEFAULT",
2809
- onUpdate: cascade.update ? "CASCADE" : "DEFAULT"});
2897
+ onDelete: cascade.delete ? "CASCADE" : "NO ACTION",
2898
+ onUpdate: cascade.update ? "CASCADE" : "NO ACTION",
2899
+ nullable: true,
2900
+ eager: populate,
2901
+ };
2810
2902
  return reflection.apply(decoratorValidation.prop(core.PersistenceKeys.RELATIONS), decoratorValidation.type([
2811
2903
  (typeof clazz === "function" && !clazz.name
2812
2904
  ? clazz
@@ -2838,7 +2930,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2838
2930
  if (!crossRelationKey)
2839
2931
  crossRelationKey = dbDecorators.findPrimaryKey(new clazz()).id;
2840
2932
  return model[crossRelationKey];
2841
- })(obj, prop);
2933
+ }, ormMeta)(obj, prop);
2842
2934
  });
2843
2935
  },
2844
2936
  })
@@ -2848,12 +2940,16 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2848
2940
  decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
2849
2941
  .for(manyToManyKey)
2850
2942
  .define({
2851
- decorator: function manyToMany(clazz, cascade, populate) {
2943
+ decorator: function manyToMany(clazz, cascade, populate, joinTableOpts, fk) {
2852
2944
  const metadata = {
2853
- class: clazz.name,
2945
+ class: clazz.name ? clazz.name : clazz,
2854
2946
  cascade: cascade,
2855
2947
  populate: populate,
2856
2948
  };
2949
+ if (joinTableOpts)
2950
+ metadata.joinTable = joinTableOpts;
2951
+ if (fk)
2952
+ metadata.name = fk;
2857
2953
  const ormMeta = {
2858
2954
  cascade: cascade.update === core.Cascade.CASCADE ||
2859
2955
  cascade.delete === core.Cascade.CASCADE,
@@ -2873,7 +2969,36 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2873
2969
  clazz = clazz();
2874
2970
  const pk = dbDecorators.findPrimaryKey(new clazz()).id;
2875
2971
  return model[pk];
2876
- }, ormMeta), typeorm.JoinTable());
2972
+ }, ormMeta), typeorm.JoinTable(joinTableOpts));
2973
+ },
2974
+ })
2975
+ .apply();
2976
+ // @index() => @Index()
2977
+ decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
2978
+ .for(core.PersistenceKeys.INDEX)
2979
+ .extend({
2980
+ decorator: function index(directions, compositions,
2981
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2982
+ name) {
2983
+ return function index(obj, prop) {
2984
+ if (typeof directions === "string") {
2985
+ directions = undefined;
2986
+ compositions = undefined;
2987
+ }
2988
+ if (typeof compositions === "string") {
2989
+ compositions = undefined;
2990
+ }
2991
+ if (!compositions && directions) {
2992
+ if (directions.find((d) => ![core.OrderDirection.ASC, core.OrderDirection.DSC].includes(d))) {
2993
+ compositions = directions;
2994
+ directions = undefined;
2995
+ }
2996
+ }
2997
+ if (compositions && compositions.length) {
2998
+ return typeorm.Index([prop, ...compositions])(obj);
2999
+ }
3000
+ return typeorm.Index()(obj, prop);
3001
+ };
2877
3002
  },
2878
3003
  })
2879
3004
  .apply();
@@ -2935,7 +3060,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2935
3060
  * @const VERSION
2936
3061
  * @memberOf module:for-typeorm
2937
3062
  */
2938
- const VERSION = "0.0.14";
3063
+ const VERSION = "0.0.15";
2939
3064
 
2940
3065
  exports.IndexError = IndexError;
2941
3066
  exports.TypeORMAdapter = TypeORMAdapter;
@@ -2954,7 +3079,8 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
2954
3079
  exports.createdByOnTypeORMCreateUpdate = createdByOnTypeORMCreateUpdate;
2955
3080
  exports.generateIndexes = generateIndexes;
2956
3081
  exports.reservedAttributes = reservedAttributes;
3082
+ exports.splitEagerRelations = splitEagerRelations;
2957
3083
  exports.translateOperators = translateOperators;
2958
3084
 
2959
3085
  }));
2960
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvT25lVG9PbmUudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9NYW55VG9NYW55LnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9FbnRpdHkudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuZXhwb3J0IGNvbnN0IFR5cGVPUk1GbGF2b3VyID0gXCJ0eXBlLW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgVHlwZU9STUtleXMgY29uc3RhbnQuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgdGhlIGtleXMgYW5kIHRoZWlyIG1lYW5pbmdzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEB0eXBlZGVmIFR5cGVPUk1LZXlzRGVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VQQVJBVE9SIFNlcGFyYXRvciB1c2VkIHRvIGpvaW4gdGFibGUgYW5kIGNvbHVtbiBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCBEZWZhdWx0IHByaW1hcnkga2V5IGZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVkVSU0lPTiBWZXJzaW9uIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUxFVEVEIFNvZnQtZGVsZXRlIHRpbWVzdGFtcCBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUQUJMRSBEYXRhYmFzZSB0YWJsZSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTQ0hFTUEgRGF0YWJhc2Ugc2NoZW1hIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUVVFTkNFIERhdGFiYXNlIHNlcXVlbmNlIG5hbWUga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOREVYIEluZGV4IGlkZW50aWZpZXIga2V5LlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB0aGF0IGlkZW50aWZ5IGNvbW1vbiBkYXRhYmFzZSBwcm9wZXJ0aWVzIGFuZCBhZGFwdGVyLXNwZWNpZmljIGtleXMuXG4gKiBAY29uc3QgVHlwZU9STUtleXNcbiAqIEB0eXBlIHtUeXBlT1JNS2V5c0RlZn1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1LZXlzID0ge1xuICBTRVBBUkFUT1I6IFwiLlwiLFxuICBJRDogXCJpZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgREVMRVRFRDogXCJkZWxldGVkX2F0XCIsXG4gIFRBQkxFOiBcInRhYmxlX25hbWVcIixcbiAgU0NIRU1BOiBcInNjaGVtYV9uYW1lXCIsXG4gIFNFUVVFTkNFOiBcInNlcXVlbmNlX25hbWVcIixcbiAgSU5ERVg6IFwiaW5kZXhcIixcbn07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBUeXBlT1JNIGluZGV4ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGVycm9yIHJlbGF0ZWQgdG8gaW5kZXggZ2VuZXJhdGlvbiBvciBoYW5kbGluZyB3aXRoaW4gdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBJbmRleEVycm9yXG4gKiB0cnkge1xuICogICAvLyBTb21lIGNvZGUgdGhhdCBtaWdodCB0aHJvdyBhbiBpbmRleCBlcnJvclxuICogICB0aHJvdyBuZXcgSW5kZXhFcnJvcihcIkluZGV4IG5vdCBmb3VuZFwiKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEluZGV4RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKFwiSW5kZXggZXJyb3Igb2NjdXJyZWQ6XCIsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEluZGV4RXJyb3IubmFtZSwgbXNnLCA0MDQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZW51bSBTUUxPcGVyYXRvciB7XG4gIEVRVUFMID0gXCI9XCIsXG4gIE5PVF9FUVVBTCA9IFwiPD5cIixcbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgR1JFQVRFUl9USEFOID0gXCI+XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9IFwiPj1cIixcbiAgSU4gPSBcIklOXCIsXG4gIE5PVF9JTiA9IFwiTk9UIElOXCIsXG4gIExJS0UgPSBcIkxJS0VcIixcbiAgSUxJS0UgPSBcIklMSUtFXCIsXG4gIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgSVNfTlVMTCA9IFwiSVMgTlVMTFwiLFxuICBJU19OT1RfTlVMTCA9IFwiSVMgTk9UIE5VTExcIixcbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICBBTlkgPSBcIkFOWVwiLFxuICBBTEwgPSBcIkFMTFwiLFxuICBTT01FID0gXCJTT01FXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFF1ZXJ5IGNvbnRhaW5lciB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVpdGhlciBhIHJhdyBTUUwgc3RyaW5nIG9yIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgYWxvbmcgd2l0aCBvcHRpb25hbCBib3VuZCB2YWx1ZXMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgTSBUaGUgTW9kZWwgdHlwZSBmb3Igd2hpY2ggdGhlIFNlbGVjdFF1ZXJ5QnVpbGRlciBpcyBwYXJhbWV0ZXJpemVkLlxuICogQHRlbXBsYXRlIFQgVGhlIHVuZGVybHlpbmcgcXVlcnkgdHlwZSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LlxuICogQGludGVyZmFjZSBUeXBlT1JNUXVlcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNUXVlcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCA9IE1vZGVsLFxuICBUIGV4dGVuZHMgc3RyaW5nIHwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+ID0gc3RyaW5nLFxuPiB7XG4gIHF1ZXJ5OiBUO1xuICB2YWx1ZXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgVHlwZU9STSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgRXh0ZW5kZWQgcmVwb3NpdG9yeSBmbGFncyBpbmNsdWRpbmcgY29ubmVjdGlvbi91c2VyIGNvbnRleHQgdGhhdCBjYW4gYmUgbGV2ZXJhZ2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1GbGFnc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1GbGFncyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXNlciBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUG9zdGdyZXMgZGF0YWJhc2UgY29ubmVjdGlvbnNcbiAgICovXG4gIHVzZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWNhdGlvbiBmb3IgYSB0YWJsZSBjcmVhdGlvbi9jaGFuZ2Ugc3RhdGVtZW50IHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgYSBUeXBlT1JNUXVlcnkgd2l0aCB0YWJsZSBtZXRhZGF0YSBzdWNoIGFzIHByaW1hcnkga2V5IGZsYWcsIGNvbnN0cmFpbnRzLCBhbmQgZm9yZWlnbiBrZXlzLlxuICogQHR5cGVkZWYgVHlwZU9STVRhYmxlU3BlY1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcmltYXJ5S2V5IEluZGljYXRlcyBpZiB0aGUgdGFyZ2V0IGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNvbnN0cmFpbnRzIEEgbGlzdCBvZiByYXcgU1FMIGNvbnN0cmFpbnRzIHRvIGFwcGx5IHRvIHRoZSB0YWJsZS9jb2x1bW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmb3JlaWduS2V5cyBBIGxpc3Qgb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludCBkZWZpbml0aW9ucy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZU9STVRhYmxlU3BlYyA9IFR5cGVPUk1RdWVyeSAmIHtcbiAgcHJpbWFyeUtleTogYm9vbGVhbjtcbiAgY29uc3RyYWludHM6IHN0cmluZ1tdO1xuICBmb3JlaWduS2V5czogc3RyaW5nW107XG59O1xuIiwiaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBxdWVyeSBsaW1pdCBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IE1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuIGluIGEgc2luZ2xlIHBhZ2Ugd2hlbiBwYWdpbmF0aW5nIHJlc3VsdHMuXG4gKiBAY29uc3QgVHlwZU9STVF1ZXJ5TGltaXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0ID0gMjUwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgd2hlbiB0cmFuc2xhdGluZyBoaWdoLWxldmVsIGZpbHRlcnMgaW50byBTUUwgdmlhIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUwgRXF1YWxpdHkgb3BlcmF0b3IgKD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRkVSRU5UIEluZXF1YWxpdHkgb3BlcmF0b3IgKDw+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUiBHcmVhdGVyIHRoYW4gb3BlcmF0b3IgKD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSX0VRIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPj0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUiBMZXNzIHRoYW4gb3BlcmF0b3IgKDwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUl9FUSBMZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKDw9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5PVCBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOIEluIGFycmF5IG9wZXJhdG9yIChJTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUdFWFAgUmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElSRUdFWFAgQ2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4qKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJS0UgUGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTElLRSBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKElMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJFVFdFRU4gUmFuZ2Ugb3BlcmF0b3IgKEJFVFdFRU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTlVMTCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOVUxMKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05PVF9OVUxMIE5PVCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOT1QgTlVMTClcbiAqIEBjb25zdCBUeXBlT1JNT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STU9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBTUUxPcGVyYXRvciB8IHN0cmluZz4gPSB7XG4gIEVRVUFMOiBTUUxPcGVyYXRvci5FUVVBTCxcbiAgRElGRkVSRU5UOiBTUUxPcGVyYXRvci5OT1RfRVFVQUwsXG4gIEJJR0dFUjogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOLFxuICBCSUdHRVJfRVE6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbiAgU01BTExFUjogU1FMT3BlcmF0b3IuTEVTU19USEFOLFxuICBTTUFMTEVSX0VROiBTUUxPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEJFVFdFRU46IFNRTE9wZXJhdG9yLkJFVFdFRU4sXG4gIE5PVDogXCJOT1RcIixcbiAgSU46IFNRTE9wZXJhdG9yLklOLFxuICBJU19OVUxMOiBTUUxPcGVyYXRvci5JU19OVUxMLFxuICBJU19OT1RfTlVMTDogU1FMT3BlcmF0b3IuSVNfTk9UX05VTEwsXG4gIFJFR0VYUDogXCJ+XCIsXG4gIElSRUdFWFA6IFwifipcIixcbiAgTElLRTogU1FMT3BlcmF0b3IuTElLRSxcbiAgSUxJS0U6IFNRTE9wZXJhdG9yLklMSUtFLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBsb2dpY2FsIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIHVzZWQgd2hlbiBidWlsZGluZyBXSEVSRSBjbGF1c2UgZ3JvdXBzIGluIFR5cGVPUk0gcXVlcmllcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFORCBMb2dpY2FsIEFORCBvcGVyYXRvciAoQU5EKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE9SIExvZ2ljYWwgT1Igb3BlcmF0b3IgKE9SKVxuICogQGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFORDogXCJBTkRcIixcbiAgT1I6IFwiT1JcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpYWwgY29uc3RhbnQgdmFsdWVzIHVzZWQgaW4gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFN0cmluZyBjb25zdGFudHMgcmVwcmVzZW50aW5nIHNwZWNpYWwgdmFsdWVzIHVzZWQgd2hpbGUgY29tcG9zaW5nIFNRTCB3aXRoIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMQ29uc3RUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVMTCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVsbCB2YWx1ZS5cbiAqIEBjb25zdCBUeXBlT1JNQ29uc3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Db25zdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTlVMTDogXCJOVUxMXCIsXG59O1xuIiwiaW1wb3J0IHsgUGFnaW5hdG9yLCBQYWdpbmdFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFJlcG9zaXRvcnkgYXMgUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgcGFnaW5hdGlvbiBmb3IgVHlwZU9STS1idWlsdCBxdWVyaWVzIHVzaW5nIHRha2Uvc2tpcCBmb3IgZWZmaWNpZW50IG5hdmlnYXRpb24gdGhyb3VnaCByZXN1bHQgc2V0cy5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgVHlwZU9STVBhZ2luYXRvcihhZGFwdGVyLCB7IHF1ZXJ5OiBxYiB9LCAxMCwgVXNlcik7XG4gKiBjb25zdCBwYWdlMSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICogY29uc3QgcGFnZTIgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgVHlwZU9STVF1ZXJ5XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSByZWNvcmQgY291bnQgYW5kIHBhZ2Ugc2l6ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3JlcG8/OiBSZXBvPGFueT47XG5cbiAgcHJvdGVjdGVkIGdldCByZXBvKCkge1xuICAgIGlmICghdGhpcy5fX3JlcG8pIHtcbiAgICAgIHRoaXMuX19yZXBvID0gKHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcikuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zT3JkZXIgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZVxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuICAgIC8vXG4gICAgLy8gcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5mcm9tKFxuICAgIC8vICAgdGhpcy5mcm9tU2VsZWN0b3JbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5mcm9tU2VsZWN0b3JdLFxuICAgIC8vICAgdGFibGVOYW1lXG4gICAgLy8gKTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgcS5xdWVyeSA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PlxuICAgICAgKS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcblxuICAgIGxldCBvcmRlckJ5QXJnczogW3N0cmluZywgXCJERVNDXCIgfCBcIkFTQ1wiXTtcbiAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHtmaW5kUHJpbWFyeUtleShtKS5pZCBhcyBzdHJpbmd9YCxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24uQVNDLnRvVXBwZXJDYXNlKCkgYXMgXCJBU0NcIixcbiAgICAgIF07XG4gICAgZWxzZVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHt0aGlzLm9yZGVyQnlTZWxlY3RvclswXSBhcyBzdHJpbmd9YCxcbiAgICAgICAgdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9VcHBlckNhc2UoKSBhcyBcIkRFU0NcIiB8IFwiQVNDXCIsXG4gICAgICBdO1xuXG4gICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5vcmRlckJ5KC4uLm9yZGVyQnlBcmdzKTtcbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KHRoaXMubGltaXRTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgbGltaXQgb2YgJHtUeXBlT1JNUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdChUeXBlT1JNUXVlcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9mZnNldFxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5za2lwKHRoaXMub2Zmc2V0U2VsZWN0b3IpO1xuXG4gICAgcmV0dXJuIHEgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgVHlwZU9STVBhZ2luYXRvciBmb3IgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgY29uc3QgYSA9IHF1ZXJ5LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtrZXlvZiBNfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWR9IHNlcXVlbmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkYXRhYmFzZSBzZXF1ZW5jZSBmb3IgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgU2VxdWVuY2V9cywgZGVsZWdhdGluZyB0byB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSB0byBmZXRjaCBhbmQgaW5jcmVtZW50IHZhbHVlcyB3aGlsZSBoYW5kbGluZyB0eXBlIHBhcnNpbmcgYW5kIGVycm9yIHRyYW5zbGF0aW9uLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAobmFtZSwgdHlwZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeSwgZXRjLikuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4gKiBAY2xhc3MgVHlwZU9STVNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbmQgdXNlIGEgVHlwZU9STS1iYWNrZWQgc2VxdWVuY2VcbiAqIGNvbnN0IHNlcSA9IG5ldyBUeXBlT1JNU2VxdWVuY2UoeyBuYW1lOiBcInVzZXJfaWRfc2VxXCIsIHR5cGU6IFwiTnVtYmVyXCIsIHN0YXJ0V2l0aDogMSwgaW5jcmVtZW50Qnk6IDEgfSwgYWRhcHRlcik7XG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXEubmV4dCgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFNlcSBhcyBUeXBlT1JNU2VxdWVuY2VcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBBcHAtPj5TZXE6IG5leHQoKVxuICogICBTZXEtPj5TZXE6IGN1cnJlbnQoKVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcoU0VMRUNUIGN1cnJlbnRfdmFsdWUgLi4uKVxuICogICBBZGFwdGVyLT4+REI6IFF1ZXJ5IGN1cnJlbnQgdmFsdWVcbiAqICAgREItLT4+QWRhcHRlcjogY3VycmVudF92YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLT4+U2VxOiBpbmNyZW1lbnQoY3VycmVudClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KG5leHR2YWwobmFtZSkpXG4gKiAgIEFkYXB0ZXItPj5EQjogbmV4dHZhbCgpXG4gKiAgIERCLS0+PkFkYXB0ZXI6IG5leHQgdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0tPj5BcHA6IHBhcnNlZCBuZXh0IHZhbHVlXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXJcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXE6IGFueSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBjdXJyZW50X3ZhbHVlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNlcXVlbmNlcyBXSEVSRSBzZXF1ZW5jZV9uYW1lID0gJDFgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxLmN1cnJlbnRfdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLmFkYXB0ZXIucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyc2VzIHRoZSB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNlcXVlbmNlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50XG4gICAqIEBwYXJhbSBjb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lLCBzdGFydFdpdGggfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodHlwZSAhPT0gXCJOdW1iZXJcIiAmJiB0eXBlICE9PSBcIkJpZ0ludFwiKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5jcmVtZW50IHNlcXVlbmNlIG9mIHR5cGUgJHt0eXBlfSB3aXRoICR7Y291bnR9YFxuICAgICAgKTtcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIHRyeSB7XG4gICAgICBuZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIG5leHR2YWwoJDEpO2AsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYENSRUFURSBTRVFVRU5DRSBJRiBOT1QgRVhJU1RTICQxIFNUQVJUIFdJVEggJDIgSU5DUkVNRU5UIEJZICQzIE5PIENZQ0xFO2AsXG4gICAgICAgIHZhbHVlczogW25hbWUsIHN0YXJ0V2l0aCwgaW5jcmVtZW50QnldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluZGV4TWV0YWRhdGEsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4XG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleCBieSBjb21iaW5pbmcgbmFtZSBwYXJ0cywgY29tcG9zaXRpb25zLCBhbmQgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lIC0gQXJyYXkgb2YgbmFtZSBwYXJ0cyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbZGlyZWN0aW9uXSAtIE9wdGlvbmFsIHNvcnQgZGlyZWN0aW9uIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gdGhlIGluZGV4IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGluZGV4IG5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gVHlwZU9STUtleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIFR5cGVPUk1LZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBBcnJheSBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4ZXNcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleE5hbWVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICpcbiAqICAgQ2FsbGVyLT4+Z2VuZXJhdGVJbmRleGVzOiBtb2RlbHNcbiAqXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBiYXNlIHRhYmxlIGluZGV4XG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhOYW1lOiBbQ291Y2hEQktleXMuVEFCTEVdXG4gKiAgIGdlbmVyYXRlSW5kZXhOYW1lLS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIHRhYmxlIGluZGV4IGNvbmZpZ1xuICpcbiAqICAgbG9vcCBGb3IgZWFjaCBtb2RlbFxuICogICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCBpbmRleGVzIG1ldGFkYXRhXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IGluZGV4IG1ldGFkYXRhXG4gKlxuICogICAgIGxvb3AgRm9yIGVhY2ggaW5kZXggaW4gbWV0YWRhdGFcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IEV4dHJhY3QgaW5kZXggcHJvcGVydGllc1xuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBEZWZpbmUgbmVzdGVkIGdlbmVyYXRlIGZ1bmN0aW9uXG4gKlxuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKCkgZm9yIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBpbmRleCBuYW1lIGFuZCBjb25maWdcbiAqXG4gKiAgICAgICBhbHQgSGFzIGRpcmVjdGlvbnNcbiAqICAgICAgICAgbG9vcCBGb3IgZWFjaCBkaXJlY3Rpb25cbiAqICAgICAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoZGlyZWN0aW9uKVxuICogICAgICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBvcmRlcmVkIGluZGV4IGNvbmZpZ1xuICogICAgICAgICBlbmRcbiAqICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0tPj5DYWxsZXI6IEFycmF5IG9mIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4pOiBUeXBlT1JNUXVlcnlbXSB7XG4gIGNvbnN0IHRhYmxlTmFtZSA9IGdlbmVyYXRlSW5kZXhOYW1lKFtUeXBlT1JNS2V5cy5UQUJMRV0pO1xuICBjb25zdCBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNUXVlcnk+ID0ge307XG4gIGluZGV4ZXNbdGFibGVOYW1lXSA9IHtcbiAgICBxdWVyeTogYGAsXG4gICAgdmFsdWVzOiBbXSxcbiAgfTtcblxuICBtb2RlbHMuZm9yRWFjaCgobSkgPT4ge1xuICAgIGNvbnN0IGluZDogUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4gPSBSZXBvc2l0b3J5LmluZGV4ZXMobSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaW5kKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBPYmplY3Qua2V5cyh2YWx1ZSlbMF07XG5cbiAgICAgIGxldCB7IGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtrZXksIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLCBQZXJzaXN0ZW5jZUtleXMuSU5ERVhdLmpvaW4oXG4gICAgICAgICAgRGVmYXVsdFNlcGFyYXRvclxuICAgICAgICApO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgcXVlcnk6IGBDUkVBVEUgSU5ERVggJDEgT04gJDIgKCQzKTtgLFxuICAgICAgICAgIHZhbHVlczogW25hbWUsIHRhYmxlTmFtZSwga2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdGUoKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluZGV4ZXMpO1xufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwidHlwZW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zIGZvciBhIGdpdmVuIE1vZGVsIHVzaW5nIHRoZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCBpbmNsdWRpbmcgYnVsayBvcGVyYXRpb25zIGFuZCBxdWVyeSBidWlsZGVyIGFjY2VzcyB3aGlsZSBwcmVzZXJ2aW5nIERlY2FmLnRzIHJlcG9zaXRvcnkgc2VtYW50aWNzLlxuICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWwgdGhhdCB0aGlzIHJlcG9zaXRvcnkgd2lsbCBtYW5hZ2UuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBhZGFwdGVyIHVzZWQgdG8gZXhlY3V0ZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGhlIE1vZGVsIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGJhc2UgUmVwb3NpdG9yeS5cbiAqIEBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeVxuICogY29uc3QgcmVwbyA9IG5ldyBUeXBlT1JNUmVwb3NpdG9yeTxVc2VyPihhZGFwdGVyLCBVc2VyKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGNyZWF0ZWQuaWQpO1xuICpcbiAqIC8vIEJ1bGsgY3JlYXRlXG4gKiBhd2FpdCByZXBvLmNyZWF0ZUFsbChbbmV3IFVzZXIoeyBuYW1lOiBcIkFcIiB9KSwgbmV3IFVzZXIoeyBuYW1lOiBcIkJcIiB9KV0pO1xuICpcbiAqIC8vIFVzaW5nIHRoZSBxdWVyeSBidWlsZGVyXG4gKiBjb25zdCBxYiA9IHJlcG8ucXVlcnlCdWlsZGVyKCk7XG4gKiBjb25zdCByb3dzID0gYXdhaXQgcWIud2hlcmUoXCJuYW1lID0gOm5hbWVcIiwgeyBuYW1lOiBcIkFsaWNlXCIgfSkuZ2V0TWFueSgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBUeXBlT1JNL0RhdGFTb3VyY2VcbiAqXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHByZXBhcmUobW9kZWwsIHBrKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH1cbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCAuLi5hcmdzKVxuICogICBBZGFwdGVyLT4+REI6IElOU0VSVCAuLi5cbiAqICAgREItLT4+QWRhcHRlcjogcm93XG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcm93XG4gKiAgIFJlcG8tPj5BZGFwdGVyOiByZXZlcnQocm93LCBjbGF6eiwgcGssIGlkKVxuICogICBBZGFwdGVyLS0+PlJlcG86IG1vZGVsXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdXNlcyhUeXBlT1JNRmxhdm91cilcbmV4cG9ydCBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgTSxcbiAgVHlwZU9STVF1ZXJ5PE0sIGFueT4sXG4gIEFkYXB0ZXI8RGF0YVNvdXJjZU9wdGlvbnMsIFR5cGVPUk1RdWVyeSwgVHlwZU9STUZsYWdzLCBDb250ZXh0PFR5cGVPUk1GbGFncz4+LFxuICBUeXBlT1JNRmxhZ3MsXG4gIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEFkYXB0ZXI8XG4gICAgICBEYXRhU291cmNlT3B0aW9ucyxcbiAgICAgIFR5cGVPUk1RdWVyeSxcbiAgICAgIFR5cGVPUk1GbGFncyxcbiAgICAgIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuICAgID4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG1vZGVsLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIFR5cGVPUk0gcXVlcnkgYnVpbGRlciBmb3IgdGhlIHJlcG9zaXRvcnkgZW50aXR5LlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgU2VsZWN0UXVlcnlCdWlsZGVyIGJvdW5kIHRvIHRoaXMgcmVwb3NpdG9yeSdzIGVudGl0eSBmb3IgYWR2YW5jZWQgcXVlcnlpbmcuXG4gICAqIEByZXR1cm4ge1F1ZXJ5QnVpbGRlcjxhbnk+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCk6IFF1ZXJ5QnVpbGRlcjxhbnk+IHtcbiAgICBjb25zdCByZXBvID0gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIHRoaXMuY2xhc3NbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGFzc11cbiAgICApO1xuICAgIHJldHVybiByZXBvLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuZCBwZXJzaXN0cyBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwsIGRlbGVnYXRlcyBpbnNlcnRpb24gdG8gdGhlIGFkYXB0ZXIsIGFuZCByZWh5ZHJhdGVzIHRoZSBwZXJzaXN0ZWQgc3RhdGUgYmFjayBpbnRvIGEgTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkLFxuICAgICAgbW9kZWwgYXMgYW55LFxuICAgICAgdGhpcy5wayxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGxldCBjOiBDb250ZXh0PFR5cGVPUk1GbGFncz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIENvbnRleHQ8VHlwZU9STUZsYWdzPjtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmdcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbmQgcGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsLCBkZWxlZ2F0ZXMgdXBkYXRlIHRvIHRoZSBhZGFwdGVyLCBhbmQgcmVoeWRyYXRlcyB0aGUgcGVyc2lzdGVkIHN0YXRlIGJhY2sgaW50byBhIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCxcbiAgICAgIG1vZGVsLFxuICAgICAgdGhpcy5wayxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQsIHRyYW5zaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBtb2RlbHMgZm9yIGJ1bGsgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVjb3JhdG9yLWJhc2VkIHZhbGlkYXRpb25zIGFuZCByZXR1cm5zIHRyYW5zZm9ybWVkIG1vZGVscyB3aXRoIGNvbnRleHQgYXJncyBmb3IgY3JlYXRlQWxsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxbTVtdLCAuLi5hbnlbXV0+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgRGlzcGF0Y2gge1xuICogICAgICtpbml0aWFsaXplKClcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKClcbiAqICAgfVxuICogICBjbGFzcyBUeXBlT1JNRGlzcGF0Y2gge1xuICogICAgIC1vYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmdcbiAqICAgICAtYXR0ZW1wdENvdW50ZXI6IG51bWJlclxuICogICAgIC10aW1lb3V0OiBudW1iZXJcbiAqICAgICArY29uc3RydWN0b3IodGltZW91dClcbiAqICAgICAjbm90aWZpY2F0aW9uSGFuZGxlcigpXG4gKiAgICAgI2luaXRpYWxpemUoKVxuICogICB9XG4gKiAgIERpc3BhdGNoIDx8LS0gVHlwZU9STURpc3BhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxEYXRhU291cmNlT3B0aW9ucz4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVvdXQgPSA1MDAwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIFR5cGVPUk0gbm90aWZpY2F0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyAodHJhbnNsYXRlZCBmcm9tIFR5cGVPUk0gZXZlbnRzKSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IHJlY29yZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkcyBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG5vdGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBQb3N0Z3JlU1FMRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gICAqICAgTm90ZSBvdmVyIEQ6IFJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20gUG9zdGdyZVNRTFxuICAgKiAgIEQtPj5EOiBQYXJzZSBub3RpZmljYXRpb24gcGF5bG9hZFxuICAgKiAgIEQtPj5EOiBFeHRyYWN0IHRhYmxlLCBvcGVyYXRpb24sIGFuZCBpZHNcbiAgICogICBELT4+TzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcylcbiAgICogICBELT4+RDogVXBkYXRlIG9ic2VydmVyTGFzdFVwZGF0ZVxuICAgKiAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBkaXNwYXRjaFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgaWRzOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyKTtcbiAgICB0cnkge1xuICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbG9nLnZlcmJvc2UoYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke29wZXJhdGlvbn0gZm9yICR7dGFibGV9YCk7XG4gICAgICBsb2cuZGVidWcoYHBrczogJHtpZHN9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaGVyIGFuZCBzdWJzY3JpYmVzIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIG9uIHRoZSBEYXRhU291cmNlIGFuZCBsb2dzIHRoZSBzdWJzY3JpcHRpb24gbGlmZWN5Y2xlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgVHlwZU9STURpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIEQtPj5TOiBDYWxsIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIFMtPj5TOiBDaGVjayBhZGFwdGVyIGFuZCBuYXRpdmVcbiAgICogICBhbHQgTm8gYWRhcHRlciBvciBuYXRpdmVcbiAgICogICAgIFMtLT4+UzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFMtPj5EUzogaW5pdGlhbGl6ZSgpXG4gICAqICAgUy0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFR5cGVPUk1FdmVudFN1YnNjcmliZXIpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERTLS0+PlM6IFN1YnNjcmlwdGlvbiBlc3RhYmxpc2hlZFxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlc29sdmVzXG4gICAqICAgICBELT4+TDogTG9nIHN1Y2Nlc3NmdWwgc3Vic2NyaXB0aW9uXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgRFMtLT4+UzogRXJyb3JcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZWplY3RzXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJzY3JpYmVUb1R5cGVPUk0odGhpczogVHlwZU9STURpc3BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5uYXRpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIvbmF0aXZlIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWFkYXB0ZXIuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuZGF0YVNvdXJjZS5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgYWRhcHRlci5kYXRhU291cmNlLnN1YnNjcmliZXJzLnB1c2goXG4gICAgICAgICAgbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyLmJpbmQodGhpcykpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZVRvVHlwZU9STVxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gVHlwZU9STSBub3RpZmljYXRpb25zOiAke2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBtZXRob2QgdG8gcmVsZWFzZSByZXNvdXJjZXMgd2hlbiB0aGUgZGlzcGF0Y2hlciBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBpZiAodGhpcy5hZGFwdGVyKSB7XG4gICAgLy9cbiAgICAvLyAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXI7XG4gICAgLy8gICBhd2FpdCBhZGFwdGVyLmRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICAgIC8vIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBKYXZhU2NyaXB0IFJlZ0V4cCBwYXR0ZXJuIHRvIGEgUG9zdGdyZVNRTCBQT1NJWCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBzdW1tYXJ5IEFjY2VwdHMgZWl0aGVyIGEgUmVnRXhwIG9iamVjdCBvciBhIHN0cmluZyByZXByZXNlbnRhdGlvbiAoL3BhdHRlcm4vZmxhZ3MpIGFuZCByZXR1cm5zIHRoZSByYXcgcGF0dGVybiBjb21wYXRpYmxlIHdpdGggUG9zdGdyZVNRTCdzIH4gYW5kIH4qIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30ganNSZWdleCBKYXZhU2NyaXB0IFJlZ0V4cCBvYmplY3Qgb3IgcGF0dGVybiBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFBvc3RncmVTUUwtY29tcGF0aWJsZSByZWdleCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFV0aWxzIGFzIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlc1xuICogICBBcHAtPj5VdGlsczogY29udmVydEpzUmVnZXhUb1Bvc3RncmVzKFJlZ0V4cChcImZvby4qXCIsXCJpXCIpKVxuICogICBVdGlscy0+PlV0aWxzOiBQYXJzZSBzdHJpbmcgb3IgdXNlIFJlZ0V4cC5zb3VyY2VcbiAqICAgVXRpbHMtLT4+QXBwOiBcImZvby4qXCJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcyhqc1JlZ2V4OiBSZWdFeHAgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByeHAgPSBuZXcgUmVnRXhwKC9eXFwvKC4rKVxcLyhcXHcrKSQvZyk7XG4gIGlmICh0eXBlb2YganNSZWdleCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1hdGNoID0gcnhwLmV4ZWMoanNSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBwXSA9IG1hdGNoO1xuICAgICAganNSZWdleCA9IHA7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKGpzUmVnZXgpIDoganNSZWdleDtcblxuICBjb25zdCBwYXR0ZXJuID0gcmVnZXguc291cmNlO1xuXG4gIHJldHVybiBwYXR0ZXJuO1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9Db2x1bW5NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW11cbikge1xuICBjb25zdCBjb2xzID0gY29sdW1ucy5maWx0ZXIoXG4gICAgKGM6IENvbHVtbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgY29uc3QgcmVscyA9IHJlbGF0aW9ucy5maWx0ZXIoXG4gICAgKGM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzKSA9PlxuICAgICAgYy50YXJnZXQgPT09IHRhcmdldCAmJiBjLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlcbiAgKTtcblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi4gT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXNcbiAqIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ob3B0aW9uczogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTaW1wbGVDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNwYXRpYWxDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIFNwYXRpYWxDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoV2lkdGhDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbldpdGhXaWR0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoUHJlY2lzaW9uQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwiZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzaW1wbGUtZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzZXRcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlT3JPcHRpb25zPzogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB8ICgodHlwZT86IGFueSkgPT4gRnVuY3Rpb24pXG4gICAgfCBDb2x1bW5UeXBlXG4gICAgfCAoQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9ucyksXG4gIG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zICYgQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBvYmplY3QsIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgdHlwZSA9IDxDb2x1bW5UeXBlPnR5cGVPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gPENvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucztcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIENvbHVtbk9wdGlvbnM7XG5cbiAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgY29uc3QgcmVmbGVjdE1ldGFkYXRhVHlwZSA9XG4gICAgICBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGFcbiAgICAgICAgPyAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gc3BlY2lmeSBIU1RPUkUgdHlwZSBpZiBjb2x1bW4gaXMgSFNUT1JFXG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gXCJoc3RvcmVcIiAmJiAhb3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgb3B0aW9ucy5oc3RvcmVUeXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gT2JqZWN0ID8gXCJvYmplY3RcIiA6IFwic3RyaW5nXCI7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gcmVnaXN0ZXIgYW4gZW1iZWRkZWRcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbWJlZGRlZHMucHVzaCh7XG4gICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgaXNBcnJheTogcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gQXJyYXkgfHwgb3B0aW9ucy5hcnJheSA9PT0gdHJ1ZSxcbiAgICAgICAgcHJlZml4OiBvcHRpb25zLnByZWZpeCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVmaXggOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgdHlwZTogdHlwZU9yT3B0aW9ucyBhcyAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gICAgICB9IGFzIEVtYmVkZGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVnaXN0ZXIgYSByZWd1bGFyIGNvbHVtblxuXG4gICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGNvbHVtbnM6IFtwcm9wZXJ0eU5hbWVdLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIFwicmVndWxhclwiLFxuICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgc3RyYXRlZ3k6XG4gICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgICA6IFwiaW5jcmVtZW50XCIsXG4gICAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFVwZGF0ZURhdGVDb2x1bW4ob3B0aW9ucz86IENvbHVtbk9wdGlvbnMpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgIFwidXBkYXRlRGF0ZVwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJjcmVhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdCh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3Qge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICAgKiBXZSBjYW5ub3QgdXNlIGluc3RhbmNlb2YgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgd2hlbiBydW5uaW5nIG9uIGRpZmZlcmVudCBjb250ZXh0cy5cbiAgICogQW5kIHdlIGRvbid0IHNpbXBseSB1c2UgdHlwZW9mIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09IFwib2JqZWN0XCIuXG4gICAqL1xuICBzdGF0aWMgaXNPYmplY3RXaXRoTmFtZSh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3QgJiB7IG5hbWU6IHN0cmluZyB9IHtcbiAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UxIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMiBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTMgVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFYsIFc+KFxuICAgIHRhcmdldDogVCxcbiAgICBzb3VyY2UxOiBVLFxuICAgIHNvdXJjZTI6IFYsXG4gICAgc291cmNlMzogV1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2VzIE9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgYXNzaWduKHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UpKSB7XG4gICAgICAgICh0YXJnZXQgYXMgYW55KVtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9cbiAgLy8gLyoqXG4gIC8vICAqIENvbnZlcnRzIE1peGVkTGlzdDxUPiB0byBzdHJpY3RseSBhbiBhcnJheSBvZiBpdHMgVCBpdGVtcy5cbiAgLy8gICovXG4gIC8vIHN0YXRpYyBtaXhlZExpc3RUb0FycmF5PFQ+KGxpc3Q6IE1peGVkTGlzdDxUPik6IFRbXSB7XG4gIC8vICAgaWYgKGxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxpc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgLy8gICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoXG4gIC8vICAgICAgIChrZXkpID0+IChsaXN0IGFzIHsgW2tleTogc3RyaW5nXTogVCB9KVtrZXldXG4gIC8vICAgICApO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICByZXR1cm4gbGlzdDtcbiAgLy8gICB9XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7IFJlbGF0aW9uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSwgT2JqZWN0VHlwZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uLCBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBPbmUtdG8tb25lIHJlbGF0aW9uIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGFzIG9ubHkgb25lIEVudGl0eTIuXG4gKiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIEVudGl0eTIgaWQgb24gaXRzIG93biBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBPbmUtdG8tb25lIHJlbGF0aW9uIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGFzIG9ubHkgb25lIEVudGl0eTIuXG4gKiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIEVudGl0eTIgaWQgb24gaXRzIG93biBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZT86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBPbmUtdG8tb25lIHJlbGF0aW9uIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGFzIG9ubHkgb25lIEVudGl0eTIuXG4gKiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIEVudGl0eTIgaWQgb24gaXRzIG93biBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZU9yT3B0aW9ucz86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpIHwgUmVsYXRpb25PcHRpb25zLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIG5vdyB0cnkgdG8gZGV0ZXJtaW5lIGl0IGl0cyBsYXp5IHJlbGF0aW9uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tb25lXCIsXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIEEgb25lLXRvLW1hbnkgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsXG4gKiBidXQgRW50aXR5MiBoYXMgb25seSBvbmUgRW50aXR5MS4gRW50aXR5MiBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2YgRW50aXR5MSBvbiBpdHNcbiAqIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGU6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gTm93IHRyeSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBsYXp5IHJlbGF0aW9uLlxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zICYmIG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEpIHtcbiAgICAgIC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICBjb25zdCByZWZsZWN0ZWRUeXBlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVmbGVjdGVkVHlwZSAmJlxuICAgICAgICB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIlxuICAgICAgKVxuICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0cmFjdEZvclJlbGF0aW9ucyhvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YS5jb2x1bW5zKVxuICAgICk7XG4gICAgbWV0YS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICByZWxhdGlvblR5cGU6IFwib25lLXRvLW1hbnlcIixcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIEEgbWFueS10by1vbmUgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgRW50aXR5MiwgYnV0XG4gKiBFbnRpdHkyIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZlxuICogRW50aXR5MiBvbiBpdHMgc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBBIG1hbnktdG8tb25lIHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIEVudGl0eTIsIGJ1dFxuICogRW50aXR5MiBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gRW50aXR5MSBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2ZcbiAqIEVudGl0eTIgb24gaXRzIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvT25lPFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGU/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gTm9ybWFsaXplIHBhcmFtZXRlcnMuXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW9uZVwiLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIE1hbnktdG8tbWFueSBpcyBhIHR5cGUgb2YgcmVsYXRpb25zaGlwIHdoZW4gRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MiwgYW5kIEVudGl0eTIgY2FuIGhhdmVcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBUbyBhY2hpZXZlIGl0LCB0aGlzIHR5cGUgb2YgcmVsYXRpb24gY3JlYXRlcyBhIGp1bmN0aW9uIHRhYmxlLCB3aGVyZSBpdCBzdG9yYWdlXG4gKiBlbnRpdHkxIGFuZCBlbnRpdHkyIGlkcy4gVGhpcyBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogTWFueS10by1tYW55IGlzIGEgdHlwZSBvZiByZWxhdGlvbnNoaXAgd2hlbiBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLCBhbmQgRW50aXR5MiBjYW4gaGF2ZVxuICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIFRvIGFjaGlldmUgaXQsIHRoaXMgdHlwZSBvZiByZWxhdGlvbiBjcmVhdGVzIGEganVuY3Rpb24gdGFibGUsIHdoZXJlIGl0IHN0b3JhZ2VcbiAqIGVudGl0eTEgYW5kIGVudGl0eTIgaWRzLiBUaGlzIGlzIG93bmVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZT86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBNYW55LXRvLW1hbnkgaXMgYSB0eXBlIG9mIHJlbGF0aW9uc2hpcCB3aGVuIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsIGFuZCBFbnRpdHkyIGNhbiBoYXZlXG4gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gVG8gYWNoaWV2ZSBpdCwgdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNyZWF0ZXMgYSBqdW5jdGlvbiB0YWJsZSwgd2hlcmUgaXQgc3RvcmFnZVxuICogZW50aXR5MSBhbmQgZW50aXR5MiBpZHMuIFRoaXMgaXMgb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICByZWxhdGlvblR5cGU6IFwibWFueS10by1tYW55XCIsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9HZW5lcmF0ZWRNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgb3B0aW9uczogUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaW5jcmVtZW50XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJ1dWlkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJyb3dpZFwiLFxuICBvcHRpb25zPzogUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcImlkZW50aXR5XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFRoaXMgY29sdW1uIGNyZWF0ZXMgYW4gaW50ZWdlciBQUklNQVJZIENPTFVNTiB3aXRoIGdlbmVyYXRlZCBzZXQgdG8gdHJ1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5T3JPcHRpb25zPzpcbiAgICB8IFwiaW5jcmVtZW50XCJcbiAgICB8IFwidXVpZFwiXG4gICAgfCBcInJvd2lkXCJcbiAgICB8IFwiaWRlbnRpdHlcIlxuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnMsXG4gIG1heWJlT3B0aW9ucz86XG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBjb25zdCBvcHRpb25zOiBDb2x1bW5PcHRpb25zID0ge307XG4gIGxldCBzdHJhdGVneTogXCJpbmNyZW1lbnRcIiB8IFwidXVpZFwiIHwgXCJyb3dpZFwiIHwgXCJpZGVudGl0eVwiO1xuICBpZiAoc3RyYXRlZ3lPck9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHN0cmF0ZWd5T3JPcHRpb25zID09PSBcInN0cmluZ1wiKVxuICAgICAgc3RyYXRlZ3kgPSBzdHJhdGVneU9yT3B0aW9ucyBhc1xuICAgICAgICB8IFwiaW5jcmVtZW50XCJcbiAgICAgICAgfCBcInV1aWRcIlxuICAgICAgICB8IFwicm93aWRcIlxuICAgICAgICB8IFwiaWRlbnRpdHlcIjtcblxuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChzdHJhdGVneU9yT3B0aW9ucykpIHtcbiAgICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgc3RyYXRlZ3lPck9wdGlvbnMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHJhdGVneSA9IFwiaW5jcmVtZW50XCI7XG4gIH1cbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG1heWJlT3B0aW9ucykpIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgbWF5YmVPcHRpb25zKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIGlmIGNvbHVtbiB0eXBlIGlzIG5vdCBleHBsaWNpdGx5IHNldCB0aGVuIGRldGVybWluZSBpdCBiYXNlZCBvbiBnZW5lcmF0aW9uIHN0cmF0ZWd5XG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiB8fCBzdHJhdGVneSA9PT0gXCJpZGVudGl0eVwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IE51bWJlcjtcbiAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwidXVpZFwiO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJyb3dpZFwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwiaW50XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IGFuZCBnZW5lcmF0ZWQgdG8gY29sdW1uIG9wdGlvbnNcbiAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIFwicmVndWxhclwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcbiAgICAvLyByZWdpc3RlciBnZW5lcmF0ZWQgbWV0YWRhdGEgYXJnc1xuICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQ29sdW1uT3B0aW9ucyxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLFxuICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLFxuICBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERlc2NyaWJlcyBhbGwgcHJpbWFyeSBrZXkgY29sdW1uJ3Mgb3B0aW9ucy5cbiAqIElmIHNwZWNpZmllZCwgdGhlIG51bGxhYmxlIGZpZWxkIG11c3QgYmUgc2V0IHRvIGZhbHNlLlxuICovXG5leHBvcnQgdHlwZSBQcmltYXJ5Q29sdW1uT3B0aW9ucyA9IENvbHVtbk9wdGlvbnMgJiB7IG51bGxhYmxlPzogZmFsc2UgfTtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBQcmltYXJ5IGNvbHVtbnMgYWxzbyBjcmVhdGVzIGEgUFJJTUFSWSBLRVkgZm9yIHRoaXMgY29sdW1uIGluIGEgZGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKFxuICB0eXBlPzogQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGVPck9wdGlvbnM/OiBDb2x1bW5UeXBlIHwgUHJpbWFyeUNvbHVtbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVPck9wdGlvbnMgPT09IFN0cmluZyB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gQm9vbGVhbiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gTnVtYmVyXG4gICAgKSB7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucyBhcyBDb2x1bW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgPFByaW1hcnlDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBQcmltYXJ5Q29sdW1uT3B0aW9ucztcblxuICAgIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICBjb25zdCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSB0eXBlIHRoZW4gd2UgbmVlZCB0byBnaXZlIGVycm9yIHRvIHVzZXIgdGhhdCB0eXBlIGlzIHJlcXVpcmVkXG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gY2hlY2sgaWYgY29sdW1uIGlzIG5vdCBudWxsYWJsZSwgYmVjYXVzZSB3ZSBjYW5ub3QgYWxsb3cgYSBwcmltYXJ5IGtleSB0byBiZSBudWxsYWJsZVxuICAgIGlmIChvcHRpb25zLm51bGxhYmxlKVxuICAgICAgdGhyb3cgbmV3IFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IHRvIGNvbHVtbiBvcHRpb25zXG4gICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBcInJlZ3VsYXJcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG5cbiAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gb3B0aW9ucy5nZW5lcmF0ZWRcbiAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlPcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgVGFibGVNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1RhYmxlTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KFxuICBuYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgRW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzogRW50aXR5T3B0aW9uc1xuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBvcHRpb25zID1cbiAgICAoT2JqZWN0VXRpbHMuaXNPYmplY3QobmFtZU9yT3B0aW9ucylcbiAgICAgID8gKG5hbWVPck9wdGlvbnMgYXMgRW50aXR5T3B0aW9ucylcbiAgICAgIDogbWF5YmVPcHRpb25zKSB8fCB7fTtcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiID8gbmFtZU9yT3B0aW9ucyA6IG9wdGlvbnMubmFtZTtcblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGNvbnN0IHRhYmxlcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXM7XG4gICAgdGFibGVzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogXCJyZWd1bGFyXCIsXG4gICAgICBvcmRlckJ5OiBvcHRpb25zLm9yZGVyQnkgPyBvcHRpb25zLm9yZGVyQnkgOiB1bmRlZmluZWQsXG4gICAgICBlbmdpbmU6IG9wdGlvbnMuZW5naW5lID8gb3B0aW9ucy5lbmdpbmUgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhYmFzZTogb3B0aW9ucy5kYXRhYmFzZSA/IG9wdGlvbnMuZGF0YWJhc2UgOiB1bmRlZmluZWQsXG4gICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hID8gb3B0aW9ucy5zY2hlbWEgOiB1bmRlZmluZWQsXG4gICAgICBzeW5jaHJvbml6ZTogb3B0aW9ucy5zeW5jaHJvbml6ZSxcbiAgICAgIHdpdGhvdXRSb3dpZDogb3B0aW9ucy53aXRob3V0Um93aWQsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQgPyBvcHRpb25zLmNvbW1lbnQgOiB1bmRlZmluZWQsXG4gICAgfSBhcyBUYWJsZU1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWxLZXlzLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgT2JqZWN0S2V5U3BsaXR0ZXIgPSBcIi5cIjtcbmV4cG9ydCBjb25zdCBCYXNlS2V5ID0gXCJkZWNhZlwiO1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICBzcGxpdHRlcjogc3RyaW5nID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAgIGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcik7XG4gIGxldCBjdXJyZW50OiBSZWNvcmQ8YW55LCBhbnk+ID0gb2JqO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgY3VycmVudFtrZXlzW2tleXMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsTWV0YWRhdGEgPSB7XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHZhbGlkYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XG4gIHJlbGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGdlbmVyYXRlZD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHBrOiBzdHJpbmc7XG4gIGZrcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGluZGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxuZXhwb3J0IGNsYXNzIE1ldGFkYXRhIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX21ldGFkYXRhOiBSZWNvcmQ8c3ltYm9sLCBNb2RlbE1ldGFkYXRhPiA9IHt9O1xuXG4gIHN0YXRpYyBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyO1xuICBzdGF0aWMgYmFzZUtleSA9IEJhc2VLZXk7XG4gIHN0YXRpYyBtaXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucHJvcGVydGllcyk7XG4gIH1cblxuICBzdGF0aWMgcGsobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5waylbMF07XG4gIH1cblxuICBzdGF0aWMgdHlwZShtb2RlbDogQ29uc3RydWN0b3I8YW55PiwgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXMobW9kZWwsIHByb3ApWzBdO1xuICB9XG5cbiAgc3RhdGljIHR5cGVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICBsZXQgZGVzaWduVHlwZTogYW55ID0gdGhpcy5nZXQobW9kZWwsIGBwcm9wZXJ0aWVzLiR7cHJvcH1gKTtcbiAgICBpZiAoIWRlc2lnblR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5ICR7cHJvcH0gbm90IGZvdW5kIGluICR7bW9kZWwubmFtZX1gKTtcbiAgICBkZXNpZ25UeXBlID0gW2Rlc2lnblR5cGVdO1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgICAgaWYgKG1ldGEudmFsaWRhdGlvbikge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gbWV0YS52YWxpZGF0aW9uO1xuICAgICAgICBpZiAodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSlcbiAgICAgICAgICBkZXNpZ25UeXBlID0gZGVzaWduVHlwZS5jb25jYXQodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXNpZ25UeXBlLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBNb2RlbE1ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZyk6IGFueTtcbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFrZXkpIHJldHVybiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgIHJldHVybiBnZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB0aGlzLnNwbGl0dGVyKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHRoaXMuX21ldGFkYXRhW3N5bWJvbF0gPSB7fSBhcyBhbnk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5taXJyb3IgJiZcbiAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHRoaXMuYmFzZUtleSlcbiAgICApIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgdGhpcy5iYXNlS2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHNldFZhbHVlQnlTcGxpdHRlcih0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLCBrZXksIHZhbHVlLCB0aGlzLnNwbGl0dGVyKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBhc3NpZ24oXG4gICAgbW9kZWw6IG9iamVjdCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvcD86IGFueSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBNZXRhZGF0YS5zZXQobW9kZWwgYXMgYW55LCBrZXksIHZhbHVlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KCkge1xuICByZXR1cm4gZnVuY3Rpb24gcHJvcGVydHkobW9kZWw6IG9iamVjdCwgcHJvcDogYW55KSB7XG4gICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoTW9kZWxLZXlzLlRZUEUsIG1vZGVsLCBwcm9wKTtcbiAgICByZXR1cm4gYXNzaWduKGBwcm9wZXJ0eS4ke3Byb3B9YCwgZGVzaWduVHlwZSkobW9kZWwsIHByb3ApO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ2FzY2FkZSxcbiAgQ2FzY2FkZU1ldGFkYXRhLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIGZpbmFsLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBTZXF1ZW5jZSxcbiAgc2VxdWVuY2VOYW1lRm9yTW9kZWwsXG4gIHR5cGUgU2VxdWVuY2VPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHJlc2VydmVkQXR0cmlidXRlcywgVHlwZU9STUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTIGFzIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIHJlYWRvbmx5LFxuICBVcGRhdGVWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBsaXN0LFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVHlwZU1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STVN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyBUeXBlT1JNU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhlcyB9IGZyb20gXCIuL2luZGV4ZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNVGFibGVTcGVjIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5LCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUmVwb3NpdG9yeSB9IGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBUeXBlT1JNRGlzcGF0Y2ggfSBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmltcG9ydCB7IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3JlcyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBGaW5kT25lT3B0aW9ucyxcbiAgSW4sXG4gIEluc2VydFJlc3VsdCxcbiAgUmVsYXRpb25PcHRpb25zLFxuICBKb2luQ29sdW1uLFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG4gIFZlcnNpb25Db2x1bW4sXG4gIEpvaW5UYWJsZSxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uT3B0aW9ucyxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IERhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGF0YS1zb3VyY2UvRGF0YVNvdXJjZU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9Db2x1bW5cIjtcbmltcG9ydCB7IFVwZGF0ZURhdGVDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvVXBkYXRlRGF0ZUNvbHVtblwiO1xuaW1wb3J0IHsgQ3JlYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBPbmVUb09uZSB9IGZyb20gXCIuL292ZXJyaWRlcy9PbmVUb09uZVwiO1xuaW1wb3J0IHsgT25lVG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvTWFueVwiO1xuaW1wb3J0IHsgTWFueVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb09uZVwiO1xuaW1wb3J0IHsgTWFueVRvTWFueSB9IGZyb20gXCIuL292ZXJyaWRlcy9NYW55VG9NYW55XCI7XG5pbXBvcnQgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cIjtcbmltcG9ydCB7IFByaW1hcnlDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUNvbHVtblwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0VudGl0eVwiO1xuaW1wb3J0IHsgYXNzaWduLCBNZXRhZGF0YSwgcHJvcGVydHkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFR5cGVPUk1SZXBvc2l0b3J5PE0+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxUeXBlT1JNRmxhZ3M+LFxuICBkYXRhOiBhbnksXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHVzZXIgPSBjb250ZXh0LmdldChcInVzZXJcIik7XG4gICAgbW9kZWxba2V5XSA9IHVzZXIgYXMgTVt0eXBlb2Yga2V5XTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIFwiTm8gVXNlciBmb3VuZCBpbiBjb250ZXh0LiBQbGVhc2UgcHJvdmlkZSBhIHVzZXIgaW4gdGhlIGNvbnRleHRcIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgVHlwZU9STS1iYWNrZWQgcGVyc2lzdGVuY2Ugb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgdGhlIERlY2FmLnRzIEFkYXB0ZXIgb3ZlciBhIFR5cGVPUk0gRGF0YVNvdXJjZSwgcHJvdmlkaW5nIENSVUQgb3BlcmF0aW9ucywgcXVlcnkvc3RhdGVtZW50IGZhY3Rvcmllcywgc2VxdWVuY2UgbWFuYWdlbWVudCwgZXJyb3IgcGFyc2luZywgYW5kIGRlY29yYXRpb24gaGVscGVycy5cbiAqIEB0ZW1wbGF0ZSBZIFRoZSBuYXRpdmUgY29uZmlndXJhdGlvbiB0eXBlIChUeXBlT1JNIERhdGFTb3VyY2VPcHRpb25zKS5cbiAqIEB0ZW1wbGF0ZSBGIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyBUaGUgY29udGV4dCB0eXBlLlxuICogQHBhcmFtIHtEYXRhU291cmNlT3B0aW9uc30gc2NvcGUgVGhlIERhdGFTb3VyY2Ugb3B0aW9ucyBmb3IgdGhlIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBUaGUgZmxhdm91ciBvZiB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlci5cbiAqIEBjbGFzcyBUeXBlT1JNQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgVHlwZU9STUFkYXB0ZXIoeyB0eXBlOiAncG9zdGdyZXMnLCAvKiAuLi4gKlxcLyB9KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICogY29uc3QgcmVwbyA9IG5ldyAoYWRhcHRlci5yZXBvc2l0b3J5PFVzZXI+KCkpKGFkYXB0ZXIsIFVzZXIpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogJ0FsaWNlJyB9KSk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIFR5cGVPUk0gRGF0YVNvdXJjZVxuICpcbiAqICAgQXBwLT4+QWRhcHRlcjogbmV3IFR5cGVPUk1BZGFwdGVyKG9wdHMpXG4gKiAgIEFkYXB0ZXItPj5EUzogaW5pdGlhbGl6ZSgpXG4gKiAgIEFwcC0+PkFkYXB0ZXI6IHJlcG9zaXRvcnkoKVxuICogICBBZGFwdGVyLS0+PkFwcDogVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+QWRhcHRlcjogcHJlcGFyZS9jcmVhdGUvcmV2ZXJ0XG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogTW9kZWxcbiAqICAgUmVwby0tPj5BcHA6IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIERhdGFTb3VyY2VPcHRpb25zLFxuICBUeXBlT1JNUXVlcnksXG4gIFR5cGVPUk1GbGFncyxcbiAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4+IHtcbiAgcHJpdmF0ZSBfZGF0YVNvdXJjZT86IERhdGFTb3VyY2U7XG5cbiAgZ2V0IGRhdGFTb3VyY2UoKTogRGF0YVNvdXJjZSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhU291cmNlKSB7XG4gICAgICBjb25zdCBtb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmZsYXZvdXIpO1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubmF0aXZlLCB7XG4gICAgICAgICAgZW50aXRpZXM6IG1vZGVscy5tYXAoKGMpID0+IGNbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY10pLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgLy8gcHJvdGVjdGVkIGRhdGFTb3VcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEYXRhU291cmNlT3B0aW9ucywgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihvcHRpb25zLCBUeXBlT1JNRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxUeXBlT1JNRmxhZ3M+XG4gICk6IFByb21pc2U8VHlwZU9STUZsYWdzPiB7XG4gICAgY29uc3QgZiA9IGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKTtcbiAgICBjb25zdCBuZXdPYmo6IGFueSA9IHtcbiAgICAgIHVzZXI6IChhd2FpdCBUeXBlT1JNQWRhcHRlci5nZXRDdXJyZW50VXNlcih0aGlzLmRhdGFTb3VyY2UpKSBhcyBzdHJpbmcsXG4gICAgfTtcbiAgICBjb25zdCBtID0gbmV3IG1vZGVsKCk7XG5cbiAgICBjb25zdCBleGNlcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFKSB7XG4gICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG0pLmlkO1xuICAgICAgZXhjZXB0aW9ucy5wdXNoKHBrIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSB8fFxuICAgICAgb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICkge1xuICAgICAgY29uc3QgZGVjcyA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRlYyA9IGRlY3MuZGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgIChkZWM6IGFueSkgPT5cbiAgICAgICAgICAgIGRlYy5rZXkgPT09IERCS2V5cy5USU1FU1RBTVAgJiZcbiAgICAgICAgICAgIGRlYy5wcm9wcy5vcGVyYXRpb24uaW5kZXhPZihvcGVyYXRpb24pICE9PSAtMVxuICAgICAgICApO1xuICAgICAgICBpZiAoZGVjKSB7XG4gICAgICAgICAgYWNjdW1ba2V5XSA9IGRlYy5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGV4Y2VwdGlvbnMucHVzaCguLi5PYmplY3Qua2V5cyhkZWNzKSk7XG4gICAgfVxuXG4gICAgbmV3T2JqLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA9IChcbiAgICAgIGYuaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzID8gZi5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgOiBbXVxuICAgICkuY29uY2F0KC4uLmV4Y2VwdGlvbnMpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGYsIG5ld09iaikgYXMgVHlwZU9STUZsYWdzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIERpc3BhdGNoKCk6IFR5cGVPUk1EaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPigpOiBDb25zdHJ1Y3RvcjxUeXBlT1JNUmVwb3NpdG9yeTxNPj4ge1xuICAgIHJldHVybiBUeXBlT1JNUmVwb3NpdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBQb3N0Z3JlcyBzdGF0ZW1lbnQgZm9yIHF1ZXJ5aW5nXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBQb3N0Z3Jlc1N0YXRlbWVudCBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1R5cGVPUk1TdGF0ZW1lbnQ8TSwgYW55Pn0gQSBuZXcgUG9zdGdyZXNTdGF0ZW1lbnQgaW5zdGFuY2VcbiAgICovXG4gIEBmaW5hbCgpXG4gIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFR5cGVPUk1TdGF0ZW1lbnQ8TSwgYW55PiB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNU3RhdGVtZW50KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFBvc3RncmVTUUwgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFBvc3RncmVTUUxTZXF1ZW5jZSBpbnN0YW5jZSBmb3IgbWFuYWdpbmcgc2VxdWVuY2VzXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBuZXcgU2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIEBmaW5hbCgpXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1TZXF1ZW5jZShvcHRpb25zLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgYnkgY3JlYXRpbmcgaW5kZXhlcyBmb3IgYWxsIG1hbmFnZWQgbW9kZWxzXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIG5lY2Vzc2FyeSBkYXRhYmFzZSBpbmRleGVzIGZvciBhbGwgbW9kZWxzIG1hbmFnZWQgYnkgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmRhdGFTb3VyY2U7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRzLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGxvZy52ZXJib3NlKGAke3RoaXMuZmxhdm91cn0gYWRhcHRlciBpbml0aWFsaXplZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgZGF0YWJhc2UgaW5kZXhlcyBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbHNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0gey4uLkNvbnN0cnVjdG9yPE0+fSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogVHlwZU9STVF1ZXJ5W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoXCJCRUdJTlwiKTtcblxuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShpbmRleC5xdWVyeSwgaW5kZXgudmFsdWVzKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShcIlJPTExCQUNLXCIpO1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgU1FMIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZXhlY3V0ZSByYXcgU1FMIHF1ZXJpZXNcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGVcbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHEgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocTogVHlwZU9STVF1ZXJ5KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmF3KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UuaXNJbml0aWFsaXplZCkgYXdhaXQgdGhpcy5kYXRhU291cmNlLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHF1ZXJ5LCB2YWx1ZXMgfSA9IHE7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBleGVjdXRpbmcgcXVlcnk6ICR7KHF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmdldFNxbCgpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShxdWVyeSwgdmFsdWVzKTtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgY2hpbGQgPSBmYWxzZVxuICApOiB7XG4gICAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG5cbiAgICBwcmVwYXJlZC5yZWNvcmQgPSBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSB8fCB0aGlzLmlzUmVzZXJ2ZWQoa2V5KSlcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUuZ2V0VGltZSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChNb2RlbC5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5wcmVwYXJlKHZhbHVlLCBmaW5kUHJpbWFyeUtleSh2YWx1ZSkuaWQsIHRydWUpLnJlY29yZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vZG8gbm90aGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IE1vZGVsLmdldChcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICApO1xuICAgIGlmICghY29uc3RyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IG5vdCBmb3VuZCBpbiByZWdpc3RyeWBcbiAgICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2hpbGRcbiAgICAgID8gbmV3IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdKClcbiAgICAgIDogbmV3IGNvbnN0cigpO1xuICAgIGlmIChjaGlsZClcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFwiY29uc3RydWN0b3JcIiwge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLmZvckVhY2goXG4gICAgICAoW2tleSwgdmFsXSkgPT4gKHJlc3VsdFtrZXkgYXMga2V5b2YgdHlwZW9mIHJlc3VsdF0gPSB2YWwpXG4gICAgKTtcbiAgICBwcmVwYXJlZC5yZWNvcmQgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHByZXBhcmVkO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogTSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFRyYW5zaWVudCBwcm9wZXJ0eSAke2tleX0gYWxyZWFkeSBleGlzdHMgb24gbW9kZWwgJHt0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBjbGF6eiA6IGNsYXp6Lm5hbWV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgYSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZXBvLmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIFtwa106IGlkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgYFJlY29yZCBhbHJlYWR5IGV4aXN0cyBpbiB0YWJsZSAke1JlcG9zaXRvcnkudGFibGUobSl9IHdpdGggaWQ6ICR7aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcG8uc2F2ZShtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byByZWFkIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIHByaW1hcnkga2V5IGNvbHVtXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWFkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHBrOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgcTogRmluZE9uZU9wdGlvbnMgPSB7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgcmVzdWx0ID0gKGF3YWl0IHJlcG8uZmluZE9uZShxKSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGlmICghcmVzdWx0KVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZDogJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiA/IHRhYmxlTmFtZSA6IFJlcG9zaXRvcnkudGFibGUodGFibGVOYW1lKX1gXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gdXBkYXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLnJlYWQodGFibGVOYW1lLCBpZCwgcGspO1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgcmV0dXJuIHJlcG8uc2F2ZShtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlbGV0ZSBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHRhYmxlTmFtZSwgaWQsIHBrKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVwby5kZWxldGUoaWQpO1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogSW5zZXJ0UmVzdWx0ID0gYXdhaXQgcmVwby5pbnNlcnQobW9kZWwpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICByZXN1bHQuaWRlbnRpZmllcnMubWFwKChpZCkgPT4gaWQuaWQpLFxuICAgICAgICBcImlkXCJcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoIWlkLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5maW5kQnkoeyBbcGtdOiBJbihpZCkgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBtIG9mIG1vZGVsKSB7XG4gICAgICByZXN1bHQucHVzaChhd2FpdCB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIG1bcGtdLCBtLCBwaywgLi4uYXJncykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgbW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKHRhYmxlTmFtZSwgaWRzLCBwayk7XG4gICAgICBhd2FpdCByZXBvLmRlbGV0ZShpZHMpO1xuICAgICAgcmV0dXJuIG1vZGVscztcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW4gZXJyb3IgYW5kIGNvbnZlcnRzIGl0IHRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHZhcmlvdXMgZXJyb3IgdHlwZXMgdG8gYXBwcm9wcmlhdGUgQmFzZUVycm9yIHN1YnR5cGVzXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yIGFzIGEgQmFzZUVycm9yXG4gICAqL1xuICBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgcmV0dXJuIFR5cGVPUk1BZGFwdGVyLnBhcnNlRXJyb3IoZXJyLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgaW4gUG9zdGdyZVNRTFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGlzUmVzZXJ2ZWQoYXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhYXR0ci5tYXRjaChyZXNlcnZlZEF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWV0aG9kIHRvIHBhcnNlIGFuIGVycm9yIGFuZCBjb252ZXJ0IGl0IHRvIGEgQmFzZUVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHZhcmlvdXMgZXJyb3IgdHlwZXMgdG8gYXBwcm9wcmlhdGUgQmFzZUVycm9yIHN1YnR5cGVzIGJhc2VkIG9uIFBvc3RncmVTUUwgZXJyb3IgY29kZXMgYW5kIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7RXJyb3J8c3RyaW5nfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWFzb25dIC0gT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yIGFzIGEgQmFzZUVycm9yXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlRXJyb3JcbiAgICogICBwYXJ0aWNpcGFudCBFcnJvclR5cGVzXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+cGFyc2VFcnJvcjogZXJyLCByZWFzb25cbiAgICogICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogQ2hlY2sgaWYgZXJyIGlzIGFscmVhZHkgYSBCYXNlRXJyb3JcbiAgICogICBhbHQgZXJyIGlzIEJhc2VFcnJvclxuICAgKiAgICAgcGFyc2VFcnJvci0tPj5DYWxsZXI6IHJldHVybiBlcnJcbiAgICogICBlbHNlIGVyciBpcyBzdHJpbmdcbiAgICogICAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBFeHRyYWN0IGNvZGUgZnJvbSBzdHJpbmdcbiAgICogICAgIGFsdCBjb2RlIG1hdGNoZXMgXCJkdXBsaWNhdGUga2V5fGFscmVhZHkgZXhpc3RzXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgICBlbHNlIGNvZGUgbWF0Y2hlcyBcImRvZXMgbm90IGV4aXN0fG5vdCBmb3VuZFwiXG4gICAqICAgICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKVxuICAgKiAgICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBlcnIgaGFzIGNvZGUgcHJvcGVydHlcbiAgICogICAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBFeHRyYWN0IGNvZGUgYW5kIHJlYXNvblxuICAgKiAgIGVsc2VcbiAgICogICAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBVc2UgZXJyLm1lc3NhZ2UgYXMgY29kZVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBTd2l0Y2ggb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlXG4gICAqICAgYWx0IGNvZGUgaXMgMjM1MDUgKHVuaXF1ZV92aW9sYXRpb24pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgMjM1MDMgKGZvcmVpZ25fa2V5X3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAwMSAodW5kZWZpbmVkX3RhYmxlKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyNzAzICh1bmRlZmluZWRfY29sdW1uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDA3IChkdXBsaWNhdGVfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMTYgKGludmFsaWRfdGFibGVfZGVmaW5pdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW5kZXhFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW5kZXhFcnJvclxuICAgKiAgIGVsc2UgY29kZSBtYXRjaGVzIFwiRUNPTk5SRUZVU0VEXCJcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25uZWN0aW9uRXJyb3JcbiAgICogICBlbHNlXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IEludGVybmFsRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgYW55O1xuICAgIGNvbnN0IGNvZGU6IHN0cmluZyA9IHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIgPyBlcnIgOiBlcnIubWVzc2FnZTtcblxuICAgIGlmIChjb2RlLm1hdGNoKC9kdXBsaWNhdGUga2V5fGFscmVhZHkgZXhpc3RzL2cpKVxuICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGNvZGUpO1xuICAgIGlmIChjb2RlLm1hdGNoKC9kb2VzIG5vdCBleGlzdHxub3QgZm91bmQvZykpIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcblxuICAgIC8vIFBvc3RncmVTUUwgZXJyb3IgY29kZXM6IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9lcnJjb2Rlcy1hcHBlbmRpeC5odG1sXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIEludGVncml0eSBjb25zdHJhaW50IHZpb2xhdGlvbnNcbiAgICAgIGNhc2UgXCIyMzUwNVwiOiAvLyB1bmlxdWVfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiMjM1MDNcIjogLy8gZm9yZWlnbl9rZXlfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiNDJQMDdcIjogLy8gZHVwbGljYXRlX3RhYmxlXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCBlcnJvcnNcbiAgICAgIGNhc2UgXCI0MlAwMVwiOiAvLyB1bmRlZmluZWRfdGFibGVcbiAgICAgIGNhc2UgXCI0MjcwM1wiOiAvLyB1bmRlZmluZWRfY29sdW1uXG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gSW52YWxpZCBvYmplY3QgZGVmaW5pdGlvblxuICAgICAgY2FzZSBcIjQyUDE2XCI6IC8vIGludmFsaWRfdGFibGVfZGVmaW5pdGlvblxuICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcblxuICAgICAgLy8gQ29ubmVjdGlvbiBlcnJvcnNcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29ubmVjdChjb25maWc6IERhdGFTb3VyY2VPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gICAgY29uc3QgY29uID0gbmV3IERhdGFTb3VyY2UoY29uZmlnKTtcbiAgICBpZiAoIWNvbi5pc0luaXRpYWxpemVkKSBhd2FpdCBjb24uaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiBjb247XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZURhdGFiYXNlKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTm90aWZ5RnVuY3Rpb24oXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVOb3RpZnlGdW5jdGlvbik7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKVxuUkVUVVJOUyB0cmlnZ2VyIEFTICQkXG5CRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KFxuICAgICAgICAndGFibGVfY2hhbmdlcycsXG4gICAgICAgIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAgICdhY3Rpb24nLCBUR19PUCxcbiAgICAgICAgICAgICdkYXRhJywgcm93X3RvX2pzb24oTkVXKSxcbiAgICAgICAgICAgICdvbGRfZGF0YScsIHJvd190b19qc29uKE9MRClcbiAgICAgICAgKTo6dGV4dFxuICAgICk7XG4gICAgUkVUVVJOIE5FVztcbkVORDtcbiQkIExBTkdVQUdFIHBscGdzcWwgU0VDVVJJVFkgREVGSU5FUlxuO2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBPV05FUiBUTyAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBcbiAgICAgICAgICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBUTyBwdWJsaWM7XG4gICAgICAgIGApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VyKSBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERTtgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBVU0VSICR7dXNlcn0gV0lUSCBQQVNTV09SRCAnJHtwYXNzd29yZH0nYCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDT05ORUNUIE9OIERBVEFCQVNFICR7ZGJOYW1lfSBUTyAke3VzZXJ9YCk7XG5cbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ1JFQVRFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFRBQkxFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBTRVFVRU5DRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgYWRtaW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRUFTU0lHTiBPV05FRCBCWSAke3VzZXJ9IFRPICR7YWRtaW59YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRVZPS0UgQUxMIE9OIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFRBQkxFUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBTRVFVRU5DRVMgRlJPTSAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIEZVTkNUSU9OUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIFVTRVIgSUYgRVhJU1RTIFwiJHt1c2VyfVwiYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAgaXNGayA9IGZhbHNlXG4gICkge1xuICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJURVhUIFBSSU1BUlkgS0VZXCIgOiBpc0ZrID8gXCJURVhUXCIgOiBcIlZBUkNIQVJcIjtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlNFUklBTCBQUklNQVJZIEtFWVwiIDogXCJJTlRFR0VSXCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJUSU1FU1RBTVBcIjtcbiAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIkJJR0lOVCBQUklNQVJZIEtFWVwiIDogXCJCSUdJTlRcIjtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBjb25zdCBtbSA9IG5ldyBtKCk7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gICAgICAgICAgICBtbSxcbiAgICAgICAgICAgIGZpbmRQcmltYXJ5S2V5KG1tKS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGVsOiBtLFxuICAgICAgICAgICAgcGtUeXBlOiB0eXBlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zXG4gICkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEOlxuICAgICAgICByZXR1cm4gXCJOT1QgTlVMTFwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIOlxuICAgICAgICBpZiAoaXNQayB8fCAhb3B0aW9ucyB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgkeyhvcHRpb25zIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9taW5fbGVuZ3RoX2NoZWNrIENIRUNLIChMRU5HVEgoJHtwcm9wfSkgPj0gJHsob3B0aW9ucyBhcyBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFUVEVSTjpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVVJMOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5FTUFJTDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fcGF0dGVybl9jaGVjayBDSEVDSyAoJHtwcm9wfSB+ICcke2NvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcygob3B0aW9ucyBhcyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gYXMgc3RyaW5nKX0nKWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkRBVEU6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU46XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA+PSAkeyhvcHRpb25zIGFzIE1pblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9IDw9ICR7KG9wdGlvbnMgYXMgTWF4VmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFTU1dPUkQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAga2V5OiBQZXJzaXN0ZW5jZUtleXMsXG4gICAgb3B0aW9uczogUmVsYXRpb25zTWV0YWRhdGFcbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjbGF6eik7XG4gICAgY29uc3QgeyBjYXNjYWRlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhc2NhZGVTdHIgPSBgJHtjYXNjYWRlLnVwZGF0ZSA/IFwiIE9OIFVQREFURSBDQVNDQURFXCIgOiBcIlwifSR7Y2FzY2FkZS5kZWxldGUgPyBcIiBPTiBERUxFVEUgQ0FTQ0FERVwiIDogXCJcIn1gO1xuICAgIHN3aXRjaCAoYHJlbGF0aW9ucyR7a2V5fWApIHtcbiAgICAgIGNhc2UgUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkU6XG4gICAgICAgIHJldHVybiBgRk9SRUlHTiBLRVkgKCR7cHJvcH0pIFJFRkVSRU5DRVMgJHt0YWJsZU5hbWV9KCR7cGt9KSR7Y2FzY2FkZVN0cn1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPiA9IHt9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoe30pO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGNvbnN0IHsgaWQgfSA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuXG4gICAgbGV0IGlzUGs6IGJvb2xlYW4sIGNvbHVtbjogc3RyaW5nO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSBhcyAoa2V5b2YgTSlbXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KVtwcm9wXSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHByb3AudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICBwcm9wID09PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaXNQayA9IHByb3AgPT09IGlkO1xuICAgICAgY29sdW1uID0gUmVwb3NpdG9yeS5jb2x1bW4obSwgcHJvcC50b1N0cmluZygpKTtcblxuICAgICAgY29uc3QgYWxsRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWNvcmF0b3JEYXRhID0gYWxsRGVjcy5kZWNvcmF0b3JzLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZWw7XG4gICAgICAgICAgaWYgKGtleSA9PT0gTW9kZWxLZXlzLlRZUEUgJiYgIWFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICBhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tVHlwZXM6IFtwcm9wcy5uYW1lIGFzIHN0cmluZ10sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGNhbiBvbmx5IHN1cHBvcnQgYmFzaXMgY3R5cGVzIGF0IHRoaXMgdGltZVxuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkYkRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoXCJyZWxhdGlvbnNcIiksXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHR5cGVEYXRhOiBUeXBlTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRDbGFzczogQ29uc3RydWN0b3I8TW9kZWw+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkUGs6IGFueTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlY29yYXRvckRhdGEpLmxlbmd0aCkge1xuICAgICAgICB0eXBlRGF0YSA9IGRlY29yYXRvckRhdGFbVmFsaWRhdGlvbktleXMuVFlQRV0gYXMgVHlwZU1ldGFkYXRhO1xuXG4gICAgICAgIGlmICghdHlwZURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFR5cGU6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIHR5cGVvZiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55W10pWzBdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSgpXG4gICAgICAgICAgICAgIDogKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0sXG4gICAgICAgICAgICBpc1BrXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkVHlwZSA9IHsgbW9kZWw6IHBhcnNlZFR5cGUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZVN0cjpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgcGFyc2VkVHlwZS5tb2RlbCBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHR5cGVTdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlU3RyKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codHlwZVN0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgLy8gY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1RhYmxlU3BlYz4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKHBvb2wsIHR5cGVTdHIpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGlsZENsYXNzID0gcGFyc2VkVHlwZS5tb2RlbCBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IGNoaWxkQ2xhc3MoKTtcbiAgICAgICAgICAgIGNoaWxkUGsgPSBmaW5kUHJpbWFyeUtleShtKTtcbiAgICAgICAgICAgIHR5cGVTdHIgPSB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICAgIHBhcnNlZFR5cGUucGtUeXBlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsaWVudCwgY2hpbGRDbGFzcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvbmZsaWN0RXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cCA9IEFycmF5LmlzQXJyYXkodHlwZURhdGEuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyB0eXBlRGF0YS5jdXN0b21UeXBlc1swXVxuICAgICAgICAgIDogdHlwZURhdGEuY3VzdG9tVHlwZXM7XG4gICAgICAgIHRwID0gdHlwZW9mIHRwID09PSBcImZ1bmN0aW9uXCIgJiYgIXRwLm5hbWUgPyB0cCgpIDogdHA7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHIgPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICBpc1BrLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gICAgICAgICAgKGRlY29yYXRvckRhdGFbXG4gICAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXG4gICAgICAgICAgXSBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKSB8fCB7XG4gICAgICAgICAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IDI1NSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcSA9IGAke2NvbHVtbn0gJHt0eXBlU3RyfSR7dmFsaWRhdGlvblN0cn1gO1xuXG4gICAgICAgIGlmIChpc1BrKSB7XG4gICAgICAgICAgcXVlcnkudW5zaGlmdChxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeS5wdXNoKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9yRGF0YSkuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICAhW1ZhbGlkYXRpb25LZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdLmluY2x1ZGVzKGsgYXMgYW55KVxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICAgIGlzUGssXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkNPTlNUUkFJTlRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gaWdub3JlIGZvciBub3cuIHRoaXMgbGVhdmVzIGZvcmVpZ24ga2V5cyBvdXRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblxuICAgICAgaWYgKGZhbHNlIHx8IChkYkRlY3MgJiYgZGJEZWNzLmRlY29yYXRvcnMubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIXR5cGVEYXRhKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkYkRlY3MuZGVjb3JhdG9ycykge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjb3JhdG9yO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgYXMgQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgICAgICAgICAgY2hpbGRQay5pZCxcbiAgICAgICAgICAgIGtleSBhcyBQZXJzaXN0ZW5jZUtleXMsXG4gICAgICAgICAgICBwcm9wcyBhcyB1bmtub3duIGFzIFJlbGF0aW9uc01ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiRk9SRUlHTlwiKSkge1xuICAgICAgICAgICAgZm9yZWlnbktleXMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHJlbGF0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3Byb3AudG9TdHJpbmcoKV0gPSB7XG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5qb2luKFwiIFwiKSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgcHJpbWFyeUtleTogaXNQayxcbiAgICAgICAgY29uc3RyYWludHM6IGNvbnN0cmFpbnRzLFxuICAgICAgICBmb3JlaWduS2V5czogZm9yZWlnbktleXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KTtcbiAgICBjb25zdCBxdWVyeSA9IHZhbHVlcy5tYXAoKHIpID0+IHIucXVlcnkpLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuY29uc3RyYWludHMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5jb25zdHJhaW50cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBmb3JlaWduS2V5cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmZvcmVpZ25LZXlzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuZm9yZWlnbktleXMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgdmFscyA9IFtxdWVyeSwgY29uc3RyYWludHNdO1xuICAgIGlmIChmb3JlaWduS2V5cykge1xuICAgICAgdmFscy5wdXNoKGZvcmVpZ25LZXlzKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoJHt2YWxzLmZpbHRlcigodikgPT4gISF2KS5qb2luKFwiLFxcblwiKX0pYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUUklHR0VSIG5vdGlmeV9jaGFuZ2VzXyR7dGFibGVOYW1lfVxuQUZURVIgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04gJHt0YWJsZU5hbWV9XG4gICAgRk9SIEVBQ0ggUk9XXG4gICAgRVhFQ1VURSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpO2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGNsaWVudDogRGF0YVNvdXJjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgU0VMRUNUIENVUlJFTlRfVVNFUjtgO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgcmV0dXJuIHJlc3VsdFswXS5jdXJyZW50X3VzZXI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcblxuICAgIC8vIEB0YWJsZSgpID0+IEBFbnRpdHkoKVxuICAgIGNvbnN0IHRhYmxlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0YWJsZUtleSlcbiAgICAgIC5leHRlbmQoKG9yaWdpbmFsOiBhbnkpID0+XG4gICAgICAgIEVudGl0eSgpKG9yaWdpbmFsW01vZGVsS2V5cy5BTkNIT1JdIHx8IG9yaWdpbmFsKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcGsoKSA9PiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpIHwgQFByaW1hcnlDb2x1bW4oKVxuICAgIGNvbnN0IHBrS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcblxuICAgIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9yaWdpbmFsOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHBrS2V5LCBvcHRpb25zKSxcbiAgICAgICAgICBhc3NpZ24oYHBrLiR7cHJvcH1gLCBvcHRpb25zKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IHR5cGUgPVxuICAgICAgICAgIG9wdGlvbnMudHlwZSB8fCBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgcHJvcGVydHkgJHtwcm9wfSBvZiAke29yaWdpbmFsLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgc2VxdWVuY2VOYW1lRm9yTW9kZWwob3JpZ2luYWwsIFwicGtcIik7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwibnVtZXJpY1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwidmFyY2hhclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUNvbHVtbih7XG4gICAgICAgICAgICAgIHR5cGU6IHR5cGUgYXMgQ29sdW1uVHlwZSxcbiAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKShvcmlnaW5hbCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHBrS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogcGtEZWMsXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihNb2RlbEtleXMuQVRUUklCVVRFKVxuICAgICAgLmV4dGVuZChwcm9wZXJ0eSgpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAY29sdW1uKFwiY29sdW1uTmFtZVwiKSA9PiBAQ29sdW1uKHtuYW1lOiBcImNvbHVtbk5hbWVcIn0pXG4gICAgY29uc3QgY29sdW1uS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoY29sdW1uS2V5KVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1tKG5hbWU6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0czogQ29sdW1uT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKG5hbWUpIG9wdHMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBjb25zdCBwayA9IE1ldGFkYXRhLmdldChvYmosIFwicGtcIik7XG4gICAgICAgICAgICBpZiAocGsgIT09IHByb3ApIHtcbiAgICAgICAgICAgICAgb3B0cy5udWxsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uKG9wdHMpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXJnc1sxXTtcbiAgICAgICAgICByZXR1cm4gW2NvbHVtbk5hbWVdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHVuaXF1ZSA9PiBAQ29sdW1uKHt1bmlxdWU6IHRydWV9KVxuICAgIGNvbnN0IHVuaXF1ZUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVuaXF1ZUtleSlcbiAgICAgIC5kZWZpbmUocHJvcE1ldGFkYXRhKHVuaXF1ZUtleSwge30pKVxuICAgICAgLmV4dGVuZChDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEByZXF1aXJlZCA9PiBAQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pXG4gICAgY29uc3QgcmVxdWlyZWRLZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocmVxdWlyZWRLZXkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IG51bGxhYmxlOiBmYWxzZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHZlcnNpb24gPT4gQFZlcnNpb25Db2x1bW4oKVxuICAgIGNvbnN0IHZlcnNpb25LZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuVkVSU0lPTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodmVyc2lvbktleSlcbiAgICAgIC5kZWZpbmUodHlwZShOdW1iZXIubmFtZSksIFZlcnNpb25Db2x1bW4oKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gVmFsaWRhdGlvblVwZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gICAgfVxuXG4gICAgLy8gQHRpbWVzdGFtcChvcCkgPT4gQENyZWF0ZURhdGVDb2x1bW4oKSB8fCBAVXBkYXRlRGF0ZUNvbHVtbigpXG4gICAgY29uc3QgdGltZXN0YW1wS2V5ID0gVmFsaWRhdGlvblVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICAgIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIGRhdGUoZm9ybWF0LCBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgICAgcmVxdWlyZWQoREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgICAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICBwcm9wTWV0YWRhdGEodGltZXN0YW1wS2V5LCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElELFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICBlbHNlIGRlY29yYXRvcnMucHVzaChyZWFkb25seSgpKTtcbiAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0aW1lc3RhbXBLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiB0cyxcbiAgICAgIH0pXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAoLi4ub3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdGltZXN0YW1wKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChvcHMuaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gVXBkYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICByZXR1cm4gQ3JlYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb09uZShjbGF6eikgPT4gQE9uZVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgdHlwZShbXG4gICAgICAgICAgICAgICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZVxuICAgICAgICAgICAgICAgID8gY2xhenpcbiAgICAgICAgICAgICAgICA6IGNsYXp6Lm5hbWUpIGFzIGFueSxcbiAgICAgICAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvT25lS2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBPbmVUb09uZShcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKSkuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW3BrXTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEpvaW5Db2x1bW4oXG4gICAgICAgICAgICAgIG1ldGFkYXRhLm5hbWVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleUNvbnN0cmFpbnROYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogKHVuZGVmaW5lZCBhcyBhbnkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb01hbnkoY2xhenopID0+IEBPbmVUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3Qgb25lVG9NYW55S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihvbmVUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvbmVUb01hbnkoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICBsaXN0KGNsYXp6KSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb01hbnlLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9uZVRvTWFueVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZXR1cm4gT25lVG9NYW55KFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWMgPSBkZWNzLmRlY29yYXRvcnNbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXp6ID1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZGVjLnByb3BzLmNsYXNzID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZGVjLnByb3BzLmNsYXNzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZGVjLnByb3BzLmNsYXNzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZGVjLnByb3BzLmNsYXNzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenoubmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgYENyb3NzIHJlbGF0aW9uIG5vdCBmb3VuZC4gRGlkIHlvdSB1c2UgQG1hbnlUb09uZSBvbiB0aGUgJHtjbGF6ei5uYW1lfT9gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbY3Jvc3NSZWxhdGlvbktleV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICAgICkob2JqLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb09uZShjbGF6eikgPT4gQE1hbnlUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IChjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IGNsYXp6KSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICB0eXBlKFtcbiAgICAgICAgICAgICAgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lXG4gICAgICAgICAgICAgICAgPyBjbGF6elxuICAgICAgICAgICAgICAgIDogY2xhenoubmFtZSkgYXMgYW55LFxuICAgICAgICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEobWFueVRvT25lS2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBNYW55VG9PbmVXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICByZXR1cm4gTWFueVRvT25lKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpO1xuICAgICAgICAgICAgICAgICAgbGV0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdERlYyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTElTVCksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGlzdERlYylcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBObyBUeXBlIERlZmluaXRpb24gZm91bmQgZm9yICR7a30gaW4gJHttLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBsaXN0RGVjLmNsYXp6WzBdKCkubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIGNyb3NzUmVsYXRpb25LZXkgPSBmaW5kUHJpbWFyeUtleShcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKClcbiAgICAgICAgICAgICAgICAgICAgKS5pZCBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbY3Jvc3NSZWxhdGlvbktleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBtYW55VG9NYW55KGNsYXp6KSA9PiBATWFueVRvTWFueSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9NYW55S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IobWFueVRvTWFueUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb01hbnkoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiBjbGF6ei5uYW1lLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgbGlzdChjbGF6eiksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEobWFueVRvTWFueUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgTWFueVRvTWFueShcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKSkuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW3BrXTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEpvaW5UYWJsZSgpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25UeXBlT1JNQ3JlYXRlVXBkYXRlLCB7fSksXG4gICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgICAvLyBhc3NpZ24oYHBrLiR7cHJvcH1gLCBvcHRpb25zKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGUsIHt9KSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuXG5BZGFwdGVyLnNldEN1cnJlbnQoVHlwZU9STUZsYXZvdXIpO1xuIiwiaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuXG5UeXBlT1JNQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gaW50ZWdyYXRpb24gZm9yIERlY2FmLnRzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFR5cGVPUk0tYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNhZi50cyBkYXRhIGFjY2VzcyBhYnN0cmFjdGlvbnMsIGluY2x1ZGluZyB0aGUgYWRhcHRlciwgcmVwb3NpdG9yeSwgc3RhdGVtZW50IGJ1aWxkZXIsIHBhZ2luYXRpb24gdXRpbGl0aWVzLCBpbmRleCBoZWxwZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucy4gS2V5IGV4cG9ydHMgaW5jbHVkZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCB7QGxpbmsgVHlwZU9STVJlcG9zaXRvcnl9LCB7QGxpbmsgVHlwZU9STVN0YXRlbWVudH0sIHtAbGluayBUeXBlT1JNUGFnaW5hdG9yfSwgYW5kIGluZGV4IGdlbmVyYXRpb24gdXRpbGl0aWVzLlxuICogQG1vZHVsZSBmb3ItdHlwZW9ybVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJCYXNlRXJyb3IiLCJTUUxPcGVyYXRvciIsIlBhZ2luYXRvciIsIk1vZGVsS2V5cyIsIlBhZ2luZ0Vycm9yIiwiZmluZFByaW1hcnlLZXkiLCJRdWVyeUVycm9yIiwiU3RhdGVtZW50IiwiUmVwb3NpdG9yeSIsIk9yZGVyRGlyZWN0aW9uIiwiSW50ZXJuYWxFcnJvciIsIkdyb3VwT3BlcmF0b3IiLCJPcGVyYXRvciIsIlNlcXVlbmNlIiwiTm90Rm91bmRFcnJvciIsIkRlZmF1bHRTZXBhcmF0b3IiLCJQZXJzaXN0ZW5jZUtleXMiLCJUeXBlT1JNUmVwb3NpdG9yeSIsIkNvbnRleHQiLCJPcGVyYXRpb25LZXlzIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIlZhbGlkYXRpb25FcnJvciIsIl9fZGVjb3JhdGUiLCJ1c2VzIiwiQWRhcHRlciIsIk1vZGVsIiwiRXZlbnRTdWJzY3JpYmVyIiwiRGlzcGF0Y2giLCJWYWxpZGF0aW9uS2V5cyIsIlVuc3VwcG9ydGVkRXJyb3IiLCJnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIiwiQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yIiwiUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvciIsIkRhdGFTb3VyY2UiLCJSZWZsZWN0aW9uIiwiREJLZXlzIiwiQ29uZmxpY3RFcnJvciIsIkluIiwiQ29ubmVjdGlvbkVycm9yIiwiTG9nZ2luZyIsIkRFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJEZWNvcmF0aW9uIiwicmVxdWlyZWQiLCJyZWFkb25seSIsInByb3BNZXRhZGF0YSIsInNlcXVlbmNlTmFtZUZvck1vZGVsIiwiYXBwbHkiLCJWYWxpZGF0aW9uIiwidHlwZSIsIlZlcnNpb25Db2x1bW4iLCJVcGRhdGVWYWxpZGF0aW9uS2V5cyIsImRhdGUiLCJEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTIiwiQ2FzY2FkZSIsInByb3AiLCJKb2luQ29sdW1uIiwibGlzdCIsIkpvaW5UYWJsZSIsIm9uQ3JlYXRlIiwib25DcmVhdGVVcGRhdGUiLCJmaW5hbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUE7Ozs7O0lBS0c7QUFDSSxVQUFNLGtCQUFrQixHQUM3QjtBQUVLLFVBQU0sY0FBYyxHQUFHO0lBRTlCOzs7Ozs7Ozs7Ozs7O0lBYUc7SUFDSDs7Ozs7O0lBTUc7QUFDSSxVQUFNLFdBQVcsR0FBRztJQUN6QixJQUFBLFNBQVMsRUFBRSxHQUFHO0lBQ2QsSUFBQSxFQUFFLEVBQUUsSUFBSTtJQUNSLElBQUEsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBQSxPQUFPLEVBQUUsWUFBWTtJQUNyQixJQUFBLEtBQUssRUFBRSxZQUFZO0lBQ25CLElBQUEsTUFBTSxFQUFFLGFBQWE7SUFDckIsSUFBQSxRQUFRLEVBQUUsZUFBZTtJQUN6QixJQUFBLEtBQUssRUFBRSxPQUFPOzs7SUN0Q2hCOzs7Ozs7Ozs7Ozs7Ozs7O0lBZ0JHO0lBQ0csTUFBTyxVQUFXLFNBQVFBLHNCQUFTLENBQUE7SUFDdkMsSUFBQSxXQUFBLENBQVksR0FBbUIsRUFBQTtZQUM3QixLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xDO0lBQ0Q7O0lDbkJEOzs7OztJQUtHO0FBQ1NDO0lBQVosQ0FBQSxVQUFZLFdBQVcsRUFBQTtJQUNyQixJQUFBLFdBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxHQUFXO0lBQ1gsSUFBQSxXQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsSUFBZ0I7SUFDaEIsSUFBQSxXQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsR0FBZTtJQUNmLElBQUEsV0FBQSxDQUFBLG9CQUFBLENBQUEsR0FBQSxJQUF5QjtJQUN6QixJQUFBLFdBQUEsQ0FBQSxjQUFBLENBQUEsR0FBQSxHQUFrQjtJQUNsQixJQUFBLFdBQUEsQ0FBQSx1QkFBQSxDQUFBLEdBQUEsSUFBNEI7SUFDNUIsSUFBQSxXQUFBLENBQUEs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
3086
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvT25lVG9PbmUudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9NYW55VG9NYW55LnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9FbnRpdHkudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuZXhwb3J0IGNvbnN0IFR5cGVPUk1GbGF2b3VyID0gXCJ0eXBlLW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgVHlwZU9STUtleXMgY29uc3RhbnQuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgdGhlIGtleXMgYW5kIHRoZWlyIG1lYW5pbmdzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEB0eXBlZGVmIFR5cGVPUk1LZXlzRGVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VQQVJBVE9SIFNlcGFyYXRvciB1c2VkIHRvIGpvaW4gdGFibGUgYW5kIGNvbHVtbiBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCBEZWZhdWx0IHByaW1hcnkga2V5IGZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVkVSU0lPTiBWZXJzaW9uIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUxFVEVEIFNvZnQtZGVsZXRlIHRpbWVzdGFtcCBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUQUJMRSBEYXRhYmFzZSB0YWJsZSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTQ0hFTUEgRGF0YWJhc2Ugc2NoZW1hIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUVVFTkNFIERhdGFiYXNlIHNlcXVlbmNlIG5hbWUga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOREVYIEluZGV4IGlkZW50aWZpZXIga2V5LlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB0aGF0IGlkZW50aWZ5IGNvbW1vbiBkYXRhYmFzZSBwcm9wZXJ0aWVzIGFuZCBhZGFwdGVyLXNwZWNpZmljIGtleXMuXG4gKiBAY29uc3QgVHlwZU9STUtleXNcbiAqIEB0eXBlIHtUeXBlT1JNS2V5c0RlZn1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1LZXlzID0ge1xuICBTRVBBUkFUT1I6IFwiLlwiLFxuICBJRDogXCJpZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgREVMRVRFRDogXCJkZWxldGVkX2F0XCIsXG4gIFRBQkxFOiBcInRhYmxlX25hbWVcIixcbiAgU0NIRU1BOiBcInNjaGVtYV9uYW1lXCIsXG4gIFNFUVVFTkNFOiBcInNlcXVlbmNlX25hbWVcIixcbiAgSU5ERVg6IFwiaW5kZXhcIixcbn07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBUeXBlT1JNIGluZGV4ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGVycm9yIHJlbGF0ZWQgdG8gaW5kZXggZ2VuZXJhdGlvbiBvciBoYW5kbGluZyB3aXRoaW4gdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBJbmRleEVycm9yXG4gKiB0cnkge1xuICogICAvLyBTb21lIGNvZGUgdGhhdCBtaWdodCB0aHJvdyBhbiBpbmRleCBlcnJvclxuICogICB0aHJvdyBuZXcgSW5kZXhFcnJvcihcIkluZGV4IG5vdCBmb3VuZFwiKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEluZGV4RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKFwiSW5kZXggZXJyb3Igb2NjdXJyZWQ6XCIsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEluZGV4RXJyb3IubmFtZSwgbXNnLCA0MDQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZW51bSBTUUxPcGVyYXRvciB7XG4gIEVRVUFMID0gXCI9XCIsXG4gIE5PVF9FUVVBTCA9IFwiPD5cIixcbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgR1JFQVRFUl9USEFOID0gXCI+XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9IFwiPj1cIixcbiAgSU4gPSBcIklOXCIsXG4gIE5PVF9JTiA9IFwiTk9UIElOXCIsXG4gIExJS0UgPSBcIkxJS0VcIixcbiAgSUxJS0UgPSBcIklMSUtFXCIsXG4gIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgSVNfTlVMTCA9IFwiSVMgTlVMTFwiLFxuICBJU19OT1RfTlVMTCA9IFwiSVMgTk9UIE5VTExcIixcbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICBBTlkgPSBcIkFOWVwiLFxuICBBTEwgPSBcIkFMTFwiLFxuICBTT01FID0gXCJTT01FXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFF1ZXJ5IGNvbnRhaW5lciB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVpdGhlciBhIHJhdyBTUUwgc3RyaW5nIG9yIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgYWxvbmcgd2l0aCBvcHRpb25hbCBib3VuZCB2YWx1ZXMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgTSBUaGUgTW9kZWwgdHlwZSBmb3Igd2hpY2ggdGhlIFNlbGVjdFF1ZXJ5QnVpbGRlciBpcyBwYXJhbWV0ZXJpemVkLlxuICogQHRlbXBsYXRlIFQgVGhlIHVuZGVybHlpbmcgcXVlcnkgdHlwZSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LlxuICogQGludGVyZmFjZSBUeXBlT1JNUXVlcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNUXVlcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCA9IE1vZGVsLFxuICBUIGV4dGVuZHMgc3RyaW5nIHwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+ID0gc3RyaW5nLFxuPiB7XG4gIHF1ZXJ5OiBUO1xuICB2YWx1ZXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgVHlwZU9STSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgRXh0ZW5kZWQgcmVwb3NpdG9yeSBmbGFncyBpbmNsdWRpbmcgY29ubmVjdGlvbi91c2VyIGNvbnRleHQgdGhhdCBjYW4gYmUgbGV2ZXJhZ2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1GbGFnc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1GbGFncyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXNlciBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUG9zdGdyZXMgZGF0YWJhc2UgY29ubmVjdGlvbnNcbiAgICovXG4gIHVzZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWNhdGlvbiBmb3IgYSB0YWJsZSBjcmVhdGlvbi9jaGFuZ2Ugc3RhdGVtZW50IHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgYSBUeXBlT1JNUXVlcnkgd2l0aCB0YWJsZSBtZXRhZGF0YSBzdWNoIGFzIHByaW1hcnkga2V5IGZsYWcsIGNvbnN0cmFpbnRzLCBhbmQgZm9yZWlnbiBrZXlzLlxuICogQHR5cGVkZWYgVHlwZU9STVRhYmxlU3BlY1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcmltYXJ5S2V5IEluZGljYXRlcyBpZiB0aGUgdGFyZ2V0IGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNvbnN0cmFpbnRzIEEgbGlzdCBvZiByYXcgU1FMIGNvbnN0cmFpbnRzIHRvIGFwcGx5IHRvIHRoZSB0YWJsZS9jb2x1bW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmb3JlaWduS2V5cyBBIGxpc3Qgb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludCBkZWZpbml0aW9ucy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZU9STVRhYmxlU3BlYyA9IFR5cGVPUk1RdWVyeSAmIHtcbiAgcHJpbWFyeUtleTogYm9vbGVhbjtcbiAgY29uc3RyYWludHM6IHN0cmluZ1tdO1xuICBmb3JlaWduS2V5czogc3RyaW5nW107XG59O1xuIiwiaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBxdWVyeSBsaW1pdCBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IE1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuIGluIGEgc2luZ2xlIHBhZ2Ugd2hlbiBwYWdpbmF0aW5nIHJlc3VsdHMuXG4gKiBAY29uc3QgVHlwZU9STVF1ZXJ5TGltaXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0ID0gMjUwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgd2hlbiB0cmFuc2xhdGluZyBoaWdoLWxldmVsIGZpbHRlcnMgaW50byBTUUwgdmlhIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUwgRXF1YWxpdHkgb3BlcmF0b3IgKD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRkVSRU5UIEluZXF1YWxpdHkgb3BlcmF0b3IgKDw+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUiBHcmVhdGVyIHRoYW4gb3BlcmF0b3IgKD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSX0VRIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPj0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUiBMZXNzIHRoYW4gb3BlcmF0b3IgKDwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUl9FUSBMZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKDw9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5PVCBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOIEluIGFycmF5IG9wZXJhdG9yIChJTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUdFWFAgUmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElSRUdFWFAgQ2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4qKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJS0UgUGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTElLRSBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKElMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJFVFdFRU4gUmFuZ2Ugb3BlcmF0b3IgKEJFVFdFRU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTlVMTCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOVUxMKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05PVF9OVUxMIE5PVCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOT1QgTlVMTClcbiAqIEBjb25zdCBUeXBlT1JNT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STU9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBTUUxPcGVyYXRvciB8IHN0cmluZz4gPSB7XG4gIEVRVUFMOiBTUUxPcGVyYXRvci5FUVVBTCxcbiAgRElGRkVSRU5UOiBTUUxPcGVyYXRvci5OT1RfRVFVQUwsXG4gIEJJR0dFUjogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOLFxuICBCSUdHRVJfRVE6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbiAgU01BTExFUjogU1FMT3BlcmF0b3IuTEVTU19USEFOLFxuICBTTUFMTEVSX0VROiBTUUxPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEJFVFdFRU46IFNRTE9wZXJhdG9yLkJFVFdFRU4sXG4gIE5PVDogXCJOT1RcIixcbiAgSU46IFNRTE9wZXJhdG9yLklOLFxuICBJU19OVUxMOiBTUUxPcGVyYXRvci5JU19OVUxMLFxuICBJU19OT1RfTlVMTDogU1FMT3BlcmF0b3IuSVNfTk9UX05VTEwsXG4gIFJFR0VYUDogXCJ+XCIsXG4gIElSRUdFWFA6IFwifipcIixcbiAgTElLRTogU1FMT3BlcmF0b3IuTElLRSxcbiAgSUxJS0U6IFNRTE9wZXJhdG9yLklMSUtFLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBsb2dpY2FsIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIHVzZWQgd2hlbiBidWlsZGluZyBXSEVSRSBjbGF1c2UgZ3JvdXBzIGluIFR5cGVPUk0gcXVlcmllcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFORCBMb2dpY2FsIEFORCBvcGVyYXRvciAoQU5EKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE9SIExvZ2ljYWwgT1Igb3BlcmF0b3IgKE9SKVxuICogQGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFORDogXCJBTkRcIixcbiAgT1I6IFwiT1JcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpYWwgY29uc3RhbnQgdmFsdWVzIHVzZWQgaW4gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFN0cmluZyBjb25zdGFudHMgcmVwcmVzZW50aW5nIHNwZWNpYWwgdmFsdWVzIHVzZWQgd2hpbGUgY29tcG9zaW5nIFNRTCB3aXRoIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMQ29uc3RUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVMTCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVsbCB2YWx1ZS5cbiAqIEBjb25zdCBUeXBlT1JNQ29uc3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Db25zdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTlVMTDogXCJOVUxMXCIsXG59O1xuIiwiaW1wb3J0IHsgUGFnaW5hdG9yLCBQYWdpbmdFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFJlcG9zaXRvcnkgYXMgUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgcGFnaW5hdGlvbiBmb3IgVHlwZU9STS1idWlsdCBxdWVyaWVzIHVzaW5nIHRha2Uvc2tpcCBmb3IgZWZmaWNpZW50IG5hdmlnYXRpb24gdGhyb3VnaCByZXN1bHQgc2V0cy5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgVHlwZU9STVBhZ2luYXRvcihhZGFwdGVyLCB7IHF1ZXJ5OiBxYiB9LCAxMCwgVXNlcik7XG4gKiBjb25zdCBwYWdlMSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICogY29uc3QgcGFnZTIgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgVHlwZU9STVF1ZXJ5XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSByZWNvcmQgY291bnQgYW5kIHBhZ2Ugc2l6ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3JlcG8/OiBSZXBvPGFueT47XG5cbiAgcHJvdGVjdGVkIGdldCByZXBvKCkge1xuICAgIGlmICghdGhpcy5fX3JlcG8pIHtcbiAgICAgIHRoaXMuX19yZXBvID0gKHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcikuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zT3JkZXIgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZVxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuICAgIC8vXG4gICAgLy8gcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5mcm9tKFxuICAgIC8vICAgdGhpcy5mcm9tU2VsZWN0b3JbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5mcm9tU2VsZWN0b3JdLFxuICAgIC8vICAgdGFibGVOYW1lXG4gICAgLy8gKTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgcS5xdWVyeSA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PlxuICAgICAgKS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcblxuICAgIGxldCBvcmRlckJ5QXJnczogW3N0cmluZywgXCJERVNDXCIgfCBcIkFTQ1wiXTtcbiAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHtmaW5kUHJpbWFyeUtleShtKS5pZCBhcyBzdHJpbmd9YCxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24uQVNDLnRvVXBwZXJDYXNlKCkgYXMgXCJBU0NcIixcbiAgICAgIF07XG4gICAgZWxzZVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHt0aGlzLm9yZGVyQnlTZWxlY3RvclswXSBhcyBzdHJpbmd9YCxcbiAgICAgICAgdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9VcHBlckNhc2UoKSBhcyBcIkRFU0NcIiB8IFwiQVNDXCIsXG4gICAgICBdO1xuXG4gICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5vcmRlckJ5KC4uLm9yZGVyQnlBcmdzKTtcbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KHRoaXMubGltaXRTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgbGltaXQgb2YgJHtUeXBlT1JNUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdChUeXBlT1JNUXVlcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9mZnNldFxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5za2lwKHRoaXMub2Zmc2V0U2VsZWN0b3IpO1xuXG4gICAgcmV0dXJuIHEgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgVHlwZU9STVBhZ2luYXRvciBmb3IgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgY29uc3QgYSA9IHF1ZXJ5LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtrZXlvZiBNfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWR9IHNlcXVlbmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkYXRhYmFzZSBzZXF1ZW5jZSBmb3IgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgU2VxdWVuY2V9cywgZGVsZWdhdGluZyB0byB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSB0byBmZXRjaCBhbmQgaW5jcmVtZW50IHZhbHVlcyB3aGlsZSBoYW5kbGluZyB0eXBlIHBhcnNpbmcgYW5kIGVycm9yIHRyYW5zbGF0aW9uLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAobmFtZSwgdHlwZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeSwgZXRjLikuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4gKiBAY2xhc3MgVHlwZU9STVNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbmQgdXNlIGEgVHlwZU9STS1iYWNrZWQgc2VxdWVuY2VcbiAqIGNvbnN0IHNlcSA9IG5ldyBUeXBlT1JNU2VxdWVuY2UoeyBuYW1lOiBcInVzZXJfaWRfc2VxXCIsIHR5cGU6IFwiTnVtYmVyXCIsIHN0YXJ0V2l0aDogMSwgaW5jcmVtZW50Qnk6IDEgfSwgYWRhcHRlcik7XG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXEubmV4dCgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFNlcSBhcyBUeXBlT1JNU2VxdWVuY2VcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBBcHAtPj5TZXE6IG5leHQoKVxuICogICBTZXEtPj5TZXE6IGN1cnJlbnQoKVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcoU0VMRUNUIGN1cnJlbnRfdmFsdWUgLi4uKVxuICogICBBZGFwdGVyLT4+REI6IFF1ZXJ5IGN1cnJlbnQgdmFsdWVcbiAqICAgREItLT4+QWRhcHRlcjogY3VycmVudF92YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLT4+U2VxOiBpbmNyZW1lbnQoY3VycmVudClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KG5leHR2YWwobmFtZSkpXG4gKiAgIEFkYXB0ZXItPj5EQjogbmV4dHZhbCgpXG4gKiAgIERCLS0+PkFkYXB0ZXI6IG5leHQgdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0tPj5BcHA6IHBhcnNlZCBuZXh0IHZhbHVlXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXJcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXE6IGFueSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBjdXJyZW50X3ZhbHVlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNlcXVlbmNlcyBXSEVSRSBzZXF1ZW5jZV9uYW1lID0gJDFgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxLmN1cnJlbnRfdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLmFkYXB0ZXIucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyc2VzIHRoZSB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNlcXVlbmNlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50XG4gICAqIEBwYXJhbSBjb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lLCBzdGFydFdpdGggfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodHlwZSAhPT0gXCJOdW1iZXJcIiAmJiB0eXBlICE9PSBcIkJpZ0ludFwiKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5jcmVtZW50IHNlcXVlbmNlIG9mIHR5cGUgJHt0eXBlfSB3aXRoICR7Y291bnR9YFxuICAgICAgKTtcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIHRyeSB7XG4gICAgICBuZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIG5leHR2YWwoJDEpO2AsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYENSRUFURSBTRVFVRU5DRSBJRiBOT1QgRVhJU1RTICQxIFNUQVJUIFdJVEggJDIgSU5DUkVNRU5UIEJZICQzIE5PIENZQ0xFO2AsXG4gICAgICAgIHZhbHVlczogW25hbWUsIHN0YXJ0V2l0aCwgaW5jcmVtZW50QnldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluZGV4TWV0YWRhdGEsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4XG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleCBieSBjb21iaW5pbmcgbmFtZSBwYXJ0cywgY29tcG9zaXRpb25zLCBhbmQgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lIC0gQXJyYXkgb2YgbmFtZSBwYXJ0cyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbZGlyZWN0aW9uXSAtIE9wdGlvbmFsIHNvcnQgZGlyZWN0aW9uIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gdGhlIGluZGV4IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGluZGV4IG5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gVHlwZU9STUtleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIFR5cGVPUk1LZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBBcnJheSBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4ZXNcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleE5hbWVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICpcbiAqICAgQ2FsbGVyLT4+Z2VuZXJhdGVJbmRleGVzOiBtb2RlbHNcbiAqXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBiYXNlIHRhYmxlIGluZGV4XG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhOYW1lOiBbQ291Y2hEQktleXMuVEFCTEVdXG4gKiAgIGdlbmVyYXRlSW5kZXhOYW1lLS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIHRhYmxlIGluZGV4IGNvbmZpZ1xuICpcbiAqICAgbG9vcCBGb3IgZWFjaCBtb2RlbFxuICogICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCBpbmRleGVzIG1ldGFkYXRhXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IGluZGV4IG1ldGFkYXRhXG4gKlxuICogICAgIGxvb3AgRm9yIGVhY2ggaW5kZXggaW4gbWV0YWRhdGFcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IEV4dHJhY3QgaW5kZXggcHJvcGVydGllc1xuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBEZWZpbmUgbmVzdGVkIGdlbmVyYXRlIGZ1bmN0aW9uXG4gKlxuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKCkgZm9yIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBpbmRleCBuYW1lIGFuZCBjb25maWdcbiAqXG4gKiAgICAgICBhbHQgSGFzIGRpcmVjdGlvbnNcbiAqICAgICAgICAgbG9vcCBGb3IgZWFjaCBkaXJlY3Rpb25cbiAqICAgICAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoZGlyZWN0aW9uKVxuICogICAgICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBvcmRlcmVkIGluZGV4IGNvbmZpZ1xuICogICAgICAgICBlbmRcbiAqICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0tPj5DYWxsZXI6IEFycmF5IG9mIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4pOiBUeXBlT1JNUXVlcnlbXSB7XG4gIGNvbnN0IHRhYmxlTmFtZSA9IGdlbmVyYXRlSW5kZXhOYW1lKFtUeXBlT1JNS2V5cy5UQUJMRV0pO1xuICBjb25zdCBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNUXVlcnk+ID0ge307XG4gIGluZGV4ZXNbdGFibGVOYW1lXSA9IHtcbiAgICBxdWVyeTogYGAsXG4gICAgdmFsdWVzOiBbXSxcbiAgfTtcblxuICBtb2RlbHMuZm9yRWFjaCgobSkgPT4ge1xuICAgIGNvbnN0IGluZDogUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4gPSBSZXBvc2l0b3J5LmluZGV4ZXMobSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaW5kKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBPYmplY3Qua2V5cyh2YWx1ZSlbMF07XG5cbiAgICAgIGxldCB7IGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtrZXksIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLCBQZXJzaXN0ZW5jZUtleXMuSU5ERVhdLmpvaW4oXG4gICAgICAgICAgRGVmYXVsdFNlcGFyYXRvclxuICAgICAgICApO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgcXVlcnk6IGBDUkVBVEUgSU5ERVggJDEgT04gJDIgKCQzKTtgLFxuICAgICAgICAgIHZhbHVlczogW25hbWUsIHRhYmxlTmFtZSwga2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdGUoKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluZGV4ZXMpO1xufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwidHlwZW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zIGZvciBhIGdpdmVuIE1vZGVsIHVzaW5nIHRoZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCBpbmNsdWRpbmcgYnVsayBvcGVyYXRpb25zIGFuZCBxdWVyeSBidWlsZGVyIGFjY2VzcyB3aGlsZSBwcmVzZXJ2aW5nIERlY2FmLnRzIHJlcG9zaXRvcnkgc2VtYW50aWNzLlxuICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWwgdGhhdCB0aGlzIHJlcG9zaXRvcnkgd2lsbCBtYW5hZ2UuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBhZGFwdGVyIHVzZWQgdG8gZXhlY3V0ZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGhlIE1vZGVsIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuXG4gKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGJhc2UgUmVwb3NpdG9yeS5cbiAqIEBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeVxuICogY29uc3QgcmVwbyA9IG5ldyBUeXBlT1JNUmVwb3NpdG9yeTxVc2VyPihhZGFwdGVyLCBVc2VyKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6IFwiQWxpY2VcIiB9KSk7XG4gKiBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGNyZWF0ZWQuaWQpO1xuICpcbiAqIC8vIEJ1bGsgY3JlYXRlXG4gKiBhd2FpdCByZXBvLmNyZWF0ZUFsbChbbmV3IFVzZXIoeyBuYW1lOiBcIkFcIiB9KSwgbmV3IFVzZXIoeyBuYW1lOiBcIkJcIiB9KV0pO1xuICpcbiAqIC8vIFVzaW5nIHRoZSBxdWVyeSBidWlsZGVyXG4gKiBjb25zdCBxYiA9IHJlcG8ucXVlcnlCdWlsZGVyKCk7XG4gKiBjb25zdCByb3dzID0gYXdhaXQgcWIud2hlcmUoXCJuYW1lID0gOm5hbWVcIiwgeyBuYW1lOiBcIkFsaWNlXCIgfSkuZ2V0TWFueSgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBUeXBlT1JNL0RhdGFTb3VyY2VcbiAqXG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHByZXBhcmUobW9kZWwsIHBrKVxuICogICBBZGFwdGVyLS0+PlJlcG86IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH1cbiAqICAgUmVwby0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIG1vZGVsLCAuLi5hcmdzKVxuICogICBBZGFwdGVyLT4+REI6IElOU0VSVCAuLi5cbiAqICAgREItLT4+QWRhcHRlcjogcm93XG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogcm93XG4gKiAgIFJlcG8tPj5BZGFwdGVyOiByZXZlcnQocm93LCBjbGF6eiwgcGssIGlkKVxuICogICBBZGFwdGVyLS0+PlJlcG86IG1vZGVsXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdXNlcyhUeXBlT1JNRmxhdm91cilcbmV4cG9ydCBjbGFzcyBUeXBlT1JNUmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgTSxcbiAgVHlwZU9STVF1ZXJ5PE0sIGFueT4sXG4gIEFkYXB0ZXI8RGF0YVNvdXJjZU9wdGlvbnMsIFR5cGVPUk1RdWVyeSwgVHlwZU9STUZsYWdzLCBDb250ZXh0PFR5cGVPUk1GbGFncz4+LFxuICBUeXBlT1JNRmxhZ3MsXG4gIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IEFkYXB0ZXI8XG4gICAgICBEYXRhU291cmNlT3B0aW9ucyxcbiAgICAgIFR5cGVPUk1RdWVyeSxcbiAgICAgIFR5cGVPUk1GbGFncyxcbiAgICAgIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuICAgID4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG1vZGVsLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIFR5cGVPUk0gcXVlcnkgYnVpbGRlciBmb3IgdGhlIHJlcG9zaXRvcnkgZW50aXR5LlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgU2VsZWN0UXVlcnlCdWlsZGVyIGJvdW5kIHRvIHRoaXMgcmVwb3NpdG9yeSdzIGVudGl0eSBmb3IgYWR2YW5jZWQgcXVlcnlpbmcuXG4gICAqIEByZXR1cm4ge1F1ZXJ5QnVpbGRlcjxhbnk+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCk6IFF1ZXJ5QnVpbGRlcjxhbnk+IHtcbiAgICBjb25zdCByZXBvID0gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIHRoaXMuY2xhc3NbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGFzc11cbiAgICApO1xuICAgIHJldHVybiByZXBvLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuZCBwZXJzaXN0cyBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwsIGRlbGVnYXRlcyBpbnNlcnRpb24gdG8gdGhlIGFkYXB0ZXIsIGFuZCByZWh5ZHJhdGVzIHRoZSBwZXJzaXN0ZWQgc3RhdGUgYmFjayBpbnRvIGEgTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkLFxuICAgICAgbW9kZWwgYXMgYW55LFxuICAgICAgdGhpcy5wayxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGxldCBjOiBDb250ZXh0PFR5cGVPUk1GbGFncz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIENvbnRleHQ8VHlwZU9STUZsYWdzPjtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmdcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbmQgcGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsLCBkZWxlZ2F0ZXMgdXBkYXRlIHRvIHRoZSBhZGFwdGVyLCBhbmQgcmVoeWRyYXRlcyB0aGUgcGVyc2lzdGVkIHN0YXRlIGJhY2sgaW50byBhIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCxcbiAgICAgIG1vZGVsLFxuICAgICAgdGhpcy5wayxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQsIHRyYW5zaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBtb2RlbHMgZm9yIGJ1bGsgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVjb3JhdG9yLWJhc2VkIHZhbGlkYXRpb25zIGFuZCByZXR1cm5zIHRyYW5zZm9ybWVkIG1vZGVscyB3aXRoIGNvbnRleHQgYXJncyBmb3IgY3JlYXRlQWxsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxbTVtdLCAuLi5hbnlbXV0+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgRGlzcGF0Y2gge1xuICogICAgICtpbml0aWFsaXplKClcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKClcbiAqICAgfVxuICogICBjbGFzcyBUeXBlT1JNRGlzcGF0Y2gge1xuICogICAgIC1vYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmdcbiAqICAgICAtYXR0ZW1wdENvdW50ZXI6IG51bWJlclxuICogICAgIC10aW1lb3V0OiBudW1iZXJcbiAqICAgICArY29uc3RydWN0b3IodGltZW91dClcbiAqICAgICAjbm90aWZpY2F0aW9uSGFuZGxlcigpXG4gKiAgICAgI2luaXRpYWxpemUoKVxuICogICB9XG4gKiAgIERpc3BhdGNoIDx8LS0gVHlwZU9STURpc3BhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxEYXRhU291cmNlT3B0aW9ucz4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVvdXQgPSA1MDAwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIFR5cGVPUk0gbm90aWZpY2F0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyAodHJhbnNsYXRlZCBmcm9tIFR5cGVPUk0gZXZlbnRzKSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IHJlY29yZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkcyBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG5vdGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBQb3N0Z3JlU1FMRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gICAqICAgTm90ZSBvdmVyIEQ6IFJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20gUG9zdGdyZVNRTFxuICAgKiAgIEQtPj5EOiBQYXJzZSBub3RpZmljYXRpb24gcGF5bG9hZFxuICAgKiAgIEQtPj5EOiBFeHRyYWN0IHRhYmxlLCBvcGVyYXRpb24sIGFuZCBpZHNcbiAgICogICBELT4+TzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcylcbiAgICogICBELT4+RDogVXBkYXRlIG9ic2VydmVyTGFzdFVwZGF0ZVxuICAgKiAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBkaXNwYXRjaFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgaWRzOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyKTtcbiAgICB0cnkge1xuICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbG9nLnZlcmJvc2UoYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke29wZXJhdGlvbn0gZm9yICR7dGFibGV9YCk7XG4gICAgICBsb2cuZGVidWcoYHBrczogJHtpZHN9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaGVyIGFuZCBzdWJzY3JpYmVzIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIG9uIHRoZSBEYXRhU291cmNlIGFuZCBsb2dzIHRoZSBzdWJzY3JpcHRpb24gbGlmZWN5Y2xlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgVHlwZU9STURpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIEQtPj5TOiBDYWxsIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIFMtPj5TOiBDaGVjayBhZGFwdGVyIGFuZCBuYXRpdmVcbiAgICogICBhbHQgTm8gYWRhcHRlciBvciBuYXRpdmVcbiAgICogICAgIFMtLT4+UzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFMtPj5EUzogaW5pdGlhbGl6ZSgpXG4gICAqICAgUy0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFR5cGVPUk1FdmVudFN1YnNjcmliZXIpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERTLS0+PlM6IFN1YnNjcmlwdGlvbiBlc3RhYmxpc2hlZFxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlc29sdmVzXG4gICAqICAgICBELT4+TDogTG9nIHN1Y2Nlc3NmdWwgc3Vic2NyaXB0aW9uXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgRFMtLT4+UzogRXJyb3JcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZWplY3RzXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJzY3JpYmVUb1R5cGVPUk0odGhpczogVHlwZU9STURpc3BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5uYXRpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIvbmF0aXZlIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWFkYXB0ZXIuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuZGF0YVNvdXJjZS5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgYWRhcHRlci5kYXRhU291cmNlLnN1YnNjcmliZXJzLnB1c2goXG4gICAgICAgICAgbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyLmJpbmQodGhpcykpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZVRvVHlwZU9STVxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gVHlwZU9STSBub3RpZmljYXRpb25zOiAke2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBtZXRob2QgdG8gcmVsZWFzZSByZXNvdXJjZXMgd2hlbiB0aGUgZGlzcGF0Y2hlciBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBpZiAodGhpcy5hZGFwdGVyKSB7XG4gICAgLy9cbiAgICAvLyAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXI7XG4gICAgLy8gICBhd2FpdCBhZGFwdGVyLmRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICAgIC8vIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBSZWdFeHAgcGF0dGVybiB0byBhIFBvc3RncmVTUUwgUE9TSVggcGF0dGVybiBzdHJpbmcuXG4gKiBAc3VtbWFyeSBBY2NlcHRzIGVpdGhlciBhIFJlZ0V4cCBvYmplY3Qgb3IgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gKC9wYXR0ZXJuL2ZsYWdzKSBhbmQgcmV0dXJucyB0aGUgcmF3IHBhdHRlcm4gY29tcGF0aWJsZSB3aXRoIFBvc3RncmVTUUwncyB+IGFuZCB+KiBvcGVyYXRvcnMuXG4gKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IGpzUmVnZXggSmF2YVNjcmlwdCBSZWdFeHAgb2JqZWN0IG9yIHBhdHRlcm4gc3RyaW5nLlxuICogQHJldHVybiB7c3RyaW5nfSBQb3N0Z3JlU1FMLWNvbXBhdGlibGUgcmVnZXggcGF0dGVybiBzdHJpbmcuXG4gKiBAZnVuY3Rpb24gY29udmVydEpzUmVnZXhUb1Bvc3RncmVzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBVdGlscyBhcyBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqICAgQXBwLT4+VXRpbHM6IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3JlcyhSZWdFeHAoXCJmb28uKlwiLFwiaVwiKSlcbiAqICAgVXRpbHMtPj5VdGlsczogUGFyc2Ugc3RyaW5nIG9yIHVzZSBSZWdFeHAuc291cmNlXG4gKiAgIFV0aWxzLS0+PkFwcDogXCJmb28uKlwiXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXMoanNSZWdleDogUmVnRXhwIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcnhwID0gbmV3IFJlZ0V4cCgvXlxcLyguKylcXC8oXFx3KykkL2cpO1xuICBpZiAodHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaCA9IHJ4cC5leGVjKGpzUmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgWywgcF0gPSBtYXRjaDtcbiAgICAgIGpzUmVnZXggPSBwO1xuICAgIH1cbiAgfVxuICBjb25zdCByZWdleCA9IHR5cGVvZiBqc1JlZ2V4ID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChqc1JlZ2V4KSA6IGpzUmVnZXg7XG5cbiAgY29uc3QgcGF0dGVybiA9IHJlZ2V4LnNvdXJjZTtcblxuICByZXR1cm4gcGF0dGVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0RWFnZXJSZWxhdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4sXG4gIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbik6IHsgbm9uRWFnZXI6IHN0cmluZ1tdOyByZWxhdGlvbnM6IHN0cmluZ1tdIH0ge1xuICBsZXQgaW5zdGFuY2U6IE07XG4gIHRyeSB7XG4gICAgaW5zdGFuY2UgPSBuZXcgbSgpO1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgQ291bGQgbm90IGluc3RhbnRpYXRlIG1vZGVsICR7bS5uYW1lfSBmb3IgZWFnZXIgcmVsYXRpb24gY2FsY3VsYXRpb246ICR7ZX1gXG4gICAgKTtcbiAgfVxuICBjb25zdCByZWxzID0gUmVwb3NpdG9yeS5yZWxhdGlvbnMobSk7XG4gIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHNwbGl0RWFnZXJSZWxhdGlvbnMpO1xuICBjYWNoZVttLm5hbWVdID0gY2FjaGVbbS5uYW1lXSB8fCB1bmRlZmluZWQ7XG4gIGlmIChjYWNoZVttLm5hbWVdKSB7XG4gICAgbG9nLmluZm8oYFJldHVybmluZyBjYWNoZWQgcmVsYXRpb25zIGZvciAke20ubmFtZX1gKTtcbiAgICByZXR1cm4gY2FjaGVbbS5uYW1lXTtcbiAgfVxuICBjb25zdCByZWxhdGlvbnMgPSByZWxzLnJlZHVjZShcbiAgICAoYWNjdW06IHsgcmVsYXRpb25zOiBzdHJpbmdbXTsgbm9uRWFnZXI6IHN0cmluZ1tdIH0sIGF0dHIpID0+IHtcbiAgICAgIGxvZy5pbmZvKGBSZXRyaWV2aW5nIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7YXR0cn0gb24gbW9kZWwgJHttLm5hbWV9YCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTiksXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBhdHRyLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICAhZGVjb3JhdG9ycyB8fFxuICAgICAgICAhZGVjb3JhdG9ycy5kZWNvcmF0b3JzIHx8XG4gICAgICAgICFkZWNvcmF0b3JzLmRlY29yYXRvcnMubGVuZ3RoXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyBkZWNvcmF0b3JzIGZvdW5kIGZvciBwcm9wZXJ0eSAke2F0dHJ9IG9uIG1vZGVsICR7bS5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIGlmIChkZWNvcmF0b3JzLmRlY29yYXRvcnMubGVuZ3RoID4gMSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIGRlY29yYXRvcnMgZm91bmQgZm9yIHByb3BlcnR5ICR7YXR0cn0gb24gbW9kZWwgJHttLm5hbWV9YFxuICAgICAgICApO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBEZWNvcmF0b3JzIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KGRlY29yYXRvcnMuZGVjb3JhdG9ycywgbnVsbCwgMil9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcjogYW55ID0gZGVjb3JhdG9ycy5kZWNvcmF0b3JzWzBdO1xuICAgICAgY29uc3QgZWFnZXIgPSBkZWNvcmF0b3IucHJvcHMucG9wdWxhdGU7XG4gICAgICBsZXQgY2xhenogPSBkZWNvcmF0b3IucHJvcHMuY2xhc3M7XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiKSBjbGF6eiA9IE1vZGVsLmdldChjbGF6eikgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpIGNsYXp6ID0gY2xhenooKTtcbiAgICAgIGlmICghY2xhenopXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBjbGFzcyBmb3IgcHJvcGVydHkgJHthdHRyfSBvbiBtb2RlbCAke20ubmFtZX1gXG4gICAgICAgICk7XG5cbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgUmVsYXRpb24gb24gcHJvcCAke2F0dHJ9IG9mICR7bS5uYW1lfSBmb3VuZDogJHtjbGF6ei5uYW1lfSB3aXRoIGVhZ2VyOiAke2VhZ2VyfWBcbiAgICAgICk7XG5cbiAgICAgIGlmICghZWFnZXIpIHtcbiAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaChhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtLnJlbGF0aW9ucy5wdXNoKGF0dHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWNjdW0ucmVsYXRpb25zLmluY2x1ZGVzKGF0dHIpKSB7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBHZXR0aW5nIHJlbGF0aW9ucyBmb3IgJHtjbGF6ei5uYW1lfSBpbiBwcm9wICR7YXR0cn0gb2YgJHttLm5hbWV9IHdpdGggZWFnZXI6ICR7ZWFnZXJ9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IG5vbkVhZ2VyLCByZWxhdGlvbnMgfSA9IHNwbGl0RWFnZXJSZWxhdGlvbnMoY2xhenosIGNhY2hlKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJlbGF0aW9ucyBmb3IgJHthdHRyfSBvZiAke2NsYXp6Lm5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9ucywgbnVsbCwgMil9YFxuICAgICAgICApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgTm9uIGVhZ2VyIGZvciAke2F0dHJ9IG9mICR7Y2xhenoubmFtZX06ICR7SlNPTi5zdHJpbmdpZnkobm9uRWFnZXIsIG51bGwsIDIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5vbkVhZ2VyLmxlbmd0aCAmJiBhY2N1bS5yZWxhdGlvbnMuaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICBjb25zdCBub25FYWdlclJlbGF0aW9ucyA9IG5vbkVhZ2VyLm1hcCgobmUpID0+IGAke2F0dHJ9LiR7bmV9YCk7XG4gICAgICAgICAgYWNjdW0ubm9uRWFnZXIucHVzaCguLi5ub25FYWdlclJlbGF0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVsYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMubWFwKChuZSkgPT4gYCR7YXR0cn0uJHtuZX1gKTtcbiAgICAgICAgICBhY2N1bS5yZWxhdGlvbnMucHVzaCguLi5yZWxzKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgY2FsY3VsYXRlZCBSZWxhdGlvbnMgZm9yICR7YXR0cn0gb2YgJHtjbGF6ei5uYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnMsIG51bGwsIDIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYGNhbGN1bGF0ZWQgTm9uIGVhZ2VyIGZvciAke2F0dHJ9IG9mICR7Y2xhenoubmFtZX06ICR7SlNPTi5zdHJpbmdpZnkobm9uRWFnZXIsIG51bGwsIDIpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAgeyBub25FYWdlcjogW10sIHJlbGF0aW9uczogW10gfVxuICApO1xuICBjYWNoZVttLm5hbWVdID0gcmVsYXRpb25zO1xuICBMb2dnaW5nLmZvcihzcGxpdEVhZ2VyUmVsYXRpb25zKS5pbmZvKFxuICAgIGBSZWxhdGlvbnMgZm9yICR7bS5uYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnMsIG51bGwsIDIpfWBcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aW9ucztcbn1cbiIsImltcG9ydCB7IENvbHVtbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvQ29sdW1uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0luZGV4TWV0YWRhdGFBcmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW10sXG4gIGluZGV4ZXM/OiBJbmRleE1ldGFkYXRhQXJnc1tdXG4pIHtcbiAgY29uc3QgY29scyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgIChjOiBDb2x1bW5NZXRhZGF0YUFyZ3MpID0+XG4gICAgICBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eVxuICApO1xuXG4gIGNvbnN0IHJlbHMgPSByZWxhdGlvbnMuZmlsdGVyKFxuICAgIChjOiBSZWxhdGlvbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgaWYgKGluZGV4ZXMpIHtcbiAgICBjb25zdCBpbmR4ID0gaW5kZXhlcy5maWx0ZXIoXG4gICAgICAoYzogSW5kZXhNZXRhZGF0YUFyZ3MpID0+XG4gICAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgKGMuY29sdW1ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcGVydHkpXG4gICAgKTtcbiAgICBpbmR4LmZvckVhY2goKGkpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oaSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi4gT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXNcbiAqIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ob3B0aW9uczogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTaW1wbGVDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNwYXRpYWxDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIFNwYXRpYWxDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoV2lkdGhDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbldpdGhXaWR0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoUHJlY2lzaW9uQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwiZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzaW1wbGUtZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzZXRcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlT3JPcHRpb25zPzogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB8ICgodHlwZT86IGFueSkgPT4gRnVuY3Rpb24pXG4gICAgfCBDb2x1bW5UeXBlXG4gICAgfCAoQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9ucyksXG4gIG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zICYgQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBvYmplY3QsIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgdHlwZSA9IDxDb2x1bW5UeXBlPnR5cGVPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gPENvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucztcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIENvbHVtbk9wdGlvbnM7XG5cbiAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgY29uc3QgcmVmbGVjdE1ldGFkYXRhVHlwZSA9XG4gICAgICBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGFcbiAgICAgICAgPyAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gc3BlY2lmeSBIU1RPUkUgdHlwZSBpZiBjb2x1bW4gaXMgSFNUT1JFXG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gXCJoc3RvcmVcIiAmJiAhb3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgb3B0aW9ucy5oc3RvcmVUeXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gT2JqZWN0ID8gXCJvYmplY3RcIiA6IFwic3RyaW5nXCI7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gcmVnaXN0ZXIgYW4gZW1iZWRkZWRcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbWJlZGRlZHMucHVzaCh7XG4gICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgaXNBcnJheTogcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gQXJyYXkgfHwgb3B0aW9ucy5hcnJheSA9PT0gdHJ1ZSxcbiAgICAgICAgcHJlZml4OiBvcHRpb25zLnByZWZpeCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVmaXggOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgdHlwZTogdHlwZU9yT3B0aW9ucyBhcyAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gICAgICB9IGFzIEVtYmVkZGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVnaXN0ZXIgYSByZWd1bGFyIGNvbHVtblxuXG4gICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGNvbHVtbnM6IFtwcm9wZXJ0eU5hbWVdLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIFwicmVndWxhclwiLFxuICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnMsXG4gICAgICAgIG9wdGlvbnMudW5pcXVlID8gbWV0YWRhdGEuaW5kaWNlcyA6IHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZ2VuZXJhdGVkXG4gICAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJ1cGRhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEYXRlQ29sdW1uKG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMgfHwge30sXG4gICAgICBcImNyZWF0ZURhdGVcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG4gIH07XG59XG4iLCJleHBvcnQgY2xhc3MgT2JqZWN0VXRpbHMge1xuICAvKipcbiAgICogQ2hlY2tzIGlmIGdpdmVuIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAgICogV2UgY2Fubm90IHVzZSBpbnN0YW5jZW9mIGJlY2F1c2UgaXQgaGFzIHByb2JsZW1zIHdoZW4gcnVubmluZyBvbiBkaWZmZXJlbnQgY29udGV4dHMuXG4gICAqIEFuZCB3ZSBkb24ndCBzaW1wbHkgdXNlIHR5cGVvZiBiZWNhdXNlIHR5cGVvZiBudWxsID09PSBcIm9iamVjdFwiLlxuICAgKi9cbiAgc3RhdGljIGlzT2JqZWN0KHZhbDogYW55KTogdmFsIGlzIG9iamVjdCB7XG4gICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdFdpdGhOYW1lKHZhbDogYW55KTogdmFsIGlzIG9iamVjdCAmIHsgbmFtZTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiB2YWxbXCJuYW1lXCJdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgc3RhdGljIGFzc2lnbjxULCBVPih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVSwgVj4odGFyZ2V0OiBULCBzb3VyY2UxOiBVLCBzb3VyY2UyOiBWKTogdm9pZDtcblxuICAvKipcbiAgICogQ29weSB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGFcbiAgICogdGFyZ2V0IG9iamVjdC5cbiAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxuICAgKiBAcGFyYW0gc291cmNlMSBUaGUgZmlyc3Qgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTIgVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMyBUaGUgdGhpcmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVSwgViwgVz4oXG4gICAgdGFyZ2V0OiBULFxuICAgIHNvdXJjZTE6IFUsXG4gICAgc291cmNlMjogVixcbiAgICBzb3VyY2UzOiBXXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZXMgT25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBhc3NpZ24odGFyZ2V0OiBvYmplY3QsIC4uLnNvdXJjZXM6IGFueVtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZSkpIHtcbiAgICAgICAgKHRhcmdldCBhcyBhbnkpW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL1xuICAvLyAvKipcbiAgLy8gICogQ29udmVydHMgTWl4ZWRMaXN0PFQ+IHRvIHN0cmljdGx5IGFuIGFycmF5IG9mIGl0cyBUIGl0ZW1zLlxuICAvLyAgKi9cbiAgLy8gc3RhdGljIG1peGVkTGlzdFRvQXJyYXk8VD4obGlzdDogTWl4ZWRMaXN0PFQ+KTogVFtdIHtcbiAgLy8gICBpZiAobGlzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGlzdCA9PT0gXCJvYmplY3RcIikge1xuICAvLyAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3QpLm1hcChcbiAgLy8gICAgICAgKGtleSkgPT4gKGxpc3QgYXMgeyBba2V5OiBzdHJpbmddOiBUIH0pW2tleV1cbiAgLy8gICAgICk7XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHJldHVybiBsaXN0O1xuICAvLyAgIH1cbiAgLy8gfVxufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4sIGV4dHJhY3RGb3JSZWxhdGlvbnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhIGRpcmVjdCByZWxhdGlvbiBiZXR3ZWVuIHR3byBlbnRpdGllcy4gRW50aXR5MSBoYXMgb25seSBvbmUgRW50aXR5Mi5cbiAqIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgRW50aXR5MiBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxhenkgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgcmVsYXRpb25UeXBlOiBcIm9uZS10by1vbmVcIixcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogQSBvbmUtdG8tbWFueSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MixcbiAqIGJ1dCBFbnRpdHkyIGhhcyBvbmx5IG9uZSBFbnRpdHkxLiBFbnRpdHkyIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZiBFbnRpdHkxIG9uIGl0c1xuICogc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBOb3cgdHJ5IHRvIGRldGVybWluZSBpZiBpdCBpcyBhIGxhenkgcmVsYXRpb24uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tbWFueVwiLFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIEEgbWFueS10by1vbmUgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgRW50aXR5MiwgYnV0XG4gKiBFbnRpdHkyIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZlxuICogRW50aXR5MiBvbiBpdHMgc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZT86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBBIG1hbnktdG8tb25lIHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIEVudGl0eTIsIGJ1dFxuICogRW50aXR5MiBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gRW50aXR5MSBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2ZcbiAqIEVudGl0eTIgb24gaXRzIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvT25lPFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gTm93IHRyeSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBsYXp5IHJlbGF0aW9uLlxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zICYmIG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEpIHtcbiAgICAgIC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICBjb25zdCByZWZsZWN0ZWRUeXBlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVmbGVjdGVkVHlwZSAmJlxuICAgICAgICB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIlxuICAgICAgKVxuICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0cmFjdEZvclJlbGF0aW9ucyhvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YS5jb2x1bW5zKVxuICAgICk7XG4gICAgbWV0YS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgcmVsYXRpb25UeXBlOiBcIm1hbnktdG8tb25lXCIsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZWxhdGlvbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsIE9iamVjdFR5cGUgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1JlbGF0aW9uTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcbi8qKlxuICogTWFueS10by1tYW55IGlzIGEgdHlwZSBvZiByZWxhdGlvbnNoaXAgd2hlbiBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLCBhbmQgRW50aXR5MiBjYW4gaGF2ZVxuICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIFRvIGFjaGlldmUgaXQsIHRoaXMgdHlwZSBvZiByZWxhdGlvbiBjcmVhdGVzIGEganVuY3Rpb24gdGFibGUsIHdoZXJlIGl0IHN0b3JhZ2VcbiAqIGVudGl0eTEgYW5kIGVudGl0eTIgaWRzLiBUaGlzIGlzIG93bmVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBNYW55LXRvLW1hbnkgaXMgYSB0eXBlIG9mIHJlbGF0aW9uc2hpcCB3aGVuIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsIGFuZCBFbnRpdHkyIGNhbiBoYXZlXG4gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gVG8gYWNoaWV2ZSBpdCwgdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNyZWF0ZXMgYSBqdW5jdGlvbiB0YWJsZSwgd2hlcmUgaXQgc3RvcmFnZVxuICogZW50aXR5MSBhbmQgZW50aXR5MiBpZHMuIFRoaXMgaXMgb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSksXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIE1hbnktdG8tbWFueSBpcyBhIHR5cGUgb2YgcmVsYXRpb25zaGlwIHdoZW4gRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MiwgYW5kIEVudGl0eTIgY2FuIGhhdmVcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBUbyBhY2hpZXZlIGl0LCB0aGlzIHR5cGUgb2YgcmVsYXRpb24gY3JlYXRlcyBhIGp1bmN0aW9uIHRhYmxlLCB3aGVyZSBpdCBzdG9yYWdlXG4gKiBlbnRpdHkxIGFuZCBlbnRpdHkyIGlkcy4gVGhpcyBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGVPck9wdGlvbnM/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSB8IFJlbGF0aW9uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBsZXQgaW52ZXJzZVNpZGVQcm9wZXJ0eTogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSk7XG4gIGlmIChPYmplY3RVdGlscy5pc09iamVjdChpbnZlcnNlU2lkZU9yT3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0gPFJlbGF0aW9uT3B0aW9ucz5pbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBpbnZlcnNlU2lkZVByb3BlcnR5ID0gaW52ZXJzZVNpZGVPck9wdGlvbnMgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBSZWxhdGlvbk9wdGlvbnM7XG5cbiAgICAvLyBub3cgdHJ5IHRvIGRldGVybWluZSBpdCBpdHMgbGF6eSByZWxhdGlvblxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW1hbnlcIixcbiAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9IGFzIFJlbGF0aW9uTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBvcHRpb25zOiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInV1aWRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInJvd2lkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaWRlbnRpdHlcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3lPck9wdGlvbnM/OlxuICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgIHwgXCJ1dWlkXCJcbiAgICB8IFwicm93aWRcIlxuICAgIHwgXCJpZGVudGl0eVwiXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzpcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IG9wdGlvbnM6IENvbHVtbk9wdGlvbnMgPSB7fTtcbiAgbGV0IHN0cmF0ZWd5OiBcImluY3JlbWVudFwiIHwgXCJ1dWlkXCIgfCBcInJvd2lkXCIgfCBcImlkZW50aXR5XCI7XG4gIGlmIChzdHJhdGVneU9yT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RyYXRlZ3lPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICBzdHJhdGVneSA9IHN0cmF0ZWd5T3JPcHRpb25zIGFzXG4gICAgICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgICAgICB8IFwidXVpZFwiXG4gICAgICAgIHwgXCJyb3dpZFwiXG4gICAgICAgIHwgXCJpZGVudGl0eVwiO1xuXG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KHN0cmF0ZWd5T3JPcHRpb25zKSkge1xuICAgICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBzdHJhdGVneU9yT3B0aW9ucyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgfVxuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QobWF5YmVPcHRpb25zKSkgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBtYXliZU9wdGlvbnMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gaWYgY29sdW1uIHR5cGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0IHRoZW4gZGV0ZXJtaW5lIGl0IGJhc2VkIG9uIGdlbmVyYXRpb24gc3RyYXRlZ3lcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiIHx8IHN0cmF0ZWd5ID09PSBcImlkZW50aXR5XCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gTnVtYmVyO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJ1dWlkXCI7XG4gICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInJvd2lkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJpbnRcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgYW5kIGdlbmVyYXRlZCB0byBjb2x1bW4gb3B0aW9uc1xuICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zLFxuICAgICAgXCJyZWd1bGFyXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICAgIC8vIHJlZ2lzdGVyIGdlbmVyYXRlZCBtZXRhZGF0YSBhcmdzXG4gICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG4gIFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGVzY3JpYmVzIGFsbCBwcmltYXJ5IGtleSBjb2x1bW4ncyBvcHRpb25zLlxuICogSWYgc3BlY2lmaWVkLCB0aGUgbnVsbGFibGUgZmllbGQgbXVzdCBiZSBzZXQgdG8gZmFsc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFByaW1hcnlDb2x1bW5PcHRpb25zID0gQ29sdW1uT3B0aW9ucyAmIHsgbnVsbGFibGU/OiBmYWxzZSB9O1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGU/OiBDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgdHlwZU9yT3B0aW9ucz86IENvbHVtblR5cGUgfCBQcmltYXJ5Q29sdW1uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gU3RyaW5nIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBCb29sZWFuIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBOdW1iZXJcbiAgICApIHtcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zIGFzIENvbHVtblR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCA8UHJpbWFyeUNvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFByaW1hcnlDb2x1bW5PcHRpb25zO1xuXG4gICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgIGNvbnN0IHJlZmxlY3RNZXRhZGF0YVR5cGUgPVxuICAgICAgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhXG4gICAgICAgID8gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUgJiYgcmVmbGVjdE1ldGFkYXRhVHlwZSkgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkgdGhyb3cgbmV3IENvbHVtblR5cGVVbmRlZmluZWRFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBjaGVjayBpZiBjb2x1bW4gaXMgbm90IG51bGxhYmxlLCBiZWNhdXNlIHdlIGNhbm5vdCBhbGxvdyBhIHByaW1hcnkga2V5IHRvIGJlIG51bGxhYmxlXG4gICAgaWYgKG9wdGlvbnMubnVsbGFibGUpXG4gICAgICB0aHJvdyBuZXcgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgdG8gY29sdW1uIG9wdGlvbnNcbiAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIFwicmVndWxhclwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcblxuICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIHN0cmF0ZWd5OlxuICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgOiBcImluY3JlbWVudFwiLFxuICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IEVudGl0eU9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZU1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvVGFibGVNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkob3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkobmFtZT86IHN0cmluZywgb3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkoXG4gIG5hbWVPck9wdGlvbnM/OiBzdHJpbmcgfCBFbnRpdHlPcHRpb25zLFxuICBtYXliZU9wdGlvbnM/OiBFbnRpdHlPcHRpb25zXG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIChPYmplY3RVdGlscy5pc09iamVjdChuYW1lT3JPcHRpb25zKVxuICAgICAgPyAobmFtZU9yT3B0aW9ucyBhcyBFbnRpdHlPcHRpb25zKVxuICAgICAgOiBtYXliZU9wdGlvbnMpIHx8IHt9O1xuICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyBuYW1lT3JPcHRpb25zIDogb3B0aW9ucy5uYW1lO1xuXG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgY29uc3QgdGFibGVzID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRhYmxlcztcbiAgICB0YWJsZXMucHVzaCh7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB0eXBlOiBcInJlZ3VsYXJcIixcbiAgICAgIG9yZGVyQnk6IG9wdGlvbnMub3JkZXJCeSA/IG9wdGlvbnMub3JkZXJCeSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuZ2luZTogb3B0aW9ucy5lbmdpbmUgPyBvcHRpb25zLmVuZ2luZSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFiYXNlOiBvcHRpb25zLmRhdGFiYXNlID8gb3B0aW9ucy5kYXRhYmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHNjaGVtYTogb3B0aW9ucy5zY2hlbWEgPyBvcHRpb25zLnNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgIHN5bmNocm9uaXplOiBvcHRpb25zLnN5bmNocm9uaXplLFxuICAgICAgd2l0aG91dFJvd2lkOiBvcHRpb25zLndpdGhvdXRSb3dpZCxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/IG9wdGlvbnMuY29tbWVudCA6IHVuZGVmaW5lZCxcbiAgICB9IGFzIFRhYmxlTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbEtleXMsXG4gIFZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuZXhwb3J0IGNvbnN0IEJhc2VLZXkgPSBcImRlY2FmXCI7XG5cbmZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbiAgc3BsaXR0ZXIgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogdm9pZCB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQ6IFJlY29yZDxhbnksIGFueT4gPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmICghKGtleSBpbiBjdXJyZW50KSkge1xuICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICBjdXJyZW50W2tleXNba2V5cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn1cblxuZXhwb3J0IHR5cGUgTW9kZWxNZXRhZGF0YSA9IHtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdmFsaWRhdGlvbj86IFJlY29yZDxzdHJpbmcsIGFueVtdPjtcbiAgcmVsYXRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZ2VuZXJhdGVkPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcGs6IHN0cmluZztcbiAgZmtzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgaW5kZXhlcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICBwcml2YXRlIHN0YXRpYyBfbWV0YWRhdGE6IFJlY29yZDxzeW1ib2wsIE1vZGVsTWV0YWRhdGE+ID0ge307XG5cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIHN0YXRpYyBiYXNlS2V5ID0gQmFzZUtleTtcbiAgc3RhdGljIG1pcnJvcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldFByb3BlcnRpZXMobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5wcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHN0YXRpYyBwayhtb2RlbDogQ29uc3RydWN0b3I8YW55Pikge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldChtb2RlbCk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhLnBrKVswXTtcbiAgfVxuXG4gIHN0YXRpYyB0eXBlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlcyhtb2RlbCwgcHJvcClbMF07XG4gIH1cblxuICBzdGF0aWMgdHlwZXMobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZykge1xuICAgIGxldCBkZXNpZ25UeXBlOiBhbnkgPSB0aGlzLmdldChtb2RlbCwgYHByb3BlcnRpZXMuJHtwcm9wfWApO1xuICAgIGlmICghZGVzaWduVHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtwcm9wfSBub3QgZm91bmQgaW4gJHttb2RlbC5uYW1lfWApO1xuICAgIGRlc2lnblR5cGUgPSBbZGVzaWduVHlwZV07XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkge1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgICBpZiAobWV0YS52YWxpZGF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBtZXRhLnZhbGlkYXRpb247XG4gICAgICAgIGlmICh2YWxpZGF0aW9uW1ZhbGlkYXRpb25LZXlzLlRZUEVdKVxuICAgICAgICAgIGRlc2lnblR5cGUgPSBkZXNpZ25UeXBlLmNvbmNhdCh2YWxpZGF0aW9uW1ZhbGlkYXRpb25LZXlzLlRZUEVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc2lnblR5cGUuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Pik6IE1vZGVsTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIGtleTogc3RyaW5nKTogYW55O1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgcmV0dXJuIGdldFZhbHVlQnlTcGxpdHRlcih0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLCBrZXksIHRoaXMuc3BsaXR0ZXIpO1xuICB9XG5cbiAgc3RhdGljIHNldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSA9IHt9IGFzIGFueTtcbiAgICBpZiAoXG4gICAgICB0aGlzLm1pcnJvciAmJlxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgdGhpcy5iYXNlS2V5KVxuICAgICkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCB0aGlzLmJhc2VLZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdmFsdWUsIHRoaXMuc3BsaXR0ZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFzc2lnbihcbiAgICBtb2RlbDogb2JqZWN0LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm9wPzogYW55LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIE1ldGFkYXRhLnNldChtb2RlbCBhcyBhbnksIGtleSwgdmFsdWUpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcm9wZXJ0eShtb2RlbDogb2JqZWN0LCBwcm9wOiBhbnkpIHtcbiAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShNb2RlbEtleXMuVFlQRSwgbW9kZWwsIHByb3ApO1xuICAgIHJldHVybiBhc3NpZ24oYHByb3BlcnR5LiR7cHJvcH1gLCBkZXNpZ25UeXBlKShtb2RlbCwgcHJvcCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDYXNjYWRlLFxuICBDYXNjYWRlTWV0YWRhdGEsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgZmluYWwsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG9zaXRvcnksXG4gIFNlcXVlbmNlLFxuICBzZXF1ZW5jZU5hbWVGb3JNb2RlbCxcbiAgdHlwZSBTZXF1ZW5jZU9wdGlvbnMsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHJlc2VydmVkQXR0cmlidXRlcywgVHlwZU9STUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTIGFzIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIHJlYWRvbmx5LFxuICBVcGRhdGVWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBsaXN0LFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVHlwZU1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STVN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyBUeXBlT1JNU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhlcyB9IGZyb20gXCIuL2luZGV4ZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNVGFibGVTcGVjIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5LCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUmVwb3NpdG9yeSB9IGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBUeXBlT1JNRGlzcGF0Y2ggfSBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmltcG9ydCB7IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcywgc3BsaXRFYWdlclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBGaW5kT25lT3B0aW9ucyxcbiAgSW4sXG4gIEluc2VydFJlc3VsdCxcbiAgUmVsYXRpb25PcHRpb25zLFxuICBKb2luQ29sdW1uLFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG4gIFZlcnNpb25Db2x1bW4sXG4gIEpvaW5UYWJsZSxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uT3B0aW9ucyxcbiAgSW5kZXgsXG4gIEpvaW5Db2x1bW5PcHRpb25zLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NvbHVtblwiO1xuaW1wb3J0IHsgVXBkYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBDcmVhdGVEYXRlQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0NyZWF0ZURhdGVDb2x1bW5cIjtcbmltcG9ydCB7IE9uZVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvT25lXCI7XG5pbXBvcnQgeyBPbmVUb01hbnkgfSBmcm9tIFwiLi9vdmVycmlkZXMvT25lVG9NYW55XCI7XG5pbXBvcnQgeyBNYW55VG9PbmUgfSBmcm9tIFwiLi9vdmVycmlkZXMvTWFueVRvT25lXCI7XG5pbXBvcnQgeyBNYW55VG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb01hbnlcIjtcbmltcG9ydCB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUdlbmVyYXRlZENvbHVtblwiO1xuaW1wb3J0IHsgUHJpbWFyeUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvRW50aXR5XCI7XG5pbXBvcnQgeyBhc3NpZ24sIE1ldGFkYXRhLCBwcm9wZXJ0eSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgVHlwZU9STVJlcG9zaXRvcnk8TT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PFR5cGVPUk1GbGFncz4sXG4gIGRhdGE6IGFueSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwidXNlclwiKTtcbiAgICBtb2RlbFtrZXldID0gdXNlciBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBUeXBlT1JNLWJhY2tlZCBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgRGVjYWYudHMgQWRhcHRlciBvdmVyIGEgVHlwZU9STSBEYXRhU291cmNlLCBwcm92aWRpbmcgQ1JVRCBvcGVyYXRpb25zLCBxdWVyeS9zdGF0ZW1lbnQgZmFjdG9yaWVzLCBzZXF1ZW5jZSBtYW5hZ2VtZW50LCBlcnJvciBwYXJzaW5nLCBhbmQgZGVjb3JhdGlvbiBoZWxwZXJzLlxuICogQHRlbXBsYXRlIFkgVGhlIG5hdGl2ZSBjb25maWd1cmF0aW9uIHR5cGUgKFR5cGVPUk0gRGF0YVNvdXJjZU9wdGlvbnMpLlxuICogQHRlbXBsYXRlIEYgVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIFRoZSBjb250ZXh0IHR5cGUuXG4gKiBAcGFyYW0ge0RhdGFTb3VyY2VPcHRpb25zfSBzY29wZSBUaGUgRGF0YVNvdXJjZSBvcHRpb25zIGZvciB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIFRoZSBmbGF2b3VyIG9mIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWRhcHRlciA9IG5ldyBUeXBlT1JNQWRhcHRlcih7IHR5cGU6ICdwb3N0Z3JlcycsIC8qIC4uLiAqXFwvIH0pO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKiBjb25zdCByZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnQWxpY2UnIH0pKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgVHlwZU9STSBEYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5BZGFwdGVyOiBuZXcgVHlwZU9STUFkYXB0ZXIob3B0cylcbiAqICAgQWRhcHRlci0+PkRTOiBpbml0aWFsaXplKClcbiAqICAgQXBwLT4+QWRhcHRlcjogcmVwb3NpdG9yeSgpXG4gKiAgIEFkYXB0ZXItLT4+QXBwOiBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlL2NyZWF0ZS9yZXZlcnRcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBNb2RlbFxuICogICBSZXBvLS0+PkFwcDogTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgRGF0YVNvdXJjZU9wdGlvbnMsXG4gIFR5cGVPUk1RdWVyeSxcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBwcml2YXRlIF9kYXRhU291cmNlPzogRGF0YVNvdXJjZTtcblxuICBnZXQgZGF0YVNvdXJjZSgpOiBEYXRhU291cmNlIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKHRoaXMuZmxhdm91cik7XG4gICAgICB0aGlzLl9kYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5uYXRpdmUsIHtcbiAgICAgICAgICBlbnRpdGllczogbW9kZWxzLm1hcCgoYykgPT4gY1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjXSksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcbiAgfVxuICAvLyBwcm90ZWN0ZWQgZGF0YVNvdVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFTb3VyY2VPcHRpb25zLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKG9wdGlvbnMsIFR5cGVPUk1GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPFR5cGVPUk1GbGFncz5cbiAgKTogUHJvbWlzZTxUeXBlT1JNRmxhZ3M+IHtcbiAgICBjb25zdCBmID0gYXdhaXQgc3VwZXIuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgZmxhZ3MpO1xuICAgIGNvbnN0IG5ld09iajogYW55ID0ge1xuICAgICAgdXNlcjogKGF3YWl0IFR5cGVPUk1BZGFwdGVyLmdldEN1cnJlbnRVc2VyKHRoaXMuZGF0YVNvdXJjZSkpIGFzIHN0cmluZyxcbiAgICB9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoKTtcblxuICAgIGNvbnN0IGV4Y2VwdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobSkuaWQ7XG4gICAgICBleGNlcHRpb25zLnB1c2gocGsgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8XG4gICAgICBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgKSB7XG4gICAgICBjb25zdCBkZWNzID0gT2JqZWN0LmtleXMobSkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55Piwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICAgIG0sXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgKGRlYzogYW55KSA9PlxuICAgICAgICAgICAgZGVjLmtleSA9PT0gREJLZXlzLlRJTUVTVEFNUCAmJlxuICAgICAgICAgICAgZGVjLnByb3BzLm9wZXJhdGlvbi5pbmRleE9mKG9wZXJhdGlvbikgIT09IC0xXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZWMpIHtcbiAgICAgICAgICBhY2N1bVtrZXldID0gZGVjLnByb3BzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgZXhjZXB0aW9ucy5wdXNoKC4uLk9iamVjdC5rZXlzKGRlY3MpKTtcbiAgICB9XG5cbiAgICBuZXdPYmouaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzID0gKFxuICAgICAgZi5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgPyBmLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA6IFtdXG4gICAgKS5jb25jYXQoLi4uZXhjZXB0aW9ucyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZiwgbmV3T2JqKSBhcyBUeXBlT1JNRmxhZ3M7XG4gIH1cblxuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGlzcGF0Y2goKTogVHlwZU9STURpc3BhdGNoIHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1EaXNwYXRjaCgpO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFR5cGVPUk1SZXBvc2l0b3J5PE0+PiB7XG4gICAgcmV0dXJuIFR5cGVPUk1SZXBvc2l0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFBvc3RncmVzIHN0YXRlbWVudCBmb3IgcXVlcnlpbmdcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFBvc3RncmVzU3RhdGVtZW50IGluc3RhbmNlIGZvciBidWlsZGluZyBxdWVyaWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7VHlwZU9STVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBQb3N0Z3Jlc1N0YXRlbWVudCBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogVHlwZU9STVN0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1TdGF0ZW1lbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTCBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUG9zdGdyZVNRTFNlcXVlbmNlIGluc3RhbmNlIGZvciBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBTZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgVHlwZU9STVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlciBieSBjcmVhdGluZyBpbmRleGVzIGZvciBhbGwgbWFuYWdlZCBtb2RlbHNcbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGRhdGFiYXNlIGluZGV4ZXMgZm9yIGFsbCBtb2RlbHMgbWFuYWdlZCBieSB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkcyA9IHRoaXMuZGF0YVNvdXJjZTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHMuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgbG9nLnZlcmJvc2UoYCR7dGhpcy5mbGF2b3VyfSBhZGFwdGVyIGluaXRpYWxpemVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgaW5kZXhlcyBmb3IgdGhlIGdpdmVuIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBkYXRhYmFzZSBpbmRleGVzIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Li4uQ29uc3RydWN0b3I8TT59IG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGluZGV4ZXMgZm9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGluZGV4ZXMgYXJlIGNyZWF0ZWRcbiAgICovXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBhc3luYyBpbmRleDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIC4uLm1vZGVsczogQ29uc3RydWN0b3I8TT5bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleGVzOiBUeXBlT1JNUXVlcnlbXSA9IGdlbmVyYXRlSW5kZXhlcyhtb2RlbHMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShcIkJFR0lOXCIpO1xuXG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KGluZGV4LnF1ZXJ5LCBpbmRleC52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoXCJDT01NSVRcIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KFwiUk9MTEJBQ0tcIik7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBTUUwgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBleGVjdXRlIHJhdyBTUUwgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcSAtIFRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihxOiBUeXBlT1JNUXVlcnkpOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yYXcpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UuaW5pdGlhbGl6ZSgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcXVlcnksIHZhbHVlcyB9ID0gcTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYGV4ZWN1dGluZyBxdWVyeTogJHsocXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikuZ2V0U3FsKCl9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KHF1ZXJ5LCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIFI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTSxcbiAgICBjaGlsZCA9IGZhbHNlXG4gICk6IHtcbiAgICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgaWQ6IHN0cmluZztcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHN1cGVyLnByZXBhcmUobW9kZWwsIHBrKTtcblxuICAgIHByZXBhcmVkLnJlY29yZCA9IE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBIHx8IHRoaXMuaXNSZXNlcnZlZChrZXkpKVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKE1vZGVsLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnByZXBhcmUodmFsdWUsIGZpbmRQcmltYXJ5S2V5KHZhbHVlKS5pZCwgdHJ1ZSkucmVjb3JkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy9kbyBub3RoaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KFxuICAgICAgbW9kZWwuY29uc3RydWN0b3IubmFtZVxuICAgICk7XG4gICAgaWYgKCFjb25zdHIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gbm90IGZvdW5kIGluIHJlZ2lzdHJ5YFxuICAgICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBjaGlsZFxuICAgICAgPyBuZXcgKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0oKVxuICAgICAgOiBuZXcgY29uc3RyKCk7XG4gICAgaWYgKGNoaWxkKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKGNvbnN0ciBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNvbnN0cl0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIE9iamVjdC5lbnRyaWVzKHByZXBhcmVkLnJlY29yZCkuZm9yRWFjaChcbiAgICAgIChba2V5LCB2YWxdKSA9PiAocmVzdWx0W2tleSBhcyBrZXlvZiB0eXBlb2YgcmVzdWx0XSA9IHZhbClcbiAgICApO1xuICAgIHByZXBhcmVkLnJlY29yZCA9IHJlc3VsdDtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBNIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZXZlcnQpO1xuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBvYmopXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke3R5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IGNsYXp6IDogY2xhenoubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIChvYmogYXMgTSlba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBhIG5ldyByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICBpZiAodHlwZW9mIGlkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlcG8uZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgW3BrXTogaWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBgUmVjb3JkIGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7UmVwb3NpdG9yeS50YWJsZShtKX0gd2l0aCBpZDogJHtpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHJlYWQgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gcHJpbWFyeSBrZXkgY29sdW1cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlYWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCB7IG5vbkVhZ2VyLCByZWxhdGlvbnMgfSA9IHNwbGl0RWFnZXJSZWxhdGlvbnMobSk7XG5cbiAgICAgIGNvbnN0IHE6IEZpbmRPbmVPcHRpb25zID0ge1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIFtwa106IGlkLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGlvbnM6IHJlbGF0aW9ucyxcbiAgICAgICAgbG9hZFJlbGF0aW9uSWRzOiB7XG4gICAgICAgICAgcmVsYXRpb25zOiBub25FYWdlcixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXN1bHQgPSAoYXdhaXQgcmVwby5maW5kT25lT3JGYWlsKHEpKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byB1cGRhdGUgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMucmVhZCh0YWJsZU5hbWUsIGlkLCBwayk7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVsZXRlIGEgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQodGFibGVOYW1lLCBpZCwgcGspO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBJbnNlcnRSZXN1bHQgPSBhd2FpdCByZXBvLmluc2VydChtb2RlbCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHJlc3VsdC5pZGVudGlmaWVycy5tYXAoKGlkKSA9PiBpZC5pZCksXG4gICAgICAgIFwiaWRcIlxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWQubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIHJldHVybiByZXBvLmZpbmRCeSh7IFtwa106IEluKGlkKSB9KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbW9kZWwpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGF3YWl0IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgbVtwa10sIG0sIHBrLCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm4gW107XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwodGFibGVOYW1lLCBpZHMsIHBrKTtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkcyk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBhbmQgY29udmVydHMgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICovXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gVHlwZU9STUFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBpbiBQb3N0Z3JlU1FMXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhdHRyLm1hdGNoKHJlc2VydmVkQXR0cmlidXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW4gZXJyb3IgYW5kIGNvbnZlcnQgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXMgYmFzZWQgb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VFcnJvclxuICAgKiAgIHBhcnRpY2lwYW50IEVycm9yVHlwZXNcbiAgICpcbiAgICogICBDYWxsZXItPj5wYXJzZUVycm9yOiBlcnIsIHJlYXNvblxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBDaGVjayBpZiBlcnIgaXMgYWxyZWFkeSBhIEJhc2VFcnJvclxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBwYXJzZUVycm9yLS0+PkNhbGxlcjogcmV0dXJuIGVyclxuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBmcm9tIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvZGUgbWF0Y2hlcyBcImR1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHNcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29kZSBtYXRjaGVzIFwiZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgY29kZSBwcm9wZXJ0eVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBhbmQgcmVhc29uXG4gICAqICAgZWxzZVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFVzZSBlcnIubWVzc2FnZSBhcyBjb2RlXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFN3aXRjaCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVcbiAgICogICBhbHQgY29kZSBpcyAyMzUwNSAodW5pcXVlX3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyAyMzUwMyAoZm9yZWlnbl9rZXlfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDAxICh1bmRlZmluZWRfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDI3MDMgKHVuZGVmaW5lZF9jb2x1bW4pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDcgKGR1cGxpY2F0ZV90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAxNiAoaW52YWxpZF90YWJsZV9kZWZpbml0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbmRleEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgIGVsc2VcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgY29uc3QgY29kZTogc3RyaW5nID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuXG4gICAgaWYgKGNvZGUubWF0Y2goL2R1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHMvZykpXG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgaWYgKGNvZGUubWF0Y2goL2RvZXMgbm90IGV4aXN0fG5vdCBmb3VuZHxDb3VsZCBub3QgZmluZC9nKSlcbiAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihjb2RlKTtcblxuICAgIC8vIFBvc3RncmVTUUwgZXJyb3IgY29kZXM6IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9lcnJjb2Rlcy1hcHBlbmRpeC5odG1sXG4gICAgc3dpdGNoIChjb2RlLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIEludGVncml0eSBjb25zdHJhaW50IHZpb2xhdGlvbnNcbiAgICAgIGNhc2UgXCIyMzUwNVwiOiAvLyB1bmlxdWVfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiMjM1MDNcIjogLy8gZm9yZWlnbl9rZXlfdmlvbGF0aW9uXG4gICAgICBjYXNlIFwiNDJQMDdcIjogLy8gZHVwbGljYXRlX3RhYmxlXG4gICAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZCBlcnJvcnNcbiAgICAgIGNhc2UgXCI0MlAwMVwiOiAvLyB1bmRlZmluZWRfdGFibGVcbiAgICAgIGNhc2UgXCI0MjcwM1wiOiAvLyB1bmRlZmluZWRfY29sdW1uXG4gICAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24gYXMgc3RyaW5nKTtcblxuICAgICAgLy8gSW52YWxpZCBvYmplY3QgZGVmaW5pdGlvblxuICAgICAgY2FzZSBcIjQyUDE2XCI6IC8vIGludmFsaWRfdGFibGVfZGVmaW5pdGlvblxuICAgICAgICByZXR1cm4gbmV3IEluZGV4RXJyb3IoZXJyKTtcblxuICAgICAgLy8gQ29ubmVjdGlvbiBlcnJvcnNcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChjb2RlLnRvU3RyaW5nKCkubWF0Y2goL0VDT05OUkVGVVNFRC9nKSlcbiAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29ubmVjdChjb25maWc6IERhdGFTb3VyY2VPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gICAgY29uc3QgY29uID0gbmV3IERhdGFTb3VyY2UoY29uZmlnKTtcbiAgICBpZiAoIWNvbi5pc0luaXRpYWxpemVkKSBhd2FpdCBjb24uaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiBjb247XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZURhdGFiYXNlKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTm90aWZ5RnVuY3Rpb24oXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVOb3RpZnlGdW5jdGlvbik7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKVxuUkVUVVJOUyB0cmlnZ2VyIEFTICQkXG5CRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KFxuICAgICAgICAndGFibGVfY2hhbmdlcycsXG4gICAgICAgIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAgICdhY3Rpb24nLCBUR19PUCxcbiAgICAgICAgICAgICdkYXRhJywgcm93X3RvX2pzb24oTkVXKSxcbiAgICAgICAgICAgICdvbGRfZGF0YScsIHJvd190b19qc29uKE9MRClcbiAgICAgICAgKTo6dGV4dFxuICAgICk7XG4gICAgUkVUVVJOIE5FVztcbkVORDtcbiQkIExBTkdVQUdFIHBscGdzcWwgU0VDVVJJVFkgREVGSU5FUlxuO2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBPV05FUiBUTyAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBcbiAgICAgICAgICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKSBUTyBwdWJsaWM7XG4gICAgICAgIGApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VyKSBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERTtgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3N3b3JkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYENSRUFURSBVU0VSICR7dXNlcn0gV0lUSCBQQVNTV09SRCAnJHtwYXNzd29yZH0nYCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDT05ORUNUIE9OIERBVEFCQVNFICR7ZGJOYW1lfSBUTyAke3VzZXJ9YCk7XG5cbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ1JFQVRFIE9OIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFRBQkxFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBTRVFVRU5DRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgYWRtaW46IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRUFTU0lHTiBPV05FRCBCWSAke3VzZXJ9IFRPICR7YWRtaW59YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBSRVZPS0UgQUxMIE9OIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBSRVZPS0UgQUxMIFBSSVZJTEVHRVMgT04gQUxMIEZVTkNUSU9OUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFRBQkxFUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBTRVFVRU5DRVMgRlJPTSAke3VzZXJ9O2BcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIEZVTkNUSU9OUyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIE9XTkVEIEJZICR7dXNlcn0gQ0FTQ0FERWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBEUk9QIFVTRVIgSUYgRVhJU1RTIFwiJHt1c2VyfVwiYCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAgaXNGayA9IGZhbHNlXG4gICkge1xuICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJURVhUIFBSSU1BUlkgS0VZXCIgOiBpc0ZrID8gXCJURVhUXCIgOiBcIlZBUkNIQVJcIjtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlNFUklBTCBQUklNQVJZIEtFWVwiIDogXCJJTlRFR0VSXCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJCT09MRUFOXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJUSU1FU1RBTVBcIjtcbiAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIkJJR0lOVCBQUklNQVJZIEtFWVwiIDogXCJCSUdJTlRcIjtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBjb25zdCBtbSA9IG5ldyBtKCk7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gICAgICAgICAgICBtbSxcbiAgICAgICAgICAgIGZpbmRQcmltYXJ5S2V5KG1tKS5pZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGVsOiBtLFxuICAgICAgICAgICAgcGtUeXBlOiB0eXBlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBWYWxpZGF0b3JPcHRpb25zXG4gICkge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEOlxuICAgICAgICByZXR1cm4gXCJOT1QgTlVMTFwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIOlxuICAgICAgICBpZiAoaXNQayB8fCAhb3B0aW9ucyB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgkeyhvcHRpb25zIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9taW5fbGVuZ3RoX2NoZWNrIENIRUNLIChMRU5HVEgoJHtwcm9wfSkgPj0gJHsob3B0aW9ucyBhcyBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFUVEVSTjpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVVJMOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5FTUFJTDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fcGF0dGVybl9jaGVjayBDSEVDSyAoJHtwcm9wfSB+ICcke2NvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcygob3B0aW9ucyBhcyBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gYXMgc3RyaW5nKX0nKWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkRBVEU6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NSU46XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA+PSAkeyhvcHRpb25zIGFzIE1pblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9IDw9ICR7KG9wdGlvbnMgYXMgTWF4VmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUEFTU1dPUkQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgIHBrOiBzdHJpbmcsXG4gICAga2V5OiBQZXJzaXN0ZW5jZUtleXMsXG4gICAgb3B0aW9uczogUmVsYXRpb25zTWV0YWRhdGFcbiAgKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjbGF6eik7XG4gICAgY29uc3QgeyBjYXNjYWRlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhc2NhZGVTdHIgPSBgJHtjYXNjYWRlLnVwZGF0ZSA/IFwiIE9OIFVQREFURSBDQVNDQURFXCIgOiBcIlwifSR7Y2FzY2FkZS5kZWxldGUgPyBcIiBPTiBERUxFVEUgQ0FTQ0FERVwiIDogXCJcIn1gO1xuICAgIHN3aXRjaCAoYHJlbGF0aW9ucyR7a2V5fWApIHtcbiAgICAgIGNhc2UgUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkU6XG4gICAgICAgIHJldHVybiBgRk9SRUlHTiBLRVkgKCR7cHJvcH0pIFJFRkVSRU5DRVMgJHt0YWJsZU5hbWV9KCR7cGt9KSR7Y2FzY2FkZVN0cn1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdGlvbjogJHtrZXl9YCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVRhYmxlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPiA9IHt9O1xuICAgIGNvbnN0IG0gPSBuZXcgbW9kZWwoe30pO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGNvbnN0IHsgaWQgfSA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuXG4gICAgbGV0IGlzUGs6IGJvb2xlYW4sIGNvbHVtbjogc3RyaW5nO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtKSBhcyAoa2V5b2YgTSlbXTtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KVtwcm9wXSA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgIHByb3AudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICBwcm9wID09PSBcImNvbnN0cnVjdG9yXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaXNQayA9IHByb3AgPT09IGlkO1xuICAgICAgY29sdW1uID0gUmVwb3NpdG9yeS5jb2x1bW4obSwgcHJvcC50b1N0cmluZygpKTtcblxuICAgICAgY29uc3QgYWxsRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkZWNvcmF0b3JEYXRhID0gYWxsRGVjcy5kZWNvcmF0b3JzLnJlZHVjZShcbiAgICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBlbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZWw7XG4gICAgICAgICAgaWYgKGtleSA9PT0gTW9kZWxLZXlzLlRZUEUgJiYgIWFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICBhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tVHlwZXM6IFtwcm9wcy5uYW1lIGFzIHN0cmluZ10sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiZGVmaW5lcyB0aGUgYWNjZXB0ZWQgdHlwZXMgZm9yIHRoZSBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGNhbiBvbmx5IHN1cHBvcnQgYmFzaXMgY3R5cGVzIGF0IHRoaXMgdGltZVxuICAgICAgICAgICAgYWNjdW1ba2V5XSA9IHByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBkYkRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgUmVwb3NpdG9yeS5rZXkoXCJyZWxhdGlvbnNcIiksXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IHR5cGVEYXRhOiBUeXBlTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRDbGFzczogQ29uc3RydWN0b3I8TW9kZWw+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkUGs6IGFueTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRlY29yYXRvckRhdGEpLmxlbmd0aCkge1xuICAgICAgICB0eXBlRGF0YSA9IGRlY29yYXRvckRhdGFbVmFsaWRhdGlvbktleXMuVFlQRV0gYXMgVHlwZU1ldGFkYXRhO1xuXG4gICAgICAgIGlmICghdHlwZURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZFR5cGU6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIHR5cGVvZiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55W10pWzBdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSgpXG4gICAgICAgICAgICAgIDogKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0sXG4gICAgICAgICAgICBpc1BrXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkVHlwZSA9IHsgbW9kZWw6IHBhcnNlZFR5cGUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZVN0cjpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgcGFyc2VkVHlwZS5tb2RlbCBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHR5cGVTdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlU3RyKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codHlwZVN0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgLy8gY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBQb3N0Z3Jlc1RhYmxlU3BlYz4gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKHBvb2wsIHR5cGVTdHIpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGlsZENsYXNzID0gcGFyc2VkVHlwZS5tb2RlbCBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgICAgICAgICBjb25zdCBtID0gbmV3IGNoaWxkQ2xhc3MoKTtcbiAgICAgICAgICAgIGNoaWxkUGsgPSBmaW5kUHJpbWFyeUtleShtKTtcbiAgICAgICAgICAgIHR5cGVTdHIgPSB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICAgIHBhcnNlZFR5cGUucGtUeXBlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGNsaWVudCwgY2hpbGRDbGFzcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvbmZsaWN0RXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cCA9IEFycmF5LmlzQXJyYXkodHlwZURhdGEuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgPyB0eXBlRGF0YS5jdXN0b21UeXBlc1swXVxuICAgICAgICAgIDogdHlwZURhdGEuY3VzdG9tVHlwZXM7XG4gICAgICAgIHRwID0gdHlwZW9mIHRwID09PSBcImZ1bmN0aW9uXCIgJiYgIXRwLm5hbWUgPyB0cCgpIDogdHA7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25TdHIgPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICBpc1BrLFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gICAgICAgICAgKGRlY29yYXRvckRhdGFbXG4gICAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXG4gICAgICAgICAgXSBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKSB8fCB7XG4gICAgICAgICAgICBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF06IDI1NSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcSA9IGAke2NvbHVtbn0gJHt0eXBlU3RyfSR7dmFsaWRhdGlvblN0cn1gO1xuXG4gICAgICAgIGlmIChpc1BrKSB7XG4gICAgICAgICAgcXVlcnkudW5zaGlmdChxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeS5wdXNoKHEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdG9yRGF0YSkuZmlsdGVyKFxuICAgICAgICAgIChba10pID0+XG4gICAgICAgICAgICAhW1ZhbGlkYXRpb25LZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdLmluY2x1ZGVzKGsgYXMgYW55KVxuICAgICAgICApKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHRwIGFzIGFueSxcbiAgICAgICAgICAgIGlzUGssXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkNPTlNUUkFJTlRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8gaWdub3JlIGZvciBub3cuIHRoaXMgbGVhdmVzIGZvcmVpZ24ga2V5cyBvdXRcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1iaW5hcnktZXhwcmVzc2lvblxuICAgICAgaWYgKGZhbHNlIHx8IChkYkRlY3MgJiYgZGJEZWNzLmRlY29yYXRvcnMubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIXR5cGVEYXRhKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbmApO1xuICAgICAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkYkRlY3MuZGVjb3JhdG9ycykge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjb3JhdG9yO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgYXMgQ29uc3RydWN0b3I8TW9kZWw+LFxuICAgICAgICAgICAgY2hpbGRQay5pZCxcbiAgICAgICAgICAgIGtleSBhcyBQZXJzaXN0ZW5jZUtleXMsXG4gICAgICAgICAgICBwcm9wcyBhcyB1bmtub3duIGFzIFJlbGF0aW9uc01ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiRk9SRUlHTlwiKSkge1xuICAgICAgICAgICAgZm9yZWlnbktleXMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHJlbGF0aW9uOiAke2tleX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3Byb3AudG9TdHJpbmcoKV0gPSB7XG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5qb2luKFwiIFwiKSxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgcHJpbWFyeUtleTogaXNQayxcbiAgICAgICAgY29uc3RyYWludHM6IGNvbnN0cmFpbnRzLFxuICAgICAgICBmb3JlaWduS2V5czogZm9yZWlnbktleXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KTtcbiAgICBjb25zdCBxdWVyeSA9IHZhbHVlcy5tYXAoKHIpID0+IHIucXVlcnkpLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuY29uc3RyYWludHMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5jb25zdHJhaW50cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBmb3JlaWduS2V5cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmZvcmVpZ25LZXlzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuZm9yZWlnbktleXMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgdmFscyA9IFtxdWVyeSwgY29uc3RyYWludHNdO1xuICAgIGlmIChmb3JlaWduS2V5cykge1xuICAgICAgdmFscy5wdXNoKGZvcmVpZ25LZXlzKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoJHt2YWxzLmZpbHRlcigodikgPT4gISF2KS5qb2luKFwiLFxcblwiKX0pYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUUklHR0VSIG5vdGlmeV9jaGFuZ2VzXyR7dGFibGVOYW1lfVxuQUZURVIgSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUgT04gJHt0YWJsZU5hbWV9XG4gICAgRk9SIEVBQ0ggUk9XXG4gICAgRVhFQ1VURSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpO2BcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGNsaWVudDogRGF0YVNvdXJjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgU0VMRUNUIENVUlJFTlRfVVNFUjtgO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgcmV0dXJuIHJlc3VsdFswXS5jdXJyZW50X3VzZXI7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcblxuICAgIC8vIEB0YWJsZSgpID0+IEBFbnRpdHkoKVxuICAgIGNvbnN0IHRhYmxlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0YWJsZUtleSlcbiAgICAgIC5leHRlbmQoKG9yaWdpbmFsOiBhbnkpID0+XG4gICAgICAgIEVudGl0eSgpKG9yaWdpbmFsW01vZGVsS2V5cy5BTkNIT1JdIHx8IG9yaWdpbmFsKVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcGsoKSA9PiBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpIHwgQFByaW1hcnlDb2x1bW4oKVxuICAgIGNvbnN0IHBrS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcblxuICAgIGZ1bmN0aW9uIHBrRGVjKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBrRGVjKG9yaWdpbmFsOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHBrS2V5LCBvcHRpb25zKSxcbiAgICAgICAgICBhc3NpZ24oYHBrLiR7cHJvcH1gLCBvcHRpb25zKSxcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IHR5cGUgPVxuICAgICAgICAgIG9wdGlvbnMudHlwZSB8fCBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKG9yaWdpbmFsLCBwcm9wKTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgcHJvcGVydHkgJHtwcm9wfSBvZiAke29yaWdpbmFsLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgc2VxdWVuY2VOYW1lRm9yTW9kZWwob3JpZ2luYWwsIFwicGtcIik7XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwibnVtZXJpY1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwidmFyY2hhclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgdHlwZSA9IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgICAgUHJpbWFyeUNvbHVtbih7XG4gICAgICAgICAgICAgIHR5cGU6IHR5cGUgYXMgQ29sdW1uVHlwZSxcbiAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKShvcmlnaW5hbCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHBrS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogcGtEZWMsXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihNb2RlbEtleXMuQVRUUklCVVRFKVxuICAgICAgLmV4dGVuZChwcm9wZXJ0eSgpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAY29sdW1uKFwiY29sdW1uTmFtZVwiKSA9PiBAQ29sdW1uKHtuYW1lOiBcImNvbHVtbk5hbWVcIn0pXG4gICAgY29uc3QgY29sdW1uS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoY29sdW1uS2V5KVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1tKG5hbWU6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0czogQ29sdW1uT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKG5hbWUpIG9wdHMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBjb25zdCBwayA9IE1ldGFkYXRhLmdldChvYmosIFwicGtcIik7XG4gICAgICAgICAgICBpZiAocGsgIT09IHByb3ApIHtcbiAgICAgICAgICAgICAgb3B0cy5udWxsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uKG9wdHMpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gYXJnc1sxXTtcbiAgICAgICAgICByZXR1cm4gW2NvbHVtbk5hbWVdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHVuaXF1ZSA9PiBAQ29sdW1uKHt1bmlxdWU6IHRydWV9KVxuICAgIGNvbnN0IHVuaXF1ZUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVuaXF1ZUtleSlcbiAgICAgIC5kZWZpbmUocHJvcE1ldGFkYXRhKHVuaXF1ZUtleSwge30pKVxuICAgICAgLmV4dGVuZChDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEByZXF1aXJlZCA9PiBAQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pXG4gICAgY29uc3QgcmVxdWlyZWRLZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IocmVxdWlyZWRLZXkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IG51bGxhYmxlOiBmYWxzZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHZlcnNpb24gPT4gQFZlcnNpb25Db2x1bW4oKVxuICAgIGNvbnN0IHZlcnNpb25LZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuVkVSU0lPTik7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodmVyc2lvbktleSlcbiAgICAgIC5kZWZpbmUodHlwZShOdW1iZXIubmFtZSksIFZlcnNpb25Db2x1bW4oKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gVmFsaWRhdGlvblVwZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG4gICAgfVxuXG4gICAgLy8gQHRpbWVzdGFtcChvcCkgPT4gQENyZWF0ZURhdGVDb2x1bW4oKSB8fCBAVXBkYXRlRGF0ZUNvbHVtbigpXG4gICAgY29uc3QgdGltZXN0YW1wS2V5ID0gVmFsaWRhdGlvblVwZGF0ZUtleShEQktleXMuVElNRVNUQU1QKTtcblxuICAgIGZ1bmN0aW9uIHRzKG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdLCBmb3JtYXQ6IHN0cmluZykge1xuICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgIGRhdGUoZm9ybWF0LCBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICAgICAgcmVxdWlyZWQoREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuUkVRVUlSRUQpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi5rZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgICAgaWYgKG9wZXJhdGlvbi5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICBwcm9wTWV0YWRhdGEodGltZXN0YW1wS2V5LCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElELFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICBlbHNlIGRlY29yYXRvcnMucHVzaChyZWFkb25seSgpKTtcbiAgICAgIHJldHVybiBhcHBseSguLi5kZWNvcmF0b3JzKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih0aW1lc3RhbXBLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiB0cyxcbiAgICAgIH0pXG4gICAgICAuZXh0ZW5kKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAoLi4ub3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gdGltZXN0YW1wKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChvcHMuaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gVXBkYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICByZXR1cm4gQ3JlYXRlRGF0ZUNvbHVtbigpKG9iaiwgcHJvcCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiAoYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gYXJnc1swXTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb09uZShjbGF6eikgPT4gQE9uZVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvT25lS2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9PbmUoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgICAgICAgIGpvaW5Db2x1bW5PcHRzPzogSm9pbkNvbHVtbk9wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luQ29sdW1uT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb09uZUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgT25lVG9PbmUoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luQ29sdW1uKFxuICAgICAgICAgICAgICBqb2luQ29sdW1uT3B0cyB8fCBtZXRhZGF0YS5uYW1lXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlDb25zdHJhaW50TmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6ICh1bmRlZmluZWQgYXMgYW55KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAb25lVG9NYW55KGNsYXp6KSA9PiBAT25lVG9NYW55KCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG9uZVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3Iob25lVG9NYW55S2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb25lVG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgICAgICAgZms/OiBzdHJpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG5cbiAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvTWFueUtleSwgbWV0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBPbmVUb01hbnlXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIE9uZVRvTWFueShcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyb3NzUmVsYXRpb25LZXkgPSBPYmplY3Qua2V5cyhtKS5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAgayxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVjcyB8fCAhZGVjcy5kZWNvcmF0b3JzIHx8ICFkZWNzLmRlY29yYXRvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjID0gZGVjcy5kZWNvcmF0b3JzWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGF6eiA9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGRlYy5wcm9wcy5jbGFzcyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWRlYy5wcm9wcy5jbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRlYy5wcm9wcy5jbGFzcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGRlYy5wcm9wcy5jbGFzcztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6Lm5hbWUgPT09IG9iai5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNyb3NzUmVsYXRpb25LZXkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIGBDcm9zcyByZWxhdGlvbiBub3QgZm91bmQuIERpZCB5b3UgdXNlIEBtYW55VG9PbmUgb24gdGhlICR7Y2xhenoubmFtZX0/YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW2Nyb3NzUmVsYXRpb25LZXldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb09uZShjbGF6eikgPT4gQE1hbnlUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgICAgICAgIGZrPzogc3RyaW5nXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgICAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJOTyBBQ1RJT05cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShtYW55VG9PbmVLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE1hbnlUb09uZVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIHJldHVybiBNYW55VG9PbmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCk7XG4gICAgICAgICAgICAgICAgICBsZXQgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGtcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0RGVjKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vIFR5cGUgRGVmaW5pdGlvbiBmb3VuZCBmb3IgJHtrfSBpbiAke20uY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGxpc3REZWMuY2xhenpbMF0oKS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgY3Jvc3NSZWxhdGlvbktleSA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgICAgICAgICAgICAgICAgIG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKVxuICAgICAgICAgICAgICAgICAgICApLmlkIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtjcm9zc1JlbGF0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICAgKShvYmosIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAbWFueVRvTWFueShjbGF6eikgPT4gQE1hbnlUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3QgbWFueVRvTWFueUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX01BTlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYW55VG9NYW55KFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICAgICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyxcbiAgICAgICAgICBmaz86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgICAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG1hbnlUb01hbnlLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIE1hbnlUb01hbnkoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luVGFibGUoam9pblRhYmxlT3B0cyBhcyBhbnkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBpbmRleCgpID0+IEBJbmRleCgpXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLklOREVYKVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gaW5kZXgoXG4gICAgICAgICAgZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uW10gfCBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgbmFtZT86IHN0cmluZ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaW5kZXgob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXJlY3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvc2l0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICBuYW1lID0gY29tcG9zaXRpb25zO1xuICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0aW9ucyAmJiBkaXJlY3Rpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgIVtPcmRlckRpcmVjdGlvbi5BU0MsIE9yZGVyRGlyZWN0aW9uLkRTQ10uaW5jbHVkZXMoZCBhcyBhbnkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbnMgPSBkaXJlY3Rpb25zIGFzIHN0cmluZ1tdO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9ucyAmJiBjb21wb3NpdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBJbmRleChbcHJvcCwgLi4uY29tcG9zaXRpb25zXSkob2JqKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEluZGV4KCkob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGUsIHt9KSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICAgIC8vIGFzc2lnbihgcGsuJHtwcm9wfWAsIG9wdGlvbnMpXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZSwge30pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChUeXBlT1JNRmxhdm91cik7XG4iLCJpbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5cblR5cGVPUk1BZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXhlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcXVlbmNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBpbnRlZ3JhdGlvbiBmb3IgRGVjYWYudHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgVHlwZU9STS1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIERlY2FmLnRzIGRhdGEgYWNjZXNzIGFic3RyYWN0aW9ucywgaW5jbHVkaW5nIHRoZSBhZGFwdGVyLCByZXBvc2l0b3J5LCBzdGF0ZW1lbnQgYnVpbGRlciwgcGFnaW5hdGlvbiB1dGlsaXRpZXMsIGluZGV4IGhlbHBlcnMsIGFuZCB0eXBlIGRlZmluaXRpb25zLiBLZXkgZXhwb3J0cyBpbmNsdWRlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIHtAbGluayBUeXBlT1JNUmVwb3NpdG9yeX0sIHtAbGluayBUeXBlT1JNU3RhdGVtZW50fSwge0BsaW5rIFR5cGVPUk1QYWdpbmF0b3J9LCBhbmQgaW5kZXggZ2VuZXJhdGlvbiB1dGlsaXRpZXMuXG4gKiBAbW9kdWxlIGZvci10eXBlb3JtXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbi5cbiAqIEBzdW1tYXJ5IFRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgZm9yLXR5cGVvcm0gcGFja2FnZS5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkJhc2VFcnJvciIsIlNRTE9wZXJhdG9yIiwiUGFnaW5hdG9yIiwiTW9kZWxLZXlzIiwiUGFnaW5nRXJyb3IiLCJmaW5kUHJpbWFyeUtleSIsIlF1ZXJ5RXJyb3IiLCJTdGF0ZW1lbnQiLCJSZXBvc2l0b3J5IiwiT3JkZXJEaXJlY3Rpb24iLCJJbnRlcm5hbEVycm9yIiwiR3JvdXBPcGVyYXRvciIsIk9wZXJhdG9yIiwiU2VxdWVuY2UiLCJOb3RGb3VuZEVycm9yIiwiRGVmYXVsdFNlcGFyYXRvciIsIlBlcnNpc3RlbmNlS2V5cyIsIlR5cGVPUk1SZXBvc2l0b3J5IiwiQ29udGV4dCIsIk9wZXJhdGlvbktleXMiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiVmFsaWRhdGlvbkVycm9yIiwiX19kZWNvcmF0ZSIsInVzZXMiLCJBZGFwdGVyIiwiTW9kZWwiLCJFdmVudFN1YnNjcmliZXIiLCJEaXNwYXRjaCIsIkxvZ2dpbmciLCJSZWZsZWN0aW9uIiwiVmFsaWRhdGlvbktleXMiLCJVbnN1cHBvcnRlZEVycm9yIiwiZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSIsIkNvbHVtblR5cGVVbmRlZmluZWRFcnJvciIsIlByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IiLCJEYXRhU291cmNlIiwiREJLZXlzIiwiQ29uZmxpY3RFcnJvciIsIkluIiwiQ29ubmVjdGlvbkVycm9yIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFUyIsIkRlY29yYXRpb24iLCJyZXF1aXJlZCIsInJlYWRvbmx5IiwicHJvcE1ldGFkYXRhIiwic2VxdWVuY2VOYW1lRm9yTW9kZWwiLCJhcHBseSIsIlZhbGlkYXRpb24iLCJ0eXBlIiwiVmVyc2lvbkNvbHVtbiIsIlVwZGF0ZVZhbGlkYXRpb25LZXlzIiwiZGF0ZSIsIkRCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJDYXNjYWRlIiwicHJvcCIsIkpvaW5Db2x1bW4iLCJsaXN0IiwiSm9pblRhYmxlIiwiSW5kZXgiLCJvbkNyZWF0ZSIsIm9uQ3JlYXRlVXBkYXRlIiwiZmluYWwiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7OztJQUtHO0FBQ0ksVUFBTSxrQkFBa0IsR0FDN0I7QUFFSyxVQUFNLGNBQWMsR0FBRztJQUU5Qjs7Ozs7Ozs7Ozs7OztJQWFHO0lBQ0g7Ozs7OztJQU1HO0FBQ0ksVUFBTSxXQUFXLEdBQUc7SUFDekIsSUFBQSxTQUFTLEVBQUUsR0FBRztJQUNkLElBQUEsRUFBRSxFQUFFLElBQUk7SUFDUixJQUFBLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUEsT0FBTyxFQUFFLFlBQVk7SUFDckIsSUFBQSxLQUFLLEVBQUUsWUFBWTtJQUNuQixJQUFBLE1BQU0sRUFBRSxhQUFhO0lBQ3JCLElBQUEsUUFBUSxFQUFFLGVBQWU7SUFDekIsSUFBQSxLQUFLLEVBQUUsT0FBTzs7O0lDdENoQjs7Ozs7Ozs7Ozs7Ozs7OztJQWdCRztJQUNHLE1BQU8sVUFBVyxTQUFRQSxzQkFBUyxDQUFBO0lBQ3ZDLElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUE7WUFDN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNsQztJQUNEOztJQ25CRDs7Ozs7SUFLRztBQUNTQztJQUFaLENBQUEsVUFBWSxXQUFXLEVBQUE7SUFDckIsSUFBQSxXQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsR0FBVztJQUNYLElBQUEsV0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLElBQWdCO0lBQ2hCLElBQUEsV0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLEdBQWU7SUFDZixJQUFBLFdBQUEsQ0FBQSxvQkFBQSxDQUFBLEdBQUEsSUFBeUI7SUFDekIsSUFBQSxXQUFBLENBQUEsY0FBQSxDQUFBLEdBQUEsR0FBa0I7SUFDbEIsSUFBQSxXQUFBLENBQUEsdUJBQUEsQ0FBQSxHQUFBLElBQTRCO0lBQzVCLElBQUEsV0FBQSxDQUFBLElBQUEsQ0FBQSxHQUFBLElBQVM7SUFDVCxJQUFBLFdBQUEsQ0FBQSxRQUFBLENBQUEsR0FBQSxRQUFpQjtJQUNqQixJQUFBLFdBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0lBQ2IsSUFBQSxXQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtJQUNmLElBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1CO0lBQ25CLElBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1CO0lBQ25CLElBQUEsV0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCO0lBQzNCLElBQUEsV0FBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLFFBQWlCO0lBQ2pCLElBQUEsV0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLFlBQXlCO0lBQ3pCLElBQUEsV0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7SUFDWCxJQUFBLFdBQUEsQ0FBQSxLQUFBLENBQUEsR0FBQSxLQUFXO0lBQ1gsSUFBQSxXQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBYTtJQUNmLENBQUMsRUFuQldBLG1CQUFXLEtBQVhBLG1CQUFXLEdBQUEsRUFBQSxDQUFBLENBQUE7O0lDUnZCOzs7OztJQUtHO0FBQ0ksVUFBTSxpQkFBaUIsR0FBRztJQUVqQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNCRztBQUNJLFVBQU0sZUFBZSxHQUF5QztRQUNuRSxLQUFLLEVBQUVBLG1CQUFXLENBQUMsS0FBSztRQUN4QixTQUFTLEVBQUVBLG1CQUFXLENBQUMsU0FBUztRQUNoQyxNQUFNLEVBQUVBLG1CQUFXLENBQUMsWUFBWTtRQUNoQyxTQUFTLEVBQUVBLG1CQUFXLENBQUMscUJBQXFCO1FBQzVDLE9BQU8sRUFBRUEsbUJBQVcsQ0FBQyxTQUFTO1FBQzlCLFVBQVUsRUFBRUEsbUJBQVcsQ0FBQyxrQkFBa0I7UUFDMUMsT0FBTyxFQUFFQSxtQkFBVyxDQUFDLE9BQU87SUFDNUIsSUFBQSxHQUFHLEVBQUUsS0FBSztRQUNWLEVBQUUsRUFBRUEsbUJBQVcsQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sRUFBRUEsbUJBQVcsQ0FBQyxPQUFPO1FBQzVCLFdBQVcsRUFBRUEsbUJBQVcsQ0FBQyxXQUFXO0lBQ3BDLElBQUEsTUFBTSxFQUFFLEdBQUc7SUFDWCxJQUFBLE9BQU8sRUFBRSxJQUFJO1FBQ2IsSUFBSSxFQUFFQSxtQkFBVyxDQUFDLElBQUk7UUFDdEIsS0FBSyxFQUFFQSxtQkFBVyxDQUFDLEtBQUs7O0lBRzFCOzs7Ozs7Ozs7SUFTRztBQUNJLFVBQU0sb0JBQW9CLEdBQTJCO0lBQzFELElBQUEsR0FBRyxFQUFFLEtBQUs7SUFDVixJQUFBLEVBQUUsRUFBRSxJQUFJOztJQUdWOzs7Ozs7O0lBT0c7QUFDSSxVQUFNLFlBQVksR0FBMkI7SUFDbEQsSUFBQSxJQUFJLEVBQUUsTUFBTTs7O0lDcEVkOzs7Ozs7Ozs7Ozs7Ozs7SUFlRztJQUNHLE1BQU8sZ0JBQXFDLFNBQVFDLGNBSXpELENBQUE7SUFDQzs7OztJQUlHO0lBQ0gsSUFBQSxJQUFhLEtBQUssR0FBQTtZQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXO1FBQ3pCO0lBRUE7Ozs7SUFJRztJQUNILElBQUEsSUFBYSxLQUFLLEdBQUE7WUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWTtRQUMxQjtJQUlBLElBQUEsSUFBYyxJQUFJLEdBQUE7SUFDaEIsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsT0FBMEIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDQyw2QkFBUyxDQUFDLE1BQWlDLENBQUMsQ0FDeEQ7WUFDSDtZQUNBLE9BQU8sSUFBSSxDQUFDLE1BQU07UUFDcEI7SUFFQTs7Ozs7OztJQU9HO0lBQ0gsSUFBQSxXQUFBLENBQ0UsT0FBdUIsRUFDdkIsS0FBbUIsRUFDbkIsSUFBWSxFQUNaLEtBQXFCLEVBQUE7WUFFckIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUNwQztJQUVBOzs7OztJQUtHO0lBQ08sSUFBQSxPQUFPLENBQUMsWUFBMEIsRUFBQTtJQUMxQyxRQUFBLE1BQU0sS0FBSyxHQUFpQixFQUFFLEdBQUcsWUFBWSxFQUFFO0lBQy9DLFFBQUEsT0FBTyxLQUFLO1FBQ2Q7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQStCRztJQUVILElBQUEsTUFBTSxJQUFJLENBQUMsSUFBQSxHQUFlLENBQUMsRUFBQTtZQUN6QixNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTs7WUFHdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQztZQUMxQztJQUVBLFFBQUEsTUFBTSxJQUFJLEdBQXVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUN4RCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSTtnQkFDckMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO0lBQ2hCLFNBQUEsQ0FBQzs7WUFJRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUVqRCxRQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3QixRQUFBLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO0lBQUUsWUFBQSxNQUFNLElBQUlDLGdCQUFXLENBQUMsNkJBQTZCLENBQUM7WUFFckUsTUFBTSxLQUFLLEdBQUdDLDJCQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7SUFFNUIsUUFBQSxNQUFNLE9BQU87OztJQUdYLFFBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsS0FBSTtnQkFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEUsUUFBQSxDQUFDLENBQUM7SUFFSixRQUFBLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSTtJQUN4QixRQUFBLE9BQU8sT0FBeUI7UUFDbEM7SUFDRDs7SUNwSkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQThCRztJQUNHLFNBQVUsa0JBQWtCLENBQ2hDLFFBQWtDLEVBQUE7UUFFbEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO1lBQy9ELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLENBQUM7SUFDN0QsUUFBQSxJQUFJLEVBQUU7SUFBRSxZQUFBLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM5QjtJQUNBLElBQUEsTUFBTSxJQUFJQyxlQUFVLENBQ2xCLG1EQUFtRCxRQUFRLENBQUEsQ0FBRSxDQUM5RDtJQUNIOztJQzFCQTs7Ozs7Ozs7Ozs7Ozs7OztJQWdCRztJQUNHLE1BQU8sZ0JBQXFDLFNBQVFDLGNBSXpELENBQUE7SUFHQyxJQUFBLFdBQUEsQ0FBWSxPQUF1QixFQUFBO1lBQ2pDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDaEI7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTJDRztRQUNPLEtBQUssR0FBQTtJQUNiLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQyxNQUFNLFNBQVMsR0FBR0MsZUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3JELFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO0lBRWpDLFFBQUEsTUFBTSxDQUFDLEdBQTJDO0lBQ2hELFlBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7cUJBQ2pCLGFBQWEsQ0FDWixJQUFJLENBQUMsWUFBWSxDQUFDTCw2QkFBUyxDQUFDLE1BQXdDLENBQUM7cUJBRXRFLGtCQUFrQixDQUFDLFNBQVMsQ0FBMEI7YUFDMUQ7WUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjO2dCQUNyQixDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBLEVBQUcsU0FBUyxDQUFBLENBQUEsRUFBSSxDQUFXLENBQUEsQ0FBRSxDQUFDLENBQzlEOztnQkFDRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFOzs7Ozs7WUFPL0IsSUFBSSxJQUFJLENBQUMsY0FBYztJQUNyQixZQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDM0IsSUFBSSxDQUFDLGNBQWMsRUFDbkIsU0FBUyxFQUNULENBQUMsQ0FBQyxLQUFnQyxDQUNuQyxDQUFDLEtBQXlDO0lBRTdDLFFBQUEsSUFBSSxXQUFxQztZQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7SUFDdkIsWUFBQSxXQUFXLEdBQUc7b0JBQ1osQ0FBQSxFQUFHLFNBQVMsSUFBSUUsMkJBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFZLENBQUEsQ0FBRTtJQUNoRCxnQkFBQUksbUJBQWMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFXO2lCQUMxQzs7SUFFRCxZQUFBLFdBQVcsR0FBRztvQkFDWixDQUFBLEVBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFXLENBQUEsQ0FBRTtJQUNuRCxnQkFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBb0I7aUJBQ3hEO0lBRUgsUUFBQSxDQUFDLENBQUMsS0FBSyxHQUFJLENBQUMsQ0FBQyxLQUFpQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUN0RSxRQUFBLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtJQUN0QixZQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUksQ0FBQyxDQUFDLEtBQWlDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDMUU7aUJBQU87SUFDTCxZQUFBLEdBQUcsQ0FBQyxLQUFLLENBQ1AscURBQXFELGlCQUFpQixDQUFBLENBQUUsQ0FDekU7Z0JBQ0QsQ0FBQyxDQUFDLEtBQUssR0FBSSxDQUFDLENBQUMsS0FBaUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFDekU7O1lBR0EsSUFBSSxJQUFJLENBQUMsY0FBYztJQUNyQixZQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUksQ0FBQyxDQUFDLEtBQWlDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFFMUUsUUFBQSxPQUFPLENBQVE7UUFDakI7SUFFQTs7Ozs7OztJQU9HO1FBQ0gsTUFBTSxRQUFRLENBQUksSUFBWSxFQUFBO0lBQzVCLFFBQUEsSUFBSTtJQUNGLFlBQUEsTUFBTSxLQUFLLEdBQWlCLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3hDLE1BQU0sZ0JBQWdCLEdBQXVCLEVBQUU7SUFDL0MsWUFBQSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBeUM7Z0JBQ3pELElBQUksSUFBSSxDQUFDLGNBQWM7b0JBQ3JCLGdCQUFnQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQ3ZELElBQUksQ0FBQyxjQUFjLEVBQ25CRCxlQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDcEM7Z0JBRUgsSUFBSSxJQUFJLENBQUMsZUFBZTtvQkFDdEIsZ0JBQWdCLENBQUMsS0FBSyxHQUFHO0lBQ3ZCLG9CQUFBLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtxQkFDdkQ7SUFFVixZQUFBLE9BQU8sSUFBSSxnQkFBZ0IsQ0FDekIsSUFBSSxDQUFDLE9BQWMsRUFDbkIsZ0JBQXVCLEVBQ3ZCLElBQUksRUFDSixJQUFJLENBQUMsWUFBWSxDQUNsQjtZQUNIO1lBQUUsT0FBTyxDQUFNLEVBQUU7SUFDZixZQUFBLE1BQU0sSUFBSUUsMEJBQWEsQ0FBQyxDQUFDLENBQUM7WUFDNUI7UUFDRjtJQUVBOzs7Ozs7O0lBT0c7UUFDSyxhQUFhLENBQUMsQ0FBTSxFQUFFLE1BQWUsRUFBQTtZQUMzQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVcsRUFBRTtJQUNwQyxZQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRTtJQUNBLFFBQUEsT0FBTyxDQUFDO1FBQ1Y7SUFFQTs7Ozs7O0lBTUc7UUFDTSxNQUFNLEdBQUcsQ0FBSSxRQUF5QixFQUFBO0lBQzdDLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxRQUFBLEdBQUcsQ0FBQyxLQUFLLENBQ1AsQ0FBQSxxQkFBQSxFQUF5QixRQUFRLENBQUMsS0FBMEMsQ0FBQyxNQUFNLEVBQUUsQ0FBQSxDQUFFLENBQ3hGO1lBQ0QsUUFBUSxNQUNOLFFBQVEsQ0FBQyxLQUNWLENBQUMsT0FBTyxFQUFFO1FBQ2I7UUFFVSwyQkFBMkIsQ0FDbkMsU0FBdUIsRUFDdkIsU0FBaUIsRUFDakIsT0FBTyxHQUFHLENBQUMsRUFDWCxhQUF3QyxFQUFBO0lBRXhDLFFBQUEsTUFBTSxJQUFJQSwwQkFBYSxDQUFDLGlCQUFpQixDQUFDO1FBQzVDO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQThCRztRQUNPLGNBQWMsQ0FDdEIsU0FBdUIsRUFDdkIsU0FBaUIsRUFDakIsRUFBMkIsRUFDM0IsT0FBTyxHQUFHLENBQUMsRUFDWCxhQUF3QyxFQUFBO1lBRXhDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLFNBSXZDO0lBRUQsUUFBQSxTQUFTLEtBQUssR0FBQTtJQUNaLFlBQUEsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDO0lBQ2hELFlBQUEsTUFBTSxPQUFPLEdBQUcsQ0FBQSxFQUFHLEtBQUssQ0FBQSxFQUFHLE9BQU8sRUFBRTtnQkFDcEMsTUFBTSxRQUFRLEdBQUcsQ0FBQSxFQUFHLFNBQVMsQ0FBQSxDQUFBLEVBQUksS0FBSyxDQUFBLENBQUEsRUFBSSxXQUFXLENBQUEsRUFBQSxFQUFLLE9BQU8sQ0FBQSxDQUFFO0lBQ25FLFlBQUEsTUFBTSxNQUFNLEdBQUc7b0JBQ2IsQ0FBQyxPQUFPLEdBQUcsVUFBVTtpQkFDdEI7Z0JBQ0QsUUFBUSxhQUFhO29CQUNuQixLQUFLQyxrQkFBYSxDQUFDLEdBQUc7d0JBQ3BCLE9BQU87NEJBQ0wsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBUTt5QkFDNUM7b0JBQ0gsS0FBS0Esa0JBQWEsQ0FBQyxFQUFFO3dCQUNuQixPQUFPOzRCQUNMLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQVE7eUJBQzNDO29CQUNILEtBQUtDLGFBQVEsQ0FBQyxHQUFHO0lBQ2Ysb0JBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQztJQUNqRCxnQkFBQTt3QkFDRSxPQUFPOzRCQUNMLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQVE7eUJBQ3pDOztZQUVQO1lBRUEsSUFDRSxDQUFDRCxrQkFBYSxDQUFDLEdBQUcsRUFBRUEsa0JBQWEsQ0FBQyxFQUFFLEVBQUVDLGFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQ3pELFFBQXlCLENBQzFCLEtBQUssRUFBRSxFQUNSO2dCQUNBLE9BQU8sS0FBSyxFQUFFO1lBQ2hCOztJQUVLLGFBQUEsSUFBSSxRQUFRLEtBQUtBLGFBQVEsQ0FBQyxHQUFHLEVBQUU7SUFDbEMsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDO1lBQ2pEOztpQkFFSztJQUNILFlBQUEsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBcUIsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTztJQUNyRSxpQkFBQSxLQUF5QztJQUM1QyxZQUFBLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FDeEIsVUFBVSxFQUNWLFNBQVMsRUFDVCxFQUFFLEVBQ0YsRUFBRSxPQUFPLEVBQ1QsUUFBUSxDQUNUO1lBQ0g7UUFDRjtJQUNEOztJQzVURDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBOEJHO0lBQ0csTUFBTyxlQUFnQixTQUFRQyxhQUFRLENBQUE7UUFDM0MsV0FBQSxDQUNFLE9BQXdCLEVBQ2QsT0FBdUIsRUFBQTtZQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBRkosSUFBQSxDQUFBLE9BQU8sR0FBUCxPQUFPO1FBR25CO0lBRUE7OztJQUdHO0lBQ0gsSUFBQSxNQUFNLE9BQU8sR0FBQTtJQUNYLFFBQUEsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPO0lBQzdCLFFBQUEsSUFBSTtnQkFDRixNQUFNLEdBQUcsR0FBUSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ3RDLGdCQUFBLEtBQUssRUFBRSxDQUFBLCtFQUFBLENBQWlGO29CQUN4RixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDZixhQUFBLENBQUM7Z0JBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFnQyxDQUFDO1lBQ3pEO1lBQUUsT0FBTyxDQUFVLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQzNDO1FBQ0Y7SUFFQTs7Ozs7SUFLRztJQUNLLElBQUEsS0FBSyxDQUFDLEtBQStCLEVBQUE7SUFDM0MsUUFBQSxPQUFPQSxhQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUN0RDtJQUVBOzs7Ozs7O0lBT0c7SUFDSyxJQUFBLE1BQU0sU0FBUyxDQUNyQixPQUFpQyxFQUNqQyxLQUFjLEVBQUE7SUFFZCxRQUFBLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTztJQUMzRCxRQUFBLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssUUFBUTtnQkFDeEMsTUFBTSxJQUFJSCwwQkFBYSxDQUNyQixDQUFBLGtDQUFBLEVBQXFDLElBQUksQ0FBQSxNQUFBLEVBQVMsS0FBSyxDQUFBLENBQUUsQ0FDMUQ7SUFDSCxRQUFBLElBQUksSUFBOEI7SUFDbEMsUUFBQSxJQUFJO0lBQ0YsWUFBQSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM1QixnQkFBQSxLQUFLLEVBQUUsQ0FBQSxtQkFBQSxDQUFxQjtvQkFDNUIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2YsYUFBQSxDQUFDO1lBQ0o7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLElBQUksRUFBRSxDQUFDLFlBQVlJLDBCQUFhLENBQUM7SUFBRSxnQkFBQSxNQUFNLENBQUM7SUFDMUMsWUFBQSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM1QixnQkFBQSxLQUFLLEVBQUUsQ0FBQSx3RUFBQSxDQUEwRTtJQUNqRixnQkFBQSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQztJQUN2QyxhQUFBLENBQUM7WUFDSjtJQUVBLFFBQUEsT0FBTyxJQUFnQztRQUN6QztJQUVBOzs7OztJQUtHO0lBQ0gsSUFBQSxNQUFNLElBQUksR0FBQTtJQUNSLFFBQUEsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFO0lBQ3BDLFFBQUEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUNoQztRQUVBLE1BQU0sS0FBSyxDQUFDLEtBQWEsRUFBQTtZQUN2QixNQUFNLE9BQU8sSUFBSSxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBVztJQUNoRCxRQUFBLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQVc7SUFDbEUsUUFBQSxNQUFNLElBQUksR0FBNkIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUN6RCxPQUFPLEVBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQVksR0FBRyxXQUFXLENBQzVDO1lBQ0QsTUFBTSxLQUFLLEdBQWlDLEVBQUU7SUFDOUMsUUFBQSxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3ZDLFlBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxHQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFZLENBQUM7WUFDL0Q7WUFDQSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUk7SUFDbEMsWUFBQSxNQUFNLElBQUlKLDBCQUFhLENBQUMseUJBQXlCLENBQUM7SUFDcEQsUUFBQSxPQUFPLEtBQUs7UUFDZDtJQUNEOztJQ3hIRDs7Ozs7Ozs7O0lBU0c7SUFDSCxTQUFTLGlCQUFpQixDQUN4QixJQUFjLEVBQ2QsU0FBMEIsRUFDMUIsWUFBdUIsRUFDdkIsU0FBUyxHQUFHSyw2QkFBZ0IsRUFBQTtRQUU1QixPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLENBQUMsS0FBSyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxRQUFBLElBQW9CLEVBQUUsQ0FBQztJQUN2QixRQUFBLElBQThCLEVBQUUsQ0FBQztJQUNqQyxRQUFBLFdBQVcsQ0FBQyxLQUFLO0lBQ2xCLEtBQUEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ25CO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUE4Q0c7SUFDRyxTQUFVLGVBQWUsQ0FDN0IsTUFBd0IsRUFBQTtRQUV4QixNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBaUMsRUFBRTtRQUNoRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUc7SUFDbkIsUUFBQSxLQUFLLEVBQUUsQ0FBQSxDQUFFO0lBQ1QsUUFBQSxNQUFNLEVBQUUsRUFBRTtTQUNYO0lBRUQsSUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFJO1lBQ25CLE1BQU0sR0FBRyxHQUFrQ1AsZUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDaEUsUUFBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFJO2dCQUMzQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFL0IsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFJLEtBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE1BQU0sU0FBUyxHQUFHQSxlQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyQyxZQUFBLFlBQVksR0FBRyxZQUFZLElBQUksRUFBRTtJQUVqQyxZQUFBLFNBQVMsUUFBUSxHQUFBO0lBQ2YsZ0JBQUEsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBSSxZQUFtQixFQUFFUSxvQkFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDckVELDZCQUFnQixDQUNqQjtvQkFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7SUFDZCxvQkFBQSxLQUFLLEVBQUUsQ0FBQSwyQkFBQSxDQUE2QjtJQUNwQyxvQkFBQSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQztxQkFDL0I7Z0JBQ0g7SUFFQSxZQUFBLFFBQVEsRUFBRTtJQUNaLFFBQUEsQ0FBQyxDQUFDO0lBQ0osSUFBQSxDQUFDLENBQUM7SUFDRixJQUFBLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDL0I7O0lDbEdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNDRztBQUVVRSw2QkFBaUIsR0FBdkIsTUFBTSxpQkFBbUMsU0FBUVQsZUFNdkQsQ0FBQTtJQUNDLElBQUEsV0FBQSxDQUNFLE9BS0MsRUFDRCxLQUFxQixFQUNyQixHQUFHLElBQVcsRUFBQTtZQUVkLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2hDO0lBRUE7Ozs7SUFJRztRQUNILFlBQVksR0FBQTtJQUNWLFFBQUEsTUFBTSxJQUFJLEdBQUksSUFBSSxDQUFDLE9BQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDTCw2QkFBUyxDQUFDLE1BQWlDLENBQUMsQ0FDeEQ7SUFDRCxRQUFBLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFO1FBQ2xDO0lBRUE7Ozs7OztJQU1HO0lBQ00sSUFBQSxNQUFNLE1BQU0sQ0FBQyxLQUFRLEVBQUUsR0FBRyxJQUFXLEVBQUE7O1lBRTVDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3BFLFFBQUEsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQy9CLElBQUksQ0FBQyxLQUFhLENBQUNBLDZCQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLEVBQUUsRUFDRixLQUFZLEVBQ1osSUFBSSxDQUFDLEVBQUUsRUFDUCxHQUFHLElBQUksQ0FDUjtZQUNELElBQUksQ0FBQyxHQUFzQyxTQUFTO1lBQ3BELElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBMEI7SUFDbkUsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN4QixNQUFNLEVBQ04sSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsRUFBRSxFQUNQLEVBQUUsRUFDRixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQzNEO1FBQ0g7SUFFQTs7Ozs7O0lBTUc7UUFDTSxNQUFNLElBQUksQ0FDakIsRUFBNEI7O0lBRTVCLElBQUEsR0FBRyxJQUFXLEVBQUE7WUFFZCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM5QixJQUFJLENBQUMsS0FBYSxDQUFDQSw2QkFBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxFQUFZLEVBQ1osSUFBSSxDQUFDLEVBQVksQ0FDbEI7SUFDRCxRQUFBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0Q7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVcsRUFBQTs7WUFFNUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDcEUsUUFBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDL0IsSUFBSSxDQUFDLEtBQWEsQ0FBQ0EsNkJBQVMsQ0FBQyxNQUFNLENBQVEsRUFDNUMsRUFBRSxFQUNGLEtBQUssRUFDTCxJQUFJLENBQUMsRUFBRSxFQUNQLEdBQUcsSUFBSSxDQUNSO1lBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUM7UUFDM0U7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sTUFBTSxDQUNuQixFQUE0QixFQUM1QixHQUFHLElBQVcsRUFBQTtZQUVkLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ2hDLElBQUksQ0FBQyxLQUFhLENBQUNBLDZCQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLEVBQVksRUFDWixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUjtJQUNELFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMzRDtJQUVBOzs7Ozs7SUFNRztJQUNnQixJQUFBLE1BQU0sZUFBZSxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVcsRUFBQTtZQUNsRSxNQUFNLFdBQVcsR0FBRyxNQUFNZSxvQkFBTyxDQUFDLElBQUksQ0FDcENDLDBCQUFhLENBQUMsTUFBTSxFQUNwQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksRUFDSixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUN0QjtZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztJQUV4RCxRQUFBLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUk7Z0JBQ3JCLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLFlBQUEsTUFBTUMsZ0NBQW1CLENBQ3ZCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixDQUFDLEVBQ0RELDBCQUFhLENBQUMsTUFBTSxFQUNwQkEsMEJBQWEsQ0FBQyxFQUFFLENBQ2pCO0lBQ0QsWUFBQSxPQUFPLENBQUM7WUFDVixDQUFDLENBQUMsQ0FDSDtZQUNELE1BQU0sTUFBTSxHQUFHO2lCQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FDTCxDQUFDLENBQUMsU0FBUyxDQUNULElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDbEU7aUJBRUYsTUFBTSxDQUFDLENBQUMsS0FBeUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFJO0lBQzFDLFlBQUEsSUFBSSxDQUFDO29CQUNILEtBQUs7d0JBQ0gsT0FBTyxLQUFLLEtBQUs7OEJBQ2IsS0FBSyxHQUFHLENBQUEsS0FBQSxFQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7OEJBQ2xDLE1BQU0sQ0FBQyxDQUFBLEVBQUEsRUFBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUEsQ0FBRTtJQUNsQyxZQUFBLE9BQU8sS0FBSztZQUNkLENBQUMsRUFBRSxTQUFTLENBQUM7SUFDZixRQUFBLElBQUksTUFBTTtJQUFFLFlBQUEsTUFBTSxJQUFJRSw0QkFBZSxDQUFDLE1BQU0sQ0FBQztZQUM3QyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUN0QztJQUVBOzs7Ozs7SUFNRztJQUNNLElBQUEsTUFBTSxTQUFTLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVyxFQUFBO1lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtJQUFFLFlBQUEsT0FBTyxNQUFNO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRSxRQUFBLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyQyxRQUFBLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUMzQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDbkMsSUFBSSxDQUFDLEtBQWEsQ0FBQ2xCLDZCQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLEdBQTBCLEVBQzFCLE1BQU0sRUFDTixHQUFHLElBQUksQ0FDUjtJQUNELFFBQUEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFvQixDQUFDLENBQ3ZFO1FBQ0g7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sT0FBTyxDQUNwQixJQUF5QixFQUN6QixHQUFHLElBQVcsRUFBQTtZQUVkLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3ZDLElBQUksQ0FBQyxLQUFhLENBQUNBLDZCQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLElBQUksRUFDSixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUjtJQUNELFFBQUEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxDQUFTLEtBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JEO1FBQ0g7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sU0FBUyxDQUFDLE1BQVcsRUFBRSxHQUFHLElBQVcsRUFBQTtZQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkUsUUFBQSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN6QyxJQUFJLENBQUMsS0FBYSxDQUFDQSw2QkFBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDeEIsTUFBTSxFQUNOLElBQUksQ0FBQyxFQUFZLEVBQ2pCLEdBQUcsSUFBSSxDQUNSO0lBQ0QsUUFBQSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFzQixFQUFFLENBQVMsS0FDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQzNEO1FBQ0g7SUFFQTs7Ozs7O0lBTUc7SUFDTSxJQUFBLE1BQU0sU0FBUyxDQUN0QixJQUF5QixFQUN6QixHQUFHLElBQVcsRUFBQTtZQUVkLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ3pDLElBQUksQ0FBQyxLQUFhLENBQUNBLDZCQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLElBQUksRUFDSixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUjtJQUNELFFBQUEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxDQUFTLEtBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JEO1FBQ0g7O0FBOVBXYyw2QkFBaUIsR0FBQUssZ0JBQUEsQ0FBQTtRQUQ3QkMsU0FBSSxDQUFDLGNBQWMsQ0FBQzsrQ0FTUkMsWUFBTyxFQUFBLE1BQUEsRUFBQSxNQUFBLENBQUE7SUFSUCxDQUFBLEVBQUFQLHlCQUFpQixDQStQN0I7O0lDOVNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUEyQkc7SUFFSSxJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUFzQixDQUFBO0lBQ2pDLElBQUEsV0FBQSxDQUNxQixPQUlWLEVBQUE7WUFKVSxJQUFBLENBQUEsT0FBTyxHQUFQLE9BQU87UUFLekI7SUFFSDs7Ozs7SUFLRztJQUNILElBQUEsV0FBVyxDQUFDLEtBQXVCLEVBQUE7SUFDakMsUUFBQSxNQUFNLFdBQVcsR0FBR1EseUJBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQzVELFFBQUEsSUFBSSxDQUFDLFdBQVc7SUFDZCxZQUFBLE1BQU0sSUFBSWYsMEJBQWEsQ0FDckIsQ0FBQSw4QkFBQSxFQUFpQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUEsQ0FBRSxDQUNqRTtZQUNILE1BQU0sU0FBUyxHQUFHRixlQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztJQUUvQyxRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFVywwQkFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFlLENBQUMsQ0FBQztRQUN4RTtJQUVBOzs7OztJQUtHO0lBQ0gsSUFBQSxXQUFXLENBQUMsS0FBdUIsRUFBQTtJQUNqQyxRQUFBLE1BQU0sV0FBVyxHQUFHTSx5QkFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDNUQsUUFBQSxJQUFJLENBQUMsV0FBVztJQUNkLFlBQUEsTUFBTSxJQUFJZiwwQkFBYSxDQUNyQixDQUFBLDhCQUFBLEVBQWlDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQSxDQUFFLENBQ2pFO1lBQ0gsTUFBTSxTQUFTLEdBQUdGLGVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBRS9DLFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUVXLDBCQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQWUsQ0FBQyxDQUFDO1FBQ3hFO0lBRUE7Ozs7O0lBS0c7SUFDSCxJQUFBLFdBQVcsQ0FBQyxLQUF1QixFQUFBO0lBQ2pDLFFBQUEsTUFBTSxXQUFXLEdBQUdNLHlCQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUNwRSxRQUFBLElBQUksQ0FBQyxXQUFXO0lBQ2QsWUFBQSxNQUFNLElBQUlmLDBCQUFhLENBQ3JCLENBQUEsOEJBQUEsRUFBaUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FDekU7WUFDSCxNQUFNLFNBQVMsR0FBR0YsZUFBVSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFFL0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRVcsMEJBQWEsQ0FBQyxNQUFNLEVBQUU7SUFDbEQsWUFBQSxLQUFLLENBQUMsTUFBYyxDQUFDLElBQUksQ0FBUTtJQUNuQyxTQUFBLENBQUM7UUFDSjtLQUNEO0lBN0RZLHNCQUFzQixHQUFBRyxnQkFBQSxDQUFBO0lBRGxDLElBQUFJLHVCQUFlLEVBQUU7O0lBQ0wsQ0FBQSxFQUFBLHNCQUFzQixDQTZEbEM7O0lDL0ZEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTBCRztJQUNHLE1BQU8sZUFBZ0IsU0FBUUMsYUFBMkIsQ0FBQTtJQUk5RCxJQUFBLFdBQUEsQ0FBb0IsVUFBVSxJQUFJLEVBQUE7SUFDaEMsUUFBQSxLQUFLLEVBQUU7WUFEVyxJQUFBLENBQUEsT0FBTyxHQUFQLE9BQU87WUFGbkIsSUFBQSxDQUFBLGNBQWMsR0FBVyxDQUFDO1FBSWxDO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWtCRztJQUNPLElBQUEsTUFBTSxtQkFBbUIsQ0FDakMsS0FBYSxFQUNiLFNBQXdCLEVBQ3hCLEdBQWEsRUFBQTtJQUViLFFBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xELFFBQUEsSUFBSTs7Z0JBRUYsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xELEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQSwrQkFBQSxFQUFrQyxTQUFTLENBQUEsS0FBQSxFQUFRLEtBQUssQ0FBQSxDQUFFLENBQUM7SUFDdkUsWUFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFBLENBQUUsQ0FBQztZQUMxQjtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsR0FBRyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBLENBQUUsQ0FBQztZQUNuRDtRQUNGO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF5Qkc7SUFDZ0IsSUFBQSxNQUFNLFVBQVUsR0FBQTtJQUNqQyxRQUFBLGVBQWUsa0JBQWtCLEdBQUE7Z0JBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtJQUNqQyxnQkFBQSxNQUFNLElBQUlqQiwwQkFBYSxDQUFDLENBQUEsdUNBQUEsQ0FBeUMsQ0FBQztnQkFDcEU7SUFFQSxZQUFBLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUF5QjtJQUU5QyxZQUFBLElBQUk7SUFDRixnQkFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhO0lBQ25DLG9CQUFBLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7b0JBRXZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDakMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ2hFO2dCQUNIO2dCQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLGdCQUFBLE1BQU0sSUFBSUEsMEJBQWEsQ0FBQyxDQUFVLENBQUM7Z0JBQ3JDO1lBQ0Y7WUFFQTtpQkFDRyxJQUFJLENBQUMsSUFBSTtpQkFDVCxJQUFJLENBQUMsTUFBSztJQUNULFlBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQSxtQ0FBQSxDQUFxQyxDQUFDO0lBQ3RELFFBQUEsQ0FBQztJQUNBLGFBQUEsS0FBSyxDQUFDLENBQUMsQ0FBVSxLQUFJO0lBQ3BCLFlBQUEsTUFBTSxJQUFJQSwwQkFBYSxDQUNyQixpREFBaUQsQ0FBQyxDQUFBLENBQUUsQ0FDckQ7SUFDSCxRQUFBLENBQUMsQ0FBQztRQUNOO0lBRUE7O0lBRUc7UUFDSSxPQUFPLEdBQUE7Ozs7OztRQU1kO0lBQ0Q7O0lDM0lEOzs7Ozs7Ozs7Ozs7OztJQWNHO0lBQ0csU0FBVSx3QkFBd0IsQ0FBQyxPQUF3QixFQUFBO0lBQy9ELElBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUM7SUFDMUMsSUFBQSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUMvQixJQUFJLEtBQUssRUFBRTtJQUNULFlBQUEsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUs7Z0JBQ25CLE9BQU8sR0FBRyxDQUFDO1lBQ2I7UUFDRjtJQUNBLElBQUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU87SUFFekUsSUFBQSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTTtJQUU1QixJQUFBLE9BQU8sT0FBTztJQUNoQjthQUVnQixtQkFBbUIsQ0FDakMsQ0FBaUIsRUFDakIsUUFBNkIsRUFBRSxFQUFBO0lBRS9CLElBQUEsSUFBSSxRQUFXO0lBQ2YsSUFBQSxJQUFJO0lBQ0YsUUFBQSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDcEI7UUFBRSxPQUFPLENBQVUsRUFBRTtZQUNuQixNQUFNLElBQUlBLDBCQUFhLENBQ3JCLENBQUEsNEJBQUEsRUFBK0IsQ0FBQyxDQUFDLElBQUksQ0FBQSxpQ0FBQSxFQUFvQyxDQUFDLENBQUEsQ0FBRSxDQUM3RTtRQUNIO1FBQ0EsTUFBTSxJQUFJLEdBQUdGLGVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHb0IsZUFBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUM1QyxJQUFBLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTO0lBQzFDLElBQUEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQSwrQkFBQSxFQUFrQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FBQztJQUNwRCxRQUFBLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEI7UUFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUMzQixDQUFDLEtBQWtELEVBQUUsSUFBSSxLQUFJO1lBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQSxtQ0FBQSxFQUFzQyxJQUFJLENBQUEsVUFBQSxFQUFhLENBQUMsQ0FBQyxJQUFJLENBQUEsQ0FBRSxDQUFDO1lBQ3pFLE1BQU0sVUFBVSxHQUFHQyxxQkFBVSxDQUFDLHFCQUFxQixDQUNqRHJCLGVBQVUsQ0FBQyxHQUFHLENBQUNRLG9CQUFlLENBQUMsUUFBUSxDQUFDLEVBQ3hDLFFBQVEsRUFDUixJQUFJLEVBQ0osSUFBSSxDQUNMO0lBQ0QsUUFBQSxJQUNFLENBQUMsVUFBVTtnQkFDWCxDQUFDLFVBQVUsQ0FBQyxVQUFVO0lBQ3RCLFlBQUEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU07Z0JBRTdCLE1BQU0sSUFBSU4sMEJBQWEsQ0FDckIsQ0FBQSxpQ0FBQSxFQUFvQyxJQUFJLENBQUEsVUFBQSxFQUFhLENBQUMsQ0FBQyxJQUFJLENBQUEsQ0FBRSxDQUM5RDtJQUNILFFBQUEsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNsQyxNQUFNLElBQUlBLDBCQUFhLENBQ3JCLENBQUEsdUNBQUEsRUFBMEMsSUFBSSxDQUFBLFVBQUEsRUFBYSxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FDcEU7SUFDSCxRQUFBLEdBQUcsQ0FBQyxJQUFJLENBQ04scUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBRSxDQUN0RTtZQUNELE1BQU0sU0FBUyxHQUFRLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9DLFFBQUEsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRO0lBQ3RDLFFBQUEsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtJQUFFLFlBQUEsS0FBSyxHQUFHZSx5QkFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQW1CO1lBQ3pFLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQUUsS0FBSyxHQUFHLEtBQUssRUFBRTtJQUMvRCxRQUFBLElBQUksQ0FBQyxLQUFLO2dCQUNSLE1BQU0sSUFBSWYsMEJBQWEsQ0FDckIsQ0FBQSxrQ0FBQSxFQUFxQyxJQUFJLENBQUEsVUFBQSxFQUFhLENBQUMsQ0FBQyxJQUFJLENBQUEsQ0FBRSxDQUMvRDtJQUVILFFBQUEsR0FBRyxDQUFDLElBQUksQ0FDTixDQUFBLGlCQUFBLEVBQW9CLElBQUksT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFBLFFBQUEsRUFBVyxLQUFLLENBQUMsSUFBSSxnQkFBZ0IsS0FBSyxDQUFBLENBQUUsQ0FDbEY7WUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFO0lBQ1YsWUFBQSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0I7aUJBQU87SUFDTCxZQUFBLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM1QjtZQUVBLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDbEMsWUFBQSxHQUFHLENBQUMsSUFBSSxDQUNOLENBQUEsc0JBQUEsRUFBeUIsS0FBSyxDQUFDLElBQUksQ0FBQSxTQUFBLEVBQVksSUFBSSxDQUFBLElBQUEsRUFBTyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsS0FBSyxDQUFBLENBQUUsQ0FDeEY7SUFDRCxZQUFBLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztnQkFDakUsR0FBRyxDQUFDLElBQUksQ0FDTixDQUFBLGNBQUEsRUFBaUIsSUFBSSxDQUFBLElBQUEsRUFBTyxLQUFLLENBQUMsSUFBSSxDQUFBLEVBQUEsRUFBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBRSxDQUNoRjtnQkFDRCxHQUFHLENBQUMsSUFBSSxDQUNOLENBQUEsY0FBQSxFQUFpQixJQUFJLENBQUEsSUFBQSxFQUFPLEtBQUssQ0FBQyxJQUFJLENBQUEsRUFBQSxFQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFFLENBQy9FO0lBQ0QsWUFBQSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDckQsZ0JBQUEsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUEsRUFBRyxJQUFJLElBQUksRUFBRSxDQUFBLENBQUUsQ0FBQztvQkFDL0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztnQkFDM0M7SUFFQSxZQUFBLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtJQUNwQixnQkFBQSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUEsRUFBRyxJQUFJLElBQUksRUFBRSxDQUFBLENBQUUsQ0FBQztvQkFDbkQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQy9CO2dCQUNBLEdBQUcsQ0FBQyxJQUFJLENBQ04sQ0FBQSx5QkFBQSxFQUE0QixJQUFJLENBQUEsSUFBQSxFQUFPLEtBQUssQ0FBQyxJQUFJLENBQUEsRUFBQSxFQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFFLENBQzNGO2dCQUNELEdBQUcsQ0FBQyxJQUFJLENBQ04sQ0FBQSx5QkFBQSxFQUE0QixJQUFJLENBQUEsSUFBQSxFQUFPLEtBQUssQ0FBQyxJQUFJLENBQUEsRUFBQSxFQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFFLENBQzFGO1lBQ0g7SUFFQSxRQUFBLE9BQU8sS0FBSztRQUNkLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUNoQztJQUNELElBQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTO1FBQ3pCa0IsZUFBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FDbkMsQ0FBQSxjQUFBLEVBQWlCLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBLENBQUUsQ0FDakU7SUFDRCxJQUFBLE9BQU8sU0FBUztJQUNsQjs7YUNsSWdCLG1CQUFtQixDQUNqQyxNQUFXLEVBQ1gsUUFBZ0IsRUFDaEIsT0FBNkIsRUFBQTtRQUU3QixJQUFJLEtBQUssR0FBVyxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFxQixFQUFFLENBQUMsS0FBSTtZQUN2RCxLQUFLLEdBQUcsQ0FBQztZQUNULE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxRQUFRO0lBQzNELElBQUEsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO0lBQUUsUUFBQSxPQUFPLEVBQUU7SUFDM0IsSUFBQSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDeEIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQzNDLENBQUMsS0FBMEIsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSTtZQUN6QyxRQUFRLEdBQUc7SUFDVCxZQUFBLEtBQUssVUFBVTtJQUNiLGdCQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHO29CQUNoQjtnQkFDRixLQUFLRSxrQ0FBYyxDQUFDLElBQUk7O29CQUV0QjtJQUNGLFlBQUE7SUFDRSxnQkFBQSxNQUFNLElBQUlDLHFCQUFnQixDQUN4QixzQ0FBc0MsR0FBRyxDQUFBLENBQUUsQ0FDNUM7O0lBRUwsUUFBQSxPQUFPLEtBQUs7UUFDZCxDQUFDLEVBQ0QsRUFBRSxDQUNIO0lBQ0g7YUFFZ0Isb0JBQW9CLENBQ2xDLE1BQVcsRUFDWCxRQUFnQixFQUNoQixPQUE2QixFQUM3QixPQUFBLEdBQWUsRUFBRSxFQUNqQixJQUFBLEdBQWUsU0FBUyxFQUN4QixTQUFpQyxFQUNqQyxPQUE2QixFQUFBO1FBRTdCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQ3pCLENBQUMsQ0FBcUIsS0FDcEIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLFlBQVksS0FBSyxRQUFRLENBQ3JEO1FBRUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxDQUF1QixLQUN0QixDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FDckQ7UUFFRCxJQUFJLE9BQU8sRUFBRTtZQUNYLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQ3pCLENBQUMsQ0FBb0IsS0FDbkIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUssQ0FBQyxDQUFDLE9BQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUNwRTtJQUNELFFBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSTtJQUNqQixZQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUMzQixRQUFBLENBQUMsQ0FBQztRQUNKO0lBRUEsSUFBQSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNqQixNQUFNLElBQUlyQiwwQkFBYSxDQUNyQixDQUFBLHFCQUFBLEVBQXdCLFFBQVEsQ0FBQSx5QkFBQSxFQUE0QixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBRSxDQUM1RztJQUNILElBQUEsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDakIsTUFBTSxJQUFJQSwwQkFBYSxDQUNyQixDQUFBLHVCQUFBLEVBQTBCLFFBQVEsQ0FBQSx5QkFBQSxFQUE0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBRSxDQUMzRztJQUNILElBQUEsSUFBSSxNQUE2RDtRQUVqRSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ1gsWUFBQSxNQUFNLEVBQUUsTUFBTTtJQUNkLFlBQUEsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBQSxJQUFJLEVBQUUsSUFBSTtJQUNWLFlBQUEsT0FBTyxFQUFFLE9BQU87SUFDSyxTQUFBLENBQUM7WUFDeEI7UUFDRjtJQUFPLFNBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7SUFDdkIsUUFBQSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLElBQUksS0FBSyxTQUFTO0lBQ3BCLFlBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0lBQ3BDLGdCQUFBLEtBQUssRUFBRSxJQUFJO0lBQ1gsZ0JBQUEsUUFBUSxFQUFFLElBQUk7SUFDZCxnQkFBQSxVQUFVLEVBQUUsSUFBSTtJQUNoQixnQkFBQSxZQUFZLEVBQUUsSUFBSTtJQUNuQixhQUFBLENBQUM7UUFDTjtRQUVBLElBQUksSUFBSSxDQUFDLE1BQU07SUFDYixRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxLQUEwQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFJO2dCQUN6QyxRQUFRLEdBQUc7SUFDVCxnQkFBQSxLQUFLLFVBQVU7SUFDYixvQkFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRzt3QkFDaEI7OztJQUlKLFlBQUEsT0FBTyxLQUFLO1lBQ2QsQ0FBQyxFQUNELEVBQUUsQ0FDSDtJQUVILElBQUEsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRTFCLElBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFO1lBQ3ZDLEtBQUssRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRTtJQUN4QyxRQUFBLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBQSxVQUFVLEVBQUUsSUFBSTtJQUNoQixRQUFBLFlBQVksRUFBRSxJQUFJO0lBQ25CLEtBQUEsQ0FBQztJQUNKOztJQ2FBOzs7SUFHRztJQUNHLFNBQVUsTUFBTSxDQUNwQixhQUcyQyxFQUMzQyxPQUErQyxFQUFBO1FBRS9DLE9BQU8sVUFBVSxNQUFjLEVBQUUsWUFBaUIsRUFBQTs7SUFFaEQsUUFBQSxJQUFJLElBQTRCO1lBQ2hDLElBQ0UsT0FBTyxhQUFhLEtBQUssUUFBUTtJQUNqQyxZQUFBLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFDbkM7Z0JBQ0EsSUFBSSxHQUFlLGFBQWE7WUFDbEM7aUJBQU8sSUFBSSxhQUFhLEVBQUU7Z0JBQ3hCLE9BQU8sR0FBa0IsYUFBYTtJQUN0QyxZQUFBLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSTtZQUMzQjtJQUNBLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQW1COztJQUczQyxRQUFBLE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sSUFBSyxPQUFlLENBQUM7a0JBQ3ZCLE9BQWUsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxZQUFZO2tCQUNoRSxTQUFTO1lBQ2YsSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUI7O2dCQUU5QixJQUFJLEdBQUcsbUJBQW1COztJQUc1QixRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7SUFBRSxZQUFBLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSTs7WUFHOUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO0lBQ2xELFlBQUEsT0FBTyxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsS0FBSyxNQUFNLEdBQUcsUUFBUSxHQUFHLFFBQVE7SUFFM0UsUUFBQSxJQUFJLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFBRTs7SUFFdkMsWUFBQXNCLDhCQUFzQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztvQkFDdEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0lBQzFCLGdCQUFBLFlBQVksRUFBRSxZQUFZO29CQUMxQixPQUFPLEVBQUUsbUJBQW1CLEtBQUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSTtJQUNoRSxnQkFBQSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTOztJQUVqRSxnQkFBQSxJQUFJLEVBQUUsYUFBeUM7SUFDeEIsYUFBQSxDQUFDO1lBQzVCO2lCQUFPOzs7Z0JBSUwsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO0lBQ2YsZ0JBQUEsTUFBTSxJQUFJQyxnQ0FBd0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDOztJQUcxRCxZQUFBLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxJQUFJO0lBQ3pCLGdCQUFBRCw4QkFBc0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVzt3QkFDMUIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO0lBQ3hCLGlCQUFBLENBQUM7SUFFSixZQUFBLE1BQU0sUUFBUSxHQUFHQSw4QkFBc0IsRUFBRTtJQUN6QyxZQUFBLG9CQUFvQixDQUNsQixNQUFNLENBQUMsV0FBVyxFQUNsQixZQUFZLEVBQ1osUUFBUSxDQUFDLE9BQU8sRUFDaEIsT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLENBQUMsU0FBUyxFQUNsQixPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUM5QztJQUVELFlBQUEsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO0lBQ3JCLGdCQUFBQSw4QkFBc0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ3hDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVztJQUMxQixvQkFBQSxZQUFZLEVBQUUsWUFBWTtJQUMxQixvQkFBQSxRQUFRLEVBQ04sT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLOzhCQUN6QixPQUFPLENBQUM7SUFDViwwQkFBRSxXQUFXO0lBQ08saUJBQUEsQ0FBQztnQkFDN0I7WUFDRjtJQUNGLElBQUEsQ0FBQztJQUNIOztJQzFOTSxTQUFVLGdCQUFnQixDQUFDLE9BQXVCLEVBQUE7UUFDdEQsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBO0lBQzdDLFFBQUEsTUFBTSxRQUFRLEdBQUdBLDhCQUFzQixFQUFFO1lBQ3pDLG9CQUFvQixDQUNsQixNQUFNLENBQUMsV0FBVyxFQUNsQixZQUFZLEVBQ1osUUFBUSxDQUFDLE9BQU8sRUFDTCxFQUFFLEVBQ2IsWUFBWSxFQUNaLFFBQVEsQ0FBQyxTQUFTLENBQ25CO0lBQ0gsSUFBQSxDQUFDO0lBQ0g7O0lDWk0sU0FBVSxnQkFBZ0IsQ0FBQyxPQUF1QixFQUFBO1FBQ3RELE9BQU8sVUFBVSxNQUFXLEVBQUUsWUFBaUIsRUFBQTtJQUM3QyxRQUFBLE1BQU0sUUFBUSxHQUFHQSw4QkFBc0IsRUFBRTtZQUN6QyxvQkFBb0IsQ0FDbEIsTUFBTSxDQUFDLFdBQVcsRUFDbEIsWUFBWSxFQUNaLFFBQVEsQ0FBQyxPQUFPLEVBQ0wsRUFBRSxFQUNiLFlBQVksRUFDWixRQUFRLENBQUMsU0FBUyxDQUNuQjtJQUNILElBQUEsQ0FBQztJQUNIOztVQ2ZhLFdBQVcsQ0FBQTtJQUN0Qjs7OztJQUlHO1FBQ0gsT0FBTyxRQUFRLENBQUMsR0FBUSxFQUFBO1lBQ3RCLE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQ2hEO0lBRUE7Ozs7SUFJRztRQUNILE9BQU8sZ0JBQWdCLENBQUMsR0FBUSxFQUFBO0lBQzlCLFFBQUEsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUztRQUM3RTtJQWtDQTs7Ozs7SUFLRztJQUNILElBQUEsT0FBTyxNQUFNLENBQUMsTUFBYyxFQUFFLEdBQUcsT0FBYyxFQUFBO0lBQzdDLFFBQUEsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7Z0JBQzVCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNwRCxNQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDdEM7WUFDRjtRQUNGO0lBY0Q7O0lDckREOzs7SUFHRzthQUNhLFFBQVEsQ0FDdEIsb0JBQThELEVBQzlELG9CQUFzRSxFQUN0RSxPQUF5QixFQUFBOztJQUd6QixJQUFBLElBQUksbUJBQWtEO0lBQ3RELElBQUEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDOUMsT0FBTyxHQUFvQixvQkFBb0I7UUFDakQ7YUFBTztZQUNMLG1CQUFtQixHQUFHLG9CQUEyQjtRQUNuRDtRQUVBLE9BQU8sVUFBVSxNQUFXLEVBQUUsWUFBaUIsRUFBQTtJQUM3QyxRQUFBLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sR0FBRyxFQUFxQjs7SUFHN0MsUUFBQSxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7WUFDNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUssT0FBZSxDQUFDLFdBQVcsRUFBRTs7SUFFdEQsWUFBQSxNQUFNLGFBQWEsR0FBSSxPQUFlLENBQUMsV0FBVyxDQUNoRCxhQUFhLEVBQ2IsTUFBTSxFQUNOLFlBQVksQ0FDYjtJQUNELFlBQUEsSUFDRSxhQUFhO0lBQ2IsZ0JBQUEsT0FBTyxhQUFhLENBQUMsSUFBSSxLQUFLLFFBQVE7SUFDdEMsZ0JBQUEsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTO29CQUU5QyxNQUFNLEdBQUcsSUFBSTtZQUNqQjtJQUVBLFFBQUEsTUFBTSxJQUFJLEdBQUdBLDhCQUFzQixFQUFFO1lBQ3JDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUNyQixPQUFPLEVBQ1AsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNwRTtJQUNELFFBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVztJQUMxQixZQUFBLFlBQVksRUFBRSxZQUFZOztJQUUxQixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxZQUFZLEVBQUUsWUFBWTtJQUMxQixZQUFBLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsWUFBQSxtQkFBbUIsRUFBRSxtQkFBbUI7SUFDeEMsWUFBQSxPQUFPLEVBQUUsT0FBTztJQUNPLFNBQUEsQ0FBQztJQUM1QixJQUFBLENBQUM7SUFDSDs7SUMxRUE7Ozs7SUFJRzthQUNhLFNBQVMsQ0FDdkIsb0JBQThELEVBQzlELFdBQTBDLEVBQzFDLE9BQXlCLEVBQUE7UUFFekIsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBO0lBQzdDLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQXFCOztZQUc3QyxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJO1lBQzdDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFLLE9BQWUsQ0FBQyxXQUFXLEVBQUU7O0lBRXRELFlBQUEsTUFBTSxhQUFhLEdBQUksT0FBZSxDQUFDLFdBQVcsQ0FDaEQsYUFBYSxFQUNiLE1BQU0sRUFDTixZQUFZLENBQ2I7SUFDRCxZQUFBLElBQ0UsYUFBYTtJQUNiLGdCQUFBLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RDLGdCQUFBLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUztvQkFFOUMsTUFBTSxHQUFHLElBQUk7WUFDakI7SUFFQSxRQUFBLE1BQU0sSUFBSSxHQUFHQSw4QkFBc0IsRUFBRTtZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDckIsT0FBTyxFQUNQLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEU7SUFDRCxRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7SUFDMUIsWUFBQSxZQUFZLEVBQUUsWUFBWTs7SUFFMUIsWUFBQSxNQUFNLEVBQUUsTUFBTTtJQUNkLFlBQUEsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBQSxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLFlBQUEsbUJBQW1CLEVBQUUsV0FBVztJQUNoQyxZQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ08sU0FBQSxDQUFDO0lBQzVCLElBQUEsQ0FBQztJQUNIOztJQ3hCQTs7OztJQUlHO2FBQ2EsU0FBUyxDQUN2QixvQkFBOEQsRUFDOUQsb0JBQXNFLEVBQ3RFLE9BQXlCLEVBQUE7O0lBR3pCLElBQUEsSUFBSSxtQkFBa0Q7SUFDdEQsSUFBQSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUM5QyxPQUFPLEdBQW9CLG9CQUFvQjtRQUNqRDthQUFPO1lBQ0wsbUJBQW1CLEdBQUcsb0JBQTJCO1FBQ25EO1FBRUEsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBO0lBQzdDLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQXFCOztZQUc3QyxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJO1lBQzdDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFLLE9BQWUsQ0FBQyxXQUFXLEVBQUU7O0lBRXRELFlBQUEsTUFBTSxhQUFhLEdBQUksT0FBZSxDQUFDLFdBQVcsQ0FDaEQsYUFBYSxFQUNiLE1BQU0sRUFDTixZQUFZLENBQ2I7SUFDRCxZQUFBLElBQ0UsYUFBYTtJQUNiLGdCQUFBLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RDLGdCQUFBLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUztvQkFFOUMsTUFBTSxHQUFHLElBQUk7WUFDakI7SUFFQSxRQUFBLE1BQU0sSUFBSSxHQUFHQSw4QkFBc0IsRUFBRTtZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDckIsT0FBTyxFQUNQLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEU7SUFDRCxRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7SUFDMUIsWUFBQSxZQUFZLEVBQUUsWUFBWTs7SUFFMUIsWUFBQSxZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLFlBQUEsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLFlBQUEsT0FBTyxFQUFFLE9BQU87SUFDTyxTQUFBLENBQUM7SUFDNUIsSUFBQSxDQUFDO0lBQ0g7O0lDdERBOzs7O0lBSUc7YUFDYSxVQUFVLENBQ3hCLG9CQUE4RCxFQUM5RCxvQkFBc0UsRUFDdEUsT0FBeUIsRUFBQTs7SUFHekIsSUFBQSxJQUFJLG1CQUFrRDtJQUN0RCxJQUFBLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQzlDLE9BQU8sR0FBb0Isb0JBQW9CO1FBQ2pEO2FBQU87WUFDTCxtQkFBbUIsR0FBRyxvQkFBMkI7UUFDbkQ7UUFFQSxPQUFPLFVBQVUsTUFBVyxFQUFFLFlBQWlCLEVBQUE7SUFDN0MsUUFBQSxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLEdBQUcsRUFBcUI7O0lBRzdDLFFBQUEsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJO1lBQ2xDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFLLE9BQWUsQ0FBQyxXQUFXLEVBQUU7O0lBRXRELFlBQUEsTUFBTSxhQUFhLEdBQUksT0FBZSxDQUFDLFdBQVcsQ0FDaEQsYUFBYSxFQUNiLE1BQU0sRUFDTixZQUFZLENBQ2I7SUFDRCxZQUFBLElBQ0UsYUFBYTtJQUNiLGdCQUFBLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RDLGdCQUFBLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUztvQkFFOUMsTUFBTSxHQUFHLElBQUk7WUFDakI7SUFFQSxRQUFBLE1BQU0sSUFBSSxHQUFHQSw4QkFBc0IsRUFBRTtZQUNyQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDckIsT0FBTyxFQUNQLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEU7SUFDRCxRQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVc7SUFDMUIsWUFBQSxZQUFZLEVBQUUsWUFBWTs7SUFFMUIsWUFBQSxZQUFZLEVBQUUsY0FBYztJQUM1QixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLFlBQUEsbUJBQW1CLEVBQUUsbUJBQW1CO0lBQ3hDLFlBQUEsT0FBTyxFQUFFLE9BQU87SUFDTyxTQUFBLENBQUM7SUFDNUIsSUFBQSxDQUFDO0lBQ0g7O0lDOUJBOzs7O0lBSUc7SUFDRyxTQUFVLHNCQUFzQixDQUNwQyxpQkFPeUMsRUFDekMsWUFHeUMsRUFBQTs7UUFHekMsTUFBTSxPQUFPLEdBQWtCLEVBQUU7SUFDakMsSUFBQSxJQUFJLFFBQXFEO1FBQ3pELElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVE7Z0JBQ3ZDLFFBQVEsR0FBRyxpQkFJRztJQUVoQixRQUFBLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUMzQyxRQUFRLEdBQUcsV0FBVztJQUN0QixZQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDO1lBQzNDO1FBQ0Y7YUFBTztZQUNMLFFBQVEsR0FBRyxXQUFXO1FBQ3hCO0lBQ0EsSUFBQSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO0lBQUUsUUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7UUFFNUUsT0FBTyxVQUFVLE1BQVcsRUFBRSxZQUFpQixFQUFBOztJQUU3QyxRQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUNqQixJQUFJLFFBQVEsS0FBSyxXQUFXLElBQUksUUFBUSxLQUFLLFVBQVUsRUFBRTtJQUN2RCxnQkFBQSxPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU07Z0JBQ3ZCO0lBQU8saUJBQUEsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFO0lBQzlCLGdCQUFBLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTTtnQkFDdkI7SUFBTyxpQkFBQSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7SUFDL0IsZ0JBQUEsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLO2dCQUN0QjtZQUNGOztJQUdBLFFBQUEsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJO0lBRXRCLFFBQUEsTUFBTSxRQUFRLEdBQUdBLDhCQUFzQixFQUFFO0lBQ3pDLFFBQUEsb0JBQW9CLENBQ2xCLE1BQU0sQ0FBQyxXQUFXLEVBQ2xCLFlBQVksRUFDWixRQUFRLENBQUMsT0FBTyxFQUNoQixPQUFPLEVBQ1AsU0FBUyxFQUNULFFBQVEsQ0FBQyxTQUFTLENBQ25COztJQUVELFFBQUFBLDhCQUFzQixFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDeEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0lBQzFCLFlBQUEsWUFBWSxFQUFFLFlBQVk7SUFDMUIsWUFBQSxRQUFRLEVBQUUsUUFBUTtJQUNNLFNBQUEsQ0FBQztJQUM3QixJQUFBLENBQUM7SUFDSDs7SUNwRkE7Ozs7SUFJRztJQUNHLFNBQVUsYUFBYSxDQUMzQixhQUFpRCxFQUNqRCxPQUE4QixFQUFBO1FBRTlCLE9BQU8sVUFBVSxNQUFXLEVBQUUsWUFBaUIsRUFBQTs7SUFFN0MsUUFBQSxJQUFJLElBQTRCO1lBQ2hDLElBQ0UsT0FBTyxhQUFhLEtBQUssUUFBUTtJQUNqQyxZQUFBLGFBQWEsS0FBSyxNQUFNO0lBQ3hCLFlBQUEsYUFBYSxLQUFLLE9BQU87Z0JBQ3pCLGFBQWEsS0FBSyxNQUFNLEVBQ3hCO2dCQUNBLElBQUksR0FBRyxhQUEyQjtZQUNwQztpQkFBTztnQkFDTCxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQXdCLGFBQWEsQ0FBQztZQUNsRTtJQUNBLFFBQUEsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxHQUFHLEVBQTBCOztJQUdsRCxRQUFBLE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sSUFBSyxPQUFlLENBQUM7a0JBQ3ZCLE9BQWUsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxZQUFZO2tCQUNoRSxTQUFTO1lBQ2YsSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUI7Z0JBQUUsSUFBSSxHQUFHLG1CQUFtQjs7SUFHNUQsUUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJO0lBQUUsWUFBQSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUk7O1lBRzlDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtJQUFFLFlBQUEsTUFBTSxJQUFJQyxnQ0FBd0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDOztZQUczRSxJQUFJLE9BQU8sQ0FBQyxRQUFRO0lBQ2xCLFlBQUEsTUFBTSxJQUFJQywwQ0FBa0MsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDOztJQUdwRSxRQUFBLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSTtJQUV0QixRQUFBLE1BQU0sUUFBUSxHQUFHRiw4QkFBc0IsRUFBRTtJQUN6QyxRQUFBLG9CQUFvQixDQUNsQixNQUFNLENBQUMsV0FBVyxFQUNsQixZQUFZLEVBQ1osUUFBUSxDQUFDLE9BQU8sRUFDaEIsT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLENBQUMsU0FBUyxDQUNuQjtJQUVELFFBQUEsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO0lBQ3JCLFlBQUFBLDhCQUFzQixFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDeEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0lBQzFCLGdCQUFBLFlBQVksRUFBRSxZQUFZO0lBQzFCLGdCQUFBLFFBQVEsRUFDTixPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUs7MEJBQ3pCLE9BQU8sQ0FBQztJQUNWLHNCQUFFLFdBQVc7SUFDTyxhQUFBLENBQUM7WUFDN0I7SUFDRixJQUFBLENBQUM7SUFDSDs7SUNwRkE7OztJQUdHO0lBQ0csU0FBVSxNQUFNLENBQ3BCLGFBQXNDLEVBQ3RDLFlBQTRCLEVBQUE7UUFFNUIsTUFBTSxPQUFPLEdBR1UsRUFBRTtJQUN6QixJQUFBLE1BQU0sSUFBSSxHQUF1RCxPQUFPLENBQUMsSUFBSTtJQUU3RSxJQUFBLE9BQU8sVUFBVSxNQUFNLEVBQUE7SUFDckIsUUFBQSxNQUFNLE1BQU0sR0FBR0EsOEJBQXNCLEVBQUUsQ0FBQyxNQUFNO1lBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDVixZQUFBLE1BQU0sRUFBRSxNQUFNO0lBQ2QsWUFBQSxJQUFJLEVBQUUsSUFBSTtJQUNWLFlBQUEsSUFBSSxFQUFFLFNBQVM7SUFDZixZQUFBLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUztJQUN0RCxZQUFBLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUztJQUNuRCxZQUFBLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUztJQUN6RCxZQUFBLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUztnQkFDbkQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO2dCQUNoQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7SUFDbEMsWUFBQSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVM7SUFDbEMsU0FBQSxDQUFDO0lBQ3pCLElBQUEsQ0FBQztJQUNIOztJQ3ZDTyxNQUFNLGlCQUFpQixHQUFHLEdBQUc7SUFDN0IsTUFBTSxPQUFPLEdBQUcsT0FBTztJQUU5QixTQUFTLGtCQUFrQixDQUN6QixHQUF3QixFQUN4QixJQUFZLEVBQ1osV0FBbUIsaUJBQWlCLEVBQUE7UUFFcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxPQUFPLEdBQUcsR0FBRztJQUVqQixJQUFBLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQ0UsT0FBTyxLQUFLLElBQUk7SUFDaEIsWUFBQSxPQUFPLEtBQUssU0FBUztnQkFDckIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztJQUVuRCxZQUFBLE9BQU8sU0FBUztJQUNsQixRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3hCO0lBRUEsSUFBQSxPQUFPLE9BQU87SUFDaEI7SUFFQSxTQUFTLGtCQUFrQixDQUN6QixHQUF3QixFQUN4QixJQUFZLEVBQ1osS0FBVSxFQUNWLFFBQVEsR0FBRyxpQkFBaUIsRUFBQTtRQUU1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLE9BQU8sR0FBcUIsR0FBRztJQUVuQyxJQUFBLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO0lBQ3RCLFFBQUEsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRTtJQUNyQixZQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CO0lBQ0EsUUFBQSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN4QjtJQUVBLElBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSztJQUN4QztVQVlhLFFBQVEsQ0FBQTtpQkFDSixJQUFBLENBQUEsU0FBUyxHQUFrQyxFQUFFLENBQUM7aUJBRXRELElBQUEsQ0FBQSxRQUFRLEdBQUcsaUJBQWlCLENBQUM7aUJBQzdCLElBQUEsQ0FBQSxPQUFPLEdBQUcsT0FBTyxDQUFDO2lCQUNsQixJQUFBLENBQUEsTUFBTSxHQUFZLElBQUksQ0FBQztJQUU5QixJQUFBLFdBQUEsR0FBQSxFQUF1QjtRQUV2QixPQUFPLGFBQWEsQ0FBQyxLQUF1QixFQUFBO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQzVCLFFBQUEsSUFBSSxDQUFDLElBQUk7SUFBRSxZQUFBLE9BQU8sU0FBUztZQUMzQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNyQztRQUVBLE9BQU8sRUFBRSxDQUFDLEtBQXVCLEVBQUE7WUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDNUIsUUFBQSxJQUFJLENBQUMsSUFBSTtJQUFFLFlBQUEsT0FBTyxTQUFTO1lBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDO0lBRUEsSUFBQSxPQUFPLElBQUksQ0FBQyxLQUF1QixFQUFFLElBQVksRUFBQTtZQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQztJQUVBLElBQUEsT0FBTyxLQUFLLENBQUMsS0FBdUIsRUFBRSxJQUFZLEVBQUE7SUFDaEQsUUFBQSxJQUFJLFVBQVUsR0FBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFBLFdBQUEsRUFBYyxJQUFJLENBQUEsQ0FBRSxDQUFDO0lBQzNELFFBQUEsSUFBSSxDQUFDLFVBQVU7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFBLFNBQUEsRUFBWSxJQUFJLENBQUEsY0FBQSxFQUFpQixLQUFLLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FBQztJQUNoRSxRQUFBLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQyxRQUFBLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDbkMsWUFBQSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7SUFDbkIsZ0JBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVU7SUFDbEMsZ0JBQUEsSUFBSSxVQUFVLENBQUNGLGtDQUFjLENBQUMsSUFBSSxDQUFDO0lBQ2pDLG9CQUFBLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQ0Esa0NBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkU7WUFDRjtJQUNBLFFBQUEsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNuQztJQUlBLElBQUEsT0FBTyxHQUFHLENBQUMsS0FBdUIsRUFBRSxHQUFZLEVBQUE7WUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFBRSxZQUFBLE9BQU8sU0FBUztJQUM3QyxRQUFBLElBQUksQ0FBQyxHQUFHO0lBQUUsWUFBQSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLFFBQUEsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZFO0lBRUEsSUFBQSxPQUFPLEdBQUcsQ0FBQyxLQUF1QixFQUFFLEdBQVcsRUFBRSxLQUFVLEVBQUE7WUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsUUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFBRSxZQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBUztZQUMvRCxJQUNFLElBQUksQ0FBQyxNQUFNO0lBQ1gsWUFBQSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUMxRDtnQkFDQSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO0lBQ3pDLGdCQUFBLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLGdCQUFBLFlBQVksRUFBRSxLQUFLO0lBQ25CLGdCQUFBLFFBQVEsRUFBRSxLQUFLO0lBQ2YsZ0JBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzlCLGFBQUEsQ0FBQztZQUNKO0lBQ0EsUUFBQSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2RTs7SUFHSSxTQUFVLE1BQU0sQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFBO1FBQzVDLE9BQU8sU0FBUyxNQUFNLENBQ3BCLEtBQWE7O1FBRWIsSUFBVTs7UUFFVixVQUErQixFQUFBO1lBRS9CLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBWSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7SUFDeEMsSUFBQSxDQUFDO0lBQ0g7YUFFZ0IsUUFBUSxHQUFBO0lBQ3RCLElBQUEsT0FBTyxTQUFTLFFBQVEsQ0FBQyxLQUFhLEVBQUUsSUFBUyxFQUFBO0lBQy9DLFFBQUEsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQzNCLDZCQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDdEUsUUFBQSxPQUFPLE1BQU0sQ0FBQyxDQUFBLFNBQUEsRUFBWSxJQUFJLENBQUEsQ0FBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDNUQsSUFBQSxDQUFDO0lBQ0g7O0lDcERPLGVBQWUsOEJBQThCLENBS2xELE9BQThCLEVBQzlCLElBQVMsRUFDVCxHQUFZLEVBQ1osS0FBUSxFQUFBO0lBRVIsSUFBQSxJQUFJO1lBQ0YsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDaEMsUUFBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBcUI7O1FBRXBDO1FBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsUUFBQSxNQUFNLElBQUlPLDBCQUFhLENBQ3JCLGdFQUFnRSxDQUNqRTtRQUNIO0lBQ0Y7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQStCRztJQUNHLE1BQU8sY0FBZSxTQUFRYyxZQUtuQyxDQUFBO0lBR0MsSUFBQSxJQUFJLFVBQVUsR0FBQTtJQUNaLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLE1BQU0sTUFBTSxHQUFHQSxZQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDM0MsWUFBQSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUlXLGtCQUFVLENBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtJQUN6QixnQkFBQSxRQUFRLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUNoQyw2QkFBUyxDQUFDLE1BQXdCLENBQUMsQ0FBQztJQUNuRSxhQUFBLENBQUMsQ0FDSDtZQUNIO1lBQ0EsT0FBTyxJQUFJLENBQUMsV0FBVztRQUN6Qjs7UUFHQSxXQUFBLENBQVksT0FBMEIsRUFBRSxLQUFjLEVBQUE7SUFDcEQsUUFBQSxLQUFLLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7UUFDdkM7SUFFbUIsSUFBQSxNQUFNLEtBQUssQ0FDNUIsU0FBd0IsRUFDeEIsS0FBcUIsRUFDckIsS0FBNEIsRUFBQTtJQUU1QixRQUFBLE1BQU0sQ0FBQyxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUNwRCxRQUFBLE1BQU0sTUFBTSxHQUFRO2dCQUNsQixJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVzthQUN2RTtJQUNELFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUU7WUFFckIsTUFBTSxVQUFVLEdBQWEsRUFBRTtJQUMvQixRQUFBLElBQUksU0FBUyxLQUFLZ0IsMEJBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3RDLE1BQU0sRUFBRSxHQUFHZCwyQkFBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDL0IsWUFBQSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQVksQ0FBQztZQUMvQjtJQUVBLFFBQUEsSUFDRSxTQUFTLEtBQUtjLDBCQUFhLENBQUMsTUFBTTtJQUNsQyxZQUFBLFNBQVMsS0FBS0EsMEJBQWEsQ0FBQyxNQUFNLEVBQ2xDO0lBQ0EsWUFBQSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQTBCLEVBQUUsR0FBRyxLQUFJO0lBQ3JFLGdCQUFBLE1BQU0sSUFBSSxHQUFHVSxxQkFBVSxDQUFDLHFCQUFxQixDQUMzQ0Msa0NBQWMsQ0FBQyxPQUFPLEVBQ3RCLENBQUMsRUFDRCxHQUFHLEVBQ0gsSUFBSSxDQUNMO0lBQ0QsZ0JBQUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQzlCLENBQUMsR0FBUSxLQUNQLEdBQUcsQ0FBQyxHQUFHLEtBQUtNLG1CQUFNLENBQUMsU0FBUztJQUM1QixvQkFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUNoRDtvQkFDRCxJQUFJLEdBQUcsRUFBRTtJQUNQLG9CQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSztvQkFDeEI7SUFDQSxnQkFBQSxPQUFPLEtBQUs7Z0JBQ2QsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFFTixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QztZQUVBLE1BQU0sQ0FBQywyQkFBMkIsR0FBRyxDQUNuQyxDQUFDLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxDQUFDLDJCQUEyQixHQUFHLEVBQUUsRUFDbEUsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ3ZCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFpQjtRQUNqRDtRQUdtQixRQUFRLEdBQUE7WUFDekIsT0FBTyxJQUFJLGVBQWUsRUFBRTtRQUM5QjtRQUdTLFVBQVUsR0FBQTtJQUNqQixRQUFBLE9BQU9uQix5QkFBaUI7UUFDMUI7SUFFQTs7Ozs7SUFLRztRQUVILFNBQVMsR0FBQTtJQUNQLFFBQUEsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQztRQUNuQztJQUVBOzs7OztJQUtHO0lBRUcsSUFBTixNQUFNLFFBQVEsQ0FBQyxPQUF3QixFQUFBO0lBQ3JDLFFBQUEsT0FBTyxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQzNDO0lBRUE7Ozs7SUFJRztJQUNILElBQUEsTUFBTSxVQUFVLEdBQUE7SUFDZCxRQUFBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVO0lBQzFCLFFBQUEsSUFBSTtJQUNGLFlBQUEsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFO1lBQ3ZCO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO0lBQ0EsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3pDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQSxFQUFHLElBQUksQ0FBQyxPQUFPLENBQUEsb0JBQUEsQ0FBc0IsQ0FBQztRQUNwRDtJQUVBOzs7Ozs7SUFNRztJQUVhLElBQU4sTUFBTSxLQUFLLENBQ25CLEdBQUcsTUFBd0IsRUFBQTtJQUUzQixRQUFBLE1BQU0sT0FBTyxHQUFtQixlQUFlLENBQUMsTUFBTSxDQUFDO0lBRXZELFFBQUEsSUFBSTtnQkFDRixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUVwQyxZQUFBLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFO0lBQzNCLGdCQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUN4RDtnQkFFQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUN2QztZQUFFLE9BQU8sQ0FBVSxFQUFFO2dCQUNuQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUN2QyxZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVBOzs7Ozs7SUFNRztRQUNNLE1BQU0sR0FBRyxDQUFJLENBQWUsRUFBQTtJQUNuQyxRQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEMsUUFBQSxJQUFJO0lBQ0YsWUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO0lBQUUsZ0JBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtZQUN4RTtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztJQUNBLFFBQUEsSUFBSTtJQUNGLFlBQUEsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDO2dCQUMzQixHQUFHLENBQUMsS0FBSyxDQUNQLENBQUEsaUJBQUEsRUFBcUIsS0FBNEMsQ0FBQyxNQUFNLEVBQUUsQ0FBQSxDQUFFLENBQzdFO0lBQ0QsWUFBQSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDM0QsWUFBQSxPQUFPLFFBQWE7WUFDdEI7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVTLElBQUEsT0FBTyxDQUNkLEtBQVEsRUFDUixFQUFXLEVBQ1gsS0FBSyxHQUFHLEtBQUssRUFBQTtZQU1iLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUV6QyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDdEQsQ0FBQyxLQUEwQixFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFJO2dCQUMzQyxJQUFJLEdBQUcsS0FBS0Qsb0JBQWUsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDMUQsZ0JBQUEsT0FBTyxLQUFLO0lBQ2QsWUFBQSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7SUFDdkIsZ0JBQUEsT0FBTyxLQUFLO2dCQUNkO0lBRUEsWUFBQSxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUU7b0JBQ3pCLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25DO0lBQU8saUJBQUEsSUFBSVMseUJBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDL0IsZ0JBQUEsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFcEIsMkJBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTTtnQkFDcEU7cUJBQU87b0JBQ0wsUUFBUSxPQUFPLEtBQUs7SUFDbEIsb0JBQUEsS0FBSyxRQUFRO0lBQ1gsd0JBQUEsS0FBSyxHQUFHLENBQUEsRUFBRyxLQUFLLENBQUEsQ0FBRTs0QkFDbEI7OztnQkFJTjtJQUNBLFlBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7SUFDbEIsWUFBQSxPQUFPLEtBQUs7WUFDZCxDQUFDLEVBQ0QsRUFBRSxDQUNIO0lBQ0QsUUFBQSxNQUFNLE1BQU0sR0FBaUNvQix5QkFBSyxDQUFDLEdBQUcsQ0FDcEQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3ZCO0lBQ0QsUUFBQSxJQUFJLENBQUMsTUFBTTtnQkFDVCxNQUFNLElBQUlmLDBCQUFhLENBQ3JCLENBQUEsTUFBQSxFQUFTLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFBLHNCQUFBLENBQXdCLENBQ3hEO1lBQ0gsTUFBTSxNQUFNLEdBQUc7a0JBQ1gsSUFBSyxNQUFjLENBQUNQLDZCQUFTLENBQUMsTUFBNkIsQ0FBQztJQUM5RCxjQUFFLElBQUksTUFBTSxFQUFFO0lBQ2hCLFFBQUEsSUFBSSxLQUFLO0lBQ1AsWUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUU7SUFDM0MsZ0JBQUEsWUFBWSxFQUFFLEtBQUs7SUFDbkIsZ0JBQUEsVUFBVSxFQUFFLEtBQUs7SUFDakIsZ0JBQUEsS0FBSyxFQUFHLE1BQWMsQ0FBQ0EsNkJBQVMsQ0FBQyxNQUE2QixDQUFDO0lBQy9ELGdCQUFBLFFBQVEsRUFBRSxLQUFLO0lBQ2hCLGFBQUEsQ0FBQztJQUNKLFFBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUNyQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxHQUEwQixDQUFDLEdBQUcsR0FBRyxDQUFDLENBQzNEO0lBQ0QsUUFBQSxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU07SUFDeEIsUUFBQSxPQUFPLFFBQVE7UUFDakI7UUFFUyxNQUFNLENBQ2IsR0FBd0IsRUFDeEIsS0FBOEIsRUFDOUIsRUFBVyxFQUNYLEVBQTRCLEVBQzVCLFNBQStCLEVBQUE7SUFFL0IsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JDLElBQUksU0FBUyxFQUFFO0lBQ2IsWUFBQSxHQUFHLENBQUMsT0FBTyxDQUNULENBQUEsZ0NBQUEsRUFBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBRSxDQUN2RTtJQUNELFlBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSTtvQkFDL0MsSUFBSSxHQUFHLElBQUksR0FBRzt3QkFDWixNQUFNLElBQUlPLDBCQUFhLENBQ3JCLENBQUEsbUJBQUEsRUFBc0IsR0FBRyxDQUFBLHlCQUFBLEVBQTRCLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQSxzQkFBQSxDQUF3QixDQUM1SDtJQUNGLGdCQUFBLEdBQVMsQ0FBQyxHQUFjLENBQUMsR0FBRyxHQUFHO0lBQ2xDLFlBQUEsQ0FBQyxDQUFDO1lBQ0o7SUFFQSxRQUFBLE9BQU8sSUFBSyxLQUF3QixDQUFDLEdBQUcsQ0FBQztRQUMzQztJQUVBOzs7Ozs7OztJQVFHO1FBQ00sTUFBTSxNQUFNLENBQ25CLFNBQWlCLEVBQ2pCLEVBQW1CLEVBQ25CLEtBQTBCLEVBQzFCLEVBQVU7O0lBRVYsSUFBQSxHQUFHLElBQVcsRUFBQTtZQUVkLE1BQU0sQ0FBQyxHQUF1QixTQUEwQztZQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDN0MsUUFBQSxJQUFJLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBRTtJQUM3QixZQUFBLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNsQyxnQkFBQSxLQUFLLEVBQUU7d0JBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNULGlCQUFBO0lBQ0YsYUFBQSxDQUFDO2dCQUNGLElBQUksUUFBUSxFQUFFO0lBQ1osZ0JBQUEsTUFBTSxJQUFJMkIsMEJBQWEsQ0FDckIsQ0FBQSwrQkFBQSxFQUFrQzdCLGVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUEsVUFBQSxFQUFhLEVBQUUsQ0FBQSxDQUFFLENBQ3ZFO2dCQUNIO1lBQ0Y7SUFDQSxRQUFBLElBQUk7SUFDRixZQUFBLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUMvQjtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO0lBRUE7Ozs7Ozs7SUFPRztJQUNNLElBQUEsTUFBTSxJQUFJLENBQ2pCLFNBQWlCLEVBQ2pCLEVBQW1CLEVBQ25CLEVBQVUsRUFBQTtZQUVWLE1BQU0sQ0FBQyxHQUF1QixTQUEwQztJQUN4RSxRQUFBLElBQUksTUFBVztJQUNmLFFBQUEsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBRXRELFlBQUEsTUFBTSxDQUFDLEdBQW1CO0lBQ3hCLGdCQUFBLEtBQUssRUFBRTt3QkFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ1QsaUJBQUE7SUFDRCxnQkFBQSxTQUFTLEVBQUUsU0FBUztJQUNwQixnQkFBQSxlQUFlLEVBQUU7SUFDZixvQkFBQSxTQUFTLEVBQUUsUUFBUTtJQUNwQixpQkFBQTtpQkFDRjtnQkFDRCxNQUFNLElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUF3QjtZQUMvRDtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztJQUNBLFFBQUEsT0FBTyxNQUFNO1FBQ2Y7SUFFQTs7Ozs7Ozs7SUFRRztRQUNNLE1BQU0sTUFBTSxDQUNuQixTQUFpQixFQUNqQixFQUFtQixFQUNuQixLQUEwQixFQUMxQixFQUFVOztJQUVWLElBQUEsR0FBRyxJQUFXLEVBQUE7WUFFZCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLEdBQXVCLFNBQTBDO0lBQ3hFLFFBQUEsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDN0MsWUFBQSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3pCO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7SUFFQTs7Ozs7OztJQU9HO0lBQ00sSUFBQSxNQUFNLE1BQU0sQ0FDbkIsU0FBaUIsRUFDakIsRUFBbUIsRUFDbkIsRUFBVTs7SUFFVixJQUFBLEdBQUcsSUFBVyxFQUFBO1lBRWQsTUFBTSxDQUFDLEdBQXVCLFNBQTBDO0lBQ3hFLFFBQUEsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hELFFBQUEsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7O2dCQUU3QyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ2pDLFlBQUEsT0FBTyxLQUFLO1lBQ2Q7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVTLElBQUEsTUFBTSxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEVBQXVCLEVBQ3ZCLEtBQTRCOztJQUU1QixJQUFBLEdBQUcsSUFBVyxFQUFBO1lBRWQsTUFBTSxDQUFDLEdBQXVCLFNBQTBDO0lBQ3hFLFFBQUEsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sTUFBTSxHQUFpQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLFNBQVMsRUFDVCxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ3JDLElBQUksQ0FDTDtZQUNIO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7SUFFUyxJQUFBLE1BQU0sT0FBTyxDQUNwQixTQUFpQixFQUNqQixFQUFnQyxFQUNoQyxFQUFVOztJQUVWLElBQUEsR0FBRyxJQUFXLEVBQUE7WUFFZCxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU07SUFBRSxZQUFBLE9BQU8sRUFBRTtZQUV6QixNQUFNLENBQUMsR0FBdUIsU0FBMEM7SUFDeEUsUUFBQSxJQUFJO2dCQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM3QyxZQUFBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHOEIsVUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdEM7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVTLElBQUEsTUFBTSxTQUFTLENBQ3RCLFNBQWlCLEVBQ2pCLEdBQXdCLEVBQ3hCLEtBQTRCLEVBQzVCLEVBQVUsRUFDVixHQUFHLElBQVcsRUFBQTtZQUVkLE1BQU0sTUFBTSxHQUFHLEVBQUU7SUFDakIsUUFBQSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRTtnQkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbEU7SUFDQSxRQUFBLE9BQU8sTUFBTTtRQUNmO0lBRVMsSUFBQSxNQUFNLFNBQVMsQ0FDdEIsU0FBaUIsRUFDakIsR0FBaUMsRUFDakMsRUFBVTs7SUFFVixJQUFBLEdBQUcsSUFBVyxFQUFBO1lBRWQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNO0lBQUUsWUFBQSxPQUFPLEVBQUU7WUFDMUIsTUFBTSxDQUFDLEdBQXVCLFNBQTBDO0lBQ3hFLFFBQUEsSUFBSTtnQkFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDN0MsWUFBQSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDckQsWUFBQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ3RCLFlBQUEsT0FBTyxNQUFNO1lBQ2Y7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtJQUVBOzs7Ozs7SUFNRztRQUNILFVBQVUsQ0FBQyxHQUFtQixFQUFFLE1BQWUsRUFBQTtZQUM3QyxPQUFPLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUMvQztJQUVBOzs7OztJQUtHO0lBQ2dCLElBQUEsVUFBVSxDQUFDLElBQVksRUFBQTtZQUN4QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQ3pDO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXlERztJQUNPLElBQUEsT0FBTyxVQUFVLENBQUMsR0FBbUIsRUFBRSxNQUFlLEVBQUE7WUFDOUQsSUFBSSxHQUFHLFlBQVl0QyxzQkFBUztJQUFFLFlBQUEsT0FBTyxHQUFVO0lBQy9DLFFBQUEsTUFBTSxJQUFJLEdBQVcsT0FBTyxHQUFHLEtBQUssUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTztJQUVoRSxRQUFBLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQztJQUM3QyxZQUFBLE9BQU8sSUFBSXFDLDBCQUFhLENBQUMsSUFBSSxDQUFDO0lBQ2hDLFFBQUEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDO0lBQ3hELFlBQUEsT0FBTyxJQUFJdkIsMEJBQWEsQ0FBQyxJQUFJLENBQUM7O0lBR2hDLFFBQUEsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFOztnQkFFckIsS0FBSyxPQUFPLENBQUM7Z0JBQ2IsS0FBSyxPQUFPLENBQUM7Z0JBQ2IsS0FBSyxPQUFPO0lBQ1YsZ0JBQUEsT0FBTyxJQUFJdUIsMEJBQWEsQ0FBQyxNQUFnQixDQUFDOztnQkFHNUMsS0FBSyxPQUFPLENBQUM7Z0JBQ2IsS0FBSyxPQUFPO0lBQ1YsZ0JBQUEsT0FBTyxJQUFJdkIsMEJBQWEsQ0FBQyxNQUFnQixDQUFDOztnQkFHNUMsS0FBSyxPQUFPO0lBQ1YsZ0JBQUEsT0FBTyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUM7O0lBRzVCLFlBQUE7b0JBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztJQUN4QyxvQkFBQSxPQUFPLElBQUl5QixvQkFBZSxDQUFDLEdBQUcsQ0FBQztJQUNqQyxnQkFBQSxPQUFPLElBQUk3QiwwQkFBYSxDQUFDLEdBQUcsQ0FBQzs7UUFFbkM7SUFFQSxJQUFBLGFBQWEsT0FBTyxDQUFDLE1BQXlCLEVBQUE7SUFDNUMsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJeUIsa0JBQVUsQ0FBQyxNQUFNLENBQUM7WUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhO0lBQUUsWUFBQSxNQUFNLEdBQUcsQ0FBQyxVQUFVLEVBQUU7SUFDOUMsUUFBQSxPQUFPLEdBQUc7UUFDWjtJQUVBLElBQUEsYUFBYSxjQUFjLENBQ3pCLFVBQXNCLEVBQ3RCLE1BQWMsRUFBQTtZQUVkLE1BQU0sR0FBRyxHQUFHUCxlQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDNUMsUUFBQSxHQUFHLENBQUMsT0FBTyxDQUFDLHFCQUFxQixNQUFNLENBQUEsQ0FBRSxDQUFDO0lBQzFDLFFBQUEsSUFBSTtnQkFDRixNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE1BQU0sQ0FBQSxDQUFFLENBQUM7SUFDbkQsWUFBQSxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixNQUFNLENBQUEsQ0FBRSxDQUFDO1lBQ3hDO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO1FBQ0Y7SUFFQSxJQUFBLGFBQWEsb0JBQW9CLENBQy9CLFVBQXNCLEVBQ3RCLElBQVksRUFBQTtZQUVaLE1BQU0sR0FBRyxHQUFHQSxlQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNsRCxRQUFBLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQSx3QkFBQSxDQUEwQixDQUFDO0lBQ3ZDLFFBQUEsSUFBSTtnQkFDRixNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQ3BCLENBQUE7Ozs7Ozs7Ozs7Ozs7OztBQWVOLENBQUEsQ0FBQSxDQUNLO2dCQUNELE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FDcEIsa0RBQWtELElBQUksQ0FBQSxDQUFBLENBQUcsQ0FDMUQ7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDOztBQUVwQixRQUFBLENBQUEsQ0FBQztJQUNKLFlBQUEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBLHVCQUFBLENBQXlCLENBQUM7WUFDckM7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtRQUVBLGFBQWEsY0FBYyxDQUN6QixVQUFzQixFQUN0QixNQUFjLEVBQ2QsSUFBYSxFQUFBO0lBRWIsUUFBQSxJQUFJO0lBQ0YsWUFBQSxJQUFJLElBQUk7b0JBQUUsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUEsU0FBQSxDQUFXLENBQUM7Z0JBQ2xFLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsTUFBTSxDQUFBLENBQUUsQ0FBQztZQUNuRDtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO1FBRUEsYUFBYSxVQUFVLENBQ3JCLFVBQXNCLEVBQ3RCLE1BQWMsRUFDZCxJQUFZLEVBQ1osUUFBZ0IsRUFBQTtJQUVoQixRQUFBLElBQUk7Z0JBQ0YsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUEsWUFBQSxFQUFlLElBQUksQ0FBQSxnQkFBQSxFQUFtQixRQUFRLENBQUEsQ0FBQSxDQUFHLENBQUM7Z0JBQ3pFLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBLDBCQUFBLEVBQTZCLE1BQU0sQ0FBQSxJQUFBLEVBQU8sSUFBSSxDQUFBLENBQUUsQ0FBQztnQkFFeEUsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxJQUFJLENBQUEsQ0FBRSxDQUFDO2dCQUNqRSxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLElBQUksQ0FBQSxDQUFFLENBQUM7Z0JBQ2xFLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FDcEIsMERBQTBELElBQUksQ0FBQSxDQUFFLENBQ2pFO2dCQUNELE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FDcEIsNkRBQTZELElBQUksQ0FBQSxDQUFFLENBQ3BFO2dCQUNELE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FDcEIsNkRBQTZELElBQUksQ0FBQSxDQUFFLENBQ3BFO2dCQUNELE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FDcEIsK0VBQStFLElBQUksQ0FBQSxDQUFFLENBQ3RGO2dCQUNELE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FDcEIsa0ZBQWtGLElBQUksQ0FBQSxDQUFFLENBQ3pGO1lBQ0g7WUFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQixZQUFBLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFVLENBQUM7WUFDbkM7UUFDRjtRQUVBLGFBQWEsVUFBVSxDQUNyQixNQUFrQixFQUNsQixJQUFZLEVBQ1osS0FBYSxFQUFBO0lBRWIsUUFBQSxJQUFJO2dCQUNGLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBLGtCQUFBLEVBQXFCLElBQUksQ0FBQSxJQUFBLEVBQU8sS0FBSyxDQUFBLENBQUUsQ0FBQztnQkFDM0QsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUNoQixrREFBa0QsSUFBSSxDQUFBLENBQUUsQ0FDekQ7Z0JBQ0QsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxJQUFJLENBQUEsQ0FBRSxDQUFDO2dCQUM5RCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLGdFQUFnRSxJQUFJLENBQUEsQ0FBRSxDQUN2RTtnQkFDRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLGdFQUFnRSxJQUFJLENBQUEsQ0FBRSxDQUN2RTtnQkFDRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLENBQUEsa0NBQUEsRUFBcUMsS0FBSyxDQUFBLDRDQUFBLEVBQStDLElBQUksQ0FBQSxDQUFFLENBQ2hHO2dCQUNELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FDaEIsQ0FBQSxrQ0FBQSxFQUFxQyxLQUFLLENBQUEsK0NBQUEsRUFBa0QsSUFBSSxDQUFBLENBQUEsQ0FBRyxDQUNwRztnQkFDRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLENBQUEsa0NBQUEsRUFBcUMsS0FBSyxDQUFBLCtDQUFBLEVBQWtELElBQUksQ0FBQSxDQUFFLENBQ25HO2dCQUNELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFBLFFBQUEsQ0FBVSxDQUFDO2dCQUNuRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLElBQUksQ0FBQSxDQUFBLENBQUcsQ0FBQztZQUNyRDtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO1FBRVEsT0FBTyxtQkFBbUIsQ0FDaEMsSUFBWSxFQUNaLElBQWEsRUFDYixJQUFJLEdBQUcsS0FBSyxFQUFBO0lBRVosUUFBQSxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7SUFDeEIsWUFBQSxLQUFLLFFBQVE7SUFDWCxnQkFBQSxPQUFPLElBQUksR0FBRyxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsTUFBTSxHQUFHLFNBQVM7SUFDOUQsWUFBQSxLQUFLLFFBQVE7b0JBQ1gsT0FBTyxJQUFJLEdBQUcsb0JBQW9CLEdBQUcsU0FBUztJQUNoRCxZQUFBLEtBQUssU0FBUztJQUNaLGdCQUFBLE9BQU8sU0FBUztJQUNsQixZQUFBLEtBQUssTUFBTTtJQUNULGdCQUFBLE9BQU8sV0FBVztJQUNwQixZQUFBLEtBQUssUUFBUTtvQkFDWCxPQUFPLElBQUksR0FBRyxvQkFBb0IsR0FBRyxRQUFRO2dCQUMvQyxTQUFTO29CQUNQLE1BQU0sQ0FBQyxHQUFHSCx5QkFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxFQUFFO0lBQ0wsb0JBQUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUU7SUFDbEIsb0JBQUEsTUFBTSxJQUFJLEdBQUdJLHFCQUFVLENBQUMsb0JBQW9CLENBQzFDLEVBQUUsRUFDRnhCLDJCQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUN0Qjt3QkFDRCxPQUFPO0lBQ0wsd0JBQUEsS0FBSyxFQUFFLENBQUM7SUFDUix3QkFBQSxNQUFNLEVBQUUsSUFBSTt5QkFDYjtvQkFDSDtJQUNBLGdCQUFBLE1BQU0sSUFBSUssMEJBQWEsQ0FBQyxxQkFBcUIsSUFBSSxDQUFBLENBQUUsQ0FBQztnQkFDdEQ7O1FBRUo7UUFFUSxPQUFPLHlCQUF5QixDQUN0QyxJQUFZLEVBQ1osSUFBWSxFQUNaLElBQWEsRUFDYixHQUFXLEVBQ1gsT0FBeUIsRUFBQTtZQUV6QixRQUFRLEdBQUc7Z0JBQ1QsS0FBS29CLGtDQUFjLENBQUMsUUFBUTtJQUMxQixnQkFBQSxPQUFPLFVBQVU7Z0JBQ25CLEtBQUtBLGtDQUFjLENBQUMsVUFBVTtJQUM1QixnQkFBQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxFQUFFO0lBQ3ZELG9CQUFBLE9BQU8sRUFBRTtvQkFDWDtvQkFDQSxPQUFPLENBQUEsQ0FBQSxFQUFLLE9BQXFDLENBQUNBLGtDQUFjLENBQUMsVUFBVSxDQUFDLEdBQUc7Z0JBQ2pGLEtBQUtBLGtDQUFjLENBQUMsVUFBVTtJQUM1QixnQkFBQSxPQUFPLENBQUEsV0FBQSxFQUFjLElBQUksQ0FBQSxnQ0FBQSxFQUFtQyxJQUFJLENBQUEsS0FBQSxFQUFTLE9BQXFDLENBQUNBLGtDQUFjLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQSxDQUFHO2dCQUM5SSxLQUFLQSxrQ0FBYyxDQUFDLE9BQU87Z0JBQzNCLEtBQUtBLGtDQUFjLENBQUMsR0FBRztnQkFDdkIsS0FBS0Esa0NBQWMsQ0FBQyxLQUFLO0lBQ3ZCLGdCQUFBLE9BQU8sQ0FBQSxXQUFBLEVBQWMsSUFBSSxDQUFBLHNCQUFBLEVBQXlCLElBQUksT0FBTyx3QkFBd0IsQ0FBRSxPQUFtQyxDQUFDQSxrQ0FBYyxDQUFDLE9BQU8sQ0FBVyxDQUFDLElBQUk7Z0JBQ25LLEtBQUtBLGtDQUFjLENBQUMsSUFBSTtnQkFDeEIsS0FBS0Esa0NBQWMsQ0FBQyxJQUFJO0lBQ3RCLGdCQUFBLE9BQU8sRUFBRTtnQkFDWCxLQUFLQSxrQ0FBYyxDQUFDLEdBQUc7SUFDckIsZ0JBQUEsT0FBTyxDQUFBLFdBQUEsRUFBYyxJQUFJLENBQUEsQ0FBQSxFQUFJLEdBQUcsaUJBQWlCLElBQUksQ0FBQSxJQUFBLEVBQVEsT0FBK0IsQ0FBQ0Esa0NBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRztnQkFDckgsS0FBS0Esa0NBQWMsQ0FBQyxHQUFHO0lBQ3JCLGdCQUFBLE9BQU8sQ0FBQSxXQUFBLEVBQWMsSUFBSSxDQUFBLENBQUEsRUFBSSxHQUFHLGlCQUFpQixJQUFJLENBQUEsSUFBQSxFQUFRLE9BQStCLENBQUNBLGtDQUFjLENBQUMsR0FBRyxDQUFDLEdBQUc7Z0JBQ3JILEtBQUtBLGtDQUFjLENBQUMsUUFBUTtJQUM1QixZQUFBO0lBQ0UsZ0JBQUEsTUFBTSxJQUFJcEIsMEJBQWEsQ0FBQyxxQkFBcUIsR0FBRyxDQUFBLENBQUUsQ0FBQzs7UUFFekQ7UUFFUSxPQUFPLHdCQUF3QixDQUNyQyxJQUFZLEVBQ1osS0FBeUIsRUFDekIsRUFBVSxFQUNWLEdBQW9CLEVBQ3BCLE9BQTBCLEVBQUE7WUFFMUIsTUFBTSxTQUFTLEdBQUdGLGVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3pDLFFBQUEsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU87WUFDM0IsTUFBTSxVQUFVLEdBQUcsQ0FBQSxFQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLEdBQUcsRUFBRSxDQUFBLEVBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsR0FBRyxFQUFFLENBQUEsQ0FBRTtJQUMvRyxRQUFBLFFBQVEsQ0FBQSxTQUFBLEVBQVksR0FBRyxDQUFBLENBQUU7Z0JBQ3ZCLEtBQUtRLG9CQUFlLENBQUMsVUFBVTtvQkFDN0IsT0FBTyxDQUFBLGFBQUEsRUFBZ0IsSUFBSSxDQUFBLGFBQUEsRUFBZ0IsU0FBUyxJQUFJLEVBQUUsQ0FBQSxDQUFBLEVBQUksVUFBVSxDQUFBLENBQUU7SUFDNUUsWUFBQTtJQUNFLGdCQUFBLE1BQU0sSUFBSU4sMEJBQWEsQ0FBQywwQkFBMEIsR0FBRyxDQUFBLENBQUUsQ0FBQzs7UUFFOUQ7SUFFQSxJQUFBLGFBQWEsV0FBVyxDQUN0QixNQUFrQixFQUNsQixLQUFxQixFQUFBO1lBRXJCLE1BQU0sTUFBTSxHQUFxQyxFQUFFO0lBQ25ELFFBQUEsTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sU0FBUyxHQUFHRixlQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6QyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUdILDJCQUFjLENBQUMsQ0FBQyxDQUFDO1lBRWhDLElBQUksSUFBYSxFQUFFLE1BQWM7WUFDakMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBZ0I7SUFDL0QsUUFBQSxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRTtJQUM3QixZQUFBLElBQ0UsT0FBUSxJQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVTtJQUN6QyxnQkFBQSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztvQkFDL0IsSUFBSSxLQUFLLGFBQWEsRUFDdEI7b0JBQ0E7Z0JBQ0Y7SUFFQSxZQUFBLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRTtJQUNsQixZQUFBLE1BQU0sR0FBR0csZUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUU5QyxNQUFNLE9BQU8sR0FBR3FCLHFCQUFVLENBQUMscUJBQXFCLENBQzlDQyxrQ0FBYyxDQUFDLE9BQU8sRUFDdEIsQ0FBQyxFQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZixLQUFLLEVBQ0wsSUFBSSxDQUNMO0lBRUQsWUFBQSxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDN0MsQ0FBQyxLQUEwQixFQUFFLEVBQUUsS0FBSTtJQUNqQyxnQkFBQSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7SUFDekIsZ0JBQUEsSUFBSSxHQUFHLEtBQUszQiw2QkFBUyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQzJCLGtDQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDekQsb0JBQUEsS0FBSyxDQUFDQSxrQ0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHO0lBQzNCLHdCQUFBLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFjLENBQUM7NEJBQ25DLE9BQU8sRUFBRVUsMENBQXNCLENBQUMsSUFBSTtJQUNwQyx3QkFBQSxXQUFXLEVBQUUsOENBQThDO3lCQUM1RDtvQkFDSDtJQUFPLHFCQUFBLElBQUksR0FBRyxLQUFLVixrQ0FBYyxDQUFDLElBQUksRUFBRTs7SUFFdEMsb0JBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7b0JBQ3BCO0lBQ0EsZ0JBQUEsT0FBTyxLQUFLO2dCQUNkLENBQUMsRUFDRCxFQUFFLENBQ0g7Z0JBRUQsTUFBTSxNQUFNLEdBQUdELHFCQUFVLENBQUMscUJBQXFCLENBQzdDckIsZUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFDM0IsQ0FBQyxFQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDZixJQUFJLEVBQ0osSUFBSSxDQUNMO2dCQUVELE1BQU0sS0FBSyxHQUFhLEVBQUU7Z0JBQzFCLE1BQU0sV0FBVyxHQUFhLEVBQUU7Z0JBQ2hDLE1BQU0sV0FBVyxHQUFhLEVBQUU7Z0JBQ2hDLElBQUksUUFBUSxHQUE2QixTQUFTO2dCQUNsRCxJQUFJLFVBQVUsR0FBbUMsU0FBUztJQUMxRCxZQUFBLElBQUksT0FBWTtnQkFFaEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNyQyxnQkFBQSxRQUFRLEdBQUcsYUFBYSxDQUFDc0Isa0NBQWMsQ0FBQyxJQUFJLENBQWlCO29CQUU3RCxJQUFJLENBQUMsUUFBUSxFQUFFO0lBQ2Isb0JBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFBLHdCQUFBLENBQTBCLENBQUM7b0JBQzdDO0lBRUEsZ0JBQUEsSUFBSSxVQUFVLEdBR1osSUFBSSxDQUFDLG1CQUFtQixDQUN0QixPQUFRLFFBQVEsQ0FBQyxXQUFxQixDQUFDLENBQUMsQ0FBQyxLQUFLO0lBQzVDLHNCQUFHLFFBQVEsQ0FBQyxXQUFtQixDQUFDLENBQUMsQ0FBQzswQkFDL0IsUUFBUSxDQUFDLFdBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQ3BDLElBQUksQ0FDTDtJQUNILGdCQUFBLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFO0lBQ2xDLG9CQUFBLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7b0JBQ3BDO0lBQ0EsZ0JBQUEsSUFBSSxPQUFPLEdBR1QsVUFBVSxDQUFDLEtBRWdEO0lBRTdELGdCQUFBLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0lBQy9CLG9CQUFBLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtJQUMxQix3QkFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQzt3QkFDdEI7OztJQUlBLG9CQUFBLElBQUk7SUFDRix3QkFBQSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQTJCO0lBQ25ELHdCQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUksVUFBVSxFQUFFO0lBQzFCLHdCQUFBLE9BQU8sR0FBR3pCLDJCQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzNCLHdCQUFBLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ2hDLFVBQVUsQ0FBQyxNQUFnQixFQUMzQixLQUFLLEVBQ0wsSUFBSSxDQUNMOzRCQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO3dCQUM1Qzt3QkFBRSxPQUFPLENBQVUsRUFBRTtJQUNuQix3QkFBQSxJQUFJLEVBQUUsQ0FBQyxZQUFZZ0MsMEJBQWEsQ0FBQztJQUFFLDRCQUFBLE1BQU0sQ0FBQzt3QkFDNUM7b0JBQ0Y7b0JBRUEsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVztJQUN6QyxzQkFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEIsc0JBQUUsUUFBUSxDQUFDLFdBQVc7SUFDeEIsZ0JBQUEsRUFBRSxHQUFHLE9BQU8sRUFBRSxLQUFLLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUNsRCxNQUFNLEVBQ04sRUFBUyxFQUNULElBQUksRUFDSlAsa0NBQWMsQ0FBQyxVQUFVLEVBQ3hCLGFBQWEsQ0FDWkEsa0NBQWMsQ0FBQyxVQUFVLENBQ0ksSUFBSTtJQUNqQyxvQkFBQSxDQUFDQSxrQ0FBYyxDQUFDLFVBQVUsR0FBRyxHQUFHO0lBQ2pDLGlCQUFBLENBQ0Y7b0JBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQSxFQUFHLE1BQU0sSUFBSSxPQUFPLENBQUEsRUFBRyxhQUFhLENBQUEsQ0FBRTtvQkFFaEQsSUFBSSxJQUFJLEVBQUU7SUFDUixvQkFBQSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDbEI7eUJBQU87SUFDTCxvQkFBQSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDZjtJQUVBLGdCQUFBLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FDN0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUNGLENBQUMsQ0FBQ0Esa0NBQWMsQ0FBQyxJQUFJLEVBQUVBLGtDQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQVEsQ0FBQyxDQUN2RSxFQUFFO0lBQ0Qsb0JBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUMvQyxNQUFNLEVBQ04sRUFBUyxFQUNULElBQUksRUFDSixHQUFHLEVBQ0gsS0FBSyxDQUNOO0lBQ0Qsb0JBQUEsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQ3ZDLHdCQUFBLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO3dCQUM5Qjs2QkFBTzs0QkFDTCxJQUFJLFVBQVUsRUFBRTtJQUNkLDRCQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOzRCQUN4Qjt3QkFDRjtvQkFDRjtnQkFDRjs7O0lBSUEsWUFBQSxJQUFhLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDakQsZ0JBQUEsSUFBSSxDQUFDLFFBQVE7SUFBRSxvQkFBQSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUEsd0JBQUEsQ0FBMEIsQ0FBQztJQUMxRCxnQkFBQSxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7SUFDekMsb0JBQUEsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxTQUFTO0lBQ2hDLG9CQUFBLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FDOUMsTUFBTSxFQUNOLFVBQWdDLEVBQ2hDLE9BQU8sQ0FBQyxFQUFFLEVBQ1YsR0FBc0IsRUFDdEIsS0FBcUMsQ0FDdEM7SUFDRCxvQkFBQSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7SUFDcEMsd0JBQUEsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7d0JBQzlCOzZCQUFPO0lBQ0wsd0JBQUEsTUFBTSxJQUFJcEIsMEJBQWEsQ0FBQyx5QkFBeUIsR0FBRyxDQUFBLENBQUUsQ0FBQzt3QkFDekQ7b0JBQ0Y7Z0JBQ0Y7SUFFQSxZQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRztJQUN4QixnQkFBQSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDdEIsZ0JBQUEsTUFBTSxFQUFFLEVBQUU7SUFDVixnQkFBQSxVQUFVLEVBQUUsSUFBSTtJQUNoQixnQkFBQSxXQUFXLEVBQUUsV0FBVztJQUN4QixnQkFBQSxXQUFXLEVBQUUsV0FBVztpQkFDekI7WUFDSDtZQUVBLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEQsTUFBTSxXQUFXLEdBQUc7SUFDakIsYUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTTtpQkFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXO2lCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2QsTUFBTSxXQUFXLEdBQUc7SUFDakIsYUFBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTTtpQkFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXO2lCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2QsUUFBQSxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7WUFDakMsSUFBSSxXQUFXLEVBQUU7SUFDZixZQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3hCO1lBQ0EsTUFBTSxXQUFXLEdBQUcsQ0FBQSxhQUFBLEVBQWdCLFNBQVMsQ0FBQSxFQUFBLEVBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUEsQ0FBRztJQUN4RixRQUFBLElBQUk7SUFDRixZQUFBLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFDL0IsWUFBQSxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQ2hCLGlDQUFpQyxTQUFTO3NDQUNaLFNBQVM7O0FBRUYsNENBQUEsQ0FBQSxDQUN0QztZQUNIO1lBQUUsT0FBTyxDQUFVLEVBQUU7SUFDbkIsWUFBQSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBVSxDQUFDO1lBQ25DO0lBQ0EsUUFBQSxPQUFPLE1BQU07UUFDZjtJQUVBLElBQUEsYUFBYSxjQUFjLENBQUMsTUFBa0IsRUFBQTtZQUM1QyxNQUFNLFdBQVcsR0FBRyxDQUFBLG9CQUFBLENBQXNCO0lBQzFDLFFBQUEsSUFBSTtnQkFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBQzlDLFlBQUEsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWTtZQUMvQjtZQUFFLE9BQU8sQ0FBVSxFQUFFO0lBQ25CLFlBQUEsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQztZQUNuQztRQUNGO0lBRUEsSUFBQSxPQUFnQixVQUFVLEdBQUE7WUFDeEIsS0FBSyxDQUFDLFVBQVUsRUFBRTs7WUFHbEIsTUFBTSxRQUFRLEdBQUdjLFlBQU8sQ0FBQyxHQUFHLENBQUNSLG9CQUFlLENBQUMsS0FBSyxDQUFDO0lBQ25ELFFBQUF5Qiw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsUUFBUTtJQUNaLGFBQUEsTUFBTSxDQUFDLENBQUMsUUFBYSxLQUNwQixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUN0Qyw2QkFBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUVqRCxhQUFBLEtBQUssRUFBRTs7WUFHVixNQUFNLEtBQUssR0FBR0ssZUFBVSxDQUFDLEdBQUcsQ0FBQzRCLG1CQUFNLENBQUMsRUFBRSxDQUFDO1lBRXZDLFNBQVMsS0FBSyxDQUFDLE9BQXdCLEVBQUE7SUFDckMsWUFBQSxPQUFPLFNBQVMsS0FBSyxDQUFDLFFBQWEsRUFBRSxJQUFTLEVBQUE7SUFDNUMsZ0JBQUEsTUFBTSxVQUFVLEdBQVU7SUFDeEIsb0JBQUFNLDRCQUFRLEVBQUU7SUFDVixvQkFBQUMscUJBQVEsRUFBRTtJQUNWLG9CQUFBQyxnQ0FBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7SUFDNUIsb0JBQUEsTUFBTSxDQUFDLENBQUEsR0FBQSxFQUFNLElBQUksQ0FBQSxDQUFFLEVBQUUsT0FBTyxDQUFDO3FCQUM5QjtJQUNELGdCQUFBLElBQUksSUFBSSxHQUNOLE9BQU8sQ0FBQyxJQUFJLElBQUlmLHFCQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztJQUNqRSxnQkFBQSxJQUFJLENBQUMsSUFBSTt3QkFDUCxNQUFNLElBQUluQiwwQkFBYSxDQUNyQixDQUFBLHNDQUFBLEVBQXlDLElBQUksQ0FBQSxJQUFBLEVBQU8sUUFBUSxDQUFDLElBQUksQ0FBQSxDQUFFLENBQ3BFO0lBQ0gsZ0JBQUEsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO0lBQ3JCLG9CQUFBLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUltQyx5QkFBb0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO0lBQ2pFLG9CQUFBLFVBQVUsQ0FBQyxJQUFJLENBQ2Isc0JBQXNCLENBQUM7SUFDckIsd0JBQUEsSUFBSSxFQUFFLElBQUk7SUFDWCxxQkFBQSxDQUFDLENBQ0g7b0JBQ0g7eUJBQU87SUFDTCxvQkFBQSxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7SUFDeEIsd0JBQUEsS0FBSyxRQUFRO2dDQUNYLElBQUksR0FBRyxTQUFTO2dDQUNoQjtJQUNGLHdCQUFBLEtBQUssUUFBUTtnQ0FDWCxJQUFJLEdBQUcsU0FBUztnQ0FDaEI7SUFDRix3QkFBQSxLQUFLLFFBQVE7Z0NBQ1gsSUFBSSxHQUFHLFFBQVE7Z0NBQ2Y7SUFDRix3QkFBQTtJQUNFLDRCQUFBLE1BQU0sSUFBSW5DLDBCQUFhLENBQUMscUJBQXFCLElBQUksQ0FBQSxDQUFFLENBQUM7O0lBRXhELG9CQUFBLFVBQVUsQ0FBQyxJQUFJLENBQ2IsYUFBYSxDQUFDO0lBQ1osd0JBQUEsSUFBSSxFQUFFLElBQWtCO0lBQ3hCLHdCQUFBLE1BQU0sRUFBRSxJQUFJO0lBQ2IscUJBQUEsQ0FBQyxDQUNIO29CQUNIO29CQUNBLE9BQU9vQyxnQkFBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztJQUM3QyxZQUFBLENBQUM7WUFDSDtJQUVBLFFBQUFMLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxLQUFLO0lBQ1QsYUFBQSxNQUFNLENBQUM7SUFDTixZQUFBLFNBQVMsRUFBRSxLQUFLO2FBQ2pCO0lBQ0EsYUFBQSxLQUFLLEVBQUU7SUFFVixRQUFBQSw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO0lBQ2xDLGFBQUEsR0FBRyxDQUFDdEMsNkJBQVMsQ0FBQyxTQUFTO2lCQUN2QixNQUFNLENBQUMsUUFBUSxFQUFFO0lBQ2pCLGFBQUEsS0FBSyxFQUFFOztZQUdWLE1BQU0sU0FBUyxHQUFHcUIsWUFBTyxDQUFDLEdBQUcsQ0FBQ1Isb0JBQWUsQ0FBQyxNQUFNLENBQUM7SUFDckQsUUFBQXlCLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxTQUFTO0lBQ2IsYUFBQSxNQUFNLENBQUM7SUFDTixZQUFBLFNBQVMsRUFBRSxTQUFTLE1BQU0sQ0FBQyxJQUFZLEVBQUE7SUFDckMsZ0JBQUEsT0FBTyxTQUFTLE1BQU0sQ0FBQyxHQUFRLEVBQUUsSUFBUyxFQUFBO3dCQUN4QyxNQUFNLElBQUksR0FBa0IsRUFBRTtJQUM5QixvQkFBQSxJQUFJLElBQUk7SUFBRSx3QkFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUk7d0JBQzFCLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztJQUNsQyxvQkFBQSxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDZix3QkFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUk7d0JBQ3RCO3dCQUNBLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDaEMsZ0JBQUEsQ0FBQztnQkFDSCxDQUFDO0lBQ0QsWUFBQSxTQUFTLEVBQUUsQ0FBQyxJQUFXLEtBQUk7SUFDekIsZ0JBQUEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDMUIsT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFDckIsQ0FBQzthQUNGO0lBQ0EsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxTQUFTLEdBQUdqQixZQUFPLENBQUMsR0FBRyxDQUFDUixvQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNyRCxRQUFBeUIsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFNBQVM7SUFDYixhQUFBLE1BQU0sQ0FBQ0csZ0NBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2lCQUNsQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9CLGFBQUEsS0FBSyxFQUFFOztZQUdWLE1BQU0sV0FBVyxHQUFHRyw4QkFBVSxDQUFDLEdBQUcsQ0FBQ2pCLGtDQUFjLENBQUMsUUFBUSxDQUFDO0lBQzNELFFBQUFXLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxXQUFXO2lCQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbEMsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxVQUFVLEdBQUdqQyxlQUFVLENBQUMsR0FBRyxDQUFDNEIsbUJBQU0sQ0FBQyxPQUFPLENBQUM7SUFDakQsUUFBQUssOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFVBQVU7aUJBQ2QsTUFBTSxDQUFDTyx3QkFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRUMscUJBQWEsRUFBRTtJQUN6QyxhQUFBLEtBQUssRUFBRTtZQUVWLFNBQVMsbUJBQW1CLENBQUMsR0FBVyxFQUFBO0lBQ3RDLFlBQUEsT0FBT0MsaUNBQW9CLENBQUMsT0FBTyxHQUFHLEdBQUc7WUFDM0M7O1lBR0EsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUNkLG1CQUFNLENBQUMsU0FBUyxDQUFDO0lBRTFELFFBQUEsU0FBUyxFQUFFLENBQUMsU0FBMEIsRUFBRSxNQUFjLEVBQUE7SUFDcEQsWUFBQSxNQUFNLFVBQVUsR0FBVTtvQkFDeEJlLHdCQUFJLENBQUMsTUFBTSxFQUFFQyxtQ0FBeUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ3RELGdCQUFBViw0QkFBUSxDQUFDVSxtQ0FBeUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO29CQUN0RFIsZ0NBQVksQ0FBQ0csOEJBQVUsQ0FBQyxHQUFHLENBQUNYLG1CQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7SUFDN0Msb0JBQUEsU0FBUyxFQUFFLFNBQVM7SUFDcEIsb0JBQUEsTUFBTSxFQUFFLE1BQU07cUJBQ2YsQ0FBQztpQkFDSDtnQkFDRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUNqQiwwQkFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7SUFDaEQsZ0JBQUEsVUFBVSxDQUFDLElBQUksQ0FDYnlCLGdDQUFZLENBQUMsWUFBWSxFQUFFO0lBQ3pCLG9CQUFBLE9BQU8sRUFBRVEsbUNBQXlCLENBQUMsU0FBUyxDQUFDLE9BQU87SUFDckQsaUJBQUEsQ0FBQyxDQUNIOztJQUNFLGdCQUFBLFVBQVUsQ0FBQyxJQUFJLENBQUNULHFCQUFRLEVBQUUsQ0FBQztJQUNoQyxZQUFBLE9BQU9HLGdCQUFLLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDN0I7SUFFQSxRQUFBTCw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsWUFBWTtJQUNoQixhQUFBLE1BQU0sQ0FBQztJQUNOLFlBQUEsU0FBUyxFQUFFLEVBQUU7YUFDZDtJQUNBLGFBQUEsTUFBTSxDQUFDO0lBQ04sWUFBQSxTQUFTLEVBQUUsU0FBUyxTQUFTLENBQUMsR0FBRyxHQUFvQixFQUFBO0lBQ25ELGdCQUFBLE9BQU8sU0FBUyxTQUFTLENBQUMsR0FBUSxFQUFFLElBQVMsRUFBQTt3QkFDM0MsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDdEIsMEJBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO0lBQzFDLHdCQUFBLE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQ3RDLG9CQUFBLE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQ3RDLGdCQUFBLENBQUM7Z0JBQ0gsQ0FBQztJQUNELFlBQUEsU0FBUyxFQUFFLENBQUMsSUFBVyxLQUFJO0lBQ3pCLGdCQUFBLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsQ0FBQzthQUNGO0lBQ0EsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxXQUFXLEdBQUdYLGVBQVUsQ0FBQyxHQUFHLENBQUNRLG9CQUFlLENBQUMsVUFBVSxDQUFDO0lBQzlELFFBQUF5Qiw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsV0FBVztJQUNmLGFBQUEsTUFBTSxDQUFDO0lBQ04sWUFBQSxTQUFTLEVBQUUsU0FBUyxRQUFRLENBQzFCLEtBQWtELEVBQ2xELE9BQXdCLEVBQ3hCLFFBQWlCLEVBQ2pCLGNBQWtDLEVBQ2xDLEVBQVcsRUFBQTtJQUVYLGdCQUFBLE1BQU0sUUFBUSxHQUFzQjtJQUNsQyxvQkFBQSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFJLEtBQWE7SUFDL0Msb0JBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsb0JBQUEsUUFBUSxFQUFFLFFBQVE7cUJBQ25CO0lBQ0QsZ0JBQUEsSUFBSSxjQUFjO0lBQUUsb0JBQUEsUUFBUSxDQUFDLFNBQVMsR0FBRyxjQUFjO0lBQ3ZELGdCQUFBLElBQUksRUFBRTtJQUFFLG9CQUFBLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRTtJQUMxQixnQkFBQSxNQUFNLE9BQU8sR0FBb0I7SUFDL0Isb0JBQUEsT0FBTyxFQUNMLE9BQU8sQ0FBQyxNQUFNLEtBQUtZLFlBQU8sQ0FBQyxPQUFPO0lBQ2xDLHdCQUFBLE9BQU8sQ0FBQyxNQUFNLEtBQUtBLFlBQU8sQ0FBQyxPQUFPO3dCQUNwQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsU0FBUzt3QkFDaEQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLFNBQVM7SUFDaEQsb0JBQUEsUUFBUSxFQUFFLElBQUk7SUFDZCxvQkFBQSxLQUFLLEVBQUUsUUFBUTtxQkFDaEI7b0JBQ0QsT0FBT1AsZ0JBQUssQ0FDVlEsd0JBQUksQ0FBQ3RDLG9CQUFlLENBQUMsU0FBUyxDQUFDLEVBQy9CZ0Msd0JBQUksQ0FBQzt5QkFDRixPQUFPLEtBQUssS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDckMsMEJBQUU7SUFDRiwwQkFBRSxLQUFLLENBQUMsSUFBSTtJQUNkLG9CQUFBLE1BQU0sQ0FBQyxJQUFJO0lBQ1gsb0JBQUEsTUFBTSxDQUFDLElBQUk7SUFDWCxvQkFBQSxNQUFNLENBQUMsSUFBSTtxQkFDWixDQUFDLEVBQ0ZKLGdDQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxFQUNuQyxRQUFRLENBQ04sTUFBSzt3QkFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7NEJBQUUsS0FBSyxHQUFJLEtBQWEsRUFBRTtJQUN6QyxvQkFBQSxJQUFJLENBQUMsS0FBSyxDQUFDekMsNkJBQVMsQ0FBQyxNQUE0QixDQUFDO0lBQ2hELHdCQUFBLE1BQU0sSUFBSU8sMEJBQWEsQ0FDckIseUNBQXlDLENBQzFDO0lBQ0gsb0JBQUEsT0FBTyxLQUFLLENBQUNQLDZCQUFTLENBQUMsTUFBNEIsQ0FBQztJQUN0RCxnQkFBQSxDQUFDLEVBQ0QsQ0FBQyxLQUFVLEtBQUk7d0JBQ2IsTUFBTSxFQUFFLEdBQUdFLDJCQUFjLENBQUMsSUFBSyxLQUEwQixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQy9ELG9CQUFBLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbEIsQ0FBQyxFQUNELE9BQU8sQ0FDUixFQUNEa0Qsa0JBQVUsQ0FDUixjQUFjLElBQUksUUFBUSxDQUFDO0lBQ3pCLHNCQUFFOzRCQUNFLHdCQUF3QixFQUFFLFFBQVEsQ0FBQyxJQUFJO0lBQ3hDO0lBQ0gsc0JBQUcsU0FBaUIsQ0FDdkIsQ0FDRjtnQkFDSCxDQUFDO2FBQ0Y7SUFDQSxhQUFBLEtBQUssRUFBRTs7WUFHVixNQUFNLFlBQVksR0FBRy9DLGVBQVUsQ0FBQyxHQUFHLENBQUNRLG9CQUFlLENBQUMsV0FBVyxDQUFDO0lBQ2hFLFFBQUF5Qiw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO2lCQUNsQyxHQUFHLENBQUMsWUFBWTtJQUNoQixhQUFBLE1BQU0sQ0FBQztJQUNOLFlBQUEsU0FBUyxFQUFFLFNBQVMsU0FBUyxDQUMzQixLQUFrRCxFQUNsRCxPQUF3QixFQUN4QixRQUFpQixFQUNqQixhQUFrRSxFQUNsRSxFQUFXLEVBQUE7SUFFWCxnQkFBQSxNQUFNLElBQUksR0FBc0I7SUFDOUIsb0JBQUEsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBSSxLQUFhO0lBQy9DLG9CQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLG9CQUFBLFFBQVEsRUFBRSxRQUFRO3FCQUNuQjtJQUNELGdCQUFBLElBQUksYUFBYTtJQUFFLG9CQUFBLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYTtJQUNqRCxnQkFBQSxJQUFJLEVBQUU7SUFBRSxvQkFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7SUFFdEIsZ0JBQUEsTUFBTSxVQUFVLEdBQUc7SUFDakIsb0JBQUFhLHdCQUFJLENBQUN0QyxvQkFBZSxDQUFDLFNBQVMsQ0FBQzt3QkFDL0J3Qyx3QkFBSSxDQUFDLEtBQUssQ0FBQztJQUNYLG9CQUFBWixnQ0FBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDaEMsb0JBQUEsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFRLEVBQUUsSUFBUyxFQUFBO0lBQzNDLHdCQUFBLE1BQU0sT0FBTyxHQUFvQjtJQUMvQiw0QkFBQSxPQUFPLEVBQ0wsT0FBTyxDQUFDLE1BQU0sS0FBS1MsWUFBTyxDQUFDLE9BQU87SUFDbEMsZ0NBQUEsT0FBTyxDQUFDLE1BQU0sS0FBS0EsWUFBTyxDQUFDLE9BQU87Z0NBQ3BDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxTQUFTO2dDQUNoRCxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsU0FBUztJQUNoRCw0QkFBQSxRQUFRLEVBQUUsSUFBSTtJQUNkLDRCQUFBLEtBQUssRUFBRSxRQUFROzZCQUNoQjs0QkFDRCxPQUFPLFNBQVMsQ0FDZCxNQUFLO2dDQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtvQ0FBRSxLQUFLLEdBQUksS0FBYSxFQUFFO0lBQ3pDLDRCQUFBLElBQUksQ0FBQyxLQUFLLENBQUNsRCw2QkFBUyxDQUFDLE1BQTRCLENBQUM7SUFDaEQsZ0NBQUEsTUFBTSxJQUFJTywwQkFBYSxDQUNyQix5Q0FBeUMsQ0FDMUM7SUFDSCw0QkFBQSxPQUFPLEtBQUssQ0FBQ1AsNkJBQVMsQ0FBQyxNQUE0QixDQUFDO0lBQ3RELHdCQUFBLENBQUMsRUFDRCxDQUFDLEtBQVUsS0FBSTtnQ0FDYixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7b0NBQUUsS0FBSyxHQUFJLEtBQWEsRUFBRTtJQUN6Qyw0QkFBQSxNQUFNLENBQUMsR0FBRyxJQUFLLEtBQTBCLEVBQUU7SUFDM0MsNEJBQUEsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSTtvQ0FDakQsTUFBTSxJQUFJLEdBQUcwQixxQkFBVSxDQUFDLHFCQUFxQixDQUMzQ3JCLGVBQVUsQ0FBQyxHQUFHLENBQUNRLG9CQUFlLENBQUMsV0FBVyxDQUFDLEVBQzNDLENBQUMsRUFDRCxDQUFDLEVBQ0QsSUFBSSxDQUNMO0lBQ0QsZ0NBQUEsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07SUFDdEQsb0NBQUEsT0FBTyxLQUFLO29DQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29DQUM5QixNQUFNLEtBQUssR0FDVCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVU7SUFDckMsb0NBQUEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNmLHNDQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSztJQUNqQixzQ0FBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUs7b0NBQ3JCLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUk7SUFDNUMsNEJBQUEsQ0FBQyxDQUFDO0lBQ0YsNEJBQUEsSUFBSSxDQUFDLGdCQUFnQjtvQ0FDbkIsTUFBTSxJQUFJTiwwQkFBYSxDQUNyQixDQUFBLHdEQUFBLEVBQTJELEtBQUssQ0FBQyxJQUFJLENBQUEsQ0FBQSxDQUFHLENBQ3pFO0lBQ0gsNEJBQUEsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7NEJBQ2hDLENBQUMsRUFDRCxPQUFPLENBQ1IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO3dCQUNkLENBQUM7cUJBQ0Y7SUFDRCxnQkFBQSxPQUFPb0MsZ0JBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDN0IsQ0FBQzthQUNGO0lBQ0EsYUFBQSxLQUFLLEVBQUU7O1lBR1YsTUFBTSxZQUFZLEdBQUd0QyxlQUFVLENBQUMsR0FBRyxDQUFDUSxvQkFBZSxDQUFDLFdBQVcsQ0FBQztJQUNoRSxRQUFBeUIsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFlBQVk7SUFDaEIsYUFBQSxNQUFNLENBQUM7SUFDTixZQUFBLFNBQVMsRUFBRSxTQUFTLFNBQVMsQ0FDM0IsS0FBa0QsRUFDbEQsT0FBd0IsRUFDeEIsUUFBaUIsRUFDakIsYUFBa0UsRUFDbEUsRUFBVyxFQUFBO0lBRVgsZ0JBQUEsTUFBTSxRQUFRLEdBQXNCO0lBQ2xDLG9CQUFBLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFXO0lBQ2xELG9CQUFBLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLG9CQUFBLFFBQVEsRUFBRSxRQUFRO3FCQUNuQjtJQUNELGdCQUFBLElBQUksYUFBYTtJQUFFLG9CQUFBLFFBQVEsQ0FBQyxTQUFTLEdBQUcsYUFBYTtJQUNyRCxnQkFBQSxJQUFJLEVBQUU7SUFBRSxvQkFBQSxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUU7SUFDMUIsZ0JBQUEsTUFBTSxPQUFPLEdBQW9CO0lBQy9CLG9CQUFBLE9BQU8sRUFDTCxPQUFPLENBQUMsTUFBTSxLQUFLWSxZQUFPLENBQUMsT0FBTztJQUNsQyx3QkFBQSxPQUFPLENBQUMsTUFBTSxLQUFLQSxZQUFPLENBQUMsT0FBTzt3QkFDcEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLFdBQVc7d0JBQ2xELFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxXQUFXO0lBQ2xELG9CQUFBLFFBQVEsRUFBRSxJQUFJO0lBQ2Qsb0JBQUEsS0FBSyxFQUFFLFFBQVE7cUJBQ2hCO29CQUNELE9BQU9QLGdCQUFLLENBQ1ZRLHdCQUFJLENBQUN0QyxvQkFBZSxDQUFDLFNBQVMsQ0FBQyxFQUMvQmdDLHdCQUFJLENBQUM7eUJBQ0YsT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3JDLDBCQUFFO0lBQ0YsMEJBQUUsS0FBSyxDQUFDLElBQUk7SUFDZCxvQkFBQSxNQUFNLENBQUMsSUFBSTtJQUNYLG9CQUFBLE1BQU0sQ0FBQyxJQUFJO0lBQ1gsb0JBQUEsTUFBTSxDQUFDLElBQUk7SUFDWixpQkFBQSxDQUFDLEVBQ0ZKLGdDQUFZLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxFQUNwQyxTQUFTLGdCQUFnQixDQUFDLEdBQVEsRUFBRSxJQUFTLEVBQUE7d0JBQzNDLE9BQU8sU0FBUyxDQUNkLE1BQUs7NEJBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO2dDQUFFLEtBQUssR0FBSSxLQUFhLEVBQUU7SUFDekMsd0JBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQ3pDLDZCQUFTLENBQUMsTUFBNEIsQ0FBQztJQUNoRCw0QkFBQSxNQUFNLElBQUlPLDBCQUFhLENBQ3JCLHlDQUF5QyxDQUMxQztJQUNILHdCQUFBLE9BQU8sS0FBSyxDQUFDUCw2QkFBUyxDQUFDLE1BQTRCLENBQUM7SUFDdEQsb0JBQUEsQ0FBQyxFQUNELENBQUMsS0FBVSxLQUFJOzRCQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtnQ0FBRSxLQUFLLEdBQUksS0FBYSxFQUFFO0lBQ3pDLHdCQUFBLE1BQU0sQ0FBQyxHQUFHLElBQUssS0FBMEIsRUFBRTtJQUMzQyx3QkFBQSxJQUFJLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJO2dDQUMvQyxNQUFNLElBQUksR0FBRzBCLHFCQUFVLENBQUMscUJBQXFCLENBQzNDckIsZUFBVSxDQUFDLEdBQUcsQ0FBQ1Esb0JBQWUsQ0FBQyxXQUFXLENBQUMsRUFDM0MsQ0FBQyxFQUNELENBQUMsRUFDRCxJQUFJLENBQ0w7SUFDRCw0QkFBQSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtJQUN0RCxnQ0FBQSxPQUFPLEtBQUs7SUFDZCw0QkFBQSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNqQytCLDhCQUFVLENBQUMsR0FBRyxDQUFDakIsa0NBQWMsQ0FBQyxJQUFJLENBQUMsRUFDbkMsQ0FBQyxFQUNELENBQUMsQ0FDRjtJQUNELDRCQUFBLElBQUksQ0FBQyxPQUFPO0lBQ1YsZ0NBQUEsTUFBTSxJQUFJcEIsMEJBQWEsQ0FDckIsQ0FBQSw2QkFBQSxFQUFnQyxDQUFDLENBQUEsSUFBQSxFQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFBLENBQUUsQ0FDN0Q7Z0NBQ0gsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUk7SUFDcEMsNEJBQUEsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJO0lBQ3RDLHdCQUFBLENBQUMsQ0FBQztJQUNGLHdCQUFBLElBQUksQ0FBQyxnQkFBZ0I7Z0NBQ25CLGdCQUFnQixHQUFHTCwyQkFBYyxDQUMvQixJQUFLLEtBQTBCLEVBQUUsQ0FDbEMsQ0FBQyxFQUFZO0lBQ2hCLHdCQUFBLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDO3dCQUNoQyxDQUFDLEVBQ0QsT0FBTyxDQUNSLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztJQUNkLGdCQUFBLENBQUMsQ0FDRjtnQkFDSCxDQUFDO2FBQ0Y7SUFDQSxhQUFBLEtBQUssRUFBRTs7WUFHVixNQUFNLGFBQWEsR0FBR0csZUFBVSxDQUFDLEdBQUcsQ0FBQ1Esb0JBQWUsQ0FBQyxZQUFZLENBQUM7SUFDbEUsUUFBQXlCLDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxhQUFhO0lBQ2pCLGFBQUEsTUFBTSxDQUFDO0lBQ04sWUFBQSxTQUFTLEVBQUUsU0FBUyxVQUFVLENBQzVCLEtBQWtELEVBQ2xELE9BQXdCLEVBQ3hCLFFBQWlCLEVBQ2pCLGFBQWdDLEVBQ2hDLEVBQVcsRUFBQTtJQUVYLGdCQUFBLE1BQU0sUUFBUSxHQUFzQjtJQUNsQyxvQkFBQSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFJLEtBQWE7SUFDL0Msb0JBQUEsT0FBTyxFQUFFLE9BQU87SUFDaEIsb0JBQUEsUUFBUSxFQUFFLFFBQVE7cUJBQ25CO0lBQ0QsZ0JBQUEsSUFBSSxhQUFhO0lBQUUsb0JBQUEsUUFBUSxDQUFDLFNBQVMsR0FBRyxhQUFhO0lBQ3JELGdCQUFBLElBQUksRUFBRTtJQUFFLG9CQUFBLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRTtJQUMxQixnQkFBQSxNQUFNLE9BQU8sR0FBb0I7SUFDL0Isb0JBQUEsT0FBTyxFQUNMLE9BQU8sQ0FBQyxNQUFNLEtBQUtZLFlBQU8sQ0FBQyxPQUFPO0lBQ2xDLHdCQUFBLE9BQU8sQ0FBQyxNQUFNLEtBQUtBLFlBQU8sQ0FBQyxPQUFPO3dCQUNwQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsU0FBUzt3QkFDaEQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLFNBQVM7SUFDaEQsb0JBQUEsUUFBUSxFQUFFLElBQUk7SUFDZCxvQkFBQSxLQUFLLEVBQUUsUUFBUTtxQkFDaEI7b0JBQ0QsT0FBT1AsZ0JBQUssQ0FDVlEsd0JBQUksQ0FBQ3RDLG9CQUFlLENBQUMsU0FBUyxDQUFDLEVBQy9Cd0Msd0JBQUksQ0FBQyxLQUFLLENBQUMsRUFDWFosZ0NBQVksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLEVBQ3JDLFVBQVUsQ0FDUixNQUFLO3dCQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTs0QkFBRSxLQUFLLEdBQUksS0FBYSxFQUFFO0lBQ3pDLG9CQUFBLElBQUksQ0FBQyxLQUFLLENBQUN6Qyw2QkFBUyxDQUFDLE1BQTRCLENBQUM7SUFDaEQsd0JBQUEsTUFBTSxJQUFJTywwQkFBYSxDQUNyQix5Q0FBeUMsQ0FDMUM7SUFDSCxvQkFBQSxPQUFPLEtBQUssQ0FBQ1AsNkJBQVMsQ0FBQyxNQUE0QixDQUFDO0lBQ3RELGdCQUFBLENBQUMsRUFDRCxDQUFDLEtBQVUsS0FBSTt3QkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7NEJBQUUsS0FBSyxHQUFJLEtBQWEsRUFBRTt3QkFDekMsTUFBTSxFQUFFLEdBQUdFLDJCQUFjLENBQUMsSUFBSyxLQUEwQixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQy9ELG9CQUFBLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbEIsQ0FBQyxFQUNELE9BQU8sQ0FDUixFQUNEb0QsaUJBQVMsQ0FBQyxhQUFvQixDQUFDLENBQ2hDO2dCQUNILENBQUM7YUFDRjtJQUNBLGFBQUEsS0FBSyxFQUFFOztJQUdWLFFBQUFoQiw4QkFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjO0lBQ2xDLGFBQUEsR0FBRyxDQUFDekIsb0JBQWUsQ0FBQyxLQUFLO0lBQ3pCLGFBQUEsTUFBTSxDQUFDO0lBQ04sWUFBQSxTQUFTLEVBQUUsU0FBUyxLQUFLLENBQ3ZCLFVBQWlELEVBQ2pELFlBQWdDOztnQkFFaEMsSUFBYSxFQUFBO0lBRWIsZ0JBQUEsT0FBTyxTQUFTLEtBQUssQ0FBQyxHQUFRLEVBQUUsSUFBUyxFQUFBO0lBQ3ZDLG9CQUFBLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFOzRCQUVsQyxVQUFVLEdBQUcsU0FBUzs0QkFDdEIsWUFBWSxHQUFHLFNBQVM7d0JBQzFCO0lBQ0Esb0JBQUEsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7NEJBRXBDLFlBQVksR0FBRyxTQUFTO3dCQUMxQjtJQUNBLG9CQUFBLElBQUksQ0FBQyxZQUFZLElBQUksVUFBVSxFQUFFOzRCQUMvQixJQUNFLFVBQVUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxDQUFDLEtBQ0EsQ0FBQyxDQUFDUCxtQkFBYyxDQUFDLEdBQUcsRUFBRUEsbUJBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBUSxDQUFDLENBQy9ELEVBQ0Q7Z0NBQ0EsWUFBWSxHQUFHLFVBQXNCO2dDQUNyQyxVQUFVLEdBQUcsU0FBUzs0QkFDeEI7d0JBQ0Y7SUFFQSxvQkFBQSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFO0lBQ3ZDLHdCQUFBLE9BQU9pRCxhQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzt3QkFDNUM7SUFFQSxvQkFBQSxPQUFPQSxhQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQzNCLGdCQUFBLENBQUM7Z0JBQ0gsQ0FBQzthQUNGO0lBQ0EsYUFBQSxLQUFLLEVBQUU7WUFFVixNQUFNLFlBQVksR0FBR2xELGVBQVUsQ0FBQyxHQUFHLENBQUNRLG9CQUFlLENBQUMsVUFBVSxDQUFDO1lBQy9ELE1BQU0sWUFBWSxHQUFHUixlQUFVLENBQUMsR0FBRyxDQUFDUSxvQkFBZSxDQUFDLFVBQVUsQ0FBQztJQUMvRCxRQUFBeUIsOEJBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYztpQkFDbEMsR0FBRyxDQUFDLFlBQVk7SUFDaEIsYUFBQSxNQUFNLENBQ0xrQixxQkFBUSxDQUFDLDhCQUE4QixFQUFFLEVBQUUsQ0FBQyxFQUM1Q2pCLDRCQUFRLEVBQUUsRUFDVkUsZ0NBQVksQ0FBQyxZQUFZLEVBQUUsRUFBRTs7SUFFOUI7SUFDQSxhQUFBLEtBQUssRUFBRTtJQUVWLFFBQUFILDhCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWM7aUJBQ2xDLEdBQUcsQ0FBQyxZQUFZO0lBQ2hCLGFBQUEsTUFBTSxDQUNMbUIsMkJBQWMsQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLENBQUMsRUFDbERsQiw0QkFBUSxFQUFFLEVBQ1ZFLGdDQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztJQUUvQixhQUFBLEtBQUssRUFBRTtRQUNaO0lBQ0Q7QUEvNkNvQnRCLG9CQUFBLENBQUE7SUFEbEIsSUFBQXVDLFVBQUssRUFBRTs7OzhDQUN1QixlQUFlO0lBRTdDLENBQUEsRUFBQSxjQUFBLENBQUEsU0FBQSxFQUFBLFVBQUEsRUFBQSxJQUFBLENBQUE7QUFHUXZDLG9CQUFBLENBQUE7SUFEUixJQUFBdUMsVUFBSyxFQUFFOzs7O0lBR1AsQ0FBQSxFQUFBLGNBQUEsQ0FBQSxTQUFBLEVBQUEsWUFBQSxFQUFBLElBQUEsQ0FBQTtBQVNEdkMsb0JBQUEsQ0FBQTtJQURDLElBQUF1QyxVQUFLLEVBQUU7Ozs4Q0FDc0IsZ0JBQWdCO0lBRTdDLENBQUEsRUFBQSxjQUFBLENBQUEsU0FBQSxFQUFBLFdBQUEsRUFBQSxJQUFBLENBQUE7QUFTS3ZDLG9CQUFBLENBQUE7SUFETCxJQUFBdUMsVUFBSyxFQUFFOzs7O0lBR1AsQ0FBQSxFQUFBLGNBQUEsQ0FBQSxTQUFBLEVBQUEsVUFBQSxFQUFBLElBQUEsQ0FBQTtBQTBCZXZDLG9CQUFBLENBQUE7SUFEZixJQUFBdUMsVUFBSyxFQUFFOzs7O0lBa0JQLENBQUEsRUFBQSxjQUFBLENBQUEsU0FBQSxFQUFBLE9BQUEsRUFBQSxJQUFBLENBQUE7QUF5MkNIckMsZ0JBQU8sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDOztJQzNvRGxDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7SUFhM0I7Ozs7SUFJRztJQUVIOzs7OztJQUtHO0FBQ0ksVUFBTSxPQUFPLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9