nextlove 2.19.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3824,7 +3824,7 @@ var require_stream = __commonJS({
3824
3824
  Object.defineProperty(exports, "__esModule", { value: true });
3825
3825
  exports.merge = void 0;
3826
3826
  var merge22 = require_merge2();
3827
- function merge3(streams) {
3827
+ function merge(streams) {
3828
3828
  const mergedStream = merge22(streams);
3829
3829
  streams.forEach((stream) => {
3830
3830
  stream.once("error", (error) => mergedStream.emit("error", error));
@@ -3833,7 +3833,7 @@ var require_stream = __commonJS({
3833
3833
  mergedStream.once("end", () => propagateCloseEventToSources(streams));
3834
3834
  return mergedStream;
3835
3835
  }
3836
- exports.merge = merge3;
3836
+ exports.merge = merge;
3837
3837
  function propagateCloseEventToSources(streams) {
3838
3838
  streams.forEach((stream) => stream.emit("close"));
3839
3839
  }
@@ -6748,7 +6748,6 @@ var parseRoutesInPackage = async (opts) => {
6748
6748
 
6749
6749
  // src/generators/lib/zod-openapi.ts
6750
6750
  init_cjs_shims();
6751
- var import_ts_deepmerge = __toESM(require("ts-deepmerge"));
6752
6751
  var import_zod = require("zod");
6753
6752
 
6754
6753
  // src/generators/lib/front-matter.ts
@@ -6829,16 +6828,233 @@ function dashifyObjectKeys(obj) {
6829
6828
  );
6830
6829
  }
6831
6830
 
6831
+ // src/lib/zod-compat.ts
6832
+ init_cjs_shims();
6833
+ function getDef(schema) {
6834
+ if ("_zod" in schema) {
6835
+ return schema._zod.def;
6836
+ }
6837
+ return schema._def;
6838
+ }
6839
+ function getTypeName(schema) {
6840
+ var _a;
6841
+ if ("_zod" in schema) {
6842
+ const zod = schema._zod;
6843
+ const constructorName = schema.constructor.name;
6844
+ if (constructorName && constructorName.startsWith("$Zod")) {
6845
+ return constructorName.slice(1);
6846
+ }
6847
+ if (zod.def && zod.def.type) {
6848
+ return normalizeZodV4Type(zod.def.type);
6849
+ }
6850
+ return constructorName || "Unknown";
6851
+ }
6852
+ return ((_a = schema._def) == null ? void 0 : _a.typeName) || "Unknown";
6853
+ }
6854
+ function normalizeZodV4Type(type) {
6855
+ const typeMap = {
6856
+ string: "ZodString",
6857
+ number: "ZodNumber",
6858
+ bigint: "ZodBigInt",
6859
+ boolean: "ZodBoolean",
6860
+ date: "ZodDate",
6861
+ undefined: "ZodUndefined",
6862
+ null: "ZodNull",
6863
+ void: "ZodVoid",
6864
+ any: "ZodAny",
6865
+ unknown: "ZodUnknown",
6866
+ never: "ZodNever",
6867
+ literal: "ZodLiteral",
6868
+ enum: "ZodEnum",
6869
+ nativeEnum: "ZodNativeEnum",
6870
+ object: "ZodObject",
6871
+ array: "ZodArray",
6872
+ tuple: "ZodTuple",
6873
+ union: "ZodUnion",
6874
+ discriminatedUnion: "ZodDiscriminatedUnion",
6875
+ intersection: "ZodIntersection",
6876
+ record: "ZodRecord",
6877
+ map: "ZodMap",
6878
+ set: "ZodSet",
6879
+ function: "ZodFunction",
6880
+ lazy: "ZodLazy",
6881
+ promise: "ZodPromise",
6882
+ optional: "ZodOptional",
6883
+ nullable: "ZodNullable",
6884
+ default: "ZodDefault",
6885
+ effects: "ZodEffects",
6886
+ transformer: "ZodTransformer",
6887
+ branded: "ZodBranded",
6888
+ pipeline: "ZodPipeline",
6889
+ readonly: "ZodReadonly"
6890
+ };
6891
+ return typeMap[type] || `Zod${type.charAt(0).toUpperCase() + type.slice(1)}`;
6892
+ }
6893
+ function getEffectsSchema(schema) {
6894
+ const def = getDef(schema);
6895
+ return def == null ? void 0 : def.schema;
6896
+ }
6897
+ function getInnerType(schema) {
6898
+ const def = getDef(schema);
6899
+ return def == null ? void 0 : def.innerType;
6900
+ }
6901
+ function getShape(schema) {
6902
+ const def = getDef(schema);
6903
+ if (typeof (def == null ? void 0 : def.shape) === "function") {
6904
+ return def.shape();
6905
+ }
6906
+ return def == null ? void 0 : def.shape;
6907
+ }
6908
+ function getChecks(schema) {
6909
+ const def = getDef(schema);
6910
+ const checks = (def == null ? void 0 : def.checks) || [];
6911
+ return checks.map((check) => {
6912
+ var _a;
6913
+ if ((_a = check._zod) == null ? void 0 : _a.def) {
6914
+ return { ...check._zod.def };
6915
+ }
6916
+ return check;
6917
+ });
6918
+ }
6919
+ function getEnumValues(schema) {
6920
+ if ("options" in schema && Array.isArray(schema.options)) {
6921
+ return schema.options;
6922
+ }
6923
+ if ("enum" in schema && schema.enum) {
6924
+ return schema.enum;
6925
+ }
6926
+ const def = getDef(schema);
6927
+ return (def == null ? void 0 : def.values) || (def == null ? void 0 : def.entries);
6928
+ }
6929
+ function getLiteralValue(schema) {
6930
+ if ("value" in schema) {
6931
+ return schema.value;
6932
+ }
6933
+ const def = getDef(schema);
6934
+ if (Array.isArray(def == null ? void 0 : def.values)) {
6935
+ return def.values[0];
6936
+ }
6937
+ return def == null ? void 0 : def.value;
6938
+ }
6939
+ function getDefaultValue(schema) {
6940
+ const def = getDef(schema);
6941
+ if (typeof (def == null ? void 0 : def.defaultValue) === "function") {
6942
+ return def.defaultValue();
6943
+ }
6944
+ return def == null ? void 0 : def.defaultValue;
6945
+ }
6946
+ function getArrayConstraints(schema) {
6947
+ const def = getDef(schema);
6948
+ return {
6949
+ exactLength: def == null ? void 0 : def.exactLength,
6950
+ minLength: def == null ? void 0 : def.minLength,
6951
+ maxLength: def == null ? void 0 : def.maxLength
6952
+ };
6953
+ }
6954
+ function getArrayType(schema) {
6955
+ const def = getDef(schema);
6956
+ return def == null ? void 0 : def.type;
6957
+ }
6958
+ function getRecordValueType(schema) {
6959
+ const def = getDef(schema);
6960
+ return def == null ? void 0 : def.valueType;
6961
+ }
6962
+ function getCatchall(schema) {
6963
+ const def = getDef(schema);
6964
+ return def == null ? void 0 : def.catchall;
6965
+ }
6966
+ function getUnknownKeys(schema) {
6967
+ const def = getDef(schema);
6968
+ return def == null ? void 0 : def.unknownKeys;
6969
+ }
6970
+ function getIntersectionParts(schema) {
6971
+ const def = getDef(schema);
6972
+ return {
6973
+ left: def == null ? void 0 : def.left,
6974
+ right: def == null ? void 0 : def.right
6975
+ };
6976
+ }
6977
+ function getUnionOptions(schema) {
6978
+ const def = getDef(schema);
6979
+ const options = def == null ? void 0 : def.options;
6980
+ if (options instanceof Map) {
6981
+ return Array.from(options.values());
6982
+ }
6983
+ if (Array.isArray(options)) {
6984
+ return options;
6985
+ }
6986
+ return [];
6987
+ }
6988
+ function getDiscriminator(schema) {
6989
+ const def = getDef(schema);
6990
+ return def == null ? void 0 : def.discriminator;
6991
+ }
6992
+ function getEffect(schema) {
6993
+ const def = getDef(schema);
6994
+ return def == null ? void 0 : def.effect;
6995
+ }
6996
+ function getPipelineParts(schema) {
6997
+ const def = getDef(schema);
6998
+ return {
6999
+ in: def == null ? void 0 : def.in,
7000
+ out: def == null ? void 0 : def.out
7001
+ };
7002
+ }
7003
+ function getBrandedType(schema) {
7004
+ const def = getDef(schema);
7005
+ return def == null ? void 0 : def.type;
7006
+ }
7007
+ function getTupleItems(schema) {
7008
+ const def = getDef(schema);
7009
+ return (def == null ? void 0 : def.items) || [];
7010
+ }
7011
+ function getFunctionParts(schema) {
7012
+ const def = getDef(schema);
7013
+ return {
7014
+ args: def == null ? void 0 : def.args,
7015
+ returns: def == null ? void 0 : def.returns
7016
+ };
7017
+ }
7018
+ function getMapTypes(schema) {
7019
+ const def = getDef(schema);
7020
+ return {
7021
+ keyType: def == null ? void 0 : def.keyType,
7022
+ valueType: def == null ? void 0 : def.valueType
7023
+ };
7024
+ }
7025
+ function getSetValueType(schema) {
7026
+ const def = getDef(schema);
7027
+ return def == null ? void 0 : def.valueType;
7028
+ }
7029
+ function getPromiseType(schema) {
7030
+ const def = getDef(schema);
7031
+ return def == null ? void 0 : def.type;
7032
+ }
7033
+ function getCustomTypeGetter(schema) {
7034
+ const def = getDef(schema);
7035
+ return def == null ? void 0 : def.getType;
7036
+ }
7037
+
6832
7038
  // src/generators/lib/zod-openapi.ts
7039
+ function mergeSchemas(...schemas) {
7040
+ const result = {};
7041
+ for (const schema of schemas) {
7042
+ if (schema) {
7043
+ Object.assign(result, schema);
7044
+ }
7045
+ }
7046
+ return result;
7047
+ }
6833
7048
  function iterateZodObject({
6834
7049
  zodRef,
6835
7050
  useOutput,
6836
7051
  hideDefinitions
6837
7052
  }) {
6838
- const reduced = Object.keys(zodRef.shape).filter((key) => (hideDefinitions == null ? void 0 : hideDefinitions.includes(key)) === false).reduce(
7053
+ const shape = getShape(zodRef) || {};
7054
+ const reduced = Object.keys(shape).filter((key) => (hideDefinitions == null ? void 0 : hideDefinitions.includes(key)) === false).reduce(
6839
7055
  (carry, key) => ({
6840
7056
  ...carry,
6841
- [key]: generateSchema(zodRef.shape[key], useOutput)
7057
+ [key]: generateSchema(shape[key], useOutput)
6842
7058
  }),
6843
7059
  {}
6844
7060
  );
@@ -6871,13 +7087,15 @@ function parseTransformation({
6871
7087
  schemas,
6872
7088
  useOutput
6873
7089
  }) {
6874
- const input = generateSchema(zodRef._def.schema, useOutput);
7090
+ const innerSchema = getEffectsSchema(zodRef);
7091
+ const input = innerSchema ? generateSchema(innerSchema, useOutput) : {};
6875
7092
  let output = "undefined";
6876
- if (useOutput && zodRef._def.effect) {
6877
- const effect = zodRef._def.effect.type === "transform" ? zodRef._def.effect : null;
6878
- if (effect && "transform" in effect) {
7093
+ const effect = getEffect(zodRef);
7094
+ if (useOutput && effect) {
7095
+ const transformEffect = effect.type === "transform" ? effect : null;
7096
+ if (transformEffect && "transform" in transformEffect) {
6879
7097
  try {
6880
- output = typeof effect.transform(
7098
+ output = typeof transformEffect.transform(
6881
7099
  ["integer", "number"].includes(`${input.type}`) ? 0 : "string" === input.type ? "" : "boolean" === input.type ? false : "object" === input.type ? {} : "null" === input.type ? null : "array" === input.type ? [] : void 0,
6882
7100
  { addIssue: () => void 0, path: [] }
6883
7101
  );
@@ -6885,7 +7103,7 @@ function parseTransformation({
6885
7103
  }
6886
7104
  }
6887
7105
  }
6888
- return (0, import_ts_deepmerge.default)(
7106
+ return mergeSchemas(
6889
7107
  {
6890
7108
  ...zodRef.description ? { description: zodRef.description } : {},
6891
7109
  ...input,
@@ -6903,9 +7121,12 @@ function parseString({
6903
7121
  const baseSchema = {
6904
7122
  type: "string"
6905
7123
  };
6906
- const { checks = [] } = zodRef._def;
7124
+ const checks = getChecks(zodRef);
6907
7125
  checks.forEach((item) => {
6908
- switch (item.kind) {
7126
+ var _a, _b, _c, _d, _e;
7127
+ const kind = item.kind || item.check;
7128
+ const format = item.format;
7129
+ switch (kind) {
6909
7130
  case "email":
6910
7131
  baseSchema.format = "email";
6911
7132
  break;
@@ -6921,22 +7142,36 @@ function parseString({
6921
7142
  case "datetime":
6922
7143
  baseSchema.format = "date-time";
6923
7144
  break;
7145
+ case "string_format":
7146
+ if (format === "email")
7147
+ baseSchema.format = "email";
7148
+ else if (format === "uuid")
7149
+ baseSchema.format = "uuid";
7150
+ else if (format === "cuid")
7151
+ baseSchema.format = "cuid";
7152
+ else if (format === "url")
7153
+ baseSchema.format = "uri";
7154
+ else if (format === "datetime")
7155
+ baseSchema.format = "date-time";
7156
+ break;
6924
7157
  case "length":
6925
7158
  baseSchema.minLength = item.value;
6926
7159
  baseSchema.maxLength = item.value;
6927
7160
  break;
6928
7161
  case "max":
6929
- baseSchema.maxLength = item.value;
7162
+ case "max_length":
7163
+ baseSchema.maxLength = (_a = item.value) != null ? _a : item.maximum;
6930
7164
  break;
6931
7165
  case "min":
6932
- baseSchema.minLength = item.value;
7166
+ case "min_length":
7167
+ baseSchema.minLength = (_b = item.value) != null ? _b : item.minimum;
6933
7168
  break;
6934
7169
  case "regex":
6935
- baseSchema.pattern = item.regex.source;
7170
+ baseSchema.pattern = (_e = (_c = item.regex) == null ? void 0 : _c.source) != null ? _e : (_d = item.pattern) == null ? void 0 : _d.source;
6936
7171
  break;
6937
7172
  }
6938
7173
  });
6939
- return (0, import_ts_deepmerge.default)(baseSchema, parseDescription(zodRef), ...schemas);
7174
+ return mergeSchemas(baseSchema, parseDescription(zodRef), ...schemas);
6940
7175
  }
6941
7176
  function parseNumber({
6942
7177
  zodRef,
@@ -6946,7 +7181,7 @@ function parseNumber({
6946
7181
  type: "number",
6947
7182
  format: "float"
6948
7183
  };
6949
- const { checks = [] } = zodRef._def;
7184
+ const checks = getChecks(zodRef);
6950
7185
  checks.forEach((item) => {
6951
7186
  switch (item.kind) {
6952
7187
  case "max":
@@ -6967,7 +7202,7 @@ function parseNumber({
6967
7202
  baseSchema.multipleOf = item.value;
6968
7203
  }
6969
7204
  });
6970
- return (0, import_ts_deepmerge.default)(baseSchema, parseDescription(zodRef), ...schemas);
7205
+ return mergeSchemas(baseSchema, parseDescription(zodRef), ...schemas);
6971
7206
  }
6972
7207
  function getExcludedDefinitionsFromSchema(schemas) {
6973
7208
  const excludedDefinitions = [];
@@ -6984,23 +7219,27 @@ function parseObject({
6984
7219
  useOutput,
6985
7220
  hideDefinitions
6986
7221
  }) {
6987
- var _a;
6988
7222
  let additionalProperties;
6989
- if (!(zodRef._def.catchall instanceof import_zod.z.ZodNever || ((_a = zodRef._def.catchall) == null ? void 0 : _a._def.typeName) === "ZodNever"))
6990
- additionalProperties = generateSchema(zodRef._def.catchall, useOutput);
6991
- else if (zodRef._def.unknownKeys === "passthrough")
7223
+ const catchall = getCatchall(zodRef);
7224
+ const unknownKeys = getUnknownKeys(zodRef);
7225
+ if (!(catchall instanceof import_zod.z.ZodNever || catchall && getTypeName(catchall) === "ZodNever")) {
7226
+ if (catchall) {
7227
+ additionalProperties = generateSchema(catchall, useOutput);
7228
+ }
7229
+ } else if (unknownKeys === "passthrough") {
6992
7230
  additionalProperties = true;
6993
- else if (zodRef._def.unknownKeys === "strict")
7231
+ } else if (unknownKeys === "strict") {
6994
7232
  additionalProperties = false;
7233
+ }
6995
7234
  additionalProperties = additionalProperties != null ? { additionalProperties } : {};
6996
- const requiredProperties = Object.keys(
6997
- zodRef.shape
6998
- ).filter((key) => {
6999
- const item = zodRef.shape[key];
7000
- return !(item.isOptional() || item instanceof import_zod.z.ZodDefault || item._def.typeName === "ZodDefault") && !(item instanceof import_zod.z.ZodNever || item._def.typeName === "ZodDefault");
7235
+ const objectShape = getShape(zodRef) || {};
7236
+ const requiredProperties = Object.keys(objectShape).filter((key) => {
7237
+ const item = objectShape[key];
7238
+ const itemTypeName = getTypeName(item);
7239
+ return !(item.isOptional() || item instanceof import_zod.z.ZodDefault || itemTypeName === "ZodDefault") && !(item instanceof import_zod.z.ZodNever || itemTypeName === "ZodDefault");
7001
7240
  });
7002
7241
  const required = requiredProperties.length > 0 ? { required: requiredProperties } : {};
7003
- return (0, import_ts_deepmerge.default)(
7242
+ return mergeSchemas(
7004
7243
  {
7005
7244
  type: "object",
7006
7245
  properties: iterateZodObject({
@@ -7022,10 +7261,11 @@ function parseRecord({
7022
7261
  schemas,
7023
7262
  useOutput
7024
7263
  }) {
7025
- return (0, import_ts_deepmerge.default)(
7264
+ const valueType = getRecordValueType(zodRef);
7265
+ return mergeSchemas(
7026
7266
  {
7027
7267
  type: "object",
7028
- additionalProperties: zodRef._def.valueType instanceof import_zod.z.ZodUnknown ? {} : generateSchema(zodRef._def.valueType, useOutput)
7268
+ additionalProperties: valueType instanceof import_zod.z.ZodUnknown ? {} : valueType ? generateSchema(valueType, useOutput) : {}
7029
7269
  },
7030
7270
  parseDescription(zodRef),
7031
7271
  ...schemas
@@ -7035,7 +7275,7 @@ function parseBigInt({
7035
7275
  zodRef,
7036
7276
  schemas
7037
7277
  }) {
7038
- return (0, import_ts_deepmerge.default)(
7278
+ return mergeSchemas(
7039
7279
  { type: "integer", format: "int64" },
7040
7280
  parseDescription(zodRef),
7041
7281
  ...schemas
@@ -7045,21 +7285,21 @@ function parseBoolean({
7045
7285
  zodRef,
7046
7286
  schemas
7047
7287
  }) {
7048
- return (0, import_ts_deepmerge.default)(
7288
+ return mergeSchemas(
7049
7289
  { type: "boolean" },
7050
7290
  parseDescription(zodRef),
7051
7291
  ...schemas
7052
7292
  );
7053
7293
  }
7054
7294
  function parseDate({ zodRef, schemas }) {
7055
- return (0, import_ts_deepmerge.default)(
7295
+ return mergeSchemas(
7056
7296
  { type: "string", format: "date-time" },
7057
7297
  parseDescription(zodRef),
7058
7298
  ...schemas
7059
7299
  );
7060
7300
  }
7061
7301
  function parseNull({ zodRef, schemas }) {
7062
- return (0, import_ts_deepmerge.default)(
7302
+ return mergeSchemas(
7063
7303
  {
7064
7304
  nullable: true
7065
7305
  },
@@ -7072,7 +7312,7 @@ function parseOptional({
7072
7312
  zodRef,
7073
7313
  useOutput
7074
7314
  }) {
7075
- return (0, import_ts_deepmerge.default)(
7315
+ return mergeSchemas(
7076
7316
  generateSchema(zodRef.unwrap(), useOutput),
7077
7317
  parseDescription(zodRef),
7078
7318
  ...schemas
@@ -7084,7 +7324,7 @@ function parseNullable({
7084
7324
  useOutput
7085
7325
  }) {
7086
7326
  const schema = generateSchema(zodRef.unwrap(), useOutput);
7087
- return (0, import_ts_deepmerge.default)(
7327
+ return mergeSchemas(
7088
7328
  { ...schema, type: schema.type, nullable: true },
7089
7329
  parseDescription(zodRef),
7090
7330
  ...schemas
@@ -7095,10 +7335,11 @@ function parseDefault({
7095
7335
  zodRef,
7096
7336
  useOutput
7097
7337
  }) {
7098
- return (0, import_ts_deepmerge.default)(
7338
+ const innerType = getInnerType(zodRef);
7339
+ return mergeSchemas(
7099
7340
  {
7100
- default: zodRef._def.defaultValue(),
7101
- ...generateSchema(zodRef._def.innerType, useOutput)
7341
+ default: getDefaultValue(zodRef),
7342
+ ...innerType ? generateSchema(innerType, useOutput) : {}
7102
7343
  },
7103
7344
  parseDescription(zodRef),
7104
7345
  ...schemas
@@ -7110,15 +7351,16 @@ function parseArray({
7110
7351
  useOutput
7111
7352
  }) {
7112
7353
  const constraints = {};
7113
- if (zodRef._def.exactLength != null) {
7114
- constraints.minItems = zodRef._def.exactLength.value;
7115
- constraints.maxItems = zodRef._def.exactLength.value;
7116
- }
7117
- if (zodRef._def.minLength != null)
7118
- constraints.minItems = zodRef._def.minLength.value;
7119
- if (zodRef._def.maxLength != null)
7120
- constraints.maxItems = zodRef._def.maxLength.value;
7121
- return (0, import_ts_deepmerge.default)(
7354
+ const { exactLength, minLength, maxLength } = getArrayConstraints(zodRef);
7355
+ if (exactLength != null) {
7356
+ constraints.minItems = exactLength.value;
7357
+ constraints.maxItems = exactLength.value;
7358
+ }
7359
+ if (minLength != null)
7360
+ constraints.minItems = minLength.value;
7361
+ if (maxLength != null)
7362
+ constraints.maxItems = maxLength.value;
7363
+ return mergeSchemas(
7122
7364
  {
7123
7365
  type: "array",
7124
7366
  items: generateSchema(zodRef.element, useOutput),
@@ -7128,27 +7370,31 @@ function parseArray({
7128
7370
  ...schemas
7129
7371
  );
7130
7372
  }
7131
- function parseLiteral({
7132
- schemas,
7133
- zodRef
7134
- }) {
7135
- return (0, import_ts_deepmerge.default)(
7373
+ function parseLiteral({ schemas, zodRef }) {
7374
+ const value = getLiteralValue(zodRef);
7375
+ return mergeSchemas(
7136
7376
  {
7137
- type: typeof zodRef._def.value,
7138
- enum: [zodRef._def.value]
7377
+ type: typeof value,
7378
+ enum: [value]
7139
7379
  },
7140
7380
  parseDescription(zodRef),
7141
7381
  ...schemas
7142
7382
  );
7143
7383
  }
7144
- function parseEnum({
7145
- schemas,
7146
- zodRef
7147
- }) {
7148
- return (0, import_ts_deepmerge.default)(
7384
+ function parseEnum({ schemas, zodRef }) {
7385
+ const values = getEnumValues(zodRef);
7386
+ if (!values) {
7387
+ return mergeSchemas(
7388
+ { type: "string" },
7389
+ parseDescription(zodRef),
7390
+ ...schemas
7391
+ );
7392
+ }
7393
+ const valuesArray = Array.isArray(values) ? values : Object.values(values);
7394
+ return mergeSchemas(
7149
7395
  {
7150
- type: typeof Object.values(zodRef._def.values)[0],
7151
- enum: Object.values(zodRef._def.values)
7396
+ type: typeof valuesArray[0],
7397
+ enum: valuesArray
7152
7398
  },
7153
7399
  parseDescription(zodRef),
7154
7400
  ...schemas
@@ -7159,11 +7405,12 @@ function parseIntersection({
7159
7405
  zodRef,
7160
7406
  useOutput
7161
7407
  }) {
7162
- return (0, import_ts_deepmerge.default)(
7408
+ const { left, right } = getIntersectionParts(zodRef);
7409
+ return mergeSchemas(
7163
7410
  {
7164
7411
  allOf: [
7165
- generateSchema(zodRef._def.left, useOutput),
7166
- generateSchema(zodRef._def.right, useOutput)
7412
+ left ? generateSchema(left, useOutput) : {},
7413
+ right ? generateSchema(right, useOutput) : {}
7167
7414
  ]
7168
7415
  },
7169
7416
  parseDescription(zodRef),
@@ -7175,21 +7422,21 @@ function parseUnion({
7175
7422
  zodRef,
7176
7423
  useOutput
7177
7424
  }) {
7178
- const contents = zodRef._def.options;
7425
+ const contents = getUnionOptions(zodRef);
7179
7426
  if (contents.reduce(
7180
- (prev, content) => prev && content._def.typeName === "ZodLiteral",
7427
+ (prev, content) => prev && getTypeName(content) === "ZodLiteral",
7181
7428
  true
7182
7429
  )) {
7183
7430
  const literals = contents;
7184
- const type = literals.reduce(
7185
- (prev, content) => !prev || prev === typeof content._def.value ? typeof content._def.value : null,
7186
- null
7187
- );
7431
+ const type = literals.reduce((prev, content) => {
7432
+ const value = getLiteralValue(content);
7433
+ return !prev || prev === typeof value ? typeof value : null;
7434
+ }, null);
7188
7435
  if (type) {
7189
- return (0, import_ts_deepmerge.default)(
7436
+ return mergeSchemas(
7190
7437
  {
7191
7438
  type,
7192
- enum: literals.map((literal) => literal._def.value)
7439
+ enum: literals.map((literal) => getLiteralValue(literal))
7193
7440
  },
7194
7441
  parseDescription(zodRef),
7195
7442
  ...schemas
@@ -7197,12 +7444,12 @@ function parseUnion({
7197
7444
  }
7198
7445
  }
7199
7446
  const isNullable = contents.some(
7200
- (content) => content._def.typeName === "ZodNull"
7447
+ (content) => getTypeName(content) === "ZodNull"
7201
7448
  );
7202
7449
  const nonNullContents = contents.filter(
7203
- (content) => content._def.typeName !== "ZodNull"
7450
+ (content) => getTypeName(content) !== "ZodNull"
7204
7451
  );
7205
- return (0, import_ts_deepmerge.default)(
7452
+ return mergeSchemas(
7206
7453
  {
7207
7454
  oneOf: nonNullContents.map((schema) => generateSchema(schema, useOutput)),
7208
7455
  ...isNullable ? { nullable: true } : {}
@@ -7216,14 +7463,12 @@ function parseDiscriminatedUnion({
7216
7463
  zodRef,
7217
7464
  useOutput
7218
7465
  }) {
7219
- return (0, import_ts_deepmerge.default)(
7466
+ const discriminator = getDiscriminator(zodRef);
7467
+ const options = getUnionOptions(zodRef);
7468
+ return mergeSchemas(
7220
7469
  {
7221
- discriminator: {
7222
- propertyName: zodRef._def.discriminator
7223
- },
7224
- oneOf: Array.from(
7225
- zodRef._def.options.values()
7226
- ).map((schema) => generateSchema(schema, useOutput))
7470
+ ...discriminator ? { discriminator: { propertyName: discriminator } } : {},
7471
+ oneOf: options.map((schema) => generateSchema(schema, useOutput))
7227
7472
  },
7228
7473
  parseDescription(zodRef),
7229
7474
  ...schemas
@@ -7233,36 +7478,33 @@ function parseNever({
7233
7478
  zodRef,
7234
7479
  schemas
7235
7480
  }) {
7236
- return (0, import_ts_deepmerge.default)({ readOnly: true }, parseDescription(zodRef), ...schemas);
7481
+ return mergeSchemas({ readOnly: true }, parseDescription(zodRef), ...schemas);
7237
7482
  }
7238
- function parseBranded({
7239
- schemas,
7240
- zodRef
7241
- }) {
7242
- return (0, import_ts_deepmerge.default)(generateSchema(zodRef._def.type), ...schemas);
7483
+ function parseBranded({ schemas, zodRef }) {
7484
+ const type = getBrandedType(zodRef);
7485
+ return mergeSchemas(type ? generateSchema(type) : {}, ...schemas);
7243
7486
  }
7244
7487
  function catchAllParser({
7245
7488
  zodRef,
7246
7489
  schemas
7247
7490
  }) {
7248
- return (0, import_ts_deepmerge.default)(parseDescription(zodRef), ...schemas);
7491
+ return mergeSchemas(parseDescription(zodRef), ...schemas);
7249
7492
  }
7250
- function parsePipeline({
7251
- zodRef,
7252
- useOutput
7253
- }) {
7254
- if (useOutput) {
7255
- return generateSchema(zodRef._def.out, useOutput);
7493
+ function parsePipeline({ zodRef, useOutput }) {
7494
+ const { in: inSchema, out: outSchema } = getPipelineParts(zodRef);
7495
+ if (useOutput && outSchema) {
7496
+ return generateSchema(outSchema, useOutput);
7256
7497
  }
7257
- return generateSchema(zodRef._def.in, useOutput);
7498
+ return inSchema ? generateSchema(inSchema, useOutput) : {};
7258
7499
  }
7259
7500
  function parseReadonly({
7260
7501
  zodRef,
7261
7502
  useOutput,
7262
7503
  schemas
7263
7504
  }) {
7264
- return (0, import_ts_deepmerge.default)(
7265
- generateSchema(zodRef._def.innerType, useOutput),
7505
+ const innerType = getInnerType(zodRef);
7506
+ return mergeSchemas(
7507
+ innerType ? generateSchema(innerType, useOutput) : {},
7266
7508
  parseDescription(zodRef),
7267
7509
  ...schemas
7268
7510
  );
@@ -7308,7 +7550,7 @@ function generateSchema(zodRef, useOutput) {
7308
7550
  ...Array.isArray(metaOpenApi) ? metaOpenApi : [metaOpenApi]
7309
7551
  ];
7310
7552
  try {
7311
- const typeName = zodRef._def.typeName;
7553
+ const typeName = getTypeName(zodRef);
7312
7554
  if (typeName in workerMap) {
7313
7555
  return workerMap[typeName]({
7314
7556
  zodRef,
@@ -7485,6 +7727,12 @@ You can also define "securityObjects" this way, if you want to make the endpoint
7485
7727
  )) {
7486
7728
  globalSchemas[schemaName] = generateSchema(zodSchema);
7487
7729
  }
7730
+ for (const [key, value] of Object.entries(globalSchemas)) {
7731
+ if (key === "batch") {
7732
+ const schemaWithReferences = embedSchemaReferences(value, globalSchemas);
7733
+ globalSchemas[key] = schemaWithReferences;
7734
+ }
7735
+ }
7488
7736
  const builder = import_oas31.OpenApiBuilder.create({
7489
7737
  openapi: "3.0.0",
7490
7738
  info: {
@@ -7536,9 +7784,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
7536
7784
  if (isPostOrPutOrPatch) {
7537
7785
  body_to_generate_schema = (_c = routeSpec.jsonBody) != null ? _c : routeSpec.commonParams;
7538
7786
  if (routeSpec.jsonBody && routeSpec.commonParams) {
7539
- body_to_generate_schema = routeSpec.jsonBody.merge(
7540
- routeSpec.commonParams
7541
- );
7787
+ body_to_generate_schema = routeSpec.jsonBody.merge(routeSpec.commonParams);
7542
7788
  }
7543
7789
  } else {
7544
7790
  body_to_generate_schema = routeSpec.jsonBody;
@@ -7549,9 +7795,7 @@ You can also define "securityObjects" this way, if you want to make the endpoint
7549
7795
  } else {
7550
7796
  query_to_generate_schema = (_d = routeSpec.queryParams) != null ? _d : routeSpec.commonParams;
7551
7797
  if (routeSpec.queryParams && routeSpec.commonParams) {
7552
- query_to_generate_schema = routeSpec.queryParams.merge(
7553
- routeSpec.commonParams
7554
- );
7798
+ query_to_generate_schema = routeSpec.queryParams.merge(routeSpec.commonParams);
7555
7799
  }
7556
7800
  }
7557
7801
  const route = {
@@ -7604,7 +7848,8 @@ You can also define "securityObjects" this way, if you want to make the endpoint
7604
7848
  const { jsonResponse } = routeSpec;
7605
7849
  const { addOkStatus = true } = setupParams;
7606
7850
  if (jsonResponse) {
7607
- if (!jsonResponse._def || !jsonResponse._def.typeName || jsonResponse._def.typeName !== "ZodObject") {
7851
+ const jsonResponseTypeName = getTypeName(jsonResponse);
7852
+ if (jsonResponseTypeName !== "ZodObject") {
7608
7853
  console.warn(
7609
7854
  chalk2.yellow(
7610
7855
  `Skipping route ${routePath} because the response is not a ZodObject.`
@@ -7737,9 +7982,9 @@ var resolveOptions = (raw) => {
7737
7982
  };
7738
7983
  var callGetType = (zod, identifier, options) => {
7739
7984
  let type;
7740
- const getTypeSchema = zod;
7741
- if (getTypeSchema._def.getType)
7742
- type = getTypeSchema._def.getType(import_typescript.default, identifier, options);
7985
+ const getType = getCustomTypeGetter(zod);
7986
+ if (getType)
7987
+ type = getType(import_typescript.default, identifier, options);
7743
7988
  return type;
7744
7989
  };
7745
7990
  var zodToTs = (zod, identifier, options) => {
@@ -7756,7 +8001,7 @@ var zodToTs = (zod, identifier, options) => {
7756
8001
  return { node, store };
7757
8002
  };
7758
8003
  var zodToTsNode = (zod, identifier, store, options) => {
7759
- const typeName = zod._def.typeName;
8004
+ const typeName = getTypeName(zod);
7760
8005
  const getTypeType = callGetType(zod, identifier, options);
7761
8006
  if (getTypeType && typeName !== "ZodNativeEnum") {
7762
8007
  return maybeIdentifierToTypeReference(getTypeType);
@@ -7806,7 +8051,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
7806
8051
  }
7807
8052
  case "ZodLiteral": {
7808
8053
  let literal;
7809
- const literalValue = zod._def.value;
8054
+ const literalValue = getLiteralValue(zod);
7810
8055
  switch (typeof literalValue) {
7811
8056
  case "number": {
7812
8057
  literal = f.createNumericLiteral(literalValue);
@@ -7824,11 +8069,12 @@ var zodToTsNode = (zod, identifier, store, options) => {
7824
8069
  return f.createLiteralTypeNode(literal);
7825
8070
  }
7826
8071
  case "ZodObject": {
7827
- const properties = Object.entries(zod._def.shape());
8072
+ const shape = getShape(zod) || {};
8073
+ const properties = Object.entries(shape);
7828
8074
  const members = properties.map(([key, value]) => {
7829
8075
  const nextZodNode = value;
7830
8076
  const type = zodToTsNode(nextZodNode, ...otherArguments);
7831
- const { typeName: nextZodNodeTypeName } = nextZodNode._def;
8077
+ const nextZodNodeTypeName = getTypeName(nextZodNode);
7832
8078
  const isOptional = nextZodNodeTypeName === "ZodOptional" || nextZodNode.isOptional();
7833
8079
  const propertySignature = f.createPropertySignature(
7834
8080
  void 0,
@@ -7844,43 +8090,48 @@ var zodToTsNode = (zod, identifier, store, options) => {
7844
8090
  return f.createTypeLiteralNode(members);
7845
8091
  }
7846
8092
  case "ZodArray": {
7847
- const type = zodToTsNode(zod._def.type, ...otherArguments);
8093
+ const arrayType = getArrayType(zod);
8094
+ const type = arrayType ? zodToTsNode(arrayType, ...otherArguments) : createUnknownKeywordNode();
7848
8095
  const node = f.createArrayTypeNode(type);
7849
8096
  return node;
7850
8097
  }
7851
8098
  case "ZodEnum": {
7852
- const types = zod._def.values.map(
8099
+ const values = getEnumValues(zod);
8100
+ const valuesArray = Array.isArray(values) ? values : Object.values(values);
8101
+ const types = valuesArray.map(
7853
8102
  (value) => f.createLiteralTypeNode(f.createStringLiteral(value))
7854
8103
  );
7855
8104
  return f.createUnionTypeNode(types);
7856
8105
  }
7857
8106
  case "ZodUnion": {
7858
- const options2 = zod._def.options;
7859
- const types = options2.map(
8107
+ const unionOptions = getUnionOptions(zod);
8108
+ const types = unionOptions.map(
7860
8109
  (option) => zodToTsNode(option, ...otherArguments)
7861
8110
  );
7862
8111
  return f.createUnionTypeNode(types);
7863
8112
  }
7864
8113
  case "ZodDiscriminatedUnion": {
7865
- const options2 = [...zod._def.options.values()];
7866
- const types = options2.map(
8114
+ const unionOptions = getUnionOptions(zod);
8115
+ const types = unionOptions.map(
7867
8116
  (option) => zodToTsNode(option, ...otherArguments)
7868
8117
  );
7869
8118
  return f.createUnionTypeNode(types);
7870
8119
  }
7871
8120
  case "ZodEffects": {
7872
- const node = zodToTsNode(
7873
- zod._def.schema,
7874
- ...otherArguments
7875
- );
8121
+ const effectsSchema = getEffectsSchema(zod);
8122
+ if (!effectsSchema)
8123
+ return createUnknownKeywordNode();
8124
+ const node = zodToTsNode(effectsSchema, ...otherArguments);
7876
8125
  return node;
7877
8126
  }
7878
8127
  case "ZodNativeEnum": {
7879
8128
  const type = getTypeType;
8129
+ const enumValues = getEnumValues(zod);
8130
+ const enumValuesObj = typeof enumValues === "object" && !Array.isArray(enumValues) ? enumValues : {};
7880
8131
  if (options.nativeEnums === "union") {
7881
8132
  if (type)
7882
8133
  return maybeIdentifierToTypeReference(type);
7883
- const types = Object.values(zod._def.values).map((value) => {
8134
+ const types = Object.values(enumValuesObj).map((value) => {
7884
8135
  if (typeof value === "number") {
7885
8136
  return f.createLiteralTypeNode(f.createNumericLiteral(value));
7886
8137
  }
@@ -7892,7 +8143,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
7892
8143
  return createUnknownKeywordNode();
7893
8144
  if (options.nativeEnums === "resolve") {
7894
8145
  const enumMembers = Object.entries(
7895
- zod._def.values
8146
+ enumValuesObj
7896
8147
  ).map(([key, value]) => {
7897
8148
  const literal = typeof value === "number" ? f.createNumericLiteral(value) : f.createStringLiteral(value);
7898
8149
  return f.createEnumMember(getIdentifierOrStringLiteral(key), literal);
@@ -7910,33 +8161,35 @@ var zodToTsNode = (zod, identifier, store, options) => {
7910
8161
  return maybeIdentifierToTypeReference(type);
7911
8162
  }
7912
8163
  case "ZodOptional": {
7913
- const innerType = zodToTsNode(
7914
- zod._def.innerType,
7915
- ...otherArguments
7916
- );
8164
+ const inner = getInnerType(zod);
8165
+ if (!inner)
8166
+ return createUnknownKeywordNode();
8167
+ const innerType = zodToTsNode(inner, ...otherArguments);
7917
8168
  return f.createUnionTypeNode([
7918
8169
  innerType,
7919
8170
  f.createKeywordTypeNode(SyntaxKind.UndefinedKeyword)
7920
8171
  ]);
7921
8172
  }
7922
8173
  case "ZodNullable": {
7923
- const innerType = zodToTsNode(
7924
- zod._def.innerType,
7925
- ...otherArguments
7926
- );
8174
+ const inner = getInnerType(zod);
8175
+ if (!inner)
8176
+ return createUnknownKeywordNode();
8177
+ const innerType = zodToTsNode(inner, ...otherArguments);
7927
8178
  return f.createUnionTypeNode([
7928
8179
  innerType,
7929
8180
  f.createLiteralTypeNode(f.createNull())
7930
8181
  ]);
7931
8182
  }
7932
8183
  case "ZodTuple": {
7933
- const types = zod._def.items.map(
8184
+ const items = getTupleItems(zod);
8185
+ const types = items.map(
7934
8186
  (option) => zodToTsNode(option, ...otherArguments)
7935
8187
  );
7936
8188
  return f.createTupleTypeNode(types);
7937
8189
  }
7938
8190
  case "ZodRecord": {
7939
- const valueType = zodToTsNode(zod._def.valueType, ...otherArguments);
8191
+ const recordValueType = getRecordValueType(zod);
8192
+ const valueType = recordValueType ? zodToTsNode(recordValueType, ...otherArguments) : createUnknownKeywordNode();
7940
8193
  const node = f.createTypeLiteralNode([
7941
8194
  f.createIndexSignature(
7942
8195
  void 0,
@@ -7955,8 +8208,9 @@ var zodToTsNode = (zod, identifier, store, options) => {
7955
8208
  return node;
7956
8209
  }
7957
8210
  case "ZodMap": {
7958
- const valueType = zodToTsNode(zod._def.valueType, ...otherArguments);
7959
- const keyType = zodToTsNode(zod._def.keyType, ...otherArguments);
8211
+ const { keyType: mapKeyType, valueType: mapValueType } = getMapTypes(zod);
8212
+ const valueType = mapValueType ? zodToTsNode(mapValueType, ...otherArguments) : createUnknownKeywordNode();
8213
+ const keyType = mapKeyType ? zodToTsNode(mapKeyType, ...otherArguments) : createUnknownKeywordNode();
7960
8214
  const node = f.createTypeReferenceNode(f.createIdentifier("Map"), [
7961
8215
  keyType,
7962
8216
  valueType
@@ -7964,25 +8218,30 @@ var zodToTsNode = (zod, identifier, store, options) => {
7964
8218
  return node;
7965
8219
  }
7966
8220
  case "ZodSet": {
7967
- const type = zodToTsNode(zod._def.valueType, ...otherArguments);
8221
+ const setValueType = getSetValueType(zod);
8222
+ const type = setValueType ? zodToTsNode(setValueType, ...otherArguments) : createUnknownKeywordNode();
7968
8223
  const node = f.createTypeReferenceNode(f.createIdentifier("Set"), [type]);
7969
8224
  return node;
7970
8225
  }
7971
8226
  case "ZodIntersection": {
7972
- const left = zodToTsNode(zod._def.left, ...otherArguments);
7973
- const right = zodToTsNode(zod._def.right, ...otherArguments);
8227
+ const { left: intersectLeft, right: intersectRight } = getIntersectionParts(zod);
8228
+ const left = intersectLeft ? zodToTsNode(intersectLeft, ...otherArguments) : createUnknownKeywordNode();
8229
+ const right = intersectRight ? zodToTsNode(intersectRight, ...otherArguments) : createUnknownKeywordNode();
7974
8230
  const node = f.createIntersectionTypeNode([left, right]);
7975
8231
  return node;
7976
8232
  }
7977
8233
  case "ZodPromise": {
7978
- const type = zodToTsNode(zod._def.type, ...otherArguments);
8234
+ const promiseType = getPromiseType(zod);
8235
+ const type = promiseType ? zodToTsNode(promiseType, ...otherArguments) : createUnknownKeywordNode();
7979
8236
  const node = f.createTypeReferenceNode(f.createIdentifier("Promise"), [
7980
8237
  type
7981
8238
  ]);
7982
8239
  return node;
7983
8240
  }
7984
8241
  case "ZodFunction": {
7985
- const argumentTypes = zod._def.args._def.items.map(
8242
+ const { args: funcArgs, returns: funcReturns } = getFunctionParts(zod);
8243
+ const argsItems = funcArgs ? getTupleItems(funcArgs) : [];
8244
+ const argumentTypes = argsItems.map(
7986
8245
  (argument, index) => {
7987
8246
  const argumentType = zodToTsNode(argument, ...otherArguments);
7988
8247
  return f.createParameterDeclaration(
@@ -8003,7 +8262,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
8003
8262
  f.createArrayTypeNode(createUnknownKeywordNode())
8004
8263
  )
8005
8264
  );
8006
- const returnType = zodToTsNode(zod._def.returns, ...otherArguments);
8265
+ const returnType = funcReturns ? zodToTsNode(funcReturns, ...otherArguments) : createUnknownKeywordNode();
8007
8266
  const node = f.createFunctionTypeNode(
8008
8267
  void 0,
8009
8268
  argumentTypes,
@@ -8012,10 +8271,10 @@ var zodToTsNode = (zod, identifier, store, options) => {
8012
8271
  return node;
8013
8272
  }
8014
8273
  case "ZodDefault": {
8015
- const type = zodToTsNode(
8016
- zod._def.innerType,
8017
- ...otherArguments
8018
- );
8274
+ const defaultInner = getInnerType(zod);
8275
+ if (!defaultInner)
8276
+ return createUnknownKeywordNode();
8277
+ const type = zodToTsNode(defaultInner, ...otherArguments);
8019
8278
  const filteredNodes = [];
8020
8279
  type.forEachChild((node) => {
8021
8280
  if (![SyntaxKind.UndefinedKeyword].includes(node.kind)) {
@@ -8033,7 +8292,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
8033
8292
  var import_prettier = __toESM(require("prettier"));
8034
8293
  var import_zod4 = require("zod");
8035
8294
  var generateRouteTypes = async (opts) => {
8036
- var _a, _b, _c;
8295
+ var _a, _b;
8037
8296
  const filepathToRoute = await parseRoutesInPackage(opts);
8038
8297
  const sortedRoutes = Array.from(filepathToRoute.entries()).sort(
8039
8298
  (a, b) => a[1].route.localeCompare(b[1].route)
@@ -8044,17 +8303,29 @@ var generateRouteTypes = async (opts) => {
8044
8303
  const routeDefs = [];
8045
8304
  for (const [_2, { route, routeSpec, setupParams }] of filteredRoutes) {
8046
8305
  const maxDuration = (_a = routeSpec.maxDuration) != null ? _a : setupParams.maxDuration;
8047
- const queryKeys = Object.keys((_c = (_b = routeSpec.queryParams) == null ? void 0 : _b.shape) != null ? _c : {});
8306
+ const queryKeys = Object.keys(
8307
+ routeSpec.queryParams ? (_b = getShape(routeSpec.queryParams)) != null ? _b : {} : {}
8308
+ );
8048
8309
  const pathParameters = queryKeys.filter((key) => route.includes(`[${key}]`));
8049
8310
  let queryParams = routeSpec.queryParams;
8050
- while (queryParams && ("sourceType" in queryParams || "unwrap" in queryParams)) {
8051
- if ("sourceType" in queryParams) {
8052
- queryParams = queryParams.sourceType();
8053
- } else if ("unwrap" in queryParams) {
8054
- queryParams = queryParams.unwrap();
8311
+ while (queryParams) {
8312
+ const typeName = getTypeName(queryParams);
8313
+ if (typeName === "ZodEffects") {
8314
+ const inner = getEffectsSchema(queryParams);
8315
+ if (inner) {
8316
+ queryParams = inner;
8317
+ continue;
8318
+ }
8319
+ } else if (typeName === "ZodOptional") {
8320
+ const inner = getInnerType(queryParams);
8321
+ if (inner) {
8322
+ queryParams = inner;
8323
+ continue;
8324
+ }
8055
8325
  }
8326
+ break;
8056
8327
  }
8057
- if (queryParams && "omit" in queryParams) {
8328
+ if (queryParams && "omit" in queryParams && typeof queryParams.omit === "function") {
8058
8329
  queryParams = queryParams.omit(
8059
8330
  Object.fromEntries(pathParameters.map((param) => [param, true]))
8060
8331
  );
@@ -8265,4 +8536,4 @@ var extractRouteSpecs = async (opts) => {
8265
8536
  */
8266
8537
  /*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
8267
8538
  /*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
8268
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzdXAvYXNzZXRzL2Nqc19zaGltcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9tZXJnZTIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvYXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZXJybm8uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZnMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0aC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZXh0Z2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL25vZGVfbW9kdWxlcy9nbG9iLXBhcmVudC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi91dGlscy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9zdHJpbmdpZnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW51bWJlci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdG8tcmVnZXgtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGwtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29tcGlsZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9leHBhbmQuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL3BhcnNlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3NjYW4uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGFyc2UuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGljb21hdGNoLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pY3JvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0dGVybi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvc3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3V0aWxzL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L21hbmFnZXJzL3Rhc2tzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9wcm92aWRlcnMvYXN5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9hZGFwdGVycy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc3RhdC9vdXQvc2V0dGluZ3MuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWV1ZS1taWNyb3Rhc2svaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3J1bi1wYXJhbGxlbC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC91dGlscy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvdXRpbHMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9jb21tb24uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvcHJvdmlkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L2FkYXB0ZXJzL2ZzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JldXNpZnkvcmV1c2lmeS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdHEvcXVldWUuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3JlYWRlcnMvY29tbW9uLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3JlYWRlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcHJvdmlkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9yZWFkZXIuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvbWF0Y2hlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvcGFydGlhbC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvZmlsdGVycy9kZWVwLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2VudHJ5LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2Vycm9yLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy90cmFuc2Zvcm1lcnMvZW50cnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL3Byb3ZpZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3JlYWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGF0aC10eXBlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kaXItZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaWdub3JlL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zbGFzaC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2lnbm9yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2luZGV4LmpzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvem9kLW9wZW5hcGkudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2Zyb250LW1hdHRlci50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9lbWJlZC1zY2hlbWEtcmVmZXJlbmNlcy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2Zlcm4tc2RrLXV0aWxzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLXJvdXRlLXR5cGVzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2QtdG8tdHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZXh0cmFjdC1yb3V0ZS1zcGVjLXNjaGVtYXMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIFNoaW0gZ2xvYmFscyBpbiBjanMgYnVuZGxlXG4vLyBUaGVyZSdzIGEgd2VpcmQgYnVnIHRoYXQgZXNidWlsZCB3aWxsIGFsd2F5cyBpbmplY3QgaW1wb3J0TWV0YVVybFxuLy8gaWYgd2UgZXhwb3J0IGl0IGFzIGBjb25zdCBpbXBvcnRNZXRhVXJsID0gLi4uIF9fZmlsZW5hbWUgLi4uYFxuLy8gQnV0IHVzaW5nIGEgZnVuY3Rpb24gd2lsbCBub3QgY2F1c2UgdGhpcyBpc3N1ZVxuXG5jb25zdCBnZXRJbXBvcnRNZXRhVXJsID0gKCkgPT5cbiAgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJ1xuICAgID8gbmV3IFVSTCgnZmlsZTonICsgX19maWxlbmFtZSkuaHJlZlxuICAgIDogKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpIHx8XG4gICAgICBuZXcgVVJMKCdtYWluLmpzJywgZG9jdW1lbnQuYmFzZVVSSSkuaHJlZlxuXG5leHBvcnQgY29uc3QgaW1wb3J0TWV0YVVybCA9IC8qIEBfX1BVUkVfXyAqLyBnZXRJbXBvcnRNZXRhVXJsKClcbiIsICJjb25zdCBBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUID0gMTA7XG5cbmNvbnN0IHdyYXBBbnNpMTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlske2NvZGUgKyBvZmZzZXR9bWA7XG5cbmNvbnN0IHdyYXBBbnNpMjU2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07NTske2NvZGV9bWA7XG5cbmNvbnN0IHdyYXBBbnNpMTZtID0gKG9mZnNldCA9IDApID0+IChyZWQsIGdyZWVuLCBibHVlKSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTsyOyR7cmVkfTske2dyZWVufTske2JsdWV9bWA7XG5cbmNvbnN0IHN0eWxlcyA9IHtcblx0bW9kaWZpZXI6IHtcblx0XHRyZXNldDogWzAsIDBdLFxuXHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdGRpbTogWzIsIDIyXSxcblx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdG92ZXJsaW5lOiBbNTMsIDU1XSxcblx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRzdHJpa2V0aHJvdWdoOiBbOSwgMjldLFxuXHR9LFxuXHRjb2xvcjoge1xuXHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdGdyZWVuOiBbMzIsIDM5XSxcblx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdG1hZ2VudGE6IFszNSwgMzldLFxuXHRcdGN5YW46IFszNiwgMzldLFxuXHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRncmF5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuXHRcdGdyZXk6IFs5MCwgMzldLCAvLyBBbGlhcyBvZiBgYmxhY2tCcmlnaHRgXG5cdFx0cmVkQnJpZ2h0OiBbOTEsIDM5XSxcblx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRibHVlQnJpZ2h0OiBbOTQsIDM5XSxcblx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHR3aGl0ZUJyaWdodDogWzk3LCAzOV0sXG5cdH0sXG5cdGJnQ29sb3I6IHtcblx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0YmdHcmVlbjogWzQyLCA0OV0sXG5cdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0YmdNYWdlbnRhOiBbNDUsIDQ5XSxcblx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdGJnR3JheTogWzEwMCwgNDldLCAvLyBBbGlhcyBvZiBgYmdCbGFja0JyaWdodGBcblx0XHRiZ0dyZXk6IFsxMDAsIDQ5XSwgLy8gQWxpYXMgb2YgYGJnQmxhY2tCcmlnaHRgXG5cdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0YmdZZWxsb3dCcmlnaHQ6IFsxMDMsIDQ5XSxcblx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRiZ0N5YW5CcmlnaHQ6IFsxMDYsIDQ5XSxcblx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV0sXG5cdH0sXG59O1xuXG5leHBvcnQgY29uc3QgbW9kaWZpZXJOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5tb2RpZmllcik7XG5leHBvcnQgY29uc3QgZm9yZWdyb3VuZENvbG9yTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMuY29sb3IpO1xuZXhwb3J0IGNvbnN0IGJhY2tncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLmJnQ29sb3IpO1xuZXhwb3J0IGNvbnN0IGNvbG9yTmFtZXMgPSBbLi4uZm9yZWdyb3VuZENvbG9yTmFtZXMsIC4uLmJhY2tncm91bmRDb2xvck5hbWVzXTtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYCxcblx0XHRcdH07XG5cblx0XHRcdGdyb3VwW3N0eWxlTmFtZV0gPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuXHRcdFx0Y29kZXMuc2V0KHN0eWxlWzBdLCBzdHlsZVsxXSk7XG5cdFx0fVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgZ3JvdXBOYW1lLCB7XG5cdFx0XHR2YWx1ZTogZ3JvdXAsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsICdjb2RlcycsIHtcblx0XHR2YWx1ZTogY29kZXMsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzdHlsZXMuY29sb3IuYW5zaSA9IHdyYXBBbnNpMTYoKTtcblx0c3R5bGVzLmNvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NigpO1xuXHRzdHlsZXMuY29sb3IuYW5zaTE2bSA9IHdyYXBBbnNpMTZtKCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kgPSB3cmFwQW5zaTE2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kxNm0gPSB3cmFwQW5zaTE2bShBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblxuXHQvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9RaXgtL2NvbG9yLWNvbnZlcnQvYmxvYi8zZjBlMGQ0ZTkyZTIzNTc5NmNjYjE3ZjZlODVjNzIwOTRhNjUxZjQ5L2NvbnZlcnNpb25zLmpzXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0eWxlcywge1xuXHRcdHJnYlRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWUocmVkLCBncmVlbiwgYmx1ZSkge1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHRcdFx0XHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0XHRcdFx0aWYgKHJlZCA9PT0gZ3JlZW4gJiYgZ3JlZW4gPT09IGJsdWUpIHtcblx0XHRcdFx0XHRpZiAocmVkIDwgOCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDE2O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZWQgPiAyNDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAyMzE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQoKChyZWQgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gMTZcblx0XHRcdFx0XHQrICgzNiAqIE1hdGgucm91bmQocmVkIC8gMjU1ICogNSkpXG5cdFx0XHRcdFx0KyAoNiAqIE1hdGgucm91bmQoZ3JlZW4gLyAyNTUgKiA1KSlcblx0XHRcdFx0XHQrIE1hdGgucm91bmQoYmx1ZSAvIDI1NSAqIDUpO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9SZ2I6IHtcblx0XHRcdHZhbHVlKGhleCkge1xuXHRcdFx0XHRjb25zdCBtYXRjaGVzID0gL1thLWZcXGRdezZ9fFthLWZcXGRdezN9L2kuZXhlYyhoZXgudG9TdHJpbmcoMTYpKTtcblx0XHRcdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBbY29sb3JTdHJpbmddID0gbWF0Y2hlcztcblxuXHRcdFx0XHRpZiAoY29sb3JTdHJpbmcubGVuZ3RoID09PSAzKSB7XG5cdFx0XHRcdFx0Y29sb3JTdHJpbmcgPSBbLi4uY29sb3JTdHJpbmddLm1hcChjaGFyYWN0ZXIgPT4gY2hhcmFjdGVyICsgY2hhcmFjdGVyKS5qb2luKCcnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGludGVnZXIgPSBOdW1iZXIucGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblx0XHRcdFx0XHQoaW50ZWdlciA+PiAxNikgJiAweEZGLFxuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDgpICYgMHhGRixcblx0XHRcdFx0XHRpbnRlZ2VyICYgMHhGRixcblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWJpdHdpc2UgKi9cblx0XHRcdFx0XTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMucmdiVG9BbnNpMjU2KC4uLnN0eWxlcy5oZXhUb1JnYihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0YW5zaTI1NlRvQW5zaToge1xuXHRcdFx0dmFsdWUoY29kZSkge1xuXHRcdFx0XHRpZiAoY29kZSA8IDgpIHtcblx0XHRcdFx0XHRyZXR1cm4gMzAgKyBjb2RlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGNvZGUgPCAxNikge1xuXHRcdFx0XHRcdHJldHVybiA5MCArIChjb2RlIC0gOCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgcmVkO1xuXHRcdFx0XHRsZXQgZ3JlZW47XG5cdFx0XHRcdGxldCBibHVlO1xuXG5cdFx0XHRcdGlmIChjb2RlID49IDIzMikge1xuXHRcdFx0XHRcdHJlZCA9ICgoKGNvZGUgLSAyMzIpICogMTApICsgOCkgLyAyNTU7XG5cdFx0XHRcdFx0Z3JlZW4gPSByZWQ7XG5cdFx0XHRcdFx0Ymx1ZSA9IHJlZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb2RlIC09IDE2O1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVtYWluZGVyID0gY29kZSAlIDM2O1xuXG5cdFx0XHRcdFx0cmVkID0gTWF0aC5mbG9vcihjb2RlIC8gMzYpIC8gNTtcblx0XHRcdFx0XHRncmVlbiA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gNikgLyA1O1xuXHRcdFx0XHRcdGJsdWUgPSAocmVtYWluZGVyICUgNikgLyA1O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBNYXRoLm1heChyZWQsIGdyZWVuLCBibHVlKSAqIDI7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDMwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2Vcblx0XHRcdFx0bGV0IHJlc3VsdCA9IDMwICsgKChNYXRoLnJvdW5kKGJsdWUpIDw8IDIpIHwgKE1hdGgucm91bmQoZ3JlZW4pIDw8IDEpIHwgTWF0aC5yb3VuZChyZWQpKTtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRcdFx0XHRyZXN1bHQgKz0gNjA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0cmdiVG9BbnNpOiB7XG5cdFx0XHR2YWx1ZTogKHJlZCwgZ3JlZW4sIGJsdWUpID0+IHN0eWxlcy5hbnNpMjU2VG9BbnNpKHN0eWxlcy5yZ2JUb0Fuc2kyNTYocmVkLCBncmVlbiwgYmx1ZSkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzLmFuc2kyNTZUb0Fuc2koc3R5bGVzLmhleFRvQW5zaTI1NihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdH0pO1xuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmNvbnN0IGFuc2lTdHlsZXMgPSBhc3NlbWJsZVN0eWxlcygpO1xuXG5leHBvcnQgZGVmYXVsdCBhbnNpU3R5bGVzO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgdHR5IGZyb20gJ25vZGU6dHR5JztcblxuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9oYXMtZmxhZy9ibG9iL21haW4vaW5kZXguanNcbi8vLyBmdW5jdGlvbiBoYXNGbGFnKGZsYWcsIGFyZ3YgPSBnbG9iYWxUaGlzLkRlbm8/LmFyZ3MgPz8gcHJvY2Vzcy5hcmd2KSB7XG5mdW5jdGlvbiBoYXNGbGFnKGZsYWcsIGFyZ3YgPSBnbG9iYWxUaGlzLkRlbm8gPyBnbG9iYWxUaGlzLkRlbm8uYXJncyA6IHByb2Nlc3MuYXJndikge1xuXHRjb25zdCBwcmVmaXggPSBmbGFnLnN0YXJ0c1dpdGgoJy0nKSA/ICcnIDogKGZsYWcubGVuZ3RoID09PSAxID8gJy0nIDogJy0tJyk7XG5cdGNvbnN0IHBvc2l0aW9uID0gYXJndi5pbmRleE9mKHByZWZpeCArIGZsYWcpO1xuXHRjb25zdCB0ZXJtaW5hdG9yUG9zaXRpb24gPSBhcmd2LmluZGV4T2YoJy0tJyk7XG5cdHJldHVybiBwb3NpdGlvbiAhPT0gLTEgJiYgKHRlcm1pbmF0b3JQb3NpdGlvbiA9PT0gLTEgfHwgcG9zaXRpb24gPCB0ZXJtaW5hdG9yUG9zaXRpb24pO1xufVxuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmbGFnRm9yY2VDb2xvcjtcbmlmIChcblx0aGFzRmxhZygnbm8tY29sb3InKVxuXHR8fCBoYXNGbGFnKCduby1jb2xvcnMnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1mYWxzZScpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJylcbikge1xuXHRmbGFnRm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKFxuXHRoYXNGbGFnKCdjb2xvcicpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9ycycpXG5cdHx8IGhhc0ZsYWcoJ2NvbG9yPXRydWUnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1hbHdheXMnKVxuKSB7XG5cdGZsYWdGb3JjZUNvbG9yID0gMTtcbn1cblxuZnVuY3Rpb24gZW52Rm9yY2VDb2xvcigpIHtcblx0aWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihOdW1iZXIucGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gMyxcblx0fTtcbn1cblxuZnVuY3Rpb24gX3N1cHBvcnRzQ29sb3IoaGF2ZVN0cmVhbSwge3N0cmVhbUlzVFRZLCBzbmlmZkZsYWdzID0gdHJ1ZX0gPSB7fSkge1xuXHRjb25zdCBub0ZsYWdGb3JjZUNvbG9yID0gZW52Rm9yY2VDb2xvcigpO1xuXHRpZiAobm9GbGFnRm9yY2VDb2xvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0ZmxhZ0ZvcmNlQ29sb3IgPSBub0ZsYWdGb3JjZUNvbG9yO1xuXHR9XG5cblx0Y29uc3QgZm9yY2VDb2xvciA9IHNuaWZmRmxhZ3MgPyBmbGFnRm9yY2VDb2xvciA6IG5vRmxhZ0ZvcmNlQ29sb3I7XG5cblx0aWYgKGZvcmNlQ29sb3IgPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGlmIChzbmlmZkZsYWdzKSB7XG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpXG5cdFx0XHR8fCBoYXNGbGFnKCdjb2xvcj1mdWxsJylcblx0XHRcdHx8IGhhc0ZsYWcoJ2NvbG9yPXRydWVjb2xvcicpKSB7XG5cdFx0XHRyZXR1cm4gMztcblx0XHR9XG5cblx0XHRpZiAoaGFzRmxhZygnY29sb3I9MjU2JykpIHtcblx0XHRcdHJldHVybiAyO1xuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIGZvciBBenVyZSBEZXZPcHMgcGlwZWxpbmVzLlxuXHQvLyBIYXMgdG8gYmUgYWJvdmUgdGhlIGAhc3RyZWFtSXNUVFlgIGNoZWNrLlxuXHRpZiAoJ1RGX0JVSUxEJyBpbiBlbnYgJiYgJ0FHRU5UX05BTUUnIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMFxuXHRcdFx0JiYgTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTBfNTg2XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTRfOTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoJ0dJVEhVQl9BQ1RJT05TJyBpbiBlbnYgfHwgJ0dJVEVBX0FDVElPTlMnIGluIGVudikge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdCVUlMREtJVEUnLCAnRFJPTkUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ3h0ZXJtLWtpdHR5Jykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBOdW1iZXIucGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOiB7XG5cdFx0XHRcdHJldHVybiB2ZXJzaW9uID49IDMgPyAzIDogMjtcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOiB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgbGV2ZWwgPSBfc3VwcG9ydHNDb2xvcihzdHJlYW0sIHtcblx0XHRzdHJlYW1Jc1RUWTogc3RyZWFtICYmIHN0cmVhbS5pc1RUWSxcblx0XHQuLi5vcHRpb25zLFxuXHR9KTtcblxuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5jb25zdCBzdXBwb3J0c0NvbG9yID0ge1xuXHRzdGRvdXQ6IGNyZWF0ZVN1cHBvcnRzQ29sb3Ioe2lzVFRZOiB0dHkuaXNhdHR5KDEpfSksXG5cdHN0ZGVycjogY3JlYXRlU3VwcG9ydHNDb2xvcih7aXNUVFk6IHR0eS5pc2F0dHkoMil9KSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHN1cHBvcnRzQ29sb3I7XG4iLCAiLy8gVE9ETzogV2hlbiB0YXJnZXRpbmcgTm9kZS5qcyAxNiwgdXNlIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGxgLlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdWJzdHJpbmcsIHJlcGxhY2VyKSB7XG5cdGxldCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHN1YnN0cmluZyk7XG5cdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gc3RyaW5nO1xuXHR9XG5cblx0Y29uc3Qgc3Vic3RyaW5nTGVuZ3RoID0gc3Vic3RyaW5nLmxlbmd0aDtcblx0bGV0IGVuZEluZGV4ID0gMDtcblx0bGV0IHJldHVyblZhbHVlID0gJyc7XG5cdGRvIHtcblx0XHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgsIGluZGV4KSArIHN1YnN0cmluZyArIHJlcGxhY2VyO1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyBzdWJzdHJpbmdMZW5ndGg7XG5cdFx0aW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgoc3RyaW5nLCBwcmVmaXgsIHBvc3RmaXgsIGluZGV4KSB7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0Y29uc3QgZ290Q1IgPSBzdHJpbmdbaW5kZXggLSAxXSA9PT0gJ1xccic7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCAoZ290Q1IgPyBpbmRleCAtIDEgOiBpbmRleCkpICsgcHJlZml4ICsgKGdvdENSID8gJ1xcclxcbicgOiAnXFxuJykgKyBwb3N0Zml4O1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyAxO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG4iLCAiaW1wb3J0IGFuc2lTdHlsZXMgZnJvbSAnI2Fuc2ktc3R5bGVzJztcbmltcG9ydCBzdXBwb3J0c0NvbG9yIGZyb20gJyNzdXBwb3J0cy1jb2xvcic7XG5pbXBvcnQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9vcmRlclxuXHRzdHJpbmdSZXBsYWNlQWxsLFxuXHRzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgsXG59IGZyb20gJy4vdXRpbGl0aWVzLmpzJztcblxuY29uc3Qge3N0ZG91dDogc3Rkb3V0Q29sb3IsIHN0ZGVycjogc3RkZXJyQ29sb3J9ID0gc3VwcG9ydHNDb2xvcjtcblxuY29uc3QgR0VORVJBVE9SID0gU3ltYm9sKCdHRU5FUkFUT1InKTtcbmNvbnN0IFNUWUxFUiA9IFN5bWJvbCgnU1RZTEVSJyk7XG5jb25zdCBJU19FTVBUWSA9IFN5bWJvbCgnSVNfRU1QVFknKTtcblxuLy8gYHN1cHBvcnRzQ29sb3IubGV2ZWxgIFx1MjE5MiBgYW5zaVN0eWxlcy5jb2xvcltuYW1lXWAgbWFwcGluZ1xuY29uc3QgbGV2ZWxNYXBwaW5nID0gW1xuXHQnYW5zaScsXG5cdCdhbnNpJyxcblx0J2Fuc2kyNTYnLFxuXHQnYW5zaTE2bScsXG5dO1xuXG5jb25zdCBzdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5jb25zdCBhcHBseU9wdGlvbnMgPSAob2JqZWN0LCBvcHRpb25zID0ge30pID0+IHtcblx0aWYgKG9wdGlvbnMubGV2ZWwgJiYgIShOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMubGV2ZWwpICYmIG9wdGlvbnMubGV2ZWwgPj0gMCAmJiBvcHRpb25zLmxldmVsIDw9IDMpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgYGxldmVsYCBvcHRpb24gc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAwIHRvIDMnKTtcblx0fVxuXG5cdC8vIERldGVjdCBsZXZlbCBpZiBub3Qgc2V0IG1hbnVhbGx5XG5cdGNvbnN0IGNvbG9yTGV2ZWwgPSBzdGRvdXRDb2xvciA/IHN0ZG91dENvbG9yLmxldmVsIDogMDtcblx0b2JqZWN0LmxldmVsID0gb3B0aW9ucy5sZXZlbCA9PT0gdW5kZWZpbmVkID8gY29sb3JMZXZlbCA6IG9wdGlvbnMubGV2ZWw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhbGsge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0cnVjdG9yLXJldHVyblxuXHRcdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG5cdH1cbn1cblxuY29uc3QgY2hhbGtGYWN0b3J5ID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IGNoYWxrID0gKC4uLnN0cmluZ3MpID0+IHN0cmluZ3Muam9pbignICcpO1xuXHRhcHBseU9wdGlvbnMoY2hhbGssIG9wdGlvbnMpO1xuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgY3JlYXRlQ2hhbGsucHJvdG90eXBlKTtcblxuXHRyZXR1cm4gY2hhbGs7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDaGFsayhvcHRpb25zKSB7XG5cdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG59XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihjcmVhdGVDaGFsay5wcm90b3R5cGUsIEZ1bmN0aW9uLnByb3RvdHlwZSk7XG5cbmZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGFuc2lTdHlsZXMpKSB7XG5cdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIGNyZWF0ZVN0eWxlcihzdHlsZS5vcGVuLCBzdHlsZS5jbG9zZSwgdGhpc1tTVFlMRVJdKSwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN0eWxlTmFtZSwge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0XHRyZXR1cm4gYnVpbGRlcjtcblx0XHR9LFxuXHR9O1xufVxuXG5zdHlsZXMudmlzaWJsZSA9IHtcblx0Z2V0KCkge1xuXHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIHRoaXNbU1RZTEVSXSwgdHJ1ZSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2aXNpYmxlJywge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdH0sXG59O1xuXG5jb25zdCBnZXRNb2RlbEFuc2kgPSAobW9kZWwsIGxldmVsLCB0eXBlLCAuLi5hcmd1bWVudHNfKSA9PiB7XG5cdGlmIChtb2RlbCA9PT0gJ3JnYicpIHtcblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMTZtJykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTE2bSguLi5hcmd1bWVudHNfKTtcblx0XHR9XG5cblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMjU2Jykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTI1NihhbnNpU3R5bGVzLnJnYlRvQW5zaTI1NiguLi5hcmd1bWVudHNfKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaShhbnNpU3R5bGVzLnJnYlRvQW5zaSguLi5hcmd1bWVudHNfKSk7XG5cdH1cblxuXHRpZiAobW9kZWwgPT09ICdoZXgnKSB7XG5cdFx0cmV0dXJuIGdldE1vZGVsQW5zaSgncmdiJywgbGV2ZWwsIHR5cGUsIC4uLmFuc2lTdHlsZXMuaGV4VG9SZ2IoLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pO1xufTtcblxuY29uc3QgdXNlZE1vZGVscyA9IFsncmdiJywgJ2hleCcsICdhbnNpMjU2J107XG5cbmZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuXHRzdHlsZXNbbW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdjb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmNvbG9yLmNsb3NlLCB0aGlzW1NUWUxFUl0pO1xuXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdH07XG5cdFx0fSxcblx0fTtcblxuXHRjb25zdCBiZ01vZGVsID0gJ2JnJyArIG1vZGVsWzBdLnRvVXBwZXJDYXNlKCkgKyBtb2RlbC5zbGljZSgxKTtcblx0c3R5bGVzW2JnTW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdiZ0NvbG9yJywgLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuYmdDb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIHtcblx0Li4uc3R5bGVzLFxuXHRsZXZlbDoge1xuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXNbR0VORVJBVE9SXS5sZXZlbDtcblx0XHR9LFxuXHRcdHNldChsZXZlbCkge1xuXHRcdFx0dGhpc1tHRU5FUkFUT1JdLmxldmVsID0gbGV2ZWw7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBjcmVhdGVTdHlsZXIgPSAob3BlbiwgY2xvc2UsIHBhcmVudCkgPT4ge1xuXHRsZXQgb3BlbkFsbDtcblx0bGV0IGNsb3NlQWxsO1xuXHRpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRvcGVuQWxsID0gb3Blbjtcblx0XHRjbG9zZUFsbCA9IGNsb3NlO1xuXHR9IGVsc2Uge1xuXHRcdG9wZW5BbGwgPSBwYXJlbnQub3BlbkFsbCArIG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZSArIHBhcmVudC5jbG9zZUFsbDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3Blbixcblx0XHRjbG9zZSxcblx0XHRvcGVuQWxsLFxuXHRcdGNsb3NlQWxsLFxuXHRcdHBhcmVudCxcblx0fTtcbn07XG5cbmNvbnN0IGNyZWF0ZUJ1aWxkZXIgPSAoc2VsZiwgX3N0eWxlciwgX2lzRW1wdHkpID0+IHtcblx0Ly8gU2luZ2xlIGFyZ3VtZW50IGlzIGhvdCBwYXRoLCBpbXBsaWNpdCBjb2VyY2lvbiBpcyBmYXN0ZXIgdGhhbiBhbnl0aGluZ1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cblx0Y29uc3QgYnVpbGRlciA9ICguLi5hcmd1bWVudHNfKSA9PiBhcHBseVN0eWxlKGJ1aWxkZXIsIChhcmd1bWVudHNfLmxlbmd0aCA9PT0gMSkgPyAoJycgKyBhcmd1bWVudHNfWzBdKSA6IGFyZ3VtZW50c18uam9pbignICcpKTtcblxuXHQvLyBXZSBhbHRlciB0aGUgcHJvdG90eXBlIGJlY2F1c2Ugd2UgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiwgYnV0IHRoZXJlIGlzXG5cdC8vIG5vIHdheSB0byBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHByb3RvdHlwZVxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVpbGRlciwgcHJvdG8pO1xuXG5cdGJ1aWxkZXJbR0VORVJBVE9SXSA9IHNlbGY7XG5cdGJ1aWxkZXJbU1RZTEVSXSA9IF9zdHlsZXI7XG5cdGJ1aWxkZXJbSVNfRU1QVFldID0gX2lzRW1wdHk7XG5cblx0cmV0dXJuIGJ1aWxkZXI7XG59O1xuXG5jb25zdCBhcHBseVN0eWxlID0gKHNlbGYsIHN0cmluZykgPT4ge1xuXHRpZiAoc2VsZi5sZXZlbCA8PSAwIHx8ICFzdHJpbmcpIHtcblx0XHRyZXR1cm4gc2VsZltJU19FTVBUWV0gPyAnJyA6IHN0cmluZztcblx0fVxuXG5cdGxldCBzdHlsZXIgPSBzZWxmW1NUWUxFUl07XG5cblx0aWYgKHN0eWxlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHtvcGVuQWxsLCBjbG9zZUFsbH0gPSBzdHlsZXI7XG5cdGlmIChzdHJpbmcuaW5jbHVkZXMoJ1xcdTAwMUInKSkge1xuXHRcdHdoaWxlIChzdHlsZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gUmVwbGFjZSBhbnkgaW5zdGFuY2VzIGFscmVhZHkgcHJlc2VudCB3aXRoIGEgcmUtb3BlbmluZyBjb2RlXG5cdFx0XHQvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG5cdFx0XHQvLyB3aWxsIGJlIGNvbG9yZWQsIGFuZCB0aGUgcmVzdCB3aWxsIHNpbXBseSBiZSAncGxhaW4nLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nUmVwbGFjZUFsbChzdHJpbmcsIHN0eWxlci5jbG9zZSwgc3R5bGVyLm9wZW4pO1xuXG5cdFx0XHRzdHlsZXIgPSBzdHlsZXIucGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdC8vIFdlIGNhbiBtb3ZlIGJvdGggbmV4dCBhY3Rpb25zIG91dCBvZiBsb29wLCBiZWNhdXNlIHJlbWFpbmluZyBhY3Rpb25zIGluIGxvb3Agd29uJ3QgaGF2ZVxuXHQvLyBhbnkvdmlzaWJsZSBlZmZlY3Qgb24gcGFydHMgd2UgYWRkIGhlcmUuIENsb3NlIHRoZSBzdHlsaW5nIGJlZm9yZSBhIGxpbmVicmVhayBhbmQgcmVvcGVuXG5cdC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPUzogaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL3B1bGwvOTJcblx0Y29uc3QgbGZJbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcblx0aWYgKGxmSW5kZXggIT09IC0xKSB7XG5cdFx0c3RyaW5nID0gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgY2xvc2VBbGwsIG9wZW5BbGwsIGxmSW5kZXgpO1xuXHR9XG5cblx0cmV0dXJuIG9wZW5BbGwgKyBzdHJpbmcgKyBjbG9zZUFsbDtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNyZWF0ZUNoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcblxuY29uc3QgY2hhbGsgPSBjcmVhdGVDaGFsaygpO1xuZXhwb3J0IGNvbnN0IGNoYWxrU3RkZXJyID0gY3JlYXRlQ2hhbGsoe2xldmVsOiBzdGRlcnJDb2xvciA/IHN0ZGVyckNvbG9yLmxldmVsIDogMH0pO1xuXG5leHBvcnQge1xuXHRtb2RpZmllck5hbWVzLFxuXHRmb3JlZ3JvdW5kQ29sb3JOYW1lcyxcblx0YmFja2dyb3VuZENvbG9yTmFtZXMsXG5cdGNvbG9yTmFtZXMsXG5cblx0Ly8gVE9ETzogUmVtb3ZlIHRoZXNlIGFsaWFzZXMgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvblxuXHRtb2RpZmllck5hbWVzIGFzIG1vZGlmaWVycyxcblx0Zm9yZWdyb3VuZENvbG9yTmFtZXMgYXMgZm9yZWdyb3VuZENvbG9ycyxcblx0YmFja2dyb3VuZENvbG9yTmFtZXMgYXMgYmFja2dyb3VuZENvbG9ycyxcblx0Y29sb3JOYW1lcyBhcyBjb2xvcnMsXG59IGZyb20gJy4vdmVuZG9yL2Fuc2ktc3R5bGVzL2luZGV4LmpzJztcblxuZXhwb3J0IHtcblx0c3Rkb3V0Q29sb3IgYXMgc3VwcG9ydHNDb2xvcixcblx0c3RkZXJyQ29sb3IgYXMgc3VwcG9ydHNDb2xvclN0ZGVycixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNoYWxrO1xuIiwgIid1c2Ugc3RyaWN0J1xuLypcbiAqIG1lcmdlMlxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlYW1iaXRpb24vbWVyZ2UyXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMjAgVGVhbWJpdGlvblxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgUGFzc1Rocm91Z2ggPSBTdHJlYW0uUGFzc1Rocm91Z2hcbmNvbnN0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2UyXG5cbmZ1bmN0aW9uIG1lcmdlMiAoKSB7XG4gIGNvbnN0IHN0cmVhbXNRdWV1ZSA9IFtdXG4gIGNvbnN0IGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgbGV0IG1lcmdpbmcgPSBmYWxzZVxuICBsZXQgb3B0aW9ucyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXVxuXG4gIGlmIChvcHRpb25zICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMpICYmIG9wdGlvbnMucGlwZSA9PSBudWxsKSB7XG4gICAgYXJncy5wb3AoKVxuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgY29uc3QgZG9FbmQgPSBvcHRpb25zLmVuZCAhPT0gZmFsc2VcbiAgY29uc3QgZG9QaXBlRXJyb3IgPSBvcHRpb25zLnBpcGVFcnJvciA9PT0gdHJ1ZVxuICBpZiAob3B0aW9ucy5vYmplY3RNb2RlID09IG51bGwpIHtcbiAgICBvcHRpb25zLm9iamVjdE1vZGUgPSB0cnVlXG4gIH1cbiAgaWYgKG9wdGlvbnMuaGlnaFdhdGVyTWFyayA9PSBudWxsKSB7XG4gICAgb3B0aW9ucy5oaWdoV2F0ZXJNYXJrID0gNjQgKiAxMDI0XG4gIH1cbiAgY29uc3QgbWVyZ2VkU3RyZWFtID0gUGFzc1Rocm91Z2gob3B0aW9ucylcblxuICBmdW5jdGlvbiBhZGRTdHJlYW0gKCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHN0cmVhbXNRdWV1ZS5wdXNoKHBhdXNlU3RyZWFtcyhhcmd1bWVudHNbaV0sIG9wdGlvbnMpKVxuICAgIH1cbiAgICBtZXJnZVN0cmVhbSgpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlU3RyZWFtICgpIHtcbiAgICBpZiAobWVyZ2luZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIG1lcmdpbmcgPSB0cnVlXG5cbiAgICBsZXQgc3RyZWFtcyA9IHN0cmVhbXNRdWV1ZS5zaGlmdCgpXG4gICAgaWYgKCFzdHJlYW1zKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFN0cmVhbSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RyZWFtcykpIHtcbiAgICAgIHN0cmVhbXMgPSBbc3RyZWFtc11cbiAgICB9XG5cbiAgICBsZXQgcGlwZXNDb3VudCA9IHN0cmVhbXMubGVuZ3RoICsgMVxuXG4gICAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgICBpZiAoLS1waXBlc0NvdW50ID4gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG1lcmdpbmcgPSBmYWxzZVxuICAgICAgbWVyZ2VTdHJlYW0oKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBpcGUgKHN0cmVhbSkge1xuICAgICAgZnVuY3Rpb24gb25lbmQgKCkge1xuICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ21lcmdlMlVucGlwZUVuZCcsIG9uZW5kKVxuICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgICAgICBpZiAoZG9QaXBlRXJyb3IpIHtcbiAgICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICAgICAgfVxuICAgICAgICBuZXh0KClcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uZXJyb3IgKGVycikge1xuICAgICAgICBtZXJnZWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9XG4gICAgICAvLyBza2lwIGVuZGVkIHN0cmVhbVxuICAgICAgaWYgKHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgIH1cblxuICAgICAgc3RyZWFtLm9uKCdtZXJnZTJVbnBpcGVFbmQnLCBvbmVuZClcbiAgICAgIHN0cmVhbS5vbignZW5kJywgb25lbmQpXG5cbiAgICAgIGlmIChkb1BpcGVFcnJvcikge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIH1cblxuICAgICAgc3RyZWFtLnBpcGUobWVyZ2VkU3RyZWFtLCB7IGVuZDogZmFsc2UgfSlcbiAgICAgIC8vIGNvbXBhdGlibGUgZm9yIG9sZCBzdHJlYW1cbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyZWFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGlwZShzdHJlYW1zW2ldKVxuICAgIH1cblxuICAgIG5leHQoKVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kU3RyZWFtICgpIHtcbiAgICBtZXJnaW5nID0gZmFsc2VcbiAgICAvLyBlbWl0ICdxdWV1ZURyYWluJyB3aGVuIGFsbCBzdHJlYW1zIG1lcmdlZC5cbiAgICBtZXJnZWRTdHJlYW0uZW1pdCgncXVldWVEcmFpbicpXG4gICAgaWYgKGRvRW5kKSB7XG4gICAgICBtZXJnZWRTdHJlYW0uZW5kKClcbiAgICB9XG4gIH1cblxuICBtZXJnZWRTdHJlYW0uc2V0TWF4TGlzdGVuZXJzKDApXG4gIG1lcmdlZFN0cmVhbS5hZGQgPSBhZGRTdHJlYW1cbiAgbWVyZ2VkU3RyZWFtLm9uKCd1bnBpcGUnLCBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgc3RyZWFtLmVtaXQoJ21lcmdlMlVucGlwZUVuZCcpXG4gIH0pXG5cbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgYWRkU3RyZWFtLmFwcGx5KG51bGwsIGFyZ3MpXG4gIH1cbiAgcmV0dXJuIG1lcmdlZFN0cmVhbVxufVxuXG4vLyBjaGVjayBhbmQgcGF1c2Ugc3RyZWFtcyBmb3IgcGlwZS5cbmZ1bmN0aW9uIHBhdXNlU3RyZWFtcyAoc3RyZWFtcywgb3B0aW9ucykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RyZWFtcykpIHtcbiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggb2xkLXN0eWxlIHN0cmVhbXNcbiAgICBpZiAoIXN0cmVhbXMuX3JlYWRhYmxlU3RhdGUgJiYgc3RyZWFtcy5waXBlKSB7XG4gICAgICBzdHJlYW1zID0gc3RyZWFtcy5waXBlKFBhc3NUaHJvdWdoKG9wdGlvbnMpKVxuICAgIH1cbiAgICBpZiAoIXN0cmVhbXMuX3JlYWRhYmxlU3RhdGUgfHwgIXN0cmVhbXMucGF1c2UgfHwgIXN0cmVhbXMucGlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IHJlYWRhYmxlIHN0cmVhbSBjYW4gYmUgbWVyZ2VkLicpXG4gICAgfVxuICAgIHN0cmVhbXMucGF1c2UoKVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHJlYW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBzdHJlYW1zW2ldID0gcGF1c2VTdHJlYW1zKHN0cmVhbXNbaV0sIG9wdGlvbnMpXG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJlYW1zXG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNwbGl0V2hlbiA9IGV4cG9ydHMuZmxhdHRlbiA9IHZvaWQgMDtcbmZ1bmN0aW9uIGZsYXR0ZW4oaXRlbXMpIHtcbiAgICByZXR1cm4gaXRlbXMucmVkdWNlKChjb2xsZWN0aW9uLCBpdGVtKSA9PiBbXS5jb25jYXQoY29sbGVjdGlvbiwgaXRlbSksIFtdKTtcbn1cbmV4cG9ydHMuZmxhdHRlbiA9IGZsYXR0ZW47XG5mdW5jdGlvbiBzcGxpdFdoZW4oaXRlbXMsIHByZWRpY2F0ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtbXV07XG4gICAgbGV0IGdyb3VwSW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICBncm91cEluZGV4Kys7XG4gICAgICAgICAgICByZXN1bHRbZ3JvdXBJbmRleF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFtncm91cEluZGV4XS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLnNwbGl0V2hlbiA9IHNwbGl0V2hlbjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNFbm9lbnRDb2RlRXJyb3IgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0Vub2VudENvZGVFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBlcnJvci5jb2RlID09PSAnRU5PRU5UJztcbn1cbmV4cG9ydHMuaXNFbm9lbnRDb2RlRXJyb3IgPSBpc0Vub2VudENvZGVFcnJvcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRGlyZW50RnJvbVN0YXRzID0gdm9pZCAwO1xuY2xhc3MgRGlyZW50RnJvbVN0YXRzIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzdGF0cykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmlzQmxvY2tEZXZpY2UgPSBzdGF0cy5pc0Jsb2NrRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzQ2hhcmFjdGVyRGV2aWNlID0gc3RhdHMuaXNDaGFyYWN0ZXJEZXZpY2UuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNEaXJlY3RvcnkgPSBzdGF0cy5pc0RpcmVjdG9yeS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0ZJRk8gPSBzdGF0cy5pc0ZJRk8uYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGaWxlID0gc3RhdHMuaXNGaWxlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU29ja2V0ID0gc3RhdHMuaXNTb2NrZXQuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNTeW1ib2xpY0xpbmsgPSBzdGF0cy5pc1N5bWJvbGljTGluay5iaW5kKHN0YXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpIHtcbiAgICByZXR1cm4gbmV3IERpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cyk7XG59XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IGNyZWF0ZURpcmVudEZyb21TdGF0cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29udmVydFBvc2l4UGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuID0gZXhwb3J0cy5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuZXNjYXBlUG9zaXhQYXRoID0gZXhwb3J0cy5lc2NhcGVXaW5kb3dzUGF0aCA9IGV4cG9ydHMuZXNjYXBlID0gZXhwb3J0cy5yZW1vdmVMZWFkaW5nRG90U2VnbWVudCA9IGV4cG9ydHMubWFrZUFic29sdXRlID0gZXhwb3J0cy51bml4aWZ5ID0gdm9pZCAwO1xuY29uc3Qgb3MgPSByZXF1aXJlKFwib3NcIik7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBJU19XSU5ET1dTX1BMQVRGT1JNID0gb3MucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcbmNvbnN0IExFQURJTkdfRE9UX1NFR01FTlRfQ0hBUkFDVEVSU19DT1VOVCA9IDI7IC8vIC4vIG9yIC5cXFxcXG4vKipcbiAqIEFsbCBub24tZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gKiBQb3NpeDogKCkqP1tde3x9LCAhK0AgYmVmb3JlICgsICEgYXQgdGhlIGJlZ2lubmluZywgXFxcXCBiZWZvcmUgbm9uLXNwZWNpYWwgY2hhcmFjdGVycy5cbiAqIFdpbmRvd3M6ICgpe31bXSwgIStAIGJlZm9yZSAoLCAhIGF0IHRoZSBiZWdpbm5pbmcuXG4gKi9cbmNvbnN0IFBPU0lYX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKCkqP1tcXF17fH1dfF4hfFshK0BdKD89XFwoKXxcXFxcKD8hWyEoKSorP0BbXFxde3x9XSkpL2c7XG5jb25zdCBXSU5ET1dTX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKClbXFxde31dfF4hfFshK0BdKD89XFwoKSkvZztcbi8qKlxuICogVGhlIGRldmljZSBwYXRoIChcXFxcLlxcIG9yIFxcXFw/XFwpLlxuICogaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9zdGFuZGFyZC9pby9maWxlLXBhdGgtZm9ybWF0cyNkb3MtZGV2aWNlLXBhdGhzXG4gKi9cbmNvbnN0IERPU19ERVZJQ0VfUEFUSF9SRSA9IC9eXFxcXFxcXFwoWy4/XSkvO1xuLyoqXG4gKiBBbGwgYmFja3NsYXNoZXMgZXhjZXB0IHRob3NlIGVzY2FwaW5nIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAqIFdpbmRvd3M6ICEoKStAe31cbiAqIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL2ZpbGVpby9uYW1pbmctYS1maWxlI25hbWluZy1jb252ZW50aW9uc1xuICovXG5jb25zdCBXSU5ET1dTX0JBQ0tTTEFTSEVTX1JFID0gL1xcXFwoPyFbISgpK0BbXFxde31dKS9nO1xuLyoqXG4gKiBEZXNpZ25lZCB0byB3b3JrIG9ubHkgd2l0aCBzaW1wbGUgcGF0aHM6IGBkaXJcXFxcZmlsZWAuXG4gKi9cbmZ1bmN0aW9uIHVuaXhpZnkoZmlsZXBhdGgpIHtcbiAgICByZXR1cm4gZmlsZXBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuZXhwb3J0cy51bml4aWZ5ID0gdW5peGlmeTtcbmZ1bmN0aW9uIG1ha2VBYnNvbHV0ZShjd2QsIGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjd2QsIGZpbGVwYXRoKTtcbn1cbmV4cG9ydHMubWFrZUFic29sdXRlID0gbWFrZUFic29sdXRlO1xuZnVuY3Rpb24gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkpIHtcbiAgICAvLyBXZSBkbyBub3QgdXNlIGBzdGFydHNXaXRoYCBiZWNhdXNlIHRoaXMgaXMgMTB4IHNsb3dlciB0aGFuIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZm9yIHNvbWUgY2FzZXMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItc3RyaW5nLXN0YXJ0cy1lbmRzLXdpdGhcbiAgICBpZiAoZW50cnkuY2hhckF0KDApID09PSAnLicpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kQ2hhcmFjdGVyeSA9IGVudHJ5LmNoYXJBdCgxKTtcbiAgICAgICAgaWYgKHNlY29uZENoYXJhY3RlcnkgPT09ICcvJyB8fCBzZWNvbmRDaGFyYWN0ZXJ5ID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbGljZShMRUFESU5HX0RPVF9TRUdNRU5UX0NIQVJBQ1RFUlNfQ09VTlQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbn1cbmV4cG9ydHMucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQgPSByZW1vdmVMZWFkaW5nRG90U2VnbWVudDtcbmV4cG9ydHMuZXNjYXBlID0gSVNfV0lORE9XU19QTEFURk9STSA/IGVzY2FwZVdpbmRvd3NQYXRoIDogZXNjYXBlUG9zaXhQYXRoO1xuZnVuY3Rpb24gZXNjYXBlV2luZG93c1BhdGgocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoV0lORE9XU19VTkVTQ0FQRURfR0xPQl9TWU1CT0xTX1JFLCAnXFxcXCQyJyk7XG59XG5leHBvcnRzLmVzY2FwZVdpbmRvd3NQYXRoID0gZXNjYXBlV2luZG93c1BhdGg7XG5mdW5jdGlvbiBlc2NhcGVQb3NpeFBhdGgocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoUE9TSVhfVU5FU0NBUEVEX0dMT0JfU1lNQk9MU19SRSwgJ1xcXFwkMicpO1xufVxuZXhwb3J0cy5lc2NhcGVQb3NpeFBhdGggPSBlc2NhcGVQb3NpeFBhdGg7XG5leHBvcnRzLmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gSVNfV0lORE9XU19QTEFURk9STSA/IGNvbnZlcnRXaW5kb3dzUGF0aFRvUGF0dGVybiA6IGNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm47XG5mdW5jdGlvbiBjb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4oZmlsZXBhdGgpIHtcbiAgICByZXR1cm4gZXNjYXBlV2luZG93c1BhdGgoZmlsZXBhdGgpXG4gICAgICAgIC5yZXBsYWNlKERPU19ERVZJQ0VfUEFUSF9SRSwgJy8vJDEnKVxuICAgICAgICAucmVwbGFjZShXSU5ET1dTX0JBQ0tTTEFTSEVTX1JFLCAnLycpO1xufVxuZXhwb3J0cy5jb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4gPSBjb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm47XG5mdW5jdGlvbiBjb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuKGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGVzY2FwZVBvc2l4UGF0aChmaWxlcGF0aCk7XG59XG5leHBvcnRzLmNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm4gPSBjb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuO1xuIiwgIi8qIVxuICogaXMtZXh0Z2xvYiA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtZXh0Z2xvYj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0V4dGdsb2Ioc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIG1hdGNoO1xuICB3aGlsZSAoKG1hdGNoID0gLyhcXFxcKS58KFtAPyErKl1cXCguKlxcKSkvZy5leGVjKHN0cikpKSB7XG4gICAgaWYgKG1hdGNoWzJdKSByZXR1cm4gdHJ1ZTtcbiAgICBzdHIgPSBzdHIuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsICIvKiFcbiAqIGlzLWdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbnZhciBpc0V4dGdsb2IgPSByZXF1aXJlKCdpcy1leHRnbG9iJyk7XG52YXIgY2hhcnMgPSB7ICd7JzogJ30nLCAnKCc6ICcpJywgJ1snOiAnXSd9O1xudmFyIHN0cmljdENoZWNrID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHJbMF0gPT09ICchJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBwaXBlSW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlU3F1YXJlSW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlQ3VybHlJbmRleCA9IC0yO1xuICB2YXIgY2xvc2VQYXJlbkluZGV4ID0gLTI7XG4gIHZhciBiYWNrU2xhc2hJbmRleCA9IC0yO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKHN0cltpbmRleF0gPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHN0cltpbmRleCArIDFdID09PSAnPycgJiYgL1tcXF0uKyldLy50ZXN0KHN0cltpbmRleF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ1snICYmIHN0cltpbmRleCArIDFdICE9PSAnXScpIHtcbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4IDwgaW5kZXgpIHtcbiAgICAgICAgY2xvc2VTcXVhcmVJbmRleCA9IHN0ci5pbmRleE9mKCddJywgaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggPiBpbmRleCkge1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVNxdWFyZUluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xvc2VDdXJseUluZGV4ICE9PSAtMSAmJiBzdHJbaW5kZXhdID09PSAneycgJiYgc3RyW2luZGV4ICsgMV0gIT09ICd9Jykge1xuICAgICAgY2xvc2VDdXJseUluZGV4ID0gc3RyLmluZGV4T2YoJ30nLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VDdXJseUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlQ3VybHlJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlUGFyZW5JbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdID09PSAnPycgJiYgL1s6IT1dLy50ZXN0KHN0cltpbmRleCArIDJdKSAmJiBzdHJbaW5kZXggKyAzXSAhPT0gJyknKSB7XG4gICAgICBjbG9zZVBhcmVuSW5kZXggPSBzdHIuaW5kZXhPZignKScsIGluZGV4KTtcbiAgICAgIGlmIChjbG9zZVBhcmVuSW5kZXggPiBpbmRleCkge1xuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VQYXJlbkluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGlwZUluZGV4ICE9PSAtMSAmJiBzdHJbaW5kZXhdID09PSAnKCcgJiYgc3RyW2luZGV4ICsgMV0gIT09ICd8Jykge1xuICAgICAgaWYgKHBpcGVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIHBpcGVJbmRleCA9IHN0ci5pbmRleE9mKCd8JywgaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW3BpcGVJbmRleCArIDFdICE9PSAnKScpIHtcbiAgICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBwaXBlSW5kZXgpO1xuICAgICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gcGlwZUluZGV4KSB7XG4gICAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIHBpcGVJbmRleCk7XG4gICAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0cltpbmRleF0gPT09ICdcXFxcJykge1xuICAgICAgdmFyIG9wZW4gPSBzdHJbaW5kZXggKyAxXTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB2YXIgY2xvc2UgPSBjaGFyc1tvcGVuXTtcblxuICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgIHZhciBuID0gc3RyLmluZGV4T2YoY2xvc2UsIGluZGV4KTtcbiAgICAgICAgaWYgKG4gIT09IC0xKSB7XG4gICAgICAgICAgaW5kZXggPSBuICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyW2luZGV4XSA9PT0gJyEnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgcmVsYXhlZENoZWNrID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChzdHJbMF0gPT09ICchJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICBpZiAoL1sqP3t9KClbXFxdXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHN0cltpbmRleF0gPT09ICdcXFxcJykge1xuICAgICAgdmFyIG9wZW4gPSBzdHJbaW5kZXggKyAxXTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB2YXIgY2xvc2UgPSBjaGFyc1tvcGVuXTtcblxuICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgIHZhciBuID0gc3RyLmluZGV4T2YoY2xvc2UsIGluZGV4KTtcbiAgICAgICAgaWYgKG4gIT09IC0xKSB7XG4gICAgICAgICAgaW5kZXggPSBuICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyW2luZGV4XSA9PT0gJyEnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzR2xvYihzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnIHx8IHN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNFeHRnbG9iKHN0cikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjaGVjayA9IHN0cmljdENoZWNrO1xuXG4gIC8vIG9wdGlvbmFsbHkgcmVsYXggY2hlY2tcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QgPT09IGZhbHNlKSB7XG4gICAgY2hlY2sgPSByZWxheGVkQ2hlY2s7XG4gIH1cblxuICByZXR1cm4gY2hlY2soc3RyKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNHbG9iID0gcmVxdWlyZSgnaXMtZ2xvYicpO1xudmFyIHBhdGhQb3NpeERpcm5hbWUgPSByZXF1aXJlKCdwYXRoJykucG9zaXguZGlybmFtZTtcbnZhciBpc1dpbjMyID0gcmVxdWlyZSgnb3MnKS5wbGF0Zm9ybSgpID09PSAnd2luMzInO1xuXG52YXIgc2xhc2ggPSAnLyc7XG52YXIgYmFja3NsYXNoID0gL1xcXFwvZztcbnZhciBlbmNsb3N1cmUgPSAvW1xce1xcW10uKltcXH1cXF1dJC87XG52YXIgZ2xvYmJ5ID0gLyhefFteXFxcXF0pKFtcXHtcXFtdfFxcKFteXFwpXSskKS87XG52YXIgZXNjYXBlZCA9IC9cXFxcKFtcXCFcXCpcXD9cXHxcXFtcXF1cXChcXClcXHtcXH1dKS9nO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZsaXBCYWNrc2xhc2hlcz10cnVlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnbG9iUGFyZW50KHN0ciwgb3B0cykge1xuICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyBmbGlwQmFja3NsYXNoZXM6IHRydWUgfSwgb3B0cyk7XG5cbiAgLy8gZmxpcCB3aW5kb3dzIHBhdGggc2VwYXJhdG9yc1xuICBpZiAob3B0aW9ucy5mbGlwQmFja3NsYXNoZXMgJiYgaXNXaW4zMiAmJiBzdHIuaW5kZXhPZihzbGFzaCkgPCAwKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoYmFja3NsYXNoLCBzbGFzaCk7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNhc2UgZm9yIHN0cmluZ3MgZW5kaW5nIGluIGVuY2xvc3VyZSBjb250YWluaW5nIHBhdGggc2VwYXJhdG9yXG4gIGlmIChlbmNsb3N1cmUudGVzdChzdHIpKSB7XG4gICAgc3RyICs9IHNsYXNoO1xuICB9XG5cbiAgLy8gcHJlc2VydmVzIGZ1bGwgcGF0aCBpbiBjYXNlIG9mIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yXG4gIHN0ciArPSAnYSc7XG5cbiAgLy8gcmVtb3ZlIHBhdGggcGFydHMgdGhhdCBhcmUgZ2xvYmJ5XG4gIGRvIHtcbiAgICBzdHIgPSBwYXRoUG9zaXhEaXJuYW1lKHN0cik7XG4gIH0gd2hpbGUgKGlzR2xvYihzdHIpIHx8IGdsb2JieS50ZXN0KHN0cikpO1xuXG4gIC8vIHJlbW92ZSBlc2NhcGUgY2hhcnMgYW5kIHJldHVybiByZXN1bHRcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGVzY2FwZWQsICckMScpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuaXNJbnRlZ2VyID0gbnVtID0+IHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobnVtKTtcbiAgfVxuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycgJiYgbnVtLnRyaW0oKSAhPT0gJycpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihOdW1iZXIobnVtKSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBGaW5kIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICovXG5cbmV4cG9ydHMuZmluZCA9IChub2RlLCB0eXBlKSA9PiBub2RlLm5vZGVzLmZpbmQobm9kZSA9PiBub2RlLnR5cGUgPT09IHR5cGUpO1xuXG4vKipcbiAqIEZpbmQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlXG4gKi9cblxuZXhwb3J0cy5leGNlZWRzTGltaXQgPSAobWluLCBtYXgsIHN0ZXAgPSAxLCBsaW1pdCkgPT4ge1xuICBpZiAobGltaXQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmICghZXhwb3J0cy5pc0ludGVnZXIobWluKSB8fCAhZXhwb3J0cy5pc0ludGVnZXIobWF4KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKChOdW1iZXIobWF4KSAtIE51bWJlcihtaW4pKSAvIE51bWJlcihzdGVwKSkgPj0gbGltaXQ7XG59O1xuXG4vKipcbiAqIEVzY2FwZSB0aGUgZ2l2ZW4gbm9kZSB3aXRoICdcXFxcJyBiZWZvcmUgbm9kZS52YWx1ZVxuICovXG5cbmV4cG9ydHMuZXNjYXBlTm9kZSA9IChibG9jaywgbiA9IDAsIHR5cGUpID0+IHtcbiAgbGV0IG5vZGUgPSBibG9jay5ub2Rlc1tuXTtcbiAgaWYgKCFub2RlKSByZXR1cm47XG5cbiAgaWYgKCh0eXBlICYmIG5vZGUudHlwZSA9PT0gdHlwZSkgfHwgbm9kZS50eXBlID09PSAnb3BlbicgfHwgbm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgaWYgKG5vZGUuZXNjYXBlZCAhPT0gdHJ1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9ICdcXFxcJyArIG5vZGUudmFsdWU7XG4gICAgICBub2RlLmVzY2FwZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGJyYWNlIG5vZGUgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGxpdGVyYWwgYnJhY2VzXG4gKi9cblxuZXhwb3J0cy5lbmNsb3NlQnJhY2UgPSBub2RlID0+IHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ2JyYWNlJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoKG5vZGUuY29tbWFzID4+IDAgKyBub2RlLnJhbmdlcyA+PiAwKSA9PT0gMCkge1xuICAgIG5vZGUuaW52YWxpZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBicmFjZSBub2RlIGlzIGludmFsaWQuXG4gKi9cblxuZXhwb3J0cy5pc0ludmFsaWRCcmFjZSA9IGJsb2NrID0+IHtcbiAgaWYgKGJsb2NrLnR5cGUgIT09ICdicmFjZScpIHJldHVybiBmYWxzZTtcbiAgaWYgKGJsb2NrLmludmFsaWQgPT09IHRydWUgfHwgYmxvY2suZG9sbGFyKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChibG9jay5jb21tYXMgPj4gMCArIGJsb2NrLnJhbmdlcyA+PiAwKSA9PT0gMCkge1xuICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChibG9jay5vcGVuICE9PSB0cnVlIHx8IGJsb2NrLmNsb3NlICE9PSB0cnVlKSB7XG4gICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBub2RlIGlzIGFuIG9wZW4gb3IgY2xvc2Ugbm9kZVxuICovXG5cbmV4cG9ydHMuaXNPcGVuT3JDbG9zZSA9IG5vZGUgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAnb3BlbicgfHwgbm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG5vZGUub3BlbiA9PT0gdHJ1ZSB8fCBub2RlLmNsb3NlID09PSB0cnVlO1xufTtcblxuLyoqXG4gKiBSZWR1Y2UgYW4gYXJyYXkgb2YgdGV4dCBub2Rlcy5cbiAqL1xuXG5leHBvcnRzLnJlZHVjZSA9IG5vZGVzID0+IG5vZGVzLnJlZHVjZSgoYWNjLCBub2RlKSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0JykgYWNjLnB1c2gobm9kZS52YWx1ZSk7XG4gIGlmIChub2RlLnR5cGUgPT09ICdyYW5nZScpIG5vZGUudHlwZSA9ICd0ZXh0JztcbiAgcmV0dXJuIGFjYztcbn0sIFtdKTtcblxuLyoqXG4gKiBGbGF0dGVuIGFuIGFycmF5XG4gKi9cblxuZXhwb3J0cy5mbGF0dGVuID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGZsYXQgPSBhcnIgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgZWxlID0gYXJyW2ldO1xuICAgICAgQXJyYXkuaXNBcnJheShlbGUpID8gZmxhdChlbGUsIHJlc3VsdCkgOiBlbGUgIT09IHZvaWQgMCAmJiByZXN1bHQucHVzaChlbGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBmbGF0KGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgc3RyaW5naWZ5ID0gKG5vZGUsIHBhcmVudCA9IHt9KSA9PiB7XG4gICAgbGV0IGludmFsaWRCbG9jayA9IG9wdGlvbnMuZXNjYXBlSW52YWxpZCAmJiB1dGlscy5pc0ludmFsaWRCcmFjZShwYXJlbnQpO1xuICAgIGxldCBpbnZhbGlkTm9kZSA9IG5vZGUuaW52YWxpZCA9PT0gdHJ1ZSAmJiBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWU7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIGlmICgoaW52YWxpZEJsb2NrIHx8IGludmFsaWROb2RlKSAmJiB1dGlscy5pc09wZW5PckNsb3NlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiAnXFxcXCcgKyBub2RlLnZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzKSB7XG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLm5vZGVzKSB7XG4gICAgICAgIG91dHB1dCArPSBzdHJpbmdpZnkoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIHJldHVybiBzdHJpbmdpZnkoYXN0KTtcbn07XG5cbiIsICIvKiFcbiAqIGlzLW51bWJlciA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtbnVtYmVyPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obnVtKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBudW0gLSBudW0gPT09IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSA/IE51bWJlci5pc0Zpbml0ZSgrbnVtKSA6IGlzRmluaXRlKCtudW0pO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiB0by1yZWdleC1yYW5nZSA8aHR0cHM6Ly9naXRodWIuY29tL21pY3JvbWF0Y2gvdG8tcmVnZXgtcmFuZ2U+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXNOdW1iZXIgPSByZXF1aXJlKCdpcy1udW1iZXInKTtcblxuY29uc3QgdG9SZWdleFJhbmdlID0gKG1pbiwgbWF4LCBvcHRpb25zKSA9PiB7XG4gIGlmIChpc051bWJlcihtaW4pID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvUmVnZXhSYW5nZTogZXhwZWN0ZWQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICBpZiAobWF4ID09PSB2b2lkIDAgfHwgbWluID09PSBtYXgpIHtcbiAgICByZXR1cm4gU3RyaW5nKG1pbik7XG4gIH1cblxuICBpZiAoaXNOdW1iZXIobWF4KSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBudW1iZXIuJyk7XG4gIH1cblxuICBsZXQgb3B0cyA9IHsgcmVsYXhaZXJvczogdHJ1ZSwgLi4ub3B0aW9ucyB9O1xuICBpZiAodHlwZW9mIG9wdHMuc3RyaWN0WmVyb3MgPT09ICdib29sZWFuJykge1xuICAgIG9wdHMucmVsYXhaZXJvcyA9IG9wdHMuc3RyaWN0WmVyb3MgPT09IGZhbHNlO1xuICB9XG5cbiAgbGV0IHJlbGF4ID0gU3RyaW5nKG9wdHMucmVsYXhaZXJvcyk7XG4gIGxldCBzaG9ydGhhbmQgPSBTdHJpbmcob3B0cy5zaG9ydGhhbmQpO1xuICBsZXQgY2FwdHVyZSA9IFN0cmluZyhvcHRzLmNhcHR1cmUpO1xuICBsZXQgd3JhcCA9IFN0cmluZyhvcHRzLndyYXApO1xuICBsZXQgY2FjaGVLZXkgPSBtaW4gKyAnOicgKyBtYXggKyAnPScgKyByZWxheCArIHNob3J0aGFuZCArIGNhcHR1cmUgKyB3cmFwO1xuXG4gIGlmICh0b1JlZ2V4UmFuZ2UuY2FjaGUuaGFzT3duUHJvcGVydHkoY2FjaGVLZXkpKSB7XG4gICAgcmV0dXJuIHRvUmVnZXhSYW5nZS5jYWNoZVtjYWNoZUtleV0ucmVzdWx0O1xuICB9XG5cbiAgbGV0IGEgPSBNYXRoLm1pbihtaW4sIG1heCk7XG4gIGxldCBiID0gTWF0aC5tYXgobWluLCBtYXgpO1xuXG4gIGlmIChNYXRoLmFicyhhIC0gYikgPT09IDEpIHtcbiAgICBsZXQgcmVzdWx0ID0gbWluICsgJ3wnICsgbWF4O1xuICAgIGlmIChvcHRzLmNhcHR1cmUpIHtcbiAgICAgIHJldHVybiBgKCR7cmVzdWx0fSlgO1xuICAgIH1cbiAgICBpZiAob3B0cy53cmFwID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGAoPzoke3Jlc3VsdH0pYDtcbiAgfVxuXG4gIGxldCBpc1BhZGRlZCA9IGhhc1BhZGRpbmcobWluKSB8fCBoYXNQYWRkaW5nKG1heCk7XG4gIGxldCBzdGF0ZSA9IHsgbWluLCBtYXgsIGEsIGIgfTtcbiAgbGV0IHBvc2l0aXZlcyA9IFtdO1xuICBsZXQgbmVnYXRpdmVzID0gW107XG5cbiAgaWYgKGlzUGFkZGVkKSB7XG4gICAgc3RhdGUuaXNQYWRkZWQgPSBpc1BhZGRlZDtcbiAgICBzdGF0ZS5tYXhMZW4gPSBTdHJpbmcoc3RhdGUubWF4KS5sZW5ndGg7XG4gIH1cblxuICBpZiAoYSA8IDApIHtcbiAgICBsZXQgbmV3TWluID0gYiA8IDAgPyBNYXRoLmFicyhiKSA6IDE7XG4gICAgbmVnYXRpdmVzID0gc3BsaXRUb1BhdHRlcm5zKG5ld01pbiwgTWF0aC5hYnMoYSksIHN0YXRlLCBvcHRzKTtcbiAgICBhID0gc3RhdGUuYSA9IDA7XG4gIH1cblxuICBpZiAoYiA+PSAwKSB7XG4gICAgcG9zaXRpdmVzID0gc3BsaXRUb1BhdHRlcm5zKGEsIGIsIHN0YXRlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRlLm5lZ2F0aXZlcyA9IG5lZ2F0aXZlcztcbiAgc3RhdGUucG9zaXRpdmVzID0gcG9zaXRpdmVzO1xuICBzdGF0ZS5yZXN1bHQgPSBjb2xsYXRlUGF0dGVybnMobmVnYXRpdmVzLCBwb3NpdGl2ZXMsIG9wdHMpO1xuXG4gIGlmIChvcHRzLmNhcHR1cmUgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5yZXN1bHQgPSBgKCR7c3RhdGUucmVzdWx0fSlgO1xuICB9IGVsc2UgaWYgKG9wdHMud3JhcCAhPT0gZmFsc2UgJiYgKHBvc2l0aXZlcy5sZW5ndGggKyBuZWdhdGl2ZXMubGVuZ3RoKSA+IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgPSBgKD86JHtzdGF0ZS5yZXN1bHR9KWA7XG4gIH1cblxuICB0b1JlZ2V4UmFuZ2UuY2FjaGVbY2FjaGVLZXldID0gc3RhdGU7XG4gIHJldHVybiBzdGF0ZS5yZXN1bHQ7XG59O1xuXG5mdW5jdGlvbiBjb2xsYXRlUGF0dGVybnMobmVnLCBwb3MsIG9wdGlvbnMpIHtcbiAgbGV0IG9ubHlOZWdhdGl2ZSA9IGZpbHRlclBhdHRlcm5zKG5lZywgcG9zLCAnLScsIGZhbHNlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IG9ubHlQb3NpdGl2ZSA9IGZpbHRlclBhdHRlcm5zKHBvcywgbmVnLCAnJywgZmFsc2UsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgaW50ZXJzZWN0ZWQgPSBmaWx0ZXJQYXR0ZXJucyhuZWcsIHBvcywgJy0/JywgdHJ1ZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBzdWJwYXR0ZXJucyA9IG9ubHlOZWdhdGl2ZS5jb25jYXQoaW50ZXJzZWN0ZWQpLmNvbmNhdChvbmx5UG9zaXRpdmUpO1xuICByZXR1cm4gc3VicGF0dGVybnMuam9pbignfCcpO1xufVxuXG5mdW5jdGlvbiBzcGxpdFRvUmFuZ2VzKG1pbiwgbWF4KSB7XG4gIGxldCBuaW5lcyA9IDE7XG4gIGxldCB6ZXJvcyA9IDE7XG5cbiAgbGV0IHN0b3AgPSBjb3VudE5pbmVzKG1pbiwgbmluZXMpO1xuICBsZXQgc3RvcHMgPSBuZXcgU2V0KFttYXhdKTtcblxuICB3aGlsZSAobWluIDw9IHN0b3AgJiYgc3RvcCA8PSBtYXgpIHtcbiAgICBzdG9wcy5hZGQoc3RvcCk7XG4gICAgbmluZXMgKz0gMTtcbiAgICBzdG9wID0gY291bnROaW5lcyhtaW4sIG5pbmVzKTtcbiAgfVxuXG4gIHN0b3AgPSBjb3VudFplcm9zKG1heCArIDEsIHplcm9zKSAtIDE7XG5cbiAgd2hpbGUgKG1pbiA8IHN0b3AgJiYgc3RvcCA8PSBtYXgpIHtcbiAgICBzdG9wcy5hZGQoc3RvcCk7XG4gICAgemVyb3MgKz0gMTtcbiAgICBzdG9wID0gY291bnRaZXJvcyhtYXggKyAxLCB6ZXJvcykgLSAxO1xuICB9XG5cbiAgc3RvcHMgPSBbLi4uc3RvcHNdO1xuICBzdG9wcy5zb3J0KGNvbXBhcmUpO1xuICByZXR1cm4gc3RvcHM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhbmdlIHRvIGEgcmVnZXggcGF0dGVyblxuICogQHBhcmFtIHtOdW1iZXJ9IGBzdGFydGBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgc3RvcGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiByYW5nZVRvUGF0dGVybihzdGFydCwgc3RvcCwgb3B0aW9ucykge1xuICBpZiAoc3RhcnQgPT09IHN0b3ApIHtcbiAgICByZXR1cm4geyBwYXR0ZXJuOiBzdGFydCwgY291bnQ6IFtdLCBkaWdpdHM6IDAgfTtcbiAgfVxuXG4gIGxldCB6aXBwZWQgPSB6aXAoc3RhcnQsIHN0b3ApO1xuICBsZXQgZGlnaXRzID0gemlwcGVkLmxlbmd0aDtcbiAgbGV0IHBhdHRlcm4gPSAnJztcbiAgbGV0IGNvdW50ID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0czsgaSsrKSB7XG4gICAgbGV0IFtzdGFydERpZ2l0LCBzdG9wRGlnaXRdID0gemlwcGVkW2ldO1xuXG4gICAgaWYgKHN0YXJ0RGlnaXQgPT09IHN0b3BEaWdpdCkge1xuICAgICAgcGF0dGVybiArPSBzdGFydERpZ2l0O1xuXG4gICAgfSBlbHNlIGlmIChzdGFydERpZ2l0ICE9PSAnMCcgfHwgc3RvcERpZ2l0ICE9PSAnOScpIHtcbiAgICAgIHBhdHRlcm4gKz0gdG9DaGFyYWN0ZXJDbGFzcyhzdGFydERpZ2l0LCBzdG9wRGlnaXQsIG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgcGF0dGVybiArPSBvcHRpb25zLnNob3J0aGFuZCA9PT0gdHJ1ZSA/ICdcXFxcZCcgOiAnWzAtOV0nO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0dGVybiwgY291bnQ6IFtjb3VudF0sIGRpZ2l0cyB9O1xufVxuXG5mdW5jdGlvbiBzcGxpdFRvUGF0dGVybnMobWluLCBtYXgsIHRvaywgb3B0aW9ucykge1xuICBsZXQgcmFuZ2VzID0gc3BsaXRUb1JhbmdlcyhtaW4sIG1heCk7XG4gIGxldCB0b2tlbnMgPSBbXTtcbiAgbGV0IHN0YXJ0ID0gbWluO1xuICBsZXQgcHJldjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBtYXggPSByYW5nZXNbaV07XG4gICAgbGV0IG9iaiA9IHJhbmdlVG9QYXR0ZXJuKFN0cmluZyhzdGFydCksIFN0cmluZyhtYXgpLCBvcHRpb25zKTtcbiAgICBsZXQgemVyb3MgPSAnJztcblxuICAgIGlmICghdG9rLmlzUGFkZGVkICYmIHByZXYgJiYgcHJldi5wYXR0ZXJuID09PSBvYmoucGF0dGVybikge1xuICAgICAgaWYgKHByZXYuY291bnQubGVuZ3RoID4gMSkge1xuICAgICAgICBwcmV2LmNvdW50LnBvcCgpO1xuICAgICAgfVxuXG4gICAgICBwcmV2LmNvdW50LnB1c2gob2JqLmNvdW50WzBdKTtcbiAgICAgIHByZXYuc3RyaW5nID0gcHJldi5wYXR0ZXJuICsgdG9RdWFudGlmaWVyKHByZXYuY291bnQpO1xuICAgICAgc3RhcnQgPSBtYXggKyAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRvay5pc1BhZGRlZCkge1xuICAgICAgemVyb3MgPSBwYWRaZXJvcyhtYXgsIHRvaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgb2JqLnN0cmluZyA9IHplcm9zICsgb2JqLnBhdHRlcm4gKyB0b1F1YW50aWZpZXIob2JqLmNvdW50KTtcbiAgICB0b2tlbnMucHVzaChvYmopO1xuICAgIHN0YXJ0ID0gbWF4ICsgMTtcbiAgICBwcmV2ID0gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gZmlsdGVyUGF0dGVybnMoYXJyLCBjb21wYXJpc29uLCBwcmVmaXgsIGludGVyc2VjdGlvbiwgb3B0aW9ucykge1xuICBsZXQgcmVzdWx0ID0gW107XG5cbiAgZm9yIChsZXQgZWxlIG9mIGFycikge1xuICAgIGxldCB7IHN0cmluZyB9ID0gZWxlO1xuXG4gICAgLy8gb25seSBwdXNoIGlmIF9ib3RoXyBhcmUgbmVnYXRpdmUuLi5cbiAgICBpZiAoIWludGVyc2VjdGlvbiAmJiAhY29udGFpbnMoY29tcGFyaXNvbiwgJ3N0cmluZycsIHN0cmluZykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCArIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLy8gb3IgX2JvdGhfIGFyZSBwb3NpdGl2ZVxuICAgIGlmIChpbnRlcnNlY3Rpb24gJiYgY29udGFpbnMoY29tcGFyaXNvbiwgJ3N0cmluZycsIHN0cmluZykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCArIHN0cmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogWmlwIHN0cmluZ3NcbiAqL1xuXG5mdW5jdGlvbiB6aXAoYSwgYikge1xuICBsZXQgYXJyID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgYXJyLnB1c2goW2FbaV0sIGJbaV1dKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIHJldHVybiBhID4gYiA/IDEgOiBiID4gYSA/IC0xIDogMDtcbn1cblxuZnVuY3Rpb24gY29udGFpbnMoYXJyLCBrZXksIHZhbCkge1xuICByZXR1cm4gYXJyLnNvbWUoZWxlID0+IGVsZVtrZXldID09PSB2YWwpO1xufVxuXG5mdW5jdGlvbiBjb3VudE5pbmVzKG1pbiwgbGVuKSB7XG4gIHJldHVybiBOdW1iZXIoU3RyaW5nKG1pbikuc2xpY2UoMCwgLWxlbikgKyAnOScucmVwZWF0KGxlbikpO1xufVxuXG5mdW5jdGlvbiBjb3VudFplcm9zKGludGVnZXIsIHplcm9zKSB7XG4gIHJldHVybiBpbnRlZ2VyIC0gKGludGVnZXIgJSBNYXRoLnBvdygxMCwgemVyb3MpKTtcbn1cblxuZnVuY3Rpb24gdG9RdWFudGlmaWVyKGRpZ2l0cykge1xuICBsZXQgW3N0YXJ0ID0gMCwgc3RvcCA9ICcnXSA9IGRpZ2l0cztcbiAgaWYgKHN0b3AgfHwgc3RhcnQgPiAxKSB7XG4gICAgcmV0dXJuIGB7JHtzdGFydCArIChzdG9wID8gJywnICsgc3RvcCA6ICcnKX19YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHRvQ2hhcmFjdGVyQ2xhc3MoYSwgYiwgb3B0aW9ucykge1xuICByZXR1cm4gYFske2F9JHsoYiAtIGEgPT09IDEpID8gJycgOiAnLSd9JHtifV1gO1xufVxuXG5mdW5jdGlvbiBoYXNQYWRkaW5nKHN0cikge1xuICByZXR1cm4gL14tPygwKylcXGQvLnRlc3Qoc3RyKTtcbn1cblxuZnVuY3Rpb24gcGFkWmVyb3ModmFsdWUsIHRvaywgb3B0aW9ucykge1xuICBpZiAoIXRvay5pc1BhZGRlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGxldCBkaWZmID0gTWF0aC5hYnModG9rLm1heExlbiAtIFN0cmluZyh2YWx1ZSkubGVuZ3RoKTtcbiAgbGV0IHJlbGF4ID0gb3B0aW9ucy5yZWxheFplcm9zICE9PSBmYWxzZTtcblxuICBzd2l0Y2ggKGRpZmYpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gJyc7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHJlbGF4ID8gJzA/JyA6ICcwJztcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gcmVsYXggPyAnMHswLDJ9JyA6ICcwMCc7XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHJlbGF4ID8gYDB7MCwke2RpZmZ9fWAgOiBgMHske2RpZmZ9fWA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FjaGVcbiAqL1xuXG50b1JlZ2V4UmFuZ2UuY2FjaGUgPSB7fTtcbnRvUmVnZXhSYW5nZS5jbGVhckNhY2hlID0gKCkgPT4gKHRvUmVnZXhSYW5nZS5jYWNoZSA9IHt9KTtcblxuLyoqXG4gKiBFeHBvc2UgYHRvUmVnZXhSYW5nZWBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRvUmVnZXhSYW5nZTtcbiIsICIvKiFcbiAqIGZpbGwtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2ZpbGwtcmFuZ2U+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IHRvUmVnZXhSYW5nZSA9IHJlcXVpcmUoJ3RvLXJlZ2V4LXJhbmdlJyk7XG5cbmNvbnN0IGlzT2JqZWN0ID0gdmFsID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG5jb25zdCB0cmFuc2Zvcm0gPSB0b051bWJlciA9PiB7XG4gIHJldHVybiB2YWx1ZSA9PiB0b051bWJlciA9PT0gdHJ1ZSA/IE51bWJlcih2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufTtcblxuY29uc3QgaXNWYWxpZFZhbHVlID0gdmFsdWUgPT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycpO1xufTtcblxuY29uc3QgaXNOdW1iZXIgPSBudW0gPT4gTnVtYmVyLmlzSW50ZWdlcigrbnVtKTtcblxuY29uc3QgemVyb3MgPSBpbnB1dCA9PiB7XG4gIGxldCB2YWx1ZSA9IGAke2lucHV0fWA7XG4gIGxldCBpbmRleCA9IC0xO1xuICBpZiAodmFsdWVbMF0gPT09ICctJykgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgaWYgKHZhbHVlID09PSAnMCcpIHJldHVybiBmYWxzZTtcbiAgd2hpbGUgKHZhbHVlWysraW5kZXhdID09PSAnMCcpO1xuICByZXR1cm4gaW5kZXggPiAwO1xufTtcblxuY29uc3Qgc3RyaW5naWZ5ID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHJpbmdpZnkgPT09IHRydWU7XG59O1xuXG5jb25zdCBwYWQgPSAoaW5wdXQsIG1heExlbmd0aCwgdG9OdW1iZXIpID0+IHtcbiAgaWYgKG1heExlbmd0aCA+IDApIHtcbiAgICBsZXQgZGFzaCA9IGlucHV0WzBdID09PSAnLScgPyAnLScgOiAnJztcbiAgICBpZiAoZGFzaCkgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICBpbnB1dCA9IChkYXNoICsgaW5wdXQucGFkU3RhcnQoZGFzaCA/IG1heExlbmd0aCAtIDEgOiBtYXhMZW5ndGgsICcwJykpO1xuICB9XG4gIGlmICh0b051bWJlciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gU3RyaW5nKGlucHV0KTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59O1xuXG5jb25zdCB0b01heExlbiA9IChpbnB1dCwgbWF4TGVuZ3RoKSA9PiB7XG4gIGxldCBuZWdhdGl2ZSA9IGlucHV0WzBdID09PSAnLScgPyAnLScgOiAnJztcbiAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICBtYXhMZW5ndGgtLTtcbiAgfVxuICB3aGlsZSAoaW5wdXQubGVuZ3RoIDwgbWF4TGVuZ3RoKSBpbnB1dCA9ICcwJyArIGlucHV0O1xuICByZXR1cm4gbmVnYXRpdmUgPyAoJy0nICsgaW5wdXQpIDogaW5wdXQ7XG59O1xuXG5jb25zdCB0b1NlcXVlbmNlID0gKHBhcnRzLCBvcHRpb25zKSA9PiB7XG4gIHBhcnRzLm5lZ2F0aXZlcy5zb3J0KChhLCBiKSA9PiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG4gIHBhcnRzLnBvc2l0aXZlcy5zb3J0KChhLCBiKSA9PiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG5cbiAgbGV0IHByZWZpeCA9IG9wdGlvbnMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgbGV0IHBvc2l0aXZlcyA9ICcnO1xuICBsZXQgbmVnYXRpdmVzID0gJyc7XG4gIGxldCByZXN1bHQ7XG5cbiAgaWYgKHBhcnRzLnBvc2l0aXZlcy5sZW5ndGgpIHtcbiAgICBwb3NpdGl2ZXMgPSBwYXJ0cy5wb3NpdGl2ZXMuam9pbignfCcpO1xuICB9XG5cbiAgaWYgKHBhcnRzLm5lZ2F0aXZlcy5sZW5ndGgpIHtcbiAgICBuZWdhdGl2ZXMgPSBgLSgke3ByZWZpeH0ke3BhcnRzLm5lZ2F0aXZlcy5qb2luKCd8Jyl9KWA7XG4gIH1cblxuICBpZiAocG9zaXRpdmVzICYmIG5lZ2F0aXZlcykge1xuICAgIHJlc3VsdCA9IGAke3Bvc2l0aXZlc318JHtuZWdhdGl2ZXN9YDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBwb3NpdGl2ZXMgfHwgbmVnYXRpdmVzO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgIHJldHVybiBgKCR7cHJlZml4fSR7cmVzdWx0fSlgO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRvUmFuZ2UgPSAoYSwgYiwgaXNOdW1iZXJzLCBvcHRpb25zKSA9PiB7XG4gIGlmIChpc051bWJlcnMpIHtcbiAgICByZXR1cm4gdG9SZWdleFJhbmdlKGEsIGIsIHsgd3JhcDogZmFsc2UsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICBsZXQgc3RhcnQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHN0YXJ0O1xuXG4gIGxldCBzdG9wID0gU3RyaW5nLmZyb21DaGFyQ29kZShiKTtcbiAgcmV0dXJuIGBbJHtzdGFydH0tJHtzdG9wfV1gO1xufTtcblxuY29uc3QgdG9SZWdleCA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXJ0KSkge1xuICAgIGxldCB3cmFwID0gb3B0aW9ucy53cmFwID09PSB0cnVlO1xuICAgIGxldCBwcmVmaXggPSBvcHRpb25zLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gICAgcmV0dXJuIHdyYXAgPyBgKCR7cHJlZml4fSR7c3RhcnQuam9pbignfCcpfSlgIDogc3RhcnQuam9pbignfCcpO1xuICB9XG4gIHJldHVybiB0b1JlZ2V4UmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucyk7XG59O1xuXG5jb25zdCByYW5nZUVycm9yID0gKC4uLmFyZ3MpID0+IHtcbiAgcmV0dXJuIG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHJhbmdlIGFyZ3VtZW50czogJyArIHV0aWwuaW5zcGVjdCguLi5hcmdzKSk7XG59O1xuXG5jb25zdCBpbnZhbGlkUmFuZ2UgPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAob3B0aW9ucy5zdHJpY3RSYW5nZXMgPT09IHRydWUpIHRocm93IHJhbmdlRXJyb3IoW3N0YXJ0LCBlbmRdKTtcbiAgcmV0dXJuIFtdO1xufTtcblxuY29uc3QgaW52YWxpZFN0ZXAgPSAoc3RlcCwgb3B0aW9ucykgPT4ge1xuICBpZiAob3B0aW9ucy5zdHJpY3RSYW5nZXMgPT09IHRydWUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBzdGVwIFwiJHtzdGVwfVwiIHRvIGJlIGEgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIFtdO1xufTtcblxuY29uc3QgZmlsbE51bWJlcnMgPSAoc3RhcnQsIGVuZCwgc3RlcCA9IDEsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgYSA9IE51bWJlcihzdGFydCk7XG4gIGxldCBiID0gTnVtYmVyKGVuZCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGEpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGIpKSB7XG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB0aHJvdyByYW5nZUVycm9yKFtzdGFydCwgZW5kXSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gZml4IG5lZ2F0aXZlIHplcm9cbiAgaWYgKGEgPT09IDApIGEgPSAwO1xuICBpZiAoYiA9PT0gMCkgYiA9IDA7XG5cbiAgbGV0IGRlc2NlbmRpbmcgPSBhID4gYjtcbiAgbGV0IHN0YXJ0U3RyaW5nID0gU3RyaW5nKHN0YXJ0KTtcbiAgbGV0IGVuZFN0cmluZyA9IFN0cmluZyhlbmQpO1xuICBsZXQgc3RlcFN0cmluZyA9IFN0cmluZyhzdGVwKTtcbiAgc3RlcCA9IE1hdGgubWF4KE1hdGguYWJzKHN0ZXApLCAxKTtcblxuICBsZXQgcGFkZGVkID0gemVyb3Moc3RhcnRTdHJpbmcpIHx8IHplcm9zKGVuZFN0cmluZykgfHwgemVyb3Moc3RlcFN0cmluZyk7XG4gIGxldCBtYXhMZW4gPSBwYWRkZWQgPyBNYXRoLm1heChzdGFydFN0cmluZy5sZW5ndGgsIGVuZFN0cmluZy5sZW5ndGgsIHN0ZXBTdHJpbmcubGVuZ3RoKSA6IDA7XG4gIGxldCB0b051bWJlciA9IHBhZGRlZCA9PT0gZmFsc2UgJiYgc3RyaW5naWZ5KHN0YXJ0LCBlbmQsIG9wdGlvbnMpID09PSBmYWxzZTtcbiAgbGV0IGZvcm1hdCA9IG9wdGlvbnMudHJhbnNmb3JtIHx8IHRyYW5zZm9ybSh0b051bWJlcik7XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCAmJiBzdGVwID09PSAxKSB7XG4gICAgcmV0dXJuIHRvUmFuZ2UodG9NYXhMZW4oc3RhcnQsIG1heExlbiksIHRvTWF4TGVuKGVuZCwgbWF4TGVuKSwgdHJ1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcGFydHMgPSB7IG5lZ2F0aXZlczogW10sIHBvc2l0aXZlczogW10gfTtcbiAgbGV0IHB1c2ggPSBudW0gPT4gcGFydHNbbnVtIDwgMCA/ICduZWdhdGl2ZXMnIDogJ3Bvc2l0aXZlcyddLnB1c2goTWF0aC5hYnMobnVtKSk7XG4gIGxldCByYW5nZSA9IFtdO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChkZXNjZW5kaW5nID8gYSA+PSBiIDogYSA8PSBiKSB7XG4gICAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSAmJiBzdGVwID4gMSkge1xuICAgICAgcHVzaChhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UucHVzaChwYWQoZm9ybWF0KGEsIGluZGV4KSwgbWF4TGVuLCB0b051bWJlcikpO1xuICAgIH1cbiAgICBhID0gZGVzY2VuZGluZyA/IGEgLSBzdGVwIDogYSArIHN0ZXA7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUpIHtcbiAgICByZXR1cm4gc3RlcCA+IDFcbiAgICAgID8gdG9TZXF1ZW5jZShwYXJ0cywgb3B0aW9ucylcbiAgICAgIDogdG9SZWdleChyYW5nZSwgbnVsbCwgeyB3cmFwOiBmYWxzZSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn07XG5cbmNvbnN0IGZpbGxMZXR0ZXJzID0gKHN0YXJ0LCBlbmQsIHN0ZXAgPSAxLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKCghaXNOdW1iZXIoc3RhcnQpICYmIHN0YXJ0Lmxlbmd0aCA+IDEpIHx8ICghaXNOdW1iZXIoZW5kKSAmJiBlbmQubGVuZ3RoID4gMSkpIHtcbiAgICByZXR1cm4gaW52YWxpZFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xuICB9XG5cblxuICBsZXQgZm9ybWF0ID0gb3B0aW9ucy50cmFuc2Zvcm0gfHwgKHZhbCA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbCkpO1xuICBsZXQgYSA9IGAke3N0YXJ0fWAuY2hhckNvZGVBdCgwKTtcbiAgbGV0IGIgPSBgJHtlbmR9YC5jaGFyQ29kZUF0KDApO1xuXG4gIGxldCBkZXNjZW5kaW5nID0gYSA+IGI7XG4gIGxldCBtaW4gPSBNYXRoLm1pbihhLCBiKTtcbiAgbGV0IG1heCA9IE1hdGgubWF4KGEsIGIpO1xuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggJiYgc3RlcCA9PT0gMSkge1xuICAgIHJldHVybiB0b1JhbmdlKG1pbiwgbWF4LCBmYWxzZSwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcmFuZ2UgPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoZGVzY2VuZGluZyA/IGEgPj0gYiA6IGEgPD0gYikge1xuICAgIHJhbmdlLnB1c2goZm9ybWF0KGEsIGluZGV4KSk7XG4gICAgYSA9IGRlc2NlbmRpbmcgPyBhIC0gc3RlcCA6IGEgKyBzdGVwO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHRvUmVnZXgocmFuZ2UsIG51bGwsIHsgd3JhcDogZmFsc2UsIG9wdGlvbnMgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59O1xuXG5jb25zdCBmaWxsID0gKHN0YXJ0LCBlbmQsIHN0ZXAsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoZW5kID09IG51bGwgJiYgaXNWYWxpZFZhbHVlKHN0YXJ0KSkge1xuICAgIHJldHVybiBbc3RhcnRdO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkVmFsdWUoc3RhcnQpIHx8ICFpc1ZhbGlkVmFsdWUoZW5kKSkge1xuICAgIHJldHVybiBpbnZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHN0ZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAxLCB7IHRyYW5zZm9ybTogc3RlcCB9KTtcbiAgfVxuXG4gIGlmIChpc09iamVjdChzdGVwKSkge1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDAsIHN0ZXApO1xuICB9XG5cbiAgbGV0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgaWYgKG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkgb3B0cy53cmFwID0gdHJ1ZTtcbiAgc3RlcCA9IHN0ZXAgfHwgb3B0cy5zdGVwIHx8IDE7XG5cbiAgaWYgKCFpc051bWJlcihzdGVwKSkge1xuICAgIGlmIChzdGVwICE9IG51bGwgJiYgIWlzT2JqZWN0KHN0ZXApKSByZXR1cm4gaW52YWxpZFN0ZXAoc3RlcCwgb3B0cyk7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMSwgc3RlcCk7XG4gIH1cblxuICBpZiAoaXNOdW1iZXIoc3RhcnQpICYmIGlzTnVtYmVyKGVuZCkpIHtcbiAgICByZXR1cm4gZmlsbE51bWJlcnMoc3RhcnQsIGVuZCwgc3RlcCwgb3B0cyk7XG4gIH1cblxuICByZXR1cm4gZmlsbExldHRlcnMoc3RhcnQsIGVuZCwgTWF0aC5tYXgoTWF0aC5hYnMoc3RlcCksIDEpLCBvcHRzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsbDtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZpbGwgPSByZXF1aXJlKCdmaWxsLXJhbmdlJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuY29uc3QgY29tcGlsZSA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgd2FsayA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIGxldCBpbnZhbGlkQmxvY2sgPSB1dGlscy5pc0ludmFsaWRCcmFjZShwYXJlbnQpO1xuICAgIGxldCBpbnZhbGlkTm9kZSA9IG5vZGUuaW52YWxpZCA9PT0gdHJ1ZSAmJiBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWU7XG4gICAgbGV0IGludmFsaWQgPSBpbnZhbGlkQmxvY2sgPT09IHRydWUgfHwgaW52YWxpZE5vZGUgPT09IHRydWU7XG4gICAgbGV0IHByZWZpeCA9IG9wdGlvbnMuZXNjYXBlSW52YWxpZCA9PT0gdHJ1ZSA/ICdcXFxcJyA6ICcnO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIGlmIChub2RlLmlzT3BlbiA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHByZWZpeCArIG5vZGUudmFsdWU7XG4gICAgfVxuICAgIGlmIChub2RlLmlzQ2xvc2UgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJykge1xuICAgICAgcmV0dXJuIGludmFsaWQgPyAocHJlZml4ICsgbm9kZS52YWx1ZSkgOiAnKCc7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgcmV0dXJuIGludmFsaWQgPyAocHJlZml4ICsgbm9kZS52YWx1ZSkgOiAnKSc7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ2NvbW1hJykge1xuICAgICAgcmV0dXJuIG5vZGUucHJldi50eXBlID09PSAnY29tbWEnID8gJycgOiAoaW52YWxpZCA/IG5vZGUudmFsdWUgOiAnfCcpO1xuICAgIH1cblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2RlcyAmJiBub2RlLnJhbmdlcyA+IDApIHtcbiAgICAgIGxldCBhcmdzID0gdXRpbHMucmVkdWNlKG5vZGUubm9kZXMpO1xuICAgICAgbGV0IHJhbmdlID0gZmlsbCguLi5hcmdzLCB7IC4uLm9wdGlvbnMsIHdyYXA6IGZhbHNlLCB0b1JlZ2V4OiB0cnVlIH0pO1xuXG4gICAgICBpZiAocmFuZ2UubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA+IDEgJiYgcmFuZ2UubGVuZ3RoID4gMSA/IGAoJHtyYW5nZX0pYCA6IHJhbmdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzKSB7XG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLm5vZGVzKSB7XG4gICAgICAgIG91dHB1dCArPSB3YWxrKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gd2Fsayhhc3QpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21waWxlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZmlsbCA9IHJlcXVpcmUoJ2ZpbGwtcmFuZ2UnKTtcbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuY29uc3QgYXBwZW5kID0gKHF1ZXVlID0gJycsIHN0YXNoID0gJycsIGVuY2xvc2UgPSBmYWxzZSkgPT4ge1xuICBsZXQgcmVzdWx0ID0gW107XG5cbiAgcXVldWUgPSBbXS5jb25jYXQocXVldWUpO1xuICBzdGFzaCA9IFtdLmNvbmNhdChzdGFzaCk7XG5cbiAgaWYgKCFzdGFzaC5sZW5ndGgpIHJldHVybiBxdWV1ZTtcbiAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZW5jbG9zZSA/IHV0aWxzLmZsYXR0ZW4oc3Rhc2gpLm1hcChlbGUgPT4gYHske2VsZX19YCkgOiBzdGFzaDtcbiAgfVxuXG4gIGZvciAobGV0IGl0ZW0gb2YgcXVldWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgZm9yIChsZXQgdmFsdWUgb2YgaXRlbSkge1xuICAgICAgICByZXN1bHQucHVzaChhcHBlbmQodmFsdWUsIHN0YXNoLCBlbmNsb3NlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGVsZSBvZiBzdGFzaCkge1xuICAgICAgICBpZiAoZW5jbG9zZSA9PT0gdHJ1ZSAmJiB0eXBlb2YgZWxlID09PSAnc3RyaW5nJykgZWxlID0gYHske2VsZX19YDtcbiAgICAgICAgcmVzdWx0LnB1c2goQXJyYXkuaXNBcnJheShlbGUpID8gYXBwZW5kKGl0ZW0sIGVsZSwgZW5jbG9zZSkgOiAoaXRlbSArIGVsZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdXRpbHMuZmxhdHRlbihyZXN1bHQpO1xufTtcblxuY29uc3QgZXhwYW5kID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCByYW5nZUxpbWl0ID0gb3B0aW9ucy5yYW5nZUxpbWl0ID09PSB2b2lkIDAgPyAxMDAwIDogb3B0aW9ucy5yYW5nZUxpbWl0O1xuXG4gIGxldCB3YWxrID0gKG5vZGUsIHBhcmVudCA9IHt9KSA9PiB7XG4gICAgbm9kZS5xdWV1ZSA9IFtdO1xuXG4gICAgbGV0IHAgPSBwYXJlbnQ7XG4gICAgbGV0IHEgPSBwYXJlbnQucXVldWU7XG5cbiAgICB3aGlsZSAocC50eXBlICE9PSAnYnJhY2UnICYmIHAudHlwZSAhPT0gJ3Jvb3QnICYmIHAucGFyZW50KSB7XG4gICAgICBwID0gcC5wYXJlbnQ7XG4gICAgICBxID0gcC5xdWV1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5pbnZhbGlkIHx8IG5vZGUuZG9sbGFyKSB7XG4gICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIHN0cmluZ2lmeShub2RlLCBvcHRpb25zKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdicmFjZScgJiYgbm9kZS5pbnZhbGlkICE9PSB0cnVlICYmIG5vZGUubm9kZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIFsne30nXSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzICYmIG5vZGUucmFuZ2VzID4gMCkge1xuICAgICAgbGV0IGFyZ3MgPSB1dGlscy5yZWR1Y2Uobm9kZS5ub2Rlcyk7XG5cbiAgICAgIGlmICh1dGlscy5leGNlZWRzTGltaXQoLi4uYXJncywgb3B0aW9ucy5zdGVwLCByYW5nZUxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZXhwYW5kZWQgYXJyYXkgbGVuZ3RoIGV4Y2VlZHMgcmFuZ2UgbGltaXQuIFVzZSBvcHRpb25zLnJhbmdlTGltaXQgdG8gaW5jcmVhc2Ugb3IgZGlzYWJsZSB0aGUgbGltaXQuJyk7XG4gICAgICB9XG5cbiAgICAgIGxldCByYW5nZSA9IGZpbGwoLi4uYXJncywgb3B0aW9ucyk7XG4gICAgICBpZiAocmFuZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJhbmdlID0gc3RyaW5naWZ5KG5vZGUsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIHJhbmdlKSk7XG4gICAgICBub2RlLm5vZGVzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGVuY2xvc2UgPSB1dGlscy5lbmNsb3NlQnJhY2Uobm9kZSk7XG4gICAgbGV0IHF1ZXVlID0gbm9kZS5xdWV1ZTtcbiAgICBsZXQgYmxvY2sgPSBub2RlO1xuXG4gICAgd2hpbGUgKGJsb2NrLnR5cGUgIT09ICdicmFjZScgJiYgYmxvY2sudHlwZSAhPT0gJ3Jvb3QnICYmIGJsb2NrLnBhcmVudCkge1xuICAgICAgYmxvY2sgPSBibG9jay5wYXJlbnQ7XG4gICAgICBxdWV1ZSA9IGJsb2NrLnF1ZXVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNoaWxkID0gbm9kZS5ub2Rlc1tpXTtcblxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjb21tYScgJiYgbm9kZS50eXBlID09PSAnYnJhY2UnKSB7XG4gICAgICAgIGlmIChpID09PSAxKSBxdWV1ZS5wdXNoKCcnKTtcbiAgICAgICAgcXVldWUucHVzaCgnJyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgICBxLnB1c2goYXBwZW5kKHEucG9wKCksIHF1ZXVlLCBlbmNsb3NlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQudmFsdWUgJiYgY2hpbGQudHlwZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goYXBwZW5kKHF1ZXVlLnBvcCgpLCBjaGlsZC52YWx1ZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLm5vZGVzKSB7XG4gICAgICAgIHdhbGsoY2hpbGQsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZTtcbiAgfTtcblxuICByZXR1cm4gdXRpbHMuZmxhdHRlbih3YWxrKGFzdCkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBhbmQ7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSDogMTAyNCAqIDY0LFxuXG4gIC8vIERpZ2l0c1xuICBDSEFSXzA6ICcwJywgLyogMCAqL1xuICBDSEFSXzk6ICc5JywgLyogOSAqL1xuXG4gIC8vIEFscGhhYmV0IGNoYXJzLlxuICBDSEFSX1VQUEVSQ0FTRV9BOiAnQScsIC8qIEEgKi9cbiAgQ0hBUl9MT1dFUkNBU0VfQTogJ2EnLCAvKiBhICovXG4gIENIQVJfVVBQRVJDQVNFX1o6ICdaJywgLyogWiAqL1xuICBDSEFSX0xPV0VSQ0FTRV9aOiAneicsIC8qIHogKi9cblxuICBDSEFSX0xFRlRfUEFSRU5USEVTRVM6ICcoJywgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTOiAnKScsIC8qICkgKi9cblxuICBDSEFSX0FTVEVSSVNLOiAnKicsIC8qICogKi9cblxuICAvLyBOb24tYWxwaGFiZXRpYyBjaGFycy5cbiAgQ0hBUl9BTVBFUlNBTkQ6ICcmJywgLyogJiAqL1xuICBDSEFSX0FUOiAnQCcsIC8qIEAgKi9cbiAgQ0hBUl9CQUNLU0xBU0g6ICdcXFxcJywgLyogXFwgKi9cbiAgQ0hBUl9CQUNLVElDSzogJ2AnLCAvKiBgICovXG4gIENIQVJfQ0FSUklBR0VfUkVUVVJOOiAnXFxyJywgLyogXFxyICovXG4gIENIQVJfQ0lSQ1VNRkxFWF9BQ0NFTlQ6ICdeJywgLyogXiAqL1xuICBDSEFSX0NPTE9OOiAnOicsIC8qIDogKi9cbiAgQ0hBUl9DT01NQTogJywnLCAvKiAsICovXG4gIENIQVJfRE9MTEFSOiAnJCcsIC8qIC4gKi9cbiAgQ0hBUl9ET1Q6ICcuJywgLyogLiAqL1xuICBDSEFSX0RPVUJMRV9RVU9URTogJ1wiJywgLyogXCIgKi9cbiAgQ0hBUl9FUVVBTDogJz0nLCAvKiA9ICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSzogJyEnLCAvKiAhICovXG4gIENIQVJfRk9STV9GRUVEOiAnXFxmJywgLyogXFxmICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSDogJy8nLCAvKiAvICovXG4gIENIQVJfSEFTSDogJyMnLCAvKiAjICovXG4gIENIQVJfSFlQSEVOX01JTlVTOiAnLScsIC8qIC0gKi9cbiAgQ0hBUl9MRUZUX0FOR0xFX0JSQUNLRVQ6ICc8JywgLyogPCAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0U6ICd7JywgLyogeyAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQ6ICdbJywgLyogWyAqL1xuICBDSEFSX0xJTkVfRkVFRDogJ1xcbicsIC8qIFxcbiAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFOiAnXFx1MDBBMCcsIC8qIFxcdTAwQTAgKi9cbiAgQ0hBUl9QRVJDRU5UOiAnJScsIC8qICUgKi9cbiAgQ0hBUl9QTFVTOiAnKycsIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLOiAnPycsIC8qID8gKi9cbiAgQ0hBUl9SSUdIVF9BTkdMRV9CUkFDS0VUOiAnPicsIC8qID4gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogJ30nLCAvKiB9ICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6ICddJywgLyogXSAqL1xuICBDSEFSX1NFTUlDT0xPTjogJzsnLCAvKiA7ICovXG4gIENIQVJfU0lOR0xFX1FVT1RFOiAnXFwnJywgLyogJyAqL1xuICBDSEFSX1NQQUNFOiAnICcsIC8qICAgKi9cbiAgQ0hBUl9UQUI6ICdcXHQnLCAvKiBcXHQgKi9cbiAgQ0hBUl9VTkRFUlNDT1JFOiAnXycsIC8qIF8gKi9cbiAgQ0hBUl9WRVJUSUNBTF9MSU5FOiAnfCcsIC8qIHwgKi9cbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0U6ICdcXHVGRUZGJyAvKiBcXHVGRUZGICovXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCB7XG4gIE1BWF9MRU5HVEgsXG4gIENIQVJfQkFDS1NMQVNILCAvKiBcXCAqL1xuICBDSEFSX0JBQ0tUSUNLLCAvKiBgICovXG4gIENIQVJfQ09NTUEsIC8qICwgKi9cbiAgQ0hBUl9ET1QsIC8qIC4gKi9cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTLCAvKiAoICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVMsIC8qICkgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFLCAvKiB7ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UsIC8qIH0gKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VULCAvKiBbICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQsIC8qIF0gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEUsIC8qIFwiICovXG4gIENIQVJfU0lOR0xFX1FVT1RFLCAvKiAnICovXG4gIENIQVJfTk9fQlJFQUtfU1BBQ0UsXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuLyoqXG4gKiBwYXJzZVxuICovXG5cbmNvbnN0IHBhcnNlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgbGV0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBsZXQgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG4gIGlmIChpbnB1dC5sZW5ndGggPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aCAoJHtpbnB1dC5sZW5ndGh9KSwgZXhjZWVkcyBtYXggY2hhcmFjdGVycyAoJHttYXh9KWApO1xuICB9XG5cbiAgbGV0IGFzdCA9IHsgdHlwZTogJ3Jvb3QnLCBpbnB1dCwgbm9kZXM6IFtdIH07XG4gIGxldCBzdGFjayA9IFthc3RdO1xuICBsZXQgYmxvY2sgPSBhc3Q7XG4gIGxldCBwcmV2ID0gYXN0O1xuICBsZXQgYnJhY2tldHMgPSAwO1xuICBsZXQgbGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgdmFsdWU7XG4gIGxldCBtZW1vID0ge307XG5cbiAgLyoqXG4gICAqIEhlbHBlcnNcbiAgICovXG5cbiAgY29uc3QgYWR2YW5jZSA9ICgpID0+IGlucHV0W2luZGV4KytdO1xuICBjb25zdCBwdXNoID0gbm9kZSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnICYmIHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgIHByZXYudHlwZSA9ICd0ZXh0JztcbiAgICB9XG5cbiAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICd0ZXh0JyAmJiBub2RlLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcHJldi52YWx1ZSArPSBub2RlLnZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGJsb2NrLm5vZGVzLnB1c2gobm9kZSk7XG4gICAgbm9kZS5wYXJlbnQgPSBibG9jaztcbiAgICBub2RlLnByZXYgPSBwcmV2O1xuICAgIHByZXYgPSBub2RlO1xuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHB1c2goeyB0eXBlOiAnYm9zJyB9KTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIHZhbHVlID0gYWR2YW5jZSgpO1xuXG4gICAgLyoqXG4gICAgICogSW52YWxpZCBjaGFyc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRSB8fCB2YWx1ZSA9PT0gQ0hBUl9OT19CUkVBS19TUEFDRSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlZCBjaGFyc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IChvcHRpb25zLmtlZXBFc2NhcGluZyA/IHZhbHVlIDogJycpICsgYWR2YW5jZSgpIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmlnaHQgc3F1YXJlIGJyYWNrZXQgKGxpdGVyYWwpOiAnXSdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWU6ICdcXFxcJyArIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGVmdCBzcXVhcmUgYnJhY2tldDogJ1snXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgYnJhY2tldHMrKztcblxuICAgICAgbGV0IGNsb3NlZCA9IHRydWU7XG4gICAgICBsZXQgbmV4dDtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICB2YWx1ZSArPSBuZXh0O1xuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgICAgICBicmFja2V0cysrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgdmFsdWUgKz0gYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgICAgICBicmFja2V0cy0tO1xuXG4gICAgICAgICAgaWYgKGJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJlbnRoZXNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgIGJsb2NrID0gcHVzaCh7IHR5cGU6ICdwYXJlbicsIG5vZGVzOiBbXSB9KTtcbiAgICAgIHN0YWNrLnB1c2goYmxvY2spO1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgIGlmIChibG9jay50eXBlICE9PSAncGFyZW4nKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJsb2NrID0gc3RhY2sucG9wKCk7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGJsb2NrID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdW90ZXM6ICd8XCJ8YFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0RPVUJMRV9RVU9URSB8fCB2YWx1ZSA9PT0gQ0hBUl9TSU5HTEVfUVVPVEUgfHwgdmFsdWUgPT09IENIQVJfQkFDS1RJQ0spIHtcbiAgICAgIGxldCBvcGVuID0gdmFsdWU7XG4gICAgICBsZXQgbmV4dDtcblxuICAgICAgaWYgKG9wdGlvbnMua2VlcFF1b3RlcyAhPT0gdHJ1ZSkge1xuICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgKG5leHQgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHZhbHVlICs9IG5leHQgKyBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gb3Blbikge1xuICAgICAgICAgIGlmIChvcHRpb25zLmtlZXBRdW90ZXMgPT09IHRydWUpIHZhbHVlICs9IG5leHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSArPSBuZXh0O1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlZnQgY3VybHkgYnJhY2U6ICd7J1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGRlcHRoKys7XG5cbiAgICAgIGxldCBkb2xsYXIgPSBwcmV2LnZhbHVlICYmIHByZXYudmFsdWUuc2xpY2UoLTEpID09PSAnJCcgfHwgYmxvY2suZG9sbGFyID09PSB0cnVlO1xuICAgICAgbGV0IGJyYWNlID0ge1xuICAgICAgICB0eXBlOiAnYnJhY2UnLFxuICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICBjbG9zZTogZmFsc2UsXG4gICAgICAgIGRvbGxhcixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGNvbW1hczogMCxcbiAgICAgICAgcmFuZ2VzOiAwLFxuICAgICAgICBub2RlczogW11cbiAgICAgIH07XG5cbiAgICAgIGJsb2NrID0gcHVzaChicmFjZSk7XG4gICAgICBzdGFjay5wdXNoKGJsb2NrKTtcbiAgICAgIHB1c2goeyB0eXBlOiAnb3BlbicsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmlnaHQgY3VybHkgYnJhY2U6ICd9J1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ2JyYWNlJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCB0eXBlID0gJ2Nsb3NlJztcbiAgICAgIGJsb2NrID0gc3RhY2sucG9wKCk7XG4gICAgICBibG9jay5jbG9zZSA9IHRydWU7XG5cbiAgICAgIHB1c2goeyB0eXBlLCB2YWx1ZSB9KTtcbiAgICAgIGRlcHRoLS07XG5cbiAgICAgIGJsb2NrID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21tYTogJywnXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfQ09NTUEgJiYgZGVwdGggPiAwKSB7XG4gICAgICBpZiAoYmxvY2sucmFuZ2VzID4gMCkge1xuICAgICAgICBibG9jay5yYW5nZXMgPSAwO1xuICAgICAgICBsZXQgb3BlbiA9IGJsb2NrLm5vZGVzLnNoaWZ0KCk7XG4gICAgICAgIGJsb2NrLm5vZGVzID0gW29wZW4sIHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogc3RyaW5naWZ5KGJsb2NrKSB9XTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdjb21tYScsIHZhbHVlIH0pO1xuICAgICAgYmxvY2suY29tbWFzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3Q6ICcuJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0RPVCAmJiBkZXB0aCA+IDAgJiYgYmxvY2suY29tbWFzID09PSAwKSB7XG4gICAgICBsZXQgc2libGluZ3MgPSBibG9jay5ub2RlcztcblxuICAgICAgaWYgKGRlcHRoID09PSAwIHx8IHNpYmxpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIGJsb2NrLnJhbmdlID0gW107XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYudHlwZSA9ICdyYW5nZSc7XG5cbiAgICAgICAgaWYgKGJsb2NrLm5vZGVzLmxlbmd0aCAhPT0gMyAmJiBibG9jay5ub2Rlcy5sZW5ndGggIT09IDUpIHtcbiAgICAgICAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICBibG9jay5yYW5nZXMgPSAwO1xuICAgICAgICAgIHByZXYudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJsb2NrLnJhbmdlcysrO1xuICAgICAgICBibG9jay5hcmdzID0gW107XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldi50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIHNpYmxpbmdzLnBvcCgpO1xuXG4gICAgICAgIGxldCBiZWZvcmUgPSBzaWJsaW5nc1tzaWJsaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgYmVmb3JlLnZhbHVlICs9IHByZXYudmFsdWUgKyB2YWx1ZTtcbiAgICAgICAgcHJldiA9IGJlZm9yZTtcbiAgICAgICAgYmxvY2sucmFuZ2VzLS07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2RvdCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGV4dFxuICAgICAqL1xuXG4gICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gIH1cblxuICAvLyBNYXJrIGltYmFsYW5jZWQgYnJhY2VzIGFuZCBicmFja2V0cyBhcyBpbnZhbGlkXG4gIGRvIHtcbiAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGJsb2NrLnR5cGUgIT09ICdyb290Jykge1xuICAgICAgYmxvY2subm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgaWYgKCFub2RlLm5vZGVzKSB7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nKSBub2RlLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykgbm9kZS5pc0Nsb3NlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIW5vZGUubm9kZXMpIG5vZGUudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICBub2RlLmludmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYmxvY2sgb24gcGFyZW50Lm5vZGVzIChibG9jaydzIHNpYmxpbmdzKVxuICAgICAgbGV0IHBhcmVudCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IGluZGV4ID0gcGFyZW50Lm5vZGVzLmluZGV4T2YoYmxvY2spO1xuICAgICAgLy8gcmVwbGFjZSB0aGUgKGludmFsaWQpIGJsb2NrIHdpdGggaXQncyBub2Rlc1xuICAgICAgcGFyZW50Lm5vZGVzLnNwbGljZShpbmRleCwgMSwgLi4uYmxvY2subm9kZXMpO1xuICAgIH1cbiAgfSB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCk7XG5cbiAgcHVzaCh7IHR5cGU6ICdlb3MnIH0pO1xuICByZXR1cm4gYXN0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vbGliL3N0cmluZ2lmeScpO1xuY29uc3QgY29tcGlsZSA9IHJlcXVpcmUoJy4vbGliL2NvbXBpbGUnKTtcbmNvbnN0IGV4cGFuZCA9IHJlcXVpcmUoJy4vbGliL2V4cGFuZCcpO1xuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL2xpYi9wYXJzZScpO1xuXG4vKipcbiAqIEV4cGFuZCB0aGUgZ2l2ZW4gcGF0dGVybiBvciBjcmVhdGUgYSByZWdleC1jb21wYXRpYmxlIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ3thLGIsY30nLCB7IGNvbXBpbGU6IHRydWUgfSkpOyAvLz0+IFsnKGF8YnxjKSddXG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ3thLGIsY30nKSk7IC8vPT4gWydhJywgJ2InLCAnYyddXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBicmFjZXMgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgb3V0cHV0ID0gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgZm9yIChsZXQgcGF0dGVybiBvZiBpbnB1dCkge1xuICAgICAgbGV0IHJlc3VsdCA9IGJyYWNlcy5jcmVhdGUocGF0dGVybiwgb3B0aW9ucyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKC4uLnJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBbXS5jb25jYXQoYnJhY2VzLmNyZWF0ZShpbnB1dCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5leHBhbmQgPT09IHRydWUgJiYgb3B0aW9ucy5ub2R1cGVzID09PSB0cnVlKSB7XG4gICAgb3V0cHV0ID0gWy4uLm5ldyBTZXQob3V0cHV0KV07XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIHdpdGggdGhlIGdpdmVuIGBvcHRpb25zYC5cbiAqXG4gKiBgYGBqc1xuICogLy8gYnJhY2VzLnBhcnNlKHBhdHRlcm4sIFssIG9wdGlvbnNdKTtcbiAqIGNvbnN0IGFzdCA9IGJyYWNlcy5wYXJzZSgnYS97YixjfS9kJyk7XG4gKiBjb25zb2xlLmxvZyhhc3QpO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiBCcmFjZSBwYXR0ZXJuIHRvIHBhcnNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIEFTVFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMucGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4gcGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBicmFjZXMgc3RyaW5nIGZyb20gYW4gQVNULCBvciBhbiBBU1Qgbm9kZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBsZXQgYXN0ID0gYnJhY2VzLnBhcnNlKCdmb28ve2EsYn0vYmFyJyk7XG4gKiBjb25zb2xlLmxvZyhzdHJpbmdpZnkoYXN0Lm5vZGVzWzJdKSk7IC8vPT4gJ3thLGJ9J1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBCcmFjZSBwYXR0ZXJuIG9yIEFTVC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLnN0cmluZ2lmeSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShicmFjZXMucGFyc2UoaW5wdXQsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZ5KGlucHV0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ29tcGlsZXMgYSBicmFjZSBwYXR0ZXJuIGludG8gYSByZWdleC1jb21wYXRpYmxlLCBvcHRpbWl6ZWQgc3RyaW5nLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uIGJ5IGRlZmF1bHQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzLmNvbXBpbGUoJ2Eve2IsY30vZCcpKTtcbiAqIC8vPT4gWydhLyhifGMpL2QnXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBCcmFjZSBwYXR0ZXJuIG9yIEFTVC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmNvbXBpbGUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gY29tcGlsZShpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cGFuZHMgYSBicmFjZSBwYXR0ZXJuIGludG8gYW4gYXJyYXkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGVcbiAqIG1haW4gW2JyYWNlc10oI2JyYWNlcykgZnVuY3Rpb24gd2hlbiBgb3B0aW9ucy5leHBhbmRgIGlzIHRydWUuIEJlZm9yZVxuICogdXNpbmcgdGhpcyBtZXRob2QgaXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSByZWFkIHRoZSBbcGVyZm9ybWFuY2Ugbm90ZXNdKCNwZXJmb3JtYW5jZSkpXG4gKiBhbmQgYWR2YW50YWdlcyBvZiB1c2luZyBbLmNvbXBpbGVdKCNjb21waWxlKSBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5leHBhbmQoJ2Eve2IsY30vZCcpKTtcbiAqIC8vPT4gWydhL2IvZCcsICdhL2MvZCddO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEJyYWNlIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmV4cGFuZCA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgaW5wdXQgPSBicmFjZXMucGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHJlc3VsdCA9IGV4cGFuZChpbnB1dCwgb3B0aW9ucyk7XG5cbiAgLy8gZmlsdGVyIG91dCBlbXB0eSBzdHJpbmdzIGlmIHNwZWNpZmllZFxuICBpZiAob3B0aW9ucy5ub2VtcHR5ID09PSB0cnVlKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8vIGZpbHRlciBvdXQgZHVwbGljYXRlcyBpZiBzcGVjaWZpZWRcbiAgaWYgKG9wdGlvbnMubm9kdXBlcyA9PT0gdHJ1ZSkge1xuICAgIHJlc3VsdCA9IFsuLi5uZXcgU2V0KHJlc3VsdCldO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUHJvY2Vzc2VzIGEgYnJhY2UgcGF0dGVybiBhbmQgcmV0dXJucyBlaXRoZXIgYW4gZXhwYW5kZWQgYXJyYXlcbiAqIChpZiBgb3B0aW9ucy5leHBhbmRgIGlzIHRydWUpLCBhIGhpZ2hseSBvcHRpbWl6ZWQgcmVnZXgtY29tcGF0aWJsZSBzdHJpbmcuXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIG1haW4gW2JyYWNlc10oI2JyYWNlcykgZnVuY3Rpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzLmNyZWF0ZSgndXNlci17MjAwLi4zMDB9L3Byb2plY3Qte2EsYixjfS17MS4uMTB9JykpXG4gKiAvLz0+ICd1c2VyLSgyMFswLTldfDJbMS05XVswLTldfDMwMCkvcHJvamVjdC0oYXxifGMpLShbMS05XXwxMCknXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQnJhY2UgcGF0dGVyblxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuY3JlYXRlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKGlucHV0ID09PSAnJyB8fCBpbnB1dC5sZW5ndGggPCAzKSB7XG4gICAgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuIHJldHVybiBvcHRpb25zLmV4cGFuZCAhPT0gdHJ1ZVxuICAgID8gYnJhY2VzLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMpXG4gICAgOiBicmFjZXMuZXhwYW5kKGlucHV0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwb3NlIFwiYnJhY2VzXCJcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJyYWNlcztcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBXSU5fU0xBU0ggPSAnXFxcXFxcXFwvJztcbmNvbnN0IFdJTl9OT19TTEFTSCA9IGBbXiR7V0lOX1NMQVNIfV1gO1xuXG4vKipcbiAqIFBvc2l4IGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBET1RfTElURVJBTCA9ICdcXFxcLic7XG5jb25zdCBQTFVTX0xJVEVSQUwgPSAnXFxcXCsnO1xuY29uc3QgUU1BUktfTElURVJBTCA9ICdcXFxcPyc7XG5jb25zdCBTTEFTSF9MSVRFUkFMID0gJ1xcXFwvJztcbmNvbnN0IE9ORV9DSEFSID0gJyg/PS4pJztcbmNvbnN0IFFNQVJLID0gJ1teL10nO1xuY29uc3QgRU5EX0FOQ0hPUiA9IGAoPzoke1NMQVNIX0xJVEVSQUx9fCQpYDtcbmNvbnN0IFNUQVJUX0FOQ0hPUiA9IGAoPzpefCR7U0xBU0hfTElURVJBTH0pYDtcbmNvbnN0IERPVFNfU0xBU0ggPSBgJHtET1RfTElURVJBTH17MSwyfSR7RU5EX0FOQ0hPUn1gO1xuY29uc3QgTk9fRE9UID0gYCg/ISR7RE9UX0xJVEVSQUx9KWA7XG5jb25zdCBOT19ET1RTID0gYCg/ISR7U1RBUlRfQU5DSE9SfSR7RE9UU19TTEFTSH0pYDtcbmNvbnN0IE5PX0RPVF9TTEFTSCA9IGAoPyEke0RPVF9MSVRFUkFMfXswLDF9JHtFTkRfQU5DSE9SfSlgO1xuY29uc3QgTk9fRE9UU19TTEFTSCA9IGAoPyEke0RPVFNfU0xBU0h9KWA7XG5jb25zdCBRTUFSS19OT19ET1QgPSBgW14uJHtTTEFTSF9MSVRFUkFMfV1gO1xuY29uc3QgU1RBUiA9IGAke1FNQVJLfSo/YDtcblxuY29uc3QgUE9TSVhfQ0hBUlMgPSB7XG4gIERPVF9MSVRFUkFMLFxuICBQTFVTX0xJVEVSQUwsXG4gIFFNQVJLX0xJVEVSQUwsXG4gIFNMQVNIX0xJVEVSQUwsXG4gIE9ORV9DSEFSLFxuICBRTUFSSyxcbiAgRU5EX0FOQ0hPUixcbiAgRE9UU19TTEFTSCxcbiAgTk9fRE9ULFxuICBOT19ET1RTLFxuICBOT19ET1RfU0xBU0gsXG4gIE5PX0RPVFNfU0xBU0gsXG4gIFFNQVJLX05PX0RPVCxcbiAgU1RBUixcbiAgU1RBUlRfQU5DSE9SXG59O1xuXG4vKipcbiAqIFdpbmRvd3MgZ2xvYiByZWdleFxuICovXG5cbmNvbnN0IFdJTkRPV1NfQ0hBUlMgPSB7XG4gIC4uLlBPU0lYX0NIQVJTLFxuXG4gIFNMQVNIX0xJVEVSQUw6IGBbJHtXSU5fU0xBU0h9XWAsXG4gIFFNQVJLOiBXSU5fTk9fU0xBU0gsXG4gIFNUQVI6IGAke1dJTl9OT19TTEFTSH0qP2AsXG4gIERPVFNfU0xBU0g6IGAke0RPVF9MSVRFUkFMfXsxLDJ9KD86WyR7V0lOX1NMQVNIfV18JClgLFxuICBOT19ET1Q6IGAoPyEke0RPVF9MSVRFUkFMfSlgLFxuICBOT19ET1RTOiBgKD8hKD86XnxbJHtXSU5fU0xBU0h9XSkke0RPVF9MSVRFUkFMfXsxLDJ9KD86WyR7V0lOX1NMQVNIfV18JCkpYCxcbiAgTk9fRE9UX1NMQVNIOiBgKD8hJHtET1RfTElURVJBTH17MCwxfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIE5PX0RPVFNfU0xBU0g6IGAoPyEke0RPVF9MSVRFUkFMfXsxLDJ9KD86WyR7V0lOX1NMQVNIfV18JCkpYCxcbiAgUU1BUktfTk9fRE9UOiBgW14uJHtXSU5fU0xBU0h9XWAsXG4gIFNUQVJUX0FOQ0hPUjogYCg/Ol58WyR7V0lOX1NMQVNIfV0pYCxcbiAgRU5EX0FOQ0hPUjogYCg/Olske1dJTl9TTEFTSH1dfCQpYFxufTtcblxuLyoqXG4gKiBQT1NJWCBCcmFja2V0IFJlZ2V4XG4gKi9cblxuY29uc3QgUE9TSVhfUkVHRVhfU09VUkNFID0ge1xuICBhbG51bTogJ2EtekEtWjAtOScsXG4gIGFscGhhOiAnYS16QS1aJyxcbiAgYXNjaWk6ICdcXFxceDAwLVxcXFx4N0YnLFxuICBibGFuazogJyBcXFxcdCcsXG4gIGNudHJsOiAnXFxcXHgwMC1cXFxceDFGXFxcXHg3RicsXG4gIGRpZ2l0OiAnMC05JyxcbiAgZ3JhcGg6ICdcXFxceDIxLVxcXFx4N0UnLFxuICBsb3dlcjogJ2EteicsXG4gIHByaW50OiAnXFxcXHgyMC1cXFxceDdFICcsXG4gIHB1bmN0OiAnXFxcXC0hXCIjJCUmXFwnKClcXFxcKissLi86Ozw9Pj9AW1xcXFxdXl9ge3x9ficsXG4gIHNwYWNlOiAnIFxcXFx0XFxcXHJcXFxcblxcXFx2XFxcXGYnLFxuICB1cHBlcjogJ0EtWicsXG4gIHdvcmQ6ICdBLVphLXowLTlfJyxcbiAgeGRpZ2l0OiAnQS1GYS1mMC05J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEg6IDEwMjQgKiA2NCxcbiAgUE9TSVhfUkVHRVhfU09VUkNFLFxuXG4gIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgUkVHRVhfQkFDS1NMQVNIOiAvXFxcXCg/IVsqKz9eJHt9KHwpW1xcXV0pL2csXG4gIFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTOiAvXlteQCFbXFxdLiwkKis/Xnt9KCl8XFxcXC9dKy8sXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlM6IC9bLSorPy5eJHt9KHwpW1xcXV0vLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUY6IC8oXFxcXD8pKChcXFcpKFxcMyopKS9nLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0dMT0JBTDogLyhbLSorPy5eJHt9KHwpW1xcXV0pL2csXG4gIFJFR0VYX1JFTU9WRV9CQUNLU0xBU0g6IC8oPzpcXFsuKj9bXlxcXFxdXFxdfFxcXFwoPz0uKSkvZyxcblxuICAvLyBSZXBsYWNlIGdsb2JzIHdpdGggZXF1aXZhbGVudCBwYXR0ZXJucyB0byByZWR1Y2UgcGFyc2luZyB0aW1lLlxuICBSRVBMQUNFTUVOVFM6IHtcbiAgICAnKioqJzogJyonLFxuICAgICcqKi8qKic6ICcqKicsXG4gICAgJyoqLyoqLyoqJzogJyoqJ1xuICB9LFxuXG4gIC8vIERpZ2l0c1xuICBDSEFSXzA6IDQ4LCAvKiAwICovXG4gIENIQVJfOTogNTcsIC8qIDkgKi9cblxuICAvLyBBbHBoYWJldCBjaGFycy5cbiAgQ0hBUl9VUFBFUkNBU0VfQTogNjUsIC8qIEEgKi9cbiAgQ0hBUl9MT1dFUkNBU0VfQTogOTcsIC8qIGEgKi9cbiAgQ0hBUl9VUFBFUkNBU0VfWjogOTAsIC8qIFogKi9cbiAgQ0hBUl9MT1dFUkNBU0VfWjogMTIyLCAvKiB6ICovXG5cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTOiA0MCwgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTOiA0MSwgLyogKSAqL1xuXG4gIENIQVJfQVNURVJJU0s6IDQyLCAvKiAqICovXG5cbiAgLy8gTm9uLWFscGhhYmV0aWMgY2hhcnMuXG4gIENIQVJfQU1QRVJTQU5EOiAzOCwgLyogJiAqL1xuICBDSEFSX0FUOiA2NCwgLyogQCAqL1xuICBDSEFSX0JBQ0tXQVJEX1NMQVNIOiA5MiwgLyogXFwgKi9cbiAgQ0hBUl9DQVJSSUFHRV9SRVRVUk46IDEzLCAvKiBcXHIgKi9cbiAgQ0hBUl9DSVJDVU1GTEVYX0FDQ0VOVDogOTQsIC8qIF4gKi9cbiAgQ0hBUl9DT0xPTjogNTgsIC8qIDogKi9cbiAgQ0hBUl9DT01NQTogNDQsIC8qICwgKi9cbiAgQ0hBUl9ET1Q6IDQ2LCAvKiAuICovXG4gIENIQVJfRE9VQkxFX1FVT1RFOiAzNCwgLyogXCIgKi9cbiAgQ0hBUl9FUVVBTDogNjEsIC8qID0gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLOiAzMywgLyogISAqL1xuICBDSEFSX0ZPUk1fRkVFRDogMTIsIC8qIFxcZiAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0g6IDQ3LCAvKiAvICovXG4gIENIQVJfR1JBVkVfQUNDRU5UOiA5NiwgLyogYCAqL1xuICBDSEFSX0hBU0g6IDM1LCAvKiAjICovXG4gIENIQVJfSFlQSEVOX01JTlVTOiA0NSwgLyogLSAqL1xuICBDSEFSX0xFRlRfQU5HTEVfQlJBQ0tFVDogNjAsIC8qIDwgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiAxMjMsIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiA5MSwgLyogWyAqL1xuICBDSEFSX0xJTkVfRkVFRDogMTAsIC8qIFxcbiAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFOiAxNjAsIC8qIFxcdTAwQTAgKi9cbiAgQ0hBUl9QRVJDRU5UOiAzNywgLyogJSAqL1xuICBDSEFSX1BMVVM6IDQzLCAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSzogNjMsIC8qID8gKi9cbiAgQ0hBUl9SSUdIVF9BTkdMRV9CUkFDS0VUOiA2MiwgLyogPiAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFOiAxMjUsIC8qIH0gKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVDogOTMsIC8qIF0gKi9cbiAgQ0hBUl9TRU1JQ09MT046IDU5LCAvKiA7ICovXG4gIENIQVJfU0lOR0xFX1FVT1RFOiAzOSwgLyogJyAqL1xuICBDSEFSX1NQQUNFOiAzMiwgLyogICAqL1xuICBDSEFSX1RBQjogOSwgLyogXFx0ICovXG4gIENIQVJfVU5ERVJTQ09SRTogOTUsIC8qIF8gKi9cbiAgQ0hBUl9WRVJUSUNBTF9MSU5FOiAxMjQsIC8qIHwgKi9cbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0U6IDY1Mjc5LCAvKiBcXHVGRUZGICovXG5cbiAgU0VQOiBwYXRoLnNlcCxcblxuICAvKipcbiAgICogQ3JlYXRlIEVYVEdMT0JfQ0hBUlNcbiAgICovXG5cbiAgZXh0Z2xvYkNoYXJzKGNoYXJzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICchJzogeyB0eXBlOiAnbmVnYXRlJywgb3BlbjogJyg/Oig/ISg/OicsIGNsb3NlOiBgKSkke2NoYXJzLlNUQVJ9KWAgfSxcbiAgICAgICc/JzogeyB0eXBlOiAncW1hcmsnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpPycgfSxcbiAgICAgICcrJzogeyB0eXBlOiAncGx1cycsIG9wZW46ICcoPzonLCBjbG9zZTogJykrJyB9LFxuICAgICAgJyonOiB7IHR5cGU6ICdzdGFyJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKSonIH0sXG4gICAgICAnQCc6IHsgdHlwZTogJ2F0Jywgb3BlbjogJyg/OicsIGNsb3NlOiAnKScgfVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBHTE9CX0NIQVJTXG4gICAqL1xuXG4gIGdsb2JDaGFycyh3aW4zMikge1xuICAgIHJldHVybiB3aW4zMiA9PT0gdHJ1ZSA/IFdJTkRPV1NfQ0hBUlMgOiBQT1NJWF9DSEFSUztcbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCB3aW4zMiA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5jb25zdCB7XG4gIFJFR0VYX0JBQ0tTTEFTSCxcbiAgUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSCxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSUyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUxcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5leHBvcnRzLmlzT2JqZWN0ID0gdmFsID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuZXhwb3J0cy5oYXNSZWdleENoYXJzID0gc3RyID0+IFJFR0VYX1NQRUNJQUxfQ0hBUlMudGVzdChzdHIpO1xuZXhwb3J0cy5pc1JlZ2V4Q2hhciA9IHN0ciA9PiBzdHIubGVuZ3RoID09PSAxICYmIGV4cG9ydHMuaGFzUmVnZXhDaGFycyhzdHIpO1xuZXhwb3J0cy5lc2NhcGVSZWdleCA9IHN0ciA9PiBzdHIucmVwbGFjZShSRUdFWF9TUEVDSUFMX0NIQVJTX0dMT0JBTCwgJ1xcXFwkMScpO1xuZXhwb3J0cy50b1Bvc2l4U2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZShSRUdFWF9CQUNLU0xBU0gsICcvJyk7XG5cbmV4cG9ydHMucmVtb3ZlQmFja3NsYXNoZXMgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSCwgbWF0Y2ggPT4ge1xuICAgIHJldHVybiBtYXRjaCA9PT0gJ1xcXFwnID8gJycgOiBtYXRjaDtcbiAgfSk7XG59O1xuXG5leHBvcnRzLnN1cHBvcnRzTG9va2JlaGluZHMgPSAoKSA9PiB7XG4gIGNvbnN0IHNlZ3MgPSBwcm9jZXNzLnZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgaWYgKHNlZ3MubGVuZ3RoID09PSAzICYmIHNlZ3NbMF0gPj0gOSB8fCAoc2Vnc1swXSA9PT0gOCAmJiBzZWdzWzFdID49IDEwKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydHMuaXNXaW5kb3dzID0gb3B0aW9ucyA9PiB7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLndpbmRvd3MgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBvcHRpb25zLndpbmRvd3M7XG4gIH1cbiAgcmV0dXJuIHdpbjMyID09PSB0cnVlIHx8IHBhdGguc2VwID09PSAnXFxcXCc7XG59O1xuXG5leHBvcnRzLmVzY2FwZUxhc3QgPSAoaW5wdXQsIGNoYXIsIGxhc3RJZHgpID0+IHtcbiAgY29uc3QgaWR4ID0gaW5wdXQubGFzdEluZGV4T2YoY2hhciwgbGFzdElkeCk7XG4gIGlmIChpZHggPT09IC0xKSByZXR1cm4gaW5wdXQ7XG4gIGlmIChpbnB1dFtpZHggLSAxXSA9PT0gJ1xcXFwnKSByZXR1cm4gZXhwb3J0cy5lc2NhcGVMYXN0KGlucHV0LCBjaGFyLCBpZHggLSAxKTtcbiAgcmV0dXJuIGAke2lucHV0LnNsaWNlKDAsIGlkeCl9XFxcXCR7aW5wdXQuc2xpY2UoaWR4KX1gO1xufTtcblxuZXhwb3J0cy5yZW1vdmVQcmVmaXggPSAoaW5wdXQsIHN0YXRlID0ge30pID0+IHtcbiAgbGV0IG91dHB1dCA9IGlucHV0O1xuICBpZiAob3V0cHV0LnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICBvdXRwdXQgPSBvdXRwdXQuc2xpY2UoMik7XG4gICAgc3RhdGUucHJlZml4ID0gJy4vJztcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuZXhwb3J0cy53cmFwT3V0cHV0ID0gKGlucHV0LCBzdGF0ZSA9IHt9LCBvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgcHJlcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAnJyA6ICdeJztcbiAgY29uc3QgYXBwZW5kID0gb3B0aW9ucy5jb250YWlucyA/ICcnIDogJyQnO1xuXG4gIGxldCBvdXRwdXQgPSBgJHtwcmVwZW5kfSg/OiR7aW5wdXR9KSR7YXBwZW5kfWA7XG4gIGlmIChzdGF0ZS5uZWdhdGVkID09PSB0cnVlKSB7XG4gICAgb3V0cHV0ID0gYCg/Ol4oPyEke291dHB1dH0pLiokKWA7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IHtcbiAgQ0hBUl9BU1RFUklTSywgICAgICAgICAgICAgLyogKiAqL1xuICBDSEFSX0FULCAgICAgICAgICAgICAgICAgICAvKiBAICovXG4gIENIQVJfQkFDS1dBUkRfU0xBU0gsICAgICAgIC8qIFxcICovXG4gIENIQVJfQ09NTUEsICAgICAgICAgICAgICAgIC8qICwgKi9cbiAgQ0hBUl9ET1QsICAgICAgICAgICAgICAgICAgLyogLiAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUkssICAgICAvKiAhICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSCwgICAgICAgIC8qIC8gKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFLCAgICAgLyogeyAqL1xuICBDSEFSX0xFRlRfUEFSRU5USEVTRVMsICAgICAvKiAoICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCwgIC8qIFsgKi9cbiAgQ0hBUl9QTFVTLCAgICAgICAgICAgICAgICAgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUkssICAgICAgICAvKiA/ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UsICAgIC8qIH0gKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUywgICAgLyogKSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUICAvKiBdICovXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuY29uc3QgaXNQYXRoU2VwYXJhdG9yID0gY29kZSA9PiB7XG4gIHJldHVybiBjb2RlID09PSBDSEFSX0ZPUldBUkRfU0xBU0ggfHwgY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSDtcbn07XG5cbmNvbnN0IGRlcHRoID0gdG9rZW4gPT4ge1xuICBpZiAodG9rZW4uaXNQcmVmaXggIT09IHRydWUpIHtcbiAgICB0b2tlbi5kZXB0aCA9IHRva2VuLmlzR2xvYnN0YXIgPyBJbmZpbml0eSA6IDE7XG4gIH1cbn07XG5cbi8qKlxuICogUXVpY2tseSBzY2FucyBhIGdsb2IgcGF0dGVybiBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGhhbmRmdWwgb2ZcbiAqIHVzZWZ1bCBwcm9wZXJ0aWVzLCBsaWtlIGBpc0dsb2JgLCBgcGF0aGAgKHRoZSBsZWFkaW5nIG5vbi1nbG9iLCBpZiBpdCBleGlzdHMpLFxuICogYGdsb2JgICh0aGUgYWN0dWFsIHBhdHRlcm4pLCBgbmVnYXRlZGAgKHRydWUgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYCFgIGJ1dCBub3RcbiAqIHdpdGggYCEoYCkgYW5kIGBuZWdhdGVkRXh0Z2xvYmAgKHRydWUgaWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYCEoYCkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBtID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiBjb25zb2xlLmxvZyhwbS5zY2FuKCdmb28vYmFyLyouanMnKSk7XG4gKiB7IGlzR2xvYjogdHJ1ZSwgaW5wdXQ6ICdmb28vYmFyLyouanMnLCBiYXNlOiAnZm9vL2JhcicsIGdsb2I6ICcqLmpzJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRva2VucyBhbmQgcmVnZXggc291cmNlIHN0cmluZy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3Qgc2NhbiA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGggLSAxO1xuICBjb25zdCBzY2FuVG9FbmQgPSBvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMuc2NhblRvRW5kID09PSB0cnVlO1xuICBjb25zdCBzbGFzaGVzID0gW107XG4gIGNvbnN0IHRva2VucyA9IFtdO1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gIGxldCBzdHIgPSBpbnB1dDtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBsZXQgaXNCcmFjZSA9IGZhbHNlO1xuICBsZXQgaXNCcmFja2V0ID0gZmFsc2U7XG4gIGxldCBpc0dsb2IgPSBmYWxzZTtcbiAgbGV0IGlzRXh0Z2xvYiA9IGZhbHNlO1xuICBsZXQgaXNHbG9ic3RhciA9IGZhbHNlO1xuICBsZXQgYnJhY2VFc2NhcGVkID0gZmFsc2U7XG4gIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuICBsZXQgbmVnYXRlZCA9IGZhbHNlO1xuICBsZXQgbmVnYXRlZEV4dGdsb2IgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGxldCBicmFjZXMgPSAwO1xuICBsZXQgcHJldjtcbiAgbGV0IGNvZGU7XG4gIGxldCB0b2tlbiA9IHsgdmFsdWU6ICcnLCBkZXB0aDogMCwgaXNHbG9iOiBmYWxzZSB9O1xuXG4gIGNvbnN0IGVvcyA9ICgpID0+IGluZGV4ID49IGxlbmd0aDtcbiAgY29uc3QgcGVlayA9ICgpID0+IHN0ci5jaGFyQ29kZUF0KGluZGV4ICsgMSk7XG4gIGNvbnN0IGFkdmFuY2UgPSAoKSA9PiB7XG4gICAgcHJldiA9IGNvZGU7XG4gICAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgpO1xuICB9O1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgbGV0IG5leHQ7XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICBjb2RlID0gYWR2YW5jZSgpO1xuXG4gICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgIGJyYWNlRXNjYXBlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoYnJhY2VFc2NhcGVkID09PSB0cnVlIHx8IGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgYnJhY2VzKys7XG5cbiAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgICAgYnJhY2VzKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfRE9UICYmIChjb2RlID0gYWR2YW5jZSgpKSA9PT0gQ0hBUl9ET1QpIHtcbiAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChicmFjZUVzY2FwZWQgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9DT01NQSkge1xuICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgICAgICBicmFjZXMtLTtcblxuICAgICAgICAgIGlmIChicmFjZXMgPT09IDApIHtcbiAgICAgICAgICAgIGJyYWNlRXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHtcbiAgICAgIHNsYXNoZXMucHVzaChpbmRleCk7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB0b2tlbiA9IHsgdmFsdWU6ICcnLCBkZXB0aDogMCwgaXNHbG9iOiBmYWxzZSB9O1xuXG4gICAgICBpZiAoZmluaXNoZWQgPT09IHRydWUpIGNvbnRpbnVlO1xuICAgICAgaWYgKHByZXYgPT09IENIQVJfRE9UICYmIGluZGV4ID09PSAoc3RhcnQgKyAxKSkge1xuICAgICAgICBzdGFydCArPSAyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9leHQgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGlzRXh0Z2xvYkNoYXIgPSBjb2RlID09PSBDSEFSX1BMVVNcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9BVFxuICAgICAgICB8fCBjb2RlID09PSBDSEFSX0FTVEVSSVNLXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfUVVFU1RJT05fTUFSS1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUks7XG5cbiAgICAgIGlmIChpc0V4dGdsb2JDaGFyID09PSB0cnVlICYmIHBlZWsoKSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgIGlzRXh0Z2xvYiA9IHRva2VuLmlzRXh0Z2xvYiA9IHRydWU7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSyAmJiBpbmRleCA9PT0gc3RhcnQpIHtcbiAgICAgICAgICBuZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChjb2RlID0gYWR2YW5jZSgpKSkge1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9BU1RFUklTSykge1xuICAgICAgaWYgKHByZXYgPT09IENIQVJfQVNURVJJU0spIGlzR2xvYnN0YXIgPSB0b2tlbi5pc0dsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9RVUVTVElPTl9NQVJLKSB7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgaXNCcmFja2V0ID0gdG9rZW4uaXNCcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5ub25lZ2F0ZSAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUksgJiYgaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICBuZWdhdGVkID0gdG9rZW4ubmVnYXRlZCA9IHRydWU7XG4gICAgICBzdGFydCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9wYXJlbiAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChjb2RlID0gYWR2YW5jZSgpKSkge1xuICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgICAgY29kZSA9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaXNHbG9iID09PSB0cnVlKSB7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLm5vZXh0ID09PSB0cnVlKSB7XG4gICAgaXNFeHRnbG9iID0gZmFsc2U7XG4gICAgaXNHbG9iID0gZmFsc2U7XG4gIH1cblxuICBsZXQgYmFzZSA9IHN0cjtcbiAgbGV0IHByZWZpeCA9ICcnO1xuICBsZXQgZ2xvYiA9ICcnO1xuXG4gIGlmIChzdGFydCA+IDApIHtcbiAgICBwcmVmaXggPSBzdHIuc2xpY2UoMCwgc3RhcnQpO1xuICAgIHN0ciA9IHN0ci5zbGljZShzdGFydCk7XG4gICAgbGFzdEluZGV4IC09IHN0YXJ0O1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgaXNHbG9iID09PSB0cnVlICYmIGxhc3RJbmRleCA+IDApIHtcbiAgICBiYXNlID0gc3RyLnNsaWNlKDAsIGxhc3RJbmRleCk7XG4gICAgZ2xvYiA9IHN0ci5zbGljZShsYXN0SW5kZXgpO1xuICB9IGVsc2UgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkge1xuICAgIGJhc2UgPSAnJztcbiAgICBnbG9iID0gc3RyO1xuICB9IGVsc2Uge1xuICAgIGJhc2UgPSBzdHI7XG4gIH1cblxuICBpZiAoYmFzZSAmJiBiYXNlICE9PSAnJyAmJiBiYXNlICE9PSAnLycgJiYgYmFzZSAhPT0gc3RyKSB7XG4gICAgaWYgKGlzUGF0aFNlcGFyYXRvcihiYXNlLmNoYXJDb2RlQXQoYmFzZS5sZW5ndGggLSAxKSkpIHtcbiAgICAgIGJhc2UgPSBiYXNlLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChnbG9iKSBnbG9iID0gdXRpbHMucmVtb3ZlQmFja3NsYXNoZXMoZ2xvYik7XG5cbiAgICBpZiAoYmFzZSAmJiBiYWNrc2xhc2hlcyA9PT0gdHJ1ZSkge1xuICAgICAgYmFzZSA9IHV0aWxzLnJlbW92ZUJhY2tzbGFzaGVzKGJhc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIHByZWZpeCxcbiAgICBpbnB1dCxcbiAgICBzdGFydCxcbiAgICBiYXNlLFxuICAgIGdsb2IsXG4gICAgaXNCcmFjZSxcbiAgICBpc0JyYWNrZXQsXG4gICAgaXNHbG9iLFxuICAgIGlzRXh0Z2xvYixcbiAgICBpc0dsb2JzdGFyLFxuICAgIG5lZ2F0ZWQsXG4gICAgbmVnYXRlZEV4dGdsb2JcbiAgfTtcblxuICBpZiAob3B0cy50b2tlbnMgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5tYXhEZXB0aCA9IDA7XG4gICAgaWYgKCFpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHtcbiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICB9XG4gICAgc3RhdGUudG9rZW5zID0gdG9rZW5zO1xuICB9XG5cbiAgaWYgKG9wdHMucGFydHMgPT09IHRydWUgfHwgb3B0cy50b2tlbnMgPT09IHRydWUpIHtcbiAgICBsZXQgcHJldkluZGV4O1xuXG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgc2xhc2hlcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICBjb25zdCBuID0gcHJldkluZGV4ID8gcHJldkluZGV4ICsgMSA6IHN0YXJ0O1xuICAgICAgY29uc3QgaSA9IHNsYXNoZXNbaWR4XTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5wdXQuc2xpY2UobiwgaSk7XG4gICAgICBpZiAob3B0cy50b2tlbnMpIHtcbiAgICAgICAgaWYgKGlkeCA9PT0gMCAmJiBzdGFydCAhPT0gMCkge1xuICAgICAgICAgIHRva2Vuc1tpZHhdLmlzUHJlZml4ID0gdHJ1ZTtcbiAgICAgICAgICB0b2tlbnNbaWR4XS52YWx1ZSA9IHByZWZpeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b2tlbnNbaWR4XS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGRlcHRoKHRva2Vuc1tpZHhdKTtcbiAgICAgICAgc3RhdGUubWF4RGVwdGggKz0gdG9rZW5zW2lkeF0uZGVwdGg7XG4gICAgICB9XG4gICAgICBpZiAoaWR4ICE9PSAwIHx8IHZhbHVlICE9PSAnJykge1xuICAgICAgICBwYXJ0cy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHByZXZJbmRleCA9IGk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZJbmRleCAmJiBwcmV2SW5kZXggKyAxIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKHByZXZJbmRleCArIDEpO1xuICAgICAgcGFydHMucHVzaCh2YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRzLnRva2Vucykge1xuICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIGRlcHRoKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0pO1xuICAgICAgICBzdGF0ZS5tYXhEZXB0aCArPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmRlcHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRlLnNsYXNoZXMgPSBzbGFzaGVzO1xuICAgIHN0YXRlLnBhcnRzID0gcGFydHM7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNjYW47XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3Qge1xuICBNQVhfTEVOR1RILFxuICBQT1NJWF9SRUdFWF9TT1VSQ0UsXG4gIFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUYsXG4gIFJFUExBQ0VNRU5UU1xufSA9IGNvbnN0YW50cztcblxuLyoqXG4gKiBIZWxwZXJzXG4gKi9cblxuY29uc3QgZXhwYW5kUmFuZ2UgPSAoYXJncywgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwYW5kUmFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5leHBhbmRSYW5nZSguLi5hcmdzLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFyZ3Muc29ydCgpO1xuICBjb25zdCB2YWx1ZSA9IGBbJHthcmdzLmpvaW4oJy0nKX1dYDtcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXcgKi9cbiAgICBuZXcgUmVnRXhwKHZhbHVlKTtcbiAgfSBjYXRjaCAoZXgpIHtcbiAgICByZXR1cm4gYXJncy5tYXAodiA9PiB1dGlscy5lc2NhcGVSZWdleCh2KSkuam9pbignLi4nKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBtZXNzYWdlIGZvciBhIHN5bnRheCBlcnJvclxuICovXG5cbmNvbnN0IHN5bnRheEVycm9yID0gKHR5cGUsIGNoYXIpID0+IHtcbiAgcmV0dXJuIGBNaXNzaW5nICR7dHlwZX06IFwiJHtjaGFyfVwiIC0gdXNlIFwiXFxcXFxcXFwke2NoYXJ9XCIgdG8gbWF0Y2ggbGl0ZXJhbCBjaGFyYWN0ZXJzYDtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGlucHV0IHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5jb25zdCBwYXJzZSA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICBpbnB1dCA9IFJFUExBQ0VNRU5UU1tpbnB1dF0gfHwgaW5wdXQ7XG5cbiAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcblxuICBsZXQgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBpZiAobGVuID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGg6ICR7bGVufSwgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoOiAke21heH1gKTtcbiAgfVxuXG4gIGNvbnN0IGJvcyA9IHsgdHlwZTogJ2JvcycsIHZhbHVlOiAnJywgb3V0cHV0OiBvcHRzLnByZXBlbmQgfHwgJycgfTtcbiAgY29uc3QgdG9rZW5zID0gW2Jvc107XG5cbiAgY29uc3QgY2FwdHVyZSA9IG9wdHMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgY29uc3Qgd2luMzIgPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG5cbiAgLy8gY3JlYXRlIGNvbnN0YW50cyBiYXNlZCBvbiBwbGF0Zm9ybSwgZm9yIHdpbmRvd3Mgb3IgcG9zaXhcbiAgY29uc3QgUExBVEZPUk1fQ0hBUlMgPSBjb25zdGFudHMuZ2xvYkNoYXJzKHdpbjMyKTtcbiAgY29uc3QgRVhUR0xPQl9DSEFSUyA9IGNvbnN0YW50cy5leHRnbG9iQ2hhcnMoUExBVEZPUk1fQ0hBUlMpO1xuXG4gIGNvbnN0IHtcbiAgICBET1RfTElURVJBTCxcbiAgICBQTFVTX0xJVEVSQUwsXG4gICAgU0xBU0hfTElURVJBTCxcbiAgICBPTkVfQ0hBUixcbiAgICBET1RTX1NMQVNILFxuICAgIE5PX0RPVCxcbiAgICBOT19ET1RfU0xBU0gsXG4gICAgTk9fRE9UU19TTEFTSCxcbiAgICBRTUFSSyxcbiAgICBRTUFSS19OT19ET1QsXG4gICAgU1RBUixcbiAgICBTVEFSVF9BTkNIT1JcbiAgfSA9IFBMQVRGT1JNX0NIQVJTO1xuXG4gIGNvbnN0IGdsb2JzdGFyID0gb3B0cyA9PiB7XG4gICAgcmV0dXJuIGAoJHtjYXB0dXJlfSg/Oig/ISR7U1RBUlRfQU5DSE9SfSR7b3B0cy5kb3QgPyBET1RTX1NMQVNIIDogRE9UX0xJVEVSQUx9KS4pKj8pYDtcbiAgfTtcblxuICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gJycgOiBOT19ET1Q7XG4gIGNvbnN0IHFtYXJrTm9Eb3QgPSBvcHRzLmRvdCA/IFFNQVJLIDogUU1BUktfTk9fRE9UO1xuICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/IGdsb2JzdGFyKG9wdHMpIDogU1RBUjtcblxuICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgc3RhciA9IGAoJHtzdGFyfSlgO1xuICB9XG5cbiAgLy8gbWluaW1hdGNoIG9wdGlvbnMgc3VwcG9ydFxuICBpZiAodHlwZW9mIG9wdHMubm9leHQgPT09ICdib29sZWFuJykge1xuICAgIG9wdHMubm9leHRnbG9iID0gb3B0cy5ub2V4dDtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIGlucHV0LFxuICAgIGluZGV4OiAtMSxcbiAgICBzdGFydDogMCxcbiAgICBkb3Q6IG9wdHMuZG90ID09PSB0cnVlLFxuICAgIGNvbnN1bWVkOiAnJyxcbiAgICBvdXRwdXQ6ICcnLFxuICAgIHByZWZpeDogJycsXG4gICAgYmFja3RyYWNrOiBmYWxzZSxcbiAgICBuZWdhdGVkOiBmYWxzZSxcbiAgICBicmFja2V0czogMCxcbiAgICBicmFjZXM6IDAsXG4gICAgcGFyZW5zOiAwLFxuICAgIHF1b3RlczogMCxcbiAgICBnbG9ic3RhcjogZmFsc2UsXG4gICAgdG9rZW5zXG4gIH07XG5cbiAgaW5wdXQgPSB1dGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHN0YXRlKTtcbiAgbGVuID0gaW5wdXQubGVuZ3RoO1xuXG4gIGNvbnN0IGV4dGdsb2JzID0gW107XG4gIGNvbnN0IGJyYWNlcyA9IFtdO1xuICBjb25zdCBzdGFjayA9IFtdO1xuICBsZXQgcHJldiA9IGJvcztcbiAgbGV0IHZhbHVlO1xuXG4gIC8qKlxuICAgKiBUb2tlbml6aW5nIGhlbHBlcnNcbiAgICovXG5cbiAgY29uc3QgZW9zID0gKCkgPT4gc3RhdGUuaW5kZXggPT09IGxlbiAtIDE7XG4gIGNvbnN0IHBlZWsgPSBzdGF0ZS5wZWVrID0gKG4gPSAxKSA9PiBpbnB1dFtzdGF0ZS5pbmRleCArIG5dO1xuICBjb25zdCBhZHZhbmNlID0gc3RhdGUuYWR2YW5jZSA9ICgpID0+IGlucHV0Wysrc3RhdGUuaW5kZXhdIHx8ICcnO1xuICBjb25zdCByZW1haW5pbmcgPSAoKSA9PiBpbnB1dC5zbGljZShzdGF0ZS5pbmRleCArIDEpO1xuICBjb25zdCBjb25zdW1lID0gKHZhbHVlID0gJycsIG51bSA9IDApID0+IHtcbiAgICBzdGF0ZS5jb25zdW1lZCArPSB2YWx1ZTtcbiAgICBzdGF0ZS5pbmRleCArPSBudW07XG4gIH07XG5cbiAgY29uc3QgYXBwZW5kID0gdG9rZW4gPT4ge1xuICAgIHN0YXRlLm91dHB1dCArPSB0b2tlbi5vdXRwdXQgIT0gbnVsbCA/IHRva2VuLm91dHB1dCA6IHRva2VuLnZhbHVlO1xuICAgIGNvbnN1bWUodG9rZW4udmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IG5lZ2F0ZSA9ICgpID0+IHtcbiAgICBsZXQgY291bnQgPSAxO1xuXG4gICAgd2hpbGUgKHBlZWsoKSA9PT0gJyEnICYmIChwZWVrKDIpICE9PSAnKCcgfHwgcGVlaygzKSA9PT0gJz8nKSkge1xuICAgICAgYWR2YW5jZSgpO1xuICAgICAgc3RhdGUuc3RhcnQrKztcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50ICUgMiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXRlLm5lZ2F0ZWQgPSB0cnVlO1xuICAgIHN0YXRlLnN0YXJ0Kys7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgaW5jcmVtZW50ID0gdHlwZSA9PiB7XG4gICAgc3RhdGVbdHlwZV0rKztcbiAgICBzdGFjay5wdXNoKHR5cGUpO1xuICB9O1xuXG4gIGNvbnN0IGRlY3JlbWVudCA9IHR5cGUgPT4ge1xuICAgIHN0YXRlW3R5cGVdLS07XG4gICAgc3RhY2sucG9wKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1c2ggdG9rZW5zIG9udG8gdGhlIHRva2VucyBhcnJheS4gVGhpcyBoZWxwZXIgc3BlZWRzIHVwXG4gICAqIHRva2VuaXppbmcgYnkgMSkgaGVscGluZyB1cyBhdm9pZCBiYWNrdHJhY2tpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSxcbiAgICogYW5kIDIpIGhlbHBpbmcgdXMgYXZvaWQgY3JlYXRpbmcgZXh0cmEgdG9rZW5zIHdoZW4gY29uc2VjdXRpdmVcbiAgICogY2hhcmFjdGVycyBhcmUgcGxhaW4gdGV4dC4gVGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhbmQgc2ltcGxpZmllc1xuICAgKiBsb29rYmVoaW5kcy5cbiAgICovXG5cbiAgY29uc3QgcHVzaCA9IHRvayA9PiB7XG4gICAgaWYgKHByZXYudHlwZSA9PT0gJ2dsb2JzdGFyJykge1xuICAgICAgY29uc3QgaXNCcmFjZSA9IHN0YXRlLmJyYWNlcyA+IDAgJiYgKHRvay50eXBlID09PSAnY29tbWEnIHx8IHRvay50eXBlID09PSAnYnJhY2UnKTtcbiAgICAgIGNvbnN0IGlzRXh0Z2xvYiA9IHRvay5leHRnbG9iID09PSB0cnVlIHx8IChleHRnbG9icy5sZW5ndGggJiYgKHRvay50eXBlID09PSAncGlwZScgfHwgdG9rLnR5cGUgPT09ICdwYXJlbicpKTtcblxuICAgICAgaWYgKHRvay50eXBlICE9PSAnc2xhc2gnICYmIHRvay50eXBlICE9PSAncGFyZW4nICYmICFpc0JyYWNlICYmICFpc0V4dGdsb2IpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2Lm91dHB1dC5sZW5ndGgpO1xuICAgICAgICBwcmV2LnR5cGUgPSAnc3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgPSAnKic7XG4gICAgICAgIHByZXYub3V0cHV0ID0gc3RhcjtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYub3V0cHV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRnbG9icy5sZW5ndGggJiYgdG9rLnR5cGUgIT09ICdwYXJlbicpIHtcbiAgICAgIGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdLmlubmVyICs9IHRvay52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rLnZhbHVlIHx8IHRvay5vdXRwdXQpIGFwcGVuZCh0b2spO1xuICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ3RleHQnICYmIHRvay50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHByZXYudmFsdWUgKz0gdG9rLnZhbHVlO1xuICAgICAgcHJldi5vdXRwdXQgPSAocHJldi5vdXRwdXQgfHwgJycpICsgdG9rLnZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRvay5wcmV2ID0gcHJldjtcbiAgICB0b2tlbnMucHVzaCh0b2spO1xuICAgIHByZXYgPSB0b2s7XG4gIH07XG5cbiAgY29uc3QgZXh0Z2xvYk9wZW4gPSAodHlwZSwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IHsgLi4uRVhUR0xPQl9DSEFSU1t2YWx1ZV0sIGNvbmRpdGlvbnM6IDEsIGlubmVyOiAnJyB9O1xuXG4gICAgdG9rZW4ucHJldiA9IHByZXY7XG4gICAgdG9rZW4ucGFyZW5zID0gc3RhdGUucGFyZW5zO1xuICAgIHRva2VuLm91dHB1dCA9IHN0YXRlLm91dHB1dDtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5jYXB0dXJlID8gJygnIDogJycpICsgdG9rZW4ub3BlbjtcblxuICAgIGluY3JlbWVudCgncGFyZW5zJyk7XG4gICAgcHVzaCh7IHR5cGUsIHZhbHVlLCBvdXRwdXQ6IHN0YXRlLm91dHB1dCA/ICcnIDogT05FX0NIQVIgfSk7XG4gICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIGV4dGdsb2I6IHRydWUsIHZhbHVlOiBhZHZhbmNlKCksIG91dHB1dCB9KTtcbiAgICBleHRnbG9icy5wdXNoKHRva2VuKTtcbiAgfTtcblxuICBjb25zdCBleHRnbG9iQ2xvc2UgPSB0b2tlbiA9PiB7XG4gICAgbGV0IG91dHB1dCA9IHRva2VuLmNsb3NlICsgKG9wdHMuY2FwdHVyZSA/ICcpJyA6ICcnKTtcbiAgICBsZXQgcmVzdDtcblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbmVnYXRlJykge1xuICAgICAgbGV0IGV4dGdsb2JTdGFyID0gc3RhcjtcblxuICAgICAgaWYgKHRva2VuLmlubmVyICYmIHRva2VuLmlubmVyLmxlbmd0aCA+IDEgJiYgdG9rZW4uaW5uZXIuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICBleHRnbG9iU3RhciA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXh0Z2xvYlN0YXIgIT09IHN0YXIgfHwgZW9zKCkgfHwgL15cXCkrJC8udGVzdChyZW1haW5pbmcoKSkpIHtcbiAgICAgICAgb3V0cHV0ID0gdG9rZW4uY2xvc2UgPSBgKSQpKSR7ZXh0Z2xvYlN0YXJ9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2VuLmlubmVyLmluY2x1ZGVzKCcqJykgJiYgKHJlc3QgPSByZW1haW5pbmcoKSkgJiYgL15cXC5bXlxcXFwvLl0rJC8udGVzdChyZXN0KSkge1xuICAgICAgICAvLyBBbnkgbm9uLW1hZ2ljYWwgc3RyaW5nIChgLnRzYCkgb3IgZXZlbiBuZXN0ZWQgZXhwcmVzc2lvbiAoYC57dHMsdHN4fWApIGNhbiBmb2xsb3cgYWZ0ZXIgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBwYXJzZSB0aGUgc3RyaW5nIGFuZCB1c2UgaXQgaW4gdGhlIG91dHB1dCBvZiB0aGUgb3JpZ2luYWwgcGF0dGVybi5cbiAgICAgICAgLy8gU3VpdGFibGUgcGF0dGVybnM6IGAvISgqLmQpLnRzYCwgYC8hKCouZCkue3RzLHRzeH1gLCBgKiovISgqLWRiZykuQChqcylgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEaXNhYmxpbmcgdGhlIGBmYXN0cGF0aHNgIG9wdGlvbiBkdWUgdG8gYSBwcm9ibGVtIHdpdGggcGFyc2luZyBzdHJpbmdzIGFzIGAudHNgIGluIHRoZSBwYXR0ZXJuIGxpa2UgYCoqLyEoKi5kKS50c2AuXG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBwYXJzZShyZXN0LCB7IC4uLm9wdGlvbnMsIGZhc3RwYXRoczogZmFsc2UgfSkub3V0cHV0O1xuXG4gICAgICAgIG91dHB1dCA9IHRva2VuLmNsb3NlID0gYCkke2V4cHJlc3Npb259KSR7ZXh0Z2xvYlN0YXJ9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5wcmV2LnR5cGUgPT09ICdib3MnKSB7XG4gICAgICAgIHN0YXRlLm5lZ2F0ZWRFeHRnbG9iID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgZXh0Z2xvYjogdHJ1ZSwgdmFsdWUsIG91dHB1dCB9KTtcbiAgICBkZWNyZW1lbnQoJ3BhcmVucycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGYXN0IHBhdGhzXG4gICAqL1xuXG4gIGlmIChvcHRzLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgIS8oXlsqIV18Wy8oKVtcXF17fVwiXSkvLnRlc3QoaW5wdXQpKSB7XG4gICAgbGV0IGJhY2tzbGFzaGVzID0gZmFsc2U7XG5cbiAgICBsZXQgb3V0cHV0ID0gaW5wdXQucmVwbGFjZShSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUYsIChtLCBlc2MsIGNoYXJzLCBmaXJzdCwgcmVzdCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChmaXJzdCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdCA9PT0gJz8nKSB7XG4gICAgICAgIGlmIChlc2MpIHtcbiAgICAgICAgICByZXR1cm4gZXNjICsgZmlyc3QgKyAocmVzdCA/IFFNQVJLLnJlcGVhdChyZXN0Lmxlbmd0aCkgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHFtYXJrTm9Eb3QgKyAocmVzdCA/IFFNQVJLLnJlcGVhdChyZXN0Lmxlbmd0aCkgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFFNQVJLLnJlcGVhdChjaGFycy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICcuJykge1xuICAgICAgICByZXR1cm4gRE9UX0xJVEVSQUwucmVwZWF0KGNoYXJzLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdCA9PT0gJyonKSB7XG4gICAgICAgIGlmIChlc2MpIHtcbiAgICAgICAgICByZXR1cm4gZXNjICsgZmlyc3QgKyAocmVzdCA/IHN0YXIgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXNjID8gbSA6IGBcXFxcJHttfWA7XG4gICAgfSk7XG5cbiAgICBpZiAoYmFja3NsYXNoZXMgPT09IHRydWUpIHtcbiAgICAgIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC9cXFxcKy9nLCBtID0+IHtcbiAgICAgICAgICByZXR1cm4gbS5sZW5ndGggJSAyID09PSAwID8gJ1xcXFxcXFxcJyA6IChtID8gJ1xcXFwnIDogJycpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3V0cHV0ID09PSBpbnB1dCAmJiBvcHRzLmNvbnRhaW5zID09PSB0cnVlKSB7XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBpbnB1dDtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy53cmFwT3V0cHV0KG91dHB1dCwgc3RhdGUsIG9wdGlvbnMpO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2tlbml6ZSBpbnB1dCB1bnRpbCB3ZSByZWFjaCBlbmQtb2Ytc3RyaW5nXG4gICAqL1xuXG4gIHdoaWxlICghZW9zKCkpIHtcbiAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVkIGNoYXJhY3RlcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1xcXFwnKSB7XG4gICAgICBjb25zdCBuZXh0ID0gcGVlaygpO1xuXG4gICAgICBpZiAobmV4dCA9PT0gJy8nICYmIG9wdHMuYmFzaCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHQgPT09ICcuJyB8fCBuZXh0ID09PSAnOycpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghbmV4dCkge1xuICAgICAgICB2YWx1ZSArPSAnXFxcXCc7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29sbGFwc2Ugc2xhc2hlcyB0byByZWR1Y2UgcG90ZW50aWFsIGZvciBleHBsb2l0c1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxcXFwrLy5leGVjKHJlbWFpbmluZygpKTtcbiAgICAgIGxldCBzbGFzaGVzID0gMDtcblxuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgc2xhc2hlcyA9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuaW5kZXggKz0gc2xhc2hlcztcbiAgICAgICAgaWYgKHNsYXNoZXMgJSAyICE9PSAwKSB7XG4gICAgICAgICAgdmFsdWUgKz0gJ1xcXFwnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgICAgIHZhbHVlID0gYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgKz0gYWR2YW5jZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIGluc2lkZSBhIHJlZ2V4IGNoYXJhY3RlciBjbGFzcywgY29udGludWVcbiAgICAgKiB1bnRpbCB3ZSByZWFjaCB0aGUgY2xvc2luZyBicmFja2V0LlxuICAgICAqL1xuXG4gICAgaWYgKHN0YXRlLmJyYWNrZXRzID4gMCAmJiAodmFsdWUgIT09ICddJyB8fCBwcmV2LnZhbHVlID09PSAnWycgfHwgcHJldi52YWx1ZSA9PT0gJ1teJykpIHtcbiAgICAgIGlmIChvcHRzLnBvc2l4ICE9PSBmYWxzZSAmJiB2YWx1ZSA9PT0gJzonKSB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gcHJldi52YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGlubmVyLmluY2x1ZGVzKCdbJykpIHtcbiAgICAgICAgICBwcmV2LnBvc2l4ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChpbm5lci5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBwcmV2LnZhbHVlLmxhc3RJbmRleE9mKCdbJyk7XG4gICAgICAgICAgICBjb25zdCBwcmUgPSBwcmV2LnZhbHVlLnNsaWNlKDAsIGlkeCk7XG4gICAgICAgICAgICBjb25zdCByZXN0ID0gcHJldi52YWx1ZS5zbGljZShpZHggKyAyKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l4ID0gUE9TSVhfUkVHRVhfU09VUkNFW3Jlc3RdO1xuICAgICAgICAgICAgaWYgKHBvc2l4KSB7XG4gICAgICAgICAgICAgIHByZXYudmFsdWUgPSBwcmUgKyBwb3NpeDtcbiAgICAgICAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYWR2YW5jZSgpO1xuXG4gICAgICAgICAgICAgIGlmICghYm9zLm91dHB1dCAmJiB0b2tlbnMuaW5kZXhPZihwcmV2KSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGJvcy5vdXRwdXQgPSBPTkVfQ0hBUjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCh2YWx1ZSA9PT0gJ1snICYmIHBlZWsoKSAhPT0gJzonKSB8fCAodmFsdWUgPT09ICctJyAmJiBwZWVrKCkgPT09ICddJykpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSAnXScgJiYgKHByZXYudmFsdWUgPT09ICdbJyB8fCBwcmV2LnZhbHVlID09PSAnW14nKSkge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5wb3NpeCA9PT0gdHJ1ZSAmJiB2YWx1ZSA9PT0gJyEnICYmIHByZXYudmFsdWUgPT09ICdbJykge1xuICAgICAgICB2YWx1ZSA9ICdeJztcbiAgICAgIH1cblxuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgd2UncmUgaW5zaWRlIGEgcXVvdGVkIHN0cmluZywgY29udGludWVcbiAgICAgKiB1bnRpbCB3ZSByZWFjaCB0aGUgY2xvc2luZyBkb3VibGUgcXVvdGUuXG4gICAgICovXG5cbiAgICBpZiAoc3RhdGUucXVvdGVzID09PSAxICYmIHZhbHVlICE9PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHV0aWxzLmVzY2FwZVJlZ2V4KHZhbHVlKTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvdWJsZSBxdW90ZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1wiJykge1xuICAgICAgc3RhdGUucXVvdGVzID0gc3RhdGUucXVvdGVzID09PSAxID8gMCA6IDE7XG4gICAgICBpZiAob3B0cy5rZWVwUXVvdGVzID09PSB0cnVlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyZW50aGVzZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJygnKSB7XG4gICAgICBpbmNyZW1lbnQoJ3BhcmVucycpO1xuICAgICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnKScpIHtcbiAgICAgIGlmIChzdGF0ZS5wYXJlbnMgPT09IDAgJiYgb3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ29wZW5pbmcnLCAnKCcpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0Z2xvYiA9IGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGV4dGdsb2IgJiYgc3RhdGUucGFyZW5zID09PSBleHRnbG9iLnBhcmVucyArIDEpIHtcbiAgICAgICAgZXh0Z2xvYkNsb3NlKGV4dGdsb2JzLnBvcCgpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCB2YWx1ZSwgb3V0cHV0OiBzdGF0ZS5wYXJlbnMgPyAnKScgOiAnXFxcXCknIH0pO1xuICAgICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNxdWFyZSBicmFja2V0c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnWycpIHtcbiAgICAgIGlmIChvcHRzLm5vYnJhY2tldCA9PT0gdHJ1ZSB8fCAhcmVtYWluaW5nKCkuaW5jbHVkZXMoJ10nKSkge1xuICAgICAgICBpZiAob3B0cy5ub2JyYWNrZXQgIT09IHRydWUgJiYgb3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICddJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluY3JlbWVudCgnYnJhY2tldHMnKTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdicmFja2V0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICddJykge1xuICAgICAgaWYgKG9wdHMubm9icmFja2V0ID09PSB0cnVlIHx8IChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnICYmIHByZXYudmFsdWUubGVuZ3RoID09PSAxKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBgXFxcXCR7dmFsdWV9YCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5icmFja2V0cyA9PT0gMCkge1xuICAgICAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignb3BlbmluZycsICdbJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogYFxcXFwke3ZhbHVlfWAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkZWNyZW1lbnQoJ2JyYWNrZXRzJyk7XG5cbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IHByZXYudmFsdWUuc2xpY2UoMSk7XG4gICAgICBpZiAocHJldi5wb3NpeCAhPT0gdHJ1ZSAmJiBwcmV2VmFsdWVbMF0gPT09ICdeJyAmJiAhcHJldlZhbHVlLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgdmFsdWUgPSBgLyR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuXG4gICAgICAvLyB3aGVuIGxpdGVyYWwgYnJhY2tldHMgYXJlIGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICAgIC8vIGFzc3VtZSB3ZSBzaG91bGQgbWF0Y2ggd2l0aCBhIHJlZ2V4IGNoYXJhY3RlciBjbGFzc1xuICAgICAgaWYgKG9wdHMubGl0ZXJhbEJyYWNrZXRzID09PSBmYWxzZSB8fCB1dGlscy5oYXNSZWdleENoYXJzKHByZXZWYWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVzY2FwZWQgPSB1dGlscy5lc2NhcGVSZWdleChwcmV2LnZhbHVlKTtcbiAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAvLyB3aGVuIGxpdGVyYWwgYnJhY2tldHMgYXJlIGV4cGxpY2l0bHkgZW5hYmxlZFxuICAgICAgLy8gYXNzdW1lIHdlIHNob3VsZCBlc2NhcGUgdGhlIGJyYWNrZXRzIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc1xuICAgICAgaWYgKG9wdHMubGl0ZXJhbEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBlc2NhcGVkO1xuICAgICAgICBwcmV2LnZhbHVlID0gZXNjYXBlZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHdoZW4gdGhlIHVzZXIgc3BlY2lmaWVzIG5vdGhpbmcsIHRyeSB0byBtYXRjaCBib3RoXG4gICAgICBwcmV2LnZhbHVlID0gYCgke2NhcHR1cmV9JHtlc2NhcGVkfXwke3ByZXYudmFsdWV9KWA7XG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi52YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJyYWNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAneycgJiYgb3B0cy5ub2JyYWNlICE9PSB0cnVlKSB7XG4gICAgICBpbmNyZW1lbnQoJ2JyYWNlcycpO1xuXG4gICAgICBjb25zdCBvcGVuID0ge1xuICAgICAgICB0eXBlOiAnYnJhY2UnLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3V0cHV0OiAnKCcsXG4gICAgICAgIG91dHB1dEluZGV4OiBzdGF0ZS5vdXRwdXQubGVuZ3RoLFxuICAgICAgICB0b2tlbnNJbmRleDogc3RhdGUudG9rZW5zLmxlbmd0aFxuICAgICAgfTtcblxuICAgICAgYnJhY2VzLnB1c2gob3Blbik7XG4gICAgICBwdXNoKG9wZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnfScpIHtcbiAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKG9wdHMubm9icmFjZSA9PT0gdHJ1ZSB8fCAhYnJhY2UpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgb3V0cHV0ID0gJyknO1xuXG4gICAgICBpZiAoYnJhY2UuZG90cyA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBhcnIgPSB0b2tlbnMuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdG9rZW5zLnBvcCgpO1xuICAgICAgICAgIGlmIChhcnJbaV0udHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhcnJbaV0udHlwZSAhPT0gJ2RvdHMnKSB7XG4gICAgICAgICAgICByYW5nZS51bnNoaWZ0KGFycltpXS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ID0gZXhwYW5kUmFuZ2UocmFuZ2UsIG9wdHMpO1xuICAgICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhY2UuY29tbWEgIT09IHRydWUgJiYgYnJhY2UuZG90cyAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBvdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgYnJhY2Uub3V0cHV0SW5kZXgpO1xuICAgICAgICBjb25zdCB0b2tzID0gc3RhdGUudG9rZW5zLnNsaWNlKGJyYWNlLnRva2Vuc0luZGV4KTtcbiAgICAgICAgYnJhY2UudmFsdWUgPSBicmFjZS5vdXRwdXQgPSAnXFxcXHsnO1xuICAgICAgICB2YWx1ZSA9IG91dHB1dCA9ICdcXFxcfSc7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IG91dDtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRva3MpIHtcbiAgICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gKHQub3V0cHV0IHx8IHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnYnJhY2UnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgZGVjcmVtZW50KCdicmFjZXMnKTtcbiAgICAgIGJyYWNlcy5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpcGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICd8Jykge1xuICAgICAgaWYgKGV4dGdsb2JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV0uY29uZGl0aW9ucysrO1xuICAgICAgfVxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21tYXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJywnKSB7XG4gICAgICBsZXQgb3V0cHV0ID0gdmFsdWU7XG5cbiAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChicmFjZSAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ2JyYWNlcycpIHtcbiAgICAgICAgYnJhY2UuY29tbWEgPSB0cnVlO1xuICAgICAgICBvdXRwdXQgPSAnfCc7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnY29tbWEnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2xhc2hlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLycpIHtcbiAgICAgIC8vIGlmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdsb2IgaXMgXCIuL1wiLCBhZHZhbmNlIHRoZSBzdGFydFxuICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgaW5kZXgsIGFuZCBkb24ndCBhZGQgdGhlIFwiLi9cIiBjaGFyYWN0ZXJzXG4gICAgICAvLyB0byB0aGUgc3RhdGUuIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIGxvb2tiZWhpbmRzIHdoZW5cbiAgICAgIC8vIGNoZWNraW5nIGZvciBCT1MgY2hhcmFjdGVycyBsaWtlIFwiIVwiIGFuZCBcIi5cIiAobm90IFwiLi9cIilcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnICYmIHN0YXRlLmluZGV4ID09PSBzdGF0ZS5zdGFydCArIDEpIHtcbiAgICAgICAgc3RhdGUuc3RhcnQgPSBzdGF0ZS5pbmRleCArIDE7XG4gICAgICAgIHN0YXRlLmNvbnN1bWVkID0gJyc7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9ICcnO1xuICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICAgIHByZXYgPSBib3M7IC8vIHJlc2V0IFwicHJldlwiIHRvIHRoZSBmaXJzdCB0b2tlblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlLCBvdXRwdXQ6IFNMQVNIX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3RzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcuJykge1xuICAgICAgaWYgKHN0YXRlLmJyYWNlcyA+IDAgJiYgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBpZiAocHJldi52YWx1ZSA9PT0gJy4nKSBwcmV2Lm91dHB1dCA9IERPVF9MSVRFUkFMO1xuICAgICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHByZXYudHlwZSA9ICdkb3RzJztcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gdmFsdWU7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIGJyYWNlLmRvdHMgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChzdGF0ZS5icmFjZXMgKyBzdGF0ZS5wYXJlbnMpID09PSAwICYmIHByZXYudHlwZSAhPT0gJ2JvcycgJiYgcHJldi50eXBlICE9PSAnc2xhc2gnKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IERPVF9MSVRFUkFMIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdkb3QnLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXN0aW9uIG1hcmtzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICc/Jykge1xuICAgICAgY29uc3QgaXNHcm91cCA9IHByZXYgJiYgcHJldi52YWx1ZSA9PT0gJygnO1xuICAgICAgaWYgKCFpc0dyb3VwICYmIG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBleHRnbG9iT3BlbigncW1hcmsnLCB2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdwYXJlbicpIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTtcbiAgICAgICAgbGV0IG91dHB1dCA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChuZXh0ID09PSAnPCcgJiYgIXV0aWxzLnN1cHBvcnRzTG9va2JlaGluZHMoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm9kZS5qcyB2MTAgb3IgaGlnaGVyIGlzIHJlcXVpcmVkIGZvciByZWdleCBsb29rYmVoaW5kcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChwcmV2LnZhbHVlID09PSAnKCcgJiYgIS9bIT08Ol0vLnRlc3QobmV4dCkpIHx8IChuZXh0ID09PSAnPCcgJiYgIS88KFshPV18XFx3Kz4pLy50ZXN0KHJlbWFpbmluZygpKSkpIHtcbiAgICAgICAgICBvdXRwdXQgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5kb3QgIT09IHRydWUgJiYgKHByZXYudHlwZSA9PT0gJ3NsYXNoJyB8fCBwcmV2LnR5cGUgPT09ICdib3MnKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3FtYXJrJywgdmFsdWUsIG91dHB1dDogUU1BUktfTk9fRE9UIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdxbWFyaycsIHZhbHVlLCBvdXRwdXQ6IFFNQVJLIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjbGFtYXRpb25cbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJyEnKSB7XG4gICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcpIHtcbiAgICAgICAgaWYgKHBlZWsoMikgIT09ICc/JyB8fCAhL1shPTw6XS8udGVzdChwZWVrKDMpKSkge1xuICAgICAgICAgIGV4dGdsb2JPcGVuKCduZWdhdGUnLCB2YWx1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMubm9uZWdhdGUgIT09IHRydWUgJiYgc3RhdGUuaW5kZXggPT09IDApIHtcbiAgICAgICAgbmVnYXRlKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsdXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJysnKSB7XG4gICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcgJiYgcGVlaygyKSAhPT0gJz8nKSB7XG4gICAgICAgIGV4dGdsb2JPcGVuKCdwbHVzJywgdmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcmV2ICYmIHByZXYudmFsdWUgPT09ICcoJykgfHwgb3B0cy5yZWdleCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWUsIG91dHB1dDogUExVU19MSVRFUkFMIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdicmFja2V0JyB8fCBwcmV2LnR5cGUgPT09ICdwYXJlbicgfHwgcHJldi50eXBlID09PSAnYnJhY2UnKSkgfHwgc3RhdGUucGFyZW5zID4gMCkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlOiBQTFVTX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0XG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdAJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ2F0JywgZXh0Z2xvYjogdHJ1ZSwgdmFsdWUsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHRcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSAhPT0gJyonKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICckJyB8fCB2YWx1ZSA9PT0gJ14nKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gUkVHRVhfTk9OX1NQRUNJQUxfQ0hBUlMuZXhlYyhyZW1haW5pbmcoKSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgdmFsdWUgKz0gbWF0Y2hbMF07XG4gICAgICAgIHN0YXRlLmluZGV4ICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFyc1xuICAgICAqL1xuXG4gICAgaWYgKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2dsb2JzdGFyJyB8fCBwcmV2LnN0YXIgPT09IHRydWUpKSB7XG4gICAgICBwcmV2LnR5cGUgPSAnc3Rhcic7XG4gICAgICBwcmV2LnN0YXIgPSB0cnVlO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIHByZXYub3V0cHV0ID0gc3RhcjtcbiAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCByZXN0ID0gcmVtYWluaW5nKCk7XG4gICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIC9eXFwoW14/XS8udGVzdChyZXN0KSkge1xuICAgICAgZXh0Z2xvYk9wZW4oJ3N0YXInLCB2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJldi50eXBlID09PSAnc3RhcicpIHtcbiAgICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmlvciA9IHByZXYucHJldjtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHByaW9yLnByZXY7XG4gICAgICBjb25zdCBpc1N0YXJ0ID0gcHJpb3IudHlwZSA9PT0gJ3NsYXNoJyB8fCBwcmlvci50eXBlID09PSAnYm9zJztcbiAgICAgIGNvbnN0IGFmdGVyU3RhciA9IGJlZm9yZSAmJiAoYmVmb3JlLnR5cGUgPT09ICdzdGFyJyB8fCBiZWZvcmUudHlwZSA9PT0gJ2dsb2JzdGFyJyk7XG5cbiAgICAgIGlmIChvcHRzLmJhc2ggPT09IHRydWUgJiYgKCFpc1N0YXJ0IHx8IChyZXN0WzBdICYmIHJlc3RbMF0gIT09ICcvJykpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNCcmFjZSA9IHN0YXRlLmJyYWNlcyA+IDAgJiYgKHByaW9yLnR5cGUgPT09ICdjb21tYScgfHwgcHJpb3IudHlwZSA9PT0gJ2JyYWNlJyk7XG4gICAgICBjb25zdCBpc0V4dGdsb2IgPSBleHRnbG9icy5sZW5ndGggJiYgKHByaW9yLnR5cGUgPT09ICdwaXBlJyB8fCBwcmlvci50eXBlID09PSAncGFyZW4nKTtcbiAgICAgIGlmICghaXNTdGFydCAmJiBwcmlvci50eXBlICE9PSAncGFyZW4nICYmICFpc0JyYWNlICYmICFpc0V4dGdsb2IpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBzdHJpcCBjb25zZWN1dGl2ZSBgLyoqL2BcbiAgICAgIHdoaWxlIChyZXN0LnNsaWNlKDAsIDMpID09PSAnLyoqJykge1xuICAgICAgICBjb25zdCBhZnRlciA9IGlucHV0W3N0YXRlLmluZGV4ICsgNF07XG4gICAgICAgIGlmIChhZnRlciAmJiBhZnRlciAhPT0gJy8nKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoMyk7XG4gICAgICAgIGNvbnN1bWUoJy8qKicsIDMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ2JvcycgJiYgZW9zKCkpIHtcbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gcHJldi5vdXRwdXQ7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ3NsYXNoJyAmJiBwcmlvci5wcmV2LnR5cGUgIT09ICdib3MnICYmICFhZnRlclN0YXIgJiYgZW9zKCkpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC0ocHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQpLmxlbmd0aCk7XG4gICAgICAgIHByaW9yLm91dHB1dCA9IGAoPzoke3ByaW9yLm91dHB1dH1gO1xuXG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cykgKyAob3B0cy5zdHJpY3RTbGFzaGVzID8gJyknIDogJ3wkKScpO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ3NsYXNoJyAmJiBwcmlvci5wcmV2LnR5cGUgIT09ICdib3MnICYmIHJlc3RbMF0gPT09ICcvJykge1xuICAgICAgICBjb25zdCBlbmQgPSByZXN0WzFdICE9PSB2b2lkIDAgPyAnfCQnIDogJyc7XG5cbiAgICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC0ocHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQpLmxlbmd0aCk7XG4gICAgICAgIHByaW9yLm91dHB1dCA9IGAoPzoke3ByaW9yLm91dHB1dH1gO1xuXG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYub3V0cHV0ID0gYCR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfXwke1NMQVNIX0xJVEVSQUx9JHtlbmR9KWA7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG5cbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG5cbiAgICAgICAgY29uc3VtZSh2YWx1ZSArIGFkdmFuY2UoKSk7XG5cbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlOiAnLycsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3IudHlwZSA9PT0gJ2JvcycgJiYgcmVzdFswXSA9PT0gJy8nKSB7XG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYub3V0cHV0ID0gYCg/Ol58JHtTTEFTSF9MSVRFUkFMfXwke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pYDtcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gcHJldi5vdXRwdXQ7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3VtZSh2YWx1ZSArIGFkdmFuY2UoKSk7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZTogJy8nLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVtb3ZlIHNpbmdsZSBzdGFyIGZyb20gb3V0cHV0XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYub3V0cHV0Lmxlbmd0aCk7XG5cbiAgICAgIC8vIHJlc2V0IHByZXZpb3VzIHRva2VuIHRvIGdsb2JzdGFyXG4gICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG5cbiAgICAgIC8vIHJlc2V0IG91dHB1dCB3aXRoIGdsb2JzdGFyXG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi5vdXRwdXQ7XG4gICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0geyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6IHN0YXIgfTtcblxuICAgIGlmIChvcHRzLmJhc2ggPT09IHRydWUpIHtcbiAgICAgIHRva2VuLm91dHB1dCA9ICcuKj8nO1xuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2JvcycgfHwgcHJldi50eXBlID09PSAnc2xhc2gnKSB7XG4gICAgICAgIHRva2VuLm91dHB1dCA9IG5vZG90ICsgdG9rZW4ub3V0cHV0O1xuICAgICAgfVxuICAgICAgcHVzaCh0b2tlbik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJldiAmJiAocHJldi50eXBlID09PSAnYnJhY2tldCcgfHwgcHJldi50eXBlID09PSAncGFyZW4nKSAmJiBvcHRzLnJlZ2V4ID09PSB0cnVlKSB7XG4gICAgICB0b2tlbi5vdXRwdXQgPSB2YWx1ZTtcbiAgICAgIHB1c2godG9rZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmluZGV4ID09PSBzdGF0ZS5zdGFydCB8fCBwcmV2LnR5cGUgPT09ICdzbGFzaCcgfHwgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IE5PX0RPVF9TTEFTSDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gTk9fRE9UX1NMQVNIO1xuXG4gICAgICB9IGVsc2UgaWYgKG9wdHMuZG90ID09PSB0cnVlKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBOT19ET1RTX1NMQVNIO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBOT19ET1RTX1NMQVNIO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gbm9kb3Q7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IG5vZG90O1xuICAgICAgfVxuXG4gICAgICBpZiAocGVlaygpICE9PSAnKicpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IE9ORV9DSEFSO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBPTkVfQ0hBUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKHRva2VuKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5icmFja2V0cyA+IDApIHtcbiAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJ10nKSk7XG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICdbJyk7XG4gICAgZGVjcmVtZW50KCdicmFja2V0cycpO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBhcmVucyA+IDApIHtcbiAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJyknKSk7XG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICcoJyk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5icmFjZXMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICd9JykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAneycpO1xuICAgIGRlY3JlbWVudCgnYnJhY2VzJyk7XG4gIH1cblxuICBpZiAob3B0cy5zdHJpY3RTbGFzaGVzICE9PSB0cnVlICYmIChwcmV2LnR5cGUgPT09ICdzdGFyJyB8fCBwcmV2LnR5cGUgPT09ICdicmFja2V0JykpIHtcbiAgICBwdXNoKHsgdHlwZTogJ21heWJlX3NsYXNoJywgdmFsdWU6ICcnLCBvdXRwdXQ6IGAke1NMQVNIX0xJVEVSQUx9P2AgfSk7XG4gIH1cblxuICAvLyByZWJ1aWxkIHRoZSBvdXRwdXQgaWYgd2UgaGFkIHRvIGJhY2t0cmFjayBhdCBhbnkgcG9pbnRcbiAgaWYgKHN0YXRlLmJhY2t0cmFjayA9PT0gdHJ1ZSkge1xuICAgIHN0YXRlLm91dHB1dCA9ICcnO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBzdGF0ZS50b2tlbnMpIHtcbiAgICAgIHN0YXRlLm91dHB1dCArPSB0b2tlbi5vdXRwdXQgIT0gbnVsbCA/IHRva2VuLm91dHB1dCA6IHRva2VuLnZhbHVlO1xuXG4gICAgICBpZiAodG9rZW4uc3VmZml4KSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSB0b2tlbi5zdWZmaXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxuLyoqXG4gKiBGYXN0IHBhdGhzIGZvciBjcmVhdGluZyByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBjb21tb24gZ2xvYiBwYXR0ZXJucy5cbiAqIFRoaXMgY2FuIHNpZ25pZmljYW50bHkgc3BlZWQgdXAgcHJvY2Vzc2luZyBhbmQgaGFzIHZlcnkgbGl0dGxlIGRvd25zaWRlXG4gKiBpbXBhY3Qgd2hlbiBub25lIG9mIHRoZSBmYXN0IHBhdGhzIG1hdGNoLlxuICovXG5cbnBhcnNlLmZhc3RwYXRocyA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuICBjb25zdCBsZW4gPSBpbnB1dC5sZW5ndGg7XG4gIGlmIChsZW4gPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aDogJHtsZW59LCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBsZW5ndGg6ICR7bWF4fWApO1xuICB9XG5cbiAgaW5wdXQgPSBSRVBMQUNFTUVOVFNbaW5wdXRdIHx8IGlucHV0O1xuICBjb25zdCB3aW4zMiA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcblxuICAvLyBjcmVhdGUgY29uc3RhbnRzIGJhc2VkIG9uIHBsYXRmb3JtLCBmb3Igd2luZG93cyBvciBwb3NpeFxuICBjb25zdCB7XG4gICAgRE9UX0xJVEVSQUwsXG4gICAgU0xBU0hfTElURVJBTCxcbiAgICBPTkVfQ0hBUixcbiAgICBET1RTX1NMQVNILFxuICAgIE5PX0RPVCxcbiAgICBOT19ET1RTLFxuICAgIE5PX0RPVFNfU0xBU0gsXG4gICAgU1RBUixcbiAgICBTVEFSVF9BTkNIT1JcbiAgfSA9IGNvbnN0YW50cy5nbG9iQ2hhcnMod2luMzIpO1xuXG4gIGNvbnN0IG5vZG90ID0gb3B0cy5kb3QgPyBOT19ET1RTIDogTk9fRE9UO1xuICBjb25zdCBzbGFzaERvdCA9IG9wdHMuZG90ID8gTk9fRE9UU19TTEFTSCA6IE5PX0RPVDtcbiAgY29uc3QgY2FwdHVyZSA9IG9wdHMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgY29uc3Qgc3RhdGUgPSB7IG5lZ2F0ZWQ6IGZhbHNlLCBwcmVmaXg6ICcnIH07XG4gIGxldCBzdGFyID0gb3B0cy5iYXNoID09PSB0cnVlID8gJy4qPycgOiBTVEFSO1xuXG4gIGlmIChvcHRzLmNhcHR1cmUpIHtcbiAgICBzdGFyID0gYCgke3N0YXJ9KWA7XG4gIH1cblxuICBjb25zdCBnbG9ic3RhciA9IG9wdHMgPT4ge1xuICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIgPT09IHRydWUpIHJldHVybiBzdGFyO1xuICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMuZG90ID8gRE9UU19TTEFTSCA6IERPVF9MSVRFUkFMfSkuKSo/KWA7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlID0gc3RyID0+IHtcbiAgICBzd2l0Y2ggKHN0cikge1xuICAgICAgY2FzZSAnKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcuKic6XG4gICAgICAgIHJldHVybiBgJHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqLionOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtzdGFyfSR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKi8qJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7c3Rhcn0ke1NMQVNIX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3NsYXNoRG90fSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKic6XG4gICAgICAgIHJldHVybiBub2RvdCArIGdsb2JzdGFyKG9wdHMpO1xuXG4gICAgICBjYXNlICcqKi8qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKi8qLionOlxuICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke3NsYXNoRG90fSR7c3Rhcn0ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyoqLy4qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL14oLio/KVxcLihcXHcrKSQvLmV4ZWMoc3RyKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGNyZWF0ZShtYXRjaFsxXSk7XG4gICAgICAgIGlmICghc291cmNlKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZSArIERPVF9MSVRFUkFMICsgbWF0Y2hbMl07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG91dHB1dCA9IHV0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgc3RhdGUpO1xuICBsZXQgc291cmNlID0gY3JlYXRlKG91dHB1dCk7XG5cbiAgaWYgKHNvdXJjZSAmJiBvcHRzLnN0cmljdFNsYXNoZXMgIT09IHRydWUpIHtcbiAgICBzb3VyY2UgKz0gYCR7U0xBU0hfTElURVJBTH0/YDtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHNjYW4gPSByZXF1aXJlKCcuL3NjYW4nKTtcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdGNoZXIgZnVuY3Rpb24gZnJvbSBvbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLiBUaGVcbiAqIHJldHVybmVkIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHRvIG1hdGNoIGFzIGl0cyBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG1hdGNoLiBUaGUgcmV0dXJuZWQgbWF0Y2hlclxuICogZnVuY3Rpb24gYWxzbyB0YWtlcyBhIGJvb2xlYW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0aGF0LCB3aGVuIHRydWUsXG4gKiByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoKGdsb2JbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgaXNNYXRjaCA9IHBpY29tYXRjaCgnKi4hKCphKScpO1xuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5hJykpOyAvLz0+IGZhbHNlXG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmInKSk7IC8vPT4gdHJ1ZVxuICogYGBgXG4gKiBAbmFtZSBwaWNvbWF0Y2hcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgZ2xvYnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMuXG4gKiBAcGFyYW0ge09iamVjdD19IGBvcHRpb25zYFxuICogQHJldHVybiB7RnVuY3Rpb249fSBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgcGljb21hdGNoID0gKGdsb2IsIG9wdGlvbnMsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZ2xvYikpIHtcbiAgICBjb25zdCBmbnMgPSBnbG9iLm1hcChpbnB1dCA9PiBwaWNvbWF0Y2goaW5wdXQsIG9wdGlvbnMsIHJldHVyblN0YXRlKSk7XG4gICAgY29uc3QgYXJyYXlNYXRjaGVyID0gc3RyID0+IHtcbiAgICAgIGZvciAoY29uc3QgaXNNYXRjaCBvZiBmbnMpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc01hdGNoKHN0cik7XG4gICAgICAgIGlmIChzdGF0ZSkgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5TWF0Y2hlcjtcbiAgfVxuXG4gIGNvbnN0IGlzU3RhdGUgPSBpc09iamVjdChnbG9iKSAmJiBnbG9iLnRva2VucyAmJiBnbG9iLmlucHV0O1xuXG4gIGlmIChnbG9iID09PSAnJyB8fCAodHlwZW9mIGdsb2IgIT09ICdzdHJpbmcnICYmICFpc1N0YXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHBhdHRlcm4gdG8gYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgcG9zaXggPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG4gIGNvbnN0IHJlZ2V4ID0gaXNTdGF0ZVxuICAgID8gcGljb21hdGNoLmNvbXBpbGVSZShnbG9iLCBvcHRpb25zKVxuICAgIDogcGljb21hdGNoLm1ha2VSZShnbG9iLCBvcHRpb25zLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgY29uc3Qgc3RhdGUgPSByZWdleC5zdGF0ZTtcbiAgZGVsZXRlIHJlZ2V4LnN0YXRlO1xuXG4gIGxldCBpc0lnbm9yZWQgPSAoKSA9PiBmYWxzZTtcbiAgaWYgKG9wdHMuaWdub3JlKSB7XG4gICAgY29uc3QgaWdub3JlT3B0cyA9IHsgLi4ub3B0aW9ucywgaWdub3JlOiBudWxsLCBvbk1hdGNoOiBudWxsLCBvblJlc3VsdDogbnVsbCB9O1xuICAgIGlzSWdub3JlZCA9IHBpY29tYXRjaChvcHRzLmlnbm9yZSwgaWdub3JlT3B0cywgcmV0dXJuU3RhdGUpO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlciA9IChpbnB1dCwgcmV0dXJuT2JqZWN0ID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCB7IGlzTWF0Y2gsIG1hdGNoLCBvdXRwdXQgfSA9IHBpY29tYXRjaC50ZXN0KGlucHV0LCByZWdleCwgb3B0aW9ucywgeyBnbG9iLCBwb3NpeCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSB7IGdsb2IsIHN0YXRlLCByZWdleCwgcG9zaXgsIGlucHV0LCBvdXRwdXQsIG1hdGNoLCBpc01hdGNoIH07XG5cbiAgICBpZiAodHlwZW9mIG9wdHMub25SZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdHMub25SZXN1bHQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCA9PT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzSWdub3JlZChpbnB1dCkpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbklnbm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRzLm9uSWdub3JlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5vbk1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRzLm9uTWF0Y2gocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IHRydWU7XG4gIH07XG5cbiAgaWYgKHJldHVyblN0YXRlKSB7XG4gICAgbWF0Y2hlci5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXI7XG59O1xuXG4vKipcbiAqIFRlc3QgYGlucHV0YCB3aXRoIHRoZSBnaXZlbiBgcmVnZXhgLiBUaGlzIGlzIHVzZWQgYnkgdGhlIG1haW5cbiAqIGBwaWNvbWF0Y2goKWAgZnVuY3Rpb24gdG8gdGVzdCB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50ZXN0KGlucHV0LCByZWdleFssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudGVzdCgnZm9vL2JhcicsIC9eKD86KFteL10qPylcXC8oW14vXSo/KSkkLykpO1xuICogLy8geyBpc01hdGNoOiB0cnVlLCBtYXRjaDogWyAnZm9vLycsICdmb28nLCAnYmFyJyBdLCBvdXRwdXQ6ICdmb28vYmFyJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtSZWdFeHB9IGByZWdleGBcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtYXRjaGluZyBpbmZvLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gudGVzdCA9IChpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHsgZ2xvYiwgcG9zaXggfSA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgaW5wdXQgdG8gYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChpbnB1dCA9PT0gJycpIHtcbiAgICByZXR1cm4geyBpc01hdGNoOiBmYWxzZSwgb3V0cHV0OiAnJyB9O1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGZvcm1hdCA9IG9wdHMuZm9ybWF0IHx8IChwb3NpeCA/IHV0aWxzLnRvUG9zaXhTbGFzaGVzIDogbnVsbCk7XG4gIGxldCBtYXRjaCA9IGlucHV0ID09PSBnbG9iO1xuICBsZXQgb3V0cHV0ID0gKG1hdGNoICYmIGZvcm1hdCkgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7XG5cbiAgaWYgKG1hdGNoID09PSBmYWxzZSkge1xuICAgIG91dHB1dCA9IGZvcm1hdCA/IGZvcm1hdChpbnB1dCkgOiBpbnB1dDtcbiAgICBtYXRjaCA9IG91dHB1dCA9PT0gZ2xvYjtcbiAgfVxuXG4gIGlmIChtYXRjaCA9PT0gZmFsc2UgfHwgb3B0cy5jYXB0dXJlID09PSB0cnVlKSB7XG4gICAgaWYgKG9wdHMubWF0Y2hCYXNlID09PSB0cnVlIHx8IG9wdHMuYmFzZW5hbWUgPT09IHRydWUpIHtcbiAgICAgIG1hdGNoID0gcGljb21hdGNoLm1hdGNoQmFzZShpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHBvc2l4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0Y2ggPSByZWdleC5leGVjKG91dHB1dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgaXNNYXRjaDogQm9vbGVhbihtYXRjaCksIG1hdGNoLCBvdXRwdXQgfTtcbn07XG5cbi8qKlxuICogTWF0Y2ggdGhlIGJhc2VuYW1lIG9mIGEgZmlsZXBhdGguXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLm1hdGNoQmFzZShpbnB1dCwgZ2xvYlssIG9wdGlvbnNdKTtcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5tYXRjaEJhc2UoJ2Zvby9iYXIuanMnLCAnKi5qcycpOyAvLyB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtSZWdFeHB8U3RyaW5nfSBgZ2xvYmAgR2xvYiBwYXR0ZXJuIG9yIHJlZ2V4IGNyZWF0ZWQgYnkgWy5tYWtlUmVdKCNtYWtlUmUpLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLm1hdGNoQmFzZSA9IChpbnB1dCwgZ2xvYiwgb3B0aW9ucywgcG9zaXggPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucykpID0+IHtcbiAgY29uc3QgcmVnZXggPSBnbG9iIGluc3RhbmNlb2YgUmVnRXhwID8gZ2xvYiA6IHBpY29tYXRjaC5tYWtlUmUoZ2xvYiwgb3B0aW9ucyk7XG4gIHJldHVybiByZWdleC50ZXN0KHBhdGguYmFzZW5hbWUoaW5wdXQpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmICoqYW55Kiogb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYCBtYXRjaCB0aGUgc3BlY2lmaWVkIGBzdHJpbmdgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5pc01hdGNoKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLmlzTWF0Y2goJ2EuYScsIFsnYi4qJywgJyouYSddKSk7IC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cocGljb21hdGNoLmlzTWF0Y2goJ2EuYScsICdiLionKSk7IC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHN0ciBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gcGF0dGVybnMgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5pc01hdGNoID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBQYXJzZSBhIGdsb2IgcGF0dGVybiB0byBjcmVhdGUgdGhlIHNvdXJjZSBzdHJpbmcgZm9yIGEgcmVndWxhclxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiBjb25zdCByZXN1bHQgPSBwaWNvbWF0Y2gucGFyc2UocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHVzZWZ1bCBwcm9wZXJ0aWVzIGFuZCBvdXRwdXQgdG8gYmUgdXNlZCBhcyBhIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5wYXJzZSA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSByZXR1cm4gcGF0dGVybi5tYXAocCA9PiBwaWNvbWF0Y2gucGFyc2UocCwgb3B0aW9ucykpO1xuICByZXR1cm4gcGFyc2UocGF0dGVybiwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pO1xufTtcblxuLyoqXG4gKiBTY2FuIGEgZ2xvYiBwYXR0ZXJuIHRvIHNlcGFyYXRlIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLnNjYW4oaW5wdXRbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgcmVzdWx0ID0gcGljb21hdGNoLnNjYW4oJyEuL2Zvby8qLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICogeyBwcmVmaXg6ICchLi8nLFxuICogICBpbnB1dDogJyEuL2Zvby8qLmpzJyxcbiAqICAgc3RhcnQ6IDMsXG4gKiAgIGJhc2U6ICdmb28nLFxuICogICBnbG9iOiAnKi5qcycsXG4gKiAgIGlzQnJhY2U6IGZhbHNlLFxuICogICBpc0JyYWNrZXQ6IGZhbHNlLFxuICogICBpc0dsb2I6IHRydWUsXG4gKiAgIGlzRXh0Z2xvYjogZmFsc2UsXG4gKiAgIGlzR2xvYnN0YXI6IGZhbHNlLFxuICogICBuZWdhdGVkOiB0cnVlIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgR2xvYiBwYXR0ZXJuIHRvIHNjYW4uXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGhcbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnNjYW4gPSAoaW5wdXQsIG9wdGlvbnMpID0+IHNjYW4oaW5wdXQsIG9wdGlvbnMpO1xuXG4vKipcbiAqIENvbXBpbGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgYHN0YXRlYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlXG4gKiBbcGFyc2UoKV0oI3BhcnNlKSBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGBzdGF0ZWBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVybk91dHB1dGAgSW50ZW5kZWQgZm9yIGltcGxlbWVudG9ycywgdGhpcyBhcmd1bWVudCBhbGxvd3MgeW91IHRvIHJldHVybiB0aGUgcmF3IG91dHB1dCBmcm9tIHRoZSBwYXJzZXIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5TdGF0ZWAgQWRkcyB0aGUgc3RhdGUgdG8gYSBgc3RhdGVgIHByb3BlcnR5IG9uIHRoZSByZXR1cm5lZCByZWdleC4gVXNlZnVsIGZvciBpbXBsZW1lbnRvcnMgYW5kIGRlYnVnZ2luZy5cbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLmNvbXBpbGVSZSA9IChzdGF0ZSwgb3B0aW9ucywgcmV0dXJuT3V0cHV0ID0gZmFsc2UsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHtcbiAgaWYgKHJldHVybk91dHB1dCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBzdGF0ZS5vdXRwdXQ7XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgcHJlcGVuZCA9IG9wdHMuY29udGFpbnMgPyAnJyA6ICdeJztcbiAgY29uc3QgYXBwZW5kID0gb3B0cy5jb250YWlucyA/ICcnIDogJyQnO1xuXG4gIGxldCBzb3VyY2UgPSBgJHtwcmVwZW5kfSg/OiR7c3RhdGUub3V0cHV0fSkke2FwcGVuZH1gO1xuICBpZiAoc3RhdGUgJiYgc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkge1xuICAgIHNvdXJjZSA9IGBeKD8hJHtzb3VyY2V9KS4qJGA7XG4gIH1cblxuICBjb25zdCByZWdleCA9IHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZSwgb3B0aW9ucyk7XG4gIGlmIChyZXR1cm5TdGF0ZSA9PT0gdHJ1ZSkge1xuICAgIHJlZ2V4LnN0YXRlID0gc3RhdGU7XG4gIH1cblxuICByZXR1cm4gcmVnZXg7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIGEgcGFyc2VkIGdsb2IgcGF0dGVybi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiBjb25zdCBzdGF0ZSA9IHBpY29tYXRjaC5wYXJzZSgnKi5qcycpO1xuICogLy8gcGljb21hdGNoLmNvbXBpbGVSZShzdGF0ZVssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guY29tcGlsZVJlKHN0YXRlKSk7XG4gKiAvLz0+IC9eKD86KD8hXFwuKSg/PS4pW14vXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdGF0ZWAgVGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBgLnBhcnNlYCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5PdXRwdXRgIEltcGxlbWVudG9ycyBtYXkgdXNlIHRoaXMgYXJndW1lbnQgdG8gcmV0dXJuIHRoZSBjb21waWxlZCBvdXRwdXQsIGluc3RlYWQgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24uIFRoaXMgaXMgbm90IGV4cG9zZWQgb24gdGhlIG9wdGlvbnMgdG8gcHJldmVudCBlbmQtdXNlcnMgZnJvbSBtdXRhdGluZyB0aGUgcmVzdWx0LlxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuU3RhdGVgIEltcGxlbWVudG9ycyBtYXkgdXNlIHRoaXMgYXJndW1lbnQgdG8gcmV0dXJuIHRoZSBzdGF0ZSBmcm9tIHRoZSBwYXJzZWQgZ2xvYiB3aXRoIHRoZSByZXR1cm5lZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJuIHtSZWdFeHB9IFJldHVybnMgYSByZWdleCBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIHBhdHRlcm4uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5tYWtlUmUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSwgcmV0dXJuT3V0cHV0ID0gZmFsc2UsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBsZXQgcGFyc2VkID0geyBuZWdhdGVkOiBmYWxzZSwgZmFzdHBhdGhzOiB0cnVlIH07XG5cbiAgaWYgKG9wdGlvbnMuZmFzdHBhdGhzICE9PSBmYWxzZSAmJiAoaW5wdXRbMF0gPT09ICcuJyB8fCBpbnB1dFswXSA9PT0gJyonKSkge1xuICAgIHBhcnNlZC5vdXRwdXQgPSBwYXJzZS5mYXN0cGF0aHMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFwYXJzZWQub3V0cHV0KSB7XG4gICAgcGFyc2VkID0gcGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIHBpY29tYXRjaC5jb21waWxlUmUocGFyc2VkLCBvcHRpb25zLCByZXR1cm5PdXRwdXQsIHJldHVyblN0YXRlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGdpdmVuIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLnRvUmVnZXgoc291cmNlWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IHsgb3V0cHV0IH0gPSBwaWNvbWF0Y2gucGFyc2UoJyouanMnKTtcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC50b1JlZ2V4KG91dHB1dCkpO1xuICogLy89PiAvXig/Oig/IVxcLikoPz0uKVteL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc291cmNlYCBSZWd1bGFyIGV4cHJlc3Npb24gc291cmNlIHN0cmluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnRvUmVnZXggPSAoc291cmNlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoc291cmNlLCBvcHRzLmZsYWdzIHx8IChvcHRzLm5vY2FzZSA/ICdpJyA6ICcnKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHRocm93IGVycjtcbiAgICByZXR1cm4gLyReLztcbiAgfVxufTtcblxuLyoqXG4gKiBQaWNvbWF0Y2ggY29uc3RhbnRzLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbnBpY29tYXRjaC5jb25zdGFudHMgPSBjb25zdGFudHM7XG5cbi8qKlxuICogRXhwb3NlIFwicGljb21hdGNoXCJcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY29tYXRjaDtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvcGljb21hdGNoJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG5jb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgncGljb21hdGNoL2xpYi91dGlscycpO1xuY29uc3QgaXNFbXB0eVN0cmluZyA9IHZhbCA9PiB2YWwgPT09ICcnIHx8IHZhbCA9PT0gJy4vJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBtYXRjaCBvbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tKGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tKFsnYS5qcycsICdhLnR4dCddLCBbJyouanMnXSkpO1xuICogLy89PiBbICdhLmpzJyBdXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PHN0cmluZz59IGBsaXN0YCBMaXN0IG9mIHN0cmluZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxzdHJpbmc+fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzXG4gKiBAc3VtbWFyeSBmYWxzZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBtaWNyb21hdGNoID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIHBhdHRlcm5zID0gW10uY29uY2F0KHBhdHRlcm5zKTtcbiAgbGlzdCA9IFtdLmNvbmNhdChsaXN0KTtcblxuICBsZXQgb21pdCA9IG5ldyBTZXQoKTtcbiAgbGV0IGtlZXAgPSBuZXcgU2V0KCk7XG4gIGxldCBpdGVtcyA9IG5ldyBTZXQoKTtcbiAgbGV0IG5lZ2F0aXZlcyA9IDA7XG5cbiAgbGV0IG9uUmVzdWx0ID0gc3RhdGUgPT4ge1xuICAgIGl0ZW1zLmFkZChzdGF0ZS5vdXRwdXQpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMub25SZXN1bHQpIHtcbiAgICAgIG9wdGlvbnMub25SZXN1bHQoc3RhdGUpO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goU3RyaW5nKHBhdHRlcm5zW2ldKSwgeyAuLi5vcHRpb25zLCBvblJlc3VsdCB9LCB0cnVlKTtcbiAgICBsZXQgbmVnYXRlZCA9IGlzTWF0Y2guc3RhdGUubmVnYXRlZCB8fCBpc01hdGNoLnN0YXRlLm5lZ2F0ZWRFeHRnbG9iO1xuICAgIGlmIChuZWdhdGVkKSBuZWdhdGl2ZXMrKztcblxuICAgIGZvciAobGV0IGl0ZW0gb2YgbGlzdCkge1xuICAgICAgbGV0IG1hdGNoZWQgPSBpc01hdGNoKGl0ZW0sIHRydWUpO1xuXG4gICAgICBsZXQgbWF0Y2ggPSBuZWdhdGVkID8gIW1hdGNoZWQuaXNNYXRjaCA6IG1hdGNoZWQuaXNNYXRjaDtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAobmVnYXRlZCkge1xuICAgICAgICBvbWl0LmFkZChtYXRjaGVkLm91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbWl0LmRlbGV0ZShtYXRjaGVkLm91dHB1dCk7XG4gICAgICAgIGtlZXAuYWRkKG1hdGNoZWQub3V0cHV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gbmVnYXRpdmVzID09PSBwYXR0ZXJucy5sZW5ndGggPyBbLi4uaXRlbXNdIDogWy4uLmtlZXBdO1xuICBsZXQgbWF0Y2hlcyA9IHJlc3VsdC5maWx0ZXIoaXRlbSA9PiAhb21pdC5oYXMoaXRlbSkpO1xuXG4gIGlmIChvcHRpb25zICYmIG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKG9wdGlvbnMuZmFpbGdsb2IgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWF0Y2hlcyBmb3VuZCBmb3IgXCIke3BhdHRlcm5zLmpvaW4oJywgJyl9XCJgKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5ub251bGwgPT09IHRydWUgfHwgb3B0aW9ucy5udWxsZ2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMudW5lc2NhcGUgPyBwYXR0ZXJucy5tYXAocCA9PiBwLnJlcGxhY2UoL1xcXFwvZywgJycpKSA6IHBhdHRlcm5zO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaGVzO1xufTtcblxuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2ggPSBtaWNyb21hdGNoO1xuXG4vKipcbiAqIFJldHVybnMgYSBtYXRjaGVyIGZ1bmN0aW9uIGZyb20gdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5gIGFuZCBgb3B0aW9uc2AuXG4gKiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgdG8gbWF0Y2ggYXMgaXRzIG9ubHkgYXJndW1lbnQgYW5kIHJldHVybnNcbiAqIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG1hdGNoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1hdGNoZXIocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCBpc01hdGNoID0gbW0ubWF0Y2hlcignKi4hKCphKScpO1xuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5hJykpOyAvLz0+IGZhbHNlXG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmInKSk7IC8vPT4gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEdsb2IgcGF0dGVyblxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7RnVuY3Rpb259IFJldHVybnMgYSBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoZXIgPSAocGF0dGVybiwgb3B0aW9ucykgPT4gcGljb21hdGNoKHBhdHRlcm4sIG9wdGlvbnMpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFueSoqIG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AgbWF0Y2ggdGhlIHNwZWNpZmllZCBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5pc01hdGNoKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uaXNNYXRjaCgnYS5hJywgWydiLionLCAnKi5hJ10pKTsgLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5pc01hdGNoKCdhLmEnLCAnYi4qJykpOyAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYFtvcHRpb25zXWAgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmlzTWF0Y2ggPSAoc3RyLCBwYXR0ZXJucywgb3B0aW9ucykgPT4gcGljb21hdGNoKHBhdHRlcm5zLCBvcHRpb25zKShzdHIpO1xuXG4vKipcbiAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKi9cblxubWljcm9tYXRjaC5hbnkgPSBtaWNyb21hdGNoLmlzTWF0Y2g7XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyB0aGF0IF8qKmRvIG5vdCBtYXRjaCBhbnkqKl8gb2YgdGhlIGdpdmVuIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubm90KGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLm5vdChbJ2EuYScsICdiLmInLCAnYy5jJ10sICcqLmEnKSk7XG4gKiAvLz0+IFsnYi5iJywgJ2MuYyddXG4gKiBgYGBcbiAqIEBwYXJhbSB7QXJyYXl9IGBsaXN0YCBBcnJheSBvZiBzdHJpbmdzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0ICoqZG8gbm90IG1hdGNoKiogdGhlIGdpdmVuIHBhdHRlcm5zLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm5vdCA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIHBhdHRlcm5zID0gW10uY29uY2F0KHBhdHRlcm5zKS5tYXAoU3RyaW5nKTtcbiAgbGV0IHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgbGV0IGl0ZW1zID0gW107XG5cbiAgbGV0IG9uUmVzdWx0ID0gc3RhdGUgPT4ge1xuICAgIGlmIChvcHRpb25zLm9uUmVzdWx0KSBvcHRpb25zLm9uUmVzdWx0KHN0YXRlKTtcbiAgICBpdGVtcy5wdXNoKHN0YXRlLm91dHB1dCk7XG4gIH07XG5cbiAgbGV0IG1hdGNoZXMgPSBuZXcgU2V0KG1pY3JvbWF0Y2gobGlzdCwgcGF0dGVybnMsIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSkpO1xuXG4gIGZvciAobGV0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBpZiAoIW1hdGNoZXMuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnJlc3VsdF07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYHN0cmluZ2AgY29udGFpbnMgdGhlIGdpdmVuIHBhdHRlcm4uIFNpbWlsYXJcbiAqIHRvIFsuaXNNYXRjaF0oI2lzTWF0Y2gpIGJ1dCB0aGUgcGF0dGVybiBjYW4gbWF0Y2ggYW55IHBhcnQgb2YgdGhlIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogdmFyIG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uY29udGFpbnMoc3RyaW5nLCBwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmNvbnRhaW5zKCdhYS9iYi9jYycsICcqYicpKTtcbiAqIC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uY29udGFpbnMoJ2FhL2JiL2NjJywgJypkJykpO1xuICogLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgVGhlIHN0cmluZyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIEdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIHBhdHRlcm5zIG1hdGNoZXMgYW55IHBhcnQgb2YgYHN0cmAuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guY29udGFpbnMgPSAoc3RyLCBwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nOiBcIiR7dXRpbC5pbnNwZWN0KHN0cil9XCJgKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc29tZShwID0+IG1pY3JvbWF0Y2guY29udGFpbnMoc3RyLCBwLCBvcHRpb25zKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGlzRW1wdHlTdHJpbmcoc3RyKSB8fCBpc0VtcHR5U3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0ci5pbmNsdWRlcyhwYXR0ZXJuKSB8fCAoc3RyLnN0YXJ0c1dpdGgoJy4vJykgJiYgc3RyLnNsaWNlKDIpLmluY2x1ZGVzKHBhdHRlcm4pKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pY3JvbWF0Y2guaXNNYXRjaChzdHIsIHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgY29udGFpbnM6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEZpbHRlciB0aGUga2V5cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBnbG9iYCBwYXR0ZXJuXG4gKiBhbmQgYG9wdGlvbnNgLiBEb2VzIG5vdCBhdHRlbXB0IHRvIG1hdGNoIG5lc3RlZCBrZXlzLiBJZiB5b3UgbmVlZCB0aGlzIGZlYXR1cmUsXG4gKiB1c2UgW2dsb2Itb2JqZWN0XVtdIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWF0Y2hLZXlzKG9iamVjdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3Qgb2JqID0geyBhYTogJ2EnLCBhYjogJ2InLCBhYzogJ2MnIH07XG4gKiBjb25zb2xlLmxvZyhtbS5tYXRjaEtleXMob2JqLCAnKmInKSk7XG4gKiAvLz0+IHsgYWI6ICdiJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb2JqZWN0YCBUaGUgb2JqZWN0IHdpdGgga2V5cyB0byBmaWx0ZXIuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG9ubHkga2V5cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYXRjaEtleXMgPSAob2JqLCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0Jyk7XG4gIH1cbiAgbGV0IGtleXMgPSBtaWNyb21hdGNoKE9iamVjdC5rZXlzKG9iaiksIHBhdHRlcm5zLCBvcHRpb25zKTtcbiAgbGV0IHJlcyA9IHt9O1xuICBmb3IgKGxldCBrZXkgb2Yga2V5cykgcmVzW2tleV0gPSBvYmpba2V5XTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHNvbWUgb2YgdGhlIHN0cmluZ3MgaW4gdGhlIGdpdmVuIGBsaXN0YCBtYXRjaCBhbnkgb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5zb21lKGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLnNvbWUoWydmb28uanMnLCAnYmFyLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLnNvbWUoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC4gUmV0dXJucyBhcyBzb29uIGFzIHRoZSBmaXJzdCBtYXRjaCBpcyBmb3VuZC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbnkgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guc29tZSA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgaXRlbXMgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgZm9yIChsZXQgcGF0dGVybiBvZiBbXS5jb25jYXQocGF0dGVybnMpKSB7XG4gICAgbGV0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goU3RyaW5nKHBhdHRlcm4pLCBvcHRpb25zKTtcbiAgICBpZiAoaXRlbXMuc29tZShpdGVtID0+IGlzTWF0Y2goaXRlbSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZXZlcnkgc3RyaW5nIGluIHRoZSBnaXZlbiBgbGlzdGAgbWF0Y2hlc1xuICogYW55IG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uZXZlcnkobGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uZXZlcnkoJ2Zvby5qcycsIFsnZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnXSkpO1xuICogLy8gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnLCAnYmFyLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGxpc3RgIFRoZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbGwgYHBhdHRlcm5zYCBtYXRjaGVzIGFsbCBvZiB0aGUgc3RyaW5ncyBpbiBgbGlzdGBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5ldmVyeSA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgaXRlbXMgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgZm9yIChsZXQgcGF0dGVybiBvZiBbXS5jb25jYXQocGF0dGVybnMpKSB7XG4gICAgbGV0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goU3RyaW5nKHBhdHRlcm4pLCBvcHRpb25zKTtcbiAgICBpZiAoIWl0ZW1zLmV2ZXJ5KGl0ZW0gPT4gaXNNYXRjaChpdGVtKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFsbCoqIG9mIHRoZSBnaXZlbiBgcGF0dGVybnNgIG1hdGNoXG4gKiB0aGUgc3BlY2lmaWVkIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5hbGwoc3RyaW5nLCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnKi5qcycsICdmKicsICcqbyonLCAnKm8uanMnXSkpO1xuICogLy8gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHN0cmAgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5hbGwgPSAoc3RyLCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZzogXCIke3V0aWwuaW5zcGVjdChzdHIpfVwiYCk7XG4gIH1cblxuICByZXR1cm4gW10uY29uY2F0KHBhdHRlcm5zKS5ldmVyeShwID0+IHBpY29tYXRjaChwLCBvcHRpb25zKShzdHIpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzIGNhcHR1cmVkIGJ5IGBwYXR0ZXJuYCBpbiBgc3RyaW5nLCBvciBgbnVsbGAgaWYgdGhlIHBhdHRlcm4gZGlkIG5vdCBtYXRjaC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5jYXB0dXJlKHBhdHRlcm4sIHN0cmluZ1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5jYXB0dXJlKCd0ZXN0LyouanMnLCAndGVzdC9mb28uanMnKSk7XG4gKiAvLz0+IFsnZm9vJ11cbiAqIGNvbnNvbGUubG9nKG1tLmNhcHR1cmUoJ3Rlc3QvKi5qcycsICdmb28vYmFyLmNzcycpKTtcbiAqIC8vPT4gbnVsbFxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgIEdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgU3RyaW5nIHRvIG1hdGNoXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7QXJyYXl8bnVsbH0gUmV0dXJucyBhbiBhcnJheSBvZiBjYXB0dXJlcyBpZiB0aGUgaW5wdXQgbWF0Y2hlcyB0aGUgZ2xvYiBwYXR0ZXJuLCBvdGhlcndpc2UgYG51bGxgLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmNhcHR1cmUgPSAoZ2xvYiwgaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuICBsZXQgcmVnZXggPSBwaWNvbWF0Y2gubWFrZVJlKFN0cmluZyhnbG9iKSwgeyAuLi5vcHRpb25zLCBjYXB0dXJlOiB0cnVlIH0pO1xuICBsZXQgbWF0Y2ggPSByZWdleC5leGVjKHBvc2l4ID8gdXRpbHMudG9Qb3NpeFNsYXNoZXMoaW5wdXQpIDogaW5wdXQpO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaC5zbGljZSgxKS5tYXAodiA9PiB2ID09PSB2b2lkIDAgPyAnJyA6IHYpO1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYWtlUmUocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5tYWtlUmUoJyouanMnKSk7XG4gKiAvLz0+IC9eKD86KFxcLltcXFxcXFwvXSk/KD8hXFwuKSg/PS4pW15cXC9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEEgZ2xvYiBwYXR0ZXJuIHRvIGNvbnZlcnQgdG8gcmVnZXguXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtSZWdFeHB9IFJldHVybnMgYSByZWdleCBjcmVhdGVkIGZyb20gdGhlIGdpdmVuIHBhdHRlcm4uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWFrZVJlID0gKC4uLmFyZ3MpID0+IHBpY29tYXRjaC5tYWtlUmUoLi4uYXJncyk7XG5cbi8qKlxuICogU2NhbiBhIGdsb2IgcGF0dGVybiB0byBzZXBhcmF0ZSB0aGUgcGF0dGVybiBpbnRvIHNlZ21lbnRzLiBVc2VkXG4gKiBieSB0aGUgW3NwbGl0XSgjc3BsaXQpIG1ldGhvZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiBjb25zdCBzdGF0ZSA9IG1tLnNjYW4ocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guc2NhbiA9ICguLi5hcmdzKSA9PiBwaWNvbWF0Y2guc2NhbiguLi5hcmdzKTtcblxuLyoqXG4gKiBQYXJzZSBhIGdsb2IgcGF0dGVybiB0byBjcmVhdGUgdGhlIHNvdXJjZSBzdHJpbmcgZm9yIGEgcmVndWxhclxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiBjb25zdCBzdGF0ZSA9IG1tLnBhcnNlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgZ2xvYmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1c2VmdWwgcHJvcGVydGllcyBhbmQgb3V0cHV0IHRvIGJlIHVzZWQgYXMgcmVnZXggc291cmNlIHN0cmluZy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5wYXJzZSA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzID0gW107XG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zIHx8IFtdKSkge1xuICAgIGZvciAobGV0IHN0ciBvZiBicmFjZXMoU3RyaW5nKHBhdHRlcm4pLCBvcHRpb25zKSkge1xuICAgICAgcmVzLnB1c2gocGljb21hdGNoLnBhcnNlKHN0ciwgb3B0aW9ucykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIHRoZSBnaXZlbiBicmFjZSBgcGF0dGVybmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHsgYnJhY2VzIH0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ2Zvby97YSxiLGN9L2JhcicpKTtcbiAqIC8vPT4gWyAnZm9vLyhhfGJ8YykvYmFyJyBdXG4gKlxuICogY29uc29sZS5sb2coYnJhY2VzKCdmb28ve2EsYixjfS9iYXInLCB7IGV4cGFuZDogdHJ1ZSB9KSk7XG4gKiAvLz0+IFsgJ2Zvby9hL2JhcicsICdmb28vYi9iYXInLCAnZm9vL2MvYmFyJyBdXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgU3RyaW5nIHdpdGggYnJhY2UgcGF0dGVybiB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBBbnkgW29wdGlvbnNdKCNvcHRpb25zKSB0byBjaGFuZ2UgaG93IGV4cGFuc2lvbiBpcyBwZXJmb3JtZWQuIFNlZSB0aGUgW2JyYWNlc11bXSBsaWJyYXJ5IGZvciBhbGwgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5icmFjZXMgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICBpZiAoKG9wdGlvbnMgJiYgb3B0aW9ucy5ub2JyYWNlID09PSB0cnVlKSB8fCAhL1xcey4qXFx9Ly50ZXN0KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIFtwYXR0ZXJuXTtcbiAgfVxuICByZXR1cm4gYnJhY2VzKHBhdHRlcm4sIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBhbmQgYnJhY2VzXG4gKi9cblxubWljcm9tYXRjaC5icmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIHJldHVybiBtaWNyb21hdGNoLmJyYWNlcyhwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGV4cGFuZDogdHJ1ZSB9KTtcbn07XG5cbi8qKlxuICogRXhwb3NlIG1pY3JvbWF0Y2hcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1pY3JvbWF0Y2g7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMgPSBleHBvcnRzLm1hdGNoQW55ID0gZXhwb3J0cy5jb252ZXJ0UGF0dGVybnNUb1JlID0gZXhwb3J0cy5tYWtlUmUgPSBleHBvcnRzLmdldFBhdHRlcm5QYXJ0cyA9IGV4cG9ydHMuZXhwYW5kQnJhY2VFeHBhbnNpb24gPSBleHBvcnRzLmV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uID0gZXhwb3J0cy5pc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybiA9IGV4cG9ydHMuZW5kc1dpdGhTbGFzaEdsb2JTdGFyID0gZXhwb3J0cy5oYXNHbG9iU3RhciA9IGV4cG9ydHMuZ2V0QmFzZURpcmVjdG9yeSA9IGV4cG9ydHMuaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5ID0gZXhwb3J0cy5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZXhwb3J0cy5nZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkgPSBleHBvcnRzLmdldFBvc2l0aXZlUGF0dGVybnMgPSBleHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnMgPSBleHBvcnRzLmlzUG9zaXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5pc05lZ2F0aXZlUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFRvTmVnYXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4gPSBleHBvcnRzLmlzRHluYW1pY1BhdHRlcm4gPSBleHBvcnRzLmlzU3RhdGljUGF0dGVybiA9IHZvaWQgMDtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGdsb2JQYXJlbnQgPSByZXF1aXJlKFwiZ2xvYi1wYXJlbnRcIik7XG5jb25zdCBtaWNyb21hdGNoID0gcmVxdWlyZShcIm1pY3JvbWF0Y2hcIik7XG5jb25zdCBHTE9CU1RBUiA9ICcqKic7XG5jb25zdCBFU0NBUEVfU1lNQk9MID0gJ1xcXFwnO1xuY29uc3QgQ09NTU9OX0dMT0JfU1lNQk9MU19SRSA9IC9bKj9dfF4hLztcbmNvbnN0IFJFR0VYX0NIQVJBQ1RFUl9DTEFTU19TWU1CT0xTX1JFID0gL1xcW1teW10qXS87XG5jb25zdCBSRUdFWF9HUk9VUF9TWU1CT0xTX1JFID0gLyg/Ol58W14hKis/QF0pXFwoW14oXSpcXHxbXnxdKlxcKS87XG5jb25zdCBHTE9CX0VYVEVOU0lPTl9TWU1CT0xTX1JFID0gL1shKis/QF1cXChbXihdKlxcKS87XG5jb25zdCBCUkFDRV9FWFBBTlNJT05fU0VQQVJBVE9SU19SRSA9IC8sfFxcLlxcLi87XG4vKipcbiAqIE1hdGNoZXMgYSBzZXF1ZW5jZSBvZiB0d28gb3IgbW9yZSBjb25zZWN1dGl2ZSBzbGFzaGVzLCBleGNsdWRpbmcgdGhlIGZpcnN0IHR3byBzbGFzaGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy5cbiAqIFRoZSBsYXR0ZXIgaXMgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiB0aGUgZGV2aWNlIHBhdGggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgVU5DIHBhdGguXG4gKi9cbmNvbnN0IERPVUJMRV9TTEFTSF9SRSA9IC8oPyFeKVxcL3syLH0vZztcbmZ1bmN0aW9uIGlzU3RhdGljUGF0dGVybihwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gIWlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyk7XG59XG5leHBvcnRzLmlzU3RhdGljUGF0dGVybiA9IGlzU3RhdGljUGF0dGVybjtcbmZ1bmN0aW9uIGlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsIGNhc2Ugd2l0aCBhbiBlbXB0eSBzdHJpbmcgaXMgbmVjZXNzYXJ5IGZvciBtYXRjaGluZyBwYXR0ZXJucyB0aGF0IHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoLlxuICAgICAqIEFuIGVtcHR5IHN0cmluZyBjYW5ub3QgYmUgYSBkeW5hbWljIHBhdHRlcm4uXG4gICAgICogRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuIGAvbGliLypgIHdpbGwgYmUgc3ByZWFkIGludG8gcGFydHM6ICcnLCAnbGliJywgJyonLlxuICAgICAqL1xuICAgIGlmIChwYXR0ZXJuID09PSAnJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIGBjYXNlU2Vuc2l0aXZlTWF0Y2hgIG9wdGlvbiBpcyBkaXNhYmxlZCwgYWxsIHBhdHRlcm5zIG11c3QgYmUgbWFya2VkIGFzIGR5bmFtaWMsIGJlY2F1c2Ugd2UgY2Fubm90IGNoZWNrXG4gICAgICogZmlsZXBhdGggZGlyZWN0bHkgKHdpdGhvdXQgcmVhZCBkaXJlY3RvcnkpLlxuICAgICAqL1xuICAgIGlmIChvcHRpb25zLmNhc2VTZW5zaXRpdmVNYXRjaCA9PT0gZmFsc2UgfHwgcGF0dGVybi5pbmNsdWRlcyhFU0NBUEVfU1lNQk9MKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENPTU1PTl9HTE9CX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSB8fCBSRUdFWF9DSEFSQUNURVJfQ0xBU1NfU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pIHx8IFJFR0VYX0dST1VQX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZXh0Z2xvYiAhPT0gZmFsc2UgJiYgR0xPQl9FWFRFTlNJT05fU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5icmFjZUV4cGFuc2lvbiAhPT0gZmFsc2UgJiYgaGFzQnJhY2VFeHBhbnNpb24ocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuaXNEeW5hbWljUGF0dGVybiA9IGlzRHluYW1pY1BhdHRlcm47XG5mdW5jdGlvbiBoYXNCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSB7XG4gICAgY29uc3Qgb3BlbmluZ0JyYWNlSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ3snKTtcbiAgICBpZiAob3BlbmluZ0JyYWNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2xvc2luZ0JyYWNlSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ30nLCBvcGVuaW5nQnJhY2VJbmRleCArIDEpO1xuICAgIGlmIChjbG9zaW5nQnJhY2VJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBicmFjZUNvbnRlbnQgPSBwYXR0ZXJuLnNsaWNlKG9wZW5pbmdCcmFjZUluZGV4LCBjbG9zaW5nQnJhY2VJbmRleCk7XG4gICAgcmV0dXJuIEJSQUNFX0VYUEFOU0lPTl9TRVBBUkFUT1JTX1JFLnRlc3QoYnJhY2VDb250ZW50KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pID8gcGF0dGVybi5zbGljZSgxKSA6IHBhdHRlcm47XG59XG5leHBvcnRzLmNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybiA9IGNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybjtcbmZ1bmN0aW9uIGNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuICchJyArIHBhdHRlcm47XG59XG5leHBvcnRzLmNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybiA9IGNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybjtcbmZ1bmN0aW9uIGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5zdGFydHNXaXRoKCchJykgJiYgcGF0dGVyblsxXSAhPT0gJygnO1xufVxuZXhwb3J0cy5pc05lZ2F0aXZlUGF0dGVybiA9IGlzTmVnYXRpdmVQYXR0ZXJuO1xuZnVuY3Rpb24gaXNQb3NpdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiAhaXNOZWdhdGl2ZVBhdHRlcm4ocGF0dGVybik7XG59XG5leHBvcnRzLmlzUG9zaXRpdmVQYXR0ZXJuID0gaXNQb3NpdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBnZXROZWdhdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc05lZ2F0aXZlUGF0dGVybik7XG59XG5leHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnMgPSBnZXROZWdhdGl2ZVBhdHRlcm5zO1xuZnVuY3Rpb24gZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoaXNQb3NpdGl2ZVBhdHRlcm4pO1xufVxuZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZ2V0UG9zaXRpdmVQYXR0ZXJucztcbi8qKlxuICogUmV0dXJucyBwYXR0ZXJucyB0aGF0IGNhbiBiZSBhcHBsaWVkIGluc2lkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFsnLi8qJywgJyonLCAnYS8qJ11cbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxuICovXG5mdW5jdGlvbiBnZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkocGF0dGVybnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiAhaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5KHBhdHRlcm4pKTtcbn1cbmV4cG9ydHMuZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5O1xuLyoqXG4gKiBSZXR1cm5zIHBhdHRlcm5zIHRvIGJlIGV4cGFuZGVkIHJlbGF0aXZlIHRvIChvdXRzaWRlKSB0aGUgY3VycmVudCBkaXJlY3RvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFsnLi4vKicsICcuLy4uLyonXVxuICogZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KFsnLi8qJywgJyonLCAnYS8qJywgJy4uLyonLCAnLi8uLi8qJ10pXG4gKi9cbmZ1bmN0aW9uIGdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkocGF0dGVybnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeSk7XG59XG5leHBvcnRzLmdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkgPSBnZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5O1xuZnVuY3Rpb24gaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5KHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5zdGFydHNXaXRoKCcuLicpIHx8IHBhdHRlcm4uc3RhcnRzV2l0aCgnLi8uLicpO1xufVxuZXhwb3J0cy5pc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkgPSBpc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3Rvcnk7XG5mdW5jdGlvbiBnZXRCYXNlRGlyZWN0b3J5KHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2xvYlBhcmVudChwYXR0ZXJuLCB7IGZsaXBCYWNrc2xhc2hlczogZmFsc2UgfSk7XG59XG5leHBvcnRzLmdldEJhc2VEaXJlY3RvcnkgPSBnZXRCYXNlRGlyZWN0b3J5O1xuZnVuY3Rpb24gaGFzR2xvYlN0YXIocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLmluY2x1ZGVzKEdMT0JTVEFSKTtcbn1cbmV4cG9ydHMuaGFzR2xvYlN0YXIgPSBoYXNHbG9iU3RhcjtcbmZ1bmN0aW9uIGVuZHNXaXRoU2xhc2hHbG9iU3RhcihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uZW5kc1dpdGgoJy8nICsgR0xPQlNUQVIpO1xufVxuZXhwb3J0cy5lbmRzV2l0aFNsYXNoR2xvYlN0YXIgPSBlbmRzV2l0aFNsYXNoR2xvYlN0YXI7XG5mdW5jdGlvbiBpc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHBhdHRlcm4pO1xuICAgIHJldHVybiBlbmRzV2l0aFNsYXNoR2xvYlN0YXIocGF0dGVybikgfHwgaXNTdGF0aWNQYXR0ZXJuKGJhc2VuYW1lKTtcbn1cbmV4cG9ydHMuaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4gPSBpc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybjtcbmZ1bmN0aW9uIGV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uKHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLnJlZHVjZSgoY29sbGVjdGlvbiwgcGF0dGVybikgPT4ge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5jb25jYXQoZXhwYW5kQnJhY2VFeHBhbnNpb24ocGF0dGVybikpO1xuICAgIH0sIFtdKTtcbn1cbmV4cG9ydHMuZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb24gPSBleHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbjtcbmZ1bmN0aW9uIGV4cGFuZEJyYWNlRXhwYW5zaW9uKHBhdHRlcm4pIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IG1pY3JvbWF0Y2guYnJhY2VzKHBhdHRlcm4sIHsgZXhwYW5kOiB0cnVlLCBub2R1cGVzOiB0cnVlLCBrZWVwRXNjYXBpbmc6IHRydWUgfSk7XG4gICAgLyoqXG4gICAgICogU29ydCB0aGUgcGF0dGVybnMgYnkgbGVuZ3RoIHNvIHRoYXQgdGhlIHNhbWUgZGVwdGggcGF0dGVybnMgYXJlIHByb2Nlc3NlZCBzaWRlIGJ5IHNpZGUuXG4gICAgICogYGEve2IsfS97Yyx9LypgIFx1MjAxMyBgWydhLy8vKicsICdhL2IvLyonLCAnYS8vYy8qJywgJ2EvYi9jLyonXWBcbiAgICAgKi9cbiAgICBwYXR0ZXJucy5zb3J0KChhLCBiKSA9PiBhLmxlbmd0aCAtIGIubGVuZ3RoKTtcbiAgICAvKipcbiAgICAgKiBNaWNyb21hdGNoIGNhbiByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBjYXNlIG9mIHBhdHRlcm5zIGxpa2UgYHthLH1gLlxuICAgICAqL1xuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4gIT09ICcnKTtcbn1cbmV4cG9ydHMuZXhwYW5kQnJhY2VFeHBhbnNpb24gPSBleHBhbmRCcmFjZUV4cGFuc2lvbjtcbmZ1bmN0aW9uIGdldFBhdHRlcm5QYXJ0cyhwYXR0ZXJuLCBvcHRpb25zKSB7XG4gICAgbGV0IHsgcGFydHMgfSA9IG1pY3JvbWF0Y2guc2NhbihwYXR0ZXJuLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHBhcnRzOiB0cnVlIH0pKTtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NhbiBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBhcnJheSBpbiBzb21lIGNhc2VzLlxuICAgICAqIFNlZSBtaWNyb21hdGNoL3BpY29tYXRjaCM1OCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqL1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGFydHMgPSBbcGF0dGVybl07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzY2FuIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYW4gZW1wdHkgcGFydCBmb3IgdGhlIHBhdHRlcm4gd2l0aCBhIGZvcndhcmQgc2xhc2guXG4gICAgICogVGhpcyBpcyBhbm90aGVyIHBhcnQgb2YgbWljcm9tYXRjaC9waWNvbWF0Y2gjNTguXG4gICAgICovXG4gICAgaWYgKHBhcnRzWzBdLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICBwYXJ0c1swXSA9IHBhcnRzWzBdLnNsaWNlKDEpO1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xufVxuZXhwb3J0cy5nZXRQYXR0ZXJuUGFydHMgPSBnZXRQYXR0ZXJuUGFydHM7XG5mdW5jdGlvbiBtYWtlUmUocGF0dGVybiwgb3B0aW9ucykge1xuICAgIHJldHVybiBtaWNyb21hdGNoLm1ha2VSZShwYXR0ZXJuLCBvcHRpb25zKTtcbn1cbmV4cG9ydHMubWFrZVJlID0gbWFrZVJlO1xuZnVuY3Rpb24gY29udmVydFBhdHRlcm5zVG9SZShwYXR0ZXJucywgb3B0aW9ucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IG1ha2VSZShwYXR0ZXJuLCBvcHRpb25zKSk7XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvUmUgPSBjb252ZXJ0UGF0dGVybnNUb1JlO1xuZnVuY3Rpb24gbWF0Y2hBbnkoZW50cnksIHBhdHRlcm5zUmUpIHtcbiAgICByZXR1cm4gcGF0dGVybnNSZS5zb21lKChwYXR0ZXJuUmUpID0+IHBhdHRlcm5SZS50ZXN0KGVudHJ5KSk7XG59XG5leHBvcnRzLm1hdGNoQW55ID0gbWF0Y2hBbnk7XG4vKipcbiAqIFRoaXMgcGFja2FnZSBvbmx5IHdvcmtzIHdpdGggZm9yd2FyZCBzbGFzaGVzIGFzIGEgcGF0aCBzZXBhcmF0b3IuXG4gKiBCZWNhdXNlIG9mIHRoaXMsIHdlIGNhbm5vdCB1c2UgdGhlIHN0YW5kYXJkIGBwYXRoLm5vcm1hbGl6ZWAgbWV0aG9kLCBiZWNhdXNlIG9uIFdpbmRvd3MgcGxhdGZvcm0gaXQgd2lsbCB1c2Ugb2YgYmFja3NsYXNoZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoRE9VQkxFX1NMQVNIX1JFLCAnLycpO1xufVxuZXhwb3J0cy5yZW1vdmVEdXBsaWNhdGVTbGFzaGVzID0gcmVtb3ZlRHVwbGljYXRlU2xhc2hlcztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWVyZ2UgPSB2b2lkIDA7XG5jb25zdCBtZXJnZTIgPSByZXF1aXJlKFwibWVyZ2UyXCIpO1xuZnVuY3Rpb24gbWVyZ2Uoc3RyZWFtcykge1xuICAgIGNvbnN0IG1lcmdlZFN0cmVhbSA9IG1lcmdlMihzdHJlYW1zKTtcbiAgICBzdHJlYW1zLmZvckVhY2goKHN0cmVhbSkgPT4ge1xuICAgICAgICBzdHJlYW0ub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IG1lcmdlZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG4gICAgfSk7XG4gICAgbWVyZ2VkU3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4gcHJvcGFnYXRlQ2xvc2VFdmVudFRvU291cmNlcyhzdHJlYW1zKSk7XG4gICAgbWVyZ2VkU3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykpO1xuICAgIHJldHVybiBtZXJnZWRTdHJlYW07XG59XG5leHBvcnRzLm1lcmdlID0gbWVyZ2U7XG5mdW5jdGlvbiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpIHtcbiAgICBzdHJlYW1zLmZvckVhY2goKHN0cmVhbSkgPT4gc3RyZWFtLmVtaXQoJ2Nsb3NlJykpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0VtcHR5ID0gZXhwb3J0cy5pc1N0cmluZyA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzU3RyaW5nKGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5mdW5jdGlvbiBpc0VtcHR5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0ID09PSAnJztcbn1cbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0cmluZyA9IGV4cG9ydHMuc3RyZWFtID0gZXhwb3J0cy5wYXR0ZXJuID0gZXhwb3J0cy5wYXRoID0gZXhwb3J0cy5mcyA9IGV4cG9ydHMuZXJybm8gPSBleHBvcnRzLmFycmF5ID0gdm9pZCAwO1xuY29uc3QgYXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheVwiKTtcbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmNvbnN0IGVycm5vID0gcmVxdWlyZShcIi4vZXJybm9cIik7XG5leHBvcnRzLmVycm5vID0gZXJybm87XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2ZzXCIpO1xuZXhwb3J0cy5mcyA9IGZzO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCIuL3BhdGhcIik7XG5leHBvcnRzLnBhdGggPSBwYXRoO1xuY29uc3QgcGF0dGVybiA9IHJlcXVpcmUoXCIuL3BhdHRlcm5cIik7XG5leHBvcnRzLnBhdHRlcm4gPSBwYXR0ZXJuO1xuY29uc3Qgc3RyZWFtID0gcmVxdWlyZShcIi4vc3RyZWFtXCIpO1xuZXhwb3J0cy5zdHJlYW0gPSBzdHJlYW07XG5jb25zdCBzdHJpbmcgPSByZXF1aXJlKFwiLi9zdHJpbmdcIik7XG5leHBvcnRzLnN0cmluZyA9IHN0cmluZztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzID0gZXhwb3J0cy5ncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5ID0gZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZSA9IGV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9UYXNrcyA9IGV4cG9ydHMuZ2VuZXJhdGUgPSB2b2lkIDA7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmZ1bmN0aW9uIGdlbmVyYXRlKGlucHV0LCBzZXR0aW5ncykge1xuICAgIGNvbnN0IHBhdHRlcm5zID0gcHJvY2Vzc1BhdHRlcm5zKGlucHV0LCBzZXR0aW5ncyk7XG4gICAgY29uc3QgaWdub3JlID0gcHJvY2Vzc1BhdHRlcm5zKHNldHRpbmdzLmlnbm9yZSwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHBvc2l0aXZlUGF0dGVybnMgPSBnZXRQb3NpdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKTtcbiAgICBjb25zdCBuZWdhdGl2ZVBhdHRlcm5zID0gZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUocGF0dGVybnMsIGlnbm9yZSk7XG4gICAgY29uc3Qgc3RhdGljUGF0dGVybnMgPSBwb3NpdGl2ZVBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gdXRpbHMucGF0dGVybi5pc1N0YXRpY1BhdHRlcm4ocGF0dGVybiwgc2V0dGluZ3MpKTtcbiAgICBjb25zdCBkeW5hbWljUGF0dGVybnMgPSBwb3NpdGl2ZVBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIHNldHRpbmdzKSk7XG4gICAgY29uc3Qgc3RhdGljVGFza3MgPSBjb252ZXJ0UGF0dGVybnNUb1Rhc2tzKHN0YXRpY1BhdHRlcm5zLCBuZWdhdGl2ZVBhdHRlcm5zLCAvKiBkeW5hbWljICovIGZhbHNlKTtcbiAgICBjb25zdCBkeW5hbWljVGFza3MgPSBjb252ZXJ0UGF0dGVybnNUb1Rhc2tzKGR5bmFtaWNQYXR0ZXJucywgbmVnYXRpdmVQYXR0ZXJucywgLyogZHluYW1pYyAqLyB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGljVGFza3MuY29uY2F0KGR5bmFtaWNUYXNrcyk7XG59XG5leHBvcnRzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5mdW5jdGlvbiBwcm9jZXNzUGF0dGVybnMoaW5wdXQsIHNldHRpbmdzKSB7XG4gICAgbGV0IHBhdHRlcm5zID0gaW5wdXQ7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHBhdHRlcm4gbGlrZSBgeywqLCoqLGEvKn1gIGNhbiBsZWFkIHRvIHByb2JsZW1zIGNoZWNraW5nIHRoZSBkZXB0aCB3aGVuIG1hdGNoaW5nIGVudHJ5XG4gICAgICogYW5kIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgbWljcm9tYXRjaCBwYWNrYWdlIChzZWUgZmFzdC1nbG9iIGlzc3VlczogIzM2NSwgIzM5NCkuXG4gICAgICpcbiAgICAgKiBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHdlIGV4cGFuZCBhbGwgcGF0dGVybnMgY29udGFpbmluZyBicmFjZSBleHBhbnNpb24uIFRoaXMgY2FuIGxlYWQgdG8gYSBzbGlnaHQgc2xvd2Rvd25cbiAgICAgKiBpbiBtYXRjaGluZyBpbiB0aGUgY2FzZSBvZiBhIGxhcmdlIHNldCBvZiBwYXR0ZXJucyBhZnRlciBleHBhbnNpb24uXG4gICAgICovXG4gICAgaWYgKHNldHRpbmdzLmJyYWNlRXhwYW5zaW9uKSB7XG4gICAgICAgIHBhdHRlcm5zID0gdXRpbHMucGF0dGVybi5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbihwYXR0ZXJucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBgYmFzZU5hbWVNYXRjaGAgb3B0aW9uIGlzIGVuYWJsZWQsIHdlIG11c3QgYWRkIGdsb2JzdGFyIHRvIHBhdHRlcm5zLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWRcbiAgICAgKiBhdCBhbnkgbmVzdGluZyBsZXZlbC5cbiAgICAgKlxuICAgICAqIFdlIGRvIHRoaXMgaGVyZSwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgaGF2ZSB0byBjb21wbGljYXRlIHRoZSBmaWx0ZXJpbmcgbG9naWMuIEZvciBleGFtcGxlLCB3ZSBuZWVkIHRvIGNoYW5nZVxuICAgICAqIHRoZSBwYXR0ZXJuIGluIHRoZSBmaWx0ZXIgYmVmb3JlIGNyZWF0aW5nIGEgcmVndWxhciBleHByZXNzaW9uLiBUaGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSB0aGUgcGF0dGVybnNcbiAgICAgKiBpbiB0aGUgYXBwbGljYXRpb24uIE9ubHkgb24gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIGlmIChzZXR0aW5ncy5iYXNlTmFtZU1hdGNoKSB7XG4gICAgICAgIHBhdHRlcm5zID0gcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCcvJykgPyBwYXR0ZXJuIDogYCoqLyR7cGF0dGVybn1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYWxzbyByZW1vdmVzIGR1cGxpY2F0ZSBzbGFzaGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBpbiB0aGUgcGF0dGVybiBvciBmb3JtZWQgYXMgYSByZXN1bHQgb2YgZXhwYW5zaW9uLlxuICAgICAqL1xuICAgIHJldHVybiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHV0aWxzLnBhdHRlcm4ucmVtb3ZlRHVwbGljYXRlU2xhc2hlcyhwYXR0ZXJuKSk7XG59XG4vKipcbiAqIFJldHVybnMgdGFza3MgZ3JvdXBlZCBieSBiYXNpYyBwYXR0ZXJuIGRpcmVjdG9yaWVzLlxuICpcbiAqIFBhdHRlcm5zIHRoYXQgY2FuIGJlIGZvdW5kIGluc2lkZSAoYC4vYCkgYW5kIG91dHNpZGUgKGAuLi9gKSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXJlIGhhbmRsZWQgc2VwYXJhdGVseS5cbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZGlyZWN0b3J5IHRyYXZlcnNhbCBzdGFydHMgYXQgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCBnb2VzIGRlZXBlci5cbiAqL1xuZnVuY3Rpb24gY29udmVydFBhdHRlcm5zVG9UYXNrcyhwb3NpdGl2ZSwgbmVnYXRpdmUsIGR5bmFtaWMpIHtcbiAgICBjb25zdCB0YXNrcyA9IFtdO1xuICAgIGNvbnN0IHBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkgPSB1dGlscy5wYXR0ZXJuLmdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkocG9zaXRpdmUpO1xuICAgIGNvbnN0IHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IHV0aWxzLnBhdHRlcm4uZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBvc2l0aXZlKTtcbiAgICBjb25zdCBvdXRzaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeShwYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KTtcbiAgICBjb25zdCBpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAgPSBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5KHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSk7XG4gICAgdGFza3MucHVzaCguLi5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3Mob3V0c2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCwgbmVnYXRpdmUsIGR5bmFtaWMpKTtcbiAgICAvKlxuICAgICAqIEZvciB0aGUgc2FrZSBvZiByZWR1Y2luZyBmdXR1cmUgYWNjZXNzZXMgdG8gdGhlIGZpbGUgc3lzdGVtLCB3ZSBtZXJnZSBhbGwgdGFza3Mgd2l0aGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuICAgICAqIGludG8gYSBnbG9iYWwgdGFzaywgaWYgYXQgbGVhc3Qgb25lIHBhdHRlcm4gcmVmZXJzIHRvIHRoZSByb290IChgLmApLiBJbiB0aGlzIGNhc2UsIHRoZSBnbG9iYWwgdGFzayBjb3ZlcnMgdGhlIHJlc3QuXG4gICAgICovXG4gICAgaWYgKCcuJyBpbiBpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXApIHtcbiAgICAgICAgdGFza3MucHVzaChjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKCcuJywgcGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5LCBuZWdhdGl2ZSwgZHluYW1pYykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFza3MucHVzaCguLi5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3MoaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwLCBuZWdhdGl2ZSwgZHluYW1pYykpO1xuICAgIH1cbiAgICByZXR1cm4gdGFza3M7XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvVGFza3MgPSBjb252ZXJ0UGF0dGVybnNUb1Rhc2tzO1xuZnVuY3Rpb24gZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xuICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpO1xufVxuZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZ2V0UG9zaXRpdmVQYXR0ZXJucztcbmZ1bmN0aW9uIGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlKHBhdHRlcm5zLCBpZ25vcmUpIHtcbiAgICBjb25zdCBuZWdhdGl2ZSA9IHV0aWxzLnBhdHRlcm4uZ2V0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucykuY29uY2F0KGlnbm9yZSk7XG4gICAgY29uc3QgcG9zaXRpdmUgPSBuZWdhdGl2ZS5tYXAodXRpbHMucGF0dGVybi5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4pO1xuICAgIHJldHVybiBwb3NpdGl2ZTtcbn1cbmV4cG9ydHMuZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUgPSBnZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZTtcbmZ1bmN0aW9uIGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkocGF0dGVybnMpIHtcbiAgICBjb25zdCBncm91cCA9IHt9O1xuICAgIHJldHVybiBwYXR0ZXJucy5yZWR1Y2UoKGNvbGxlY3Rpb24sIHBhdHRlcm4pID0+IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHV0aWxzLnBhdHRlcm4uZ2V0QmFzZURpcmVjdG9yeShwYXR0ZXJuKTtcbiAgICAgICAgaWYgKGJhc2UgaW4gY29sbGVjdGlvbikge1xuICAgICAgICAgICAgY29sbGVjdGlvbltiYXNlXS5wdXNoKHBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29sbGVjdGlvbltiYXNlXSA9IFtwYXR0ZXJuXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9LCBncm91cCk7XG59XG5leHBvcnRzLmdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkgPSBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5O1xuZnVuY3Rpb24gY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzKHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwb3NpdGl2ZSkubWFwKChiYXNlKSA9PiB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKGJhc2UsIHBvc2l0aXZlW2Jhc2VdLCBuZWdhdGl2ZSwgZHluYW1pYyk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyA9IGNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcztcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2soYmFzZSwgcG9zaXRpdmUsIG5lZ2F0aXZlLCBkeW5hbWljKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZHluYW1pYyxcbiAgICAgICAgcG9zaXRpdmUsXG4gICAgICAgIG5lZ2F0aXZlLFxuICAgICAgICBiYXNlLFxuICAgICAgICBwYXR0ZXJuczogW10uY29uY2F0KHBvc2l0aXZlLCBuZWdhdGl2ZS5tYXAodXRpbHMucGF0dGVybi5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4pKVxuICAgIH07XG59XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2sgPSBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuZnVuY3Rpb24gcmVhZChwYXRoLCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBzZXR0aW5ncy5mcy5sc3RhdChwYXRoLCAobHN0YXRFcnJvciwgbHN0YXQpID0+IHtcbiAgICAgICAgaWYgKGxzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGxzdGF0RXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbHN0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCAhc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBsc3RhdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3MuZnMuc3RhdChwYXRoLCAoc3RhdEVycm9yLCBzdGF0KSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBzdGF0RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGxzdGF0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MubWFya1N5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgIHN0YXQuaXNTeW1ib2xpY0xpbmsgPSAoKSA9PiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgc3RhdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xufVxuZnVuY3Rpb24gY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgcmVzdWx0KSB7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJlYWQocGF0aCwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBsc3RhdCA9IHNldHRpbmdzLmZzLmxzdGF0U3luYyhwYXRoKTtcbiAgICBpZiAoIWxzdGF0LmlzU3ltYm9saWNMaW5rKCkgfHwgIXNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGluaykge1xuICAgICAgICByZXR1cm4gbHN0YXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXQgPSBzZXR0aW5ncy5mcy5zdGF0U3luYyhwYXRoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLm1hcmtTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgIHN0YXQuaXNTeW1ib2xpY0xpbmsgPSAoKSA9PiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgIHJldHVybiBsc3RhdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5leHBvcnRzLnJlYWQgPSByZWFkO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0ge1xuICAgIGxzdGF0OiBmcy5sc3RhdCxcbiAgICBzdGF0OiBmcy5zdGF0LFxuICAgIGxzdGF0U3luYzogZnMubHN0YXRTeW5jLFxuICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luY1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKGZzTWV0aG9kcykge1xuICAgIGlmIChmc01ldGhvZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIpLCBmc01ldGhvZHMpO1xufVxuZXhwb3J0cy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlciA9IGNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9hZGFwdGVycy9mc1wiKTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZnMgPSBmcy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlcih0aGlzLl9vcHRpb25zLmZzKTtcbiAgICAgICAgdGhpcy5tYXJrU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5tYXJrU3ltYm9saWNMaW5rLCBmYWxzZSk7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmssIHRydWUpO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDogdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0YXRTeW5jID0gZXhwb3J0cy5zdGF0ID0gZXhwb3J0cy5TZXR0aW5ncyA9IHZvaWQgMDtcbmNvbnN0IGFzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL2FzeW5jXCIpO1xuY29uc3Qgc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuZXhwb3J0cy5TZXR0aW5ncyA9IHNldHRpbmdzXzEuZGVmYXVsdDtcbmZ1bmN0aW9uIHN0YXQocGF0aCwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3MoKSwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayksIGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMuc3RhdCA9IHN0YXQ7XG5mdW5jdGlvbiBzdGF0U3luYyhwYXRoLCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIHJldHVybiBzeW5jLnJlYWQocGF0aCwgc2V0dGluZ3MpO1xufVxuZXhwb3J0cy5zdGF0U3luYyA9IHN0YXRTeW5jO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3Moc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gc2V0dGluZ3NPck9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KHNldHRpbmdzT3JPcHRpb25zKTtcbn1cbiIsICIvKiEgcXVldWUtbWljcm90YXNrLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5sZXQgcHJvbWlzZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJ1xuICA/IHF1ZXVlTWljcm90YXNrLmJpbmQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpXG4gIC8vIHJldXNlIHJlc29sdmVkIHByb21pc2UsIGFuZCBhbGxvY2F0ZSBpdCBsYXppbHlcbiAgOiBjYiA9PiAocHJvbWlzZSB8fCAocHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpKSlcbiAgICAudGhlbihjYilcbiAgICAuY2F0Y2goZXJyID0+IHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlcnIgfSwgMCkpXG4iLCAiLyohIHJ1bi1wYXJhbGxlbC4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xubW9kdWxlLmV4cG9ydHMgPSBydW5QYXJhbGxlbFxuXG5jb25zdCBxdWV1ZU1pY3JvdGFzayA9IHJlcXVpcmUoJ3F1ZXVlLW1pY3JvdGFzaycpXG5cbmZ1bmN0aW9uIHJ1blBhcmFsbGVsICh0YXNrcywgY2IpIHtcbiAgbGV0IHJlc3VsdHMsIHBlbmRpbmcsIGtleXNcbiAgbGV0IGlzU3luYyA9IHRydWVcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0YXNrcykpIHtcbiAgICByZXN1bHRzID0gW11cbiAgICBwZW5kaW5nID0gdGFza3MubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHRhc2tzKVxuICAgIHJlc3VsdHMgPSB7fVxuICAgIHBlbmRpbmcgPSBrZXlzLmxlbmd0aFxuICB9XG5cbiAgZnVuY3Rpb24gZG9uZSAoZXJyKSB7XG4gICAgZnVuY3Rpb24gZW5kICgpIHtcbiAgICAgIGlmIChjYikgY2IoZXJyLCByZXN1bHRzKVxuICAgICAgY2IgPSBudWxsXG4gICAgfVxuICAgIGlmIChpc1N5bmMpIHF1ZXVlTWljcm90YXNrKGVuZClcbiAgICBlbHNlIGVuZCgpXG4gIH1cblxuICBmdW5jdGlvbiBlYWNoIChpLCBlcnIsIHJlc3VsdCkge1xuICAgIHJlc3VsdHNbaV0gPSByZXN1bHRcbiAgICBpZiAoLS1wZW5kaW5nID09PSAwIHx8IGVycikge1xuICAgICAgZG9uZShlcnIpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFwZW5kaW5nKSB7XG4gICAgLy8gZW1wdHlcbiAgICBkb25lKG51bGwpXG4gIH0gZWxzZSBpZiAoa2V5cykge1xuICAgIC8vIG9iamVjdFxuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB0YXNrc1trZXldKGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyBlYWNoKGtleSwgZXJyLCByZXN1bHQpIH0pXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICAvLyBhcnJheVxuICAgIHRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2ssIGkpIHtcbiAgICAgIHRhc2soZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7IGVhY2goaSwgZXJyLCByZXN1bHQpIH0pXG4gICAgfSlcbiAgfVxuXG4gIGlzU3luYyA9IGZhbHNlXG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMgPSB2b2lkIDA7XG5jb25zdCBOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUUyA9IHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdCgnLicpO1xuaWYgKE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzBdID09PSB1bmRlZmluZWQgfHwgTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMV0gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBiZWhhdmlvci4gVGhlICdwcm9jZXNzLnZlcnNpb25zLm5vZGUnIHZhcmlhYmxlIGhhcyBpbnZhbGlkIHZhbHVlOiAke3Byb2Nlc3MudmVyc2lvbnMubm9kZX1gKTtcbn1cbmNvbnN0IE1BSk9SX1ZFUlNJT04gPSBOdW1iZXIucGFyc2VJbnQoTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMF0sIDEwKTtcbmNvbnN0IE1JTk9SX1ZFUlNJT04gPSBOdW1iZXIucGFyc2VJbnQoTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMV0sIDEwKTtcbmNvbnN0IFNVUFBPUlRFRF9NQUpPUl9WRVJTSU9OID0gMTA7XG5jb25zdCBTVVBQT1JURURfTUlOT1JfVkVSU0lPTiA9IDEwO1xuY29uc3QgSVNfTUFUQ0hFRF9CWV9NQUpPUiA9IE1BSk9SX1ZFUlNJT04gPiBTVVBQT1JURURfTUFKT1JfVkVSU0lPTjtcbmNvbnN0IElTX01BVENIRURfQllfTUFKT1JfQU5EX01JTk9SID0gTUFKT1JfVkVSU0lPTiA9PT0gU1VQUE9SVEVEX01BSk9SX1ZFUlNJT04gJiYgTUlOT1JfVkVSU0lPTiA+PSBTVVBQT1JURURfTUlOT1JfVkVSU0lPTjtcbi8qKlxuICogSVMgYHRydWVgIGZvciBOb2RlLmpzIDEwLjEwIGFuZCBncmVhdGVyLlxuICovXG5leHBvcnRzLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMgPSBJU19NQVRDSEVEX0JZX01BSk9SIHx8IElTX01BVENIRURfQllfTUFKT1JfQU5EX01JTk9SO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSB2b2lkIDA7XG5jbGFzcyBEaXJlbnRGcm9tU3RhdHMge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHN0YXRzKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuaXNCbG9ja0RldmljZSA9IHN0YXRzLmlzQmxvY2tEZXZpY2UuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNDaGFyYWN0ZXJEZXZpY2UgPSBzdGF0cy5pc0NoYXJhY3RlckRldmljZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0RpcmVjdG9yeSA9IHN0YXRzLmlzRGlyZWN0b3J5LmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRklGTyA9IHN0YXRzLmlzRklGTy5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0ZpbGUgPSBzdGF0cy5pc0ZpbGUuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNTb2NrZXQgPSBzdGF0cy5pc1NvY2tldC5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc1N5bWJvbGljTGluayA9IHN0YXRzLmlzU3ltYm9saWNMaW5rLmJpbmQoc3RhdHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZURpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cykge1xuICAgIHJldHVybiBuZXcgRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKTtcbn1cbmV4cG9ydHMuY3JlYXRlRGlyZW50RnJvbVN0YXRzID0gY3JlYXRlRGlyZW50RnJvbVN0YXRzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5mcyA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcIi4vZnNcIik7XG5leHBvcnRzLmZzID0gZnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmpvaW5QYXRoU2VnbWVudHMgPSB2b2lkIDA7XG5mdW5jdGlvbiBqb2luUGF0aFNlZ21lbnRzKGEsIGIsIHNlcGFyYXRvcikge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3JyZWN0IGhhbmRsaW5nIG9mIGNhc2VzIHdoZW4gdGhlIGZpcnN0IHNlZ21lbnQgaXMgYSByb290IChgL2AsIGBDOi9gKSBvciBVTkMgcGF0aCAoYC8vPy9DOi9gKS5cbiAgICAgKi9cbiAgICBpZiAoYS5lbmRzV2l0aChzZXBhcmF0b3IpKSB7XG4gICAgICAgIHJldHVybiBhICsgYjtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyBzZXBhcmF0b3IgKyBiO1xufVxuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gam9pblBhdGhTZWdtZW50cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZGRpciA9IGV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSBleHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IHJwbCA9IHJlcXVpcmUoXCJydW4tcGFyYWxsZWxcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmZ1bmN0aW9uIHJlYWQoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXNldHRpbmdzLnN0YXRzICYmIGNvbnN0YW50c18xLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMpIHtcbiAgICAgICAgcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spO1xufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbmZ1bmN0aW9uIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgc2V0dGluZ3MuZnMucmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9LCAocmVhZGRpckVycm9yLCBkaXJlbnRzKSA9PiB7XG4gICAgICAgIGlmIChyZWFkZGlyRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJlYWRkaXJFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGRpcmVudHMubWFwKChkaXJlbnQpID0+ICh7XG4gICAgICAgICAgICBkaXJlbnQsXG4gICAgICAgICAgICBuYW1lOiBkaXJlbnQubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgZGlyZW50Lm5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKVxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICghc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcykge1xuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgZW50cmllcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFza3MgPSBlbnRyaWVzLm1hcCgoZW50cnkpID0+IG1ha2VScGxUYXNrRW50cnkoZW50cnksIHNldHRpbmdzKSk7XG4gICAgICAgIHJwbCh0YXNrcywgKHJwbEVycm9yLCBycGxFbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBpZiAocnBsRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBycGxFcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgcnBsRW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IHJlYWRkaXJXaXRoRmlsZVR5cGVzO1xuZnVuY3Rpb24gbWFrZVJwbFRhc2tFbnRyeShlbnRyeSwgc2V0dGluZ3MpIHtcbiAgICByZXR1cm4gKGRvbmUpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5kaXJlbnQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3MuZnMuc3RhdChlbnRyeS5wYXRoLCAoc3RhdEVycm9yLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZShzdGF0RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJ5LmRpcmVudCA9IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhlbnRyeS5uYW1lLCBzdGF0cyk7XG4gICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlYWRkaXIoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBzZXR0aW5ncy5mcy5yZWFkZGlyKGRpcmVjdG9yeSwgKHJlYWRkaXJFcnJvciwgbmFtZXMpID0+IHtcbiAgICAgICAgaWYgKHJlYWRkaXJFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcmVhZGRpckVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgbmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgZnNTdGF0LnN0YXQocGF0aCwgc2V0dGluZ3MuZnNTdGF0U2V0dGluZ3MsIChlcnJvciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZW50OiB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zdGF0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhdHMgPSBzdGF0cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBycGwodGFza3MsIChycGxFcnJvciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKHJwbEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcnBsRXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGVudHJpZXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpciA9IHJlYWRkaXI7XG5mdW5jdGlvbiBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHJlc3VsdCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWRkaXIgPSBleHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmZ1bmN0aW9uIHJlYWQoZGlyZWN0b3J5LCBzZXR0aW5ncykge1xuICAgIGlmICghc2V0dGluZ3Muc3RhdHMgJiYgY29uc3RhbnRzXzEuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUykge1xuICAgICAgICByZXR1cm4gcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIHJldHVybiByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbmZ1bmN0aW9uIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gc2V0dGluZ3MuZnMucmVhZGRpclN5bmMoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRpcmVudHMubWFwKChkaXJlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBkaXJlbnQsXG4gICAgICAgICAgICBuYW1lOiBkaXJlbnQubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgZGlyZW50Lm5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCkgJiYgc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IHNldHRpbmdzLmZzLnN0YXRTeW5jKGVudHJ5LnBhdGgpO1xuICAgICAgICAgICAgICAgIGVudHJ5LmRpcmVudCA9IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhlbnRyeS5uYW1lLCBzdGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gcmVhZGRpcldpdGhGaWxlVHlwZXM7XG5mdW5jdGlvbiByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBuYW1lcyA9IHNldHRpbmdzLmZzLnJlYWRkaXJTeW5jKGRpcmVjdG9yeSk7XG4gICAgcmV0dXJuIG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeVBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIG5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBmc1N0YXQuc3RhdFN5bmMoZW50cnlQYXRoLCBzZXR0aW5ncy5mc1N0YXRTZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGVudHJ5UGF0aCxcbiAgICAgICAgICAgIGRpcmVudDogdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2V0dGluZ3Muc3RhdHMpIHtcbiAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyID0gcmVhZGRpcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB2b2lkIDA7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHtcbiAgICBsc3RhdDogZnMubHN0YXQsXG4gICAgc3RhdDogZnMuc3RhdCxcbiAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcbiAgICBzdGF0U3luYzogZnMuc3RhdFN5bmMsXG4gICAgcmVhZGRpcjogZnMucmVhZGRpcixcbiAgICByZWFkZGlyU3luYzogZnMucmVhZGRpclN5bmNcbn07XG5mdW5jdGlvbiBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcihmc01ldGhvZHMpIHtcbiAgICBpZiAoZnNNZXRob2RzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUjtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSKSwgZnNNZXRob2RzKTtcbn1cbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9hZGFwdGVycy9mc1wiKTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmtzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmtzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZnMgPSBmcy5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlcih0aGlzLl9vcHRpb25zLmZzKTtcbiAgICAgICAgdGhpcy5wYXRoU2VnbWVudFNlcGFyYXRvciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsIHBhdGguc2VwKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3RhdHMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZnNTdGF0U2V0dGluZ3MgPSBuZXcgZnNTdGF0LlNldHRpbmdzKHtcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGluazogdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmtzLFxuICAgICAgICAgICAgZnM6IHRoaXMuZnMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDogdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNldHRpbmdzID0gZXhwb3J0cy5zY2FuZGlyU3luYyA9IGV4cG9ydHMuc2NhbmRpciA9IHZvaWQgMDtcbmNvbnN0IGFzeW5jID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL2FzeW5jXCIpO1xuY29uc3Qgc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuZXhwb3J0cy5TZXR0aW5ncyA9IHNldHRpbmdzXzEuZGVmYXVsdDtcbmZ1bmN0aW9uIHNjYW5kaXIocGF0aCwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3MoKSwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayksIGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMuc2NhbmRpciA9IHNjYW5kaXI7XG5mdW5jdGlvbiBzY2FuZGlyU3luYyhwYXRoLCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIHJldHVybiBzeW5jLnJlYWQocGF0aCwgc2V0dGluZ3MpO1xufVxuZXhwb3J0cy5zY2FuZGlyU3luYyA9IHNjYW5kaXJTeW5jO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3Moc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gc2V0dGluZ3NPck9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KHNldHRpbmdzT3JPcHRpb25zKTtcbn1cbiIsICIndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gcmV1c2lmeSAoQ29uc3RydWN0b3IpIHtcbiAgdmFyIGhlYWQgPSBuZXcgQ29uc3RydWN0b3IoKVxuICB2YXIgdGFpbCA9IGhlYWRcblxuICBmdW5jdGlvbiBnZXQgKCkge1xuICAgIHZhciBjdXJyZW50ID0gaGVhZFxuXG4gICAgaWYgKGN1cnJlbnQubmV4dCkge1xuICAgICAgaGVhZCA9IGN1cnJlbnQubmV4dFxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkID0gbmV3IENvbnN0cnVjdG9yKClcbiAgICAgIHRhaWwgPSBoZWFkXG4gICAgfVxuXG4gICAgY3VycmVudC5uZXh0ID0gbnVsbFxuXG4gICAgcmV0dXJuIGN1cnJlbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbGVhc2UgKG9iaikge1xuICAgIHRhaWwubmV4dCA9IG9ialxuICAgIHRhaWwgPSBvYmpcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0OiBnZXQsXG4gICAgcmVsZWFzZTogcmVsZWFzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmV1c2lmeVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxudmFyIHJldXNpZnkgPSByZXF1aXJlKCdyZXVzaWZ5JylcblxuZnVuY3Rpb24gZmFzdHF1ZXVlIChjb250ZXh0LCB3b3JrZXIsIGNvbmN1cnJlbmN5KSB7XG4gIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbmN1cnJlbmN5ID0gd29ya2VyXG4gICAgd29ya2VyID0gY29udGV4dFxuICAgIGNvbnRleHQgPSBudWxsXG4gIH1cblxuICBpZiAoY29uY3VycmVuY3kgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmYXN0cXVldWUgY29uY3VycmVuY3kgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpXG4gIH1cblxuICB2YXIgY2FjaGUgPSByZXVzaWZ5KFRhc2spXG4gIHZhciBxdWV1ZUhlYWQgPSBudWxsXG4gIHZhciBxdWV1ZVRhaWwgPSBudWxsXG4gIHZhciBfcnVubmluZyA9IDBcbiAgdmFyIGVycm9ySGFuZGxlciA9IG51bGxcblxuICB2YXIgc2VsZiA9IHtcbiAgICBwdXNoOiBwdXNoLFxuICAgIGRyYWluOiBub29wLFxuICAgIHNhdHVyYXRlZDogbm9vcCxcbiAgICBwYXVzZTogcGF1c2UsXG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBjb25jdXJyZW5jeTogY29uY3VycmVuY3ksXG4gICAgcnVubmluZzogcnVubmluZyxcbiAgICByZXN1bWU6IHJlc3VtZSxcbiAgICBpZGxlOiBpZGxlLFxuICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgIGdldFF1ZXVlOiBnZXRRdWV1ZSxcbiAgICB1bnNoaWZ0OiB1bnNoaWZ0LFxuICAgIGVtcHR5OiBub29wLFxuICAgIGtpbGw6IGtpbGwsXG4gICAga2lsbEFuZERyYWluOiBraWxsQW5kRHJhaW4sXG4gICAgZXJyb3I6IGVycm9yXG4gIH1cblxuICByZXR1cm4gc2VsZlxuXG4gIGZ1bmN0aW9uIHJ1bm5pbmcgKCkge1xuICAgIHJldHVybiBfcnVubmluZ1xuICB9XG5cbiAgZnVuY3Rpb24gcGF1c2UgKCkge1xuICAgIHNlbGYucGF1c2VkID0gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gbGVuZ3RoICgpIHtcbiAgICB2YXIgY3VycmVudCA9IHF1ZXVlSGVhZFxuICAgIHZhciBjb3VudGVyID0gMFxuXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcbiAgICAgIGNvdW50ZXIrK1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudGVyXG4gIH1cblxuICBmdW5jdGlvbiBnZXRRdWV1ZSAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBxdWV1ZUhlYWRcbiAgICB2YXIgdGFza3MgPSBbXVxuXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIHRhc2tzLnB1c2goY3VycmVudC52YWx1ZSlcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcbiAgICB9XG5cbiAgICByZXR1cm4gdGFza3NcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZSAoKSB7XG4gICAgaWYgKCFzZWxmLnBhdXNlZCkgcmV0dXJuXG4gICAgc2VsZi5wYXVzZWQgPSBmYWxzZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5jb25jdXJyZW5jeTsgaSsrKSB7XG4gICAgICBfcnVubmluZysrXG4gICAgICByZWxlYXNlKClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpZGxlICgpIHtcbiAgICByZXR1cm4gX3J1bm5pbmcgPT09IDAgJiYgc2VsZi5sZW5ndGgoKSA9PT0gMFxuICB9XG5cbiAgZnVuY3Rpb24gcHVzaCAodmFsdWUsIGRvbmUpIHtcbiAgICB2YXIgY3VycmVudCA9IGNhY2hlLmdldCgpXG5cbiAgICBjdXJyZW50LmNvbnRleHQgPSBjb250ZXh0XG4gICAgY3VycmVudC5yZWxlYXNlID0gcmVsZWFzZVxuICAgIGN1cnJlbnQudmFsdWUgPSB2YWx1ZVxuICAgIGN1cnJlbnQuY2FsbGJhY2sgPSBkb25lIHx8IG5vb3BcbiAgICBjdXJyZW50LmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlclxuXG4gICAgaWYgKF9ydW5uaW5nID09PSBzZWxmLmNvbmN1cnJlbmN5IHx8IHNlbGYucGF1c2VkKSB7XG4gICAgICBpZiAocXVldWVUYWlsKSB7XG4gICAgICAgIHF1ZXVlVGFpbC5uZXh0ID0gY3VycmVudFxuICAgICAgICBxdWV1ZVRhaWwgPSBjdXJyZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUhlYWQgPSBjdXJyZW50XG4gICAgICAgIHF1ZXVlVGFpbCA9IGN1cnJlbnRcbiAgICAgICAgc2VsZi5zYXR1cmF0ZWQoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfcnVubmluZysrXG4gICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBjdXJyZW50LnZhbHVlLCBjdXJyZW50LndvcmtlZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1bnNoaWZ0ICh2YWx1ZSwgZG9uZSkge1xuICAgIHZhciBjdXJyZW50ID0gY2FjaGUuZ2V0KClcblxuICAgIGN1cnJlbnQuY29udGV4dCA9IGNvbnRleHRcbiAgICBjdXJyZW50LnJlbGVhc2UgPSByZWxlYXNlXG4gICAgY3VycmVudC52YWx1ZSA9IHZhbHVlXG4gICAgY3VycmVudC5jYWxsYmFjayA9IGRvbmUgfHwgbm9vcFxuXG4gICAgaWYgKF9ydW5uaW5nID09PSBzZWxmLmNvbmN1cnJlbmN5IHx8IHNlbGYucGF1c2VkKSB7XG4gICAgICBpZiAocXVldWVIZWFkKSB7XG4gICAgICAgIGN1cnJlbnQubmV4dCA9IHF1ZXVlSGVhZFxuICAgICAgICBxdWV1ZUhlYWQgPSBjdXJyZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUhlYWQgPSBjdXJyZW50XG4gICAgICAgIHF1ZXVlVGFpbCA9IGN1cnJlbnRcbiAgICAgICAgc2VsZi5zYXR1cmF0ZWQoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfcnVubmluZysrXG4gICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBjdXJyZW50LnZhbHVlLCBjdXJyZW50LndvcmtlZClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWxlYXNlIChob2xkZXIpIHtcbiAgICBpZiAoaG9sZGVyKSB7XG4gICAgICBjYWNoZS5yZWxlYXNlKGhvbGRlcilcbiAgICB9XG4gICAgdmFyIG5leHQgPSBxdWV1ZUhlYWRcbiAgICBpZiAobmV4dCkge1xuICAgICAgaWYgKCFzZWxmLnBhdXNlZCkge1xuICAgICAgICBpZiAocXVldWVUYWlsID09PSBxdWV1ZUhlYWQpIHtcbiAgICAgICAgICBxdWV1ZVRhaWwgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcXVldWVIZWFkID0gbmV4dC5uZXh0XG4gICAgICAgIG5leHQubmV4dCA9IG51bGxcbiAgICAgICAgd29ya2VyLmNhbGwoY29udGV4dCwgbmV4dC52YWx1ZSwgbmV4dC53b3JrZWQpXG4gICAgICAgIGlmIChxdWV1ZVRhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICBzZWxmLmVtcHR5KClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3J1bm5pbmctLVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoLS1fcnVubmluZyA9PT0gMCkge1xuICAgICAgc2VsZi5kcmFpbigpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24ga2lsbCAoKSB7XG4gICAgcXVldWVIZWFkID0gbnVsbFxuICAgIHF1ZXVlVGFpbCA9IG51bGxcbiAgICBzZWxmLmRyYWluID0gbm9vcFxuICB9XG5cbiAgZnVuY3Rpb24ga2lsbEFuZERyYWluICgpIHtcbiAgICBxdWV1ZUhlYWQgPSBudWxsXG4gICAgcXVldWVUYWlsID0gbnVsbFxuICAgIHNlbGYuZHJhaW4oKVxuICAgIHNlbGYuZHJhaW4gPSBub29wXG4gIH1cblxuICBmdW5jdGlvbiBlcnJvciAoaGFuZGxlcikge1xuICAgIGVycm9ySGFuZGxlciA9IGhhbmRsZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIFRhc2sgKCkge1xuICB0aGlzLnZhbHVlID0gbnVsbFxuICB0aGlzLmNhbGxiYWNrID0gbm9vcFxuICB0aGlzLm5leHQgPSBudWxsXG4gIHRoaXMucmVsZWFzZSA9IG5vb3BcbiAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICB0aGlzLmVycm9ySGFuZGxlciA9IG51bGxcblxuICB2YXIgc2VsZiA9IHRoaXNcblxuICB0aGlzLndvcmtlZCA9IGZ1bmN0aW9uIHdvcmtlZCAoZXJyLCByZXN1bHQpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBzZWxmLmNhbGxiYWNrXG4gICAgdmFyIGVycm9ySGFuZGxlciA9IHNlbGYuZXJyb3JIYW5kbGVyXG4gICAgdmFyIHZhbCA9IHNlbGYudmFsdWVcbiAgICBzZWxmLnZhbHVlID0gbnVsbFxuICAgIHNlbGYuY2FsbGJhY2sgPSBub29wXG4gICAgaWYgKHNlbGYuZXJyb3JIYW5kbGVyKSB7XG4gICAgICBlcnJvckhhbmRsZXIoZXJyLCB2YWwpXG4gICAgfVxuICAgIGNhbGxiYWNrLmNhbGwoc2VsZi5jb250ZXh0LCBlcnIsIHJlc3VsdClcbiAgICBzZWxmLnJlbGVhc2Uoc2VsZilcbiAgfVxufVxuXG5mdW5jdGlvbiBxdWV1ZUFzUHJvbWlzZWQgKGNvbnRleHQsIHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uY3VycmVuY3kgPSB3b3JrZXJcbiAgICB3b3JrZXIgPSBjb250ZXh0XG4gICAgY29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzeW5jV3JhcHBlciAoYXJnLCBjYikge1xuICAgIHdvcmtlci5jYWxsKHRoaXMsIGFyZylcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgY2IobnVsbCwgcmVzKVxuICAgICAgfSwgY2IpXG4gIH1cblxuICB2YXIgcXVldWUgPSBmYXN0cXVldWUoY29udGV4dCwgYXN5bmNXcmFwcGVyLCBjb25jdXJyZW5jeSlcblxuICB2YXIgcHVzaENiID0gcXVldWUucHVzaFxuICB2YXIgdW5zaGlmdENiID0gcXVldWUudW5zaGlmdFxuXG4gIHF1ZXVlLnB1c2ggPSBwdXNoXG4gIHF1ZXVlLnVuc2hpZnQgPSB1bnNoaWZ0XG4gIHF1ZXVlLmRyYWluZWQgPSBkcmFpbmVkXG5cbiAgcmV0dXJuIHF1ZXVlXG5cbiAgZnVuY3Rpb24gcHVzaCAodmFsdWUpIHtcbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHB1c2hDYih2YWx1ZSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgLy8gTGV0J3MgZm9yayB0aGUgcHJvbWlzZSBjaGFpbiB0b1xuICAgIC8vIG1ha2UgdGhlIGVycm9yIGJ1YmJsZSB1cCB0byB0aGUgdXNlciBidXRcbiAgICAvLyBub3QgbGVhZCB0byBhIHVuaGFuZGxlZFJlamVjdGlvblxuICAgIHAuY2F0Y2gobm9vcClcblxuICAgIHJldHVybiBwXG4gIH1cblxuICBmdW5jdGlvbiB1bnNoaWZ0ICh2YWx1ZSkge1xuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdW5zaGlmdENiKHZhbHVlLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBMZXQncyBmb3JrIHRoZSBwcm9taXNlIGNoYWluIHRvXG4gICAgLy8gbWFrZSB0aGUgZXJyb3IgYnViYmxlIHVwIHRvIHRoZSB1c2VyIGJ1dFxuICAgIC8vIG5vdCBsZWFkIHRvIGEgdW5oYW5kbGVkUmVqZWN0aW9uXG4gICAgcC5jYXRjaChub29wKVxuXG4gICAgcmV0dXJuIHBcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYWluZWQgKCkge1xuICAgIGlmIChxdWV1ZS5pZGxlKCkpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzRHJhaW4gPSBxdWV1ZS5kcmFpblxuXG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcXVldWUuZHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZpb3VzRHJhaW4oKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHBcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhc3RxdWV1ZVxubW9kdWxlLmV4cG9ydHMucHJvbWlzZSA9IHF1ZXVlQXNQcm9taXNlZFxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gZXhwb3J0cy5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IgPSBleHBvcnRzLmlzQXBwbGllZEZpbHRlciA9IGV4cG9ydHMuaXNGYXRhbEVycm9yID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNGYXRhbEVycm9yKHNldHRpbmdzLCBlcnJvcikge1xuICAgIGlmIChzZXR0aW5ncy5lcnJvckZpbHRlciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICFzZXR0aW5ncy5lcnJvckZpbHRlcihlcnJvcik7XG59XG5leHBvcnRzLmlzRmF0YWxFcnJvciA9IGlzRmF0YWxFcnJvcjtcbmZ1bmN0aW9uIGlzQXBwbGllZEZpbHRlcihmaWx0ZXIsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIodmFsdWUpO1xufVxuZXhwb3J0cy5pc0FwcGxpZWRGaWx0ZXIgPSBpc0FwcGxpZWRGaWx0ZXI7XG5mdW5jdGlvbiByZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IoZmlsZXBhdGgsIHNlcGFyYXRvcikge1xuICAgIHJldHVybiBmaWxlcGF0aC5zcGxpdCgvWy9cXFxcXS8pLmpvaW4oc2VwYXJhdG9yKTtcbn1cbmV4cG9ydHMucmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yID0gcmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yO1xuZnVuY3Rpb24gam9pblBhdGhTZWdtZW50cyhhLCBiLCBzZXBhcmF0b3IpIHtcbiAgICBpZiAoYSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb3JyZWN0IGhhbmRsaW5nIG9mIGNhc2VzIHdoZW4gdGhlIGZpcnN0IHNlZ21lbnQgaXMgYSByb290IChgL2AsIGBDOi9gKSBvciBVTkMgcGF0aCAoYC8vPy9DOi9gKS5cbiAgICAgKi9cbiAgICBpZiAoYS5lbmRzV2l0aChzZXBhcmF0b3IpKSB7XG4gICAgICAgIHJldHVybiBhICsgYjtcbiAgICB9XG4gICAgcmV0dXJuIGEgKyBzZXBhcmF0b3IgKyBiO1xufVxuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gam9pblBhdGhTZWdtZW50cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmNsYXNzIFJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yb290ID0gY29tbW9uLnJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvcihfcm9vdCwgX3NldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBmc1NjYW5kaXIgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc2NhbmRpclwiKTtcbmNvbnN0IGZhc3RxID0gcmVxdWlyZShcImZhc3RxXCIpO1xuY29uc3QgY29tbW9uID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jbGFzcyBBc3luY1JlYWRlciBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoX3Jvb3QsIF9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9zY2FuZGlyID0gZnNTY2FuZGlyLnNjYW5kaXI7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gZmFzdHEodGhpcy5fd29ya2VyLmJpbmQodGhpcyksIHRoaXMuX3NldHRpbmdzLmNvbmN1cnJlbmN5KTtcbiAgICAgICAgdGhpcy5faXNGYXRhbEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmRyYWluID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0ZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ2VuZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICB0aGlzLl9pc0ZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzLmJhc2VQYXRoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbWl0dGVyO1xuICAgIH1cbiAgICBnZXQgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Rlc3Ryb3llZDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZWFkZXIgaXMgYWxyZWFkeSBkZXN0cm95ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmtpbGxBbmREcmFpbigpO1xuICAgIH1cbiAgICBvbkVudHJ5KGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIub24oJ2VudHJ5JywgY2FsbGJhY2spO1xuICAgIH1cbiAgICBvbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIub25jZSgnZXJyb3InLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIG9uRW5kKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIub25jZSgnZW5kJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICBfcHVzaFRvUXVldWUoZGlyZWN0b3J5LCBiYXNlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IHsgZGlyZWN0b3J5LCBiYXNlIH07XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocXVldWVJdGVtLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF93b3JrZXIoaXRlbSwgZG9uZSkge1xuICAgICAgICB0aGlzLl9zY2FuZGlyKGl0ZW0uZGlyZWN0b3J5LCB0aGlzLl9zZXR0aW5ncy5mc1NjYW5kaXJTZXR0aW5ncywgKGVycm9yLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkb25lKGVycm9yLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVudHJ5KGVudHJ5LCBpdGVtLmJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9uZShudWxsLCB1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2hhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCAhY29tbW9uLmlzRmF0YWxFcnJvcih0aGlzLl9zZXR0aW5ncywgZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH1cbiAgICBfaGFuZGxlRW50cnkoZW50cnksIGJhc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8IHRoaXMuX2lzRmF0YWxFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gZW50cnkucGF0aDtcbiAgICAgICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkucGF0aCA9IGNvbW1vbi5qb2luUGF0aFNlZ21lbnRzKGJhc2UsIGVudHJ5Lm5hbWUsIHRoaXMuX3NldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5lbnRyeUZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RW50cnkoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmRlZXBGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUoZnVsbHBhdGgsIGJhc2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGVudHJ5LnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9lbWl0RW50cnkoZW50cnkpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KCdlbnRyeScsIGVudHJ5KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBBc3luY1JlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9hc3luY1wiKTtcbmNsYXNzIEFzeW5jUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcbiAgICB9XG4gICAgcmVhZChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVudHJ5KChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZS5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVuZCgoKSA9PiB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCB0aGlzLl9zdG9yYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQXN5bmNQcm92aWRlcjtcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xufVxuZnVuY3Rpb24gY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgZW50cmllcykge1xuICAgIGNhbGxiYWNrKG51bGwsIGVudHJpZXMpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL2FzeW5jXCIpO1xuY2xhc3MgU3RyZWFtUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3N0cmVhbSA9IG5ldyBzdHJlYW1fMS5SZWFkYWJsZSh7XG4gICAgICAgICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICAgICAgcmVhZDogKCkgPT4geyB9LFxuICAgICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcmVhZGVyLmlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRlci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbnRyeSgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmVhbS5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVuZCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0ucHVzaChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJlYW07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU3RyZWFtUHJvdmlkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBmc1NjYW5kaXIgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc2NhbmRpclwiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgU3luY1JlYWRlciBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9zY2FuZGlyID0gZnNTY2FuZGlyLnNjYW5kaXJTeW5jO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gW107XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZSh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncy5iYXNlUGF0aCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZVF1ZXVlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICAgIH1cbiAgICBfcHVzaFRvUXVldWUoZGlyZWN0b3J5LCBiYXNlKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmFkZCh7IGRpcmVjdG9yeSwgYmFzZSB9KTtcbiAgICB9XG4gICAgX2hhbmRsZVF1ZXVlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fcXVldWUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZURpcmVjdG9yeShpdGVtLmRpcmVjdG9yeSwgaXRlbS5iYXNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlRGlyZWN0b3J5KGRpcmVjdG9yeSwgYmFzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IHRoaXMuX3NjYW5kaXIoZGlyZWN0b3J5LCB0aGlzLl9zZXR0aW5ncy5mc1NjYW5kaXJTZXR0aW5ncyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFbnRyeShlbnRyeSwgYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICghY29tbW9uLmlzRmF0YWxFcnJvcih0aGlzLl9zZXR0aW5ncywgZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIF9oYW5kbGVFbnRyeShlbnRyeSwgYmFzZSkge1xuICAgICAgICBjb25zdCBmdWxscGF0aCA9IGVudHJ5LnBhdGg7XG4gICAgICAgIGlmIChiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhiYXNlLCBlbnRyeS5uYW1lLCB0aGlzLl9zZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZW50cnlGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvU3RvcmFnZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpICYmIGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZGVlcEZpbHRlciwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZShmdWxscGF0aCwgYmFzZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZW50cnkucGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3B1c2hUb1N0b3JhZ2UoZW50cnkpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5wdXNoKGVudHJ5KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTeW5jUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvc3luY1wiKTtcbmNsYXNzIFN5bmNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3luY18xLmRlZmF1bHQodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTeW5jUHJvdmlkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBmc1NjYW5kaXIgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc2NhbmRpclwiKTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYmFzZVBhdGgsIHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgICAgICB0aGlzLmRlZXBGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmRlZXBGaWx0ZXIsIG51bGwpO1xuICAgICAgICB0aGlzLmVudHJ5RmlsdGVyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5lbnRyeUZpbHRlciwgbnVsbCk7XG4gICAgICAgIHRoaXMuZXJyb3JGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmVycm9yRmlsdGVyLCBudWxsKTtcbiAgICAgICAgdGhpcy5wYXRoU2VnbWVudFNlcGFyYXRvciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsIHBhdGguc2VwKTtcbiAgICAgICAgdGhpcy5mc1NjYW5kaXJTZXR0aW5ncyA9IG5ldyBmc1NjYW5kaXIuU2V0dGluZ3Moe1xuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogdGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmtzLFxuICAgICAgICAgICAgZnM6IHRoaXMuX29wdGlvbnMuZnMsXG4gICAgICAgICAgICBwYXRoU2VnbWVudFNlcGFyYXRvcjogdGhpcy5fb3B0aW9ucy5wYXRoU2VnbWVudFNlcGFyYXRvcixcbiAgICAgICAgICAgIHN0YXRzOiB0aGlzLl9vcHRpb25zLnN0YXRzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGlua1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAhPT0gbnVsbCAmJiBvcHRpb24gIT09IHZvaWQgMCA/IG9wdGlvbiA6IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZXR0aW5ncyA9IGV4cG9ydHMud2Fsa1N0cmVhbSA9IGV4cG9ydHMud2Fsa1N5bmMgPSBleHBvcnRzLndhbGsgPSB2b2lkIDA7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL2FzeW5jXCIpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3RyZWFtXCIpO1xuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5leHBvcnRzLlNldHRpbmdzID0gc2V0dGluZ3NfMS5kZWZhdWx0O1xuZnVuY3Rpb24gd2FsayhkaXJlY3RvcnksIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuZXcgYXN5bmNfMS5kZWZhdWx0KGRpcmVjdG9yeSwgZ2V0U2V0dGluZ3MoKSkucmVhZChvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ldyBhc3luY18xLmRlZmF1bHQoZGlyZWN0b3J5LCBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spKS5yZWFkKGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMud2FsayA9IHdhbGs7XG5mdW5jdGlvbiB3YWxrU3luYyhkaXJlY3RvcnksIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5ncyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc3luY18xLmRlZmF1bHQoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnJlYWQoKTtcbn1cbmV4cG9ydHMud2Fsa1N5bmMgPSB3YWxrU3luYztcbmZ1bmN0aW9uIHdhbGtTdHJlYW0oZGlyZWN0b3J5LCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IHN0cmVhbV8xLmRlZmF1bHQoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnJlYWQoKTtcbn1cbmV4cG9ydHMud2Fsa1N0cmVhbSA9IHdhbGtTdHJlYW07XG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhzZXR0aW5nc09yT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHNldHRpbmdzT3JPcHRpb25zIGluc3RhbmNlb2Ygc2V0dGluZ3NfMS5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xLmRlZmF1bHQoc2V0dGluZ3NPck9wdGlvbnMpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcbmNsYXNzIFJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9mc1N0YXRTZXR0aW5ncyA9IG5ldyBmc1N0YXQuU2V0dGluZ3Moe1xuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rOiB0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzLFxuICAgICAgICAgICAgZnM6IHRoaXMuX3NldHRpbmdzLmZzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0RnVsbEVudHJ5UGF0aChmaWxlcGF0aCkge1xuICAgICAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLmN3ZCwgZmlsZXBhdGgpO1xuICAgIH1cbiAgICBfbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgbmFtZTogcGF0dGVybixcbiAgICAgICAgICAgIHBhdGg6IHBhdHRlcm4sXG4gICAgICAgICAgICBkaXJlbnQ6IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhwYXR0ZXJuLCBzdGF0cylcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnN0YXRzKSB7XG4gICAgICAgICAgICBlbnRyeS5zdGF0cyA9IHN0YXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gICAgX2lzRmF0YWxFcnJvcihlcnJvcikge1xuICAgICAgICByZXR1cm4gIXV0aWxzLmVycm5vLmlzRW5vZW50Q29kZUVycm9yKGVycm9yKSAmJiAhdGhpcy5fc2V0dGluZ3Muc3VwcHJlc3NFcnJvcnM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBmc1dhbGsgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMud2Fsa1wiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgUmVhZGVyU3RyZWFtIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3dhbGtTdHJlYW0gPSBmc1dhbGsud2Fsa1N0cmVhbTtcbiAgICAgICAgdGhpcy5fc3RhdCA9IGZzU3RhdC5zdGF0O1xuICAgIH1cbiAgICBkeW5hbWljKHJvb3QsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGtTdHJlYW0ocm9vdCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBmaWxlcGF0aHMgPSBwYXR0ZXJucy5tYXAodGhpcy5fZ2V0RnVsbEVudHJ5UGF0aCwgdGhpcyk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBzdHJlYW1fMS5QYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgICAgIHN0cmVhbS5fd3JpdGUgPSAoaW5kZXgsIF9lbmMsIGRvbmUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyeShmaWxlcGF0aHNbaW5kZXhdLCBwYXR0ZXJuc1tpbmRleF0sIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9PSBudWxsICYmIG9wdGlvbnMuZW50cnlGaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBmaWxlcGF0aHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGRvbmUpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVwYXRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfVxuICAgIF9nZXRFbnRyeShmaWxlcGF0aCwgcGF0dGVybiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U3RhdChmaWxlcGF0aClcbiAgICAgICAgICAgIC50aGVuKChzdGF0cykgPT4gdGhpcy5fbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVycm9yRmlsdGVyKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0U3RhdChmaWxlcGF0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdChmaWxlcGF0aCwgdGhpcy5fZnNTdGF0U2V0dGluZ3MsIChlcnJvciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgPT09IG51bGwgPyByZXNvbHZlKHN0YXRzKSA6IHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyU3RyZWFtO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNXYWxrID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLndhbGtcIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vc3RyZWFtXCIpO1xuY2xhc3MgUmVhZGVyQXN5bmMgZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fd2Fsa0FzeW5jID0gZnNXYWxrLndhbGs7XG4gICAgICAgIHRoaXMuX3JlYWRlclN0cmVhbSA9IG5ldyBzdHJlYW1fMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgZHluYW1pYyhyb290LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93YWxrQXN5bmMocm9vdCwgb3B0aW9ucywgKGVycm9yLCBlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW50cmllcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fcmVhZGVyU3RyZWFtLnN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucyk7XG4gICAgICAgIC8vIEFmdGVyICMyMzUsIHJlcGxhY2UgaXQgd2l0aCBhbiBhc3luY2hyb25vdXMgaXRlcmF0b3IuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdHJlYW0ub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgICAgICAgICAgc3RyZWFtLm9uKCdkYXRhJywgKGVudHJ5KSA9PiBlbnRyaWVzLnB1c2goZW50cnkpKTtcbiAgICAgICAgICAgIHN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiByZXNvbHZlKGVudHJpZXMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyQXN5bmM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNsYXNzIE1hdGNoZXIge1xuICAgIGNvbnN0cnVjdG9yKF9wYXR0ZXJucywgX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fcGF0dGVybnMgPSBfcGF0dGVybnM7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyA9IF9taWNyb21hdGNoT3B0aW9ucztcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IFtdO1xuICAgICAgICB0aGlzLl9maWxsU3RvcmFnZSgpO1xuICAgIH1cbiAgICBfZmlsbFN0b3JhZ2UoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0aGlzLl9wYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLl9nZXRQYXR0ZXJuU2VnbWVudHMocGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuX3NwbGl0U2VnbWVudHNJbnRvU2VjdGlvbnMoc2VnbWVudHMpO1xuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogc2VjdGlvbnMubGVuZ3RoIDw9IDEsXG4gICAgICAgICAgICAgICAgcGF0dGVybixcbiAgICAgICAgICAgICAgICBzZWdtZW50cyxcbiAgICAgICAgICAgICAgICBzZWN0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFBhdHRlcm5TZWdtZW50cyhwYXR0ZXJuKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdXRpbHMucGF0dGVybi5nZXRQYXR0ZXJuUGFydHMocGF0dGVybiwgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljID0gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHBhcnQsIHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgICAgIGlmICghZHluYW1pYykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXJ0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZHluYW1pYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXJ0LFxuICAgICAgICAgICAgICAgIHBhdHRlcm5SZTogdXRpbHMucGF0dGVybi5tYWtlUmUocGFydCwgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3NwbGl0U2VnbWVudHNJbnRvU2VjdGlvbnMoc2VnbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmFycmF5LnNwbGl0V2hlbihzZWdtZW50cywgKHNlZ21lbnQpID0+IHNlZ21lbnQuZHluYW1pYyAmJiB1dGlscy5wYXR0ZXJuLmhhc0dsb2JTdGFyKHNlZ21lbnQucGF0dGVybikpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE1hdGNoZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBtYXRjaGVyXzEgPSByZXF1aXJlKFwiLi9tYXRjaGVyXCIpO1xuY2xhc3MgUGFydGlhbE1hdGNoZXIgZXh0ZW5kcyBtYXRjaGVyXzEuZGVmYXVsdCB7XG4gICAgbWF0Y2goZmlsZXBhdGgpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBmaWxlcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBsZXZlbHMgPSBwYXJ0cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5fc3RvcmFnZS5maWx0ZXIoKGluZm8pID0+ICFpbmZvLmNvbXBsZXRlIHx8IGluZm8uc2VnbWVudHMubGVuZ3RoID4gbGV2ZWxzKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gcGF0dGVybi5zZWN0aW9uc1swXTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgcGF0dGVybiBoYXMgYSBnbG9ic3RhciBhbmQgd2UgbXVzdCByZWFkIGFsbCBkaXJlY3RvcmllcyB1bmNvbmRpdGlvbmFsbHksXG4gICAgICAgICAgICAgKiBidXQgb25seSBpZiB0aGUgbGV2ZWwgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgZ3JvdXAuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogZml4dHVyZXMve2EsYn0vKipcbiAgICAgICAgICAgICAqICBeIHRydWUvZmFsc2UgIF4gYWx3YXlzIHRydWVcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAoIXBhdHRlcm4uY29tcGxldGUgJiYgbGV2ZWxzID4gc2VjdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcGFydHMuZXZlcnkoKHBhcnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHBhdHRlcm4uc2VnbWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LmR5bmFtaWMgJiYgc2VnbWVudC5wYXR0ZXJuUmUudGVzdChwYXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZWdtZW50LmR5bmFtaWMgJiYgc2VnbWVudC5wYXR0ZXJuID09PSBwYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQYXJ0aWFsTWF0Y2hlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY29uc3QgcGFydGlhbF8xID0gcmVxdWlyZShcIi4uL21hdGNoZXJzL3BhcnRpYWxcIik7XG5jbGFzcyBEZWVwRmlsdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MsIF9taWNyb21hdGNoT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMgPSBfbWljcm9tYXRjaE9wdGlvbnM7XG4gICAgfVxuICAgIGdldEZpbHRlcihiYXNlUGF0aCwgcG9zaXRpdmUsIG5lZ2F0aXZlKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXIgPSB0aGlzLl9nZXRNYXRjaGVyKHBvc2l0aXZlKTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmVSZSA9IHRoaXMuX2dldE5lZ2F0aXZlUGF0dGVybnNSZShuZWdhdGl2ZSk7XG4gICAgICAgIHJldHVybiAoZW50cnkpID0+IHRoaXMuX2ZpbHRlcihiYXNlUGF0aCwgZW50cnksIG1hdGNoZXIsIG5lZ2F0aXZlUmUpO1xuICAgIH1cbiAgICBfZ2V0TWF0Y2hlcihwYXR0ZXJucykge1xuICAgICAgICByZXR1cm4gbmV3IHBhcnRpYWxfMS5kZWZhdWx0KHBhdHRlcm5zLCB0aGlzLl9zZXR0aW5ncywgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xuICAgIH1cbiAgICBfZ2V0TmVnYXRpdmVQYXR0ZXJuc1JlKHBhdHRlcm5zKSB7XG4gICAgICAgIGNvbnN0IGFmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIodXRpbHMucGF0dGVybi5pc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybik7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmNvbnZlcnRQYXR0ZXJuc1RvUmUoYWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJucywgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpO1xuICAgIH1cbiAgICBfZmlsdGVyKGJhc2VQYXRoLCBlbnRyeSwgbWF0Y2hlciwgbmVnYXRpdmVSZSkge1xuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkQnlEZWVwKGJhc2VQYXRoLCBlbnRyeS5wYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRTeW1ib2xpY0xpbmsoZW50cnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSB1dGlscy5wYXRoLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5LnBhdGgpO1xuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkQnlQb3NpdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1NraXBwZWRCeU5lZ2F0aXZlUGF0dGVybnMoZmlsZXBhdGgsIG5lZ2F0aXZlUmUpO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkQnlEZWVwKGJhc2VQYXRoLCBlbnRyeVBhdGgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF2b2lkIHVubmVjZXNzYXJ5IGRlcHRoIGNhbGN1bGF0aW9ucyB3aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmRlZXAgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJ5TGV2ZWwoYmFzZVBhdGgsIGVudHJ5UGF0aCkgPj0gdGhpcy5fc2V0dGluZ3MuZGVlcDtcbiAgICB9XG4gICAgX2dldEVudHJ5TGV2ZWwoYmFzZVBhdGgsIGVudHJ5UGF0aCkge1xuICAgICAgICBjb25zdCBlbnRyeVBhdGhEZXB0aCA9IGVudHJ5UGF0aC5zcGxpdCgnLycpLmxlbmd0aDtcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5UGF0aERlcHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoRGVwdGggPSBiYXNlUGF0aC5zcGxpdCgnLycpLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGVudHJ5UGF0aERlcHRoIC0gYmFzZVBhdGhEZXB0aDtcbiAgICB9XG4gICAgX2lzU2tpcHBlZFN5bWJvbGljTGluayhlbnRyeSkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MgJiYgZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCk7XG4gICAgfVxuICAgIF9pc1NraXBwZWRCeVBvc2l0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBtYXRjaGVyKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCAmJiAhbWF0Y2hlci5tYXRjaChlbnRyeVBhdGgpO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkQnlOZWdhdGl2ZVBhdHRlcm5zKGVudHJ5UGF0aCwgcGF0dGVybnNSZSkge1xuICAgICAgICByZXR1cm4gIXV0aWxzLnBhdHRlcm4ubWF0Y2hBbnkoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBEZWVwRmlsdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBFbnRyeUZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBnZXRGaWx0ZXIocG9zaXRpdmUsIG5lZ2F0aXZlKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlUmUgPSB1dGlscy5wYXR0ZXJuLmNvbnZlcnRQYXR0ZXJuc1RvUmUocG9zaXRpdmUsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmVSZSA9IHV0aWxzLnBhdHRlcm4uY29udmVydFBhdHRlcm5zVG9SZShuZWdhdGl2ZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyksIHsgZG90OiB0cnVlIH0pKTtcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fZmlsdGVyKGVudHJ5LCBwb3NpdGl2ZVJlLCBuZWdhdGl2ZVJlKTtcbiAgICB9XG4gICAgX2ZpbHRlcihlbnRyeSwgcG9zaXRpdmVSZSwgbmVnYXRpdmVSZSkge1xuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHV0aWxzLnBhdGgucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkucGF0aCk7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy51bmlxdWUgJiYgdGhpcy5faXNEdXBsaWNhdGVFbnRyeShmaWxlcGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb25seUZpbGVGaWx0ZXIoZW50cnkpIHx8IHRoaXMuX29ubHlEaXJlY3RvcnlGaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZEJ5QWJzb2x1dGVOZWdhdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBuZWdhdGl2ZVJlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XG4gICAgICAgIGNvbnN0IGlzTWF0Y2hlZCA9IHRoaXMuX2lzTWF0Y2hUb1BhdHRlcm5zKGZpbGVwYXRoLCBwb3NpdGl2ZVJlLCBpc0RpcmVjdG9yeSkgJiYgIXRoaXMuX2lzTWF0Y2hUb1BhdHRlcm5zKGZpbGVwYXRoLCBuZWdhdGl2ZVJlLCBpc0RpcmVjdG9yeSk7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy51bmlxdWUgJiYgaXNNYXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVJbmRleFJlY29yZChmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTWF0Y2hlZDtcbiAgICB9XG4gICAgX2lzRHVwbGljYXRlRW50cnkoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXguaGFzKGZpbGVwYXRoKTtcbiAgICB9XG4gICAgX2NyZWF0ZUluZGV4UmVjb3JkKGZpbGVwYXRoKSB7XG4gICAgICAgIHRoaXMuaW5kZXguc2V0KGZpbGVwYXRoLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBfb25seUZpbGVGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLm9ubHlGaWxlcyAmJiAhZW50cnkuZGlyZW50LmlzRmlsZSgpO1xuICAgIH1cbiAgICBfb25seURpcmVjdG9yeUZpbHRlcihlbnRyeSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3Mub25seURpcmVjdG9yaWVzICYmICFlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKTtcbiAgICB9XG4gICAgX2lzU2tpcHBlZEJ5QWJzb2x1dGVOZWdhdGl2ZVBhdHRlcm5zKGVudHJ5UGF0aCwgcGF0dGVybnNSZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzLmFic29sdXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSB1dGlscy5wYXRoLm1ha2VBYnNvbHV0ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIGVudHJ5UGF0aCk7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZ1bGxwYXRoLCBwYXR0ZXJuc1JlKTtcbiAgICB9XG4gICAgX2lzTWF0Y2hUb1BhdHRlcm5zKGZpbGVwYXRoLCBwYXR0ZXJuc1JlLCBpc0RpcmVjdG9yeSkge1xuICAgICAgICAvLyBUcnlpbmcgdG8gbWF0Y2ggZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGJ5IHBhdHRlcm5zLlxuICAgICAgICBjb25zdCBpc01hdGNoZWQgPSB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZpbGVwYXRoLCBwYXR0ZXJuc1JlKTtcbiAgICAgICAgLy8gQSBwYXR0ZXJuIHdpdGggYSB0cmFpbGxpbmcgc2xhc2ggY2FuIGJlIHVzZWQgZm9yIGRpcmVjdG9yeSBtYXRjaGluZy5cbiAgICAgICAgLy8gVG8gYXBwbHkgc3VjaCBwYXR0ZXJuLCB3ZSBuZWVkIHRvIGFkZCBhIHRyYWxsaW5nIHNsYXNoIHRvIHRoZSBwYXRoLlxuICAgICAgICBpZiAoIWlzTWF0Y2hlZCAmJiBpc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4ubWF0Y2hBbnkoZmlsZXBhdGggKyAnLycsIHBhdHRlcm5zUmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc01hdGNoZWQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRW50cnlGaWx0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNsYXNzIEVycm9yRmlsdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIChlcnJvcikgPT4gdGhpcy5faXNOb25GYXRhbEVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgX2lzTm9uRmF0YWxFcnJvcihlcnJvcikge1xuICAgICAgICByZXR1cm4gdXRpbHMuZXJybm8uaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpIHx8IHRoaXMuX3NldHRpbmdzLnN1cHByZXNzRXJyb3JzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVycm9yRmlsdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBFbnRyeVRyYW5zZm9ybWVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldFRyYW5zZm9ybWVyKCkge1xuICAgICAgICByZXR1cm4gKGVudHJ5KSA9PiB0aGlzLl90cmFuc2Zvcm0oZW50cnkpO1xuICAgIH1cbiAgICBfdHJhbnNmb3JtKGVudHJ5KSB7XG4gICAgICAgIGxldCBmaWxlcGF0aCA9IGVudHJ5LnBhdGg7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgZmlsZXBhdGggPSB1dGlscy5wYXRoLm1ha2VBYnNvbHV0ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIGZpbGVwYXRoKTtcbiAgICAgICAgICAgIGZpbGVwYXRoID0gdXRpbHMucGF0aC51bml4aWZ5KGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWFya0RpcmVjdG9yaWVzICYmIGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBmaWxlcGF0aCArPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5vYmplY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZXBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZW50cnkpLCB7IHBhdGg6IGZpbGVwYXRoIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVudHJ5VHJhbnNmb3JtZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBkZWVwXzEgPSByZXF1aXJlKFwiLi9maWx0ZXJzL2RlZXBcIik7XG5jb25zdCBlbnRyeV8xID0gcmVxdWlyZShcIi4vZmlsdGVycy9lbnRyeVwiKTtcbmNvbnN0IGVycm9yXzEgPSByZXF1aXJlKFwiLi9maWx0ZXJzL2Vycm9yXCIpO1xuY29uc3QgZW50cnlfMiA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybWVycy9lbnRyeVwiKTtcbmNsYXNzIFByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuZXJyb3JGaWx0ZXIgPSBuZXcgZXJyb3JfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5lbnRyeUZpbHRlciA9IG5ldyBlbnRyeV8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MsIHRoaXMuX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkpO1xuICAgICAgICB0aGlzLmRlZXBGaWx0ZXIgPSBuZXcgZGVlcF8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MsIHRoaXMuX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkpO1xuICAgICAgICB0aGlzLmVudHJ5VHJhbnNmb3JtZXIgPSBuZXcgZW50cnlfMi5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgX2dldFJvb3REaXJlY3RvcnkodGFzaykge1xuICAgICAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLmN3ZCwgdGFzay5iYXNlKTtcbiAgICB9XG4gICAgX2dldFJlYWRlck9wdGlvbnModGFzaykge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHRhc2suYmFzZSA9PT0gJy4nID8gJycgOiB0YXNrLmJhc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICAgIHBhdGhTZWdtZW50U2VwYXJhdG9yOiAnLycsXG4gICAgICAgICAgICBjb25jdXJyZW5jeTogdGhpcy5fc2V0dGluZ3MuY29uY3VycmVuY3ksXG4gICAgICAgICAgICBkZWVwRmlsdGVyOiB0aGlzLmRlZXBGaWx0ZXIuZ2V0RmlsdGVyKGJhc2VQYXRoLCB0YXNrLnBvc2l0aXZlLCB0YXNrLm5lZ2F0aXZlKSxcbiAgICAgICAgICAgIGVudHJ5RmlsdGVyOiB0aGlzLmVudHJ5RmlsdGVyLmdldEZpbHRlcih0YXNrLnBvc2l0aXZlLCB0YXNrLm5lZ2F0aXZlKSxcbiAgICAgICAgICAgIGVycm9yRmlsdGVyOiB0aGlzLmVycm9yRmlsdGVyLmdldEZpbHRlcigpLFxuICAgICAgICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLl9zZXR0aW5ncy5mcyxcbiAgICAgICAgICAgIHN0YXRzOiB0aGlzLl9zZXR0aW5ncy5zdGF0cyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLmVudHJ5VHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXIoKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBfZ2V0TWljcm9tYXRjaE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb3Q6IHRoaXMuX3NldHRpbmdzLmRvdCxcbiAgICAgICAgICAgIG1hdGNoQmFzZTogdGhpcy5fc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCxcbiAgICAgICAgICAgIG5vYnJhY2U6ICF0aGlzLl9zZXR0aW5ncy5icmFjZUV4cGFuc2lvbixcbiAgICAgICAgICAgIG5vY2FzZTogIXRoaXMuX3NldHRpbmdzLmNhc2VTZW5zaXRpdmVNYXRjaCxcbiAgICAgICAgICAgIG5vZXh0OiAhdGhpcy5fc2V0dGluZ3MuZXh0Z2xvYixcbiAgICAgICAgICAgIG5vZ2xvYnN0YXI6ICF0aGlzLl9zZXR0aW5ncy5nbG9ic3RhcixcbiAgICAgICAgICAgIHBvc2l4OiB0cnVlLFxuICAgICAgICAgICAgc3RyaWN0U2xhc2hlczogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9hc3luY1wiKTtcbmNvbnN0IHByb3ZpZGVyXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlclwiKTtcbmNsYXNzIFByb3ZpZGVyQXN5bmMgZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgYXN5bmNfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgYXN5bmMgcmVhZCh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9nZXRSb290RGlyZWN0b3J5KHRhc2spO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UmVhZGVyT3B0aW9ucyh0YXNrKTtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBvcHRpb25zLnRyYW5zZm9ybShlbnRyeSkpO1xuICAgIH1cbiAgICBhcGkocm9vdCwgdGFzaywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGFzay5keW5hbWljKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5zdGF0aWModGFzay5wYXR0ZXJucywgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXJBc3luYztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IHN0cmVhbV8yID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvc3RyZWFtXCIpO1xuY29uc3QgcHJvdmlkZXJfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVyXCIpO1xuY2xhc3MgUHJvdmlkZXJTdHJlYW0gZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3RyZWFtXzIuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIHJlYWQodGFzaykge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IG5ldyBzdHJlYW1fMS5SZWFkYWJsZSh7IG9iamVjdE1vZGU6IHRydWUsIHJlYWQ6ICgpID0+IHsgfSB9KTtcbiAgICAgICAgc291cmNlXG4gICAgICAgICAgICAub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2Vycm9yJywgZXJyb3IpKVxuICAgICAgICAgICAgLm9uKCdkYXRhJywgKGVudHJ5KSA9PiBkZXN0aW5hdGlvbi5lbWl0KCdkYXRhJywgb3B0aW9ucy50cmFuc2Zvcm0oZW50cnkpKSlcbiAgICAgICAgICAgIC5vbmNlKCdlbmQnLCAoKSA9PiBkZXN0aW5hdGlvbi5lbWl0KCdlbmQnKSk7XG4gICAgICAgIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICAub25jZSgnY2xvc2UnLCAoKSA9PiBzb3VyY2UuZGVzdHJveSgpKTtcbiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICAgIH1cbiAgICBhcGkocm9vdCwgdGFzaywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGFzay5keW5hbWljKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5zdGF0aWModGFzay5wYXR0ZXJucywgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXJTdHJlYW07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IGZzV2FsayA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy53YWxrXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jbGFzcyBSZWFkZXJTeW5jIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3dhbGtTeW5jID0gZnNXYWxrLndhbGtTeW5jO1xuICAgICAgICB0aGlzLl9zdGF0U3luYyA9IGZzU3RhdC5zdGF0U3luYztcbiAgICB9XG4gICAgZHluYW1pYyhyb290LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrU3luYyhyb290LCBvcHRpb25zKTtcbiAgICB9XG4gICAgc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHRoaXMuX2dldEZ1bGxFbnRyeVBhdGgocGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2dldEVudHJ5KGZpbGVwYXRoLCBwYXR0ZXJuLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChlbnRyeSA9PT0gbnVsbCB8fCAhb3B0aW9ucy5lbnRyeUZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuICAgIF9nZXRFbnRyeShmaWxlcGF0aCwgcGF0dGVybiwgb3B0aW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLl9nZXRTdGF0KGZpbGVwYXRoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYWtlRW50cnkoc3RhdHMsIHBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3JGaWx0ZXIoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0U3RhdChmaWxlcGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdFN5bmMoZmlsZXBhdGgsIHRoaXMuX2ZzU3RhdFNldHRpbmdzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSZWFkZXJTeW5jO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3Qgc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvc3luY1wiKTtcbmNvbnN0IHByb3ZpZGVyXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlclwiKTtcbmNsYXNzIFByb3ZpZGVyU3luYyBleHRlbmRzIHByb3ZpZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBzeW5jXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIHJlYWQodGFzaykge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKG9wdGlvbnMudHJhbnNmb3JtKTtcbiAgICB9XG4gICAgYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyU3luYztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuREVGQVVMVF9GSUxFX1NZU1RFTV9BREFQVEVSID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBvcyA9IHJlcXVpcmUoXCJvc1wiKTtcbi8qKlxuICogVGhlIGBvcy5jcHVzYCBtZXRob2QgY2FuIHJldHVybiB6ZXJvLiBXZSBleHBlY3QgdGhlIG51bWJlciBvZiBjb3JlcyB0byBiZSBncmVhdGVyIHRoYW4gemVyby5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iLzdmYWVkZGYyM2E5OGM1Mzg5NmY4YjU3NGE2ZTY2NTg5ZThmYjFlYjgvbGliL29zLmpzI0wxMDYtTDEwN1xuICovXG5jb25zdCBDUFVfQ09VTlQgPSBNYXRoLm1heChvcy5jcHVzKCkubGVuZ3RoLCAxKTtcbmV4cG9ydHMuREVGQVVMVF9GSUxFX1NZU1RFTV9BREFQVEVSID0ge1xuICAgIGxzdGF0OiBmcy5sc3RhdCxcbiAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcbiAgICBzdGF0OiBmcy5zdGF0LFxuICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luYyxcbiAgICByZWFkZGlyOiBmcy5yZWFkZGlyLFxuICAgIHJlYWRkaXJTeW5jOiBmcy5yZWFkZGlyU3luY1xufTtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYWJzb2x1dGUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5iYXNlTmFtZU1hdGNoID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5iYXNlTmFtZU1hdGNoLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuYnJhY2VFeHBhbnNpb24gPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJyYWNlRXhwYW5zaW9uLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlTWF0Y2ggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNhc2VTZW5zaXRpdmVNYXRjaCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5LCBDUFVfQ09VTlQpO1xuICAgICAgICB0aGlzLmN3ZCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY3dkLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICAgICAgdGhpcy5kZWVwID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5kZWVwLCBJbmZpbml0eSk7XG4gICAgICAgIHRoaXMuZG90ID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5kb3QsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5leHRnbG9iID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5leHRnbG9iLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmtzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmtzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mcyA9IHRoaXMuX2dldEZpbGVTeXN0ZW1NZXRob2RzKHRoaXMuX29wdGlvbnMuZnMpO1xuICAgICAgICB0aGlzLmdsb2JzdGFyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5nbG9ic3RhciwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuaWdub3JlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5pZ25vcmUsIFtdKTtcbiAgICAgICAgdGhpcy5tYXJrRGlyZWN0b3JpZXMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm1hcmtEaXJlY3RvcmllcywgZmFsc2UpO1xuICAgICAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9iamVjdE1vZGUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5vbmx5RGlyZWN0b3JpZXMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9ubHlEaXJlY3RvcmllcywgZmFsc2UpO1xuICAgICAgICB0aGlzLm9ubHlGaWxlcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMub25seUZpbGVzLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3RhdHMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0Vycm9ycyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3VwcHJlc3NFcnJvcnMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaywgZmFsc2UpO1xuICAgICAgICB0aGlzLnVuaXF1ZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudW5pcXVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMub25seURpcmVjdG9yaWVzKSB7XG4gICAgICAgICAgICB0aGlzLm9ubHlGaWxlcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRzKSB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdE1vZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgY2FzdCB0byB0aGUgYXJyYXkgaW4gdGhlIG5leHQgbWFqb3IgKCM0MDQpLlxuICAgICAgICB0aGlzLmlnbm9yZSA9IFtdLmNvbmNhdCh0aGlzLmlnbm9yZSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogb3B0aW9uO1xuICAgIH1cbiAgICBfZ2V0RmlsZVN5c3RlbU1ldGhvZHMobWV0aG9kcyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuREVGQVVMVF9GSUxFX1NZU1RFTV9BREFQVEVSKSwgbWV0aG9kcyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCB0YXNrTWFuYWdlciA9IHJlcXVpcmUoXCIuL21hbmFnZXJzL3Rhc2tzXCIpO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N0cmVhbVwiKTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmFzeW5jIGZ1bmN0aW9uIEZhc3RHbG9iKHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgYXN5bmNfMS5kZWZhdWx0LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbCh3b3Jrcyk7XG4gICAgcmV0dXJuIHV0aWxzLmFycmF5LmZsYXR0ZW4ocmVzdWx0KTtcbn1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzbGludC9pc3N1ZXMvNjBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbihmdW5jdGlvbiAoRmFzdEdsb2IpIHtcbiAgICBGYXN0R2xvYi5nbG9iID0gRmFzdEdsb2I7XG4gICAgRmFzdEdsb2IuZ2xvYlN5bmMgPSBzeW5jO1xuICAgIEZhc3RHbG9iLmdsb2JTdHJlYW0gPSBzdHJlYW07XG4gICAgRmFzdEdsb2IuYXN5bmMgPSBGYXN0R2xvYjtcbiAgICBmdW5jdGlvbiBzeW5jKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHdvcmtzID0gZ2V0V29ya3Moc291cmNlLCBzeW5jXzEuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB1dGlscy5hcnJheS5mbGF0dGVuKHdvcmtzKTtcbiAgICB9XG4gICAgRmFzdEdsb2Iuc3luYyA9IHN5bmM7XG4gICAgZnVuY3Rpb24gc3RyZWFtKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHdvcmtzID0gZ2V0V29ya3Moc291cmNlLCBzdHJlYW1fMS5kZWZhdWx0LCBvcHRpb25zKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzdHJlYW0gcmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyIGNhbm5vdCB3b3JrIHdpdGggYW4gYXN5bmNocm9ub3VzIGl0ZXJhdG9yLlxuICAgICAgICAgKiBUbyBzdXBwb3J0IGFzeW5jaHJvbm91cyBpdGVyYXRvcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiB0YXNrcywgd2UgYWx3YXlzIG11bHRpcGxleCBzdHJlYW1zLlxuICAgICAgICAgKiBUaGlzIGFmZmVjdHMgcGVyZm9ybWFuY2UgKCsyNSUpLiBJIGRvbid0IHNlZSBiZXN0IHNvbHV0aW9uIHJpZ2h0IG5vdy5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiB1dGlscy5zdHJlYW0ubWVyZ2Uod29ya3MpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5zdHJlYW0gPSBzdHJlYW07XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVUYXNrcyhzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IFtdLmNvbmNhdChzb3VyY2UpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0YXNrTWFuYWdlci5nZW5lcmF0ZShwYXR0ZXJucywgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBGYXN0R2xvYi5nZW5lcmF0ZVRhc2tzID0gZ2VuZXJhdGVUYXNrcztcbiAgICBmdW5jdGlvbiBpc0R5bmFtaWNQYXR0ZXJuKHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdHRlcm4uaXNEeW5hbWljUGF0dGVybihzb3VyY2UsIHNldHRpbmdzKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuaXNEeW5hbWljUGF0dGVybiA9IGlzRHluYW1pY1BhdHRlcm47XG4gICAgZnVuY3Rpb24gZXNjYXBlUGF0aChzb3VyY2UpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5lc2NhcGUoc291cmNlKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuZXNjYXBlUGF0aCA9IGVzY2FwZVBhdGg7XG4gICAgZnVuY3Rpb24gY29udmVydFBhdGhUb1BhdHRlcm4oc291cmNlKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguY29udmVydFBhdGhUb1BhdHRlcm4oc291cmNlKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuY29udmVydFBhdGhUb1BhdHRlcm4gPSBjb252ZXJ0UGF0aFRvUGF0dGVybjtcbiAgICBsZXQgcG9zaXg7XG4gICAgKGZ1bmN0aW9uIChwb3NpeCkge1xuICAgICAgICBmdW5jdGlvbiBlc2NhcGVQYXRoKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguZXNjYXBlUG9zaXhQYXRoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zaXguZXNjYXBlUGF0aCA9IGVzY2FwZVBhdGg7XG4gICAgICAgIGZ1bmN0aW9uIGNvbnZlcnRQYXRoVG9QYXR0ZXJuKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguY29udmVydFBvc2l4UGF0aFRvUGF0dGVybihzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHBvc2l4LmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gY29udmVydFBhdGhUb1BhdHRlcm47XG4gICAgfSkocG9zaXggPSBGYXN0R2xvYi5wb3NpeCB8fCAoRmFzdEdsb2IucG9zaXggPSB7fSkpO1xuICAgIGxldCB3aW4zMjtcbiAgICAoZnVuY3Rpb24gKHdpbjMyKSB7XG4gICAgICAgIGZ1bmN0aW9uIGVzY2FwZVBhdGgoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5lc2NhcGVXaW5kb3dzUGF0aChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHdpbjMyLmVzY2FwZVBhdGggPSBlc2NhcGVQYXRoO1xuICAgICAgICBmdW5jdGlvbiBjb252ZXJ0UGF0aFRvUGF0dGVybihzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXRoLmNvbnZlcnRXaW5kb3dzUGF0aFRvUGF0dGVybihzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHdpbjMyLmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gY29udmVydFBhdGhUb1BhdHRlcm47XG4gICAgfSkod2luMzIgPSBGYXN0R2xvYi53aW4zMiB8fCAoRmFzdEdsb2Iud2luMzIgPSB7fSkpO1xufSkoRmFzdEdsb2IgfHwgKEZhc3RHbG9iID0ge30pKTtcbmZ1bmN0aW9uIGdldFdvcmtzKHNvdXJjZSwgX1Byb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBbXS5jb25jYXQoc291cmNlKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XG4gICAgY29uc3QgdGFza3MgPSB0YXNrTWFuYWdlci5nZW5lcmF0ZShwYXR0ZXJucywgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IF9Qcm92aWRlcihzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHRhc2tzLm1hcChwcm92aWRlci5yZWFkLCBwcm92aWRlcik7XG59XG5mdW5jdGlvbiBhc3NlcnRQYXR0ZXJuc0lucHV0KGlucHV0KSB7XG4gICAgY29uc3Qgc291cmNlID0gW10uY29uY2F0KGlucHV0KTtcbiAgICBjb25zdCBpc1ZhbGlkU291cmNlID0gc291cmNlLmV2ZXJ5KChpdGVtKSA9PiB1dGlscy5zdHJpbmcuaXNTdHJpbmcoaXRlbSkgJiYgIXV0aWxzLnN0cmluZy5pc0VtcHR5KGl0ZW0pKTtcbiAgICBpZiAoIWlzVmFsaWRTb3VyY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGF0dGVybnMgbXVzdCBiZSBhIHN0cmluZyAobm9uIGVtcHR5KSBvciBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBGYXN0R2xvYjtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCB7cHJvbWlzaWZ5fSA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcblxuYXN5bmMgZnVuY3Rpb24gaXNUeXBlKGZzU3RhdFR5cGUsIHN0YXRzTWV0aG9kTmFtZSwgZmlsZVBhdGgpIHtcblx0aWYgKHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZywgZ290ICR7dHlwZW9mIGZpbGVQYXRofWApO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRjb25zdCBzdGF0cyA9IGF3YWl0IHByb21pc2lmeShmc1tmc1N0YXRUeXBlXSkoZmlsZVBhdGgpO1xuXHRcdHJldHVybiBzdGF0c1tzdGF0c01ldGhvZE5hbWVdKCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cbn1cblxuZnVuY3Rpb24gaXNUeXBlU3luYyhmc1N0YXRUeXBlLCBzdGF0c01ldGhvZE5hbWUsIGZpbGVQYXRoKSB7XG5cdGlmICh0eXBlb2YgZmlsZVBhdGggIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiBmaWxlUGF0aH1gKTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0cmV0dXJuIGZzW2ZzU3RhdFR5cGVdKGZpbGVQYXRoKVtzdGF0c01ldGhvZE5hbWVdKCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0aWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhyb3cgZXJyb3I7XG5cdH1cbn1cblxuZXhwb3J0cy5pc0ZpbGUgPSBpc1R5cGUuYmluZChudWxsLCAnc3RhdCcsICdpc0ZpbGUnKTtcbmV4cG9ydHMuaXNEaXJlY3RvcnkgPSBpc1R5cGUuYmluZChudWxsLCAnc3RhdCcsICdpc0RpcmVjdG9yeScpO1xuZXhwb3J0cy5pc1N5bWxpbmsgPSBpc1R5cGUuYmluZChudWxsLCAnbHN0YXQnLCAnaXNTeW1ib2xpY0xpbmsnKTtcbmV4cG9ydHMuaXNGaWxlU3luYyA9IGlzVHlwZVN5bmMuYmluZChudWxsLCAnc3RhdFN5bmMnLCAnaXNGaWxlJyk7XG5leHBvcnRzLmlzRGlyZWN0b3J5U3luYyA9IGlzVHlwZVN5bmMuYmluZChudWxsLCAnc3RhdFN5bmMnLCAnaXNEaXJlY3RvcnknKTtcbmV4cG9ydHMuaXNTeW1saW5rU3luYyA9IGlzVHlwZVN5bmMuYmluZChudWxsLCAnbHN0YXRTeW5jJywgJ2lzU3ltYm9saWNMaW5rJyk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHBhdGhUeXBlID0gcmVxdWlyZSgncGF0aC10eXBlJyk7XG5cbmNvbnN0IGdldEV4dGVuc2lvbnMgPSBleHRlbnNpb25zID0+IGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGB7JHtleHRlbnNpb25zLmpvaW4oJywnKX19YCA6IGV4dGVuc2lvbnNbMF07XG5cbmNvbnN0IGdldFBhdGggPSAoZmlsZXBhdGgsIGN3ZCkgPT4ge1xuXHRjb25zdCBwdGggPSBmaWxlcGF0aFswXSA9PT0gJyEnID8gZmlsZXBhdGguc2xpY2UoMSkgOiBmaWxlcGF0aDtcblx0cmV0dXJuIHBhdGguaXNBYnNvbHV0ZShwdGgpID8gcHRoIDogcGF0aC5qb2luKGN3ZCwgcHRoKTtcbn07XG5cbmNvbnN0IGFkZEV4dGVuc2lvbnMgPSAoZmlsZSwgZXh0ZW5zaW9ucykgPT4ge1xuXHRpZiAocGF0aC5leHRuYW1lKGZpbGUpKSB7XG5cdFx0cmV0dXJuIGAqKi8ke2ZpbGV9YDtcblx0fVxuXG5cdHJldHVybiBgKiovJHtmaWxlfS4ke2dldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyl9YDtcbn07XG5cbmNvbnN0IGdldEdsb2IgPSAoZGlyZWN0b3J5LCBvcHRpb25zKSA9PiB7XG5cdGlmIChvcHRpb25zLmZpbGVzICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMuZmlsZXMpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgZmlsZXNcXGAgdG8gYmUgb2YgdHlwZSBcXGBBcnJheVxcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmZpbGVzfVxcYGApO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZXh0ZW5zaW9ucyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmV4dGVuc2lvbnMpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgZXh0ZW5zaW9uc1xcYCB0byBiZSBvZiB0eXBlIFxcYEFycmF5XFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuZXh0ZW5zaW9uc31cXGBgKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmZpbGVzICYmIG9wdGlvbnMuZXh0ZW5zaW9ucykge1xuXHRcdHJldHVybiBvcHRpb25zLmZpbGVzLm1hcCh4ID0+IHBhdGgucG9zaXguam9pbihkaXJlY3RvcnksIGFkZEV4dGVuc2lvbnMoeCwgb3B0aW9ucy5leHRlbnNpb25zKSkpO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuZmlsZXMpIHtcblx0XHRyZXR1cm4gb3B0aW9ucy5maWxlcy5tYXAoeCA9PiBwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCBgKiovJHt4fWApKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmV4dGVuc2lvbnMpIHtcblx0XHRyZXR1cm4gW3BhdGgucG9zaXguam9pbihkaXJlY3RvcnksIGAqKi8qLiR7Z2V0RXh0ZW5zaW9ucyhvcHRpb25zLmV4dGVuc2lvbnMpfWApXTtcblx0fVxuXG5cdHJldHVybiBbcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgJyoqJyldO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoaW5wdXQsIG9wdGlvbnMpID0+IHtcblx0b3B0aW9ucyA9IHtcblx0XHRjd2Q6IHByb2Nlc3MuY3dkKCksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGlmICh0eXBlb2Ygb3B0aW9ucy5jd2QgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgY3dkXFxgIHRvIGJlIG9mIHR5cGUgXFxgc3RyaW5nXFxgIGJ1dCByZWNlaXZlZCB0eXBlIFxcYCR7dHlwZW9mIG9wdGlvbnMuY3dkfVxcYGApO1xuXHR9XG5cblx0Y29uc3QgZ2xvYnMgPSBhd2FpdCBQcm9taXNlLmFsbChbXS5jb25jYXQoaW5wdXQpLm1hcChhc3luYyB4ID0+IHtcblx0XHRjb25zdCBpc0RpcmVjdG9yeSA9IGF3YWl0IHBhdGhUeXBlLmlzRGlyZWN0b3J5KGdldFBhdGgoeCwgb3B0aW9ucy5jd2QpKTtcblx0XHRyZXR1cm4gaXNEaXJlY3RvcnkgPyBnZXRHbG9iKHgsIG9wdGlvbnMpIDogeDtcblx0fSkpO1xuXG5cdHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGdsb2JzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItc3ByZWFkXG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zeW5jID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Y3dkOiBwcm9jZXNzLmN3ZCgpLFxuXHRcdC4uLm9wdGlvbnNcblx0fTtcblxuXHRpZiAodHlwZW9mIG9wdGlvbnMuY3dkICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGN3ZFxcYCB0byBiZSBvZiB0eXBlIFxcYHN0cmluZ1xcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmN3ZH1cXGBgKTtcblx0fVxuXG5cdGNvbnN0IGdsb2JzID0gW10uY29uY2F0KGlucHV0KS5tYXAoeCA9PiBwYXRoVHlwZS5pc0RpcmVjdG9yeVN5bmMoZ2V0UGF0aCh4LCBvcHRpb25zLmN3ZCkpID8gZ2V0R2xvYih4LCBvcHRpb25zKSA6IHgpO1xuXG5cdHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGdsb2JzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItc3ByZWFkXG59O1xuIiwgIi8vIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIG1ha2UtYXJyYXlcbmZ1bmN0aW9uIG1ha2VBcnJheSAoc3ViamVjdCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdWJqZWN0KVxuICAgID8gc3ViamVjdFxuICAgIDogW3N1YmplY3RdXG59XG5cbmNvbnN0IEVNUFRZID0gJydcbmNvbnN0IFNQQUNFID0gJyAnXG5jb25zdCBFU0NBUEUgPSAnXFxcXCdcbmNvbnN0IFJFR0VYX1RFU1RfQkxBTktfTElORSA9IC9eXFxzKyQvXG5jb25zdCBSRUdFWF9JTlZBTElEX1RSQUlMSU5HX0JBQ0tTTEFTSCA9IC8oPzpbXlxcXFxdfF4pXFxcXCQvXG5jb25zdCBSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9FWENMQU1BVElPTiA9IC9eXFxcXCEvXG5jb25zdCBSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9IQVNIID0gL15cXFxcIy9cbmNvbnN0IFJFR0VYX1NQTElUQUxMX0NSTEYgPSAvXFxyP1xcbi9nXG4vLyAvZm9vLFxuLy8gLi9mb28sXG4vLyAuLi9mb28sXG4vLyAuXG4vLyAuLlxuY29uc3QgUkVHRVhfVEVTVF9JTlZBTElEX1BBVEggPSAvXlxcLipcXC98XlxcLiskL1xuXG5jb25zdCBTTEFTSCA9ICcvJ1xuXG4vLyBEbyBub3QgdXNlIHRlcm5hcnkgZXhwcmVzc2lvbiBoZXJlLCBzaW5jZSBcImlzdGFuYnVsIGlnbm9yZSBuZXh0XCIgaXMgYnVnZ3lcbmxldCBUTVBfS0VZX0lHTk9SRSA9ICdub2RlLWlnbm9yZSdcbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgVE1QX0tFWV9JR05PUkUgPSBTeW1ib2wuZm9yKCdub2RlLWlnbm9yZScpXG59XG5jb25zdCBLRVlfSUdOT1JFID0gVE1QX0tFWV9JR05PUkVcblxuY29uc3QgZGVmaW5lID0gKG9iamVjdCwga2V5LCB2YWx1ZSkgPT5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7dmFsdWV9KVxuXG5jb25zdCBSRUdFWF9SRUdFWFBfUkFOR0UgPSAvKFswLXpdKS0oWzAtel0pL2dcblxuY29uc3QgUkVUVVJOX0ZBTFNFID0gKCkgPT4gZmFsc2VcblxuLy8gU2FuaXRpemUgdGhlIHJhbmdlIG9mIGEgcmVndWxhciBleHByZXNzaW9uXG4vLyBUaGUgY2FzZXMgYXJlIGNvbXBsaWNhdGVkLCBzZWUgdGVzdCBjYXNlcyBmb3IgZGV0YWlsc1xuY29uc3Qgc2FuaXRpemVSYW5nZSA9IHJhbmdlID0+IHJhbmdlLnJlcGxhY2UoXG4gIFJFR0VYX1JFR0VYUF9SQU5HRSxcbiAgKG1hdGNoLCBmcm9tLCB0bykgPT4gZnJvbS5jaGFyQ29kZUF0KDApIDw9IHRvLmNoYXJDb2RlQXQoMClcbiAgICA/IG1hdGNoXG4gICAgLy8gSW52YWxpZCByYW5nZSAob3V0IG9mIG9yZGVyKSB3aGljaCBpcyBvayBmb3IgZ2l0aWdub3JlIHJ1bGVzIGJ1dFxuICAgIC8vICAgZmF0YWwgZm9yIEphdmFTY3JpcHQgcmVndWxhciBleHByZXNzaW9uLCBzbyBlbGltaW5hdGUgaXQuXG4gICAgOiBFTVBUWVxuKVxuXG4vLyBTZWUgZml4dHVyZXMgIzU5XG5jb25zdCBjbGVhblJhbmdlQmFja1NsYXNoID0gc2xhc2hlcyA9PiB7XG4gIGNvbnN0IHtsZW5ndGh9ID0gc2xhc2hlc1xuICByZXR1cm4gc2xhc2hlcy5zbGljZSgwLCBsZW5ndGggLSBsZW5ndGggJSAyKVxufVxuXG4vLyA+IElmIHRoZSBwYXR0ZXJuIGVuZHMgd2l0aCBhIHNsYXNoLFxuLy8gPiBpdCBpcyByZW1vdmVkIGZvciB0aGUgcHVycG9zZSBvZiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uLFxuLy8gPiBidXQgaXQgd291bGQgb25seSBmaW5kIGEgbWF0Y2ggd2l0aCBhIGRpcmVjdG9yeS5cbi8vID4gSW4gb3RoZXIgd29yZHMsIGZvby8gd2lsbCBtYXRjaCBhIGRpcmVjdG9yeSBmb28gYW5kIHBhdGhzIHVuZGVybmVhdGggaXQsXG4vLyA+IGJ1dCB3aWxsIG5vdCBtYXRjaCBhIHJlZ3VsYXIgZmlsZSBvciBhIHN5bWJvbGljIGxpbmsgZm9vXG4vLyA+ICAodGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBob3cgcGF0aHNwZWMgd29ya3MgaW4gZ2VuZXJhbCBpbiBHaXQpLlxuLy8gJ2Bmb28vYCcgd2lsbCBub3QgbWF0Y2ggcmVndWxhciBmaWxlICdgZm9vYCcgb3Igc3ltYm9saWMgbGluayAnYGZvb2AnXG4vLyAtPiBpZ25vcmUtcnVsZXMgd2lsbCBub3QgZGVhbCB3aXRoIGl0LCBiZWNhdXNlIGl0IGNvc3RzIGV4dHJhIGBmcy5zdGF0YCBjYWxsXG4vLyAgICAgIHlvdSBjb3VsZCB1c2Ugb3B0aW9uIGBtYXJrOiB0cnVlYCB3aXRoIGBnbG9iYFxuXG4vLyAnYGZvby9gJyBzaG91bGQgbm90IGNvbnRpbnVlIHdpdGggdGhlICdgLi5gJ1xuY29uc3QgUkVQTEFDRVJTID0gW1xuXG4gIC8vID4gVHJhaWxpbmcgc3BhY2VzIGFyZSBpZ25vcmVkIHVubGVzcyB0aGV5IGFyZSBxdW90ZWQgd2l0aCBiYWNrc2xhc2ggKFwiXFxcIilcbiAgW1xuICAgIC8vIChhXFwgKSAtPiAoYSApXG4gICAgLy8gKGEgICkgLT4gKGEpXG4gICAgLy8gKGEgXFwgKSAtPiAoYSAgKVxuICAgIC9cXFxcP1xccyskLyxcbiAgICBtYXRjaCA9PiBtYXRjaC5pbmRleE9mKCdcXFxcJykgPT09IDBcbiAgICAgID8gU1BBQ0VcbiAgICAgIDogRU1QVFlcbiAgXSxcblxuICAvLyByZXBsYWNlIChcXCApIHdpdGggJyAnXG4gIFtcbiAgICAvXFxcXFxccy9nLFxuICAgICgpID0+IFNQQUNFXG4gIF0sXG5cbiAgLy8gRXNjYXBlIG1ldGFjaGFyYWN0ZXJzXG4gIC8vIHdoaWNoIGlzIHdyaXR0ZW4gZG93biBieSB1c2VycyBidXQgbWVhbnMgc3BlY2lhbCBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cblxuICAvLyA+IFRoZXJlIGFyZSAxMiBjaGFyYWN0ZXJzIHdpdGggc3BlY2lhbCBtZWFuaW5nczpcbiAgLy8gPiAtIHRoZSBiYWNrc2xhc2ggXFwsXG4gIC8vID4gLSB0aGUgY2FyZXQgXixcbiAgLy8gPiAtIHRoZSBkb2xsYXIgc2lnbiAkLFxuICAvLyA+IC0gdGhlIHBlcmlvZCBvciBkb3QgLixcbiAgLy8gPiAtIHRoZSB2ZXJ0aWNhbCBiYXIgb3IgcGlwZSBzeW1ib2wgfCxcbiAgLy8gPiAtIHRoZSBxdWVzdGlvbiBtYXJrID8sXG4gIC8vID4gLSB0aGUgYXN0ZXJpc2sgb3Igc3RhciAqLFxuICAvLyA+IC0gdGhlIHBsdXMgc2lnbiArLFxuICAvLyA+IC0gdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgKCxcbiAgLy8gPiAtIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzICksXG4gIC8vID4gLSBhbmQgdGhlIG9wZW5pbmcgc3F1YXJlIGJyYWNrZXQgWyxcbiAgLy8gPiAtIHRoZSBvcGVuaW5nIGN1cmx5IGJyYWNlIHssXG4gIC8vID4gVGhlc2Ugc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBvZnRlbiBjYWxsZWQgXCJtZXRhY2hhcmFjdGVyc1wiLlxuICBbXG4gICAgL1tcXFxcJC58KisoKXteXS9nLFxuICAgIG1hdGNoID0+IGBcXFxcJHttYXRjaH1gXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gYSBxdWVzdGlvbiBtYXJrICg/KSBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlclxuICAgIC8oPyFcXFxcKVxcPy9nLFxuICAgICgpID0+ICdbXi9dJ1xuICBdLFxuXG4gIC8vIGxlYWRpbmcgc2xhc2hcbiAgW1xuXG4gICAgLy8gPiBBIGxlYWRpbmcgc2xhc2ggbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRobmFtZS5cbiAgICAvLyA+IEZvciBleGFtcGxlLCBcIi8qLmNcIiBtYXRjaGVzIFwiY2F0LWZpbGUuY1wiIGJ1dCBub3QgXCJtb3ppbGxhLXNoYTEvc2hhMS5jXCIuXG4gICAgLy8gQSBsZWFkaW5nIHNsYXNoIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aG5hbWVcbiAgICAvXlxcLy8sXG4gICAgKCkgPT4gJ14nXG4gIF0sXG5cbiAgLy8gcmVwbGFjZSBzcGVjaWFsIG1ldGFjaGFyYWN0ZXIgc2xhc2ggYWZ0ZXIgdGhlIGxlYWRpbmcgc2xhc2hcbiAgW1xuICAgIC9cXC8vZyxcbiAgICAoKSA9PiAnXFxcXC8nXG4gIF0sXG5cbiAgW1xuICAgIC8vID4gQSBsZWFkaW5nIFwiKipcIiBmb2xsb3dlZCBieSBhIHNsYXNoIG1lYW5zIG1hdGNoIGluIGFsbCBkaXJlY3Rvcmllcy5cbiAgICAvLyA+IEZvciBleGFtcGxlLCBcIioqL2Zvb1wiIG1hdGNoZXMgZmlsZSBvciBkaXJlY3RvcnkgXCJmb29cIiBhbnl3aGVyZSxcbiAgICAvLyA+IHRoZSBzYW1lIGFzIHBhdHRlcm4gXCJmb29cIi5cbiAgICAvLyA+IFwiKiovZm9vL2JhclwiIG1hdGNoZXMgZmlsZSBvciBkaXJlY3RvcnkgXCJiYXJcIiBhbnl3aGVyZSB0aGF0IGlzIGRpcmVjdGx5XG4gICAgLy8gPiAgIHVuZGVyIGRpcmVjdG9yeSBcImZvb1wiLlxuICAgIC8vIE5vdGljZSB0aGF0IHRoZSAnKidzIGhhdmUgYmVlbiByZXBsYWNlZCBhcyAnXFxcXConXG4gICAgL15cXF4qXFxcXFxcKlxcXFxcXCpcXFxcXFwvLyxcblxuICAgIC8vICcqKi9mb28nIDwtPiAnZm9vJ1xuICAgICgpID0+ICdeKD86LipcXFxcLyk/J1xuICBdLFxuXG4gIC8vIHN0YXJ0aW5nXG4gIFtcbiAgICAvLyB0aGVyZSB3aWxsIGJlIG5vIGxlYWRpbmcgJy8nXG4gICAgLy8gICAod2hpY2ggaGFzIGJlZW4gcmVwbGFjZWQgYnkgc2VjdGlvbiBcImxlYWRpbmcgc2xhc2hcIilcbiAgICAvLyBJZiBzdGFydHMgd2l0aCAnKionLCBhZGRpbmcgYSAnXicgdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHNvIHdvcmtzXG4gICAgL14oPz1bXl5dKS8sXG4gICAgZnVuY3Rpb24gc3RhcnRpbmdSZXBsYWNlciAoKSB7XG4gICAgICAvLyBJZiBoYXMgYSBzbGFzaCBgL2AgYXQgdGhlIGJlZ2lubmluZyBvciBtaWRkbGVcbiAgICAgIHJldHVybiAhL1xcLyg/ISQpLy50ZXN0KHRoaXMpXG4gICAgICAgIC8vID4gUHJpb3IgdG8gMi4yMi4xXG4gICAgICAgIC8vID4gSWYgdGhlIHBhdHRlcm4gZG9lcyBub3QgY29udGFpbiBhIHNsYXNoIC8sXG4gICAgICAgIC8vID4gICBHaXQgdHJlYXRzIGl0IGFzIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuXG4gICAgICAgIC8vIEFjdHVhbGx5LCBpZiB0aGVyZSBpcyBvbmx5IGEgdHJhaWxpbmcgc2xhc2gsXG4gICAgICAgIC8vICAgZ2l0IGFsc28gdHJlYXRzIGl0IGFzIGEgc2hlbGwgZ2xvYiBwYXR0ZXJuXG5cbiAgICAgICAgLy8gQWZ0ZXIgMi4yMi4xIChjb21wYXRpYmxlIGJ1dCBjbGVhcmVyKVxuICAgICAgICAvLyA+IElmIHRoZXJlIGlzIGEgc2VwYXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb3IgbWlkZGxlIChvciBib3RoKVxuICAgICAgICAvLyA+IG9mIHRoZSBwYXR0ZXJuLCB0aGVuIHRoZSBwYXR0ZXJuIGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnlcbiAgICAgICAgLy8gPiBsZXZlbCBvZiB0aGUgcGFydGljdWxhciAuZ2l0aWdub3JlIGZpbGUgaXRzZWxmLlxuICAgICAgICAvLyA+IE90aGVyd2lzZSB0aGUgcGF0dGVybiBtYXkgYWxzbyBtYXRjaCBhdCBhbnkgbGV2ZWwgYmVsb3dcbiAgICAgICAgLy8gPiB0aGUgLmdpdGlnbm9yZSBsZXZlbC5cbiAgICAgICAgPyAnKD86XnxcXFxcLyknXG5cbiAgICAgICAgLy8gPiBPdGhlcndpc2UsIEdpdCB0cmVhdHMgdGhlIHBhdHRlcm4gYXMgYSBzaGVsbCBnbG9iIHN1aXRhYmxlIGZvclxuICAgICAgICAvLyA+ICAgY29uc3VtcHRpb24gYnkgZm5tYXRjaCgzKVxuICAgICAgICA6ICdeJ1xuICAgIH1cbiAgXSxcblxuICAvLyB0d28gZ2xvYnN0YXJzXG4gIFtcbiAgICAvLyBVc2UgbG9va2FoZWFkIGFzc2VydGlvbnMgc28gdGhhdCB3ZSBjb3VsZCBtYXRjaCBtb3JlIHRoYW4gb25lIGAnLyoqJ2BcbiAgICAvXFxcXFxcL1xcXFxcXCpcXFxcXFwqKD89XFxcXFxcL3wkKS9nLFxuXG4gICAgLy8gWmVybywgb25lIG9yIHNldmVyYWwgZGlyZWN0b3JpZXNcbiAgICAvLyBzaG91bGQgbm90IHVzZSAnKicsIG9yIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5leHQgcmVwbGFjZXJcblxuICAgIC8vIENoZWNrIGlmIGl0IGlzIG5vdCB0aGUgbGFzdCBgJy8qKidgXG4gICAgKF8sIGluZGV4LCBzdHIpID0+IGluZGV4ICsgNiA8IHN0ci5sZW5ndGhcblxuICAgICAgLy8gY2FzZTogLyoqL1xuICAgICAgLy8gPiBBIHNsYXNoIGZvbGxvd2VkIGJ5IHR3byBjb25zZWN1dGl2ZSBhc3Rlcmlza3MgdGhlbiBhIHNsYXNoIG1hdGNoZXNcbiAgICAgIC8vID4gICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMuXG4gICAgICAvLyA+IEZvciBleGFtcGxlLCBcImEvKiovYlwiIG1hdGNoZXMgXCJhL2JcIiwgXCJhL3gvYlwiLCBcImEveC95L2JcIiBhbmQgc28gb24uXG4gICAgICAvLyAnLyoqLydcbiAgICAgID8gJyg/OlxcXFwvW15cXFxcL10rKSonXG5cbiAgICAgIC8vIGNhc2U6IC8qKlxuICAgICAgLy8gPiBBIHRyYWlsaW5nIGBcIi8qKlwiYCBtYXRjaGVzIGV2ZXJ5dGhpbmcgaW5zaWRlLlxuXG4gICAgICAvLyAjMjE6IGV2ZXJ5dGhpbmcgaW5zaWRlIGJ1dCBpdCBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGN1cnJlbnQgZm9sZGVyXG4gICAgICA6ICdcXFxcLy4rJ1xuICBdLFxuXG4gIC8vIG5vcm1hbCBpbnRlcm1lZGlhdGUgd2lsZGNhcmRzXG4gIFtcbiAgICAvLyBOZXZlciByZXBsYWNlIGVzY2FwZWQgJyonXG4gICAgLy8gaWdub3JlIHJ1bGUgJ1xcKicgd2lsbCBtYXRjaCB0aGUgcGF0aCAnKidcblxuICAgIC8vICdhYmMuKi8nIC0+IGdvXG4gICAgLy8gJ2FiYy4qJyAgLT4gc2tpcCB0aGlzIHJ1bGUsXG4gICAgLy8gICAgY296IHRyYWlsaW5nIHNpbmdsZSB3aWxkY2FyZCB3aWxsIGJlIGhhbmRlZCBieSBbdHJhaWxpbmcgd2lsZGNhcmRdXG4gICAgLyhefFteXFxcXF0rKShcXFxcXFwqKSsoPz0uKykvZyxcblxuICAgIC8vICcqLmpzJyBtYXRjaGVzICcuanMnXG4gICAgLy8gJyouanMnIGRvZXNuJ3QgbWF0Y2ggJ2FiYydcbiAgICAoXywgcDEsIHAyKSA9PiB7XG4gICAgICAvLyAxLlxuICAgICAgLy8gPiBBbiBhc3RlcmlzayBcIipcIiBtYXRjaGVzIGFueXRoaW5nIGV4Y2VwdCBhIHNsYXNoLlxuICAgICAgLy8gMi5cbiAgICAgIC8vID4gT3RoZXIgY29uc2VjdXRpdmUgYXN0ZXJpc2tzIGFyZSBjb25zaWRlcmVkIHJlZ3VsYXIgYXN0ZXJpc2tzXG4gICAgICAvLyA+IGFuZCB3aWxsIG1hdGNoIGFjY29yZGluZyB0byB0aGUgcHJldmlvdXMgcnVsZXMuXG4gICAgICBjb25zdCB1bmVzY2FwZWQgPSBwMi5yZXBsYWNlKC9cXFxcXFwqL2csICdbXlxcXFwvXSonKVxuICAgICAgcmV0dXJuIHAxICsgdW5lc2NhcGVkXG4gICAgfVxuICBdLFxuXG4gIFtcbiAgICAvLyB1bmVzY2FwZSwgcmV2ZXJ0IHN0ZXAgMyBleGNlcHQgZm9yIGJhY2sgc2xhc2hcbiAgICAvLyBGb3IgZXhhbXBsZSwgaWYgYSB1c2VyIGVzY2FwZSBhICdcXFxcKicsXG4gICAgLy8gYWZ0ZXIgc3RlcCAzLCB0aGUgcmVzdWx0IHdpbGwgYmUgJ1xcXFxcXFxcXFxcXConXG4gICAgL1xcXFxcXFxcXFxcXCg/PVskLnwqKygpe15dKS9nLFxuICAgICgpID0+IEVTQ0FQRVxuICBdLFxuXG4gIFtcbiAgICAvLyAnXFxcXFxcXFwnIC0+ICdcXFxcJ1xuICAgIC9cXFxcXFxcXC9nLFxuICAgICgpID0+IEVTQ0FQRVxuICBdLFxuXG4gIFtcbiAgICAvLyA+IFRoZSByYW5nZSBub3RhdGlvbiwgZS5nLiBbYS16QS1aXSxcbiAgICAvLyA+IGNhbiBiZSB1c2VkIHRvIG1hdGNoIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiBhIHJhbmdlLlxuXG4gICAgLy8gYFxcYCBpcyBlc2NhcGVkIGJ5IHN0ZXAgM1xuICAgIC8oXFxcXCk/XFxbKFteXFxdL10qPykoXFxcXCopKCR8XFxdKS9nLFxuICAgIChtYXRjaCwgbGVhZEVzY2FwZSwgcmFuZ2UsIGVuZEVzY2FwZSwgY2xvc2UpID0+IGxlYWRFc2NhcGUgPT09IEVTQ0FQRVxuICAgICAgLy8gJ1xcXFxbYmFyXScgLT4gJ1xcXFxcXFxcW2JhclxcXFxdJ1xuICAgICAgPyBgXFxcXFske3JhbmdlfSR7Y2xlYW5SYW5nZUJhY2tTbGFzaChlbmRFc2NhcGUpfSR7Y2xvc2V9YFxuICAgICAgOiBjbG9zZSA9PT0gJ10nXG4gICAgICAgID8gZW5kRXNjYXBlLmxlbmd0aCAlIDIgPT09IDBcbiAgICAgICAgICAvLyBBIG5vcm1hbCBjYXNlLCBhbmQgaXQgaXMgYSByYW5nZSBub3RhdGlvblxuICAgICAgICAgIC8vICdbYmFyXSdcbiAgICAgICAgICAvLyAnW2JhclxcXFxcXFxcXSdcbiAgICAgICAgICA/IGBbJHtzYW5pdGl6ZVJhbmdlKHJhbmdlKX0ke2VuZEVzY2FwZX1dYFxuICAgICAgICAgIC8vIEludmFsaWQgcmFuZ2Ugbm90YXRvblxuICAgICAgICAgIC8vICdbYmFyXFxcXF0nIC0+ICdbYmFyXFxcXFxcXFxdJ1xuICAgICAgICAgIDogJ1tdJ1xuICAgICAgICA6ICdbXSdcbiAgXSxcblxuICAvLyBlbmRpbmdcbiAgW1xuICAgIC8vICdqcycgd2lsbCBub3QgbWF0Y2ggJ2pzLidcbiAgICAvLyAnYWInIHdpbGwgbm90IG1hdGNoICdhYmMnXG4gICAgLyg/OlteKl0pJC8sXG5cbiAgICAvLyBXVEYhXG4gICAgLy8gaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGlnbm9yZVxuICAgIC8vIGNoYW5nZXMgaW4gWzIuMjIuMV0oaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGlnbm9yZS8yLjIyLjEpXG4gICAgLy8gd2hpY2ggcmUtZml4ZXMgIzI0LCAjMzhcblxuICAgIC8vID4gSWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB0aGVuIHRoZSBwYXR0ZXJuXG4gICAgLy8gPiB3aWxsIG9ubHkgbWF0Y2ggZGlyZWN0b3JpZXMsIG90aGVyd2lzZSB0aGUgcGF0dGVybiBjYW4gbWF0Y2ggYm90aFxuICAgIC8vID4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLlxuXG4gICAgLy8gJ2pzKicgd2lsbCBub3QgbWF0Y2ggJ2EuanMnXG4gICAgLy8gJ2pzLycgd2lsbCBub3QgbWF0Y2ggJ2EuanMnXG4gICAgLy8gJ2pzJyB3aWxsIG1hdGNoICdhLmpzJyBhbmQgJ2EuanMvJ1xuICAgIG1hdGNoID0+IC9cXC8kLy50ZXN0KG1hdGNoKVxuICAgICAgLy8gZm9vLyB3aWxsIG5vdCBtYXRjaCAnZm9vJ1xuICAgICAgPyBgJHttYXRjaH0kYFxuICAgICAgLy8gZm9vIG1hdGNoZXMgJ2ZvbycgYW5kICdmb28vJ1xuICAgICAgOiBgJHttYXRjaH0oPz0kfFxcXFwvJClgXG4gIF0sXG5cbiAgLy8gdHJhaWxpbmcgd2lsZGNhcmRcbiAgW1xuICAgIC8oXFxefFxcXFxcXC8pP1xcXFxcXCokLyxcbiAgICAoXywgcDEpID0+IHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHAxXG4gICAgICAgIC8vICdcXF4nOlxuICAgICAgICAvLyAnLyonIGRvZXMgbm90IG1hdGNoIEVNUFRZXG4gICAgICAgIC8vICcvKicgZG9lcyBub3QgbWF0Y2ggZXZlcnl0aGluZ1xuXG4gICAgICAgIC8vICdcXFxcXFwvJzpcbiAgICAgICAgLy8gJ2FiYy8qJyBkb2VzIG5vdCBtYXRjaCAnYWJjLydcbiAgICAgICAgPyBgJHtwMX1bXi9dK2BcblxuICAgICAgICAvLyAnYSonIG1hdGNoZXMgJ2EnXG4gICAgICAgIC8vICdhKicgbWF0Y2hlcyAnYWEnXG4gICAgICAgIDogJ1teL10qJ1xuXG4gICAgICByZXR1cm4gYCR7cHJlZml4fSg/PSR8XFxcXC8kKWBcbiAgICB9XG4gIF0sXG5dXG5cbi8vIEEgc2ltcGxlIGNhY2hlLCBiZWNhdXNlIGFuIGlnbm9yZSBydWxlIG9ubHkgaGFzIG9ubHkgb25lIGNlcnRhaW4gbWVhbmluZ1xuY29uc3QgcmVnZXhDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLy8gQHBhcmFtIHtwYXR0ZXJufVxuY29uc3QgbWFrZVJlZ2V4ID0gKHBhdHRlcm4sIGlnbm9yZUNhc2UpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHJlZ2V4Q2FjaGVbcGF0dGVybl1cblxuICBpZiAoIXNvdXJjZSkge1xuICAgIHNvdXJjZSA9IFJFUExBQ0VSUy5yZWR1Y2UoXG4gICAgICAocHJldiwgY3VycmVudCkgPT4gcHJldi5yZXBsYWNlKGN1cnJlbnRbMF0sIGN1cnJlbnRbMV0uYmluZChwYXR0ZXJuKSksXG4gICAgICBwYXR0ZXJuXG4gICAgKVxuICAgIHJlZ2V4Q2FjaGVbcGF0dGVybl0gPSBzb3VyY2VcbiAgfVxuXG4gIHJldHVybiBpZ25vcmVDYXNlXG4gICAgPyBuZXcgUmVnRXhwKHNvdXJjZSwgJ2knKVxuICAgIDogbmV3IFJlZ0V4cChzb3VyY2UpXG59XG5cbmNvbnN0IGlzU3RyaW5nID0gc3ViamVjdCA9PiB0eXBlb2Ygc3ViamVjdCA9PT0gJ3N0cmluZydcblxuLy8gPiBBIGJsYW5rIGxpbmUgbWF0Y2hlcyBubyBmaWxlcywgc28gaXQgY2FuIHNlcnZlIGFzIGEgc2VwYXJhdG9yIGZvciByZWFkYWJpbGl0eS5cbmNvbnN0IGNoZWNrUGF0dGVybiA9IHBhdHRlcm4gPT4gcGF0dGVyblxuICAmJiBpc1N0cmluZyhwYXR0ZXJuKVxuICAmJiAhUkVHRVhfVEVTVF9CTEFOS19MSU5FLnRlc3QocGF0dGVybilcbiAgJiYgIVJFR0VYX0lOVkFMSURfVFJBSUxJTkdfQkFDS1NMQVNILnRlc3QocGF0dGVybilcblxuICAvLyA+IEEgbGluZSBzdGFydGluZyB3aXRoICMgc2VydmVzIGFzIGEgY29tbWVudC5cbiAgJiYgcGF0dGVybi5pbmRleE9mKCcjJykgIT09IDBcblxuY29uc3Qgc3BsaXRQYXR0ZXJuID0gcGF0dGVybiA9PiBwYXR0ZXJuLnNwbGl0KFJFR0VYX1NQTElUQUxMX0NSTEYpXG5cbmNsYXNzIElnbm9yZVJ1bGUge1xuICBjb25zdHJ1Y3RvciAoXG4gICAgb3JpZ2luLFxuICAgIHBhdHRlcm4sXG4gICAgbmVnYXRpdmUsXG4gICAgcmVnZXhcbiAgKSB7XG4gICAgdGhpcy5vcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IG5lZ2F0aXZlXG4gICAgdGhpcy5yZWdleCA9IHJlZ2V4XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlUnVsZSA9IChwYXR0ZXJuLCBpZ25vcmVDYXNlKSA9PiB7XG4gIGNvbnN0IG9yaWdpbiA9IHBhdHRlcm5cbiAgbGV0IG5lZ2F0aXZlID0gZmFsc2VcblxuICAvLyA+IEFuIG9wdGlvbmFsIHByZWZpeCBcIiFcIiB3aGljaCBuZWdhdGVzIHRoZSBwYXR0ZXJuO1xuICBpZiAocGF0dGVybi5pbmRleE9mKCchJykgPT09IDApIHtcbiAgICBuZWdhdGl2ZSA9IHRydWVcbiAgICBwYXR0ZXJuID0gcGF0dGVybi5zdWJzdHIoMSlcbiAgfVxuXG4gIHBhdHRlcm4gPSBwYXR0ZXJuXG4gIC8vID4gUHV0IGEgYmFja3NsYXNoIChcIlxcXCIpIGluIGZyb250IG9mIHRoZSBmaXJzdCBcIiFcIiBmb3IgcGF0dGVybnMgdGhhdFxuICAvLyA+ICAgYmVnaW4gd2l0aCBhIGxpdGVyYWwgXCIhXCIsIGZvciBleGFtcGxlLCBgXCJcXCFpbXBvcnRhbnQhLnR4dFwiYC5cbiAgLnJlcGxhY2UoUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfRVhDTEFNQVRJT04sICchJylcbiAgLy8gPiBQdXQgYSBiYWNrc2xhc2ggKFwiXFxcIikgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IGhhc2ggZm9yIHBhdHRlcm5zIHRoYXRcbiAgLy8gPiAgIGJlZ2luIHdpdGggYSBoYXNoLlxuICAucmVwbGFjZShSRUdFWF9SRVBMQUNFX0xFQURJTkdfRVhDQVBFRF9IQVNILCAnIycpXG5cbiAgY29uc3QgcmVnZXggPSBtYWtlUmVnZXgocGF0dGVybiwgaWdub3JlQ2FzZSlcblxuICByZXR1cm4gbmV3IElnbm9yZVJ1bGUoXG4gICAgb3JpZ2luLFxuICAgIHBhdHRlcm4sXG4gICAgbmVnYXRpdmUsXG4gICAgcmVnZXhcbiAgKVxufVxuXG5jb25zdCB0aHJvd0Vycm9yID0gKG1lc3NhZ2UsIEN0b3IpID0+IHtcbiAgdGhyb3cgbmV3IEN0b3IobWVzc2FnZSlcbn1cblxuY29uc3QgY2hlY2tQYXRoID0gKHBhdGgsIG9yaWdpbmFsUGF0aCwgZG9UaHJvdykgPT4ge1xuICBpZiAoIWlzU3RyaW5nKHBhdGgpKSB7XG4gICAgcmV0dXJuIGRvVGhyb3coXG4gICAgICBgcGF0aCBtdXN0IGJlIGEgc3RyaW5nLCBidXQgZ290IFxcYCR7b3JpZ2luYWxQYXRofVxcYGAsXG4gICAgICBUeXBlRXJyb3JcbiAgICApXG4gIH1cblxuICAvLyBXZSBkb24ndCBrbm93IGlmIHdlIHNob3VsZCBpZ25vcmUgRU1QVFksIHNvIHRocm93XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBkb1Rocm93KGBwYXRoIG11c3Qgbm90IGJlIGVtcHR5YCwgVHlwZUVycm9yKVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQgaXMgYSByZWxhdGl2ZSBwYXRoXG4gIGlmIChjaGVja1BhdGguaXNOb3RSZWxhdGl2ZShwYXRoKSkge1xuICAgIGNvbnN0IHIgPSAnYHBhdGgucmVsYXRpdmUoKWBkJ1xuICAgIHJldHVybiBkb1Rocm93KFxuICAgICAgYHBhdGggc2hvdWxkIGJlIGEgJHtyfSBzdHJpbmcsIGJ1dCBnb3QgXCIke29yaWdpbmFsUGF0aH1cImAsXG4gICAgICBSYW5nZUVycm9yXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgaXNOb3RSZWxhdGl2ZSA9IHBhdGggPT4gUkVHRVhfVEVTVF9JTlZBTElEX1BBVEgudGVzdChwYXRoKVxuXG5jaGVja1BhdGguaXNOb3RSZWxhdGl2ZSA9IGlzTm90UmVsYXRpdmVcbmNoZWNrUGF0aC5jb252ZXJ0ID0gcCA9PiBwXG5cbmNsYXNzIElnbm9yZSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgaWdub3JlY2FzZSA9IHRydWUsXG4gICAgaWdub3JlQ2FzZSA9IGlnbm9yZWNhc2UsXG4gICAgYWxsb3dSZWxhdGl2ZVBhdGhzID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgZGVmaW5lKHRoaXMsIEtFWV9JR05PUkUsIHRydWUpXG5cbiAgICB0aGlzLl9ydWxlcyA9IFtdXG4gICAgdGhpcy5faWdub3JlQ2FzZSA9IGlnbm9yZUNhc2VcbiAgICB0aGlzLl9hbGxvd1JlbGF0aXZlUGF0aHMgPSBhbGxvd1JlbGF0aXZlUGF0aHNcbiAgICB0aGlzLl9pbml0Q2FjaGUoKVxuICB9XG5cbiAgX2luaXRDYWNoZSAoKSB7XG4gICAgdGhpcy5faWdub3JlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgdGhpcy5fdGVzdENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB9XG5cbiAgX2FkZFBhdHRlcm4gKHBhdHRlcm4pIHtcbiAgICAvLyAjMzJcbiAgICBpZiAocGF0dGVybiAmJiBwYXR0ZXJuW0tFWV9JR05PUkVdKSB7XG4gICAgICB0aGlzLl9ydWxlcyA9IHRoaXMuX3J1bGVzLmNvbmNhdChwYXR0ZXJuLl9ydWxlcylcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrUGF0dGVybihwYXR0ZXJuKSkge1xuICAgICAgY29uc3QgcnVsZSA9IGNyZWF0ZVJ1bGUocGF0dGVybiwgdGhpcy5faWdub3JlQ2FzZSlcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcnVsZXMucHVzaChydWxlKVxuICAgIH1cbiAgfVxuXG4gIC8vIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHN0cmluZyB8IElnbm9yZX0gcGF0dGVyblxuICBhZGQgKHBhdHRlcm4pIHtcbiAgICB0aGlzLl9hZGRlZCA9IGZhbHNlXG5cbiAgICBtYWtlQXJyYXkoXG4gICAgICBpc1N0cmluZyhwYXR0ZXJuKVxuICAgICAgICA/IHNwbGl0UGF0dGVybihwYXR0ZXJuKVxuICAgICAgICA6IHBhdHRlcm5cbiAgICApLmZvckVhY2godGhpcy5fYWRkUGF0dGVybiwgdGhpcylcblxuICAgIC8vIFNvbWUgcnVsZXMgaGF2ZSBqdXN0IGFkZGVkIHRvIHRoZSBpZ25vcmUsXG4gICAgLy8gbWFraW5nIHRoZSBiZWhhdmlvciBjaGFuZ2VkLlxuICAgIGlmICh0aGlzLl9hZGRlZCkge1xuICAgICAgdGhpcy5faW5pdENhY2hlKClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gbGVnYWN5XG4gIGFkZFBhdHRlcm4gKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGQocGF0dGVybilcbiAgfVxuXG4gIC8vICAgICAgICAgIHwgICAgICAgICAgIGlnbm9yZWQgOiB1bmlnbm9yZWRcbiAgLy8gbmVnYXRpdmUgfCAgIDA6MCAgIHwgICAwOjEgICB8ICAgMTowICAgfCAgIDE6MVxuICAvLyAtLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tXG4gIC8vICAgICAwICAgIHwgIFRFU1QgICB8ICBURVNUICAgfCAgU0tJUCAgIHwgICAgWFxuICAvLyAgICAgMSAgICB8ICBURVNUSUYgfCAgU0tJUCAgIHwgIFRFU1QgICB8ICAgIFhcblxuICAvLyAtIFNLSVA6IGFsd2F5cyBza2lwXG4gIC8vIC0gVEVTVDogYWx3YXlzIHRlc3RcbiAgLy8gLSBURVNUSUY6IG9ubHkgdGVzdCBpZiBjaGVja1VuaWdub3JlZFxuICAvLyAtIFg6IHRoYXQgbmV2ZXIgaGFwcGVuXG5cbiAgLy8gQHBhcmFtIHtib29sZWFufSB3aGV0aGVyIHNob3VsZCBjaGVjayBpZiB0aGUgcGF0aCBpcyB1bmlnbm9yZWQsXG4gIC8vICAgc2V0dGluZyBgY2hlY2tVbmlnbm9yZWRgIHRvIGBmYWxzZWAgY291bGQgcmVkdWNlIGFkZGl0aW9uYWxcbiAgLy8gICBwYXRoIG1hdGNoaW5nLlxuXG4gIC8vIEByZXR1cm5zIHtUZXN0UmVzdWx0fSB0cnVlIGlmIGEgZmlsZSBpcyBpZ25vcmVkXG4gIF90ZXN0T25lIChwYXRoLCBjaGVja1VuaWdub3JlZCkge1xuICAgIGxldCBpZ25vcmVkID0gZmFsc2VcbiAgICBsZXQgdW5pZ25vcmVkID0gZmFsc2VcblxuICAgIHRoaXMuX3J1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICBjb25zdCB7bmVnYXRpdmV9ID0gcnVsZVxuICAgICAgaWYgKFxuICAgICAgICB1bmlnbm9yZWQgPT09IG5lZ2F0aXZlICYmIGlnbm9yZWQgIT09IHVuaWdub3JlZFxuICAgICAgICB8fCBuZWdhdGl2ZSAmJiAhaWdub3JlZCAmJiAhdW5pZ25vcmVkICYmICFjaGVja1VuaWdub3JlZFxuICAgICAgKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGVkID0gcnVsZS5yZWdleC50ZXN0KHBhdGgpXG5cbiAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIGlnbm9yZWQgPSAhbmVnYXRpdmVcbiAgICAgICAgdW5pZ25vcmVkID0gbmVnYXRpdmVcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlnbm9yZWQsXG4gICAgICB1bmlnbm9yZWRcbiAgICB9XG4gIH1cblxuICAvLyBAcmV0dXJucyB7VGVzdFJlc3VsdH1cbiAgX3Rlc3QgKG9yaWdpbmFsUGF0aCwgY2FjaGUsIGNoZWNrVW5pZ25vcmVkLCBzbGljZXMpIHtcbiAgICBjb25zdCBwYXRoID0gb3JpZ2luYWxQYXRoXG4gICAgICAvLyBTdXBwb3J0cyBudWxsYWJsZSBwYXRoXG4gICAgICAmJiBjaGVja1BhdGguY29udmVydChvcmlnaW5hbFBhdGgpXG5cbiAgICBjaGVja1BhdGgoXG4gICAgICBwYXRoLFxuICAgICAgb3JpZ2luYWxQYXRoLFxuICAgICAgdGhpcy5fYWxsb3dSZWxhdGl2ZVBhdGhzXG4gICAgICAgID8gUkVUVVJOX0ZBTFNFXG4gICAgICAgIDogdGhyb3dFcnJvclxuICAgIClcblxuICAgIHJldHVybiB0aGlzLl90KHBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKVxuICB9XG5cbiAgX3QgKHBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKSB7XG4gICAgaWYgKHBhdGggaW4gY2FjaGUpIHtcbiAgICAgIHJldHVybiBjYWNoZVtwYXRoXVxuICAgIH1cblxuICAgIGlmICghc2xpY2VzKSB7XG4gICAgICAvLyBwYXRoL3RvL2EuanNcbiAgICAgIC8vIFsncGF0aCcsICd0bycsICdhLmpzJ11cbiAgICAgIHNsaWNlcyA9IHBhdGguc3BsaXQoU0xBU0gpXG4gICAgfVxuXG4gICAgc2xpY2VzLnBvcCgpXG5cbiAgICAvLyBJZiB0aGUgcGF0aCBoYXMgbm8gcGFyZW50IGRpcmVjdG9yeSwganVzdCB0ZXN0IGl0XG4gICAgaWYgKCFzbGljZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FjaGVbcGF0aF0gPSB0aGlzLl90ZXN0T25lKHBhdGgsIGNoZWNrVW5pZ25vcmVkKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3QoXG4gICAgICBzbGljZXMuam9pbihTTEFTSCkgKyBTTEFTSCxcbiAgICAgIGNhY2hlLFxuICAgICAgY2hlY2tVbmlnbm9yZWQsXG4gICAgICBzbGljZXNcbiAgICApXG5cbiAgICAvLyBJZiB0aGUgcGF0aCBjb250YWlucyBhIHBhcmVudCBkaXJlY3RvcnksIGNoZWNrIHRoZSBwYXJlbnQgZmlyc3RcbiAgICByZXR1cm4gY2FjaGVbcGF0aF0gPSBwYXJlbnQuaWdub3JlZFxuICAgICAgLy8gPiBJdCBpcyBub3QgcG9zc2libGUgdG8gcmUtaW5jbHVkZSBhIGZpbGUgaWYgYSBwYXJlbnQgZGlyZWN0b3J5IG9mXG4gICAgICAvLyA+ICAgdGhhdCBmaWxlIGlzIGV4Y2x1ZGVkLlxuICAgICAgPyBwYXJlbnRcbiAgICAgIDogdGhpcy5fdGVzdE9uZShwYXRoLCBjaGVja1VuaWdub3JlZClcbiAgfVxuXG4gIGlnbm9yZXMgKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVzdChwYXRoLCB0aGlzLl9pZ25vcmVDYWNoZSwgZmFsc2UpLmlnbm9yZWRcbiAgfVxuXG4gIGNyZWF0ZUZpbHRlciAoKSB7XG4gICAgcmV0dXJuIHBhdGggPT4gIXRoaXMuaWdub3JlcyhwYXRoKVxuICB9XG5cbiAgZmlsdGVyIChwYXRocykge1xuICAgIHJldHVybiBtYWtlQXJyYXkocGF0aHMpLmZpbHRlcih0aGlzLmNyZWF0ZUZpbHRlcigpKVxuICB9XG5cbiAgLy8gQHJldHVybnMge1Rlc3RSZXN1bHR9XG4gIHRlc3QgKHBhdGgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVzdChwYXRoLCB0aGlzLl90ZXN0Q2FjaGUsIHRydWUpXG4gIH1cbn1cblxuY29uc3QgZmFjdG9yeSA9IG9wdGlvbnMgPT4gbmV3IElnbm9yZShvcHRpb25zKVxuXG5jb25zdCBpc1BhdGhWYWxpZCA9IHBhdGggPT5cbiAgY2hlY2tQYXRoKHBhdGggJiYgY2hlY2tQYXRoLmNvbnZlcnQocGF0aCksIHBhdGgsIFJFVFVSTl9GQUxTRSlcblxuZmFjdG9yeS5pc1BhdGhWYWxpZCA9IGlzUGF0aFZhbGlkXG5cbi8vIEZpeGVzIHR5cGVzY3JpcHRcbmZhY3RvcnkuZGVmYXVsdCA9IGZhY3RvcnlcblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5XG5cbi8vIFdpbmRvd3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChcbiAgLy8gRGV0ZWN0IGBwcm9jZXNzYCBzbyB0aGF0IGl0IGNhbiBydW4gaW4gYnJvd3NlcnMuXG4gIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJ1xuICAmJiAoXG4gICAgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuSUdOT1JFX1RFU1RfV0lOMzJcbiAgICB8fCBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gIClcbikge1xuICAvKiBlc2xpbnQgbm8tY29udHJvbC1yZWdleDogXCJvZmZcIiAqL1xuICBjb25zdCBtYWtlUG9zaXggPSBzdHIgPT4gL15cXFxcXFxcXFxcP1xcXFwvLnRlc3Qoc3RyKVxuICB8fCAvW1wiPD58XFx1MDAwMC1cXHUwMDFGXSsvdS50ZXN0KHN0cilcbiAgICA/IHN0clxuICAgIDogc3RyLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuXG4gIGNoZWNrUGF0aC5jb252ZXJ0ID0gbWFrZVBvc2l4XG5cbiAgLy8gJ0M6XFxcXGZvbycgICAgIDwtICdDOlxcXFxmb28nIGhhcyBiZWVuIGNvbnZlcnRlZCB0byAnQzovJ1xuICAvLyAnZDpcXFxcZm9vJ1xuICBjb25zdCBSRUdJWF9JU19XSU5ET1dTX1BBVEhfQUJTT0xVVEUgPSAvXlthLXpdOlxcLy9pXG4gIGNoZWNrUGF0aC5pc05vdFJlbGF0aXZlID0gcGF0aCA9PlxuICAgIFJFR0lYX0lTX1dJTkRPV1NfUEFUSF9BQlNPTFVURS50ZXN0KHBhdGgpXG4gICAgfHwgaXNOb3RSZWxhdGl2ZShwYXRoKVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNsYXNoKHBhdGgpIHtcblx0Y29uc3QgaXNFeHRlbmRlZExlbmd0aFBhdGggPSAvXlxcXFxcXFxcXFw/XFxcXC8udGVzdChwYXRoKTtcblx0Y29uc3QgaGFzTm9uQXNjaWkgPSAvW15cXHUwMDAwLVxcdTAwODBdKy8udGVzdChwYXRoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cblx0aWYgKGlzRXh0ZW5kZWRMZW5ndGhQYXRoIHx8IGhhc05vbkFzY2lpKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblxuXHRyZXR1cm4gcGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG59XG4iLCAiaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQge1RyYW5zZm9ybX0gZnJvbSAnbm9kZTpzdHJlYW0nO1xuXG5leHBvcnQgY29uc3QgdG9QYXRoID0gdXJsT3JQYXRoID0+IHVybE9yUGF0aCBpbnN0YW5jZW9mIFVSTCA/IGZpbGVVUkxUb1BhdGgodXJsT3JQYXRoKSA6IHVybE9yUGF0aDtcblxuZXhwb3J0IGNsYXNzIEZpbHRlclN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG5cdGNvbnN0cnVjdG9yKGZpbHRlcikge1xuXHRcdHN1cGVyKHtcblx0XHRcdG9iamVjdE1vZGU6IHRydWUsXG5cdFx0XHR0cmFuc2Zvcm0oZGF0YSwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG5cdFx0XHRcdGNhbGxiYWNrKHVuZGVmaW5lZCwgZmlsdGVyKGRhdGEpID8gZGF0YSA6IHVuZGVmaW5lZCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBpc05lZ2F0aXZlUGF0dGVybiA9IHBhdHRlcm4gPT4gcGF0dGVyblswXSA9PT0gJyEnO1xuIiwgImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGZhc3RHbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZ2l0SWdub3JlIGZyb20gJ2lnbm9yZSc7XG5pbXBvcnQgc2xhc2ggZnJvbSAnc2xhc2gnO1xuaW1wb3J0IHt0b1BhdGgsIGlzTmVnYXRpdmVQYXR0ZXJufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IGlnbm9yZUZpbGVzR2xvYk9wdGlvbnMgPSB7XG5cdGlnbm9yZTogW1xuXHRcdCcqKi9ub2RlX21vZHVsZXMnLFxuXHRcdCcqKi9mbG93LXR5cGVkJyxcblx0XHQnKiovY292ZXJhZ2UnLFxuXHRcdCcqKi8uZ2l0Jyxcblx0XSxcblx0YWJzb2x1dGU6IHRydWUsXG5cdGRvdDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBHSVRJR05PUkVfRklMRVNfUEFUVEVSTiA9ICcqKi8uZ2l0aWdub3JlJztcblxuY29uc3QgYXBwbHlCYXNlVG9QYXR0ZXJuID0gKHBhdHRlcm4sIGJhc2UpID0+IGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pXG5cdD8gJyEnICsgcGF0aC5wb3NpeC5qb2luKGJhc2UsIHBhdHRlcm4uc2xpY2UoMSkpXG5cdDogcGF0aC5wb3NpeC5qb2luKGJhc2UsIHBhdHRlcm4pO1xuXG5jb25zdCBwYXJzZUlnbm9yZUZpbGUgPSAoZmlsZSwgY3dkKSA9PiB7XG5cdGNvbnN0IGJhc2UgPSBzbGFzaChwYXRoLnJlbGF0aXZlKGN3ZCwgcGF0aC5kaXJuYW1lKGZpbGUuZmlsZVBhdGgpKSk7XG5cblx0cmV0dXJuIGZpbGUuY29udGVudFxuXHRcdC5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0LmZpbHRlcihsaW5lID0+IGxpbmUgJiYgIWxpbmUuc3RhcnRzV2l0aCgnIycpKVxuXHRcdC5tYXAocGF0dGVybiA9PiBhcHBseUJhc2VUb1BhdHRlcm4ocGF0dGVybiwgYmFzZSkpO1xufTtcblxuY29uc3QgdG9SZWxhdGl2ZVBhdGggPSAoZmlsZU9yRGlyZWN0b3J5LCBjd2QpID0+IHtcblx0Y3dkID0gc2xhc2goY3dkKTtcblx0aWYgKHBhdGguaXNBYnNvbHV0ZShmaWxlT3JEaXJlY3RvcnkpKSB7XG5cdFx0aWYgKHNsYXNoKGZpbGVPckRpcmVjdG9yeSkuc3RhcnRzV2l0aChjd2QpKSB7XG5cdFx0XHRyZXR1cm4gcGF0aC5yZWxhdGl2ZShjd2QsIGZpbGVPckRpcmVjdG9yeSk7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBQYXRoICR7ZmlsZU9yRGlyZWN0b3J5fSBpcyBub3QgaW4gY3dkICR7Y3dkfWApO1xuXHR9XG5cblx0cmV0dXJuIGZpbGVPckRpcmVjdG9yeTtcbn07XG5cbmNvbnN0IGdldElzSWdub3JlZFByZWRpY2F0ZSA9IChmaWxlcywgY3dkKSA9PiB7XG5cdGNvbnN0IHBhdHRlcm5zID0gZmlsZXMuZmxhdE1hcChmaWxlID0+IHBhcnNlSWdub3JlRmlsZShmaWxlLCBjd2QpKTtcblx0Y29uc3QgaWdub3JlcyA9IGdpdElnbm9yZSgpLmFkZChwYXR0ZXJucyk7XG5cblx0cmV0dXJuIGZpbGVPckRpcmVjdG9yeSA9PiB7XG5cdFx0ZmlsZU9yRGlyZWN0b3J5ID0gdG9QYXRoKGZpbGVPckRpcmVjdG9yeSk7XG5cdFx0ZmlsZU9yRGlyZWN0b3J5ID0gdG9SZWxhdGl2ZVBhdGgoZmlsZU9yRGlyZWN0b3J5LCBjd2QpO1xuXHRcdHJldHVybiBmaWxlT3JEaXJlY3RvcnkgPyBpZ25vcmVzLmlnbm9yZXMoc2xhc2goZmlsZU9yRGlyZWN0b3J5KSkgOiBmYWxzZTtcblx0fTtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZU9wdGlvbnMgPSAob3B0aW9ucyA9IHt9KSA9PiAoe1xuXHRjd2Q6IHRvUGF0aChvcHRpb25zLmN3ZCkgfHwgcHJvY2Vzcy5jd2QoKSxcblx0c3VwcHJlc3NFcnJvcnM6IEJvb2xlYW4ob3B0aW9ucy5zdXBwcmVzc0Vycm9ycyksXG5cdGRlZXA6IHR5cGVvZiBvcHRpb25zLmRlZXAgPT09ICdudW1iZXInID8gb3B0aW9ucy5kZWVwIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxufSk7XG5cbmV4cG9ydCBjb25zdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzID0gYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHtjd2QsIHN1cHByZXNzRXJyb3JzLCBkZWVwfSA9IG5vcm1hbGl6ZU9wdGlvbnMob3B0aW9ucyk7XG5cblx0Y29uc3QgcGF0aHMgPSBhd2FpdCBmYXN0R2xvYihwYXR0ZXJucywge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXAsIC4uLmlnbm9yZUZpbGVzR2xvYk9wdGlvbnN9KTtcblxuXHRjb25zdCBmaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdHBhdGhzLm1hcChhc3luYyBmaWxlUGF0aCA9PiAoe1xuXHRcdFx0ZmlsZVBhdGgsXG5cdFx0XHRjb250ZW50OiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSxcblx0XHR9KSksXG5cdCk7XG5cblx0cmV0dXJuIGdldElzSWdub3JlZFByZWRpY2F0ZShmaWxlcywgY3dkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB7Y3dkLCBzdXBwcmVzc0Vycm9ycywgZGVlcH0gPSBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuXG5cdGNvbnN0IHBhdGhzID0gZmFzdEdsb2Iuc3luYyhwYXR0ZXJucywge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXAsIC4uLmlnbm9yZUZpbGVzR2xvYk9wdGlvbnN9KTtcblxuXHRjb25zdCBmaWxlcyA9IHBhdGhzLm1hcChmaWxlUGF0aCA9PiAoe1xuXHRcdGZpbGVQYXRoLFxuXHRcdGNvbnRlbnQ6IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSxcblx0fSkpO1xuXG5cdHJldHVybiBnZXRJc0lnbm9yZWRQcmVkaWNhdGUoZmlsZXMsIGN3ZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNHaXRJZ25vcmVkID0gb3B0aW9ucyA9PiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzKEdJVElHTk9SRV9GSUxFU19QQVRURVJOLCBvcHRpb25zKTtcbmV4cG9ydCBjb25zdCBpc0dpdElnbm9yZWRTeW5jID0gb3B0aW9ucyA9PiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyhHSVRJR05PUkVfRklMRVNfUEFUVEVSTiwgb3B0aW9ucyk7XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG5vZGVQYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgbWVyZ2UyIGZyb20gJ21lcmdlMic7XG5pbXBvcnQgZmFzdEdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBkaXJHbG9iIGZyb20gJ2Rpci1nbG9iJztcbmltcG9ydCB7XG5cdEdJVElHTk9SRV9GSUxFU19QQVRURVJOLFxuXHRpc0lnbm9yZWRCeUlnbm9yZUZpbGVzLFxuXHRpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyxcbn0gZnJvbSAnLi9pZ25vcmUuanMnO1xuaW1wb3J0IHtGaWx0ZXJTdHJlYW0sIHRvUGF0aCwgaXNOZWdhdGl2ZVBhdHRlcm59IGZyb20gJy4vdXRpbGl0aWVzLmpzJztcblxuY29uc3QgYXNzZXJ0UGF0dGVybnNJbnB1dCA9IHBhdHRlcm5zID0+IHtcblx0aWYgKHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiB0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUGF0dGVybnMgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG5cdH1cbn07XG5cbmNvbnN0IHRvUGF0dGVybnNBcnJheSA9IHBhdHRlcm5zID0+IHtcblx0cGF0dGVybnMgPSBbLi4ubmV3IFNldChbcGF0dGVybnNdLmZsYXQoKSldO1xuXHRhc3NlcnRQYXR0ZXJuc0lucHV0KHBhdHRlcm5zKTtcblx0cmV0dXJuIHBhdHRlcm5zO1xufTtcblxuY29uc3QgY2hlY2tDd2RPcHRpb24gPSBvcHRpb25zID0+IHtcblx0aWYgKCFvcHRpb25zLmN3ZCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGxldCBzdGF0O1xuXHR0cnkge1xuXHRcdHN0YXQgPSBmcy5zdGF0U3luYyhvcHRpb25zLmN3ZCk7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgYGN3ZGAgb3B0aW9uIG11c3QgYmUgYSBwYXRoIHRvIGEgZGlyZWN0b3J5Jyk7XG5cdH1cbn07XG5cbmNvbnN0IG5vcm1hbGl6ZU9wdGlvbnMgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRpZ25vcmU6IG9wdGlvbnMuaWdub3JlIHx8IFtdLFxuXHRcdGV4cGFuZERpcmVjdG9yaWVzOiBvcHRpb25zLmV4cGFuZERpcmVjdG9yaWVzID09PSB1bmRlZmluZWRcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBvcHRpb25zLmV4cGFuZERpcmVjdG9yaWVzLFxuXHRcdGN3ZDogdG9QYXRoKG9wdGlvbnMuY3dkKSxcblx0fTtcblxuXHRjaGVja0N3ZE9wdGlvbihvcHRpb25zKTtcblxuXHRyZXR1cm4gb3B0aW9ucztcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZUFyZ3VtZW50cyA9IGZuID0+IGFzeW5jIChwYXR0ZXJucywgb3B0aW9ucykgPT4gZm4odG9QYXR0ZXJuc0FycmF5KHBhdHRlcm5zKSwgbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKSk7XG5jb25zdCBub3JtYWxpemVBcmd1bWVudHNTeW5jID0gZm4gPT4gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiBmbih0b1BhdHRlcm5zQXJyYXkocGF0dGVybnMpLCBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpKTtcblxuY29uc3QgZ2V0SWdub3JlRmlsZXNQYXR0ZXJucyA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCB7aWdub3JlRmlsZXMsIGdpdGlnbm9yZX0gPSBvcHRpb25zO1xuXG5cdGNvbnN0IHBhdHRlcm5zID0gaWdub3JlRmlsZXMgPyB0b1BhdHRlcm5zQXJyYXkoaWdub3JlRmlsZXMpIDogW107XG5cdGlmIChnaXRpZ25vcmUpIHtcblx0XHRwYXR0ZXJucy5wdXNoKEdJVElHTk9SRV9GSUxFU19QQVRURVJOKTtcblx0fVxuXG5cdHJldHVybiBwYXR0ZXJucztcbn07XG5cbmNvbnN0IGdldEZpbHRlciA9IGFzeW5jIG9wdGlvbnMgPT4ge1xuXHRjb25zdCBpZ25vcmVGaWxlc1BhdHRlcm5zID0gZ2V0SWdub3JlRmlsZXNQYXR0ZXJucyhvcHRpb25zKTtcblx0cmV0dXJuIGNyZWF0ZUZpbHRlckZ1bmN0aW9uKFxuXHRcdGlnbm9yZUZpbGVzUGF0dGVybnMubGVuZ3RoID4gMCAmJiBhd2FpdCBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzKGlnbm9yZUZpbGVzUGF0dGVybnMsIG9wdGlvbnMpLFxuXHQpO1xufTtcblxuY29uc3QgZ2V0RmlsdGVyU3luYyA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBpZ25vcmVGaWxlc1BhdHRlcm5zID0gZ2V0SWdub3JlRmlsZXNQYXR0ZXJucyhvcHRpb25zKTtcblx0cmV0dXJuIGNyZWF0ZUZpbHRlckZ1bmN0aW9uKFxuXHRcdGlnbm9yZUZpbGVzUGF0dGVybnMubGVuZ3RoID4gMCAmJiBpc0lnbm9yZWRCeUlnbm9yZUZpbGVzU3luYyhpZ25vcmVGaWxlc1BhdHRlcm5zLCBvcHRpb25zKSxcblx0KTtcbn07XG5cbmNvbnN0IGNyZWF0ZUZpbHRlckZ1bmN0aW9uID0gaXNJZ25vcmVkID0+IHtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcblxuXHRyZXR1cm4gZmFzdEdsb2JSZXN1bHQgPT4ge1xuXHRcdGNvbnN0IHBhdGggPSBmYXN0R2xvYlJlc3VsdC5wYXRoIHx8IGZhc3RHbG9iUmVzdWx0O1xuXHRcdGNvbnN0IHBhdGhLZXkgPSBub2RlUGF0aC5ub3JtYWxpemUocGF0aCk7XG5cdFx0Y29uc3Qgc2Vlbk9ySWdub3JlZCA9IHNlZW4uaGFzKHBhdGhLZXkpIHx8IChpc0lnbm9yZWQgJiYgaXNJZ25vcmVkKHBhdGgpKTtcblx0XHRzZWVuLmFkZChwYXRoS2V5KTtcblx0XHRyZXR1cm4gIXNlZW5Pcklnbm9yZWQ7XG5cdH07XG59O1xuXG5jb25zdCB1bmlvbkZhc3RHbG9iUmVzdWx0cyA9IChyZXN1bHRzLCBmaWx0ZXIpID0+IHJlc3VsdHMuZmxhdCgpLmZpbHRlcihmYXN0R2xvYlJlc3VsdCA9PiBmaWx0ZXIoZmFzdEdsb2JSZXN1bHQpKTtcbmNvbnN0IHVuaW9uRmFzdEdsb2JTdHJlYW1zID0gKHN0cmVhbXMsIGZpbHRlcikgPT4gbWVyZ2UyKHN0cmVhbXMpLnBpcGUobmV3IEZpbHRlclN0cmVhbShmYXN0R2xvYlJlc3VsdCA9PiBmaWx0ZXIoZmFzdEdsb2JSZXN1bHQpKSk7XG5cbmNvbnN0IGNvbnZlcnROZWdhdGl2ZVBhdHRlcm5zID0gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHRhc2tzID0gW107XG5cblx0d2hpbGUgKHBhdHRlcm5zLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBpbmRleCA9IHBhdHRlcm5zLmZpbmRJbmRleChwYXR0ZXJuID0+IGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pKTtcblxuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdHRhc2tzLnB1c2goe3BhdHRlcm5zLCBvcHRpb25zfSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRjb25zdCBpZ25vcmVQYXR0ZXJuID0gcGF0dGVybnNbaW5kZXhdLnNsaWNlKDEpO1xuXG5cdFx0Zm9yIChjb25zdCB0YXNrIG9mIHRhc2tzKSB7XG5cdFx0XHR0YXNrLm9wdGlvbnMuaWdub3JlLnB1c2goaWdub3JlUGF0dGVybik7XG5cdFx0fVxuXG5cdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHtcblx0XHRcdFx0cGF0dGVybnM6IHBhdHRlcm5zLnNsaWNlKDAsIGluZGV4KSxcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRcdFx0aWdub3JlOiBbXG5cdFx0XHRcdFx0XHQuLi5vcHRpb25zLmlnbm9yZSxcblx0XHRcdFx0XHRcdGlnbm9yZVBhdHRlcm4sXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHBhdHRlcm5zID0gcGF0dGVybnMuc2xpY2UoaW5kZXggKyAxKTtcblx0fVxuXG5cdHJldHVybiB0YXNrcztcbn07XG5cbmNvbnN0IGdldERpckdsb2JPcHRpb25zID0gKG9wdGlvbnMsIGN3ZCkgPT4gKHtcblx0Li4uKGN3ZCA/IHtjd2R9IDoge30pLFxuXHQuLi4oQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IHtmaWxlczogb3B0aW9uc30gOiBvcHRpb25zKSxcbn0pO1xuXG5jb25zdCBnZW5lcmF0ZVRhc2tzID0gYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IGdsb2JUYXNrcyA9IGNvbnZlcnROZWdhdGl2ZVBhdHRlcm5zKHBhdHRlcm5zLCBvcHRpb25zKTtcblxuXHRjb25zdCB7Y3dkLCBleHBhbmREaXJlY3Rvcmllc30gPSBvcHRpb25zO1xuXG5cdGlmICghZXhwYW5kRGlyZWN0b3JpZXMpIHtcblx0XHRyZXR1cm4gZ2xvYlRhc2tzO1xuXHR9XG5cblx0Y29uc3QgcGF0dGVybkV4cGFuZE9wdGlvbnMgPSBnZXREaXJHbG9iT3B0aW9ucyhleHBhbmREaXJlY3RvcmllcywgY3dkKTtcblx0Y29uc3QgaWdub3JlRXhwYW5kT3B0aW9ucyA9IGN3ZCA/IHtjd2R9IDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRnbG9iVGFza3MubWFwKGFzeW5jIHRhc2sgPT4ge1xuXHRcdFx0bGV0IHtwYXR0ZXJucywgb3B0aW9uc30gPSB0YXNrO1xuXG5cdFx0XHRbXG5cdFx0XHRcdHBhdHRlcm5zLFxuXHRcdFx0XHRvcHRpb25zLmlnbm9yZSxcblx0XHRcdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRcdGRpckdsb2IocGF0dGVybnMsIHBhdHRlcm5FeHBhbmRPcHRpb25zKSxcblx0XHRcdFx0ZGlyR2xvYihvcHRpb25zLmlnbm9yZSwgaWdub3JlRXhwYW5kT3B0aW9ucyksXG5cdFx0XHRdKTtcblxuXHRcdFx0cmV0dXJuIHtwYXR0ZXJucywgb3B0aW9uc307XG5cdFx0fSksXG5cdCk7XG59O1xuXG5jb25zdCBnZW5lcmF0ZVRhc2tzU3luYyA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCBnbG9iVGFza3MgPSBjb252ZXJ0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cblx0Y29uc3Qge2N3ZCwgZXhwYW5kRGlyZWN0b3JpZXN9ID0gb3B0aW9ucztcblxuXHRpZiAoIWV4cGFuZERpcmVjdG9yaWVzKSB7XG5cdFx0cmV0dXJuIGdsb2JUYXNrcztcblx0fVxuXG5cdGNvbnN0IHBhdHRlcm5FeHBhbmRPcHRpb25zID0gZ2V0RGlyR2xvYk9wdGlvbnMoZXhwYW5kRGlyZWN0b3JpZXMsIGN3ZCk7XG5cdGNvbnN0IGlnbm9yZUV4cGFuZE9wdGlvbnMgPSBjd2QgPyB7Y3dkfSA6IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gZ2xvYlRhc2tzLm1hcCh0YXNrID0+IHtcblx0XHRsZXQge3BhdHRlcm5zLCBvcHRpb25zfSA9IHRhc2s7XG5cdFx0cGF0dGVybnMgPSBkaXJHbG9iLnN5bmMocGF0dGVybnMsIHBhdHRlcm5FeHBhbmRPcHRpb25zKTtcblx0XHRvcHRpb25zLmlnbm9yZSA9IGRpckdsb2Iuc3luYyhvcHRpb25zLmlnbm9yZSwgaWdub3JlRXhwYW5kT3B0aW9ucyk7XG5cdFx0cmV0dXJuIHtwYXR0ZXJucywgb3B0aW9uc307XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdsb2JieSA9IG5vcm1hbGl6ZUFyZ3VtZW50cyhhc3luYyAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgW1xuXHRcdHRhc2tzLFxuXHRcdGZpbHRlcixcblx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRnZW5lcmF0ZVRhc2tzKHBhdHRlcm5zLCBvcHRpb25zKSxcblx0XHRnZXRGaWx0ZXIob3B0aW9ucyksXG5cdF0pO1xuXHRjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwodGFza3MubWFwKHRhc2sgPT4gZmFzdEdsb2IodGFzay5wYXR0ZXJucywgdGFzay5vcHRpb25zKSkpO1xuXG5cdHJldHVybiB1bmlvbkZhc3RHbG9iUmVzdWx0cyhyZXN1bHRzLCBmaWx0ZXIpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBnbG9iYnlTeW5jID0gbm9ybWFsaXplQXJndW1lbnRzU3luYygocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgdGFza3MgPSBnZW5lcmF0ZVRhc2tzU3luYyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cdGNvbnN0IGZpbHRlciA9IGdldEZpbHRlclN5bmMob3B0aW9ucyk7XG5cdGNvbnN0IHJlc3VsdHMgPSB0YXNrcy5tYXAodGFzayA9PiBmYXN0R2xvYi5zeW5jKHRhc2sucGF0dGVybnMsIHRhc2sub3B0aW9ucykpO1xuXG5cdHJldHVybiB1bmlvbkZhc3RHbG9iUmVzdWx0cyhyZXN1bHRzLCBmaWx0ZXIpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBnbG9iYnlTdHJlYW0gPSBub3JtYWxpemVBcmd1bWVudHNTeW5jKChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXNrcyA9IGdlbmVyYXRlVGFza3NTeW5jKHBhdHRlcm5zLCBvcHRpb25zKTtcblx0Y29uc3QgZmlsdGVyID0gZ2V0RmlsdGVyU3luYyhvcHRpb25zKTtcblx0Y29uc3Qgc3RyZWFtcyA9IHRhc2tzLm1hcCh0YXNrID0+IGZhc3RHbG9iLnN0cmVhbSh0YXNrLnBhdHRlcm5zLCB0YXNrLm9wdGlvbnMpKTtcblxuXHRyZXR1cm4gdW5pb25GYXN0R2xvYlN0cmVhbXMoc3RyZWFtcywgZmlsdGVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNEeW5hbWljUGF0dGVybiA9IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMoXG5cdChwYXR0ZXJucywgb3B0aW9ucykgPT4gcGF0dGVybnMuc29tZShwYXR0ZXJuID0+IGZhc3RHbG9iLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucykpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlR2xvYlRhc2tzID0gbm9ybWFsaXplQXJndW1lbnRzKGdlbmVyYXRlVGFza3MpO1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlR2xvYlRhc2tzU3luYyA9IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMoZ2VuZXJhdGVUYXNrc1N5bmMpO1xuXG5leHBvcnQge1xuXHRpc0dpdElnbm9yZWQsXG5cdGlzR2l0SWdub3JlZFN5bmMsXG59IGZyb20gJy4vaWdub3JlLmpzJztcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1vcGVuYXBpXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlbmVyYXRlLXJvdXRlLXR5cGVzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2V4dHJhY3Qtcm91dGUtc3BlYy1zY2hlbWFzXCJcbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHtcbiAgT3BlbkFwaUJ1aWxkZXIsXG4gIE9wZXJhdGlvbk9iamVjdCxcbiAgUGFyYW1ldGVyT2JqZWN0LFxufSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IHsgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IGdlbmVyYXRlU2NoZW1hIH0gZnJvbSBcIi4uL2xpYi96b2Qtb3BlbmFwaVwiXG5pbXBvcnQgeyBlbWJlZFNjaGVtYVJlZmVyZW5jZXMgfSBmcm9tIFwiLi9lbWJlZC1zY2hlbWEtcmVmZXJlbmNlc1wiXG5pbXBvcnQgeyBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEgfSBmcm9tIFwiLi9mZXJuLXNkay11dGlsc1wiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi4vbGliL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuaW1wb3J0IHsgcHJlZml4T2JqZWN0S2V5c1dpdGhYIH0gZnJvbSBcIi4uL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXhcIlxuaW1wb3J0IHsgZGFzaGlmeU9iamVjdEtleXMgfSBmcm9tIFwiLi4vdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5c1wiXG5cbmZ1bmN0aW9uIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZShzdHI6IHN0cmluZykge1xuICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuXG4gIGNvbnN0IGZpcnN0Q2hhciA9IHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKVxuICByZXR1cm4gZmlyc3RDaGFyICsgc3RyLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb09wZXJhdGlvbklkKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aFxuICAgIC5yZXBsYWNlKC8tL2csIFwiX1wiKVxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICBjb25zdCB0cmFuc2Zvcm1lZFBhcnRzID0gcGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgaWYgKHBhcnQuc3RhcnRzV2l0aChcIltcIikgJiYgcGFydC5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBCeVBhcmFtXG4gICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHBhcnQuc2xpY2UoMSwgLTEpXG4gICAgICBjb25zdCB3b3JkcyA9IHNlcnZpY2VOYW1lLnNwbGl0KFwiX1wiKVxuICAgICAgY29uc3QgY2FwaXRhbGl6ZWRXb3JkcyA9IHdvcmRzLm1hcChcbiAgICAgICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpXG4gICAgICApXG4gICAgICByZXR1cm4gYEJ5JHtjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIil9YFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb252ZXJ0IGFwaV9wYXRoIHRvIEFwaVBhdGhcbiAgICAgIGNvbnN0IHdvcmRzID0gcGFydC5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGNhcGl0YWxpemVkV29yZHMuam9pbihcIlwiKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcmVwbGFjZUZpcnN0Q2hhclRvTG93ZXJjYXNlKHRyYW5zZm9ybWVkUGFydHMuam9pbihcIlwiKSlcbn1cblxuZnVuY3Rpb24gcGFzY2FsQ2FzZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5zcGxpdChcIiBcIilcbiAgY29uc3QgY2FwaXRhbGl6ZWRXb3JkcyA9IHdvcmRzLm1hcChcbiAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKVxuICApXG4gIGNvbnN0IHBhc2NhbENhc2VTdHJpbmcgPSBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgcmV0dXJuIHBhc2NhbENhc2VTdHJpbmdcbn1cblxuaW50ZXJmYWNlIFRhZ09wdGlvbiB7XG4gIG5hbWU6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGRvZXNSb3V0ZUhhdmVUYWc/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVPcGVuQVBJT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIHRhZ3M/OiBBcnJheTxUYWdPcHRpb24+XG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhbiBPcGVuQVBJIHNwZWMgZnJvbSB0aGUgTmV4dC5qcyBBUEkgcm91dGVzLlxuICpcbiAqIFlvdSBub3JtYWxseSBpbnZva2UgdGhpcyB3aXRoIGBuZXh0YXBpIGdlbmVyYXRlLW9wZW5hcGlgIGluIGFcbiAqIFwiYnVpbGQ6b3BlbmFwaVwiIHBhY2thZ2UuanNvbiBzY3JpcHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9wZW5BUEkob3B0czogR2VuZXJhdGVPcGVuQVBJT3B0cykge1xuICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdFxuICBjb25zdCB7IG91dHB1dEZpbGUsIHRhZ3MgPSBbXSB9ID0gb3B0c1xuXG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZUZuID0gYXdhaXQgcGFyc2VSb3V0ZXNJblBhY2thZ2Uob3B0cylcblxuICAvLyBUT0RPIGRldGVjdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc2V0dXBzIGFuZCBvdXRwdXQgZGlmZmVyZW50IEFQSXNcbiAgY29uc3QgeyBzZXR1cFBhcmFtczogZ2xvYmFsU2V0dXBQYXJhbXMgfSA9IGZpbGVwYXRoVG9Sb3V0ZUZuLnZhbHVlcygpLm5leHQoKVxuICAgIC52YWx1ZSBhcyB7IHNldHVwUGFyYW1zOiBTZXR1cFBhcmFtcyB9XG5cbiAgY29uc3Qgc2VjdXJpdHlTY2hlbWVzID0gZ2xvYmFsU2V0dXBQYXJhbXMuc2VjdXJpdHlTY2hlbWFzID8/IHt9XG4gIGNvbnN0IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlID0ge31cbiAgZm9yIChjb25zdCBhdXRoTmFtZSBvZiBPYmplY3Qua2V5cyhnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcCkpIHtcbiAgICBjb25zdCBtdyA9IGdsb2JhbFNldHVwUGFyYW1zLmF1dGhNaWRkbGV3YXJlTWFwW2F1dGhOYW1lXVxuICAgIGlmIChtdy5zZWN1cml0eVNjaGVtYSkge1xuICAgICAgc2VjdXJpdHlTY2hlbWVzW2F1dGhOYW1lXSA9IChtdyBhcyBhbnkpLnNlY3VyaXR5U2NoZW1hXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIGBBdXRoZW50aWNhdGlvbiBtaWRkbGV3YXJlIFwiJHthdXRoTmFtZX1cIiBoYXMgbm8gc2VjdXJpdHlTY2hlbWEuIFlvdSBjYW4gZGVmaW5lIHRoaXMgb24gdGhlIGZ1bmN0aW9uIChlLmcuIGFmdGVyIHRoZSBleHBvcnQgZG8uLi4gXFxuXFxubXlNaWRkbGV3YXJlLnNlY3VyaXR5U2NoZW1hID0ge1xcbiAgdHlwZTogXCJodHRwXCJcXG4gIHNjaGVtZTogXCJiZWFyZXJcIlxcbiAgYmVhcmVyRm9ybWF0OiBcIkpXVFwiXFxuIC8vIG9yIEFQSSBUb2tlbiBldGMuXFxufVxcblxcbllvdSBjYW4gYWxzbyBkZWZpbmUgXCJzZWN1cml0eU9iamVjdHNcIiB0aGlzIHdheSwgaWYgeW91IHdhbnQgdG8gbWFrZSB0aGUgZW5kcG9pbnQgc3VwcG9ydCBtdWx0aXBsZSBtb2RlcyBvZiBhdXRoZW50aWNhdGlvbi5cXG5cXG5gXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eU9iamVjdHMgfHwgW1xuICAgICAge1xuICAgICAgICBbYXV0aE5hbWVdOiBbXSxcbiAgICAgIH0sXG4gICAgXVxuICB9XG5cbiAgY29uc3QgZ2xvYmFsU2NoZW1hcyA9IHt9XG4gIGZvciAoY29uc3QgW3NjaGVtYU5hbWUsIHpvZFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgZ2xvYmFsU2V0dXBQYXJhbXMuZ2xvYmFsU2NoZW1hcyA/PyB7fVxuICApKSB7XG4gICAgZ2xvYmFsU2NoZW1hc1tzY2hlbWFOYW1lXSA9IGdlbmVyYXRlU2NoZW1hKHpvZFNjaGVtYSlcbiAgfVxuXG4gIC8vIEJ1aWxkIE9wZW5BUEkgc3BlY1xuICBjb25zdCBidWlsZGVyID0gT3BlbkFwaUJ1aWxkZXIuY3JlYXRlKHtcbiAgICBvcGVuYXBpOiBcIjMuMC4wXCIsXG4gICAgaW5mbzoge1xuICAgICAgdGl0bGU6IGdsb2JhbFNldHVwUGFyYW1zLmFwaU5hbWUsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgfSxcbiAgICBzZXJ2ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIHVybDogZ2xvYmFsU2V0dXBQYXJhbXMucHJvZHVjdGlvblNlcnZlclVybCB8fCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0YWdzOiB0YWdzLm1hcCgodGFnKSA9PiAoeyBuYW1lOiB0YWcubmFtZSwgZGVzY3JpcHRpb246IHRhZy5kZXNjcmlwdGlvbiB9KSksXG4gICAgcGF0aHM6IHt9LFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lcyxcbiAgICAgIHNjaGVtYXM6IGdsb2JhbFNjaGVtYXMsXG4gICAgfSxcbiAgfSlcblxuICBmb3IgKGNvbnN0IFtcbiAgICBmaWxlX3BhdGgsXG4gICAgeyBzZXR1cFBhcmFtcywgcm91dGVTcGVjLCByb3V0ZTogcm91dGVQYXRoIH0sXG4gIF0gb2YgZmlsZXBhdGhUb1JvdXRlRm4pIHtcbiAgICBjb25zdCBtZXRob2RzID0gcm91dGVTcGVjLm1ldGhvZHNcbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgZGVzY3JpcHRpb25NZXRhZGF0YToge1xuICAgICAgcmVzcG9uc2Vfa2V5Pzogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGEgPSBhdHRyaWJ1dGVzXG4gICAgICAgIGRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZERlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSA9IHByZWZpeE9iamVjdEtleXNXaXRoWChcbiAgICAgIGRhc2hpZnlPYmplY3RLZXlzKGRlc2NyaXB0aW9uTWV0YWRhdGEpXG4gICAgKVxuXG4gICAgY29uc3QgbWV0aG9kUm91dGVzOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRpb25PYmplY3Q+ID0ge31cblxuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGlzUG9zdE9yUHV0T3JQYXRjaCA9IFtcIlBPU1RcIiwgXCJQVVRcIiwgXCJQQVRDSFwiXS5pbmNsdWRlcyhtZXRob2QpXG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgICAgbGV0IGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgICBpZiAocm91dGVTcGVjLmpzb25Cb2R5ICYmIHJvdXRlU3BlYy5jb21tb25QYXJhbXMpIHtcbiAgICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keS5tZXJnZShcbiAgICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5XG4gICAgICB9XG5cbiAgICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPVxuICAgICAgICAgIHJvdXRlU3BlYy5xdWVyeVBhcmFtcyA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zLm1lcmdlKFxuICAgICAgICAgICAgcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZTogT3BlcmF0aW9uT2JqZWN0ID0ge1xuICAgICAgICAuLi5yb3V0ZVNwZWMub3BlbkFwaU1ldGFkYXRhLFxuICAgICAgICAuLi5mb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhLFxuICAgICAgICBzdW1tYXJ5OiByb3V0ZVBhdGgsXG4gICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgbWV0aG9kXG4gICAgICAgICl9YCxcbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPS1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJCYWQgUmVxdWVzdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAxOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJVbmF1dGhvcml6ZWRcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eTogQXJyYXkuaXNBcnJheShyb3V0ZVNwZWMuYXV0aClcbiAgICAgICAgICA/IHJvdXRlU3BlYy5hdXRoXG4gICAgICAgICAgICAgIC5tYXAoKGF1dGhUeXBlKSA9PiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoVHlwZV0pXG4gICAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICA6IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlW3JvdXRlU3BlYy5hdXRoXSxcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIHJvdXRlLnJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICAgIHNjaGVtYTogZ2VuZXJhdGVTY2hlbWEoYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpXG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlck9iamVjdFtdID0gT2JqZWN0LmtleXMoXG4gICAgICAgICAgICBzY2hlbWEucHJvcGVydGllcyBhcyBhbnlcbiAgICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEucHJvcGVydGllcyFbbmFtZV0sXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBzY2hlbWEucmVxdWlyZWQ/LmluY2x1ZGVzKG5hbWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByb3V0ZS5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsganNvblJlc3BvbnNlIH0gPSByb3V0ZVNwZWNcbiAgICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgICBpZiAoanNvblJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhanNvblJlc3BvbnNlLl9kZWYgfHxcbiAgICAgICAgICAhanNvblJlc3BvbnNlLl9kZWYudHlwZU5hbWUgfHxcbiAgICAgICAgICBqc29uUmVzcG9uc2UuX2RlZi50eXBlTmFtZSAhPT0gXCJab2RPYmplY3RcIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoXG4gICAgICAgICAgYWRkT2tTdGF0dXMgJiYganNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgID8ganNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgOiBqc29uUmVzcG9uc2VcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHNjaGVtYVdpdGhSZWZlcmVuY2VzID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKFxuICAgICAgICAgIHJlc3BvbnNlU2NoZW1hLFxuICAgICAgICAgIGdsb2JhbFNjaGVtYXNcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChyb3V0ZS5yZXNwb25zZXMgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBub3QgaGFyZGNvZGUgMjAwIGhlcmVcbiAgICAgICAgICByb3V0ZS5yZXNwb25zZXNbMjAwXS5jb250ZW50ID0ge1xuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFXaXRoUmVmZXJlbmNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJvdXRlLnRhZ3MgPSBbXVxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICBpZiAodGFnLmRvZXNSb3V0ZUhhdmVUYWcgJiYgdGFnLmRvZXNSb3V0ZUhhdmVUYWcocm91dGUuc3VtbWFyeSB8fCBcIlwiKSkge1xuICAgICAgICAgIHJvdXRlLnRhZ3MucHVzaCh0YWcubmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGEgPSBhd2FpdCBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICAgICAgICBtZXRob2RzOiBbbWV0aG9kXSwgLy8gT25seSBwYXNzIHRoaXMgc3BlY2lmaWMgbWV0aG9kXG4gICAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgICAgc2RrUmV0dXJuVmFsdWU6XG4gICAgICAgICAgZGVzY3JpcHRpb25NZXRhZGF0YT8ucmVzcG9uc2Vfa2V5ID8/IHJvdXRlU3BlYy5zZGtSZXR1cm5WYWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGUsIG1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdKVxuICAgICAgbWV0aG9kUm91dGVzW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA9IHJvdXRlXG4gICAgfVxuXG4gICAgYnVpbGRlci5hZGRQYXRoKHJvdXRlUGF0aCwgbWV0aG9kUm91dGVzKVxuICB9XG5cbiAgaWYgKG91dHB1dEZpbGUpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0RmlsZSwgYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMikpXG4gIH1cblxuICByZXR1cm4gYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMilcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFJvdXRlU3BlYywgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgc2V0dXBQYXJhbXM6IFNldHVwUGFyYW1zXG4gIHJvdXRlU3BlYzogUm91dGVTcGVjXG4gIHJvdXRlRm46IEZ1bmN0aW9uXG4gIHJvdXRlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUm91dGVzSW5QYWNrYWdlID0gYXN5bmMgKG9wdHM6IHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbn0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4+ID0+IHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgZ2xvYmJ5ID0gKGF3YWl0IGltcG9ydChcImdsb2JieVwiKSkuZ2xvYmJ5XG4gIGNvbnN0IHtcbiAgICBwYWNrYWdlRGlyLFxuICAgIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIixcbiAgICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlID0gZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUob3B0cy5hcGlQcmVmaXgpLFxuICB9ID0gb3B0c1xuICAvLyBMb2FkIGFsbCByb3V0ZSBzcGVjc1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG4gIGNvbnNvbGUubG9nKGBzZWFyY2hpbmcgXCIke2Z1bGxQYXRoR2xvYn1cIi4uLmApXG4gIGNvbnN0IGZpbGVwYXRocyA9IGF3YWl0IGdsb2JieShgJHtmdWxsUGF0aEdsb2J9YClcbiAgY29uc29sZS5sb2coYGZvdW5kICR7ZmlsZXBhdGhzLmxlbmd0aH0gZmlsZXNgKVxuICBpZiAoZmlsZXBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmlsZXMgZm91bmQgYXQgXCIke2Z1bGxQYXRoR2xvYn1cImApXG4gIH1cbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlRm4gPSBuZXcgTWFwPHN0cmluZywgUm91dGVJbmZvPigpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXBhdGhzLm1hcChhc3luYyAocCkgPT4ge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiByb3V0ZUZuIH0gPSBhd2FpdCByZXF1aXJlKHBhdGgucmVzb2x2ZShwKSlcblxuICAgICAgaWYgKHJvdXRlRm4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJvdXRlRm4uX3JvdXRlU3BlYz8uZXhjbHVkZUZyb21PcGVuQXBpICYmXG4gICAgICAgICAgIW9wdHMuaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlc1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH0gYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQgZnJvbSBPcGVuQVBJIGdlbmVyYXRpb25cImBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3V0ZUZuLl9zZXR1cFBhcmFtcykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfVwiIGJlY2F1c2UgaXQgd2Fzbid0IGNyZWF0ZWQgd2l0aCB3aXRoUm91dGVTcGVjYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmaWxlcGF0aFRvUm91dGVGbi5zZXQocCwge1xuICAgICAgICAgIHNldHVwUGFyYW1zOiByb3V0ZUZuLl9zZXR1cFBhcmFtcyxcbiAgICAgICAgICByb3V0ZVNwZWM6IHJvdXRlRm4uX3JvdXRlU3BlYyxcbiAgICAgICAgICByb3V0ZTogbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShwKSxcbiAgICAgICAgICByb3V0ZUZuLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgQ291bGRuJ3QgZmluZCByb3V0ZSAke3B9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgKVxuXG4gIHJldHVybiBmaWxlcGF0aFRvUm91dGVGblxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlID1cbiAgKGFwaV9wcmVmaXg6IHN0cmluZyA9IFwiL2FwaVwiKSA9PlxuICAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb3V0ZSA9IGZpbGVfcGF0aFxuICAgICAgLy8gcmVwbGFjZSAuLyBpZiBpdCBzdGFydHMgd2l0aCAuL1xuICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCBcIi9cIilcbiAgICAgIC8vIHJlcGxhY2Ugc3RhcnRpbmcgL1xuICAgICAgLnJlcGxhY2UoL15cXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvc3JjIGlmIGl0IHN0YXJ0cyB3aXRoIC9zcmNcbiAgICAgIC5yZXBsYWNlKC9ec3JjXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL3BhZ2VzIGlmIGl0IHN0YXJ0cyB3aXRoIC9wYWdlc1xuICAgICAgLnJlcGxhY2UoL15wYWdlc1xcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9hcGkgaWYgaXQgc3RhcnRzIHdpdGggL2FwaVxuICAgICAgLnJlcGxhY2UoL15hcGlcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAudHMgaWYgaXQgZW5kcyB3aXRoIC50c1xuICAgICAgLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpXG4gICAgICAvLyByZW1vdmUgcHVibGljIHJlZmVyZW5jZVxuICAgICAgLnJlcGxhY2UoXCJwdWJsaWNcIiwgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgaW5kZXggaWYgaXQgZW5kcyB3aXRoIGluZGV4XG4gICAgICAucmVwbGFjZSgvXFwvXFxpbmRleCg/IS4pLywgXCJcIilcblxuICAgIHJldHVybiBwYXRoLmpvaW4oYXBpX3ByZWZpeCwgcm91dGUpXG4gIH1cbiIsICIvKipcbiAqIFpvZCBPcGVuQVBJIEdlbmVyYXRvci5cbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmF0aW5lL3pvZC1wbHVnaW5zXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQnJpYW4gTWNCcmlkZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTY2hlbWFPYmplY3QsIFNjaGVtYU9iamVjdFR5cGUgfSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IG1lcmdlIGZyb20gXCJ0cy1kZWVwbWVyZ2VcIlxuaW1wb3J0IHsgQW55Wm9kT2JqZWN0LCB6LCBab2RUeXBlQW55IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBwYXJzZUZyb250TWF0dGVyLCB0ZXN0RnJvbnRNYXR0ZXIgfSBmcm9tIFwiLi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuXG50eXBlIEFuYXRpbmVTY2hlbWFPYmplY3QgPSBTY2hlbWFPYmplY3QgJiB7IGhpZGVEZWZpbml0aW9ucz86IHN0cmluZ1tdIH1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQXBpWm9kQW55IGV4dGVuZHMgWm9kVHlwZUFueSB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgT3BlbkFwaVpvZEFueU9iamVjdCBleHRlbmRzIEFueVpvZE9iamVjdCB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgUGFyc2luZ0FyZ3M8VD4ge1xuICB6b2RSZWY6IFRcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbiAgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEFwaTxUIGV4dGVuZHMgT3BlbkFwaVpvZEFueT4oXG4gIHNjaGVtYTogVCxcbiAgc2NoZW1hT2JqZWN0OiBBbmF0aW5lU2NoZW1hT2JqZWN0ID0ge31cbik6IFQge1xuICBzY2hlbWEubWV0YU9wZW5BcGkgPSBPYmplY3QuYXNzaWduKHNjaGVtYS5tZXRhT3BlbkFwaSB8fCB7fSwgc2NoZW1hT2JqZWN0KVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGVab2RPYmplY3Qoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgaGlkZURlZmluaXRpb25zLFxufTogUGFyc2luZ0FyZ3M8T3BlbkFwaVpvZEFueU9iamVjdD4pIHtcbiAgY29uc3QgcmVkdWNlZCA9IE9iamVjdC5rZXlzKHpvZFJlZi5zaGFwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+IGhpZGVEZWZpbml0aW9ucz8uaW5jbHVkZXMoa2V5KSA9PT0gZmFsc2UpXG4gICAgLnJlZHVjZShcbiAgICAgIChjYXJyeSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5jYXJyeSxcbiAgICAgICAgW2tleV06IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5zaGFwZVtrZXldLCB1c2VPdXRwdXQpLFxuICAgICAgfSksXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWFPYmplY3Q+XG4gICAgKVxuXG4gIHJldHVybiByZWR1Y2VkXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmOiBPcGVuQXBpWm9kQW55KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKCF6b2RSZWYuZGVzY3JpcHRpb24pIHJldHVybiB7fVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoem9kUmVmLmRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKVxuICAgIHJldHVybiB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmIChib2R5LnRyaW0oKSkgb3V0cHV0LmRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKFxuICAgICAgcHJlZml4T2JqZWN0S2V5c1dpdGhYKGRhc2hpZnlPYmplY3RLZXlzKGF0dHJpYnV0ZXMpKVxuICAgICkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuZnVuY3Rpb24gcGFyc2VUcmFuc2Zvcm1hdGlvbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RUcmFuc2Zvcm1lcjxuZXZlcj4gfCB6LlpvZEVmZmVjdHM8bmV2ZXI+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGlucHV0ID0gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuc2NoZW1hLCB1c2VPdXRwdXQpXG5cbiAgbGV0IG91dHB1dCA9IFwidW5kZWZpbmVkXCJcbiAgaWYgKHVzZU91dHB1dCAmJiB6b2RSZWYuX2RlZi5lZmZlY3QpIHtcbiAgICBjb25zdCBlZmZlY3QgPVxuICAgICAgem9kUmVmLl9kZWYuZWZmZWN0LnR5cGUgPT09IFwidHJhbnNmb3JtXCIgPyB6b2RSZWYuX2RlZi5lZmZlY3QgOiBudWxsXG4gICAgaWYgKGVmZmVjdCAmJiBcInRyYW5zZm9ybVwiIGluIGVmZmVjdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3V0cHV0ID0gdHlwZW9mIGVmZmVjdC50cmFuc2Zvcm0oXG4gICAgICAgICAgW1wiaW50ZWdlclwiLCBcIm51bWJlclwiXS5pbmNsdWRlcyhgJHtpbnB1dC50eXBlfWApXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICA6IFwiYm9vbGVhblwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IFwib2JqZWN0XCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogXCJudWxsXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBcImFycmF5XCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHsgYWRkSXNzdWU6ICgpID0+IHVuZGVmaW5lZCwgcGF0aDogW10gfSAvLyBUT0RPOiBEaXNjb3ZlciBpZiBjb250ZXh0IGlzIG5lY2Vzc2FyeSBoZXJlXG4gICAgICAgIClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLyoqL1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgLi4uKHpvZFJlZi5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uaW5wdXQsXG4gICAgICAuLi4oW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwiYm9vbGVhblwiLCBcIm51bGxcIl0uaW5jbHVkZXMob3V0cHV0KVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6IG91dHB1dCBhcyBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwiYm9vbGVhblwiIHwgXCJudWxsXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kU3RyaW5nPik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGJhc2VTY2hlbWE6IFNjaGVtYU9iamVjdCA9IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICB9XG4gIGNvbnN0IHsgY2hlY2tzID0gW10gfSA9IHpvZFJlZi5fZGVmXG4gIGNoZWNrcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgc3dpdGNoIChpdGVtLmtpbmQpIHtcbiAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwiZW1haWxcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcInV1aWRcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImN1aWRcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImN1aWRcIlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInVybFwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwidXJpXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICBiYXNlU2NoZW1hLmZvcm1hdCA9IFwiZGF0ZS10aW1lXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJsZW5ndGhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5taW5MZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJhc2VTY2hlbWEubWF4TGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtaW5cIjpcbiAgICAgICAgYmFzZVNjaGVtYS5taW5MZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwicmVnZXhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5wYXR0ZXJuID0gaXRlbS5yZWdleC5zb3VyY2VcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH0pXG4gIHJldHVybiBtZXJnZShiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdW1iZXI+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgZm9ybWF0OiBcImZsb2F0XCIsXG4gIH1cbiAgY29uc3QgeyBjaGVja3MgPSBbXSB9ID0gem9kUmVmLl9kZWZcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1heGltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVVBTVFJFQU06IFRoZSBvcGVuYXBpMy10cyB0eXBlcyBhcmUgd3Jvbmc6IGV4Y2x1c2l2ZU1heGltdW0gaXMgYSBib29sZWFuIGluIHRoaXMgdmVyc2lvbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi92M18wL2RhdGEtbW9kZWxzL2RhdGEtdHlwZXMvXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtaW5cIjpcbiAgICAgICAgYmFzZVNjaGVtYS5taW5pbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVQU1RSRUFNOiBUaGUgb3BlbmFwaTMtdHMgdHlwZXMgYXJlIHdyb25nOiBleGNsdXNpdmVNaW5pbXVtIGlzIGEgYm9vbGVhbiBpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vdjNfMC9kYXRhLW1vZGVscy9kYXRhLXR5cGVzL1xuICAgICAgICBpZiAoIWl0ZW0uaW5jbHVzaXZlKSBiYXNlU2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiaW50XCI6XG4gICAgICAgIGJhc2VTY2hlbWEudHlwZSA9IFwiaW50ZWdlclwiXG4gICAgICAgIGRlbGV0ZSBiYXNlU2NoZW1hLmZvcm1hdFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm11bHRpcGxlT2ZcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tdWx0aXBsZU9mID0gaXRlbS52YWx1ZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlKGJhc2VTY2hlbWEsIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gZ2V0RXhjbHVkZWREZWZpbml0aW9uc0Zyb21TY2hlbWEoXG4gIHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBleGNsdWRlZERlZmluaXRpb25zOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3Qgc2NoZW1hIG9mIHNjaGVtYXMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuaGlkZURlZmluaXRpb25zKSkge1xuICAgICAgZXhjbHVkZWREZWZpbml0aW9ucy5wdXNoKC4uLnNjaGVtYS5oaWRlRGVmaW5pdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4Y2x1ZGVkRGVmaW5pdGlvbnNcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3Qoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbiAgaGlkZURlZmluaXRpb25zLFxufTogUGFyc2luZ0FyZ3M8XG4gIHouWm9kT2JqZWN0PG5ldmVyLCBcInBhc3N0aHJvdWdoXCIgfCBcInN0cmljdFwiIHwgXCJzdHJpcFwiPlxuPik6IFNjaGVtYU9iamVjdCB7XG4gIGxldCBhZGRpdGlvbmFsUHJvcGVydGllczogU2NoZW1hT2JqZWN0W1wiYWRkaXRpb25hbFByb3BlcnRpZXNcIl1cblxuICAvLyBgY2F0Y2hhbGxgIG9idmlhdGVzIGBzdHJpY3RgLCBgc3RyaXBgLCBhbmQgYHBhc3N0aHJvdWdoYFxuICBpZiAoXG4gICAgIShcbiAgICAgIHpvZFJlZi5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2Ygei5ab2ROZXZlciB8fFxuICAgICAgem9kUmVmLl9kZWYuY2F0Y2hhbGw/Ll9kZWYudHlwZU5hbWUgPT09IFwiWm9kTmV2ZXJcIlxuICAgIClcbiAgKVxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuY2F0Y2hhbGwsIHVzZU91dHB1dClcbiAgZWxzZSBpZiAoem9kUmVmLl9kZWYudW5rbm93bktleXMgPT09IFwicGFzc3Rocm91Z2hcIilcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyA9IHRydWVcbiAgZWxzZSBpZiAoem9kUmVmLl9kZWYudW5rbm93bktleXMgPT09IFwic3RyaWN0XCIpIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2VcblxuICAvLyBTbyB0aGF0IGB1bmRlZmluZWRgIHZhbHVlcyBkb24ndCBlbmQgdXAgaW4gdGhlIHNjaGVtYSBhbmQgYmUgd2VpcmRcbiAgYWRkaXRpb25hbFByb3BlcnRpZXMgPVxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzICE9IG51bGwgPyB7IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIH0gOiB7fVxuXG4gIGNvbnN0IHJlcXVpcmVkUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKFxuICAgICh6b2RSZWYgYXMgei5Bbnlab2RPYmplY3QpLnNoYXBlXG4gICkuZmlsdGVyKChrZXkpID0+IHtcbiAgICBjb25zdCBpdGVtID0gKHpvZFJlZiBhcyB6LkFueVpvZE9iamVjdCkuc2hhcGVba2V5XVxuICAgIHJldHVybiAoXG4gICAgICAhKFxuICAgICAgICBpdGVtLmlzT3B0aW9uYWwoKSB8fFxuICAgICAgICBpdGVtIGluc3RhbmNlb2Ygei5ab2REZWZhdWx0IHx8XG4gICAgICAgIGl0ZW0uX2RlZi50eXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCJcbiAgICAgICkgJiYgIShpdGVtIGluc3RhbmNlb2Ygei5ab2ROZXZlciB8fCBpdGVtLl9kZWYudHlwZU5hbWUgPT09IFwiWm9kRGVmYXVsdFwiKVxuICAgIClcbiAgfSlcblxuICBjb25zdCByZXF1aXJlZCA9XG4gICAgcmVxdWlyZWRQcm9wZXJ0aWVzLmxlbmd0aCA+IDAgPyB7IHJlcXVpcmVkOiByZXF1aXJlZFByb3BlcnRpZXMgfSA6IHt9XG5cbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIHByb3BlcnRpZXM6IGl0ZXJhdGVab2RPYmplY3Qoe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBPcGVuQXBpWm9kQW55T2JqZWN0LFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICAgIGhpZGVEZWZpbml0aW9uczogZ2V0RXhjbHVkZWREZWZpbml0aW9uc0Zyb21TY2hlbWEoc2NoZW1hcyksXG4gICAgICB9KSxcbiAgICAgIC4uLnJlcXVpcmVkLFxuICAgICAgLi4uYWRkaXRpb25hbFByb3BlcnRpZXMsXG4gICAgICAuLi5oaWRlRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlY29yZD4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogXCJvYmplY3RcIiBhcyBTY2hlbWFPYmplY3RUeXBlLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6XG4gICAgICAgIHpvZFJlZi5fZGVmLnZhbHVlVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93blxuICAgICAgICAgID8ge31cbiAgICAgICAgICA6IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnZhbHVlVHlwZSwgdXNlT3V0cHV0KSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VCaWdJbnQoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJpZ0ludD4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcImludGVnZXJcIiBhcyBTY2hlbWFPYmplY3RUeXBlLCBmb3JtYXQ6IFwiaW50NjRcIiB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VCb29sZWFuKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCb29sZWFuPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwiYm9vbGVhblwiIGFzIFNjaGVtYU9iamVjdFR5cGUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZSh7IHpvZFJlZiwgc2NoZW1hcyB9OiBQYXJzaW5nQXJnczx6LlpvZERhdGU+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJzdHJpbmdcIiBhcyBTY2hlbWFPYmplY3RUeXBlLCBmb3JtYXQ6IFwiZGF0ZS10aW1lXCIgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVsbCh7IHpvZFJlZiwgc2NoZW1hcyB9OiBQYXJzaW5nQXJnczx6LlpvZE51bGw+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU9wdGlvbmFsKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZE9wdGlvbmFsPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dCksXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGxhYmxlKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bGxhYmxlPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KVxuICByZXR1cm4gbWVyZ2UoXG4gICAgeyAuLi5zY2hlbWEsIHR5cGU6IHNjaGVtYS50eXBlLCBudWxsYWJsZTogdHJ1ZSB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VEZWZhdWx0KHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZERlZmF1bHQ8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGRlZmF1bHQ6IHpvZFJlZi5fZGVmLmRlZmF1bHRWYWx1ZSgpLFxuICAgICAgLi4uZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW5uZXJUeXBlLCB1c2VPdXRwdXQpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUFycmF5KHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEFycmF5PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnN0cmFpbnRzOiBTY2hlbWFPYmplY3QgPSB7fVxuICBpZiAoem9kUmVmLl9kZWYuZXhhY3RMZW5ndGggIT0gbnVsbCkge1xuICAgIGNvbnN0cmFpbnRzLm1pbkl0ZW1zID0gem9kUmVmLl9kZWYuZXhhY3RMZW5ndGgudmFsdWVcbiAgICBjb25zdHJhaW50cy5tYXhJdGVtcyA9IHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoLnZhbHVlXG4gIH1cblxuICBpZiAoem9kUmVmLl9kZWYubWluTGVuZ3RoICE9IG51bGwpXG4gICAgY29uc3RyYWludHMubWluSXRlbXMgPSB6b2RSZWYuX2RlZi5taW5MZW5ndGgudmFsdWVcbiAgaWYgKHpvZFJlZi5fZGVmLm1heExlbmd0aCAhPSBudWxsKVxuICAgIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gem9kUmVmLl9kZWYubWF4TGVuZ3RoLnZhbHVlXG5cbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIiBhcyBTY2hlbWFPYmplY3RUeXBlLFxuICAgICAgaXRlbXM6IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5lbGVtZW50LCB1c2VPdXRwdXQpLFxuICAgICAgLi4uY29uc3RyYWludHMsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTGl0ZXJhbCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbn06IFBhcnNpbmdBcmdzPHouWm9kTGl0ZXJhbDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogdHlwZW9mIHpvZFJlZi5fZGVmLnZhbHVlIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIsXG4gICAgICBlbnVtOiBbem9kUmVmLl9kZWYudmFsdWVdLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUVudW0oe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG59OiBQYXJzaW5nQXJnczx6LlpvZEVudW08bmV2ZXI+IHwgei5ab2ROYXRpdmVFbnVtPG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgdHlwZTogdHlwZW9mIE9iamVjdC52YWx1ZXMoem9kUmVmLl9kZWYudmFsdWVzKVswXSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIixcbiAgICAgIGVudW06IE9iamVjdC52YWx1ZXMoem9kUmVmLl9kZWYudmFsdWVzKSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VJbnRlcnNlY3Rpb24oe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZUFueSwgei5ab2RUeXBlQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgYWxsT2Y6IFtcbiAgICAgICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYubGVmdCwgdXNlT3V0cHV0KSxcbiAgICAgICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYucmlnaHQsIHVzZU91dHB1dCksXG4gICAgICBdLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFVuaW9uPFt6LlpvZFR5cGVBbnksIC4uLnouWm9kVHlwZUFueVtdXT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29udGVudHMgPSB6b2RSZWYuX2RlZi5vcHRpb25zXG4gIGlmIChcbiAgICBjb250ZW50cy5yZWR1Y2UoXG4gICAgICAocHJldiwgY29udGVudCkgPT4gcHJldiAmJiBjb250ZW50Ll9kZWYudHlwZU5hbWUgPT09IFwiWm9kTGl0ZXJhbFwiLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKSB7XG4gICAgLy8gc3BlY2lhbCBjYXNlIHRvIHRyYW5zZm9ybSB1bmlvbnMgb2YgbGl0ZXJhbHMgaW50byBlbnVtc1xuICAgIGNvbnN0IGxpdGVyYWxzID0gY29udGVudHMgYXMgdW5rbm93biBhcyB6LlpvZExpdGVyYWw8T3BlbkFwaVpvZEFueT5bXVxuICAgIGNvbnN0IHR5cGUgPSBsaXRlcmFscy5yZWR1Y2UoXG4gICAgICAocHJldiwgY29udGVudCkgPT5cbiAgICAgICAgIXByZXYgfHwgcHJldiA9PT0gdHlwZW9mIGNvbnRlbnQuX2RlZi52YWx1ZVxuICAgICAgICAgID8gdHlwZW9mIGNvbnRlbnQuX2RlZi52YWx1ZVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIG51bGwgYXMgbnVsbCB8IHN0cmluZ1xuICAgIClcblxuICAgIGlmICh0eXBlKSB7XG4gICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIsXG4gICAgICAgICAgZW51bTogbGl0ZXJhbHMubWFwKChsaXRlcmFsKSA9PiBsaXRlcmFsLl9kZWYudmFsdWUpLFxuICAgICAgICB9LFxuICAgICAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgICAgIC4uLnNjaGVtYXNcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc051bGxhYmxlID0gY29udGVudHMuc29tZShcbiAgICAoY29udGVudCkgPT4gY29udGVudC5fZGVmLnR5cGVOYW1lID09PSBcIlpvZE51bGxcIlxuICApXG4gIGNvbnN0IG5vbk51bGxDb250ZW50cyA9IGNvbnRlbnRzLmZpbHRlcihcbiAgICAoY29udGVudCkgPT4gY29udGVudC5fZGVmLnR5cGVOYW1lICE9PSBcIlpvZE51bGxcIlxuICApXG5cbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIG9uZU9mOiBub25OdWxsQ29udGVudHMubWFwKChzY2hlbWEpID0+IGdlbmVyYXRlU2NoZW1hKHNjaGVtYSwgdXNlT3V0cHV0KSksXG4gICAgICAuLi4oaXNOdWxsYWJsZSA/IHsgbnVsbGFibGU6IHRydWUgfSA6IHt9KSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VEaXNjcmltaW5hdGVkVW5pb24oe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPFxuICB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxzdHJpbmcsIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXT5cbj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgZGlzY3JpbWluYXRvcjoge1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IChcbiAgICAgICAgICB6b2RSZWYgYXMgei5ab2REaXNjcmltaW5hdGVkVW5pb248XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W11cbiAgICAgICAgICA+XG4gICAgICAgICkuX2RlZi5kaXNjcmltaW5hdG9yLFxuICAgICAgfSxcbiAgICAgIG9uZU9mOiBBcnJheS5mcm9tKFxuICAgICAgICAoXG4gICAgICAgICAgem9kUmVmIGFzIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdXG4gICAgICAgICAgPlxuICAgICAgICApLl9kZWYub3B0aW9ucy52YWx1ZXMoKVxuICAgICAgKS5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOZXZlcih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kTmV2ZXI+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKHsgcmVhZE9ubHk6IHRydWUgfSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJyYW5kZWQoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJyYW5kZWQ8ei5ab2RBbnksIHN0cmluZz4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnR5cGUpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBjYXRjaEFsbFBhcnNlcih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPFpvZFR5cGVBbnk+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VQaXBlbGluZSh7XG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RQaXBlbGluZTxuZXZlciwgbmV2ZXI+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGlmICh1c2VPdXRwdXQpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYub3V0LCB1c2VPdXRwdXQpXG4gIH1cbiAgcmV0dXJuIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmluLCB1c2VPdXRwdXQpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVhZG9ubHkoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kUmVhZG9ubHk8ei5ab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbm5lclR5cGUsIHVzZU91dHB1dCksXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5jb25zdCB3b3JrZXJNYXAgPSB7XG4gIFpvZE9iamVjdDogcGFyc2VPYmplY3QsXG4gIFpvZFJlY29yZDogcGFyc2VSZWNvcmQsXG4gIFpvZFN0cmluZzogcGFyc2VTdHJpbmcsXG4gIFpvZE51bWJlcjogcGFyc2VOdW1iZXIsXG4gIFpvZEJpZ0ludDogcGFyc2VCaWdJbnQsXG4gIFpvZEJvb2xlYW46IHBhcnNlQm9vbGVhbixcbiAgWm9kRGF0ZTogcGFyc2VEYXRlLFxuICBab2ROdWxsOiBwYXJzZU51bGwsXG4gIFpvZE9wdGlvbmFsOiBwYXJzZU9wdGlvbmFsLFxuICBab2ROdWxsYWJsZTogcGFyc2VOdWxsYWJsZSxcbiAgWm9kRGVmYXVsdDogcGFyc2VEZWZhdWx0LFxuICBab2RBcnJheTogcGFyc2VBcnJheSxcbiAgWm9kTGl0ZXJhbDogcGFyc2VMaXRlcmFsLFxuICBab2RFbnVtOiBwYXJzZUVudW0sXG4gIFpvZE5hdGl2ZUVudW06IHBhcnNlRW51bSxcbiAgWm9kVHJhbnNmb3JtZXI6IHBhcnNlVHJhbnNmb3JtYXRpb24sXG4gIFpvZEVmZmVjdHM6IHBhcnNlVHJhbnNmb3JtYXRpb24sXG4gIFpvZEludGVyc2VjdGlvbjogcGFyc2VJbnRlcnNlY3Rpb24sXG4gIFpvZFVuaW9uOiBwYXJzZVVuaW9uLFxuICBab2REaXNjcmltaW5hdGVkVW5pb246IHBhcnNlRGlzY3JpbWluYXRlZFVuaW9uLFxuICBab2ROZXZlcjogcGFyc2VOZXZlcixcbiAgWm9kQnJhbmRlZDogcGFyc2VCcmFuZGVkLFxuICAvLyBUT0RPIFRyYW5zZm9ybSB0aGUgcmVzdCB0byBzY2hlbWFzXG4gIFpvZFVuZGVmaW5lZDogY2F0Y2hBbGxQYXJzZXIsXG4gIC8vIFRPRE86IGBwcmVmaXhJdGVtc2AgaXMgYWxsb3dlZCBpbiBPcGVuQVBJIDMuMSB3aGljaCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdHVwbGVzXG4gIFpvZFR1cGxlOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTWFwOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kRnVuY3Rpb246IGNhdGNoQWxsUGFyc2VyLFxuICBab2RMYXp5OiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kUHJvbWlzZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEFueTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFVua25vd246IGNhdGNoQWxsUGFyc2VyLFxuICBab2RWb2lkOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kUGlwZWxpbmU6IHBhcnNlUGlwZWxpbmUsXG4gIFpvZFJlYWRvbmx5OiBwYXJzZVJlYWRvbmx5LFxufVxudHlwZSBXb3JrZXJLZXlzID0ga2V5b2YgdHlwZW9mIHdvcmtlck1hcFxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY2hlbWEoXG4gIHpvZFJlZjogT3BlbkFwaVpvZEFueSxcbiAgdXNlT3V0cHV0PzogYm9vbGVhblxuKTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgeyBtZXRhT3BlbkFwaSA9IHt9IH0gPSB6b2RSZWZcbiAgY29uc3Qgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdID0gW1xuICAgIC4uLihBcnJheS5pc0FycmF5KG1ldGFPcGVuQXBpKSA/IG1ldGFPcGVuQXBpIDogW21ldGFPcGVuQXBpXSksXG4gIF1cbiAgdHJ5IHtcbiAgICBjb25zdCB0eXBlTmFtZSA9IHpvZFJlZi5fZGVmLnR5cGVOYW1lIGFzIFdvcmtlcktleXNcbiAgICBpZiAodHlwZU5hbWUgaW4gd29ya2VyTWFwKSB7XG4gICAgICByZXR1cm4gd29ya2VyTWFwW3R5cGVOYW1lXSh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIG5ldmVyLFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfVxufVxuIiwgIi8qKlxuICogRnJvbnQtTWF0dGVyXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanhzb24vZnJvbnQtbWF0dGVyXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEphc29uIENhbXBiZWxsIChcIkF1dGhvclwiKVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgbG9hZCB9IGZyb20gXCJqcy15YW1sXCJcbmNvbnN0IG9wdGlvbmFsQnl0ZU9yZGVyTWFyayA9IFwiXFxcXHVmZWZmP1wiXG5jb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiID8gcHJvY2Vzcy5wbGF0Zm9ybSA6IFwiXCJcbmNvbnN0IHBhdHRlcm4gPVxuICBcIl4oXCIgK1xuICBvcHRpb25hbEJ5dGVPcmRlck1hcmsgK1xuICBcIig9IHlhbWwgPXwtLS0pXCIgK1xuICBcIiQoW1xcXFxzXFxcXFNdKj8pXCIgK1xuICBcIl4oPzpcXFxcMnxcXFxcLlxcXFwuXFxcXC4pXFxcXHMqXCIgK1xuICBcIiRcIiArXG4gIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJcXFxccj9cIiA6IFwiXCIpICtcbiAgXCIoPzpcXFxcbik/KVwiXG4vLyBOT1RFOiBJZiB0aGlzIHBhdHRlcm4gdXNlcyB0aGUgJ2cnIGZsYWcgdGhlIGByZWdleGAgdmFyaWFibGUgZGVmaW5pdGlvbiB3aWxsXG4vLyBuZWVkIHRvIGJlIG1vdmVkIGRvd24gaW50byB0aGUgZnVuY3Rpb25zIHRoYXQgdXNlIGl0LlxuY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwibVwiKVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9udE1hdHRlcihcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIG9wdGlvbnMgPSB7fVxuKTogeyBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgYm9keTogc3RyaW5nOyBib2R5QmVnaW46IG51bWJlciB9IHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0geyBhbGxvd1Vuc2FmZTogZmFsc2UgfVxuICBvcHRpb25zID1cbiAgICBvcHRpb25zIGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICA/IHsgLi4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfVxuICAgICAgOiBkZWZhdWx0T3B0aW9uc1xuICB2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoLyhcXHI/XFxuKS8pXG4gIGlmIChsaW5lc1swXSAmJiAvPSB5YW1sID18LS0tLy50ZXN0KGxpbmVzWzBdKSkge1xuICAgIHJldHVybiBwYXJzZShzdHJpbmcpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlTG9jYXRpb24obWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSwgYm9keTogc3RyaW5nKSB7XG4gIHZhciBsaW5lID0gMVxuICB2YXIgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIpXG4gIHZhciBvZmZzZXQgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuXG4gIHdoaWxlIChwb3MgIT09IC0xKSB7XG4gICAgaWYgKHBvcyA+PSBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBsaW5lXG4gICAgfVxuICAgIGxpbmUrK1xuICAgIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiLCBwb3MgKyAxKVxuICB9XG5cbiAgcmV0dXJuIGxpbmVcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc3RyaW5nOiBzdHJpbmcpOiB7XG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGJvZHk6IHN0cmluZ1xuICBib2R5QmVnaW46IG51bWJlclxufSB7XG4gIHZhciBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxuXG4gIHZhciB5YW1sID0gbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0ucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIilcbiAgdmFyIGF0dHJpYnV0ZXMgPSAobG9hZCh5YW1sKSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgdmFyIGJvZHkgPSBzdHJpbmcucmVwbGFjZShtYXRjaFswXSwgXCJcIilcbiAgdmFyIGxpbmUgPSBjb21wdXRlTG9jYXRpb24obWF0Y2gsIHN0cmluZylcblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgYm9keTogYm9keSxcbiAgICBib2R5QmVnaW46IGxpbmUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RGcm9udE1hdHRlcihzdHJpbmc6IHN0cmluZykge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuXG4gIHJldHVybiByZWdleC50ZXN0KHN0cmluZylcbn1cbiIsICJ0eXBlIFByZWZpeGVkT2JqZWN0PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIGB4LSR7c3RyaW5nICYgS31gXTogVFtLXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4T2JqZWN0S2V5c1dpdGhYPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvYmo6IFRcbik6IFByZWZpeGVkT2JqZWN0PFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbYHgtJHtrZXl9YCwgdmFsdWVdKVxuICApIGFzIFByZWZpeGVkT2JqZWN0PFQ+XG59XG4iLCAidHlwZSBTbmFrZVRvRGFzaDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBLIGV4dGVuZHMgc3RyaW5nID8gU25ha2VUb0Rhc2hTdHJpbmc8Sz4gOiBLXTogVFtLXVxufVxuXG50eXBlIFNuYWtlVG9EYXNoU3RyaW5nPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIFR9XyR7aW5mZXIgVX1gXG4gID8gYCR7VH0tJHtTbmFrZVRvRGFzaFN0cmluZzxVPn1gXG4gIDogU1xuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGlmeU9iamVjdEtleXM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogU25ha2VUb0Rhc2g8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXkucmVwbGFjZSgvXy9nLCBcIi1cIiksIHZhbHVlXSlcbiAgKSBhcyBTbmFrZVRvRGFzaDxUPlxufVxuIiwgImltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIlxuXG5mdW5jdGlvbiBmaW5kS2V5SW5PYmoob2JqOiBhbnksIHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgbGV0IHJlc3VsdEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgXy5mb3JPd24ob2JqLCAodiwgaykgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHYpICYmIF8uaXNNYXRjaCh2LCB2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdEtleSA9IGtcbiAgICAgIC8vIFN0b3AgdGhlIGl0ZXJhdGlvblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0S2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbWJlZFNjaGVtYVJlZmVyZW5jZXMob2JqMTogYW55LCBvYmoyOiBhbnkpOiBhbnkge1xuICByZXR1cm4gXy50cmFuc2Zvcm0ob2JqMSwgKHJlc3VsdCwgdmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdLZXkgPSBmaW5kS2V5SW5PYmoob2JqMiwgdmFsdWUpXG4gICAgICBpZiAobWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB7XG4gICAgICAgICAgJHJlZjogYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7bWF0Y2hpbmdLZXl9YCxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIG9iajIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgUm91dGVTcGVjIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcblxuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG4gIGlmIChsYXN0UGFydC5zdGFydHNXaXRoKFwiW1wiKSAmJiBsYXN0UGFydC5lbmRzV2l0aChcIl1cIikpIHtcbiAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gYnlfcGFyYW1cbiAgICBjb25zdCBwYXJhbSA9IGxhc3RQYXJ0LnNsaWNlKDEsIC0xKVxuICAgIHJldHVybiBgYnlfJHtwYXJhbX1gXG4gIH1cblxuICByZXR1cm4gbGFzdFBhcnRcbn1cblxuLy8gZmVybiBkb2NzOiBodHRwczovL2J1aWxkd2l0aGZlcm4uY29tL2RvY3Mvc3BlYy9leHRlbnNpb25zXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgcmV0dXJuIHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpXG59XG5cbmZ1bmN0aW9uIGdldEZlcm5TZGtNZXRhZGF0YShcbiAgcGF0aDogc3RyaW5nLFxuICBzZGtSZXR1cm5WYWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdXG4pOlxuICB8IHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlXG4gICAgfVxuICB8IHtcbiAgICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHN0cmluZ1tdXG4gICAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogc3RyaW5nXG4gICAgfSB7XG4gIGlmIChwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFwieC1mZXJuLXNkay1ncm91cC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aCksXG4gICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGgpLFxuICAgIC4uLihzZGtSZXR1cm5WYWx1ZVxuICAgICAgPyB7XG4gICAgICAgICAgXCJ4LWZlcm4tc2RrLXJldHVybi12YWx1ZVwiOiBzZGtSZXR1cm5WYWx1ZSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1hcE1ldGhvZHNUb0Zlcm5TZGtNZXRhZGF0YSh7XG4gIG1ldGhvZHMsXG4gIHBhdGgsXG4gIHNka1JldHVyblZhbHVlLFxufToge1xuICBtZXRob2RzOiBSb3V0ZVNwZWNbXCJtZXRob2RzXCJdXG4gIHBhdGg6IHN0cmluZ1xuICBzZGtSZXR1cm5WYWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdXG59KSB7XG4gIGNvbnN0IGZlcm5TZGtNZXRhZGF0YSA9IGdldEZlcm5TZGtNZXRhZGF0YShwYXRoLCBzZGtSZXR1cm5WYWx1ZSlcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFttZXRob2RzWzBdXTogZmVyblNka01ldGFkYXRhLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hcHBlZE1ldGhvZHMgPSB7fVxuXG4gIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIpIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IGZlcm5TZGtNZXRhZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSB7XG4gICAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbWFwcGVkTWV0aG9kc1xufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyB6b2RUb1RzLCBwcmludE5vZGUgfSBmcm9tIFwiLi4vbGliL3pvZC10by10c1wiXG5pbXBvcnQgcHJldHRpZXIgZnJvbSBcInByZXR0aWVyXCJcbmltcG9ydCB7IHosIFpvZEVmZmVjdHMsIFpvZE9wdGlvbmFsIH0gZnJvbSBcInpvZFwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHJvdXRlcyB0aGF0IGhhdmUgYGV4Y2x1ZGVGcm9tT3BlbkFwaWAgc2V0IHRvIHRydWUgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqIFNldCB0aGlzIHRvIHRydWUgdG8gaW5jbHVkZSB0aGVtLlxuICAgKi9cbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91dGVUeXBlcyA9IGFzeW5jIChvcHRzOiBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzKSA9PiB7XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZSA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgY29uc3Qgc29ydGVkUm91dGVzID0gQXJyYXkuZnJvbShmaWxlcGF0aFRvUm91dGUuZW50cmllcygpKS5zb3J0KChhLCBiKSA9PlxuICAgIGFbMV0ucm91dGUubG9jYWxlQ29tcGFyZShiWzFdLnJvdXRlKVxuICApXG4gIGNvbnN0IGZpbHRlcmVkUm91dGVzID0gc29ydGVkUm91dGVzLmZpbHRlcihcbiAgICAoW18sIHsgcm91dGUgfV0pID0+ICFvcHRzLmZpbHRlclJvdXRlcyB8fCBvcHRzLmZpbHRlclJvdXRlcyhyb3V0ZSlcbiAgKVxuXG4gIC8vIFRPRE8gd2hlbiBsZXNzIGxhenksIHVzZSB0cy1tb3JwaCBmb3IgYmV0dGVyIGdlbmVyYXRpb25cbiAgY29uc3Qgcm91dGVEZWZzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3QgW18sIHsgcm91dGUsIHJvdXRlU3BlYywgc2V0dXBQYXJhbXMgfV0gb2YgZmlsdGVyZWRSb3V0ZXMpIHtcbiAgICBjb25zdCBtYXhEdXJhdGlvbiA9IHJvdXRlU3BlYy5tYXhEdXJhdGlvbiA/PyBzZXR1cFBhcmFtcy5tYXhEdXJhdGlvblxuICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlU3BlYy5xdWVyeVBhcmFtcz8uc2hhcGUgPz8ge30pXG4gICAgY29uc3QgcGF0aFBhcmFtZXRlcnMgPSBxdWVyeUtleXMuZmlsdGVyKChrZXkpID0+IHJvdXRlLmluY2x1ZGVzKGBbJHtrZXl9XWApKVxuXG4gICAgLy8gcXVlcnlQYXJhbXMgbWlnaHQgYmUgYSBab2RFZmZlY3RzIG9yIFpvZE9wdGlvbmFsIGluIHNvbWUgY2FzZXNcbiAgICBsZXQgcXVlcnlQYXJhbXMgPSByb3V0ZVNwZWMucXVlcnlQYXJhbXNcbiAgICB3aGlsZSAoXG4gICAgICBxdWVyeVBhcmFtcyAmJlxuICAgICAgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zIHx8IFwidW53cmFwXCIgaW4gcXVlcnlQYXJhbXMpXG4gICAgKSB7XG4gICAgICBpZiAoXCJzb3VyY2VUeXBlXCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgdW5rbm93biBhcyBab2RFZmZlY3RzPGFueT4pLnNvdXJjZVR5cGUoKVxuICAgICAgfSBlbHNlIGlmIChcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kT3B0aW9uYWw8YW55PikudW53cmFwKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocXVlcnlQYXJhbXMgJiYgXCJvbWl0XCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXMub21pdChcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKHBhdGhQYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IFtwYXJhbSwgdHJ1ZV0pKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJvdXRlRGVmcy5wdXNoKFxuICAgICAgYFxuXCIke3JvdXRlfVwiOiB7XG4gIHJvdXRlOiBcIiR7cm91dGV9XCIsXG4gIG1ldGhvZDogJHtyb3V0ZVNwZWMubWV0aG9kcy5tYXAoKG0pID0+IGBcIiR7bX1cImApLmpvaW4oXCIgfCBcIil9LFxuICBxdWVyeVBhcmFtczogJHtxdWVyeVBhcmFtcyA/IHByaW50Tm9kZSh6b2RUb1RzKHF1ZXJ5UGFyYW1zKS5ub2RlKSA6IFwie31cIn0sXG4gIGpzb25Cb2R5OiAke1xuICAgIHJvdXRlU3BlYy5qc29uQm9keSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5qc29uQm9keSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAgY29tbW9uUGFyYW1zOiAke1xuICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmNvbW1vblBhcmFtcykubm9kZSlcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIGZvcm1EYXRhOiAke1xuICAgIHJvdXRlU3BlYy5mb3JtRGF0YSA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5mb3JtRGF0YSkubm9kZSkgOiBcInt9XCJcbiAgfSxcbiAganNvblJlc3BvbnNlOiAke1xuICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgID8gcHJpbnROb2RlKFxuICAgICAgICAgIHpvZFRvVHMoXG4gICAgICAgICAgICBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyAmJlxuICAgICAgICAgICAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgICAgPyByb3V0ZVNwZWMuanNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgICA6IHJvdXRlU3BlYy5qc29uUmVzcG9uc2VcbiAgICAgICAgICApLm5vZGVcbiAgICAgICAgKVxuICAgICAgOiBcInt9XCJcbiAgfSxcbiAgbWF4RHVyYXRpb246ICR7bWF4RHVyYXRpb24gPz8gXCJ1bmRlZmluZWRcIn1cbn1gLnRyaW0oKVxuICAgIClcbiAgfVxuICBjb25zdCByb3V0ZURlZlN0ciA9IHJvdXRlRGVmcy5qb2luKFwiLFxcblwiKVxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBwcmV0dGllci5mb3JtYXQoXG4gICAgYGV4cG9ydCB0eXBlIFJvdXRlcyA9IHtcbiR7cm91dGVEZWZTdHJ9XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVzcG9uc2U8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJqc29uUmVzcG9uc2VcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0Qm9keTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25Cb2R5XCJdICYgUm91dGVzW1BhdGhdW1wiY29tbW9uUGFyYW1zXCJdXG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVxdWVzdFBhcmFtczxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcInF1ZXJ5UGFyYW1zXCJdICYgUm91dGVzW1BhdGhdW1wiY29tbW9uUGFyYW1zXCJdXG5gLnRyaW0oKSxcbiAgICB7IHNlbWk6IGZhbHNlLCBwYXJzZXI6IFwidHlwZXNjcmlwdFwiIH1cbiAgKVxuXG4gIGlmIChvcHRzLm91dHB1dEZpbGUpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3B0cy5vdXRwdXRGaWxlLCBvdXRwdXQpXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG4iLCAiLyoqXG4gKiBab2QgVG8gVFNcbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYWNoaW5yYWphL3pvZC10by10c1xuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFNhY2hpbiBSYWphXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuaW1wb3J0IHsgWm9kVHlwZSwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5cbmNvbnN0IHsgZmFjdG9yeTogZiwgU3ludGF4S2luZCwgU2NyaXB0S2luZCwgU2NyaXB0VGFyZ2V0LCBFbWl0SGludCB9ID0gdHNcblxuY29uc3QgbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlID0gKFxuICBpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyIHwgdHMuVHlwZU5vZGVcbikgPT4ge1xuICBpZiAodHMuaXNJZGVudGlmaWVyKGlkZW50aWZpZXIpKSB7XG4gICAgcmV0dXJuIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoaWRlbnRpZmllcilcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVyXG59XG5cbmNvbnN0IGNyZWF0ZVR5cGVSZWZlcmVuY2VGcm9tU3RyaW5nID0gKGlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcikpXG5cbmNvbnN0IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSA9ICgpID0+XG4gIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5rbm93bktleXdvcmQpXG5cbmV4cG9ydCBjb25zdCBwcmludE5vZGUgPSAoXG4gIG5vZGU6IHRzLk5vZGUsXG4gIHByaW50ZXJPcHRpb25zPzogdHMuUHJpbnRlck9wdGlvbnNcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIFwicHJpbnQudHNcIixcbiAgICBcIlwiLFxuICAgIFNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgZmFsc2UsXG4gICAgU2NyaXB0S2luZC5UU1xuICApXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHByaW50ZXJPcHRpb25zKVxuICByZXR1cm4gcHJpbnRlci5wcmludE5vZGUoRW1pdEhpbnQuVW5zcGVjaWZpZWQsIG5vZGUsIHNvdXJjZUZpbGUpXG59XG5cbmNvbnN0IGlkZW50aWZpZXJSRSA9IC9eWyRBLVpfYS16XVtcXHckXSokL1xuXG5jb25zdCBnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsID0gKHN0cmluZ186IHN0cmluZykgPT4ge1xuICBpZiAoaWRlbnRpZmllclJFLnRlc3Qoc3RyaW5nXykpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVJZGVudGlmaWVyKHN0cmluZ18pXG4gIH1cblxuICByZXR1cm4gZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHN0cmluZ18pXG59XG5cbmNvbnN0IGFkZEpzRG9jQ29tbWVudCA9IChub2RlOiB0cy5Ob2RlLCB0ZXh0OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgeyBkZXNjcmlwdGlvbiwgZGVwcmVjYXRlZCB9ID0gcGFyc2VEZXNjcmlwdGlvbih0ZXh0KVxuXG4gIGxldCBjb21tZW50ID0gYCogJHtkZXNjcmlwdGlvbn1gXG4gIGlmIChkZXByZWNhdGVkKSB7XG4gICAgY29tbWVudCArPSBgXFxuICogQGRlcHJlY2F0ZWQgJHtcbiAgICAgIHR5cGVvZiBkZXByZWNhdGVkID09PSBcInN0cmluZ1wiID8gZGVwcmVjYXRlZCA6IFwiXCJcbiAgICB9YFxuICB9IGVsc2Uge1xuICAgIGNvbW1lbnQgKz0gYCBgXG4gIH1cblxuICB0cy5hZGRTeW50aGV0aWNMZWFkaW5nQ29tbWVudChcbiAgICBub2RlLFxuICAgIFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYSxcbiAgICBjb21tZW50LFxuICAgIHRydWVcbiAgKVxufVxuXG50eXBlIFBhcnNlZERlc2NyaXB0aW9uID0ge1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIGRlcHJlY2F0ZWQ/OiBib29sZWFuIHwgc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZnVuY3Rpb24gcGFyc2VEZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogUGFyc2VkRGVzY3JpcHRpb24ge1xuICBpZiAoIWRlc2NyaXB0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICB9XG4gIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudChkZXNjcmlwdGlvbilcbiAgaWYgKCF0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSkgcmV0dXJuIHsgZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFBhcnNlZERlc2NyaXB0aW9uID0ge1xuICAgIGRlc2NyaXB0aW9uOiBib2R5LnRyaW0oKSxcbiAgfVxuICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIgJiYgYXR0cmlidXRlcyAhPT0gbnVsbCkge1xuICAgIGlmIChcImRlcHJlY2F0ZWRcIiBpbiBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXR0cmlidXRlcy5kZXByZWNhdGVkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG91dHB1dC5kZXByZWNhdGVkID1cbiAgICAgICAgICBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQubGVuZ3RoID4gMCA/IGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiZGVzY3JpcHRpb25cIiB8fCBrZXkgPT09IFwiZGVwcmVjYXRlZFwiKSBjb250aW51ZVxuICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0XG59XG5cbnR5cGUgTGl0ZXJhbFR5cGUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG5cbnR5cGUgWm9kVG9Uc09wdGlvbnMgPSB7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgYG5hdGl2ZUVudW1zYCBpbnN0ZWFkICovXG4gIHJlc29sdmVOYXRpdmVFbnVtcz86IGJvb2xlYW5cbiAgbmF0aXZlRW51bXM/OiBcImlkZW50aWZpZXJcIiB8IFwicmVzb2x2ZVwiIHwgXCJ1bmlvblwiXG59XG5cbmNvbnN0IHJlc29sdmVPcHRpb25zID0gKHJhdz86IFpvZFRvVHNPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0ge1xuICAgIG5hdGl2ZUVudW1zOiByYXc/LnJlc29sdmVOYXRpdmVFbnVtcyA/IFwicmVzb2x2ZVwiIDogXCJpZGVudGlmaWVyXCIsXG4gIH1cblxuICByZXR1cm4geyAuLi5yZXNvbHZlZCwgLi4ucmF3IH1cbn1cblxudHlwZSBSZXNvbHZlZFpvZFRvVHNPcHRpb25zID0gUmV0dXJuVHlwZTx0eXBlb2YgcmVzb2x2ZU9wdGlvbnM+XG5cbnR5cGUgWm9kVG9Uc1N0b3JlID0ge1xuICBuYXRpdmVFbnVtczogdHMuRW51bURlY2xhcmF0aW9uW11cbn1cblxudHlwZSBab2RUb1RzUmV0dXJuID0ge1xuICBub2RlOiB0cy5UeXBlTm9kZVxuICBzdG9yZTogWm9kVG9Uc1N0b3JlXG59XG5cbnR5cGUgR2V0VHlwZUZ1bmN0aW9uID0gKFxuICB0eXBlc2NyaXB0OiB0eXBlb2YgdHMsXG4gIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRab2RUb1RzT3B0aW9uc1xuKSA9PiB0cy5JZGVudGlmaWVyIHwgdHMuVHlwZU5vZGVcblxudHlwZSBHZXRUeXBlID0geyBfZGVmOiB7IGdldFR5cGU/OiBHZXRUeXBlRnVuY3Rpb24gfSB9XG5cbmNvbnN0IGNhbGxHZXRUeXBlID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRab2RUb1RzT3B0aW9uc1xuKSA9PiB7XG4gIGxldCB0eXBlOiBSZXR1cm5UeXBlPEdldFR5cGVGdW5jdGlvbj4gfCB1bmRlZmluZWRcblxuICBjb25zdCBnZXRUeXBlU2NoZW1hID0gem9kIGFzIEdldFR5cGVcbiAgLy8gdGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWNjZXNzaW5nICd0eXBlJ1xuICBpZiAoZ2V0VHlwZVNjaGVtYS5fZGVmLmdldFR5cGUpXG4gICAgdHlwZSA9IGdldFR5cGVTY2hlbWEuX2RlZi5nZXRUeXBlKHRzLCBpZGVudGlmaWVyLCBvcHRpb25zKVxuICByZXR1cm4gdHlwZVxufVxuXG5leHBvcnQgY29uc3Qgem9kVG9UcyA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyPzogc3RyaW5nLFxuICBvcHRpb25zPzogWm9kVG9Uc09wdGlvbnNcbik6IFpvZFRvVHNSZXR1cm4gPT4ge1xuICBpZiAoISh6b2QgaW5zdGFuY2VvZiBab2RUeXBlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBub2RlOiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKSxcbiAgICAgIHN0b3JlOiB7IG5hdGl2ZUVudW1zOiBbXSB9LFxuICAgIH1cbiAgfVxuICBjb25zdCByZXNvbHZlZElkZW50aWZpZXIgPSBpZGVudGlmaWVyID8/IFwiSWRlbnRpZmllclwiXG5cbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMob3B0aW9ucylcblxuICBjb25zdCBzdG9yZTogWm9kVG9Uc1N0b3JlID0geyBuYXRpdmVFbnVtczogW10gfVxuXG4gIGNvbnN0IG5vZGUgPSB6b2RUb1RzTm9kZSh6b2QsIHJlc29sdmVkSWRlbnRpZmllciwgc3RvcmUsIHJlc29sdmVkT3B0aW9ucylcblxuICByZXR1cm4geyBub2RlLCBzdG9yZSB9XG59XG5cbmNvbnN0IHpvZFRvVHNOb2RlID0gKFxuICB6b2Q6IFpvZFR5cGVBbnksXG4gIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgc3RvcmU6IFpvZFRvVHNTdG9yZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRab2RUb1RzT3B0aW9uc1xuKSA9PiB7XG4gIGNvbnN0IHR5cGVOYW1lID0gem9kLl9kZWYudHlwZU5hbWVcblxuICBjb25zdCBnZXRUeXBlVHlwZSA9IGNhbGxHZXRUeXBlKHpvZCwgaWRlbnRpZmllciwgb3B0aW9ucylcbiAgLy8gc3BlY2lhbCBjYXNlIG5hdGl2ZSBlbnVtLCB3aGljaCBuZWVkcyBhbiBpZGVudGlmaWVyIG5vZGVcbiAgaWYgKGdldFR5cGVUeXBlICYmIHR5cGVOYW1lICE9PSBcIlpvZE5hdGl2ZUVudW1cIikge1xuICAgIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UoZ2V0VHlwZVR5cGUpXG4gIH1cblxuICBjb25zdCBvdGhlckFyZ3VtZW50cyA9IFtpZGVudGlmaWVyLCBzdG9yZSwgb3B0aW9uc10gYXMgY29uc3RcblxuICBzd2l0Y2ggKHR5cGVOYW1lKSB7XG4gICAgY2FzZSBcIlpvZFN0cmluZ1wiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTnVtYmVyXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLk51bWJlcktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RCaWdJbnRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQmlnSW50S2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZEJvb2xlYW5cIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2REYXRlXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIkRhdGVcIikpXG4gICAgfVxuICAgIGNhc2UgXCJab2RVbmRlZmluZWRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE51bGxcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVsbCgpKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVm9pZFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Wb2lkS2V5d29yZCksXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQW55XCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RVbmtub3duXCI6IHtcbiAgICAgIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTmV2ZXJcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuTmV2ZXJLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTGF6eVwiOiB7XG4gICAgICAvLyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB3aGF0IHRoZSBsYXp5IHZhbHVlIGlzIHJlZmVycmluZyB0b1xuICAgICAgLy8gc28gd2UgZm9yY2UgdGhlIHVzZXIgdG8gZGVjbGFyZSBpdFxuICAgICAgaWYgKCFnZXRUeXBlVHlwZSkgcmV0dXJuIGNyZWF0ZVR5cGVSZWZlcmVuY2VGcm9tU3RyaW5nKGlkZW50aWZpZXIpXG4gICAgICBicmVha1xuICAgIH1cbiAgICBjYXNlIFwiWm9kTGl0ZXJhbFwiOiB7XG4gICAgICAvLyB6LmxpdGVyYWwoJ2hpJykgLT4gJ2hpJ1xuICAgICAgbGV0IGxpdGVyYWw6IHRzLkxpdGVyYWxFeHByZXNzaW9uIHwgdHMuQm9vbGVhbkxpdGVyYWxcblxuICAgICAgY29uc3QgbGl0ZXJhbFZhbHVlID0gem9kLl9kZWYudmFsdWUgYXMgTGl0ZXJhbFR5cGVcbiAgICAgIHN3aXRjaCAodHlwZW9mIGxpdGVyYWxWYWx1ZSkge1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgICAgICBsaXRlcmFsID0gZi5jcmVhdGVOdW1lcmljTGl0ZXJhbChsaXRlcmFsVmFsdWUpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGxpdGVyYWxWYWx1ZSA9PT0gdHJ1ZSA/IGYuY3JlYXRlVHJ1ZSgpIDogZi5jcmVhdGVGYWxzZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGYuY3JlYXRlU3RyaW5nTGl0ZXJhbChsaXRlcmFsVmFsdWUpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUobGl0ZXJhbClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE9iamVjdFwiOiB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoem9kLl9kZWYuc2hhcGUoKSlcblxuICAgICAgY29uc3QgbWVtYmVyczogdHMuVHlwZUVsZW1lbnRbXSA9IHByb3BlcnRpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgbmV4dFpvZE5vZGUgPSB2YWx1ZSBhcyBab2RUeXBlQW55XG4gICAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShuZXh0Wm9kTm9kZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgY29uc3QgeyB0eXBlTmFtZTogbmV4dFpvZE5vZGVUeXBlTmFtZSB9ID0gbmV4dFpvZE5vZGUuX2RlZlxuICAgICAgICBjb25zdCBpc09wdGlvbmFsID1cbiAgICAgICAgICBuZXh0Wm9kTm9kZVR5cGVOYW1lID09PSBcIlpvZE9wdGlvbmFsXCIgfHwgbmV4dFpvZE5vZGUuaXNPcHRpb25hbCgpXG5cbiAgICAgICAgY29uc3QgcHJvcGVydHlTaWduYXR1cmUgPSBmLmNyZWF0ZVByb3BlcnR5U2lnbmF0dXJlKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsKGtleSksXG4gICAgICAgICAgaXNPcHRpb25hbCA/IGYuY3JlYXRlVG9rZW4oU3ludGF4S2luZC5RdWVzdGlvblRva2VuKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0eXBlXG4gICAgICAgIClcblxuICAgICAgICBpZiAobmV4dFpvZE5vZGUuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICBhZGRKc0RvY0NvbW1lbnQocHJvcGVydHlTaWduYXR1cmUsIG5leHRab2ROb2RlLmRlc2NyaXB0aW9uKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5U2lnbmF0dXJlXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKG1lbWJlcnMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEFycmF5XCI6IHtcbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi50eXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUFycmF5VHlwZU5vZGUodHlwZSlcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVudW1cIjoge1xuICAgICAgLy8gei5lbnVtWydhJywgJ2InLCAnYyddIC0+ICdhJyB8ICdiJyB8ICdjXG4gICAgICBjb25zdCB0eXBlcyA9IHpvZC5fZGVmLnZhbHVlcy5tYXAoKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICAgIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSkpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RVbmlvblwiOiB7XG4gICAgICAvLyB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkgLT4gc3RyaW5nIHwgbnVtYmVyXG4gICAgICBjb25zdCBvcHRpb25zOiBab2RUeXBlQW55W10gPSB6b2QuX2RlZi5vcHRpb25zXG4gICAgICBjb25zdCB0eXBlczogdHMuVHlwZU5vZGVbXSA9IG9wdGlvbnMubWFwKChvcHRpb24pID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2REaXNjcmltaW5hdGVkVW5pb25cIjoge1xuICAgICAgLy8gei5kaXNjcmltaW5hdGVkVW5pb24oJ2tpbmQnLCBbei5vYmplY3QoeyBraW5kOiB6LmxpdGVyYWwoJ2EnKSwgYTogei5zdHJpbmcoKSB9KSwgei5vYmplY3QoeyBraW5kOiB6LmxpdGVyYWwoJ2InKSwgYjogei5udW1iZXIoKSB9KV0pIC0+IHsga2luZDogJ2EnLCBhOiBzdHJpbmcgfSB8IHsga2luZDogJ2InLCBiOiBudW1iZXIgfVxuICAgICAgY29uc3Qgb3B0aW9uczogWm9kVHlwZUFueVtdID0gWy4uLnpvZC5fZGVmLm9wdGlvbnMudmFsdWVzKCldXG4gICAgICBjb25zdCB0eXBlczogdHMuVHlwZU5vZGVbXSA9IG9wdGlvbnMubWFwKChvcHRpb24pID0+XG4gICAgICAgIHpvZFRvVHNOb2RlKG9wdGlvbiwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICApXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RFZmZlY3RzXCI6IHtcbiAgICAgIC8vIGlnbm9yZSBhbnkgZWZmZWN0cywgdGhleSB3b24ndCBmYWN0b3IgaW50byB0aGUgdHlwZXNcbiAgICAgIGNvbnN0IG5vZGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuc2NoZW1hLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kTmF0aXZlRW51bVwiOiB7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0VHlwZVR5cGVcblxuICAgICAgaWYgKG9wdGlvbnMubmF0aXZlRW51bXMgPT09IFwidW5pb25cIikge1xuICAgICAgICAvLyBhbGxvdyBvdmVycmlkaW5nIHdpdGggdGhpcyBvcHRpb25cbiAgICAgICAgaWYgKHR5cGUpIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UodHlwZSlcblxuICAgICAgICBjb25zdCB0eXBlcyA9IE9iamVjdC52YWx1ZXMoem9kLl9kZWYudmFsdWVzKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlIGFzIHN0cmluZykpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHoubmF0aXZlRW51bShGcnVpdHMpIC0+IEZydWl0c1xuICAgICAgLy8gY2FuIHJlc29sdmUgRnJ1aXRzIGludG8gc3RvcmUgYW5kIHVzZXIgY2FuIGhhbmRsZSBlbnVtc1xuICAgICAgaWYgKCF0eXBlKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcblxuICAgICAgaWYgKG9wdGlvbnMubmF0aXZlRW51bXMgPT09IFwicmVzb2x2ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVudW1NZW1iZXJzID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgem9kLl9kZWYudmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbiAgICAgICAgKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxpdGVyYWwgPVxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICAgID8gZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSlcbiAgICAgICAgICAgICAgOiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVFbnVtTWVtYmVyKGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwoa2V5KSwgbGl0ZXJhbClcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodHMuaXNJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICAgICAgc3RvcmUubmF0aXZlRW51bXMucHVzaChcbiAgICAgICAgICAgIGYuY3JlYXRlRW51bURlY2xhcmF0aW9uKHVuZGVmaW5lZCwgdHlwZSwgZW51bU1lbWJlcnMpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdnZXRUeXBlIG9uIG5hdGl2ZUVudW0gbXVzdCByZXR1cm4gYW4gaWRlbnRpZmllciB3aGVuIG5hdGl2ZUVudW1zIGlzIFwicmVzb2x2ZVwiJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKHR5cGUpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE9wdGlvbmFsXCI6IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5pbm5lclR5cGUsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpLFxuICAgICAgXSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kTnVsbGFibGVcIjoge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLmlubmVyVHlwZSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUoW1xuICAgICAgICBpbm5lclR5cGUsXG4gICAgICAgIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVsbCgpKSxcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFR1cGxlXCI6IHtcbiAgICAgIC8vIHoudHVwbGUoW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKSAtPiBbc3RyaW5nLCBudW1iZXJdXG4gICAgICBjb25zdCB0eXBlcyA9IHpvZC5fZGVmLml0ZW1zLm1hcCgob3B0aW9uOiBab2RUeXBlQW55KSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVHVwbGVUeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUmVjb3JkXCI6IHtcbiAgICAgIC8vIHoucmVjb3JkKHoubnVtYmVyKCkpIC0+IHsgW3g6IHN0cmluZ106IG51bWJlciB9XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi52YWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUoW1xuICAgICAgICBmLmNyZWF0ZUluZGV4U2lnbmF0dXJlKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKFwieFwiKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdmFsdWVUeXBlXG4gICAgICAgICksXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RNYXBcIjoge1xuICAgICAgLy8gei5tYXAoei5zdHJpbmcoKSkgLT4gTWFwPHN0cmluZz5cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBrZXlUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYua2V5VHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIk1hcFwiKSwgW1xuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RTZXRcIjoge1xuICAgICAgLy8gei5zZXQoei5zdHJpbmcoKSkgLT4gU2V0PHN0cmluZz5cbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi52YWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJTZXRcIiksIFt0eXBlXSlcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEludGVyc2VjdGlvblwiOiB7XG4gICAgICAvLyB6Lm51bWJlcigpLmFuZCh6LnN0cmluZygpKSAtPiBudW1iZXIgJiBzdHJpbmdcbiAgICAgIGNvbnN0IGxlZnQgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5sZWZ0LCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IHJpZ2h0ID0gem9kVG9Uc05vZGUoem9kLl9kZWYucmlnaHQsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlSW50ZXJzZWN0aW9uVHlwZU5vZGUoW2xlZnQsIHJpZ2h0XSlcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFByb21pc2VcIjoge1xuICAgICAgLy8gei5wcm9taXNlKHouc3RyaW5nKCkpIC0+IFByb21pc2U8c3RyaW5nPlxuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJQcm9taXNlXCIpLCBbXG4gICAgICAgIHR5cGUsXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RGdW5jdGlvblwiOiB7XG4gICAgICAvLyB6LmZ1bmN0aW9uKCkuYXJncyh6LnN0cmluZygpKS5yZXR1cm5zKHoubnVtYmVyKCkpIC0+IChhcmdzXzA6IHN0cmluZykgPT4gbnVtYmVyXG4gICAgICBjb25zdCBhcmd1bWVudFR5cGVzID0gem9kLl9kZWYuYXJncy5fZGVmLml0ZW1zLm1hcChcbiAgICAgICAgKGFyZ3VtZW50OiBab2RUeXBlQW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXJndW1lbnRUeXBlID0gem9kVG9Uc05vZGUoYXJndW1lbnQsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBmLmNyZWF0ZUlkZW50aWZpZXIoYGFyZ3NfJHtpbmRleH1gKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFyZ3VtZW50VHlwZVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgKSBhcyB0cy5QYXJhbWV0ZXJEZWNsYXJhdGlvbltdXG5cbiAgICAgIGFyZ3VtZW50VHlwZXMucHVzaChcbiAgICAgICAgZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZi5jcmVhdGVUb2tlbihTeW50YXhLaW5kLkRvdERvdERvdFRva2VuKSxcbiAgICAgICAgICBmLmNyZWF0ZUlkZW50aWZpZXIoYGFyZ3NfJHthcmd1bWVudFR5cGVzLmxlbmd0aH1gKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZi5jcmVhdGVBcnJheVR5cGVOb2RlKGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpKVxuICAgICAgICApXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHJldHVyblR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi5yZXR1cm5zLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlRnVuY3Rpb25UeXBlTm9kZShcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBhcmd1bWVudFR5cGVzLFxuICAgICAgICByZXR1cm5UeXBlXG4gICAgICApXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERlZmF1bHRcIjoge1xuICAgICAgLy8gei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlZmF1bHQoJ2hpJykgLT4gc3RyaW5nXG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLmlubmVyVHlwZSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcblxuICAgICAgY29uc3QgZmlsdGVyZWROb2RlczogdHMuTm9kZVtdID0gW11cblxuICAgICAgdHlwZS5mb3JFYWNoQ2hpbGQoKG5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFbU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkXS5pbmNsdWRlcyhub2RlLmtpbmQpKSB7XG4gICAgICAgICAgZmlsdGVyZWROb2Rlcy5wdXNoKG5vZGUpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVlZGVkIHRvIHNldCBjaGlsZHJlblxuICAgICAgdHlwZS50eXBlcyA9IGZpbHRlcmVkTm9kZXNcblxuICAgICAgcmV0dXJuIHR5cGVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5BbnlLZXl3b3JkKVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgUHJvamVjdCwgU3ludGF4S2luZCB9IGZyb20gXCJ0cy1tb3JwaFwiXG5pbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gXCJlc2J1aWxkXCJcbmltcG9ydCB7IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlIH0gZnJvbSBcIi4vbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlXCJcblxuaW50ZXJmYWNlIEdlbmVyYXRlUm91dGVUeXBlc09wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgYWxsb3dlZEltcG9ydFBhdHRlcm5zPzogc3RyaW5nW11cbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgb25seSByb3V0ZXMgdGhhdCByZXR1cm4gdHJ1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqL1xuICBmaWx0ZXJSb3V0ZXM/OiAocm91dGU6IHN0cmluZykgPT4gYm9vbGVhblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgcm91dGVzIHRoYXQgaGF2ZSBgZXhjbHVkZUZyb21PcGVuQXBpYCBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICogU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmNsdWRlIHRoZW0uXG4gICAqL1xuICBpbmNsdWRlT3BlbkFwaUV4Y2x1ZGVkUm91dGVzPzogYm9vbGVhblxuICBlc2J1aWxkT3B0aW9ucz86IGVzYnVpbGQuQnVpbGRPcHRpb25zXG59XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0Um91dGVTcGVjcyA9IGFzeW5jIChvcHRzOiBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzKSA9PiB7XG4gIGNvbnN0IHsgcGFja2FnZURpciwgcGF0aEdsb2IgPSBcIi9wYWdlcy9hcGkvKiovKi50c1wiIH0gPSBvcHRzXG4gIGNvbnN0IGZ1bGxQYXRoR2xvYiA9IHBhdGgucG9zaXguam9pbihwYWNrYWdlRGlyLCBwYXRoR2xvYilcblxuICBjb25zdCBwcm9qZWN0ID0gbmV3IFByb2plY3QoeyBjb21waWxlck9wdGlvbnM6IHsgZGVjbGFyYXRpb246IHRydWUgfSB9KVxuXG4gIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9qZWN0LmFkZFNvdXJjZUZpbGVzQXRQYXRocyhmdWxsUGF0aEdsb2IpKSB7XG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IHNvdXJjZUZpbGUuZ2V0RXhwb3J0QXNzaWdubWVudChcbiAgICAgIChkKSA9PiAhZC5pc0V4cG9ydEVxdWFscygpXG4gICAgKVxuICAgIGlmICghZGVmYXVsdEV4cG9ydCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGwgPSBkZWZhdWx0RXhwb3J0XG4gICAgICAuZ2V0RXhwcmVzc2lvbigpXG4gICAgICAuYXNLaW5kKFN5bnRheEtpbmQuQ2FsbEV4cHJlc3Npb24pXG4gICAgaWYgKCFjdXJyaWVkV2l0aFJvdXRlU3BlY0NhbGwpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHdpdGhSb3V0ZVNwZWNDYWxsID0gY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsXG4gICAgICAuZ2V0RXhwcmVzc2lvbigpXG4gICAgICAuYXNLaW5kKFN5bnRheEtpbmQuQ2FsbEV4cHJlc3Npb24pXG4gICAgaWYgKCF3aXRoUm91dGVTcGVjQ2FsbCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBbcm91dGVTcGVjXSA9IHdpdGhSb3V0ZVNwZWNDYWxsLmdldEFyZ3VtZW50cygpXG4gICAgaWYgKCFyb3V0ZVNwZWMpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgc291cmNlRmlsZS5hZGRTdGF0ZW1lbnRzKFxuICAgICAgYGV4cG9ydCBjb25zdCBleHRyYWN0ZWRSb3V0ZVNwZWMgPSAke3JvdXRlU3BlYy5nZXRUZXh0KCl9YFxuICAgIClcblxuICAgIGRlZmF1bHRFeHBvcnQucmVtb3ZlKClcblxuICAgIC8vIFJlbW92ZSBhbGwgdW51c2VkIGltcG9ydHMgc28gZmlsZSBjYW4gYmUgdHJlZSBzaGFrZW5cbiAgICAvLyAoQXNzdW1lcyBhbGwgaW1wb3J0cyBhcmUgZnJlZSBvZiBzaWRlLWVmZmVjdHMpXG4gICAgbGV0IGxhc3RXaWR0aDogbnVtYmVyXG4gICAgZG8ge1xuICAgICAgbGFzdFdpZHRoID0gc291cmNlRmlsZS5nZXRGdWxsV2lkdGgoKVxuICAgICAgLy8gTWF5IG5lZWQgdG8gY2FsbCB0aGlzIG11bHRpcGxlIHRpbWVzXG4gICAgICBzb3VyY2VGaWxlLmZpeFVudXNlZElkZW50aWZpZXJzKClcbiAgICB9IHdoaWxlIChsYXN0V2lkdGggIT09IHNvdXJjZUZpbGUuZ2V0RnVsbFdpZHRoKCkpXG5cbiAgICBjb25zdCBhYnNvbHV0ZVBhY2thZ2VEaXIgPSBwYXRoLnJlc29sdmUocGFja2FnZURpcilcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKFxuICAgICAgYWJzb2x1dGVQYWNrYWdlRGlyLFxuICAgICAgc291cmNlRmlsZS5nZXRGaWxlUGF0aCgpXG4gICAgKVxuICAgIHBhdGhzLnB1c2gocmVsYXRpdmVQYXRoKVxuICB9XG5cbiAgY29uc3QgcGF0aFRvSWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBhZGQgcHJlZml4IHRvIGF2b2lkIHN0YXJ0aW5nIHdpdGggYSBudW1iZXJcbiAgICBwYXRoVG9JZFtwYXRoXSA9XG4gICAgICBcImhhc2hcIiArIGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShwYXRoKS5kaWdlc3QoXCJoZXhcIilcbiAgfVxuXG4gIGNvbnN0IGVudHJ5UG9pbnRDb250ZW50ID0gYFxuICAke3BhdGhzXG4gICAgLm1hcCgocCkgPT4gYGltcG9ydCB7ZXh0cmFjdGVkUm91dGVTcGVjIGFzICR7cGF0aFRvSWRbcF19fSBmcm9tIFwiLi8ke3B9XCJgKVxuICAgIC5qb2luKFwiXFxuXCIpfVxuXG4gIGV4cG9ydCBjb25zdCByb3V0ZXMgPSB7XG4gICAgJHtwYXRoc1xuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCBodHRwUm91dGUgPSAoXG4gICAgICAgICAgb3B0cy5tYXBGaWxlUGF0aFRvSFRUUFJvdXRlID8/XG4gICAgICAgICAgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUob3B0cy5hcGlQcmVmaXgpXG4gICAgICAgICkocClcblxuICAgICAgICByZXR1cm4gYFwiJHtodHRwUm91dGV9XCI6ICR7cGF0aFRvSWRbcF19YFxuICAgICAgfSlcbiAgICAgIC5qb2luKFwiLFxcblwiKX1cbiAgfVxuICBgXG5cbiAgLy8gQ29weSBhbGxvd2VkIGltcG9ydCBnbG9icyBpbnRvIHByb2plY3RcbiAgaWYgKG9wdHMuYWxsb3dlZEltcG9ydFBhdHRlcm5zKSB7XG4gICAgcHJvamVjdC5hZGRTb3VyY2VGaWxlc0F0UGF0aHMob3B0cy5hbGxvd2VkSW1wb3J0UGF0dGVybnMpXG4gIH1cblxuICAvLyBHZW5lcmF0ZSB0eXBlcyAoLmQudHMpXG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwcm9qZWN0LmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJleHRyYWN0ZWQtcm91dGUtc3BlY3MudHNcIixcbiAgICBlbnRyeVBvaW50Q29udGVudFxuICApXG4gIGNvbnN0IGVtaXRSZXN1bHQgPSBlbnRyeVBvaW50LmdldEVtaXRPdXRwdXQoeyBlbWl0T25seUR0c0ZpbGVzOiB0cnVlIH0pXG4gIGlmIChvcHRzLm91dHB1dEZpbGUpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbkZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgcGF0aC5kaXJuYW1lKG9wdHMub3V0cHV0RmlsZSksXG4gICAgICBwYXRoLmJhc2VuYW1lKG9wdHMub3V0cHV0RmlsZSkucmVwbGFjZShcIi5tanNcIiwgXCJcIikucmVwbGFjZShcIi5qc1wiLCBcIlwiKSArXG4gICAgICAgIFwiLmQudHNcIlxuICAgIClcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICBkZWNsYXJhdGlvbkZpbGVQYXRoLFxuICAgICAgZW1pdFJlc3VsdC5nZXRPdXRwdXRGaWxlcygpWzBdLmdldFRleHQoKVxuICAgIClcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIHZhbHVlcyAoLmpzKVxuICBjb25zdCBwa2dSYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShcbiAgICBwYXRoLmpvaW4ocGFja2FnZURpciwgXCJwYWNrYWdlLmpzb25cIiksXG4gICAgXCJ1dGYtOFwiXG4gIClcbiAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShwa2dSYXcpXG5cbiAgYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgLi4ub3B0cy5lc2J1aWxkT3B0aW9ucyxcbiAgICBzdGRpbjoge1xuICAgICAgY29udGVudHM6IGVudHJ5UG9pbnRDb250ZW50LFxuICAgICAgcmVzb2x2ZURpcjogcGF0aC5yZXNvbHZlKHBhY2thZ2VEaXIpLFxuICAgIH0sXG4gICAgb3V0ZmlsZTogb3B0cy5vdXRwdXRGaWxlLFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybTogXCJub2RlXCIsXG4gICAgZm9ybWF0OiBcImVzbVwiLFxuICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgIGV4dGVybmFsOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwa2cuZGVwZW5kZW5jaWVzKSxcbiAgICAgIC4uLk9iamVjdC5rZXlzKHBrZy5kZXZEZXBlbmRlbmNpZXMpLFxuICAgICAgLi4uKG9wdHMuZXNidWlsZE9wdGlvbnM/LmV4dGVybmFsID8/IFtdKSxcbiAgICBdLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIC8vIFdpdGggdGhpcyBwbHVnaW4sIGVzYnVpbGQgd2lsbCBuZXZlciB0b3VjaCB0aGUgYWN0dWFsIGZpbGVzeXN0ZW0gYW5kIHRodXMgY2Fubm90IGludGVyYWN0IHdpdGggaW1wb3J0cyB0aGF0IGRvbid0IG1hdGNoIGFsbG93ZWRJbXBvcnRQYXR0ZXJuc1tdLlxuICAgICAge1xuICAgICAgICBuYW1lOiBcInJlc29sdmUtdmlydHVhbC1mc1wiLFxuICAgICAgICBzZXR1cChidWlsZCkge1xuICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogLy4qLyB9LCAoYXJncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudHMgPSBwcm9qZWN0LmdldFNvdXJjZUZpbGUoYXJncy5wYXRoKT8uZ2V0RnVsbFRleHQoKVxuICAgICAgICAgICAgaWYgKCFjb250ZW50cykge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBcImV4cG9ydCBkZWZhdWx0IHt9XCIsXG4gICAgICAgICAgICAgICAgbG9hZGVyOiBcInRzXCIsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudHMsXG4gICAgICAgICAgICAgIGxvYWRlcjogXCJ0c1wiLFxuICAgICAgICAgICAgICByZXNvbHZlRGlyOiBwYXRoLmRpcm5hbWUoYXJncy5wYXRoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC4uLihvcHRzLmVzYnVpbGRPcHRpb25zPy5wbHVnaW5zID8/IFtdKSxcbiAgICBdLFxuICB9KVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDd0VBLFNBQVMsaUJBQWlCO0FBQ3pCLFFBQU0sUUFBUSxvQkFBSSxJQUFJO0FBRXRCLGFBQVcsQ0FBQyxXQUFXLEtBQUssS0FBSyxPQUFPLFFBQVEsTUFBTSxHQUFHO0FBQ3hELGVBQVcsQ0FBQyxXQUFXLEtBQUssS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQ3ZELGFBQU8sYUFBYTtBQUFBLFFBQ25CLE1BQU0sUUFBVSxNQUFNO0FBQUEsUUFDdEIsT0FB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eSIsICJzdHlsZXMiLCAiY2hhbGsiLCAibW9kdWxlIiwgIm1lcmdlMiIsICJvcyIsICJwYXRoIiwgInBhdHRlcm4iLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAic2xhc2giLCAiZ2xvYmJ5IiwgIm5vZGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicGF0dGVybiIsICJtYXgiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJwYXJzZSIsICJpbmRleCIsICJtb2R1bGUiLCAicGFyc2UiLCAicGF0dGVybiIsICJyZXF1aXJlX2NvbnN0YW50cyIsICJtb2R1bGUiLCAicGF0aCIsICJyZXF1aXJlX3V0aWxzIiwgInBhdGgiLCAibW9kdWxlIiwgInJlcXVpcmVfcGFyc2UiLCAibW9kdWxlIiwgInBhcnNlIiwgIm9wdHMiLCAidmFsdWUiLCAicmVzdCIsICJzb3VyY2UiLCAibW9kdWxlIiwgInBhdGgiLCAicGFyc2UiLCAic3RhdGUiLCAicmVnZXgiLCAicGF0dGVybiIsICJyZXF1aXJlX3BpY29tYXRjaCIsICJtb2R1bGUiLCAibW9kdWxlIiwgInBhdHRlcm4iLCAicmVnZXgiLCAicGF0aCIsICJwYXR0ZXJuIiwgImlzRHluYW1pY1BhdHRlcm4iLCAiaXNOZWdhdGl2ZVBhdHRlcm4iLCAibWVyZ2UyIiwgIm1lcmdlIiwgInJlcXVpcmVfdXRpbHMiLCAiZnMiLCAicGF0aCIsICJwYXR0ZXJuIiwgInBhdHRlcm4iLCAicGF0aCIsICJwYXRoIiwgInJlcXVpcmVfZnMiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgInF1ZXVlTWljcm90YXNrIiwgInJlcXVpcmVfY29uc3RhbnRzIiwgInJlcXVpcmVfZnMiLCAicmVxdWlyZV91dGlscyIsICJmcyIsICJyZXF1aXJlX2FzeW5jIiwgInBhdGgiLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfZnMiLCAiZnMiLCAicmVxdWlyZV9zZXR0aW5ncyIsICJwYXRoIiwgImZzIiwgInJlcXVpcmVfb3V0IiwgInBhdGgiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyZXF1aXJlX2NvbW1vbiIsICJyZXF1aXJlX2FzeW5jIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9zdHJlYW0iLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc3luYyIsICJyZXF1aXJlX3NldHRpbmdzIiwgInBhdGgiLCAicmVxdWlyZV9vdXQiLCAicmVxdWlyZV9yZWFkZXIiLCAicGF0aCIsICJwYXR0ZXJuIiwgInJlcXVpcmVfc3RyZWFtIiwgInBhdHRlcm4iLCAicmVxdWlyZV9hc3luYyIsICJwYXR0ZXJuIiwgInBhdHRlcm4iLCAicmVxdWlyZV9lbnRyeSIsICJwYXRoIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9zdHJlYW0iLCAicmVxdWlyZV9zeW5jIiwgInBhdHRlcm4iLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc2V0dGluZ3MiLCAiZnMiLCAib3MiLCAicmVxdWlyZV9vdXQiLCAibW9kdWxlIiwgImFzc2VydFBhdHRlcm5zSW5wdXQiLCAiRmFzdEdsb2IiLCAiZ2VuZXJhdGVUYXNrcyIsICJpc0R5bmFtaWNQYXR0ZXJuIiwgInBvc2l4IiwgImVzY2FwZVBhdGgiLCAiY29udmVydFBhdGhUb1BhdHRlcm4iLCAid2luMzIiLCAiZnMiLCAibW9kdWxlIiwgInBhdGgiLCAibW9kdWxlIiwgIl8iLCAicGF0dGVybiIsICJyZWdleCIsICJwYXRoIiwgInBhdGgiLCAiaW5pdF91dGlsaXRpZXMiLCAicGF0dGVybiIsICJpbXBvcnRfbm9kZV9wcm9jZXNzIiwgImluaXRfdXRpbGl0aWVzIiwgInBhdHRlcm4iLCAicGF0aCIsICJnaXRJZ25vcmUiLCAicHJvY2VzcyIsICJmYXN0R2xvYiIsICJmcyIsICJpbXBvcnRfbm9kZV9mcyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9mYXN0X2dsb2IiLCAibm9ybWFsaXplT3B0aW9ucyIsICJpbml0X3V0aWxpdGllcyIsICJwYXR0ZXJuIiwgImZzIiwgInBhdGgiLCAibm9kZVBhdGgiLCAibWVyZ2UyIiwgInBhdHRlcm5zIiwgIm9wdGlvbnMiLCAiZGlyR2xvYiIsICJmYXN0R2xvYiIsICJpbXBvcnRfem9kIiwgImltcG9ydF9ub2RlX3BhdGgiLCAicGF0aCIsICJjaGFsayIsICJnbG9iYnkiLCAicGF0aCIsICJkZWRlbnQiLCAibWVyZ2UiLCAiXyIsICJwYXRoIiwgImltcG9ydF9kZWRlbnQiLCAicGF0aCIsICJjaGFsayIsICJkZWRlbnQiLCAiX2EiLCAiZnMiLCAiZnMiLCAiaW1wb3J0X3pvZCIsICJpbXBvcnRfZGVkZW50IiwgInRzIiwgInBhcnNlRGVzY3JpcHRpb24iLCAiZGVkZW50IiwgIm9wdGlvbnMiLCAiaW1wb3J0X3pvZCIsICJfIiwgInByZXR0aWVyIiwgImZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAicGF0aCIsICJjcnlwdG8iLCAiX2EiLCAiYnVpbGQiXQp9Cg==
8539
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzdXAvYXNzZXRzL2Nqc19zaGltcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3ZlbmRvci9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9tZXJnZTIvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvYXJyYXkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZXJybm8uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvZnMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0aC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZXh0Z2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL25vZGVfbW9kdWxlcy9nbG9iLXBhcmVudC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi91dGlscy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9zdHJpbmdpZnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW51bWJlci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdG8tcmVnZXgtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ZpbGwtcmFuZ2UvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29tcGlsZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9leHBhbmQuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvbGliL3BhcnNlLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9icmFjZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3V0aWxzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3NjYW4uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGFyc2UuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BpY29tYXRjaC9saWIvcGljb21hdGNoLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9waWNvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pY3JvbWF0Y2gvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvcGF0dGVybi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC91dGlscy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvdXRpbHMvc3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3V0aWxzL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L21hbmFnZXJzL3Rhc2tzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9wcm92aWRlcnMvYXN5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zdGF0L291dC9hZGFwdGVycy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc3RhdC9vdXQvc2V0dGluZ3MuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnN0YXQvb3V0L2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xdWV1ZS1taWNyb3Rhc2svaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3J1bi1wYXJhbGxlbC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC91dGlscy9mcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvdXRpbHMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9jb21tb24uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvcHJvdmlkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLnNjYW5kaXIvb3V0L2FkYXB0ZXJzL2ZzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy5zY2FuZGlyL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMuc2NhbmRpci9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JldXNpZnkvcmV1c2lmeS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdHEvcXVldWUuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3JlYWRlcnMvY29tbW9uLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3JlYWRlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvcHJvdmlkZXJzL2FzeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9yZWFkZXJzL3N5bmMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2RlbGliL2ZzLndhbGsvb3V0L3Byb3ZpZGVycy9zeW5jLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9Abm9kZWxpYi9mcy53YWxrL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQG5vZGVsaWIvZnMud2Fsay9vdXQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9yZWFkZXIuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9zdHJlYW0uanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcmVhZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvbWF0Y2hlci5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvbWF0Y2hlcnMvcGFydGlhbC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvZmlsdGVycy9kZWVwLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2VudHJ5LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9maWx0ZXJzL2Vycm9yLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy90cmFuc2Zvcm1lcnMvZW50cnkuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Zhc3QtZ2xvYi9vdXQvcHJvdmlkZXJzL3Byb3ZpZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3Byb3ZpZGVycy9hc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3RyZWFtLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9mYXN0LWdsb2Ivb3V0L3JlYWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9wcm92aWRlcnMvc3luYy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9zZXR0aW5ncy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvZmFzdC1nbG9iL291dC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGF0aC10eXBlL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9kaXItZ2xvYi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvaWdub3JlL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zbGFzaC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L3V0aWxpdGllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2lnbm9yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvZ2xvYmJ5L2luZGV4LmpzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvem9kLW9wZW5hcGkudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2Zyb250LW1hdHRlci50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXMudHMiLCAiLi4vLi4vc3JjL2xpYi96b2QtY29tcGF0LnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9mZXJuLXNkay11dGlscy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1yb3V0ZS10eXBlcy9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvem9kLXRvLXRzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2V4dHJhY3Qtcm91dGUtc3BlYy1zY2hlbWFzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBTaGltIGdsb2JhbHMgaW4gY2pzIGJ1bmRsZVxuLy8gVGhlcmUncyBhIHdlaXJkIGJ1ZyB0aGF0IGVzYnVpbGQgd2lsbCBhbHdheXMgaW5qZWN0IGltcG9ydE1ldGFVcmxcbi8vIGlmIHdlIGV4cG9ydCBpdCBhcyBgY29uc3QgaW1wb3J0TWV0YVVybCA9IC4uLiBfX2ZpbGVuYW1lIC4uLmBcbi8vIEJ1dCB1c2luZyBhIGZ1bmN0aW9uIHdpbGwgbm90IGNhdXNlIHRoaXMgaXNzdWVcblxuY29uc3QgZ2V0SW1wb3J0TWV0YVVybCA9ICgpID0+XG4gIHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCdcbiAgICA/IG5ldyBVUkwoJ2ZpbGU6JyArIF9fZmlsZW5hbWUpLmhyZWZcbiAgICA6IChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSB8fFxuICAgICAgbmV3IFVSTCgnbWFpbi5qcycsIGRvY3VtZW50LmJhc2VVUkkpLmhyZWZcblxuZXhwb3J0IGNvbnN0IGltcG9ydE1ldGFVcmwgPSAvKiBAX19QVVJFX18gKi8gZ2V0SW1wb3J0TWV0YVVybCgpXG4iLCAiY29uc3QgQU5TSV9CQUNLR1JPVU5EX09GRlNFVCA9IDEwO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHtjb2RlICsgb2Zmc2V0fW1gO1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChvZmZzZXQgPSAwKSA9PiBjb2RlID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xuXG5jb25zdCB3cmFwQW5zaTE2bSA9IChvZmZzZXQgPSAwKSA9PiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JlZH07JHtncmVlbn07JHtibHVlfW1gO1xuXG5jb25zdCBzdHlsZXMgPSB7XG5cdG1vZGlmaWVyOiB7XG5cdFx0cmVzZXQ6IFswLCAwXSxcblx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0Ym9sZDogWzEsIDIyXSxcblx0XHRkaW06IFsyLCAyMl0sXG5cdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdHVuZGVybGluZTogWzQsIDI0XSxcblx0XHRvdmVybGluZTogWzUzLCA1NV0sXG5cdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRoaWRkZW46IFs4LCAyOF0sXG5cdFx0c3RyaWtldGhyb3VnaDogWzksIDI5XSxcblx0fSxcblx0Y29sb3I6IHtcblx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0cmVkOiBbMzEsIDM5XSxcblx0XHRncmVlbjogWzMyLCAzOV0sXG5cdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRibHVlOiBbMzQsIDM5XSxcblx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcblx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHR3aGl0ZTogWzM3LCAzOV0sXG5cblx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0Z3JheTogWzkwLCAzOV0sIC8vIEFsaWFzIG9mIGBibGFja0JyaWdodGBcblx0XHRncmV5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuXHRcdHJlZEJyaWdodDogWzkxLCAzOV0sXG5cdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdHllbGxvd0JyaWdodDogWzkzLCAzOV0sXG5cdFx0Ymx1ZUJyaWdodDogWzk0LCAzOV0sXG5cdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0Y3lhbkJyaWdodDogWzk2LCAzOV0sXG5cdFx0d2hpdGVCcmlnaHQ6IFs5NywgMzldLFxuXHR9LFxuXHRiZ0NvbG9yOiB7XG5cdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0YmdSZWQ6IFs0MSwgNDldLFxuXHRcdGJnR3JlZW46IFs0MiwgNDldLFxuXHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRiZ0JsdWU6IFs0NCwgNDldLFxuXHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG5cdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRiZ1doaXRlOiBbNDcsIDQ5XSxcblxuXHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRiZ0dyYXk6IFsxMDAsIDQ5XSwgLy8gQWxpYXMgb2YgYGJnQmxhY2tCcmlnaHRgXG5cdFx0YmdHcmV5OiBbMTAwLCA0OV0sIC8vIEFsaWFzIG9mIGBiZ0JsYWNrQnJpZ2h0YFxuXHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0YmdHcmVlbkJyaWdodDogWzEwMiwgNDldLFxuXHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG5cdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0YmdNYWdlbnRhQnJpZ2h0OiBbMTA1LCA0OV0sXG5cdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG5cdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldLFxuXHR9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1vZGlmaWVyTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZXMubW9kaWZpZXIpO1xuZXhwb3J0IGNvbnN0IGZvcmVncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzLmNvbG9yKTtcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kQ29sb3JOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcy5iZ0NvbG9yKTtcbmV4cG9ydCBjb25zdCBjb2xvck5hbWVzID0gWy4uLmZvcmVncm91bmRDb2xvck5hbWVzLCAuLi5iYWNrZ3JvdW5kQ29sb3JOYW1lc107XG5cbmZ1bmN0aW9uIGFzc2VtYmxlU3R5bGVzKCkge1xuXHRjb25zdCBjb2RlcyA9IG5ldyBNYXAoKTtcblxuXHRmb3IgKGNvbnN0IFtncm91cE5hbWUsIGdyb3VwXSBvZiBPYmplY3QuZW50cmllcyhzdHlsZXMpKSB7XG5cdFx0Zm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXApKSB7XG5cdFx0XHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRcdFx0b3BlbjogYFxcdTAwMUJbJHtzdHlsZVswXX1tYCxcblx0XHRcdFx0Y2xvc2U6IGBcXHUwMDFCWyR7c3R5bGVbMV19bWAsXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cblx0XHRcdGNvZGVzLnNldChzdHlsZVswXSwgc3R5bGVbMV0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuXHRcdFx0dmFsdWU6IGdyb3VwLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHR9KTtcblxuXHRzdHlsZXMuY29sb3IuY2xvc2UgPSAnXFx1MDAxQlszOW0nO1xuXHRzdHlsZXMuYmdDb2xvci5jbG9zZSA9ICdcXHUwMDFCWzQ5bSc7XG5cblx0c3R5bGVzLmNvbG9yLmFuc2kgPSB3cmFwQW5zaTE2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoKTtcblx0c3R5bGVzLmNvbG9yLmFuc2kxNm0gPSB3cmFwQW5zaTE2bSgpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpID0gd3JhcEFuc2kxNihBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cblx0Ly8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vUWl4LS9jb2xvci1jb252ZXJ0L2Jsb2IvM2YwZTBkNGU5MmUyMzU3OTZjY2IxN2Y2ZTg1YzcyMDk0YTY1MWY0OS9jb252ZXJzaW9ucy5qc1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHlsZXMsIHtcblx0XHRyZ2JUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlKHJlZCwgZ3JlZW4sIGJsdWUpIHtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0XHRcdFx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdFx0XHRcdGlmIChyZWQgPT09IGdyZWVuICYmIGdyZWVuID09PSBibHVlKSB7XG5cdFx0XHRcdFx0aWYgKHJlZCA8IDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAxNjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVkID4gMjQ4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMjMxO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCgocmVkIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIDE2XG5cdFx0XHRcdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHJlZCAvIDI1NSAqIDUpKVxuXHRcdFx0XHRcdCsgKDYgKiBNYXRoLnJvdW5kKGdyZWVuIC8gMjU1ICogNSkpXG5cdFx0XHRcdFx0KyBNYXRoLnJvdW5kKGJsdWUgLyAyNTUgKiA1KTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvUmdiOiB7XG5cdFx0XHR2YWx1ZShoZXgpIHtcblx0XHRcdFx0Y29uc3QgbWF0Y2hlcyA9IC9bYS1mXFxkXXs2fXxbYS1mXFxkXXszfS9pLmV4ZWMoaGV4LnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRcdGlmICghbWF0Y2hlcykge1xuXHRcdFx0XHRcdHJldHVybiBbMCwgMCwgMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgW2NvbG9yU3RyaW5nXSA9IG1hdGNoZXM7XG5cblx0XHRcdFx0aWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdGNvbG9yU3RyaW5nID0gWy4uLmNvbG9yU3RyaW5nXS5tYXAoY2hhcmFjdGVyID0+IGNoYXJhY3RlciArIGNoYXJhY3Rlcikuam9pbignJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnRlZ2VyID0gTnVtYmVyLnBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gMTYpICYgMHhGRixcblx0XHRcdFx0XHQoaW50ZWdlciA+PiA4KSAmIDB4RkYsXG5cdFx0XHRcdFx0aW50ZWdlciAmIDB4RkYsXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdF07XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzLnJnYlRvQW5zaTI1NiguLi5zdHlsZXMuaGV4VG9SZ2IoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGFuc2kyNTZUb0Fuc2k6IHtcblx0XHRcdHZhbHVlKGNvZGUpIHtcblx0XHRcdFx0aWYgKGNvZGUgPCA4KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDMwICsgY29kZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjb2RlIDwgMTYpIHtcblx0XHRcdFx0XHRyZXR1cm4gOTAgKyAoY29kZSAtIDgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHJlZDtcblx0XHRcdFx0bGV0IGdyZWVuO1xuXHRcdFx0XHRsZXQgYmx1ZTtcblxuXHRcdFx0XHRpZiAoY29kZSA+PSAyMzIpIHtcblx0XHRcdFx0XHRyZWQgPSAoKChjb2RlIC0gMjMyKSAqIDEwKSArIDgpIC8gMjU1O1xuXHRcdFx0XHRcdGdyZWVuID0gcmVkO1xuXHRcdFx0XHRcdGJsdWUgPSByZWQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29kZSAtPSAxNjtcblxuXHRcdFx0XHRcdGNvbnN0IHJlbWFpbmRlciA9IGNvZGUgJSAzNjtcblxuXHRcdFx0XHRcdHJlZCA9IE1hdGguZmxvb3IoY29kZSAvIDM2KSAvIDU7XG5cdFx0XHRcdFx0Z3JlZW4gPSBNYXRoLmZsb29yKHJlbWFpbmRlciAvIDYpIC8gNTtcblx0XHRcdFx0XHRibHVlID0gKHJlbWFpbmRlciAlIDYpIC8gNTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gTWF0aC5tYXgocmVkLCBncmVlbiwgYmx1ZSkgKiAyO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiAzMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG5cdFx0XHRcdGxldCByZXN1bHQgPSAzMCArICgoTWF0aC5yb3VuZChibHVlKSA8PCAyKSB8IChNYXRoLnJvdW5kKGdyZWVuKSA8PCAxKSB8IE1hdGgucm91bmQocmVkKSk7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0XHRcdFx0cmVzdWx0ICs9IDYwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdHJnYlRvQW5zaToge1xuXHRcdFx0dmFsdWU6IChyZWQsIGdyZWVuLCBibHVlKSA9PiBzdHlsZXMuYW5zaTI1NlRvQW5zaShzdHlsZXMucmdiVG9BbnNpMjU2KHJlZCwgZ3JlZW4sIGJsdWUpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0sXG5cdFx0aGV4VG9BbnNpOiB7XG5cdFx0XHR2YWx1ZTogaGV4ID0+IHN0eWxlcy5hbnNpMjU2VG9BbnNpKHN0eWxlcy5oZXhUb0Fuc2kyNTYoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHR9KTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG5jb25zdCBhbnNpU3R5bGVzID0gYXNzZW1ibGVTdHlsZXMoKTtcblxuZXhwb3J0IGRlZmF1bHQgYW5zaVN0eWxlcztcbiIsICJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHR0eSBmcm9tICdub2RlOnR0eSc7XG5cbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvaGFzLWZsYWcvYmxvYi9tYWluL2luZGV4LmpzXG4vLy8gZnVuY3Rpb24gaGFzRmxhZyhmbGFnLCBhcmd2ID0gZ2xvYmFsVGhpcy5EZW5vPy5hcmdzID8/IHByb2Nlc3MuYXJndikge1xuZnVuY3Rpb24gaGFzRmxhZyhmbGFnLCBhcmd2ID0gZ2xvYmFsVGhpcy5EZW5vID8gZ2xvYmFsVGhpcy5EZW5vLmFyZ3MgOiBwcm9jZXNzLmFyZ3YpIHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn1cblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZmxhZ0ZvcmNlQ29sb3I7XG5pZiAoXG5cdGhhc0ZsYWcoJ25vLWNvbG9yJylcblx0fHwgaGFzRmxhZygnbm8tY29sb3JzJylcblx0fHwgaGFzRmxhZygnY29sb3I9ZmFsc2UnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj1uZXZlcicpXG4pIHtcblx0ZmxhZ0ZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChcblx0aGFzRmxhZygnY29sb3InKVxuXHR8fCBoYXNGbGFnKCdjb2xvcnMnKVxuXHR8fCBoYXNGbGFnKCdjb2xvcj10cnVlJylcblx0fHwgaGFzRmxhZygnY29sb3I9YWx3YXlzJylcbikge1xuXHRmbGFnRm9yY2VDb2xvciA9IDE7XG59XG5cbmZ1bmN0aW9uIGVudkZvcmNlQ29sb3IoKSB7XG5cdGlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRcdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4oTnVtYmVyLnBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDMsXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9zdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHtzdHJlYW1Jc1RUWSwgc25pZmZGbGFncyA9IHRydWV9ID0ge30pIHtcblx0Y29uc3Qgbm9GbGFnRm9yY2VDb2xvciA9IGVudkZvcmNlQ29sb3IoKTtcblx0aWYgKG5vRmxhZ0ZvcmNlQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZsYWdGb3JjZUNvbG9yID0gbm9GbGFnRm9yY2VDb2xvcjtcblx0fVxuXG5cdGNvbnN0IGZvcmNlQ29sb3IgPSBzbmlmZkZsYWdzID8gZmxhZ0ZvcmNlQ29sb3IgOiBub0ZsYWdGb3JjZUNvbG9yO1xuXG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoc25pZmZGbGFncykge1xuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKVxuXHRcdFx0fHwgaGFzRmxhZygnY29sb3I9ZnVsbCcpXG5cdFx0XHR8fCBoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0XHRyZXR1cm4gMjtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgQXp1cmUgRGV2T3BzIHBpcGVsaW5lcy5cblx0Ly8gSGFzIHRvIGJlIGFib3ZlIHRoZSBgIXN0cmVhbUlzVFRZYCBjaGVjay5cblx0aWYgKCdURl9CVUlMRCcgaW4gZW52ICYmICdBR0VOVF9OQU1FJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmIChoYXZlU3RyZWFtICYmICFzdHJlYW1Jc1RUWSAmJiBmb3JjZUNvbG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IgfHwgMDtcblxuXHRpZiAoZW52LlRFUk0gPT09ICdkdW1iJykge1xuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTA1ODYgaXMgdGhlIGZpcnN0IFdpbmRvd3MgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDI1NiBjb2xvcnMuXG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxNDkzMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDE2bS9UcnVlQ29sb3IuXG5cdFx0Y29uc3Qgb3NSZWxlYXNlID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJyk7XG5cdFx0aWYgKFxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVswXSkgPj0gMTBcblx0XHRcdCYmIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDEwXzU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0XzkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKCdHSVRIVUJfQUNUSU9OUycgaW4gZW52IHx8ICdHSVRFQV9BQ1RJT05TJyBpbiBlbnYpIHtcblx0XHRcdHJldHVybiAzO1xuXHRcdH1cblxuXHRcdGlmIChbJ1RSQVZJUycsICdDSVJDTEVDSScsICdBUFBWRVlPUicsICdHSVRMQUJfQ0knLCAnQlVJTERLSVRFJywgJ0RST05FJ10uc29tZShzaWduID0+IHNpZ24gaW4gZW52KSB8fCBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmICgnVEVBTUNJVFlfVkVSU0lPTicgaW4gZW52KSB7XG5cdFx0cmV0dXJuIC9eKDlcXC4oMCpbMS05XVxcZCopXFwufFxcZHsyLH1cXC4pLy50ZXN0KGVudi5URUFNQ0lUWV9WRVJTSU9OKSA/IDEgOiAwO1xuXHR9XG5cblx0aWYgKGVudi5DT0xPUlRFUk0gPT09ICd0cnVlY29sb3InKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoZW52LlRFUk0gPT09ICd4dGVybS1raXR0eScpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzoge1xuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHR9XG5cblx0XHRcdGNhc2UgJ0FwcGxlX1Rlcm1pbmFsJzoge1xuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdH1cblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdXBwb3J0c0NvbG9yKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxldmVsID0gX3N1cHBvcnRzQ29sb3Ioc3RyZWFtLCB7XG5cdFx0c3RyZWFtSXNUVFk6IHN0cmVhbSAmJiBzdHJlYW0uaXNUVFksXG5cdFx0Li4ub3B0aW9ucyxcblx0fSk7XG5cblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxuY29uc3Qgc3VwcG9ydHNDb2xvciA9IHtcblx0c3Rkb3V0OiBjcmVhdGVTdXBwb3J0c0NvbG9yKHtpc1RUWTogdHR5LmlzYXR0eSgxKX0pLFxuXHRzdGRlcnI6IGNyZWF0ZVN1cHBvcnRzQ29sb3Ioe2lzVFRZOiB0dHkuaXNhdHR5KDIpfSksXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzdXBwb3J0c0NvbG9yO1xuIiwgIi8vIFRPRE86IFdoZW4gdGFyZ2V0aW5nIE5vZGUuanMgMTYsIHVzZSBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsYC5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdSZXBsYWNlQWxsKHN0cmluZywgc3Vic3RyaW5nLCByZXBsYWNlcikge1xuXHRsZXQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcpO1xuXHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHN1YnN0cmluZ0xlbmd0aCA9IHN1YnN0cmluZy5sZW5ndGg7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCBpbmRleCkgKyBzdWJzdHJpbmcgKyByZXBsYWNlcjtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgc3Vic3RyaW5nTGVuZ3RoO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgcHJlZml4LCBwb3N0Zml4LCBpbmRleCkge1xuXHRsZXQgZW5kSW5kZXggPSAwO1xuXHRsZXQgcmV0dXJuVmFsdWUgPSAnJztcblx0ZG8ge1xuXHRcdGNvbnN0IGdvdENSID0gc3RyaW5nW2luZGV4IC0gMV0gPT09ICdcXHInO1xuXHRcdHJldHVyblZhbHVlICs9IHN0cmluZy5zbGljZShlbmRJbmRleCwgKGdvdENSID8gaW5kZXggLSAxIDogaW5kZXgpKSArIHByZWZpeCArIChnb3RDUiA/ICdcXHJcXG4nIDogJ1xcbicpICsgcG9zdGZpeDtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgMTtcblx0XHRpbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufVxuIiwgImltcG9ydCBhbnNpU3R5bGVzIGZyb20gJyNhbnNpLXN0eWxlcyc7XG5pbXBvcnQgc3VwcG9ydHNDb2xvciBmcm9tICcjc3VwcG9ydHMtY29sb3InO1xuaW1wb3J0IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvb3JkZXJcblx0c3RyaW5nUmVwbGFjZUFsbCxcblx0c3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4LFxufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IHtzdGRvdXQ6IHN0ZG91dENvbG9yLCBzdGRlcnI6IHN0ZGVyckNvbG9yfSA9IHN1cHBvcnRzQ29sb3I7XG5cbmNvbnN0IEdFTkVSQVRPUiA9IFN5bWJvbCgnR0VORVJBVE9SJyk7XG5jb25zdCBTVFlMRVIgPSBTeW1ib2woJ1NUWUxFUicpO1xuY29uc3QgSVNfRU1QVFkgPSBTeW1ib2woJ0lTX0VNUFRZJyk7XG5cbi8vIGBzdXBwb3J0c0NvbG9yLmxldmVsYCBcdTIxOTIgYGFuc2lTdHlsZXMuY29sb3JbbmFtZV1gIG1hcHBpbmdcbmNvbnN0IGxldmVsTWFwcGluZyA9IFtcblx0J2Fuc2knLFxuXHQnYW5zaScsXG5cdCdhbnNpMjU2Jyxcblx0J2Fuc2kxNm0nLFxuXTtcblxuY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuY29uc3QgYXBwbHlPcHRpb25zID0gKG9iamVjdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGlmIChvcHRpb25zLmxldmVsICYmICEoTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmxldmVsKSAmJiBvcHRpb25zLmxldmVsID49IDAgJiYgb3B0aW9ucy5sZXZlbCA8PSAzKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG5cdH1cblxuXHQvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXHRjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG5cdG9iamVjdC5sZXZlbCA9IG9wdGlvbnMubGV2ZWwgPT09IHVuZGVmaW5lZCA/IGNvbG9yTGV2ZWwgOiBvcHRpb25zLmxldmVsO1xufTtcblxuZXhwb3J0IGNsYXNzIENoYWxrIHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cblx0XHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xuXHR9XG59XG5cbmNvbnN0IGNoYWxrRmFjdG9yeSA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBjaGFsayA9ICguLi5zdHJpbmdzKSA9PiBzdHJpbmdzLmpvaW4oJyAnKTtcblx0YXBwbHlPcHRpb25zKGNoYWxrLCBvcHRpb25zKTtcblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGssIGNyZWF0ZUNoYWxrLnByb3RvdHlwZSk7XG5cblx0cmV0dXJuIGNoYWxrO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQ2hhbGsob3B0aW9ucykge1xuXHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xufVxuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoY3JlYXRlQ2hhbGsucHJvdG90eXBlLCBGdW5jdGlvbi5wcm90b3R5cGUpO1xuXG5mb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhhbnNpU3R5bGVzKSkge1xuXHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCBjcmVhdGVTdHlsZXIoc3R5bGUub3Blbiwgc3R5bGUuY2xvc2UsIHRoaXNbU1RZTEVSXSksIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBzdHlsZU5hbWUsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdFx0fSxcblx0fTtcbn1cblxuc3R5bGVzLnZpc2libGUgPSB7XG5cdGdldCgpIHtcblx0XHRjb25zdCBidWlsZGVyID0gY3JlYXRlQnVpbGRlcih0aGlzLCB0aGlzW1NUWUxFUl0sIHRydWUpO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmlzaWJsZScsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdHJldHVybiBidWlsZGVyO1xuXHR9LFxufTtcblxuY29uc3QgZ2V0TW9kZWxBbnNpID0gKG1vZGVsLCBsZXZlbCwgdHlwZSwgLi4uYXJndW1lbnRzXykgPT4ge1xuXHRpZiAobW9kZWwgPT09ICdyZ2InKSB7XG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTE2bScpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kxNm0oLi4uYXJndW1lbnRzXyk7XG5cdFx0fVxuXG5cdFx0aWYgKGxldmVsID09PSAnYW5zaTI1NicpIHtcblx0XHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2kyNTYoYW5zaVN0eWxlcy5yZ2JUb0Fuc2kyNTYoLi4uYXJndW1lbnRzXykpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdLmFuc2koYW5zaVN0eWxlcy5yZ2JUb0Fuc2koLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0aWYgKG1vZGVsID09PSAnaGV4Jykge1xuXHRcdHJldHVybiBnZXRNb2RlbEFuc2koJ3JnYicsIGxldmVsLCB0eXBlLCAuLi5hbnNpU3R5bGVzLmhleFRvUmdiKC4uLmFyZ3VtZW50c18pKTtcblx0fVxuXG5cdHJldHVybiBhbnNpU3R5bGVzW3R5cGVdW21vZGVsXSguLi5hcmd1bWVudHNfKTtcbn07XG5cbmNvbnN0IHVzZWRNb2RlbHMgPSBbJ3JnYicsICdoZXgnLCAnYW5zaTI1NiddO1xuXG5mb3IgKGNvbnN0IG1vZGVsIG9mIHVzZWRNb2RlbHMpIHtcblx0c3R5bGVzW21vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnY29sb3InLCAuLi5hcmd1bWVudHNfKSwgYW5zaVN0eWxlcy5jb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG5cblx0Y29uc3QgYmdNb2RlbCA9ICdiZycgKyBtb2RlbFswXS50b1VwcGVyQ2FzZSgpICsgbW9kZWwuc2xpY2UoMSk7XG5cdHN0eWxlc1tiZ01vZGVsXSA9IHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCB7bGV2ZWx9ID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoLi4uYXJndW1lbnRzXykge1xuXHRcdFx0XHRjb25zdCBzdHlsZXIgPSBjcmVhdGVTdHlsZXIoZ2V0TW9kZWxBbnNpKG1vZGVsLCBsZXZlbE1hcHBpbmdbbGV2ZWxdLCAnYmdDb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmJnQ29sb3IuY2xvc2UsIHRoaXNbU1RZTEVSXSk7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVCdWlsZGVyKHRoaXMsIHN0eWxlciwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXHR9O1xufVxuXG5jb25zdCBwcm90byA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCgpID0+IHt9LCB7XG5cdC4uLnN0eWxlcyxcblx0bGV2ZWw6IHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB0aGlzW0dFTkVSQVRPUl0ubGV2ZWw7XG5cdFx0fSxcblx0XHRzZXQobGV2ZWwpIHtcblx0XHRcdHRoaXNbR0VORVJBVE9SXS5sZXZlbCA9IGxldmVsO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgY3JlYXRlU3R5bGVyID0gKG9wZW4sIGNsb3NlLCBwYXJlbnQpID0+IHtcblx0bGV0IG9wZW5BbGw7XG5cdGxldCBjbG9zZUFsbDtcblx0aWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0b3BlbkFsbCA9IG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZTtcblx0fSBlbHNlIHtcblx0XHRvcGVuQWxsID0gcGFyZW50Lm9wZW5BbGwgKyBvcGVuO1xuXHRcdGNsb3NlQWxsID0gY2xvc2UgKyBwYXJlbnQuY2xvc2VBbGw7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wZW4sXG5cdFx0Y2xvc2UsXG5cdFx0b3BlbkFsbCxcblx0XHRjbG9zZUFsbCxcblx0XHRwYXJlbnQsXG5cdH07XG59O1xuXG5jb25zdCBjcmVhdGVCdWlsZGVyID0gKHNlbGYsIF9zdHlsZXIsIF9pc0VtcHR5KSA9PiB7XG5cdC8vIFNpbmdsZSBhcmd1bWVudCBpcyBob3QgcGF0aCwgaW1wbGljaXQgY29lcmNpb24gaXMgZmFzdGVyIHRoYW4gYW55dGhpbmdcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG5cdGNvbnN0IGJ1aWxkZXIgPSAoLi4uYXJndW1lbnRzXykgPT4gYXBwbHlTdHlsZShidWlsZGVyLCAoYXJndW1lbnRzXy5sZW5ndGggPT09IDEpID8gKCcnICsgYXJndW1lbnRzX1swXSkgOiBhcmd1bWVudHNfLmpvaW4oJyAnKSk7XG5cblx0Ly8gV2UgYWx0ZXIgdGhlIHByb3RvdHlwZSBiZWNhdXNlIHdlIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24sIGJ1dCB0aGVyZSBpc1xuXHQvLyBubyB3YXkgdG8gY3JlYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBwcm90b3R5cGVcblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1aWxkZXIsIHByb3RvKTtcblxuXHRidWlsZGVyW0dFTkVSQVRPUl0gPSBzZWxmO1xuXHRidWlsZGVyW1NUWUxFUl0gPSBfc3R5bGVyO1xuXHRidWlsZGVyW0lTX0VNUFRZXSA9IF9pc0VtcHR5O1xuXG5cdHJldHVybiBidWlsZGVyO1xufTtcblxuY29uc3QgYXBwbHlTdHlsZSA9IChzZWxmLCBzdHJpbmcpID0+IHtcblx0aWYgKHNlbGYubGV2ZWwgPD0gMCB8fCAhc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHNlbGZbSVNfRU1QVFldID8gJycgOiBzdHJpbmc7XG5cdH1cblxuXHRsZXQgc3R5bGVyID0gc2VsZltTVFlMRVJdO1xuXG5cdGlmIChzdHlsZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCB7b3BlbkFsbCwgY2xvc2VBbGx9ID0gc3R5bGVyO1xuXHRpZiAoc3RyaW5nLmluY2x1ZGVzKCdcXHUwMDFCJykpIHtcblx0XHR3aGlsZSAoc3R5bGVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuXHRcdFx0Ly8gb3RoZXJ3aXNlIG9ubHkgdGhlIHBhcnQgb2YgdGhlIHN0cmluZyB1bnRpbCBzYWlkIGNsb3NpbmcgY29kZVxuXHRcdFx0Ly8gd2lsbCBiZSBjb2xvcmVkLCBhbmQgdGhlIHJlc3Qgd2lsbCBzaW1wbHkgYmUgJ3BsYWluJy5cblx0XHRcdHN0cmluZyA9IHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdHlsZXIuY2xvc2UsIHN0eWxlci5vcGVuKTtcblxuXHRcdFx0c3R5bGVyID0gc3R5bGVyLnBhcmVudDtcblx0XHR9XG5cdH1cblxuXHQvLyBXZSBjYW4gbW92ZSBib3RoIG5leHQgYWN0aW9ucyBvdXQgb2YgbG9vcCwgYmVjYXVzZSByZW1haW5pbmcgYWN0aW9ucyBpbiBsb29wIHdvbid0IGhhdmVcblx0Ly8gYW55L3Zpc2libGUgZWZmZWN0IG9uIHBhcnRzIHdlIGFkZCBoZXJlLiBDbG9zZSB0aGUgc3R5bGluZyBiZWZvcmUgYSBsaW5lYnJlYWsgYW5kIHJlb3BlblxuXHQvLyBhZnRlciBuZXh0IGxpbmUgdG8gZml4IGEgYmxlZWQgaXNzdWUgb24gbWFjT1M6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFsay9jaGFsay9wdWxsLzkyXG5cdGNvbnN0IGxmSW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJyk7XG5cdGlmIChsZkluZGV4ICE9PSAtMSkge1xuXHRcdHN0cmluZyA9IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIGNsb3NlQWxsLCBvcGVuQWxsLCBsZkluZGV4KTtcblx0fVxuXG5cdHJldHVybiBvcGVuQWxsICsgc3RyaW5nICsgY2xvc2VBbGw7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhjcmVhdGVDaGFsay5wcm90b3R5cGUsIHN0eWxlcyk7XG5cbmNvbnN0IGNoYWxrID0gY3JlYXRlQ2hhbGsoKTtcbmV4cG9ydCBjb25zdCBjaGFsa1N0ZGVyciA9IGNyZWF0ZUNoYWxrKHtsZXZlbDogc3RkZXJyQ29sb3IgPyBzdGRlcnJDb2xvci5sZXZlbCA6IDB9KTtcblxuZXhwb3J0IHtcblx0bW9kaWZpZXJOYW1lcyxcblx0Zm9yZWdyb3VuZENvbG9yTmFtZXMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzLFxuXHRjb2xvck5hbWVzLFxuXG5cdC8vIFRPRE86IFJlbW92ZSB0aGVzZSBhbGlhc2VzIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cblx0bW9kaWZpZXJOYW1lcyBhcyBtb2RpZmllcnMsXG5cdGZvcmVncm91bmRDb2xvck5hbWVzIGFzIGZvcmVncm91bmRDb2xvcnMsXG5cdGJhY2tncm91bmRDb2xvck5hbWVzIGFzIGJhY2tncm91bmRDb2xvcnMsXG5cdGNvbG9yTmFtZXMgYXMgY29sb3JzLFxufSBmcm9tICcuL3ZlbmRvci9hbnNpLXN0eWxlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB7XG5cdHN0ZG91dENvbG9yIGFzIHN1cHBvcnRzQ29sb3IsXG5cdHN0ZGVyckNvbG9yIGFzIHN1cHBvcnRzQ29sb3JTdGRlcnIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjaGFsaztcbiIsICIndXNlIHN0cmljdCdcbi8qXG4gKiBtZXJnZTJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90ZWFtYml0aW9uL21lcmdlMlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIFRlYW1iaXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IFBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoXG5jb25zdCBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlMlxuXG5mdW5jdGlvbiBtZXJnZTIgKCkge1xuICBjb25zdCBzdHJlYW1zUXVldWUgPSBbXVxuICBjb25zdCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIGxldCBtZXJnaW5nID0gZmFsc2VcbiAgbGV0IG9wdGlvbnMgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cblxuICBpZiAob3B0aW9ucyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zKSAmJiBvcHRpb25zLnBpcGUgPT0gbnVsbCkge1xuICAgIGFyZ3MucG9wKClcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIGNvbnN0IGRvRW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlXG4gIGNvbnN0IGRvUGlwZUVycm9yID0gb3B0aW9ucy5waXBlRXJyb3IgPT09IHRydWVcbiAgaWYgKG9wdGlvbnMub2JqZWN0TW9kZSA9PSBudWxsKSB7XG4gICAgb3B0aW9ucy5vYmplY3RNb2RlID0gdHJ1ZVxuICB9XG4gIGlmIChvcHRpb25zLmhpZ2hXYXRlck1hcmsgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMuaGlnaFdhdGVyTWFyayA9IDY0ICogMTAyNFxuICB9XG4gIGNvbnN0IG1lcmdlZFN0cmVhbSA9IFBhc3NUaHJvdWdoKG9wdGlvbnMpXG5cbiAgZnVuY3Rpb24gYWRkU3RyZWFtICgpIHtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBzdHJlYW1zUXVldWUucHVzaChwYXVzZVN0cmVhbXMoYXJndW1lbnRzW2ldLCBvcHRpb25zKSlcbiAgICB9XG4gICAgbWVyZ2VTdHJlYW0oKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZVN0cmVhbSAoKSB7XG4gICAgaWYgKG1lcmdpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBtZXJnaW5nID0gdHJ1ZVxuXG4gICAgbGV0IHN0cmVhbXMgPSBzdHJlYW1zUXVldWUuc2hpZnQoKVxuICAgIGlmICghc3RyZWFtcykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRTdHJlYW0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmVhbXMpKSB7XG4gICAgICBzdHJlYW1zID0gW3N0cmVhbXNdXG4gICAgfVxuXG4gICAgbGV0IHBpcGVzQ291bnQgPSBzdHJlYW1zLmxlbmd0aCArIDFcblxuICAgIGZ1bmN0aW9uIG5leHQgKCkge1xuICAgICAgaWYgKC0tcGlwZXNDb3VudCA+IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBtZXJnaW5nID0gZmFsc2VcbiAgICAgIG1lcmdlU3RyZWFtKClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwaXBlIChzdHJlYW0pIHtcbiAgICAgIGZ1bmN0aW9uIG9uZW5kICgpIHtcbiAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdtZXJnZTJVbnBpcGVFbmQnLCBvbmVuZClcbiAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICAgICAgaWYgKGRvUGlwZUVycm9yKSB7XG4gICAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpXG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICAgICAgbWVyZ2VkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfVxuICAgICAgLy8gc2tpcCBlbmRlZCBzdHJlYW1cbiAgICAgIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5vbignbWVyZ2UyVW5waXBlRW5kJywgb25lbmQpXG4gICAgICBzdHJlYW0ub24oJ2VuZCcsIG9uZW5kKVxuXG4gICAgICBpZiAoZG9QaXBlRXJyb3IpIHtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5waXBlKG1lcmdlZFN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pXG4gICAgICAvLyBjb21wYXRpYmxlIGZvciBvbGQgc3RyZWFtXG4gICAgICBzdHJlYW0ucmVzdW1lKClcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmVhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBpcGUoc3RyZWFtc1tpXSlcbiAgICB9XG5cbiAgICBuZXh0KClcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZFN0cmVhbSAoKSB7XG4gICAgbWVyZ2luZyA9IGZhbHNlXG4gICAgLy8gZW1pdCAncXVldWVEcmFpbicgd2hlbiBhbGwgc3RyZWFtcyBtZXJnZWQuXG4gICAgbWVyZ2VkU3RyZWFtLmVtaXQoJ3F1ZXVlRHJhaW4nKVxuICAgIGlmIChkb0VuZCkge1xuICAgICAgbWVyZ2VkU3RyZWFtLmVuZCgpXG4gICAgfVxuICB9XG5cbiAgbWVyZ2VkU3RyZWFtLnNldE1heExpc3RlbmVycygwKVxuICBtZXJnZWRTdHJlYW0uYWRkID0gYWRkU3RyZWFtXG4gIG1lcmdlZFN0cmVhbS5vbigndW5waXBlJywgZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHN0cmVhbS5lbWl0KCdtZXJnZTJVbnBpcGVFbmQnKVxuICB9KVxuXG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIGFkZFN0cmVhbS5hcHBseShudWxsLCBhcmdzKVxuICB9XG4gIHJldHVybiBtZXJnZWRTdHJlYW1cbn1cblxuLy8gY2hlY2sgYW5kIHBhdXNlIHN0cmVhbXMgZm9yIHBpcGUuXG5mdW5jdGlvbiBwYXVzZVN0cmVhbXMgKHN0cmVhbXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmVhbXMpKSB7XG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG9sZC1zdHlsZSBzdHJlYW1zXG4gICAgaWYgKCFzdHJlYW1zLl9yZWFkYWJsZVN0YXRlICYmIHN0cmVhbXMucGlwZSkge1xuICAgICAgc3RyZWFtcyA9IHN0cmVhbXMucGlwZShQYXNzVGhyb3VnaChvcHRpb25zKSlcbiAgICB9XG4gICAgaWYgKCFzdHJlYW1zLl9yZWFkYWJsZVN0YXRlIHx8ICFzdHJlYW1zLnBhdXNlIHx8ICFzdHJlYW1zLnBpcGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSByZWFkYWJsZSBzdHJlYW0gY2FuIGJlIG1lcmdlZC4nKVxuICAgIH1cbiAgICBzdHJlYW1zLnBhdXNlKClcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyZWFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgc3RyZWFtc1tpXSA9IHBhdXNlU3RyZWFtcyhzdHJlYW1zW2ldLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyZWFtc1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zcGxpdFdoZW4gPSBleHBvcnRzLmZsYXR0ZW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBmbGF0dGVuKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoY29sbGVjdGlvbiwgaXRlbSkgPT4gW10uY29uY2F0KGNvbGxlY3Rpb24sIGl0ZW0pLCBbXSk7XG59XG5leHBvcnRzLmZsYXR0ZW4gPSBmbGF0dGVuO1xuZnVuY3Rpb24gc3BsaXRXaGVuKGl0ZW1zLCBwcmVkaWNhdGUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbW11dO1xuICAgIGxldCBncm91cEluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShpdGVtKSkge1xuICAgICAgICAgICAgZ3JvdXBJbmRleCsrO1xuICAgICAgICAgICAgcmVzdWx0W2dyb3VwSW5kZXhdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRbZ3JvdXBJbmRleF0ucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5zcGxpdFdoZW4gPSBzcGxpdFdoZW47XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzRW5vZW50Q29kZUVycm9yID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCc7XG59XG5leHBvcnRzLmlzRW5vZW50Q29kZUVycm9yID0gaXNFbm9lbnRDb2RlRXJyb3I7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IHZvaWQgMDtcbmNsYXNzIERpcmVudEZyb21TdGF0cyB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgc3RhdHMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pc0Jsb2NrRGV2aWNlID0gc3RhdHMuaXNCbG9ja0RldmljZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0NoYXJhY3RlckRldmljZSA9IHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRGlyZWN0b3J5ID0gc3RhdHMuaXNEaXJlY3RvcnkuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGSUZPID0gc3RhdHMuaXNGSUZPLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRmlsZSA9IHN0YXRzLmlzRmlsZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc1NvY2tldCA9IHN0YXRzLmlzU29ja2V0LmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU3ltYm9saWNMaW5rID0gc3RhdHMuaXNTeW1ib2xpY0xpbmsuYmluZChzdGF0cyk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKSB7XG4gICAgcmV0dXJuIG5ldyBEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpO1xufVxuZXhwb3J0cy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSBjcmVhdGVEaXJlbnRGcm9tU3RhdHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm4gPSBleHBvcnRzLmNvbnZlcnRXaW5kb3dzUGF0aFRvUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFBhdGhUb1BhdHRlcm4gPSBleHBvcnRzLmVzY2FwZVBvc2l4UGF0aCA9IGV4cG9ydHMuZXNjYXBlV2luZG93c1BhdGggPSBleHBvcnRzLmVzY2FwZSA9IGV4cG9ydHMucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQgPSBleHBvcnRzLm1ha2VBYnNvbHV0ZSA9IGV4cG9ydHMudW5peGlmeSA9IHZvaWQgMDtcbmNvbnN0IG9zID0gcmVxdWlyZShcIm9zXCIpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgSVNfV0lORE9XU19QTEFURk9STSA9IG9zLnBsYXRmb3JtKCkgPT09ICd3aW4zMic7XG5jb25zdCBMRUFESU5HX0RPVF9TRUdNRU5UX0NIQVJBQ1RFUlNfQ09VTlQgPSAyOyAvLyAuLyBvciAuXFxcXFxuLyoqXG4gKiBBbGwgbm9uLWVzY2FwZWQgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICogUG9zaXg6ICgpKj9bXXt8fSwgIStAIGJlZm9yZSAoLCAhIGF0IHRoZSBiZWdpbm5pbmcsIFxcXFwgYmVmb3JlIG5vbi1zcGVjaWFsIGNoYXJhY3RlcnMuXG4gKiBXaW5kb3dzOiAoKXt9W10sICErQCBiZWZvcmUgKCwgISBhdCB0aGUgYmVnaW5uaW5nLlxuICovXG5jb25zdCBQT1NJWF9VTkVTQ0FQRURfR0xPQl9TWU1CT0xTX1JFID0gLyhcXFxcPykoWygpKj9bXFxde3x9XXxeIXxbIStAXSg/PVxcKCl8XFxcXCg/IVshKCkqKz9AW1xcXXt8fV0pKS9nO1xuY29uc3QgV0lORE9XU19VTkVTQ0FQRURfR0xPQl9TWU1CT0xTX1JFID0gLyhcXFxcPykoWygpW1xcXXt9XXxeIXxbIStAXSg/PVxcKCkpL2c7XG4vKipcbiAqIFRoZSBkZXZpY2UgcGF0aCAoXFxcXC5cXCBvciBcXFxcP1xcKS5cbiAqIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvc3RhbmRhcmQvaW8vZmlsZS1wYXRoLWZvcm1hdHMjZG9zLWRldmljZS1wYXRoc1xuICovXG5jb25zdCBET1NfREVWSUNFX1BBVEhfUkUgPSAvXlxcXFxcXFxcKFsuP10pLztcbi8qKlxuICogQWxsIGJhY2tzbGFzaGVzIGV4Y2VwdCB0aG9zZSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gKiBXaW5kb3dzOiAhKCkrQHt9XG4gKiBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93aW4zMi9maWxlaW8vbmFtaW5nLWEtZmlsZSNuYW1pbmctY29udmVudGlvbnNcbiAqL1xuY29uc3QgV0lORE9XU19CQUNLU0xBU0hFU19SRSA9IC9cXFxcKD8hWyEoKStAW1xcXXt9XSkvZztcbi8qKlxuICogRGVzaWduZWQgdG8gd29yayBvbmx5IHdpdGggc2ltcGxlIHBhdGhzOiBgZGlyXFxcXGZpbGVgLlxuICovXG5mdW5jdGlvbiB1bml4aWZ5KGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGZpbGVwYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cbmV4cG9ydHMudW5peGlmeSA9IHVuaXhpZnk7XG5mdW5jdGlvbiBtYWtlQWJzb2x1dGUoY3dkLCBmaWxlcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUoY3dkLCBmaWxlcGF0aCk7XG59XG5leHBvcnRzLm1ha2VBYnNvbHV0ZSA9IG1ha2VBYnNvbHV0ZTtcbmZ1bmN0aW9uIHJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5KSB7XG4gICAgLy8gV2UgZG8gbm90IHVzZSBgc3RhcnRzV2l0aGAgYmVjYXVzZSB0aGlzIGlzIDEweCBzbG93ZXIgdGhhbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIGZvciBzb21lIGNhc2VzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXN0cmluZy1zdGFydHMtZW5kcy13aXRoXG4gICAgaWYgKGVudHJ5LmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZENoYXJhY3RlcnkgPSBlbnRyeS5jaGFyQXQoMSk7XG4gICAgICAgIGlmIChzZWNvbmRDaGFyYWN0ZXJ5ID09PSAnLycgfHwgc2Vjb25kQ2hhcmFjdGVyeSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkuc2xpY2UoTEVBRElOR19ET1RfU0VHTUVOVF9DSEFSQUNURVJTX0NPVU5UKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG59XG5leHBvcnRzLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50ID0gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQ7XG5leHBvcnRzLmVzY2FwZSA9IElTX1dJTkRPV1NfUExBVEZPUk0gPyBlc2NhcGVXaW5kb3dzUGF0aCA6IGVzY2FwZVBvc2l4UGF0aDtcbmZ1bmN0aW9uIGVzY2FwZVdpbmRvd3NQYXRoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKFdJTkRPV1NfVU5FU0NBUEVEX0dMT0JfU1lNQk9MU19SRSwgJ1xcXFwkMicpO1xufVxuZXhwb3J0cy5lc2NhcGVXaW5kb3dzUGF0aCA9IGVzY2FwZVdpbmRvd3NQYXRoO1xuZnVuY3Rpb24gZXNjYXBlUG9zaXhQYXRoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKFBPU0lYX1VORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUsICdcXFxcJDInKTtcbn1cbmV4cG9ydHMuZXNjYXBlUG9zaXhQYXRoID0gZXNjYXBlUG9zaXhQYXRoO1xuZXhwb3J0cy5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IElTX1dJTkRPV1NfUExBVEZPUk0gPyBjb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4gOiBjb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuO1xuZnVuY3Rpb24gY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuKGZpbGVwYXRoKSB7XG4gICAgcmV0dXJuIGVzY2FwZVdpbmRvd3NQYXRoKGZpbGVwYXRoKVxuICAgICAgICAucmVwbGFjZShET1NfREVWSUNFX1BBVEhfUkUsICcvLyQxJylcbiAgICAgICAgLnJlcGxhY2UoV0lORE9XU19CQUNLU0xBU0hFU19SRSwgJy8nKTtcbn1cbmV4cG9ydHMuY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuID0gY29udmVydFdpbmRvd3NQYXRoVG9QYXR0ZXJuO1xuZnVuY3Rpb24gY29udmVydFBvc2l4UGF0aFRvUGF0dGVybihmaWxlcGF0aCkge1xuICAgIHJldHVybiBlc2NhcGVQb3NpeFBhdGgoZmlsZXBhdGgpO1xufVxuZXhwb3J0cy5jb252ZXJ0UG9zaXhQYXRoVG9QYXR0ZXJuID0gY29udmVydFBvc2l4UGF0aFRvUGF0dGVybjtcbiIsICIvKiFcbiAqIGlzLWV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFeHRnbG9iKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBtYXRjaDtcbiAgd2hpbGUgKChtYXRjaCA9IC8oXFxcXCkufChbQD8hKypdXFwoLipcXCkpL2cuZXhlYyhzdHIpKSkge1xuICAgIGlmIChtYXRjaFsyXSkgcmV0dXJuIHRydWU7XG4gICAgc3RyID0gc3RyLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiBpcy1nbG9iIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1nbG9iPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG52YXIgaXNFeHRnbG9iID0gcmVxdWlyZSgnaXMtZXh0Z2xvYicpO1xudmFyIGNoYXJzID0geyAneyc6ICd9JywgJygnOiAnKScsICdbJzogJ10nfTtcbnZhciBzdHJpY3RDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcGlwZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZVNxdWFyZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZUN1cmx5SW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlUGFyZW5JbmRleCA9IC0yO1xuICB2YXIgYmFja1NsYXNoSW5kZXggPSAtMjtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIGlmIChzdHJbaW5kZXhdID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bXFxdLispXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICdbJyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ10nKSB7XG4gICAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIGNsb3NlU3F1YXJlSW5kZXggPSBzdHIuaW5kZXhPZignXScsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlU3F1YXJlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlQ3VybHlJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ3snICYmIHN0cltpbmRleCArIDFdICE9PSAnfScpIHtcbiAgICAgIGNsb3NlQ3VybHlJbmRleCA9IHN0ci5pbmRleE9mKCd9JywgaW5kZXgpO1xuICAgICAgaWYgKGNsb3NlQ3VybHlJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZUN1cmx5SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbG9zZVBhcmVuSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICcoJyAmJiBzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bOiE9XS8udGVzdChzdHJbaW5kZXggKyAyXSkgJiYgc3RyW2luZGV4ICsgM10gIT09ICcpJykge1xuICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdICE9PSAnfCcpIHtcbiAgICAgIGlmIChwaXBlSW5kZXggPCBpbmRleCkge1xuICAgICAgICBwaXBlSW5kZXggPSBzdHIuaW5kZXhPZignfCcsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChwaXBlSW5kZXggIT09IC0xICYmIHN0cltwaXBlSW5kZXggKyAxXSAhPT0gJyknKSB7XG4gICAgICAgIGNsb3NlUGFyZW5JbmRleCA9IHN0ci5pbmRleE9mKCcpJywgcGlwZUluZGV4KTtcbiAgICAgICAgaWYgKGNsb3NlUGFyZW5JbmRleCA+IHBpcGVJbmRleCkge1xuICAgICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBwaXBlSW5kZXgpO1xuICAgICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVBhcmVuSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJlbGF4ZWRDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKC9bKj97fSgpW1xcXV0vLnRlc3Qoc3RyW2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0dsb2Ioc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRXh0Z2xvYihzdHIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgY2hlY2sgPSBzdHJpY3RDaGVjaztcblxuICAvLyBvcHRpb25hbGx5IHJlbGF4IGNoZWNrXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ID09PSBmYWxzZSkge1xuICAgIGNoZWNrID0gcmVsYXhlZENoZWNrO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrKHN0cik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzR2xvYiA9IHJlcXVpcmUoJ2lzLWdsb2InKTtcbnZhciBwYXRoUG9zaXhEaXJuYW1lID0gcmVxdWlyZSgncGF0aCcpLnBvc2l4LmRpcm5hbWU7XG52YXIgaXNXaW4zMiA9IHJlcXVpcmUoJ29zJykucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcblxudmFyIHNsYXNoID0gJy8nO1xudmFyIGJhY2tzbGFzaCA9IC9cXFxcL2c7XG52YXIgZW5jbG9zdXJlID0gL1tcXHtcXFtdLipbXFx9XFxdXSQvO1xudmFyIGdsb2JieSA9IC8oXnxbXlxcXFxdKShbXFx7XFxbXXxcXChbXlxcKV0rJCkvO1xudmFyIGVzY2FwZWQgPSAvXFxcXChbXFwhXFwqXFw/XFx8XFxbXFxdXFwoXFwpXFx7XFx9XSkvZztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5mbGlwQmFja3NsYXNoZXM9dHJ1ZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2xvYlBhcmVudChzdHIsIG9wdHMpIHtcbiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgZmxpcEJhY2tzbGFzaGVzOiB0cnVlIH0sIG9wdHMpO1xuXG4gIC8vIGZsaXAgd2luZG93cyBwYXRoIHNlcGFyYXRvcnNcbiAgaWYgKG9wdGlvbnMuZmxpcEJhY2tzbGFzaGVzICYmIGlzV2luMzIgJiYgc3RyLmluZGV4T2Yoc2xhc2gpIDwgMCkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKGJhY2tzbGFzaCwgc2xhc2gpO1xuICB9XG5cbiAgLy8gc3BlY2lhbCBjYXNlIGZvciBzdHJpbmdzIGVuZGluZyBpbiBlbmNsb3N1cmUgY29udGFpbmluZyBwYXRoIHNlcGFyYXRvclxuICBpZiAoZW5jbG9zdXJlLnRlc3Qoc3RyKSkge1xuICAgIHN0ciArPSBzbGFzaDtcbiAgfVxuXG4gIC8vIHByZXNlcnZlcyBmdWxsIHBhdGggaW4gY2FzZSBvZiB0cmFpbGluZyBwYXRoIHNlcGFyYXRvclxuICBzdHIgKz0gJ2EnO1xuXG4gIC8vIHJlbW92ZSBwYXRoIHBhcnRzIHRoYXQgYXJlIGdsb2JieVxuICBkbyB7XG4gICAgc3RyID0gcGF0aFBvc2l4RGlybmFtZShzdHIpO1xuICB9IHdoaWxlIChpc0dsb2Ioc3RyKSB8fCBnbG9iYnkudGVzdChzdHIpKTtcblxuICAvLyByZW1vdmUgZXNjYXBlIGNoYXJzIGFuZCByZXR1cm4gcmVzdWx0XG4gIHJldHVybiBzdHIucmVwbGFjZShlc2NhcGVkLCAnJDEnKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmlzSW50ZWdlciA9IG51bSA9PiB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG51bSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoTnVtYmVyKG51bSkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRmluZCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAqL1xuXG5leHBvcnRzLmZpbmQgPSAobm9kZSwgdHlwZSkgPT4gbm9kZS5ub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS50eXBlID09PSB0eXBlKTtcblxuLyoqXG4gKiBGaW5kIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICovXG5cbmV4cG9ydHMuZXhjZWVkc0xpbWl0ID0gKG1pbiwgbWF4LCBzdGVwID0gMSwgbGltaXQpID0+IHtcbiAgaWYgKGxpbWl0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWV4cG9ydHMuaXNJbnRlZ2VyKG1pbikgfHwgIWV4cG9ydHMuaXNJbnRlZ2VyKG1heCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICgoTnVtYmVyKG1heCkgLSBOdW1iZXIobWluKSkgLyBOdW1iZXIoc3RlcCkpID49IGxpbWl0O1xufTtcblxuLyoqXG4gKiBFc2NhcGUgdGhlIGdpdmVuIG5vZGUgd2l0aCAnXFxcXCcgYmVmb3JlIG5vZGUudmFsdWVcbiAqL1xuXG5leHBvcnRzLmVzY2FwZU5vZGUgPSAoYmxvY2ssIG4gPSAwLCB0eXBlKSA9PiB7XG4gIGxldCBub2RlID0gYmxvY2subm9kZXNbbl07XG4gIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gIGlmICgodHlwZSAmJiBub2RlLnR5cGUgPT09IHR5cGUpIHx8IG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIGlmIChub2RlLmVzY2FwZWQgIT09IHRydWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSAnXFxcXCcgKyBub2RlLnZhbHVlO1xuICAgICAgbm9kZS5lc2NhcGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBicmFjZSBub2RlIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBsaXRlcmFsIGJyYWNlc1xuICovXG5cbmV4cG9ydHMuZW5jbG9zZUJyYWNlID0gbm9kZSA9PiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdicmFjZScpIHJldHVybiBmYWxzZTtcbiAgaWYgKChub2RlLmNvbW1hcyA+PiAwICsgbm9kZS5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBub2RlLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgYnJhY2Ugbm9kZSBpcyBpbnZhbGlkLlxuICovXG5cbmV4cG9ydHMuaXNJbnZhbGlkQnJhY2UgPSBibG9jayA9PiB7XG4gIGlmIChibG9jay50eXBlICE9PSAnYnJhY2UnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChibG9jay5pbnZhbGlkID09PSB0cnVlIHx8IGJsb2NrLmRvbGxhcikgcmV0dXJuIHRydWU7XG4gIGlmICgoYmxvY2suY29tbWFzID4+IDAgKyBibG9jay5yYW5nZXMgPj4gMCkgPT09IDApIHtcbiAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYmxvY2sub3BlbiAhPT0gdHJ1ZSB8fCBibG9jay5jbG9zZSAhPT0gdHJ1ZSkge1xuICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgbm9kZSBpcyBhbiBvcGVuIG9yIGNsb3NlIG5vZGVcbiAqL1xuXG5leHBvcnRzLmlzT3Blbk9yQ2xvc2UgPSBub2RlID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBub2RlLm9wZW4gPT09IHRydWUgfHwgbm9kZS5jbG9zZSA9PT0gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmVkdWNlIGFuIGFycmF5IG9mIHRleHQgbm9kZXMuXG4gKi9cblxuZXhwb3J0cy5yZWR1Y2UgPSBub2RlcyA9PiBub2Rlcy5yZWR1Y2UoKGFjYywgbm9kZSkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIGFjYy5wdXNoKG5vZGUudmFsdWUpO1xuICBpZiAobm9kZS50eXBlID09PSAncmFuZ2UnKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gIHJldHVybiBhY2M7XG59LCBbXSk7XG5cbi8qKlxuICogRmxhdHRlbiBhbiBhcnJheVxuICovXG5cbmV4cG9ydHMuZmxhdHRlbiA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBmbGF0ID0gYXJyID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGVsZSA9IGFycltpXTtcbiAgICAgIEFycmF5LmlzQXJyYXkoZWxlKSA/IGZsYXQoZWxlLCByZXN1bHQpIDogZWxlICE9PSB2b2lkIDAgJiYgcmVzdWx0LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgZmxhdChhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHN0cmluZ2lmeSA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIGxldCBpbnZhbGlkQmxvY2sgPSBvcHRpb25zLmVzY2FwZUludmFsaWQgJiYgdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICBpZiAoKGludmFsaWRCbG9jayB8fCBpbnZhbGlkTm9kZSkgJiYgdXRpbHMuaXNPcGVuT3JDbG9zZShub2RlKSkge1xuICAgICAgICByZXR1cm4gJ1xcXFwnICsgbm9kZS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gc3RyaW5naWZ5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gc3RyaW5naWZ5KGFzdCk7XG59O1xuXG4iLCAiLyohXG4gKiBpcy1udW1iZXIgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLW51bWJlcj5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG51bSkge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbnVtIC0gbnVtID09PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0udHJpbSgpICE9PSAnJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUgPyBOdW1iZXIuaXNGaW5pdGUoK251bSkgOiBpc0Zpbml0ZSgrbnVtKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwgIi8qIVxuICogdG8tcmVnZXgtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb21hdGNoL3RvLXJlZ2V4LXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTnVtYmVyID0gcmVxdWlyZSgnaXMtbnVtYmVyJyk7XG5cbmNvbnN0IHRvUmVnZXhSYW5nZSA9IChtaW4sIG1heCwgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXIobWluKSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG1heCA9PT0gdm9pZCAwIHx8IG1pbiA9PT0gbWF4KSB7XG4gICAgcmV0dXJuIFN0cmluZyhtaW4pO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKG1heCkgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9SZWdleFJhbmdlOiBleHBlY3RlZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgbnVtYmVyLicpO1xuICB9XG5cbiAgbGV0IG9wdHMgPSB7IHJlbGF4WmVyb3M6IHRydWUsIC4uLm9wdGlvbnMgfTtcbiAgaWYgKHR5cGVvZiBvcHRzLnN0cmljdFplcm9zID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLnJlbGF4WmVyb3MgPSBvcHRzLnN0cmljdFplcm9zID09PSBmYWxzZTtcbiAgfVxuXG4gIGxldCByZWxheCA9IFN0cmluZyhvcHRzLnJlbGF4WmVyb3MpO1xuICBsZXQgc2hvcnRoYW5kID0gU3RyaW5nKG9wdHMuc2hvcnRoYW5kKTtcbiAgbGV0IGNhcHR1cmUgPSBTdHJpbmcob3B0cy5jYXB0dXJlKTtcbiAgbGV0IHdyYXAgPSBTdHJpbmcob3B0cy53cmFwKTtcbiAgbGV0IGNhY2hlS2V5ID0gbWluICsgJzonICsgbWF4ICsgJz0nICsgcmVsYXggKyBzaG9ydGhhbmQgKyBjYXB0dXJlICsgd3JhcDtcblxuICBpZiAodG9SZWdleFJhbmdlLmNhY2hlLmhhc093blByb3BlcnR5KGNhY2hlS2V5KSkge1xuICAgIHJldHVybiB0b1JlZ2V4UmFuZ2UuY2FjaGVbY2FjaGVLZXldLnJlc3VsdDtcbiAgfVxuXG4gIGxldCBhID0gTWF0aC5taW4obWluLCBtYXgpO1xuICBsZXQgYiA9IE1hdGgubWF4KG1pbiwgbWF4KTtcblxuICBpZiAoTWF0aC5hYnMoYSAtIGIpID09PSAxKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1pbiArICd8JyArIG1heDtcbiAgICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgICByZXR1cm4gYCgke3Jlc3VsdH0pYDtcbiAgICB9XG4gICAgaWYgKG9wdHMud3JhcCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBgKD86JHtyZXN1bHR9KWA7XG4gIH1cblxuICBsZXQgaXNQYWRkZWQgPSBoYXNQYWRkaW5nKG1pbikgfHwgaGFzUGFkZGluZyhtYXgpO1xuICBsZXQgc3RhdGUgPSB7IG1pbiwgbWF4LCBhLCBiIH07XG4gIGxldCBwb3NpdGl2ZXMgPSBbXTtcbiAgbGV0IG5lZ2F0aXZlcyA9IFtdO1xuXG4gIGlmIChpc1BhZGRlZCkge1xuICAgIHN0YXRlLmlzUGFkZGVkID0gaXNQYWRkZWQ7XG4gICAgc3RhdGUubWF4TGVuID0gU3RyaW5nKHN0YXRlLm1heCkubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGEgPCAwKSB7XG4gICAgbGV0IG5ld01pbiA9IGIgPCAwID8gTWF0aC5hYnMoYikgOiAxO1xuICAgIG5lZ2F0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhuZXdNaW4sIE1hdGguYWJzKGEpLCBzdGF0ZSwgb3B0cyk7XG4gICAgYSA9IHN0YXRlLmEgPSAwO1xuICB9XG5cbiAgaWYgKGIgPj0gMCkge1xuICAgIHBvc2l0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhhLCBiLCBzdGF0ZSwgb3B0cyk7XG4gIH1cblxuICBzdGF0ZS5uZWdhdGl2ZXMgPSBuZWdhdGl2ZXM7XG4gIHN0YXRlLnBvc2l0aXZlcyA9IHBvc2l0aXZlcztcbiAgc3RhdGUucmVzdWx0ID0gY29sbGF0ZVBhdHRlcm5zKG5lZ2F0aXZlcywgcG9zaXRpdmVzLCBvcHRzKTtcblxuICBpZiAob3B0cy5jYXB0dXJlID09PSB0cnVlKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCgke3N0YXRlLnJlc3VsdH0pYDtcbiAgfSBlbHNlIGlmIChvcHRzLndyYXAgIT09IGZhbHNlICYmIChwb3NpdGl2ZXMubGVuZ3RoICsgbmVnYXRpdmVzLmxlbmd0aCkgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCg/OiR7c3RhdGUucmVzdWx0fSlgO1xuICB9XG5cbiAgdG9SZWdleFJhbmdlLmNhY2hlW2NhY2hlS2V5XSA9IHN0YXRlO1xuICByZXR1cm4gc3RhdGUucmVzdWx0O1xufTtcblxuZnVuY3Rpb24gY29sbGF0ZVBhdHRlcm5zKG5lZywgcG9zLCBvcHRpb25zKSB7XG4gIGxldCBvbmx5TmVnYXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhuZWcsIHBvcywgJy0nLCBmYWxzZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBvbmx5UG9zaXRpdmUgPSBmaWx0ZXJQYXR0ZXJucyhwb3MsIG5lZywgJycsIGZhbHNlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IGludGVyc2VjdGVkID0gZmlsdGVyUGF0dGVybnMobmVnLCBwb3MsICctPycsIHRydWUsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgc3VicGF0dGVybnMgPSBvbmx5TmVnYXRpdmUuY29uY2F0KGludGVyc2VjdGVkKS5jb25jYXQob25seVBvc2l0aXZlKTtcbiAgcmV0dXJuIHN1YnBhdHRlcm5zLmpvaW4oJ3wnKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1JhbmdlcyhtaW4sIG1heCkge1xuICBsZXQgbmluZXMgPSAxO1xuICBsZXQgemVyb3MgPSAxO1xuXG4gIGxldCBzdG9wID0gY291bnROaW5lcyhtaW4sIG5pbmVzKTtcbiAgbGV0IHN0b3BzID0gbmV3IFNldChbbWF4XSk7XG5cbiAgd2hpbGUgKG1pbiA8PSBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIG5pbmVzICs9IDE7XG4gICAgc3RvcCA9IGNvdW50TmluZXMobWluLCBuaW5lcyk7XG4gIH1cblxuICBzdG9wID0gY291bnRaZXJvcyhtYXggKyAxLCB6ZXJvcykgLSAxO1xuXG4gIHdoaWxlIChtaW4gPCBzdG9wICYmIHN0b3AgPD0gbWF4KSB7XG4gICAgc3RvcHMuYWRkKHN0b3ApO1xuICAgIHplcm9zICs9IDE7XG4gICAgc3RvcCA9IGNvdW50WmVyb3MobWF4ICsgMSwgemVyb3MpIC0gMTtcbiAgfVxuXG4gIHN0b3BzID0gWy4uLnN0b3BzXTtcbiAgc3RvcHMuc29ydChjb21wYXJlKTtcbiAgcmV0dXJuIHN0b3BzO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSByYW5nZSB0byBhIHJlZ2V4IHBhdHRlcm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBgc3RhcnRgXG4gKiBAcGFyYW0ge051bWJlcn0gYHN0b3BgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gcmFuZ2VUb1BhdHRlcm4oc3RhcnQsIHN0b3AsIG9wdGlvbnMpIHtcbiAgaWYgKHN0YXJ0ID09PSBzdG9wKSB7XG4gICAgcmV0dXJuIHsgcGF0dGVybjogc3RhcnQsIGNvdW50OiBbXSwgZGlnaXRzOiAwIH07XG4gIH1cblxuICBsZXQgemlwcGVkID0gemlwKHN0YXJ0LCBzdG9wKTtcbiAgbGV0IGRpZ2l0cyA9IHppcHBlZC5sZW5ndGg7XG4gIGxldCBwYXR0ZXJuID0gJyc7XG4gIGxldCBjb3VudCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWdpdHM7IGkrKykge1xuICAgIGxldCBbc3RhcnREaWdpdCwgc3RvcERpZ2l0XSA9IHppcHBlZFtpXTtcblxuICAgIGlmIChzdGFydERpZ2l0ID09PSBzdG9wRGlnaXQpIHtcbiAgICAgIHBhdHRlcm4gKz0gc3RhcnREaWdpdDtcblxuICAgIH0gZWxzZSBpZiAoc3RhcnREaWdpdCAhPT0gJzAnIHx8IHN0b3BEaWdpdCAhPT0gJzknKSB7XG4gICAgICBwYXR0ZXJuICs9IHRvQ2hhcmFjdGVyQ2xhc3Moc3RhcnREaWdpdCwgc3RvcERpZ2l0LCBvcHRpb25zKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb3VudCkge1xuICAgIHBhdHRlcm4gKz0gb3B0aW9ucy5zaG9ydGhhbmQgPT09IHRydWUgPyAnXFxcXGQnIDogJ1swLTldJztcbiAgfVxuXG4gIHJldHVybiB7IHBhdHRlcm4sIGNvdW50OiBbY291bnRdLCBkaWdpdHMgfTtcbn1cblxuZnVuY3Rpb24gc3BsaXRUb1BhdHRlcm5zKG1pbiwgbWF4LCB0b2ssIG9wdGlvbnMpIHtcbiAgbGV0IHJhbmdlcyA9IHNwbGl0VG9SYW5nZXMobWluLCBtYXgpO1xuICBsZXQgdG9rZW5zID0gW107XG4gIGxldCBzdGFydCA9IG1pbjtcbiAgbGV0IHByZXY7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbWF4ID0gcmFuZ2VzW2ldO1xuICAgIGxldCBvYmogPSByYW5nZVRvUGF0dGVybihTdHJpbmcoc3RhcnQpLCBTdHJpbmcobWF4KSwgb3B0aW9ucyk7XG4gICAgbGV0IHplcm9zID0gJyc7XG5cbiAgICBpZiAoIXRvay5pc1BhZGRlZCAmJiBwcmV2ICYmIHByZXYucGF0dGVybiA9PT0gb2JqLnBhdHRlcm4pIHtcbiAgICAgIGlmIChwcmV2LmNvdW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcHJldi5jb3VudC5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgcHJldi5jb3VudC5wdXNoKG9iai5jb3VudFswXSk7XG4gICAgICBwcmV2LnN0cmluZyA9IHByZXYucGF0dGVybiArIHRvUXVhbnRpZmllcihwcmV2LmNvdW50KTtcbiAgICAgIHN0YXJ0ID0gbWF4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0b2suaXNQYWRkZWQpIHtcbiAgICAgIHplcm9zID0gcGFkWmVyb3MobWF4LCB0b2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIG9iai5zdHJpbmcgPSB6ZXJvcyArIG9iai5wYXR0ZXJuICsgdG9RdWFudGlmaWVyKG9iai5jb3VudCk7XG4gICAgdG9rZW5zLnB1c2gob2JqKTtcbiAgICBzdGFydCA9IG1heCArIDE7XG4gICAgcHJldiA9IG9iajtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclBhdHRlcm5zKGFyciwgY29tcGFyaXNvbiwgcHJlZml4LCBpbnRlcnNlY3Rpb24sIG9wdGlvbnMpIHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGVsZSBvZiBhcnIpIHtcbiAgICBsZXQgeyBzdHJpbmcgfSA9IGVsZTtcblxuICAgIC8vIG9ubHkgcHVzaCBpZiBfYm90aF8gYXJlIG5lZ2F0aXZlLi4uXG4gICAgaWYgKCFpbnRlcnNlY3Rpb24gJiYgIWNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8vIG9yIF9ib3RoXyBhcmUgcG9zaXRpdmVcbiAgICBpZiAoaW50ZXJzZWN0aW9uICYmIGNvbnRhaW5zKGNvbXBhcmlzb24sICdzdHJpbmcnLCBzdHJpbmcpKSB7XG4gICAgICByZXN1bHQucHVzaChwcmVmaXggKyBzdHJpbmcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFppcCBzdHJpbmdzXG4gKi9cblxuZnVuY3Rpb24gemlwKGEsIGIpIHtcbiAgbGV0IGFyciA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIGFyci5wdXNoKFthW2ldLCBiW2ldXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYSA+IGIgPyAxIDogYiA+IGEgPyAtMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGFyciwga2V5LCB2YWwpIHtcbiAgcmV0dXJuIGFyci5zb21lKGVsZSA9PiBlbGVba2V5XSA9PT0gdmFsKTtcbn1cblxuZnVuY3Rpb24gY291bnROaW5lcyhtaW4sIGxlbikge1xuICByZXR1cm4gTnVtYmVyKFN0cmluZyhtaW4pLnNsaWNlKDAsIC1sZW4pICsgJzknLnJlcGVhdChsZW4pKTtcbn1cblxuZnVuY3Rpb24gY291bnRaZXJvcyhpbnRlZ2VyLCB6ZXJvcykge1xuICByZXR1cm4gaW50ZWdlciAtIChpbnRlZ2VyICUgTWF0aC5wb3coMTAsIHplcm9zKSk7XG59XG5cbmZ1bmN0aW9uIHRvUXVhbnRpZmllcihkaWdpdHMpIHtcbiAgbGV0IFtzdGFydCA9IDAsIHN0b3AgPSAnJ10gPSBkaWdpdHM7XG4gIGlmIChzdG9wIHx8IHN0YXJ0ID4gMSkge1xuICAgIHJldHVybiBgeyR7c3RhcnQgKyAoc3RvcCA/ICcsJyArIHN0b3AgOiAnJyl9fWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiB0b0NoYXJhY3RlckNsYXNzKGEsIGIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGBbJHthfSR7KGIgLSBhID09PSAxKSA/ICcnIDogJy0nfSR7Yn1dYDtcbn1cblxuZnVuY3Rpb24gaGFzUGFkZGluZyhzdHIpIHtcbiAgcmV0dXJuIC9eLT8oMCspXFxkLy50ZXN0KHN0cik7XG59XG5cbmZ1bmN0aW9uIHBhZFplcm9zKHZhbHVlLCB0b2ssIG9wdGlvbnMpIHtcbiAgaWYgKCF0b2suaXNQYWRkZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgZGlmZiA9IE1hdGguYWJzKHRvay5tYXhMZW4gLSBTdHJpbmcodmFsdWUpLmxlbmd0aCk7XG4gIGxldCByZWxheCA9IG9wdGlvbnMucmVsYXhaZXJvcyAhPT0gZmFsc2U7XG5cbiAgc3dpdGNoIChkaWZmKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICcnO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiByZWxheCA/ICcwPycgOiAnMCc7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHJlbGF4ID8gJzB7MCwyfScgOiAnMDAnO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZWxheCA/IGAwezAsJHtkaWZmfX1gIDogYDB7JHtkaWZmfX1gO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhY2hlXG4gKi9cblxudG9SZWdleFJhbmdlLmNhY2hlID0ge307XG50b1JlZ2V4UmFuZ2UuY2xlYXJDYWNoZSA9ICgpID0+ICh0b1JlZ2V4UmFuZ2UuY2FjaGUgPSB7fSk7XG5cbi8qKlxuICogRXhwb3NlIGB0b1JlZ2V4UmFuZ2VgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB0b1JlZ2V4UmFuZ2U7XG4iLCAiLyohXG4gKiBmaWxsLXJhbmdlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9maWxsLXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCB0b1JlZ2V4UmFuZ2UgPSByZXF1aXJlKCd0by1yZWdleC1yYW5nZScpO1xuXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuY29uc3QgdHJhbnNmb3JtID0gdG9OdW1iZXIgPT4ge1xuICByZXR1cm4gdmFsdWUgPT4gdG9OdW1iZXIgPT09IHRydWUgPyBOdW1iZXIodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmNvbnN0IGlzVmFsaWRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnKTtcbn07XG5cbmNvbnN0IGlzTnVtYmVyID0gbnVtID0+IE51bWJlci5pc0ludGVnZXIoK251bSk7XG5cbmNvbnN0IHplcm9zID0gaW5wdXQgPT4ge1xuICBsZXQgdmFsdWUgPSBgJHtpbnB1dH1gO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlWzBdID09PSAnLScpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gZmFsc2U7XG4gIHdoaWxlICh2YWx1ZVsrK2luZGV4XSA9PT0gJzAnKTtcbiAgcmV0dXJuIGluZGV4ID4gMDtcbn07XG5cbmNvbnN0IHN0cmluZ2lmeSA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3RyaW5naWZ5ID09PSB0cnVlO1xufTtcblxuY29uc3QgcGFkID0gKGlucHV0LCBtYXhMZW5ndGgsIHRvTnVtYmVyKSA9PiB7XG4gIGlmIChtYXhMZW5ndGggPiAwKSB7XG4gICAgbGV0IGRhc2ggPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gICAgaWYgKGRhc2gpIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgaW5wdXQgPSAoZGFzaCArIGlucHV0LnBhZFN0YXJ0KGRhc2ggPyBtYXhMZW5ndGggLSAxIDogbWF4TGVuZ3RoLCAnMCcpKTtcbiAgfVxuICBpZiAodG9OdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFN0cmluZyhpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufTtcblxuY29uc3QgdG9NYXhMZW4gPSAoaW5wdXQsIG1heExlbmd0aCkgPT4ge1xuICBsZXQgbmVnYXRpdmUgPSBpbnB1dFswXSA9PT0gJy0nID8gJy0nIDogJyc7XG4gIGlmIChuZWdhdGl2ZSkge1xuICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgbWF4TGVuZ3RoLS07XG4gIH1cbiAgd2hpbGUgKGlucHV0Lmxlbmd0aCA8IG1heExlbmd0aCkgaW5wdXQgPSAnMCcgKyBpbnB1dDtcbiAgcmV0dXJuIG5lZ2F0aXZlID8gKCctJyArIGlucHV0KSA6IGlucHV0O1xufTtcblxuY29uc3QgdG9TZXF1ZW5jZSA9IChwYXJ0cywgb3B0aW9ucykgPT4ge1xuICBwYXJ0cy5uZWdhdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuICBwYXJ0cy5wb3NpdGl2ZXMuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApO1xuXG4gIGxldCBwcmVmaXggPSBvcHRpb25zLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGxldCBwb3NpdGl2ZXMgPSAnJztcbiAgbGV0IG5lZ2F0aXZlcyA9ICcnO1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmIChwYXJ0cy5wb3NpdGl2ZXMubGVuZ3RoKSB7XG4gICAgcG9zaXRpdmVzID0gcGFydHMucG9zaXRpdmVzLmpvaW4oJ3wnKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5uZWdhdGl2ZXMubGVuZ3RoKSB7XG4gICAgbmVnYXRpdmVzID0gYC0oJHtwcmVmaXh9JHtwYXJ0cy5uZWdhdGl2ZXMuam9pbignfCcpfSlgO1xuICB9XG5cbiAgaWYgKHBvc2l0aXZlcyAmJiBuZWdhdGl2ZXMpIHtcbiAgICByZXN1bHQgPSBgJHtwb3NpdGl2ZXN9fCR7bmVnYXRpdmVzfWA7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gcG9zaXRpdmVzIHx8IG5lZ2F0aXZlcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLndyYXApIHtcbiAgICByZXR1cm4gYCgke3ByZWZpeH0ke3Jlc3VsdH0pYDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0b1JhbmdlID0gKGEsIGIsIGlzTnVtYmVycywgb3B0aW9ucykgPT4ge1xuICBpZiAoaXNOdW1iZXJzKSB7XG4gICAgcmV0dXJuIHRvUmVnZXhSYW5nZShhLCBiLCB7IHdyYXA6IGZhbHNlLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgbGV0IHN0YXJ0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtcbiAgaWYgKGEgPT09IGIpIHJldHVybiBzdGFydDtcblxuICBsZXQgc3RvcCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYik7XG4gIHJldHVybiBgWyR7c3RhcnR9LSR7c3RvcH1dYDtcbn07XG5cbmNvbnN0IHRvUmVnZXggPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShzdGFydCkpIHtcbiAgICBsZXQgd3JhcCA9IG9wdGlvbnMud3JhcCA9PT0gdHJ1ZTtcbiAgICBsZXQgcHJlZml4ID0gb3B0aW9ucy5jYXB0dXJlID8gJycgOiAnPzonO1xuICAgIHJldHVybiB3cmFwID8gYCgke3ByZWZpeH0ke3N0YXJ0LmpvaW4oJ3wnKX0pYCA6IHN0YXJ0LmpvaW4oJ3wnKTtcbiAgfVxuICByZXR1cm4gdG9SZWdleFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xufTtcblxuY29uc3QgcmFuZ2VFcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCByYW5nZSBhcmd1bWVudHM6ICcgKyB1dGlsLmluc3BlY3QoLi4uYXJncykpO1xufTtcblxuY29uc3QgaW52YWxpZFJhbmdlID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB0aHJvdyByYW5nZUVycm9yKFtzdGFydCwgZW5kXSk7XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGludmFsaWRTdGVwID0gKHN0ZXAsIG9wdGlvbnMpID0+IHtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0UmFuZ2VzID09PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgc3RlcCBcIiR7c3RlcH1cIiB0byBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiBbXTtcbn07XG5cbmNvbnN0IGZpbGxOdW1iZXJzID0gKHN0YXJ0LCBlbmQsIHN0ZXAgPSAxLCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IGEgPSBOdW1iZXIoc3RhcnQpO1xuICBsZXQgYiA9IE51bWJlcihlbmQpO1xuXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihiKSkge1xuICAgIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkgdGhyb3cgcmFuZ2VFcnJvcihbc3RhcnQsIGVuZF0pO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIGZpeCBuZWdhdGl2ZSB6ZXJvXG4gIGlmIChhID09PSAwKSBhID0gMDtcbiAgaWYgKGIgPT09IDApIGIgPSAwO1xuXG4gIGxldCBkZXNjZW5kaW5nID0gYSA+IGI7XG4gIGxldCBzdGFydFN0cmluZyA9IFN0cmluZyhzdGFydCk7XG4gIGxldCBlbmRTdHJpbmcgPSBTdHJpbmcoZW5kKTtcbiAgbGV0IHN0ZXBTdHJpbmcgPSBTdHJpbmcoc3RlcCk7XG4gIHN0ZXAgPSBNYXRoLm1heChNYXRoLmFicyhzdGVwKSwgMSk7XG5cbiAgbGV0IHBhZGRlZCA9IHplcm9zKHN0YXJ0U3RyaW5nKSB8fCB6ZXJvcyhlbmRTdHJpbmcpIHx8IHplcm9zKHN0ZXBTdHJpbmcpO1xuICBsZXQgbWF4TGVuID0gcGFkZGVkID8gTWF0aC5tYXgoc3RhcnRTdHJpbmcubGVuZ3RoLCBlbmRTdHJpbmcubGVuZ3RoLCBzdGVwU3RyaW5nLmxlbmd0aCkgOiAwO1xuICBsZXQgdG9OdW1iZXIgPSBwYWRkZWQgPT09IGZhbHNlICYmIHN0cmluZ2lmeShzdGFydCwgZW5kLCBvcHRpb25zKSA9PT0gZmFsc2U7XG4gIGxldCBmb3JtYXQgPSBvcHRpb25zLnRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0odG9OdW1iZXIpO1xuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggJiYgc3RlcCA9PT0gMSkge1xuICAgIHJldHVybiB0b1JhbmdlKHRvTWF4TGVuKHN0YXJ0LCBtYXhMZW4pLCB0b01heExlbihlbmQsIG1heExlbiksIHRydWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHBhcnRzID0geyBuZWdhdGl2ZXM6IFtdLCBwb3NpdGl2ZXM6IFtdIH07XG4gIGxldCBwdXNoID0gbnVtID0+IHBhcnRzW251bSA8IDAgPyAnbmVnYXRpdmVzJyA6ICdwb3NpdGl2ZXMnXS5wdXNoKE1hdGguYWJzKG51bSkpO1xuICBsZXQgcmFuZ2UgPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoZGVzY2VuZGluZyA/IGEgPj0gYiA6IGEgPD0gYikge1xuICAgIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUgJiYgc3RlcCA+IDEpIHtcbiAgICAgIHB1c2goYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnB1c2gocGFkKGZvcm1hdChhLCBpbmRleCksIG1heExlbiwgdG9OdW1iZXIpKTtcbiAgICB9XG4gICAgYSA9IGRlc2NlbmRpbmcgPyBhIC0gc3RlcCA6IGEgKyBzdGVwO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHN0ZXAgPiAxXG4gICAgICA/IHRvU2VxdWVuY2UocGFydHMsIG9wdGlvbnMpXG4gICAgICA6IHRvUmVnZXgocmFuZ2UsIG51bGwsIHsgd3JhcDogZmFsc2UsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59O1xuXG5jb25zdCBmaWxsTGV0dGVycyA9IChzdGFydCwgZW5kLCBzdGVwID0gMSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICgoIWlzTnVtYmVyKHN0YXJ0KSAmJiBzdGFydC5sZW5ndGggPiAxKSB8fCAoIWlzTnVtYmVyKGVuZCkgJiYgZW5kLmxlbmd0aCA+IDEpKSB7XG4gICAgcmV0dXJuIGludmFsaWRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbiAgfVxuXG5cbiAgbGV0IGZvcm1hdCA9IG9wdGlvbnMudHJhbnNmb3JtIHx8ICh2YWwgPT4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWwpKTtcbiAgbGV0IGEgPSBgJHtzdGFydH1gLmNoYXJDb2RlQXQoMCk7XG4gIGxldCBiID0gYCR7ZW5kfWAuY2hhckNvZGVBdCgwKTtcblxuICBsZXQgZGVzY2VuZGluZyA9IGEgPiBiO1xuICBsZXQgbWluID0gTWF0aC5taW4oYSwgYik7XG4gIGxldCBtYXggPSBNYXRoLm1heChhLCBiKTtcblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ICYmIHN0ZXAgPT09IDEpIHtcbiAgICByZXR1cm4gdG9SYW5nZShtaW4sIG1heCwgZmFsc2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHJhbmdlID0gW107XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGRlc2NlbmRpbmcgPyBhID49IGIgOiBhIDw9IGIpIHtcbiAgICByYW5nZS5wdXNoKGZvcm1hdChhLCBpbmRleCkpO1xuICAgIGEgPSBkZXNjZW5kaW5nID8gYSAtIHN0ZXAgOiBhICsgc3RlcDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0b1JlZ2V4KHJhbmdlLCBudWxsLCB7IHdyYXA6IGZhbHNlLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufTtcblxuY29uc3QgZmlsbCA9IChzdGFydCwgZW5kLCBzdGVwLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKGVuZCA9PSBudWxsICYmIGlzVmFsaWRWYWx1ZShzdGFydCkpIHtcbiAgICByZXR1cm4gW3N0YXJ0XTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZFZhbHVlKHN0YXJ0KSB8fCAhaXNWYWxpZFZhbHVlKGVuZCkpIHtcbiAgICByZXR1cm4gaW52YWxpZFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMSwgeyB0cmFuc2Zvcm06IHN0ZXAgfSk7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc3RlcCkpIHtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAwLCBzdGVwKTtcbiAgfVxuXG4gIGxldCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGlmIChvcHRzLmNhcHR1cmUgPT09IHRydWUpIG9wdHMud3JhcCA9IHRydWU7XG4gIHN0ZXAgPSBzdGVwIHx8IG9wdHMuc3RlcCB8fCAxO1xuXG4gIGlmICghaXNOdW1iZXIoc3RlcCkpIHtcbiAgICBpZiAoc3RlcCAhPSBudWxsICYmICFpc09iamVjdChzdGVwKSkgcmV0dXJuIGludmFsaWRTdGVwKHN0ZXAsIG9wdHMpO1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDEsIHN0ZXApO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKHN0YXJ0KSAmJiBpc051bWJlcihlbmQpKSB7XG4gICAgcmV0dXJuIGZpbGxOdW1iZXJzKHN0YXJ0LCBlbmQsIHN0ZXAsIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGxMZXR0ZXJzKHN0YXJ0LCBlbmQsIE1hdGgubWF4KE1hdGguYWJzKHN0ZXApLCAxKSwgb3B0cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbGw7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmaWxsID0gcmVxdWlyZSgnZmlsbC1yYW5nZScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGNvbXBpbGUgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHdhbGsgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBsZXQgaW52YWxpZEJsb2NrID0gdXRpbHMuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBpbnZhbGlkID0gaW52YWxpZEJsb2NrID09PSB0cnVlIHx8IGludmFsaWROb2RlID09PSB0cnVlO1xuICAgIGxldCBwcmVmaXggPSBvcHRpb25zLmVzY2FwZUludmFsaWQgPT09IHRydWUgPyAnXFxcXCcgOiAnJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBpZiAobm9kZS5pc09wZW4gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwcmVmaXggKyBub2RlLnZhbHVlO1xuICAgIH1cbiAgICBpZiAobm9kZS5pc0Nsb3NlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnb3BlbicpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJygnO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkID8gKHByZWZpeCArIG5vZGUudmFsdWUpIDogJyknO1xuICAgIH1cblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdjb21tYScpIHtcbiAgICAgIHJldHVybiBub2RlLnByZXYudHlwZSA9PT0gJ2NvbW1hJyA/ICcnIDogKGludmFsaWQgPyBub2RlLnZhbHVlIDogJ3wnKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMgJiYgbm9kZS5yYW5nZXMgPiAwKSB7XG4gICAgICBsZXQgYXJncyA9IHV0aWxzLnJlZHVjZShub2RlLm5vZGVzKTtcbiAgICAgIGxldCByYW5nZSA9IGZpbGwoLi4uYXJncywgeyAuLi5vcHRpb25zLCB3cmFwOiBmYWxzZSwgdG9SZWdleDogdHJ1ZSB9KTtcblxuICAgICAgaWYgKHJhbmdlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPiAxICYmIHJhbmdlLmxlbmd0aCA+IDEgPyBgKCR7cmFuZ2V9KWAgOiByYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2Rlcykge1xuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5ub2Rlcykge1xuICAgICAgICBvdXRwdXQgKz0gd2FsayhjaGlsZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHdhbGsoYXN0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGlsZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZpbGwgPSByZXF1aXJlKCdmaWxsLXJhbmdlJyk7XG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmNvbnN0IGFwcGVuZCA9IChxdWV1ZSA9ICcnLCBzdGFzaCA9ICcnLCBlbmNsb3NlID0gZmFsc2UpID0+IHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gIHF1ZXVlID0gW10uY29uY2F0KHF1ZXVlKTtcbiAgc3Rhc2ggPSBbXS5jb25jYXQoc3Rhc2gpO1xuXG4gIGlmICghc3Rhc2gubGVuZ3RoKSByZXR1cm4gcXVldWU7XG4gIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGVuY2xvc2UgPyB1dGlscy5mbGF0dGVuKHN0YXNoKS5tYXAoZWxlID0+IGB7JHtlbGV9fWApIDogc3Rhc2g7XG4gIH1cblxuICBmb3IgKGxldCBpdGVtIG9mIHF1ZXVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGZvciAobGV0IHZhbHVlIG9mIGl0ZW0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYXBwZW5kKHZhbHVlLCBzdGFzaCwgZW5jbG9zZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBlbGUgb2Ygc3Rhc2gpIHtcbiAgICAgICAgaWYgKGVuY2xvc2UgPT09IHRydWUgJiYgdHlwZW9mIGVsZSA9PT0gJ3N0cmluZycpIGVsZSA9IGB7JHtlbGV9fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKEFycmF5LmlzQXJyYXkoZWxlKSA/IGFwcGVuZChpdGVtLCBlbGUsIGVuY2xvc2UpIDogKGl0ZW0gKyBlbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4ocmVzdWx0KTtcbn07XG5cbmNvbnN0IGV4cGFuZCA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgcmFuZ2VMaW1pdCA9IG9wdGlvbnMucmFuZ2VMaW1pdCA9PT0gdm9pZCAwID8gMTAwMCA6IG9wdGlvbnMucmFuZ2VMaW1pdDtcblxuICBsZXQgd2FsayA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIG5vZGUucXVldWUgPSBbXTtcblxuICAgIGxldCBwID0gcGFyZW50O1xuICAgIGxldCBxID0gcGFyZW50LnF1ZXVlO1xuXG4gICAgd2hpbGUgKHAudHlwZSAhPT0gJ2JyYWNlJyAmJiBwLnR5cGUgIT09ICdyb290JyAmJiBwLnBhcmVudCkge1xuICAgICAgcCA9IHAucGFyZW50O1xuICAgICAgcSA9IHAucXVldWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuaW52YWxpZCB8fCBub2RlLmRvbGxhcikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBzdHJpbmdpZnkobm9kZSwgb3B0aW9ucykpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnYnJhY2UnICYmIG5vZGUuaW52YWxpZCAhPT0gdHJ1ZSAmJiBub2RlLm5vZGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBbJ3t9J10pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5ub2RlcyAmJiBub2RlLnJhbmdlcyA+IDApIHtcbiAgICAgIGxldCBhcmdzID0gdXRpbHMucmVkdWNlKG5vZGUubm9kZXMpO1xuXG4gICAgICBpZiAodXRpbHMuZXhjZWVkc0xpbWl0KC4uLmFyZ3MsIG9wdGlvbnMuc3RlcCwgcmFuZ2VMaW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2V4cGFuZGVkIGFycmF5IGxlbmd0aCBleGNlZWRzIHJhbmdlIGxpbWl0LiBVc2Ugb3B0aW9ucy5yYW5nZUxpbWl0IHRvIGluY3JlYXNlIG9yIGRpc2FibGUgdGhlIGxpbWl0LicpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmFuZ2UgPSBmaWxsKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByYW5nZSA9IHN0cmluZ2lmeShub2RlLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCByYW5nZSkpO1xuICAgICAgbm9kZS5ub2RlcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlbmNsb3NlID0gdXRpbHMuZW5jbG9zZUJyYWNlKG5vZGUpO1xuICAgIGxldCBxdWV1ZSA9IG5vZGUucXVldWU7XG4gICAgbGV0IGJsb2NrID0gbm9kZTtcblxuICAgIHdoaWxlIChibG9jay50eXBlICE9PSAnYnJhY2UnICYmIGJsb2NrLnR5cGUgIT09ICdyb290JyAmJiBibG9jay5wYXJlbnQpIHtcbiAgICAgIGJsb2NrID0gYmxvY2sucGFyZW50O1xuICAgICAgcXVldWUgPSBibG9jay5xdWV1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXNbaV07XG5cbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnY29tbWEnICYmIG5vZGUudHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICBpZiAoaSA9PT0gMSkgcXVldWUucHVzaCgnJyk7XG4gICAgICAgIHF1ZXVlLnB1c2goJycpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgcS5wdXNoKGFwcGVuZChxLnBvcCgpLCBxdWV1ZSwgZW5jbG9zZSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnZhbHVlICYmIGNoaWxkLnR5cGUgIT09ICdvcGVuJykge1xuICAgICAgICBxdWV1ZS5wdXNoKGFwcGVuZChxdWV1ZS5wb3AoKSwgY2hpbGQudmFsdWUpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC5ub2Rlcykge1xuICAgICAgICB3YWxrKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH07XG5cbiAgcmV0dXJuIHV0aWxzLmZsYXR0ZW4od2Fsayhhc3QpKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwYW5kO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEg6IDEwMjQgKiA2NCxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiAnMCcsIC8qIDAgKi9cbiAgQ0hBUl85OiAnOScsIC8qIDkgKi9cblxuICAvLyBBbHBoYWJldCBjaGFycy5cbiAgQ0hBUl9VUFBFUkNBU0VfQTogJ0EnLCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6ICdhJywgLyogYSAqL1xuICBDSEFSX1VQUEVSQ0FTRV9aOiAnWicsIC8qIFogKi9cbiAgQ0hBUl9MT1dFUkNBU0VfWjogJ3onLCAvKiB6ICovXG5cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTOiAnKCcsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogJyknLCAvKiApICovXG5cbiAgQ0hBUl9BU1RFUklTSzogJyonLCAvKiAqICovXG5cbiAgLy8gTm9uLWFscGhhYmV0aWMgY2hhcnMuXG4gIENIQVJfQU1QRVJTQU5EOiAnJicsIC8qICYgKi9cbiAgQ0hBUl9BVDogJ0AnLCAvKiBAICovXG4gIENIQVJfQkFDS1NMQVNIOiAnXFxcXCcsIC8qIFxcICovXG4gIENIQVJfQkFDS1RJQ0s6ICdgJywgLyogYCAqL1xuICBDSEFSX0NBUlJJQUdFX1JFVFVSTjogJ1xccicsIC8qIFxcciAqL1xuICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiAnXicsIC8qIF4gKi9cbiAgQ0hBUl9DT0xPTjogJzonLCAvKiA6ICovXG4gIENIQVJfQ09NTUE6ICcsJywgLyogLCAqL1xuICBDSEFSX0RPTExBUjogJyQnLCAvKiAuICovXG4gIENIQVJfRE9UOiAnLicsIC8qIC4gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEU6ICdcIicsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6ICc9JywgLyogPSAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUks6ICchJywgLyogISAqL1xuICBDSEFSX0ZPUk1fRkVFRDogJ1xcZicsIC8qIFxcZiAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0g6ICcvJywgLyogLyAqL1xuICBDSEFSX0hBU0g6ICcjJywgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogJy0nLCAvKiAtICovXG4gIENIQVJfTEVGVF9BTkdMRV9CUkFDS0VUOiAnPCcsIC8qIDwgKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiAneycsIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiAnWycsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6ICdcXG4nLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogJ1xcdTAwQTAnLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogJyUnLCAvKiAlICovXG4gIENIQVJfUExVUzogJysnLCAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSzogJz8nLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogJz4nLCAvKiA+ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6ICd9JywgLyogfSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUOiAnXScsIC8qIF0gKi9cbiAgQ0hBUl9TRU1JQ09MT046ICc7JywgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogJ1xcJycsIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogJyAnLCAvKiAgICovXG4gIENIQVJfVEFCOiAnXFx0JywgLyogXFx0ICovXG4gIENIQVJfVU5ERVJTQ09SRTogJ18nLCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogJ3wnLCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiAnXFx1RkVGRicgLyogXFx1RkVGRiAqL1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3Qge1xuICBNQVhfTEVOR1RILFxuICBDSEFSX0JBQ0tTTEFTSCwgLyogXFwgKi9cbiAgQ0hBUl9CQUNLVElDSywgLyogYCAqL1xuICBDSEFSX0NPTU1BLCAvKiAsICovXG4gIENIQVJfRE9ULCAvKiAuICovXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUywgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTLCAvKiApICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgLyogeyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAvKiB9ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCwgLyogWyAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VULCAvKiBdICovXG4gIENIQVJfRE9VQkxFX1FVT1RFLCAvKiBcIiAqL1xuICBDSEFSX1NJTkdMRV9RVU9URSwgLyogJyAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFLFxuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRVxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8qKlxuICogcGFyc2VcbiAqL1xuXG5jb25zdCBwYXJzZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGxldCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuICBpZiAoaW5wdXQubGVuZ3RoID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGggKCR7aW5wdXQubGVuZ3RofSksIGV4Y2VlZHMgbWF4IGNoYXJhY3RlcnMgKCR7bWF4fSlgKTtcbiAgfVxuXG4gIGxldCBhc3QgPSB7IHR5cGU6ICdyb290JywgaW5wdXQsIG5vZGVzOiBbXSB9O1xuICBsZXQgc3RhY2sgPSBbYXN0XTtcbiAgbGV0IGJsb2NrID0gYXN0O1xuICBsZXQgcHJldiA9IGFzdDtcbiAgbGV0IGJyYWNrZXRzID0gMDtcbiAgbGV0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHZhbHVlO1xuICBsZXQgbWVtbyA9IHt9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGFkdmFuY2UgPSAoKSA9PiBpbnB1dFtpbmRleCsrXTtcbiAgY29uc3QgcHVzaCA9IG5vZGUgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0JyAmJiBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAndGV4dCcgJiYgbm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHByZXYudmFsdWUgKz0gbm9kZS52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBibG9jay5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgIG5vZGUucGFyZW50ID0gYmxvY2s7XG4gICAgbm9kZS5wcmV2ID0gcHJldjtcbiAgICBwcmV2ID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcblxuICBwdXNoKHsgdHlwZTogJ2JvcycgfSk7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcblxuICAgIC8qKlxuICAgICAqIEludmFsaWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0UgfHwgdmFsdWUgPT09IENIQVJfTk9fQlJFQUtfU1BBQ0UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZWQgY2hhcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAob3B0aW9ucy5rZWVwRXNjYXBpbmcgPyB2YWx1ZSA6ICcnKSArIGFkdmFuY2UoKSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IHNxdWFyZSBicmFja2V0IChsaXRlcmFsKTogJ10nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiAnXFxcXCcgKyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExlZnQgc3F1YXJlIGJyYWNrZXQ6ICdbJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIGJyYWNrZXRzKys7XG5cbiAgICAgIGxldCBjbG9zZWQgPSB0cnVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMtLTtcblxuICAgICAgICAgIGlmIChicmFja2V0cyA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyZW50aGVzZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBibG9jayA9IHB1c2goeyB0eXBlOiAncGFyZW4nLCBub2RlczogW10gfSk7XG4gICAgICBzdGFjay5wdXNoKGJsb2NrKTtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVvdGVzOiAnfFwifGBcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1VCTEVfUVVPVEUgfHwgdmFsdWUgPT09IENIQVJfU0lOR0xFX1FVT1RFIHx8IHZhbHVlID09PSBDSEFSX0JBQ0tUSUNLKSB7XG4gICAgICBsZXQgb3BlbiA9IHZhbHVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIGlmIChvcHRpb25zLmtlZXBRdW90ZXMgIT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgICAgICB2YWx1ZSArPSBuZXh0ICsgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IG9wZW4pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5rZWVwUXVvdGVzID09PSB0cnVlKSB2YWx1ZSArPSBuZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IGN1cmx5IGJyYWNlOiAneydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBkZXB0aCsrO1xuXG4gICAgICBsZXQgZG9sbGFyID0gcHJldi52YWx1ZSAmJiBwcmV2LnZhbHVlLnNsaWNlKC0xKSA9PT0gJyQnIHx8IGJsb2NrLmRvbGxhciA9PT0gdHJ1ZTtcbiAgICAgIGxldCBicmFjZSA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgICAgY2xvc2U6IGZhbHNlLFxuICAgICAgICBkb2xsYXIsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBjb21tYXM6IDAsXG4gICAgICAgIHJhbmdlczogMCxcbiAgICAgICAgbm9kZXM6IFtdXG4gICAgICB9O1xuXG4gICAgICBibG9jayA9IHB1c2goYnJhY2UpO1xuICAgICAgc3RhY2sucHVzaChibG9jayk7XG4gICAgICBwdXNoKHsgdHlwZTogJ29wZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IGN1cmx5IGJyYWNlOiAnfSdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSkge1xuICAgICAgaWYgKGJsb2NrLnR5cGUgIT09ICdicmFjZScpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHlwZSA9ICdjbG9zZSc7XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgYmxvY2suY2xvc2UgPSB0cnVlO1xuXG4gICAgICBwdXNoKHsgdHlwZSwgdmFsdWUgfSk7XG4gICAgICBkZXB0aC0tO1xuXG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWE6ICcsJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0NPTU1BICYmIGRlcHRoID4gMCkge1xuICAgICAgaWYgKGJsb2NrLnJhbmdlcyA+IDApIHtcbiAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgbGV0IG9wZW4gPSBibG9jay5ub2Rlcy5zaGlmdCgpO1xuICAgICAgICBibG9jay5ub2RlcyA9IFtvcGVuLCB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHN0cmluZ2lmeShibG9jaykgfV07XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnY29tbWEnLCB2YWx1ZSB9KTtcbiAgICAgIGJsb2NrLmNvbW1hcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90OiAnLidcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1QgJiYgZGVwdGggPiAwICYmIGJsb2NrLmNvbW1hcyA9PT0gMCkge1xuICAgICAgbGV0IHNpYmxpbmdzID0gYmxvY2subm9kZXM7XG5cbiAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCBzaWJsaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBibG9jay5yYW5nZSA9IFtdO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnR5cGUgPSAncmFuZ2UnO1xuXG4gICAgICAgIGlmIChibG9jay5ub2Rlcy5sZW5ndGggIT09IDMgJiYgYmxvY2subm9kZXMubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgICBwcmV2LnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBibG9jay5yYW5nZXMrKztcbiAgICAgICAgYmxvY2suYXJncyA9IFtdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICBzaWJsaW5ncy5wb3AoKTtcblxuICAgICAgICBsZXQgYmVmb3JlID0gc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGJlZm9yZS52YWx1ZSArPSBwcmV2LnZhbHVlICsgdmFsdWU7XG4gICAgICAgIHByZXYgPSBiZWZvcmU7XG4gICAgICAgIGJsb2NrLnJhbmdlcy0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdkb3QnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRleHRcbiAgICAgKi9cblxuICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICB9XG5cbiAgLy8gTWFyayBpbWJhbGFuY2VkIGJyYWNlcyBhbmQgYnJhY2tldHMgYXMgaW52YWxpZFxuICBkbyB7XG4gICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcblxuICAgIGlmIChibG9jay50eXBlICE9PSAncm9vdCcpIHtcbiAgICAgIGJsb2NrLm5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGlmICghbm9kZS5ub2Rlcykge1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJykgbm9kZS5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdjbG9zZScpIG5vZGUuaXNDbG9zZSA9IHRydWU7XG4gICAgICAgICAgaWYgKCFub2RlLm5vZGVzKSBub2RlLnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgbm9kZS5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGJsb2NrIG9uIHBhcmVudC5ub2RlcyAoYmxvY2sncyBzaWJsaW5ncylcbiAgICAgIGxldCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGxldCBpbmRleCA9IHBhcmVudC5ub2Rlcy5pbmRleE9mKGJsb2NrKTtcbiAgICAgIC8vIHJlcGxhY2UgdGhlIChpbnZhbGlkKSBibG9jayB3aXRoIGl0J3Mgbm9kZXNcbiAgICAgIHBhcmVudC5ub2Rlcy5zcGxpY2UoaW5kZXgsIDEsIC4uLmJsb2NrLm5vZGVzKTtcbiAgICB9XG4gIH0gd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApO1xuXG4gIHB1c2goeyB0eXBlOiAnZW9zJyB9KTtcbiAgcmV0dXJuIGFzdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL2xpYi9zdHJpbmdpZnknKTtcbmNvbnN0IGNvbXBpbGUgPSByZXF1aXJlKCcuL2xpYi9jb21waWxlJyk7XG5jb25zdCBleHBhbmQgPSByZXF1aXJlKCcuL2xpYi9leHBhbmQnKTtcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9saWIvcGFyc2UnKTtcblxuLyoqXG4gKiBFeHBhbmQgdGhlIGdpdmVuIHBhdHRlcm4gb3IgY3JlYXRlIGEgcmVnZXgtY29tcGF0aWJsZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JywgeyBjb21waWxlOiB0cnVlIH0pKTsgLy89PiBbJyhhfGJ8YyknXVxuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JykpOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgYnJhY2VzID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IG91dHB1dCA9IFtdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGZvciAobGV0IHBhdHRlcm4gb2YgaW5wdXQpIHtcbiAgICAgIGxldCByZXN1bHQgPSBicmFjZXMuY3JlYXRlKHBhdHRlcm4sIG9wdGlvbnMpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICBvdXRwdXQucHVzaCguLi5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0gW10uY29uY2F0KGJyYWNlcy5jcmVhdGUoaW5wdXQsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZXhwYW5kID09PSB0cnVlICYmIG9wdGlvbnMubm9kdXBlcyA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IFsuLi5uZXcgU2V0KG91dHB1dCldO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKlxuICogYGBganNcbiAqIC8vIGJyYWNlcy5wYXJzZShwYXR0ZXJuLCBbLCBvcHRpb25zXSk7XG4gKiBjb25zdCBhc3QgPSBicmFjZXMucGFyc2UoJ2Eve2IsY30vZCcpO1xuICogY29uc29sZS5sb2coYXN0KTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gQnJhY2UgcGF0dGVybiB0byBwYXJzZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBBU1RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLnBhcnNlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnJhY2VzIHN0cmluZyBmcm9tIGFuIEFTVCwgb3IgYW4gQVNUIG5vZGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogbGV0IGFzdCA9IGJyYWNlcy5wYXJzZSgnZm9vL3thLGJ9L2JhcicpO1xuICogY29uc29sZS5sb2coc3RyaW5naWZ5KGFzdC5ub2Rlc1syXSkpOyAvLz0+ICd7YSxifSdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5zdHJpbmdpZnkgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmdpZnkoYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmeShpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGEgcmVnZXgtY29tcGF0aWJsZSwgb3B0aW1pemVkIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jb21waWxlKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS8oYnxjKS9kJ11cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5jb21waWxlID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbnB1dCA9IGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGNvbXBpbGUoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBhbmRzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGFuIGFycmF5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlXG4gKiBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uIHdoZW4gYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlLiBCZWZvcmVcbiAqIHVzaW5nIHRoaXMgbWV0aG9kIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB5b3UgcmVhZCB0aGUgW3BlcmZvcm1hbmNlIG5vdGVzXSgjcGVyZm9ybWFuY2UpKVxuICogYW5kIGFkdmFudGFnZXMgb2YgdXNpbmcgWy5jb21waWxlXSgjY29tcGlsZSkgaW5zdGVhZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuZXhwYW5kKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS9iL2QnLCAnYS9jL2QnXTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBCcmFjZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5leHBhbmQgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzLnBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSBleHBhbmQoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIC8vIGZpbHRlciBvdXQgZW1wdHkgc3RyaW5ncyBpZiBzcGVjaWZpZWRcbiAgaWYgKG9wdGlvbnMubm9lbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgaWYgc3BlY2lmaWVkXG4gIGlmIChvcHRpb25zLm5vZHVwZXMgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSBbLi4ubmV3IFNldChyZXN1bHQpXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGJyYWNlIHBhdHRlcm4gYW5kIHJldHVybnMgZWl0aGVyIGFuIGV4cGFuZGVkIGFycmF5XG4gKiAoaWYgYG9wdGlvbnMuZXhwYW5kYCBpcyB0cnVlKSwgYSBoaWdobHkgb3B0aW1pemVkIHJlZ2V4LWNvbXBhdGlibGUgc3RyaW5nLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFticmFjZXNdKCNicmFjZXMpIGZ1bmN0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jcmVhdGUoJ3VzZXItezIwMC4uMzAwfS9wcm9qZWN0LXthLGIsY30tezEuLjEwfScpKVxuICogLy89PiAndXNlci0oMjBbMC05XXwyWzEtOV1bMC05XXwzMDApL3Byb2plY3QtKGF8YnxjKS0oWzEtOV18MTApJ1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIEJyYWNlIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGV4cGFuZGVkIHZhbHVlcy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzLmNyZWF0ZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChpbnB1dCA9PT0gJycgfHwgaW5wdXQubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiByZXR1cm4gb3B0aW9ucy5leHBhbmQgIT09IHRydWVcbiAgICA/IGJyYWNlcy5jb21waWxlKGlucHV0LCBvcHRpb25zKVxuICAgIDogYnJhY2VzLmV4cGFuZChpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBcImJyYWNlc1wiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBicmFjZXM7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgV0lOX1NMQVNIID0gJ1xcXFxcXFxcLyc7XG5jb25zdCBXSU5fTk9fU0xBU0ggPSBgW14ke1dJTl9TTEFTSH1dYDtcblxuLyoqXG4gKiBQb3NpeCBnbG9iIHJlZ2V4XG4gKi9cblxuY29uc3QgRE9UX0xJVEVSQUwgPSAnXFxcXC4nO1xuY29uc3QgUExVU19MSVRFUkFMID0gJ1xcXFwrJztcbmNvbnN0IFFNQVJLX0xJVEVSQUwgPSAnXFxcXD8nO1xuY29uc3QgU0xBU0hfTElURVJBTCA9ICdcXFxcLyc7XG5jb25zdCBPTkVfQ0hBUiA9ICcoPz0uKSc7XG5jb25zdCBRTUFSSyA9ICdbXi9dJztcbmNvbnN0IEVORF9BTkNIT1IgPSBgKD86JHtTTEFTSF9MSVRFUkFMfXwkKWA7XG5jb25zdCBTVEFSVF9BTkNIT1IgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9KWA7XG5jb25zdCBET1RTX1NMQVNIID0gYCR7RE9UX0xJVEVSQUx9ezEsMn0ke0VORF9BTkNIT1J9YDtcbmNvbnN0IE5PX0RPVCA9IGAoPyEke0RPVF9MSVRFUkFMfSlgO1xuY29uc3QgTk9fRE9UUyA9IGAoPyEke1NUQVJUX0FOQ0hPUn0ke0RPVFNfU0xBU0h9KWA7XG5jb25zdCBOT19ET1RfU0xBU0ggPSBgKD8hJHtET1RfTElURVJBTH17MCwxfSR7RU5EX0FOQ0hPUn0pYDtcbmNvbnN0IE5PX0RPVFNfU0xBU0ggPSBgKD8hJHtET1RTX1NMQVNIfSlgO1xuY29uc3QgUU1BUktfTk9fRE9UID0gYFteLiR7U0xBU0hfTElURVJBTH1dYDtcbmNvbnN0IFNUQVIgPSBgJHtRTUFSS30qP2A7XG5cbmNvbnN0IFBPU0lYX0NIQVJTID0ge1xuICBET1RfTElURVJBTCxcbiAgUExVU19MSVRFUkFMLFxuICBRTUFSS19MSVRFUkFMLFxuICBTTEFTSF9MSVRFUkFMLFxuICBPTkVfQ0hBUixcbiAgUU1BUkssXG4gIEVORF9BTkNIT1IsXG4gIERPVFNfU0xBU0gsXG4gIE5PX0RPVCxcbiAgTk9fRE9UUyxcbiAgTk9fRE9UX1NMQVNILFxuICBOT19ET1RTX1NMQVNILFxuICBRTUFSS19OT19ET1QsXG4gIFNUQVIsXG4gIFNUQVJUX0FOQ0hPUlxufTtcblxuLyoqXG4gKiBXaW5kb3dzIGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBXSU5ET1dTX0NIQVJTID0ge1xuICAuLi5QT1NJWF9DSEFSUyxcblxuICBTTEFTSF9MSVRFUkFMOiBgWyR7V0lOX1NMQVNIfV1gLFxuICBRTUFSSzogV0lOX05PX1NMQVNILFxuICBTVEFSOiBgJHtXSU5fTk9fU0xBU0h9Kj9gLFxuICBET1RTX1NMQVNIOiBgJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpYCxcbiAgTk9fRE9UOiBgKD8hJHtET1RfTElURVJBTH0pYCxcbiAgTk9fRE9UUzogYCg/ISg/Ol58WyR7V0lOX1NMQVNIfV0pJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIE5PX0RPVF9TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBOT19ET1RTX1NMQVNIOiBgKD8hJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIFFNQVJLX05PX0RPVDogYFteLiR7V0lOX1NMQVNIfV1gLFxuICBTVEFSVF9BTkNIT1I6IGAoPzpefFske1dJTl9TTEFTSH1dKWAsXG4gIEVORF9BTkNIT1I6IGAoPzpbJHtXSU5fU0xBU0h9XXwkKWBcbn07XG5cbi8qKlxuICogUE9TSVggQnJhY2tldCBSZWdleFxuICovXG5cbmNvbnN0IFBPU0lYX1JFR0VYX1NPVVJDRSA9IHtcbiAgYWxudW06ICdhLXpBLVowLTknLFxuICBhbHBoYTogJ2EtekEtWicsXG4gIGFzY2lpOiAnXFxcXHgwMC1cXFxceDdGJyxcbiAgYmxhbms6ICcgXFxcXHQnLFxuICBjbnRybDogJ1xcXFx4MDAtXFxcXHgxRlxcXFx4N0YnLFxuICBkaWdpdDogJzAtOScsXG4gIGdyYXBoOiAnXFxcXHgyMS1cXFxceDdFJyxcbiAgbG93ZXI6ICdhLXonLFxuICBwcmludDogJ1xcXFx4MjAtXFxcXHg3RSAnLFxuICBwdW5jdDogJ1xcXFwtIVwiIyQlJlxcJygpXFxcXCorLC4vOjs8PT4/QFtcXFxcXV5fYHt8fX4nLFxuICBzcGFjZTogJyBcXFxcdFxcXFxyXFxcXG5cXFxcdlxcXFxmJyxcbiAgdXBwZXI6ICdBLVonLFxuICB3b3JkOiAnQS1aYS16MC05XycsXG4gIHhkaWdpdDogJ0EtRmEtZjAtOSdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RIOiAxMDI0ICogNjQsXG4gIFBPU0lYX1JFR0VYX1NPVVJDRSxcblxuICAvLyByZWd1bGFyIGV4cHJlc3Npb25zXG4gIFJFR0VYX0JBQ0tTTEFTSDogL1xcXFwoPyFbKis/XiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUzogL15bXkAhW1xcXS4sJCorP157fSgpfFxcXFwvXSsvLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTOiAvWy0qKz8uXiR7fSh8KVtcXF1dLyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGOiAvKFxcXFw/KSgoXFxXKShcXDMqKSkvZyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUw6IC8oWy0qKz8uXiR7fSh8KVtcXF1dKS9nLFxuICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNIOiAvKD86XFxbLio/W15cXFxcXVxcXXxcXFxcKD89LikpL2csXG5cbiAgLy8gUmVwbGFjZSBnbG9icyB3aXRoIGVxdWl2YWxlbnQgcGF0dGVybnMgdG8gcmVkdWNlIHBhcnNpbmcgdGltZS5cbiAgUkVQTEFDRU1FTlRTOiB7XG4gICAgJyoqKic6ICcqJyxcbiAgICAnKiovKionOiAnKionLFxuICAgICcqKi8qKi8qKic6ICcqKidcbiAgfSxcblxuICAvLyBEaWdpdHNcbiAgQ0hBUl8wOiA0OCwgLyogMCAqL1xuICBDSEFSXzk6IDU3LCAvKiA5ICovXG5cbiAgLy8gQWxwaGFiZXQgY2hhcnMuXG4gIENIQVJfVVBQRVJDQVNFX0E6IDY1LCAvKiBBICovXG4gIENIQVJfTE9XRVJDQVNFX0E6IDk3LCAvKiBhICovXG4gIENIQVJfVVBQRVJDQVNFX1o6IDkwLCAvKiBaICovXG4gIENIQVJfTE9XRVJDQVNFX1o6IDEyMiwgLyogeiAqL1xuXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUzogNDAsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUzogNDEsIC8qICkgKi9cblxuICBDSEFSX0FTVEVSSVNLOiA0MiwgLyogKiAqL1xuXG4gIC8vIE5vbi1hbHBoYWJldGljIGNoYXJzLlxuICBDSEFSX0FNUEVSU0FORDogMzgsIC8qICYgKi9cbiAgQ0hBUl9BVDogNjQsIC8qIEAgKi9cbiAgQ0hBUl9CQUNLV0FSRF9TTEFTSDogOTIsIC8qIFxcICovXG4gIENIQVJfQ0FSUklBR0VfUkVUVVJOOiAxMywgLyogXFxyICovXG4gIENIQVJfQ0lSQ1VNRkxFWF9BQ0NFTlQ6IDk0LCAvKiBeICovXG4gIENIQVJfQ09MT046IDU4LCAvKiA6ICovXG4gIENIQVJfQ09NTUE6IDQ0LCAvKiAsICovXG4gIENIQVJfRE9UOiA0NiwgLyogLiAqL1xuICBDSEFSX0RPVUJMRV9RVU9URTogMzQsIC8qIFwiICovXG4gIENIQVJfRVFVQUw6IDYxLCAvKiA9ICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSzogMzMsIC8qICEgKi9cbiAgQ0hBUl9GT1JNX0ZFRUQ6IDEyLCAvKiBcXGYgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNIOiA0NywgLyogLyAqL1xuICBDSEFSX0dSQVZFX0FDQ0VOVDogOTYsIC8qIGAgKi9cbiAgQ0hBUl9IQVNIOiAzNSwgLyogIyAqL1xuICBDSEFSX0hZUEhFTl9NSU5VUzogNDUsIC8qIC0gKi9cbiAgQ0hBUl9MRUZUX0FOR0xFX0JSQUNLRVQ6IDYwLCAvKiA8ICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRTogMTIzLCAvKiB7ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVDogOTEsIC8qIFsgKi9cbiAgQ0hBUl9MSU5FX0ZFRUQ6IDEwLCAvKiBcXG4gKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRTogMTYwLCAvKiBcXHUwMEEwICovXG4gIENIQVJfUEVSQ0VOVDogMzcsIC8qICUgKi9cbiAgQ0hBUl9QTFVTOiA0MywgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUks6IDYzLCAvKiA/ICovXG4gIENIQVJfUklHSFRfQU5HTEVfQlJBQ0tFVDogNjIsIC8qID4gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogMTI1LCAvKiB9ICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6IDkzLCAvKiBdICovXG4gIENIQVJfU0VNSUNPTE9OOiA1OSwgLyogOyAqL1xuICBDSEFSX1NJTkdMRV9RVU9URTogMzksIC8qICcgKi9cbiAgQ0hBUl9TUEFDRTogMzIsIC8qICAgKi9cbiAgQ0hBUl9UQUI6IDksIC8qIFxcdCAqL1xuICBDSEFSX1VOREVSU0NPUkU6IDk1LCAvKiBfICovXG4gIENIQVJfVkVSVElDQUxfTElORTogMTI0LCAvKiB8ICovXG4gIENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFOiA2NTI3OSwgLyogXFx1RkVGRiAqL1xuXG4gIFNFUDogcGF0aC5zZXAsXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBFWFRHTE9CX0NIQVJTXG4gICAqL1xuXG4gIGV4dGdsb2JDaGFycyhjaGFycykge1xuICAgIHJldHVybiB7XG4gICAgICAnISc6IHsgdHlwZTogJ25lZ2F0ZScsIG9wZW46ICcoPzooPyEoPzonLCBjbG9zZTogYCkpJHtjaGFycy5TVEFSfSlgIH0sXG4gICAgICAnPyc6IHsgdHlwZTogJ3FtYXJrJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKT8nIH0sXG4gICAgICAnKyc6IHsgdHlwZTogJ3BsdXMnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpKycgfSxcbiAgICAgICcqJzogeyB0eXBlOiAnc3RhcicsIG9wZW46ICcoPzonLCBjbG9zZTogJykqJyB9LFxuICAgICAgJ0AnOiB7IHR5cGU6ICdhdCcsIG9wZW46ICcoPzonLCBjbG9zZTogJyknIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR0xPQl9DSEFSU1xuICAgKi9cblxuICBnbG9iQ2hhcnMod2luMzIpIHtcbiAgICByZXR1cm4gd2luMzIgPT09IHRydWUgPyBXSU5ET1dTX0NIQVJTIDogUE9TSVhfQ0hBUlM7XG4gIH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3Qgd2luMzIgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuY29uc3Qge1xuICBSRUdFWF9CQUNLU0xBU0gsXG4gIFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlMsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuZXhwb3J0cy5pc09iamVjdCA9IHZhbCA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbmV4cG9ydHMuaGFzUmVnZXhDaGFycyA9IHN0ciA9PiBSRUdFWF9TUEVDSUFMX0NIQVJTLnRlc3Qoc3RyKTtcbmV4cG9ydHMuaXNSZWdleENoYXIgPSBzdHIgPT4gc3RyLmxlbmd0aCA9PT0gMSAmJiBleHBvcnRzLmhhc1JlZ2V4Q2hhcnMoc3RyKTtcbmV4cG9ydHMuZXNjYXBlUmVnZXggPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUwsICdcXFxcJDEnKTtcbmV4cG9ydHMudG9Qb3NpeFNsYXNoZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfQkFDS1NMQVNILCAnLycpO1xuXG5leHBvcnRzLnJlbW92ZUJhY2tzbGFzaGVzID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFJFR0VYX1JFTU9WRV9CQUNLU0xBU0gsIG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2ggPT09ICdcXFxcJyA/ICcnIDogbWF0Y2g7XG4gIH0pO1xufTtcblxuZXhwb3J0cy5zdXBwb3J0c0xvb2tiZWhpbmRzID0gKCkgPT4ge1xuICBjb25zdCBzZWdzID0gcHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gIGlmIChzZWdzLmxlbmd0aCA9PT0gMyAmJiBzZWdzWzBdID49IDkgfHwgKHNlZ3NbMF0gPT09IDggJiYgc2Vnc1sxXSA+PSAxMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzV2luZG93cyA9IG9wdGlvbnMgPT4ge1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy53aW5kb3dzID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gb3B0aW9ucy53aW5kb3dzO1xuICB9XG4gIHJldHVybiB3aW4zMiA9PT0gdHJ1ZSB8fCBwYXRoLnNlcCA9PT0gJ1xcXFwnO1xufTtcblxuZXhwb3J0cy5lc2NhcGVMYXN0ID0gKGlucHV0LCBjaGFyLCBsYXN0SWR4KSA9PiB7XG4gIGNvbnN0IGlkeCA9IGlucHV0Lmxhc3RJbmRleE9mKGNoYXIsIGxhc3RJZHgpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXRbaWR4IC0gMV0gPT09ICdcXFxcJykgcmV0dXJuIGV4cG9ydHMuZXNjYXBlTGFzdChpbnB1dCwgY2hhciwgaWR4IC0gMSk7XG4gIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBpZHgpfVxcXFwke2lucHV0LnNsaWNlKGlkeCl9YDtcbn07XG5cbmV4cG9ydHMucmVtb3ZlUHJlZml4ID0gKGlucHV0LCBzdGF0ZSA9IHt9KSA9PiB7XG4gIGxldCBvdXRwdXQgPSBpbnB1dDtcbiAgaWYgKG91dHB1dC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgb3V0cHV0ID0gb3V0cHV0LnNsaWNlKDIpO1xuICAgIHN0YXRlLnByZWZpeCA9ICcuLyc7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmV4cG9ydHMud3JhcE91dHB1dCA9IChpbnB1dCwgc3RhdGUgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRpb25zLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgb3V0cHV0ID0gYCR7cHJlcGVuZH0oPzoke2lucHV0fSkke2FwcGVuZH1gO1xuICBpZiAoc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IGAoPzpeKD8hJHtvdXRwdXR9KS4qJClgO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5jb25zdCB7XG4gIENIQVJfQVNURVJJU0ssICAgICAgICAgICAgIC8qICogKi9cbiAgQ0hBUl9BVCwgICAgICAgICAgICAgICAgICAgLyogQCAqL1xuICBDSEFSX0JBQ0tXQVJEX1NMQVNILCAgICAgICAvKiBcXCAqL1xuICBDSEFSX0NPTU1BLCAgICAgICAgICAgICAgICAvKiAsICovXG4gIENIQVJfRE9ULCAgICAgICAgICAgICAgICAgIC8qIC4gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLLCAgICAgLyogISAqL1xuICBDSEFSX0ZPUldBUkRfU0xBU0gsICAgICAgICAvKiAvICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRSwgICAgIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTLCAgICAgLyogKCAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsICAvKiBbICovXG4gIENIQVJfUExVUywgICAgICAgICAgICAgICAgIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLLCAgICAgICAgLyogPyAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFLCAgICAvKiB9ICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVMsICAgIC8qICkgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCAgLyogXSAqL1xufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IGlzUGF0aFNlcGFyYXRvciA9IGNvZGUgPT4ge1xuICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7XG59O1xuXG5jb25zdCBkZXB0aCA9IHRva2VuID0+IHtcbiAgaWYgKHRva2VuLmlzUHJlZml4ICE9PSB0cnVlKSB7XG4gICAgdG9rZW4uZGVwdGggPSB0b2tlbi5pc0dsb2JzdGFyID8gSW5maW5pdHkgOiAxO1xuICB9XG59O1xuXG4vKipcbiAqIFF1aWNrbHkgc2NhbnMgYSBnbG9iIHBhdHRlcm4gYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBoYW5kZnVsIG9mXG4gKiB1c2VmdWwgcHJvcGVydGllcywgbGlrZSBgaXNHbG9iYCwgYHBhdGhgICh0aGUgbGVhZGluZyBub24tZ2xvYiwgaWYgaXQgZXhpc3RzKSxcbiAqIGBnbG9iYCAodGhlIGFjdHVhbCBwYXR0ZXJuKSwgYG5lZ2F0ZWRgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhYCBidXQgbm90XG4gKiB3aXRoIGAhKGApIGFuZCBgbmVnYXRlZEV4dGdsb2JgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhKGApLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwbSA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc29sZS5sb2cocG0uc2NhbignZm9vL2Jhci8qLmpzJykpO1xuICogeyBpc0dsb2I6IHRydWUsIGlucHV0OiAnZm9vL2Jhci8qLmpzJywgYmFzZTogJ2Zvby9iYXInLCBnbG9iOiAnKi5qcycgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0b2tlbnMgYW5kIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHNjYW4gPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgY29uc3QgbGVuZ3RoID0gaW5wdXQubGVuZ3RoIC0gMTtcbiAgY29uc3Qgc2NhblRvRW5kID0gb3B0cy5wYXJ0cyA9PT0gdHJ1ZSB8fCBvcHRzLnNjYW5Ub0VuZCA9PT0gdHJ1ZTtcbiAgY29uc3Qgc2xhc2hlcyA9IFtdO1xuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgY29uc3QgcGFydHMgPSBbXTtcblxuICBsZXQgc3RyID0gaW5wdXQ7XG4gIGxldCBpbmRleCA9IC0xO1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgbGV0IGlzQnJhY2UgPSBmYWxzZTtcbiAgbGV0IGlzQnJhY2tldCA9IGZhbHNlO1xuICBsZXQgaXNHbG9iID0gZmFsc2U7XG4gIGxldCBpc0V4dGdsb2IgPSBmYWxzZTtcbiAgbGV0IGlzR2xvYnN0YXIgPSBmYWxzZTtcbiAgbGV0IGJyYWNlRXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgYmFja3NsYXNoZXMgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWQgPSBmYWxzZTtcbiAgbGV0IG5lZ2F0ZWRFeHRnbG9iID0gZmFsc2U7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgYnJhY2VzID0gMDtcbiAgbGV0IHByZXY7XG4gIGxldCBjb2RlO1xuICBsZXQgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICBjb25zdCBlb3MgPSAoKSA9PiBpbmRleCA+PSBsZW5ndGg7XG4gIGNvbnN0IHBlZWsgPSAoKSA9PiBzdHIuY2hhckNvZGVBdChpbmRleCArIDEpO1xuICBjb25zdCBhZHZhbmNlID0gKCkgPT4ge1xuICAgIHByZXYgPSBjb2RlO1xuICAgIHJldHVybiBzdHIuY2hhckNvZGVBdCgrK2luZGV4KTtcbiAgfTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgIGxldCBuZXh0O1xuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgY29kZSA9IGFkdmFuY2UoKTtcblxuICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICBicmFjZUVzY2FwZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGJyYWNlRXNjYXBlZCA9PT0gdHJ1ZSB8fCBjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGJyYWNlcysrO1xuXG4gICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICAgIGJyYWNlcysrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyYWNlRXNjYXBlZCAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0RPVCAmJiAoY29kZSA9IGFkdmFuY2UoKSkgPT09IENIQVJfRE9UKSB7XG4gICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfQ09NTUEpIHtcbiAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFKSB7XG4gICAgICAgICAgYnJhY2VzLS07XG5cbiAgICAgICAgICBpZiAoYnJhY2VzID09PSAwKSB7XG4gICAgICAgICAgICBicmFjZUVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7XG4gICAgICBzbGFzaGVzLnB1c2goaW5kZXgpO1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgdG9rZW4gPSB7IHZhbHVlOiAnJywgZGVwdGg6IDAsIGlzR2xvYjogZmFsc2UgfTtcblxuICAgICAgaWYgKGZpbmlzaGVkID09PSB0cnVlKSBjb250aW51ZTtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0RPVCAmJiBpbmRleCA9PT0gKHN0YXJ0ICsgMSkpIHtcbiAgICAgICAgc3RhcnQgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vZXh0ICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBpc0V4dGdsb2JDaGFyID0gY29kZSA9PT0gQ0hBUl9QTFVTXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfQVRcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9BU1RFUklTS1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUktcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLO1xuXG4gICAgICBpZiAoaXNFeHRnbG9iQ2hhciA9PT0gdHJ1ZSAmJiBwZWVrKCkgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICBpc0V4dGdsb2IgPSB0b2tlbi5pc0V4dGdsb2IgPSB0cnVlO1xuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUksgJiYgaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICAgICAgbmVnYXRlZEV4dGdsb2IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgICAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfQVNURVJJU0spIHtcbiAgICAgIGlmIChwcmV2ID09PSBDSEFSX0FTVEVSSVNLKSBpc0dsb2JzdGFyID0gdG9rZW4uaXNHbG9ic3RhciA9IHRydWU7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfUVVFU1RJT05fTUFSSykge1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGlzQnJhY2tldCA9IHRva2VuLmlzQnJhY2tldCA9IHRydWU7XG4gICAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9uZWdhdGUgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLICYmIGluZGV4ID09PSBzdGFydCkge1xuICAgICAgbmVnYXRlZCA9IHRva2VuLm5lZ2F0ZWQgPSB0cnVlO1xuICAgICAgc3RhcnQrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vcGFyZW4gIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAoY29kZSA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5ub2V4dCA9PT0gdHJ1ZSkge1xuICAgIGlzRXh0Z2xvYiA9IGZhbHNlO1xuICAgIGlzR2xvYiA9IGZhbHNlO1xuICB9XG5cbiAgbGV0IGJhc2UgPSBzdHI7XG4gIGxldCBwcmVmaXggPSAnJztcbiAgbGV0IGdsb2IgPSAnJztcblxuICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgcHJlZml4ID0gc3RyLnNsaWNlKDAsIHN0YXJ0KTtcbiAgICBzdHIgPSBzdHIuc2xpY2Uoc3RhcnQpO1xuICAgIGxhc3RJbmRleCAtPSBzdGFydDtcbiAgfVxuXG4gIGlmIChiYXNlICYmIGlzR2xvYiA9PT0gdHJ1ZSAmJiBsYXN0SW5kZXggPiAwKSB7XG4gICAgYmFzZSA9IHN0ci5zbGljZSgwLCBsYXN0SW5kZXgpO1xuICAgIGdsb2IgPSBzdHIuc2xpY2UobGFzdEluZGV4KTtcbiAgfSBlbHNlIGlmIChpc0dsb2IgPT09IHRydWUpIHtcbiAgICBiYXNlID0gJyc7XG4gICAgZ2xvYiA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBiYXNlID0gc3RyO1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgYmFzZSAhPT0gJycgJiYgYmFzZSAhPT0gJy8nICYmIGJhc2UgIT09IHN0cikge1xuICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoYmFzZS5jaGFyQ29kZUF0KGJhc2UubGVuZ3RoIC0gMSkpKSB7XG4gICAgICBiYXNlID0gYmFzZS5zbGljZSgwLCAtMSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICBpZiAoZ2xvYikgZ2xvYiA9IHV0aWxzLnJlbW92ZUJhY2tzbGFzaGVzKGdsb2IpO1xuXG4gICAgaWYgKGJhc2UgJiYgYmFja3NsYXNoZXMgPT09IHRydWUpIHtcbiAgICAgIGJhc2UgPSB1dGlscy5yZW1vdmVCYWNrc2xhc2hlcyhiYXNlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBwcmVmaXgsXG4gICAgaW5wdXQsXG4gICAgc3RhcnQsXG4gICAgYmFzZSxcbiAgICBnbG9iLFxuICAgIGlzQnJhY2UsXG4gICAgaXNCcmFja2V0LFxuICAgIGlzR2xvYixcbiAgICBpc0V4dGdsb2IsXG4gICAgaXNHbG9ic3RhcixcbiAgICBuZWdhdGVkLFxuICAgIG5lZ2F0ZWRFeHRnbG9iXG4gIH07XG5cbiAgaWYgKG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgc3RhdGUubWF4RGVwdGggPSAwO1xuICAgIGlmICghaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgfVxuICAgIHN0YXRlLnRva2VucyA9IHRva2VucztcbiAgfVxuXG4gIGlmIChvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgbGV0IHByZXZJbmRleDtcblxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHNsYXNoZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgY29uc3QgbiA9IHByZXZJbmRleCA/IHByZXZJbmRleCArIDEgOiBzdGFydDtcbiAgICAgIGNvbnN0IGkgPSBzbGFzaGVzW2lkeF07XG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKG4sIGkpO1xuICAgICAgaWYgKG9wdHMudG9rZW5zKSB7XG4gICAgICAgIGlmIChpZHggPT09IDAgJiYgc3RhcnQgIT09IDApIHtcbiAgICAgICAgICB0b2tlbnNbaWR4XS5pc1ByZWZpeCA9IHRydWU7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSBwcmVmaXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aCh0b2tlbnNbaWR4XSk7XG4gICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1tpZHhdLmRlcHRoO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCAhPT0gMCB8fCB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgcGFydHMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBwcmV2SW5kZXggPSBpO1xuICAgIH1cblxuICAgIGlmIChwcmV2SW5kZXggJiYgcHJldkluZGV4ICsgMSA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC5zbGljZShwcmV2SW5kZXggKyAxKTtcbiAgICAgIHBhcnRzLnB1c2godmFsdWUpO1xuXG4gICAgICBpZiAob3B0cy50b2tlbnMpIHtcbiAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZXB0aCh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgc3RhdGUubWF4RGVwdGggKz0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5kZXB0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5zbGFzaGVzID0gc2xhc2hlcztcbiAgICBzdGF0ZS5wYXJ0cyA9IHBhcnRzO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzY2FuO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSCxcbiAgUE9TSVhfUkVHRVhfU09VUkNFLFxuICBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLFxuICBSRVBMQUNFTUVOVFNcbn0gPSBjb25zdGFudHM7XG5cbi8qKlxuICogSGVscGVyc1xuICovXG5cbmNvbnN0IGV4cGFuZFJhbmdlID0gKGFyZ3MsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGFuZFJhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXhwYW5kUmFuZ2UoLi4uYXJncywgb3B0aW9ucyk7XG4gIH1cblxuICBhcmdzLnNvcnQoKTtcbiAgY29uc3QgdmFsdWUgPSBgWyR7YXJncy5qb2luKCctJyl9XWA7XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3ICovXG4gICAgbmV3IFJlZ0V4cCh2YWx1ZSk7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgcmV0dXJuIGFyZ3MubWFwKHYgPT4gdXRpbHMuZXNjYXBlUmVnZXgodikpLmpvaW4oJy4uJyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgbWVzc2FnZSBmb3IgYSBzeW50YXggZXJyb3JcbiAqL1xuXG5jb25zdCBzeW50YXhFcnJvciA9ICh0eXBlLCBjaGFyKSA9PiB7XG4gIHJldHVybiBgTWlzc2luZyAke3R5cGV9OiBcIiR7Y2hhcn1cIiAtIHVzZSBcIlxcXFxcXFxcJHtjaGFyfVwiIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc2A7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxuY29uc3QgcGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgaW5wdXQgPSBSRVBMQUNFTUVOVFNbaW5wdXRdIHx8IGlucHV0O1xuXG4gIGNvbnN0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgY29uc3QgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG5cbiAgbGV0IGxlbiA9IGlucHV0Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoOiAke2xlbn0sIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGxlbmd0aDogJHttYXh9YCk7XG4gIH1cblxuICBjb25zdCBib3MgPSB7IHR5cGU6ICdib3MnLCB2YWx1ZTogJycsIG91dHB1dDogb3B0cy5wcmVwZW5kIHx8ICcnIH07XG4gIGNvbnN0IHRva2VucyA9IFtib3NdO1xuXG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHdpbjMyID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuXG4gIC8vIGNyZWF0ZSBjb25zdGFudHMgYmFzZWQgb24gcGxhdGZvcm0sIGZvciB3aW5kb3dzIG9yIHBvc2l4XG4gIGNvbnN0IFBMQVRGT1JNX0NIQVJTID0gY29uc3RhbnRzLmdsb2JDaGFycyh3aW4zMik7XG4gIGNvbnN0IEVYVEdMT0JfQ0hBUlMgPSBjb25zdGFudHMuZXh0Z2xvYkNoYXJzKFBMQVRGT1JNX0NIQVJTKTtcblxuICBjb25zdCB7XG4gICAgRE9UX0xJVEVSQUwsXG4gICAgUExVU19MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UX1NMQVNILFxuICAgIE5PX0RPVFNfU0xBU0gsXG4gICAgUU1BUkssXG4gICAgUU1BUktfTk9fRE9ULFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBQTEFURk9STV9DSEFSUztcblxuICBjb25zdCBnbG9ic3RhciA9IG9wdHMgPT4ge1xuICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMuZG90ID8gRE9UU19TTEFTSCA6IERPVF9MSVRFUkFMfSkuKSo/KWA7XG4gIH07XG5cbiAgY29uc3Qgbm9kb3QgPSBvcHRzLmRvdCA/ICcnIDogTk9fRE9UO1xuICBjb25zdCBxbWFya05vRG90ID0gb3B0cy5kb3QgPyBRTUFSSyA6IFFNQVJLX05PX0RPVDtcbiAgbGV0IHN0YXIgPSBvcHRzLmJhc2ggPT09IHRydWUgPyBnbG9ic3RhcihvcHRzKSA6IFNUQVI7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgIHN0YXIgPSBgKCR7c3Rhcn0pYDtcbiAgfVxuXG4gIC8vIG1pbmltYXRjaCBvcHRpb25zIHN1cHBvcnRcbiAgaWYgKHR5cGVvZiBvcHRzLm5vZXh0ID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRzLm5vZXh0Z2xvYiA9IG9wdHMubm9leHQ7XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBpbnB1dCxcbiAgICBpbmRleDogLTEsXG4gICAgc3RhcnQ6IDAsXG4gICAgZG90OiBvcHRzLmRvdCA9PT0gdHJ1ZSxcbiAgICBjb25zdW1lZDogJycsXG4gICAgb3V0cHV0OiAnJyxcbiAgICBwcmVmaXg6ICcnLFxuICAgIGJhY2t0cmFjazogZmFsc2UsXG4gICAgbmVnYXRlZDogZmFsc2UsXG4gICAgYnJhY2tldHM6IDAsXG4gICAgYnJhY2VzOiAwLFxuICAgIHBhcmVuczogMCxcbiAgICBxdW90ZXM6IDAsXG4gICAgZ2xvYnN0YXI6IGZhbHNlLFxuICAgIHRva2Vuc1xuICB9O1xuXG4gIGlucHV0ID0gdXRpbHMucmVtb3ZlUHJlZml4KGlucHV0LCBzdGF0ZSk7XG4gIGxlbiA9IGlucHV0Lmxlbmd0aDtcblxuICBjb25zdCBleHRnbG9icyA9IFtdO1xuICBjb25zdCBicmFjZXMgPSBbXTtcbiAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgbGV0IHByZXYgPSBib3M7XG4gIGxldCB2YWx1ZTtcblxuICAvKipcbiAgICogVG9rZW5pemluZyBoZWxwZXJzXG4gICAqL1xuXG4gIGNvbnN0IGVvcyA9ICgpID0+IHN0YXRlLmluZGV4ID09PSBsZW4gLSAxO1xuICBjb25zdCBwZWVrID0gc3RhdGUucGVlayA9IChuID0gMSkgPT4gaW5wdXRbc3RhdGUuaW5kZXggKyBuXTtcbiAgY29uc3QgYWR2YW5jZSA9IHN0YXRlLmFkdmFuY2UgPSAoKSA9PiBpbnB1dFsrK3N0YXRlLmluZGV4XSB8fCAnJztcbiAgY29uc3QgcmVtYWluaW5nID0gKCkgPT4gaW5wdXQuc2xpY2Uoc3RhdGUuaW5kZXggKyAxKTtcbiAgY29uc3QgY29uc3VtZSA9ICh2YWx1ZSA9ICcnLCBudW0gPSAwKSA9PiB7XG4gICAgc3RhdGUuY29uc3VtZWQgKz0gdmFsdWU7XG4gICAgc3RhdGUuaW5kZXggKz0gbnVtO1xuICB9O1xuXG4gIGNvbnN0IGFwcGVuZCA9IHRva2VuID0+IHtcbiAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcbiAgICBjb25zdW1lKHRva2VuLnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBuZWdhdGUgPSAoKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMTtcblxuICAgIHdoaWxlIChwZWVrKCkgPT09ICchJyAmJiAocGVlaygyKSAhPT0gJygnIHx8IHBlZWsoMykgPT09ICc/JykpIHtcbiAgICAgIGFkdmFuY2UoKTtcbiAgICAgIHN0YXRlLnN0YXJ0Kys7XG4gICAgICBjb3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb3VudCAlIDIgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0ZS5uZWdhdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydCsrO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGluY3JlbWVudCA9IHR5cGUgPT4ge1xuICAgIHN0YXRlW3R5cGVdKys7XG4gICAgc3RhY2sucHVzaCh0eXBlKTtcbiAgfTtcblxuICBjb25zdCBkZWNyZW1lbnQgPSB0eXBlID0+IHtcbiAgICBzdGF0ZVt0eXBlXS0tO1xuICAgIHN0YWNrLnBvcCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdXNoIHRva2VucyBvbnRvIHRoZSB0b2tlbnMgYXJyYXkuIFRoaXMgaGVscGVyIHNwZWVkcyB1cFxuICAgKiB0b2tlbml6aW5nIGJ5IDEpIGhlbHBpbmcgdXMgYXZvaWQgYmFja3RyYWNraW5nIGFzIG11Y2ggYXMgcG9zc2libGUsXG4gICAqIGFuZCAyKSBoZWxwaW5nIHVzIGF2b2lkIGNyZWF0aW5nIGV4dHJhIHRva2VucyB3aGVuIGNvbnNlY3V0aXZlXG4gICAqIGNoYXJhY3RlcnMgYXJlIHBsYWluIHRleHQuIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYW5kIHNpbXBsaWZpZXNcbiAgICogbG9va2JlaGluZHMuXG4gICAqL1xuXG4gIGNvbnN0IHB1c2ggPSB0b2sgPT4ge1xuICAgIGlmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicpIHtcbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmICh0b2sudHlwZSA9PT0gJ2NvbW1hJyB8fCB0b2sudHlwZSA9PT0gJ2JyYWNlJyk7XG4gICAgICBjb25zdCBpc0V4dGdsb2IgPSB0b2suZXh0Z2xvYiA9PT0gdHJ1ZSB8fCAoZXh0Z2xvYnMubGVuZ3RoICYmICh0b2sudHlwZSA9PT0gJ3BpcGUnIHx8IHRvay50eXBlID09PSAncGFyZW4nKSk7XG5cbiAgICAgIGlmICh0b2sudHlwZSAhPT0gJ3NsYXNoJyAmJiB0b2sudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTtcbiAgICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgICBwcmV2LnZhbHVlID0gJyonO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0Z2xvYnMubGVuZ3RoICYmIHRvay50eXBlICE9PSAncGFyZW4nKSB7XG4gICAgICBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXS5pbm5lciArPSB0b2sudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRvay52YWx1ZSB8fCB0b2sub3V0cHV0KSBhcHBlbmQodG9rKTtcbiAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICd0ZXh0JyAmJiB0b2sudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBwcmV2LnZhbHVlICs9IHRvay52YWx1ZTtcbiAgICAgIHByZXYub3V0cHV0ID0gKHByZXYub3V0cHV0IHx8ICcnKSArIHRvay52YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2sucHJldiA9IHByZXY7XG4gICAgdG9rZW5zLnB1c2godG9rKTtcbiAgICBwcmV2ID0gdG9rO1xuICB9O1xuXG4gIGNvbnN0IGV4dGdsb2JPcGVuID0gKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSB7IC4uLkVYVEdMT0JfQ0hBUlNbdmFsdWVdLCBjb25kaXRpb25zOiAxLCBpbm5lcjogJycgfTtcblxuICAgIHRva2VuLnByZXYgPSBwcmV2O1xuICAgIHRva2VuLnBhcmVucyA9IHN0YXRlLnBhcmVucztcbiAgICB0b2tlbi5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQ7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMuY2FwdHVyZSA/ICcoJyA6ICcnKSArIHRva2VuLm9wZW47XG5cbiAgICBpbmNyZW1lbnQoJ3BhcmVucycpO1xuICAgIHB1c2goeyB0eXBlLCB2YWx1ZSwgb3V0cHV0OiBzdGF0ZS5vdXRwdXQgPyAnJyA6IE9ORV9DSEFSIH0pO1xuICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCBleHRnbG9iOiB0cnVlLCB2YWx1ZTogYWR2YW5jZSgpLCBvdXRwdXQgfSk7XG4gICAgZXh0Z2xvYnMucHVzaCh0b2tlbik7XG4gIH07XG5cbiAgY29uc3QgZXh0Z2xvYkNsb3NlID0gdG9rZW4gPT4ge1xuICAgIGxldCBvdXRwdXQgPSB0b2tlbi5jbG9zZSArIChvcHRzLmNhcHR1cmUgPyAnKScgOiAnJyk7XG4gICAgbGV0IHJlc3Q7XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ25lZ2F0ZScpIHtcbiAgICAgIGxldCBleHRnbG9iU3RhciA9IHN0YXI7XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lciAmJiB0b2tlbi5pbm5lci5sZW5ndGggPiAxICYmIHRva2VuLmlubmVyLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgZXh0Z2xvYlN0YXIgPSBnbG9ic3RhcihvcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dGdsb2JTdGFyICE9PSBzdGFyIHx8IGVvcygpIHx8IC9eXFwpKyQvLnRlc3QocmVtYWluaW5nKCkpKSB7XG4gICAgICAgIG91dHB1dCA9IHRva2VuLmNsb3NlID0gYCkkKSkke2V4dGdsb2JTdGFyfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5pbm5lci5pbmNsdWRlcygnKicpICYmIChyZXN0ID0gcmVtYWluaW5nKCkpICYmIC9eXFwuW15cXFxcLy5dKyQvLnRlc3QocmVzdCkpIHtcbiAgICAgICAgLy8gQW55IG5vbi1tYWdpY2FsIHN0cmluZyAoYC50c2ApIG9yIGV2ZW4gbmVzdGVkIGV4cHJlc3Npb24gKGAue3RzLHRzeH1gKSBjYW4gZm9sbG93IGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gcGFyc2UgdGhlIHN0cmluZyBhbmQgdXNlIGl0IGluIHRoZSBvdXRwdXQgb2YgdGhlIG9yaWdpbmFsIHBhdHRlcm4uXG4gICAgICAgIC8vIFN1aXRhYmxlIHBhdHRlcm5zOiBgLyEoKi5kKS50c2AsIGAvISgqLmQpLnt0cyx0c3h9YCwgYCoqLyEoKi1kYmcpLkAoanMpYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRGlzYWJsaW5nIHRoZSBgZmFzdHBhdGhzYCBvcHRpb24gZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHBhcnNpbmcgc3RyaW5ncyBhcyBgLnRzYCBpbiB0aGUgcGF0dGVybiBsaWtlIGAqKi8hKCouZCkudHNgLlxuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFyc2UocmVzdCwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pLm91dHB1dDtcblxuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJHtleHByZXNzaW9ufSkke2V4dGdsb2JTdGFyfSlgO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ucHJldi50eXBlID09PSAnYm9zJykge1xuICAgICAgICBzdGF0ZS5uZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfTtcblxuICAvKipcbiAgICogRmFzdCBwYXRoc1xuICAgKi9cblxuICBpZiAob3B0cy5mYXN0cGF0aHMgIT09IGZhbHNlICYmICEvKF5bKiFdfFsvKClbXFxde31cIl0pLy50ZXN0KGlucHV0KSkge1xuICAgIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuXG4gICAgbGV0IG91dHB1dCA9IGlucHV0LnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLCAobSwgZXNjLCBjaGFycywgZmlyc3QsIHJlc3QsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmlyc3QgPT09ICdcXFxcJykge1xuICAgICAgICBiYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICc/Jykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBxbWFya05vRG90ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBRTUFSSy5yZXBlYXQoY2hhcnMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIERPVF9MSVRFUkFMLnJlcGVhdChjaGFycy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICcqJykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBzdGFyIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVzYyA/IG0gOiBgXFxcXCR7bX1gO1xuICAgIH0pO1xuXG4gICAgaWYgKGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXCsvZywgbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoICUgMiA9PT0gMCA/ICdcXFxcXFxcXCcgOiAobSA/ICdcXFxcJyA6ICcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG91dHB1dCA9PT0gaW5wdXQgJiYgb3B0cy5jb250YWlucyA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdGUub3V0cHV0ID0gaW5wdXQ7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMud3JhcE91dHB1dChvdXRwdXQsIHN0YXRlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogVG9rZW5pemUgaW5wdXQgdW50aWwgd2UgcmVhY2ggZW5kLW9mLXN0cmluZ1xuICAgKi9cblxuICB3aGlsZSAoIWVvcygpKSB7XG4gICAgdmFsdWUgPSBhZHZhbmNlKCk7XG5cbiAgICBpZiAodmFsdWUgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcXFxcJykge1xuICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTtcblxuICAgICAgaWYgKG5leHQgPT09ICcvJyAmJiBvcHRzLmJhc2ggIT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0ID09PSAnLicgfHwgbmV4dCA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbGxhcHNlIHNsYXNoZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBmb3IgZXhwbG9pdHNcbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXFxcKy8uZXhlYyhyZW1haW5pbmcoKSk7XG4gICAgICBsZXQgc2xhc2hlcyA9IDA7XG5cbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXS5sZW5ndGggPiAyKSB7XG4gICAgICAgIHNsYXNoZXMgPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmluZGV4ICs9IHNsYXNoZXM7XG4gICAgICAgIGlmIChzbGFzaGVzICUgMiAhPT0gMCkge1xuICAgICAgICAgIHZhbHVlICs9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB3ZSdyZSBpbnNpZGUgYSByZWdleCBjaGFyYWN0ZXIgY2xhc3MsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgYnJhY2tldC5cbiAgICAgKi9cblxuICAgIGlmIChzdGF0ZS5icmFja2V0cyA+IDAgJiYgKHZhbHVlICE9PSAnXScgfHwgcHJldi52YWx1ZSA9PT0gJ1snIHx8IHByZXYudmFsdWUgPT09ICdbXicpKSB7XG4gICAgICBpZiAob3B0cy5wb3NpeCAhPT0gZmFsc2UgJiYgdmFsdWUgPT09ICc6Jykge1xuICAgICAgICBjb25zdCBpbm5lciA9IHByZXYudmFsdWUuc2xpY2UoMSk7XG4gICAgICAgIGlmIChpbm5lci5pbmNsdWRlcygnWycpKSB7XG4gICAgICAgICAgcHJldi5wb3NpeCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoaW5uZXIuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gcHJldi52YWx1ZS5sYXN0SW5kZXhPZignWycpO1xuICAgICAgICAgICAgY29uc3QgcHJlID0gcHJldi52YWx1ZS5zbGljZSgwLCBpZHgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdCA9IHByZXYudmFsdWUuc2xpY2UoaWR4ICsgMik7XG4gICAgICAgICAgICBjb25zdCBwb3NpeCA9IFBPU0lYX1JFR0VYX1NPVVJDRVtyZXN0XTtcbiAgICAgICAgICAgIGlmIChwb3NpeCkge1xuICAgICAgICAgICAgICBwcmV2LnZhbHVlID0gcHJlICsgcG9zaXg7XG4gICAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGFkdmFuY2UoKTtcblxuICAgICAgICAgICAgICBpZiAoIWJvcy5vdXRwdXQgJiYgdG9rZW5zLmluZGV4T2YocHJldikgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBib3Mub3V0cHV0ID0gT05FX0NIQVI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgodmFsdWUgPT09ICdbJyAmJiBwZWVrKCkgIT09ICc6JykgfHwgKHZhbHVlID09PSAnLScgJiYgcGVlaygpID09PSAnXScpKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gJ10nICYmIChwcmV2LnZhbHVlID09PSAnWycgfHwgcHJldi52YWx1ZSA9PT0gJ1teJykpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMucG9zaXggPT09IHRydWUgJiYgdmFsdWUgPT09ICchJyAmJiBwcmV2LnZhbHVlID09PSAnWycpIHtcbiAgICAgICAgdmFsdWUgPSAnXic7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcsIGNvbnRpbnVlXG4gICAgICogdW50aWwgd2UgcmVhY2ggdGhlIGNsb3NpbmcgZG91YmxlIHF1b3RlLlxuICAgICAqL1xuXG4gICAgaWYgKHN0YXRlLnF1b3RlcyA9PT0gMSAmJiB2YWx1ZSAhPT0gJ1wiJykge1xuICAgICAgdmFsdWUgPSB1dGlscy5lc2NhcGVSZWdleCh2YWx1ZSk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3VibGUgcXVvdGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdcIicpIHtcbiAgICAgIHN0YXRlLnF1b3RlcyA9IHN0YXRlLnF1b3RlcyA9PT0gMSA/IDAgOiAxO1xuICAgICAgaWYgKG9wdHMua2VlcFF1b3RlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcmVudGhlc2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcoJykge1xuICAgICAgaW5jcmVtZW50KCdwYXJlbnMnKTtcbiAgICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJyknKSB7XG4gICAgICBpZiAoc3RhdGUucGFyZW5zID09PSAwICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdvcGVuaW5nJywgJygnKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGdsb2IgPSBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChleHRnbG9iICYmIHN0YXRlLnBhcmVucyA9PT0gZXh0Z2xvYi5wYXJlbnMgKyAxKSB7XG4gICAgICAgIGV4dGdsb2JDbG9zZShleHRnbG9icy5wb3AoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgdmFsdWUsIG91dHB1dDogc3RhdGUucGFyZW5zID8gJyknIDogJ1xcXFwpJyB9KTtcbiAgICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcXVhcmUgYnJhY2tldHNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1snKSB7XG4gICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgIXJlbWFpbmluZygpLmluY2x1ZGVzKCddJykpIHtcbiAgICAgICAgaWYgKG9wdHMubm9icmFja2V0ICE9PSB0cnVlICYmIG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnXScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmNyZW1lbnQoJ2JyYWNrZXRzJyk7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnYnJhY2tldCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnXScpIHtcbiAgICAgIGlmIChvcHRzLm5vYnJhY2tldCA9PT0gdHJ1ZSB8fCAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdicmFja2V0JyAmJiBwcmV2LnZhbHVlLmxlbmd0aCA9PT0gMSkpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogYFxcXFwke3ZhbHVlfWAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ29wZW5pbmcnLCAnWycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IGBcXFxcJHt2YWx1ZX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVjcmVtZW50KCdicmFja2V0cycpO1xuXG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBwcmV2LnZhbHVlLnNsaWNlKDEpO1xuICAgICAgaWYgKHByZXYucG9zaXggIT09IHRydWUgJiYgcHJldlZhbHVlWzBdID09PSAnXicgJiYgIXByZXZWYWx1ZS5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIHZhbHVlID0gYC8ke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBhcHBlbmQoeyB2YWx1ZSB9KTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgICAvLyBhc3N1bWUgd2Ugc2hvdWxkIG1hdGNoIHdpdGggYSByZWdleCBjaGFyYWN0ZXIgY2xhc3NcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gZmFsc2UgfHwgdXRpbHMuaGFzUmVnZXhDaGFycyhwcmV2VmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlc2NhcGVkID0gdXRpbHMuZXNjYXBlUmVnZXgocHJldi52YWx1ZSk7XG4gICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYudmFsdWUubGVuZ3RoKTtcblxuICAgICAgLy8gd2hlbiBsaXRlcmFsIGJyYWNrZXRzIGFyZSBleHBsaWNpdGx5IGVuYWJsZWRcbiAgICAgIC8vIGFzc3VtZSB3ZSBzaG91bGQgZXNjYXBlIHRoZSBicmFja2V0cyB0byBtYXRjaCBsaXRlcmFsIGNoYXJhY3RlcnNcbiAgICAgIGlmIChvcHRzLmxpdGVyYWxCcmFja2V0cyA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gZXNjYXBlZDtcbiAgICAgICAgcHJldi52YWx1ZSA9IGVzY2FwZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB3aGVuIHRoZSB1c2VyIHNwZWNpZmllcyBub3RoaW5nLCB0cnkgdG8gbWF0Y2ggYm90aFxuICAgICAgcHJldi52YWx1ZSA9IGAoJHtjYXB0dXJlfSR7ZXNjYXBlZH18JHtwcmV2LnZhbHVlfSlgO1xuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYudmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcmFjZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ3snICYmIG9wdHMubm9icmFjZSAhPT0gdHJ1ZSkge1xuICAgICAgaW5jcmVtZW50KCdicmFjZXMnKTtcblxuICAgICAgY29uc3Qgb3BlbiA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG91dHB1dDogJygnLFxuICAgICAgICBvdXRwdXRJbmRleDogc3RhdGUub3V0cHV0Lmxlbmd0aCxcbiAgICAgICAgdG9rZW5zSW5kZXg6IHN0YXRlLnRva2Vucy5sZW5ndGhcbiAgICAgIH07XG5cbiAgICAgIGJyYWNlcy5wdXNoKG9wZW4pO1xuICAgICAgcHVzaChvcGVuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJ30nKSB7XG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChvcHRzLm5vYnJhY2UgPT09IHRydWUgfHwgIWJyYWNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG91dHB1dCA9ICcpJztcblxuICAgICAgaWYgKGJyYWNlLmRvdHMgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdG9rZW5zLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgPT09ICdicmFjZScpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXJyW2ldLnR5cGUgIT09ICdkb3RzJykge1xuICAgICAgICAgICAgcmFuZ2UudW5zaGlmdChhcnJbaV0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dCA9IGV4cGFuZFJhbmdlKHJhbmdlLCBvcHRzKTtcbiAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYWNlLmNvbW1hICE9PSB0cnVlICYmIGJyYWNlLmRvdHMgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIGJyYWNlLm91dHB1dEluZGV4KTtcbiAgICAgICAgY29uc3QgdG9rcyA9IHN0YXRlLnRva2Vucy5zbGljZShicmFjZS50b2tlbnNJbmRleCk7XG4gICAgICAgIGJyYWNlLnZhbHVlID0gYnJhY2Uub3V0cHV0ID0gJ1xcXFx7JztcbiAgICAgICAgdmFsdWUgPSBvdXRwdXQgPSAnXFxcXH0nO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBvdXQ7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0b2tzKSB7XG4gICAgICAgICAgc3RhdGUub3V0cHV0ICs9ICh0Lm91dHB1dCB8fCB0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2JyYWNlJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGRlY3JlbWVudCgnYnJhY2VzJyk7XG4gICAgICBicmFjZXMucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaXBlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnfCcpIHtcbiAgICAgIGlmIChleHRnbG9icy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV4dGdsb2JzW2V4dGdsb2JzLmxlbmd0aCAtIDFdLmNvbmRpdGlvbnMrKztcbiAgICAgIH1cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWFzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcsJykge1xuICAgICAgbGV0IG91dHB1dCA9IHZhbHVlO1xuXG4gICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoYnJhY2UgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09ICdicmFjZXMnKSB7XG4gICAgICAgIGJyYWNlLmNvbW1hID0gdHJ1ZTtcbiAgICAgICAgb3V0cHV0ID0gJ3wnO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2NvbW1hJywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNsYXNoZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJy8nKSB7XG4gICAgICAvLyBpZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnbG9iIGlzIFwiLi9cIiwgYWR2YW5jZSB0aGUgc3RhcnRcbiAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGluZGV4LCBhbmQgZG9uJ3QgYWRkIHRoZSBcIi4vXCIgY2hhcmFjdGVyc1xuICAgICAgLy8gdG8gdGhlIHN0YXRlLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyBsb29rYmVoaW5kcyB3aGVuXG4gICAgICAvLyBjaGVja2luZyBmb3IgQk9TIGNoYXJhY3RlcnMgbGlrZSBcIiFcIiBhbmQgXCIuXCIgKG5vdCBcIi4vXCIpXG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90JyAmJiBzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgKyAxKSB7XG4gICAgICAgIHN0YXRlLnN0YXJ0ID0gc3RhdGUuaW5kZXggKyAxO1xuICAgICAgICBzdGF0ZS5jb25zdW1lZCA9ICcnO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSAnJztcbiAgICAgICAgdG9rZW5zLnBvcCgpO1xuICAgICAgICBwcmV2ID0gYm9zOyAvLyByZXNldCBcInByZXZcIiB0byB0aGUgZmlyc3QgdG9rZW5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZSwgb3V0cHV0OiBTTEFTSF9MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG90c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLicpIHtcbiAgICAgIGlmIChzdGF0ZS5icmFjZXMgPiAwICYmIHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgaWYgKHByZXYudmFsdWUgPT09ICcuJykgcHJldi5vdXRwdXQgPSBET1RfTElURVJBTDtcbiAgICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBwcmV2LnR5cGUgPSAnZG90cyc7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IHZhbHVlO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBicmFjZS5kb3RzID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RhdGUuYnJhY2VzICsgc3RhdGUucGFyZW5zKSA9PT0gMCAmJiBwcmV2LnR5cGUgIT09ICdib3MnICYmIHByZXYudHlwZSAhPT0gJ3NsYXNoJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnZG90JywgdmFsdWUsIG91dHB1dDogRE9UX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVzdGlvbiBtYXJrc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnPycpIHtcbiAgICAgIGNvbnN0IGlzR3JvdXAgPSBwcmV2ICYmIHByZXYudmFsdWUgPT09ICcoJztcbiAgICAgIGlmICghaXNHcm91cCAmJiBvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgZXh0Z2xvYk9wZW4oJ3FtYXJrJywgdmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAncGFyZW4nKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwZWVrKCk7XG4gICAgICAgIGxldCBvdXRwdXQgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobmV4dCA9PT0gJzwnICYmICF1dGlscy5zdXBwb3J0c0xvb2tiZWhpbmRzKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vZGUuanMgdjEwIG9yIGhpZ2hlciBpcyByZXF1aXJlZCBmb3IgcmVnZXggbG9va2JlaGluZHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgocHJldi52YWx1ZSA9PT0gJygnICYmICEvWyE9PDpdLy50ZXN0KG5leHQpKSB8fCAobmV4dCA9PT0gJzwnICYmICEvPChbIT1dfFxcdys+KS8udGVzdChyZW1haW5pbmcoKSkpKSB7XG4gICAgICAgICAgb3V0cHV0ID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMuZG90ICE9PSB0cnVlICYmIChwcmV2LnR5cGUgPT09ICdzbGFzaCcgfHwgcHJldi50eXBlID09PSAnYm9zJykpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdxbWFyaycsIHZhbHVlLCBvdXRwdXQ6IFFNQVJLX05PX0RPVCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAncW1hcmsnLCB2YWx1ZSwgb3V0cHV0OiBRTUFSSyB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2xhbWF0aW9uXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICchJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnKSB7XG4gICAgICAgIGlmIChwZWVrKDIpICE9PSAnPycgfHwgIS9bIT08Ol0vLnRlc3QocGVlaygzKSkpIHtcbiAgICAgICAgICBleHRnbG9iT3BlbignbmVnYXRlJywgdmFsdWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLm5vbmVnYXRlICE9PSB0cnVlICYmIHN0YXRlLmluZGV4ID09PSAwKSB7XG4gICAgICAgIG5lZ2F0ZSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbHVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcrJykge1xuICAgICAgaWYgKG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBleHRnbG9iT3BlbigncGx1cycsIHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiBwcmV2LnZhbHVlID09PSAnKCcpIHx8IG9wdHMucmVnZXggPT09IGZhbHNlKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlLCBvdXRwdXQ6IFBMVVNfTElURVJBTCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJldiAmJiAocHJldi50eXBlID09PSAnYnJhY2tldCcgfHwgcHJldi50eXBlID09PSAncGFyZW4nIHx8IHByZXYudHlwZSA9PT0gJ2JyYWNlJykpIHx8IHN0YXRlLnBhcmVucyA+IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZTogUExVU19MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnQCcpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdhdCcsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0XG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgIT09ICcqJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnJCcgfHwgdmFsdWUgPT09ICdeJykge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaCA9IFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLmV4ZWMocmVtYWluaW5nKCkpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHZhbHVlICs9IG1hdGNoWzBdO1xuICAgICAgICBzdGF0ZS5pbmRleCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnNcbiAgICAgKi9cblxuICAgIGlmIChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdnbG9ic3RhcicgfHwgcHJldi5zdGFyID09PSB0cnVlKSkge1xuICAgICAgcHJldi50eXBlID0gJ3N0YXInO1xuICAgICAgcHJldi5zdGFyID0gdHJ1ZTtcbiAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICBwcmV2Lm91dHB1dCA9IHN0YXI7XG4gICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdCA9IHJlbWFpbmluZygpO1xuICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiAvXlxcKFteP10vLnRlc3QocmVzdCkpIHtcbiAgICAgIGV4dGdsb2JPcGVuKCdzdGFyJywgdmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYudHlwZSA9PT0gJ3N0YXInKSB7XG4gICAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpb3IgPSBwcmV2LnByZXY7XG4gICAgICBjb25zdCBiZWZvcmUgPSBwcmlvci5wcmV2O1xuICAgICAgY29uc3QgaXNTdGFydCA9IHByaW9yLnR5cGUgPT09ICdzbGFzaCcgfHwgcHJpb3IudHlwZSA9PT0gJ2Jvcyc7XG4gICAgICBjb25zdCBhZnRlclN0YXIgPSBiZWZvcmUgJiYgKGJlZm9yZS50eXBlID09PSAnc3RhcicgfHwgYmVmb3JlLnR5cGUgPT09ICdnbG9ic3RhcicpO1xuXG4gICAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlICYmICghaXNTdGFydCB8fCAocmVzdFswXSAmJiByZXN0WzBdICE9PSAnLycpKSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQnJhY2UgPSBzdGF0ZS5icmFjZXMgPiAwICYmIChwcmlvci50eXBlID09PSAnY29tbWEnIHx8IHByaW9yLnR5cGUgPT09ICdicmFjZScpO1xuICAgICAgY29uc3QgaXNFeHRnbG9iID0gZXh0Z2xvYnMubGVuZ3RoICYmIChwcmlvci50eXBlID09PSAncGlwZScgfHwgcHJpb3IudHlwZSA9PT0gJ3BhcmVuJyk7XG4gICAgICBpZiAoIWlzU3RhcnQgJiYgcHJpb3IudHlwZSAhPT0gJ3BhcmVuJyAmJiAhaXNCcmFjZSAmJiAhaXNFeHRnbG9iKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnc3RhcicsIHZhbHVlLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RyaXAgY29uc2VjdXRpdmUgYC8qKi9gXG4gICAgICB3aGlsZSAocmVzdC5zbGljZSgwLCAzKSA9PT0gJy8qKicpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSBpbnB1dFtzdGF0ZS5pbmRleCArIDRdO1xuICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIgIT09ICcvJykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3QgPSByZXN0LnNsaWNlKDMpO1xuICAgICAgICBjb25zdW1lKCcvKionLCAzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIGVvcygpKSB7XG4gICAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiAhYWZ0ZXJTdGFyICYmIGVvcygpKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpICsgKG9wdHMuc3RyaWN0U2xhc2hlcyA/ICcpJyA6ICd8JCknKTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQ7XG4gICAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdzbGFzaCcgJiYgcHJpb3IucHJldi50eXBlICE9PSAnYm9zJyAmJiByZXN0WzBdID09PSAnLycpIHtcbiAgICAgICAgY29uc3QgZW5kID0gcmVzdFsxXSAhPT0gdm9pZCAwID8gJ3wkJyA6ICcnO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtKHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0KS5sZW5ndGgpO1xuICAgICAgICBwcmlvci5vdXRwdXQgPSBgKD86JHtwcmlvci5vdXRwdXR9YDtcblxuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH18JHtTTEFTSF9MSVRFUkFMfSR7ZW5kfSlgO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuXG4gICAgICAgIHB1c2goeyB0eXBlOiAnc2xhc2gnLCB2YWx1ZTogJy8nLCBvdXRwdXQ6ICcnIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByaW9yLnR5cGUgPT09ICdib3MnICYmIHJlc3RbMF0gPT09ICcvJykge1xuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGAoPzpefCR7U0xBU0hfTElURVJBTH18JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KWA7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IHByZXYub3V0cHV0O1xuICAgICAgICBzdGF0ZS5nbG9ic3RhciA9IHRydWU7XG4gICAgICAgIGNvbnN1bWUodmFsdWUgKyBhZHZhbmNlKCkpO1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWU6ICcvJywgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbW92ZSBzaW5nbGUgc3RhciBmcm9tIG91dHB1dFxuICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2Lm91dHB1dC5sZW5ndGgpO1xuXG4gICAgICAvLyByZXNldCBwcmV2aW91cyB0b2tlbiB0byBnbG9ic3RhclxuICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgIHByZXYub3V0cHV0ID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuXG4gICAgICAvLyByZXNldCBvdXRwdXQgd2l0aCBnbG9ic3RhclxuICAgICAgc3RhdGUub3V0cHV0ICs9IHByZXYub3V0cHV0O1xuICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgY29uc3VtZSh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiBzdGFyIH07XG5cbiAgICBpZiAob3B0cy5iYXNoID09PSB0cnVlKSB7XG4gICAgICB0b2tlbi5vdXRwdXQgPSAnLio/JztcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdib3MnIHx8IHByZXYudHlwZSA9PT0gJ3NsYXNoJykge1xuICAgICAgICB0b2tlbi5vdXRwdXQgPSBub2RvdCArIHRva2VuLm91dHB1dDtcbiAgICAgIH1cbiAgICAgIHB1c2godG9rZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnIHx8IHByZXYudHlwZSA9PT0gJ3BhcmVuJykgJiYgb3B0cy5yZWdleCA9PT0gdHJ1ZSkge1xuICAgICAgdG9rZW4ub3V0cHV0ID0gdmFsdWU7XG4gICAgICBwdXNoKHRva2VuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5pbmRleCA9PT0gc3RhdGUuc3RhcnQgfHwgcHJldi50eXBlID09PSAnc2xhc2gnIHx8IHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBOT19ET1RfU0xBU0g7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVF9TTEFTSDtcblxuICAgICAgfSBlbHNlIGlmIChvcHRzLmRvdCA9PT0gdHJ1ZSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gTk9fRE9UU19TTEFTSDtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IG5vZG90O1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBub2RvdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBlZWsoKSAhPT0gJyonKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBPTkVfQ0hBUjtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gT05FX0NIQVI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh0b2tlbik7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2tldHMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICddJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnWycpO1xuICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICcpJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnKCcpO1xuICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUuYnJhY2VzID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnfScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJ3snKTtcbiAgICBkZWNyZW1lbnQoJ2JyYWNlcycpO1xuICB9XG5cbiAgaWYgKG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSAmJiAocHJldi50eXBlID09PSAnc3RhcicgfHwgcHJldi50eXBlID09PSAnYnJhY2tldCcpKSB7XG4gICAgcHVzaCh7IHR5cGU6ICdtYXliZV9zbGFzaCcsIHZhbHVlOiAnJywgb3V0cHV0OiBgJHtTTEFTSF9MSVRFUkFMfT9gIH0pO1xuICB9XG5cbiAgLy8gcmVidWlsZCB0aGUgb3V0cHV0IGlmIHdlIGhhZCB0byBiYWNrdHJhY2sgYXQgYW55IHBvaW50XG4gIGlmIChzdGF0ZS5iYWNrdHJhY2sgPT09IHRydWUpIHtcbiAgICBzdGF0ZS5vdXRwdXQgPSAnJztcblxuICAgIGZvciAoY29uc3QgdG9rZW4gb2Ygc3RhdGUudG9rZW5zKSB7XG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4ub3V0cHV0ICE9IG51bGwgPyB0b2tlbi5vdXRwdXQgOiB0b2tlbi52YWx1ZTtcblxuICAgICAgaWYgKHRva2VuLnN1ZmZpeCkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gdG9rZW4uc3VmZml4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogRmFzdCBwYXRocyBmb3IgY3JlYXRpbmcgcmVndWxhciBleHByZXNzaW9ucyBmb3IgY29tbW9uIGdsb2IgcGF0dGVybnMuXG4gKiBUaGlzIGNhbiBzaWduaWZpY2FudGx5IHNwZWVkIHVwIHByb2Nlc3NpbmcgYW5kIGhhcyB2ZXJ5IGxpdHRsZSBkb3duc2lkZVxuICogaW1wYWN0IHdoZW4gbm9uZSBvZiB0aGUgZmFzdCBwYXRocyBtYXRjaC5cbiAqL1xuXG5wYXJzZS5mYXN0cGF0aHMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcbiAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBpZiAobGVuID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGg6ICR7bGVufSwgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoOiAke21heH1gKTtcbiAgfVxuXG4gIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDtcbiAgY29uc3Qgd2luMzIgPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG5cbiAgLy8gY3JlYXRlIGNvbnN0YW50cyBiYXNlZCBvbiBwbGF0Zm9ybSwgZm9yIHdpbmRvd3Mgb3IgcG9zaXhcbiAgY29uc3Qge1xuICAgIERPVF9MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UUyxcbiAgICBOT19ET1RTX1NMQVNILFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBjb25zdGFudHMuZ2xvYkNoYXJzKHdpbjMyKTtcblxuICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gTk9fRE9UUyA6IE5PX0RPVDtcbiAgY29uc3Qgc2xhc2hEb3QgPSBvcHRzLmRvdCA/IE5PX0RPVFNfU0xBU0ggOiBOT19ET1Q7XG4gIGNvbnN0IGNhcHR1cmUgPSBvcHRzLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gIGNvbnN0IHN0YXRlID0geyBuZWdhdGVkOiBmYWxzZSwgcHJlZml4OiAnJyB9O1xuICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/ICcuKj8nIDogU1RBUjtcblxuICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgc3RhciA9IGAoJHtzdGFyfSlgO1xuICB9XG5cbiAgY29uc3QgZ2xvYnN0YXIgPSBvcHRzID0+IHtcbiAgICBpZiAob3B0cy5ub2dsb2JzdGFyID09PSB0cnVlKSByZXR1cm4gc3RhcjtcbiAgICByZXR1cm4gYCgke2NhcHR1cmV9KD86KD8hJHtTVEFSVF9BTkNIT1J9JHtvcHRzLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZSA9IHN0ciA9PiB7XG4gICAgc3dpdGNoIChzdHIpIHtcbiAgICAgIGNhc2UgJyonOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnLionOlxuICAgICAgICByZXR1cm4gYCR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKi4qJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7c3Rhcn0ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyovKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke3N0YXJ9JHtTTEFTSF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzbGFzaERvdH0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKionOlxuICAgICAgICByZXR1cm4gbm9kb3QgKyBnbG9ic3RhcihvcHRzKTtcblxuICAgICAgY2FzZSAnKiovKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7c2xhc2hEb3R9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKiovKi4qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke3N0YXJ9JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKi8uKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4qPylcXC4oXFx3KykkLy5leGVjKHN0cik7XG4gICAgICAgIGlmICghbWF0Y2gpIHJldHVybjtcblxuICAgICAgICBjb25zdCBzb3VyY2UgPSBjcmVhdGUobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBzb3VyY2UgKyBET1RfTElURVJBTCArIG1hdGNoWzJdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXQgPSB1dGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHN0YXRlKTtcbiAgbGV0IHNvdXJjZSA9IGNyZWF0ZShvdXRwdXQpO1xuXG4gIGlmIChzb3VyY2UgJiYgb3B0cy5zdHJpY3RTbGFzaGVzICE9PSB0cnVlKSB7XG4gICAgc291cmNlICs9IGAke1NMQVNIX0xJVEVSQUx9P2A7XG4gIH1cblxuICByZXR1cm4gc291cmNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBzY2FuID0gcmVxdWlyZSgnLi9zY2FuJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IGlzT2JqZWN0ID0gdmFsID0+IHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRjaGVyIGZ1bmN0aW9uIGZyb20gb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy4gVGhlXG4gKiByZXR1cm5lZCBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyB0byBtYXRjaCBhcyBpdHMgZmlyc3QgYXJndW1lbnQsXG4gKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC4gVGhlIHJldHVybmVkIG1hdGNoZXJcbiAqIGZ1bmN0aW9uIGFsc28gdGFrZXMgYSBib29sZWFuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdGhhdCwgd2hlbiB0cnVlLFxuICogcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaChnbG9iWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IGlzTWF0Y2ggPSBwaWNvbWF0Y2goJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQG5hbWUgcGljb21hdGNoXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGdsb2JzYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLlxuICogQHBhcmFtIHtPYmplY3Q9fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9uPX0gUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHBpY29tYXRjaCA9IChnbG9iLCBvcHRpb25zLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGdsb2IpKSB7XG4gICAgY29uc3QgZm5zID0gZ2xvYi5tYXAoaW5wdXQgPT4gcGljb21hdGNoKGlucHV0LCBvcHRpb25zLCByZXR1cm5TdGF0ZSkpO1xuICAgIGNvbnN0IGFycmF5TWF0Y2hlciA9IHN0ciA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgZm5zKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNNYXRjaChzdHIpO1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheU1hdGNoZXI7XG4gIH1cblxuICBjb25zdCBpc1N0YXRlID0gaXNPYmplY3QoZ2xvYikgJiYgZ2xvYi50b2tlbnMgJiYgZ2xvYi5pbnB1dDtcblxuICBpZiAoZ2xvYiA9PT0gJycgfHwgKHR5cGVvZiBnbG9iICE9PSAnc3RyaW5nJyAmJiAhaXNTdGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBwYXR0ZXJuIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuICBjb25zdCByZWdleCA9IGlzU3RhdGVcbiAgICA/IHBpY29tYXRjaC5jb21waWxlUmUoZ2xvYiwgb3B0aW9ucylcbiAgICA6IHBpY29tYXRjaC5tYWtlUmUoZ2xvYiwgb3B0aW9ucywgZmFsc2UsIHRydWUpO1xuXG4gIGNvbnN0IHN0YXRlID0gcmVnZXguc3RhdGU7XG4gIGRlbGV0ZSByZWdleC5zdGF0ZTtcblxuICBsZXQgaXNJZ25vcmVkID0gKCkgPT4gZmFsc2U7XG4gIGlmIChvcHRzLmlnbm9yZSkge1xuICAgIGNvbnN0IGlnbm9yZU9wdHMgPSB7IC4uLm9wdGlvbnMsIGlnbm9yZTogbnVsbCwgb25NYXRjaDogbnVsbCwgb25SZXN1bHQ6IG51bGwgfTtcbiAgICBpc0lnbm9yZWQgPSBwaWNvbWF0Y2gob3B0cy5pZ25vcmUsIGlnbm9yZU9wdHMsIHJldHVyblN0YXRlKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXIgPSAoaW5wdXQsIHJldHVybk9iamVjdCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBpc01hdGNoLCBtYXRjaCwgb3V0cHV0IH0gPSBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHsgZ2xvYiwgcG9zaXggfSk7XG4gICAgY29uc3QgcmVzdWx0ID0geyBnbG9iLCBzdGF0ZSwgcmVnZXgsIHBvc2l4LCBpbnB1dCwgb3V0cHV0LCBtYXRjaCwgaXNNYXRjaCB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRzLm9uUmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRzLm9uUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF0Y2ggPT09IGZhbHNlKSB7XG4gICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0lnbm9yZWQoaW5wdXQpKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMub25JZ25vcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0cy5vbklnbm9yZShyZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmlzTWF0Y2ggPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMub25NYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0cy5vbk1hdGNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiB0cnVlO1xuICB9O1xuXG4gIGlmIChyZXR1cm5TdGF0ZSkge1xuICAgIG1hdGNoZXIuc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVyO1xufTtcblxuLyoqXG4gKiBUZXN0IGBpbnB1dGAgd2l0aCB0aGUgZ2l2ZW4gYHJlZ2V4YC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBtYWluXG4gKiBgcGljb21hdGNoKClgIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gudGVzdChpbnB1dCwgcmVnZXhbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLnRlc3QoJ2Zvby9iYXInLCAvXig/OihbXi9dKj8pXFwvKFteL10qPykpJC8pKTtcbiAqIC8vIHsgaXNNYXRjaDogdHJ1ZSwgbWF0Y2g6IFsgJ2Zvby8nLCAnZm9vJywgJ2JhcicgXSwgb3V0cHV0OiAnZm9vL2JhcicgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBgcmVnZXhgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWF0Y2hpbmcgaW5mby5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnRlc3QgPSAoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCB7IGdsb2IsIHBvc2l4IH0gPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGlucHV0IHRvIGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgcmV0dXJuIHsgaXNNYXRjaDogZmFsc2UsIG91dHB1dDogJycgfTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBmb3JtYXQgPSBvcHRzLmZvcm1hdCB8fCAocG9zaXggPyB1dGlscy50b1Bvc2l4U2xhc2hlcyA6IG51bGwpO1xuICBsZXQgbWF0Y2ggPSBpbnB1dCA9PT0gZ2xvYjtcbiAgbGV0IG91dHB1dCA9IChtYXRjaCAmJiBmb3JtYXQpID8gZm9ybWF0KGlucHV0KSA6IGlucHV0O1xuXG4gIGlmIChtYXRjaCA9PT0gZmFsc2UpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXQgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7XG4gICAgbWF0Y2ggPSBvdXRwdXQgPT09IGdsb2I7XG4gIH1cblxuICBpZiAobWF0Y2ggPT09IGZhbHNlIHx8IG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChvcHRzLm1hdGNoQmFzZSA9PT0gdHJ1ZSB8fCBvcHRzLmJhc2VuYW1lID09PSB0cnVlKSB7XG4gICAgICBtYXRjaCA9IHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCBwb3NpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhvdXRwdXQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzTWF0Y2g6IEJvb2xlYW4obWF0Y2gpLCBtYXRjaCwgb3V0cHV0IH07XG59O1xuXG4vKipcbiAqIE1hdGNoIHRoZSBiYXNlbmFtZSBvZiBhIGZpbGVwYXRoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5tYXRjaEJhc2UoaW5wdXQsIGdsb2JbLCBvcHRpb25zXSk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gubWF0Y2hCYXNlKCdmb28vYmFyLmpzJywgJyouanMnKTsgLy8gdHJ1ZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gYGdsb2JgIEdsb2IgcGF0dGVybiBvciByZWdleCBjcmVhdGVkIGJ5IFsubWFrZVJlXSgjbWFrZVJlKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5tYXRjaEJhc2UgPSAoaW5wdXQsIGdsb2IsIG9wdGlvbnMsIHBvc2l4ID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gZ2xvYiBpbnN0YW5jZW9mIFJlZ0V4cCA/IGdsb2IgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMpO1xuICByZXR1cm4gcmVnZXgudGVzdChwYXRoLmJhc2VuYW1lKGlucHV0KSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFueSoqIG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AgbWF0Y2ggdGhlIHNwZWNpZmllZCBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2guaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCBbJ2IuKicsICcqLmEnXSkpOyAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5pc01hdGNoKCdhLmEnLCAnYi4qJykpOyAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBzdHIgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHBhdHRlcm5zIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybnMsIG9wdGlvbnMpKHN0cik7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3QgcmVzdWx0ID0gcGljb21hdGNoLnBhcnNlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB1c2VmdWwgcHJvcGVydGllcyBhbmQgb3V0cHV0IHRvIGJlIHVzZWQgYXMgYSByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gucGFyc2UgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkgcmV0dXJuIHBhdHRlcm4ubWFwKHAgPT4gcGljb21hdGNoLnBhcnNlKHAsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHBhcnNlKHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgZmFzdHBhdGhzOiBmYWxzZSB9KTtcbn07XG5cbi8qKlxuICogU2NhbiBhIGdsb2IgcGF0dGVybiB0byBzZXBhcmF0ZSB0aGUgcGF0dGVybiBpbnRvIHNlZ21lbnRzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC5zY2FuKGlucHV0Wywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IHBpY29tYXRjaC5zY2FuKCchLi9mb28vKi5qcycpO1xuICogY29uc29sZS5sb2cocmVzdWx0KTtcbiAqIHsgcHJlZml4OiAnIS4vJyxcbiAqICAgaW5wdXQ6ICchLi9mb28vKi5qcycsXG4gKiAgIHN0YXJ0OiAzLFxuICogICBiYXNlOiAnZm9vJyxcbiAqICAgZ2xvYjogJyouanMnLFxuICogICBpc0JyYWNlOiBmYWxzZSxcbiAqICAgaXNCcmFja2V0OiBmYWxzZSxcbiAqICAgaXNHbG9iOiB0cnVlLFxuICogICBpc0V4dGdsb2I6IGZhbHNlLFxuICogICBpc0dsb2JzdGFyOiBmYWxzZSxcbiAqICAgbmVnYXRlZDogdHJ1ZSB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEdsb2IgcGF0dGVybiB0byBzY2FuLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5zY2FuID0gKGlucHV0LCBvcHRpb25zKSA9PiBzY2FuKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGBzdGF0ZWAgb2JqZWN0IHJldHVybmVkIGJ5IHRoZVxuICogW3BhcnNlKCldKCNwYXJzZSkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5PdXRwdXRgIEludGVuZGVkIGZvciBpbXBsZW1lbnRvcnMsIHRoaXMgYXJndW1lbnQgYWxsb3dzIHlvdSB0byByZXR1cm4gdGhlIHJhdyBvdXRwdXQgZnJvbSB0aGUgcGFyc2VyLlxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuU3RhdGVgIEFkZHMgdGhlIHN0YXRlIHRvIGEgYHN0YXRlYCBwcm9wZXJ0eSBvbiB0aGUgcmV0dXJuZWQgcmVnZXguIFVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIGFuZCBkZWJ1Z2dpbmcuXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC5jb21waWxlUmUgPSAoc3RhdGUsIG9wdGlvbnMsIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChyZXR1cm5PdXRwdXQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gc3RhdGUub3V0cHV0O1xuICB9XG5cbiAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IHByZXBlbmQgPSBvcHRzLmNvbnRhaW5zID8gJycgOiAnXic7XG4gIGNvbnN0IGFwcGVuZCA9IG9wdHMuY29udGFpbnMgPyAnJyA6ICckJztcblxuICBsZXQgc291cmNlID0gYCR7cHJlcGVuZH0oPzoke3N0YXRlLm91dHB1dH0pJHthcHBlbmR9YDtcbiAgaWYgKHN0YXRlICYmIHN0YXRlLm5lZ2F0ZWQgPT09IHRydWUpIHtcbiAgICBzb3VyY2UgPSBgXig/ISR7c291cmNlfSkuKiRgO1xuICB9XG5cbiAgY29uc3QgcmVnZXggPSBwaWNvbWF0Y2gudG9SZWdleChzb3VyY2UsIG9wdGlvbnMpO1xuICBpZiAocmV0dXJuU3RhdGUgPT09IHRydWUpIHtcbiAgICByZWdleC5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2V4O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSBhIHBhcnNlZCBnbG9iIHBhdHRlcm4uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBwaWNvbWF0Y2gucGFyc2UoJyouanMnKTtcbiAqIC8vIHBpY29tYXRjaC5jb21waWxlUmUoc3RhdGVbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cocGljb21hdGNoLmNvbXBpbGVSZShzdGF0ZSkpO1xuICogLy89PiAvXig/Oig/IVxcLikoPz0uKVteL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RhdGVgIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgYC5wYXJzZWAgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuT3V0cHV0YCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgY29tcGlsZWQgb3V0cHV0LCBpbnN0ZWFkIG9mIGEgcmVndWxhciBleHByZXNzaW9uLiBUaGlzIGlzIG5vdCBleHBvc2VkIG9uIHRoZSBvcHRpb25zIHRvIHByZXZlbnQgZW5kLXVzZXJzIGZyb20gbXV0YXRpbmcgdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVyblN0YXRlYCBJbXBsZW1lbnRvcnMgbWF5IHVzZSB0aGlzIGFyZ3VtZW50IHRvIHJldHVybiB0aGUgc3RhdGUgZnJvbSB0aGUgcGFyc2VkIGdsb2Igd2l0aCB0aGUgcmV0dXJuZWQgcmVndWxhciBleHByZXNzaW9uLlxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gubWFrZVJlID0gKGlucHV0LCBvcHRpb25zID0ge30sIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgbGV0IHBhcnNlZCA9IHsgbmVnYXRlZDogZmFsc2UsIGZhc3RwYXRoczogdHJ1ZSB9O1xuXG4gIGlmIChvcHRpb25zLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgKGlucHV0WzBdID09PSAnLicgfHwgaW5wdXRbMF0gPT09ICcqJykpIHtcbiAgICBwYXJzZWQub3V0cHV0ID0gcGFyc2UuZmFzdHBhdGhzKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICghcGFyc2VkLm91dHB1dCkge1xuICAgIHBhcnNlZCA9IHBhcnNlKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiBwaWNvbWF0Y2guY29tcGlsZVJlKHBhcnNlZCwgb3B0aW9ucywgcmV0dXJuT3V0cHV0LCByZXR1cm5TdGF0ZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZVssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCB7IG91dHB1dCB9ID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudG9SZWdleChvdXRwdXQpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHNvdXJjZWAgUmVndWxhciBleHByZXNzaW9uIHNvdXJjZSBzdHJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC50b1JlZ2V4ID0gKHNvdXJjZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0cy5mbGFncyB8fCAob3B0cy5ub2Nhc2UgPyAnaScgOiAnJykpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnID09PSB0cnVlKSB0aHJvdyBlcnI7XG4gICAgcmV0dXJuIC8kXi87XG4gIH1cbn07XG5cbi8qKlxuICogUGljb21hdGNoIGNvbnN0YW50cy5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5waWNvbWF0Y2guY29uc3RhbnRzID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIEV4cG9zZSBcInBpY29tYXRjaFwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwaWNvbWF0Y2g7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3BpY29tYXRjaCcpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJ3BpY29tYXRjaC9saWIvdXRpbHMnKTtcbmNvbnN0IGlzRW1wdHlTdHJpbmcgPSB2YWwgPT4gdmFsID09PSAnJyB8fCB2YWwgPT09ICcuLyc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbWF0Y2ggb25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbShbJ2EuanMnLCAnYS50eHQnXSwgWycqLmpzJ10pKTtcbiAqIC8vPT4gWyAnYS5qcycgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxzdHJpbmc+fSBgbGlzdGAgTGlzdCBvZiBzdHJpbmdzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8c3RyaW5nPn0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKVxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlc1xuICogQHN1bW1hcnkgZmFsc2VcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgbWljcm9tYXRjaCA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucyk7XG4gIGxpc3QgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgbGV0IG9taXQgPSBuZXcgU2V0KCk7XG4gIGxldCBrZWVwID0gbmV3IFNldCgpO1xuICBsZXQgaXRlbXMgPSBuZXcgU2V0KCk7XG4gIGxldCBuZWdhdGl2ZXMgPSAwO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpdGVtcy5hZGQoc3RhdGUub3V0cHV0KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm9uUmVzdWx0KSB7XG4gICAgICBvcHRpb25zLm9uUmVzdWx0KHN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuc1tpXSksIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSwgdHJ1ZSk7XG4gICAgbGV0IG5lZ2F0ZWQgPSBpc01hdGNoLnN0YXRlLm5lZ2F0ZWQgfHwgaXNNYXRjaC5zdGF0ZS5uZWdhdGVkRXh0Z2xvYjtcbiAgICBpZiAobmVnYXRlZCkgbmVnYXRpdmVzKys7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgIGxldCBtYXRjaGVkID0gaXNNYXRjaChpdGVtLCB0cnVlKTtcblxuICAgICAgbGV0IG1hdGNoID0gbmVnYXRlZCA/ICFtYXRjaGVkLmlzTWF0Y2ggOiBtYXRjaGVkLmlzTWF0Y2g7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgaWYgKG5lZ2F0ZWQpIHtcbiAgICAgICAgb21pdC5hZGQobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb21pdC5kZWxldGUobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgICBrZWVwLmFkZChtYXRjaGVkLm91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHJlc3VsdCA9IG5lZ2F0aXZlcyA9PT0gcGF0dGVybnMubGVuZ3RoID8gWy4uLml0ZW1zXSA6IFsuLi5rZWVwXTtcbiAgbGV0IG1hdGNoZXMgPSByZXN1bHQuZmlsdGVyKGl0ZW0gPT4gIW9taXQuaGFzKGl0ZW0pKTtcblxuICBpZiAob3B0aW9ucyAmJiBtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChvcHRpb25zLmZhaWxnbG9iID09PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1hdGNoZXMgZm91bmQgZm9yIFwiJHtwYXR0ZXJucy5qb2luKCcsICcpfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9udWxsID09PSB0cnVlIHx8IG9wdGlvbnMubnVsbGdsb2IgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnVuZXNjYXBlID8gcGF0dGVybnMubWFwKHAgPT4gcC5yZXBsYWNlKC9cXFxcL2csICcnKSkgOiBwYXR0ZXJucztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoID0gbWljcm9tYXRjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbiBmcm9tIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuYCBhbmQgYG9wdGlvbnNgLlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHRvIG1hdGNoIGFzIGl0cyBvbmx5IGFyZ3VtZW50IGFuZCByZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBtYXRjaC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYXRjaGVyKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgaXNNYXRjaCA9IG1tLm1hdGNoZXIoJyouISgqYSknKTtcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYScpKTsgLy89PiBmYWxzZVxuICogY29uc29sZS5sb2coaXNNYXRjaCgnYS5iJykpOyAvLz0+IHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBHbG9iIHBhdHRlcm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYXRjaGVyID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJuLCBvcHRpb25zKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbnkqKiBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgIG1hdGNoIHRoZSBzcGVjaWZpZWQgYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uaXNNYXRjaChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmlzTWF0Y2goJ2EuYScsIFsnYi4qJywgJyouYSddKSk7IC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uaXNNYXRjaCgnYS5hJywgJ2IuKicpKTsgLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgVGhlIHN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBbb3B0aW9uc11gIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5pc01hdGNoID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHBpY29tYXRjaChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICovXG5cbm1pY3JvbWF0Y2guYW55ID0gbWljcm9tYXRjaC5pc01hdGNoO1xuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBfKipkbyBub3QgbWF0Y2ggYW55KipfIG9mIHRoZSBnaXZlbiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm5vdChsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5ub3QoWydhLmEnLCAnYi5iJywgJ2MuYyddLCAnKi5hJykpO1xuICogLy89PiBbJ2IuYicsICdjLmMnXVxuICogYGBgXG4gKiBAcGFyYW0ge0FycmF5fSBgbGlzdGAgQXJyYXkgb2Ygc3RyaW5ncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCAqKmRvIG5vdCBtYXRjaCoqIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5ub3QgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucykubWFwKFN0cmluZyk7XG4gIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gIGxldCBpdGVtcyA9IFtdO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpZiAob3B0aW9ucy5vblJlc3VsdCkgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgaXRlbXMucHVzaChzdGF0ZS5vdXRwdXQpO1xuICB9O1xuXG4gIGxldCBtYXRjaGVzID0gbmV3IFNldChtaWNyb21hdGNoKGxpc3QsIHBhdHRlcm5zLCB7IC4uLm9wdGlvbnMsIG9uUmVzdWx0IH0pKTtcblxuICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKCFtYXRjaGVzLmhhcyhpdGVtKSkge1xuICAgICAgcmVzdWx0LmFkZChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5yZXN1bHRdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBzdHJpbmdgIGNvbnRhaW5zIHRoZSBnaXZlbiBwYXR0ZXJuLiBTaW1pbGFyXG4gKiB0byBbLmlzTWF0Y2hdKCNpc01hdGNoKSBidXQgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIGFueSBwYXJ0IG9mIHRoZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIHZhciBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmNvbnRhaW5zKHN0cmluZywgcGF0dGVyblssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5jb250YWlucygnYWEvYmIvY2MnLCAnKmInKSk7XG4gKiAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmNvbnRhaW5zKCdhYS9iYi9jYycsICcqZCcpKTtcbiAqIC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgIFRoZSBzdHJpbmcgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBwYXR0ZXJucyBtYXRjaGVzIGFueSBwYXJ0IG9mIGBzdHJgLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmNvbnRhaW5zID0gKHN0ciwgcGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBhIHN0cmluZzogXCIke3V0aWwuaW5zcGVjdChzdHIpfVwiYCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUocCA9PiBtaWNyb21hdGNoLmNvbnRhaW5zKHN0ciwgcCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0VtcHR5U3RyaW5nKHN0cikgfHwgaXNFbXB0eVN0cmluZyhwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHIuaW5jbHVkZXMocGF0dGVybikgfHwgKHN0ci5zdGFydHNXaXRoKCcuLycpICYmIHN0ci5zbGljZSgyKS5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaWNyb21hdGNoLmlzTWF0Y2goc3RyLCBwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGNvbnRhaW5zOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBGaWx0ZXIgdGhlIGtleXMgb2YgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgZ2xvYmAgcGF0dGVyblxuICogYW5kIGBvcHRpb25zYC4gRG9lcyBub3QgYXR0ZW1wdCB0byBtYXRjaCBuZXN0ZWQga2V5cy4gSWYgeW91IG5lZWQgdGhpcyBmZWF0dXJlLFxuICogdXNlIFtnbG9iLW9iamVjdF1bXSBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1hdGNoS2V5cyhvYmplY3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IG9iaiA9IHsgYWE6ICdhJywgYWI6ICdiJywgYWM6ICdjJyB9O1xuICogY29uc29sZS5sb2cobW0ubWF0Y2hLZXlzKG9iaiwgJypiJykpO1xuICogLy89PiB7IGFiOiAnYicgfVxuICogYGBgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9iamVjdGAgVGhlIG9iamVjdCB3aXRoIGtleXMgdG8gZmlsdGVyLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBvbmx5IGtleXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2hLZXlzID0gKG9iaiwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCcpO1xuICB9XG4gIGxldCBrZXlzID0gbWljcm9tYXRjaChPYmplY3Qua2V5cyhvYmopLCBwYXR0ZXJucywgb3B0aW9ucyk7XG4gIGxldCByZXMgPSB7fTtcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHJlc1trZXldID0gb2JqW2tleV07XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBzb21lIG9mIHRoZSBzdHJpbmdzIGluIHRoZSBnaXZlbiBgbGlzdGAgbWF0Y2ggYW55IG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uc29tZShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5zb21lKFsnZm9vLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgbGlzdGAgVGhlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHRvIHRlc3QuIFJldHVybnMgYXMgc29vbiBhcyB0aGUgZmlyc3QgbWF0Y2ggaXMgZm91bmQuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBgcGF0dGVybnNgIG1hdGNoZXMgYW55IG9mIHRoZSBzdHJpbmdzIGluIGBsaXN0YFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNvbWUgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKGl0ZW1zLnNvbWUoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGV2ZXJ5IHN0cmluZyBpbiB0aGUgZ2l2ZW4gYGxpc3RgIG1hdGNoZXNcbiAqIGFueSBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmV2ZXJ5KGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYWxsIGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbGwgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guZXZlcnkgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IGl0ZW1zID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zKSkge1xuICAgIGxldCBpc01hdGNoID0gcGljb21hdGNoKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKCFpdGVtcy5ldmVyeShpdGVtID0+IGlzTWF0Y2goaXRlbSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbGwqKiBvZiB0aGUgZ2l2ZW4gYHBhdHRlcm5zYCBtYXRjaFxuICogdGhlIHNwZWNpZmllZCBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uYWxsKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKlxuICogY29uc29sZS5sb2cobW0uYWxsKCdmb28uanMnLCBbJyouanMnLCAnZionLCAnKm8qJywgJypvLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBzdHJgIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYWxsID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChwYXR0ZXJucykuZXZlcnkocCA9PiBwaWNvbWF0Y2gocCwgb3B0aW9ucykoc3RyKSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hlcyBjYXB0dXJlZCBieSBgcGF0dGVybmAgaW4gYHN0cmluZywgb3IgYG51bGxgIGlmIHRoZSBwYXR0ZXJuIGRpZCBub3QgbWF0Y2guXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uY2FwdHVyZShwYXR0ZXJuLCBzdHJpbmdbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uY2FwdHVyZSgndGVzdC8qLmpzJywgJ3Rlc3QvZm9vLmpzJykpO1xuICogLy89PiBbJ2ZvbyddXG4gKiBjb25zb2xlLmxvZyhtbS5jYXB0dXJlKCd0ZXN0LyouanMnLCAnZm9vL2Jhci5jc3MnKSk7XG4gKiAvLz0+IG51bGxcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBnbG9iYCBHbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byBtYXRjaFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0FycmF5fG51bGx9IFJldHVybnMgYW4gYXJyYXkgb2YgY2FwdHVyZXMgaWYgdGhlIGlucHV0IG1hdGNoZXMgdGhlIGdsb2IgcGF0dGVybiwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5jYXB0dXJlID0gKGdsb2IsIGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGxldCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcbiAgbGV0IHJlZ2V4ID0gcGljb21hdGNoLm1ha2VSZShTdHJpbmcoZ2xvYiksIHsgLi4ub3B0aW9ucywgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgbGV0IG1hdGNoID0gcmVnZXguZXhlYyhwb3NpeCA/IHV0aWxzLnRvUG9zaXhTbGFzaGVzKGlucHV0KSA6IGlucHV0KTtcblxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guc2xpY2UoMSkubWFwKHYgPT4gdiA9PT0gdm9pZCAwID8gJycgOiB2KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWFrZVJlKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0ubWFrZVJlKCcqLmpzJykpO1xuICogLy89PiAvXig/OihcXC5bXFxcXFxcL10pPyg/IVxcLikoPz0uKVteXFwvXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBBIGdsb2IgcGF0dGVybiB0byBjb252ZXJ0IHRvIHJlZ2V4LlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7UmVnRXhwfSBSZXR1cm5zIGEgcmVnZXggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBwYXR0ZXJuLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1ha2VSZSA9ICguLi5hcmdzKSA9PiBwaWNvbWF0Y2gubWFrZVJlKC4uLmFyZ3MpO1xuXG4vKipcbiAqIFNjYW4gYSBnbG9iIHBhdHRlcm4gdG8gc2VwYXJhdGUgdGhlIHBhdHRlcm4gaW50byBzZWdtZW50cy4gVXNlZFxuICogYnkgdGhlIFtzcGxpdF0oI3NwbGl0KSBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5zY2FuKHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnNjYW4gPSAoLi4uYXJncykgPT4gcGljb21hdGNoLnNjYW4oLi4uYXJncyk7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5wYXJzZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdXNlZnVsIHByb3BlcnRpZXMgYW5kIG91dHB1dCB0byBiZSB1c2VkIGFzIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gucGFyc2UgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlcyA9IFtdO1xuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucyB8fCBbXSkpIHtcbiAgICBmb3IgKGxldCBzdHIgb2YgYnJhY2VzKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucykpIHtcbiAgICAgIHJlcy5wdXNoKHBpY29tYXRjaC5wYXJzZShzdHIsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgZ2l2ZW4gYnJhY2UgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB7IGJyYWNlcyB9ID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCdmb28ve2EsYixjfS9iYXInKSk7XG4gKiAvLz0+IFsgJ2Zvby8oYXxifGMpL2JhcicgXVxuICpcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygnZm9vL3thLGIsY30vYmFyJywgeyBleHBhbmQ6IHRydWUgfSkpO1xuICogLy89PiBbICdmb28vYS9iYXInLCAnZm9vL2IvYmFyJywgJ2Zvby9jL2JhcicgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIFN0cmluZyB3aXRoIGJyYWNlIHBhdHRlcm4gdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgQW55IFtvcHRpb25zXSgjb3B0aW9ucykgdG8gY2hhbmdlIGhvdyBleHBhbnNpb24gaXMgcGVyZm9ybWVkLiBTZWUgdGhlIFticmFjZXNdW10gbGlicmFyeSBmb3IgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VzID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgaWYgKChvcHRpb25zICYmIG9wdGlvbnMubm9icmFjZSA9PT0gdHJ1ZSkgfHwgIS9cXHsuKlxcfS8udGVzdChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBbcGF0dGVybl07XG4gIH1cbiAgcmV0dXJuIGJyYWNlcyhwYXR0ZXJuLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kIGJyYWNlc1xuICovXG5cbm1pY3JvbWF0Y2guYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICByZXR1cm4gbWljcm9tYXRjaC5icmFjZXMocGF0dGVybiwgeyAuLi5vcHRpb25zLCBleHBhbmQ6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEV4cG9zZSBtaWNyb21hdGNoXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBtaWNyb21hdGNoO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZW1vdmVEdXBsaWNhdGVTbGFzaGVzID0gZXhwb3J0cy5tYXRjaEFueSA9IGV4cG9ydHMuY29udmVydFBhdHRlcm5zVG9SZSA9IGV4cG9ydHMubWFrZVJlID0gZXhwb3J0cy5nZXRQYXR0ZXJuUGFydHMgPSBleHBvcnRzLmV4cGFuZEJyYWNlRXhwYW5zaW9uID0gZXhwb3J0cy5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbiA9IGV4cG9ydHMuaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4gPSBleHBvcnRzLmVuZHNXaXRoU2xhc2hHbG9iU3RhciA9IGV4cG9ydHMuaGFzR2xvYlN0YXIgPSBleHBvcnRzLmdldEJhc2VEaXJlY3RvcnkgPSBleHBvcnRzLmlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZXhwb3J0cy5nZXRQb3NpdGl2ZVBhdHRlcm5zID0gZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZXhwb3J0cy5pc1Bvc2l0aXZlUGF0dGVybiA9IGV4cG9ydHMuaXNOZWdhdGl2ZVBhdHRlcm4gPSBleHBvcnRzLmNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybiA9IGV4cG9ydHMuY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuID0gZXhwb3J0cy5pc0R5bmFtaWNQYXR0ZXJuID0gZXhwb3J0cy5pc1N0YXRpY1BhdHRlcm4gPSB2b2lkIDA7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBnbG9iUGFyZW50ID0gcmVxdWlyZShcImdsb2ItcGFyZW50XCIpO1xuY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoXCJtaWNyb21hdGNoXCIpO1xuY29uc3QgR0xPQlNUQVIgPSAnKionO1xuY29uc3QgRVNDQVBFX1NZTUJPTCA9ICdcXFxcJztcbmNvbnN0IENPTU1PTl9HTE9CX1NZTUJPTFNfUkUgPSAvWyo/XXxeIS87XG5jb25zdCBSRUdFWF9DSEFSQUNURVJfQ0xBU1NfU1lNQk9MU19SRSA9IC9cXFtbXltdKl0vO1xuY29uc3QgUkVHRVhfR1JPVVBfU1lNQk9MU19SRSA9IC8oPzpefFteISorP0BdKVxcKFteKF0qXFx8W158XSpcXCkvO1xuY29uc3QgR0xPQl9FWFRFTlNJT05fU1lNQk9MU19SRSA9IC9bISorP0BdXFwoW14oXSpcXCkvO1xuY29uc3QgQlJBQ0VfRVhQQU5TSU9OX1NFUEFSQVRPUlNfUkUgPSAvLHxcXC5cXC4vO1xuLyoqXG4gKiBNYXRjaGVzIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgY29uc2VjdXRpdmUgc2xhc2hlcywgZXhjbHVkaW5nIHRoZSBmaXJzdCB0d28gc2xhc2hlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuXG4gKiBUaGUgbGF0dGVyIGlzIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgdGhlIGRldmljZSBwYXRoIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFVOQyBwYXRoLlxuICovXG5jb25zdCBET1VCTEVfU0xBU0hfUkUgPSAvKD8hXilcXC97Mix9L2c7XG5mdW5jdGlvbiBpc1N0YXRpY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICFpc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5pc1N0YXRpY1BhdHRlcm4gPSBpc1N0YXRpY1BhdHRlcm47XG5mdW5jdGlvbiBpc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbCBjYXNlIHdpdGggYW4gZW1wdHkgc3RyaW5nIGlzIG5lY2Vzc2FyeSBmb3IgbWF0Y2hpbmcgcGF0dGVybnMgdGhhdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaC5cbiAgICAgKiBBbiBlbXB0eSBzdHJpbmcgY2Fubm90IGJlIGEgZHluYW1pYyBwYXR0ZXJuLlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybiBgL2xpYi8qYCB3aWxsIGJlIHNwcmVhZCBpbnRvIHBhcnRzOiAnJywgJ2xpYicsICcqJy5cbiAgICAgKi9cbiAgICBpZiAocGF0dGVybiA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBgY2FzZVNlbnNpdGl2ZU1hdGNoYCBvcHRpb24gaXMgZGlzYWJsZWQsIGFsbCBwYXR0ZXJucyBtdXN0IGJlIG1hcmtlZCBhcyBkeW5hbWljLCBiZWNhdXNlIHdlIGNhbm5vdCBjaGVja1xuICAgICAqIGZpbGVwYXRoIGRpcmVjdGx5ICh3aXRob3V0IHJlYWQgZGlyZWN0b3J5KS5cbiAgICAgKi9cbiAgICBpZiAob3B0aW9ucy5jYXNlU2Vuc2l0aXZlTWF0Y2ggPT09IGZhbHNlIHx8IHBhdHRlcm4uaW5jbHVkZXMoRVNDQVBFX1NZTUJPTCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDT01NT05fR0xPQl9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikgfHwgUkVHRVhfQ0hBUkFDVEVSX0NMQVNTX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSB8fCBSRUdFWF9HUk9VUF9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmV4dGdsb2IgIT09IGZhbHNlICYmIEdMT0JfRVhURU5TSU9OX1NZTUJPTFNfUkUudGVzdChwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYnJhY2VFeHBhbnNpb24gIT09IGZhbHNlICYmIGhhc0JyYWNlRXhwYW5zaW9uKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmlzRHluYW1pY1BhdHRlcm4gPSBpc0R5bmFtaWNQYXR0ZXJuO1xuZnVuY3Rpb24gaGFzQnJhY2VFeHBhbnNpb24ocGF0dGVybikge1xuICAgIGNvbnN0IG9wZW5pbmdCcmFjZUluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd7Jyk7XG4gICAgaWYgKG9wZW5pbmdCcmFjZUluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsb3NpbmdCcmFjZUluZGV4ID0gcGF0dGVybi5pbmRleE9mKCd9Jywgb3BlbmluZ0JyYWNlSW5kZXggKyAxKTtcbiAgICBpZiAoY2xvc2luZ0JyYWNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYnJhY2VDb250ZW50ID0gcGF0dGVybi5zbGljZShvcGVuaW5nQnJhY2VJbmRleCwgY2xvc2luZ0JyYWNlSW5kZXgpO1xuICAgIHJldHVybiBCUkFDRV9FWFBBTlNJT05fU0VQQVJBVE9SU19SRS50ZXN0KGJyYWNlQ29udGVudCk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSA/IHBhdHRlcm4uc2xpY2UoMSkgOiBwYXR0ZXJuO1xufVxuZXhwb3J0cy5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4ocGF0dGVybikge1xuICAgIHJldHVybiAnIScgKyBwYXR0ZXJuO1xufVxuZXhwb3J0cy5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm47XG5mdW5jdGlvbiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIHBhdHRlcm5bMV0gIT09ICcoJztcbn1cbmV4cG9ydHMuaXNOZWdhdGl2ZVBhdHRlcm4gPSBpc05lZ2F0aXZlUGF0dGVybjtcbmZ1bmN0aW9uIGlzUG9zaXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gIWlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pO1xufVxuZXhwb3J0cy5pc1Bvc2l0aXZlUGF0dGVybiA9IGlzUG9zaXRpdmVQYXR0ZXJuO1xuZnVuY3Rpb24gZ2V0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoaXNOZWdhdGl2ZVBhdHRlcm4pO1xufVxuZXhwb3J0cy5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZ2V0TmVnYXRpdmVQYXR0ZXJucztcbmZ1bmN0aW9uIGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGlzUG9zaXRpdmVQYXR0ZXJuKTtcbn1cbmV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnM7XG4vKipcbiAqIFJldHVybnMgcGF0dGVybnMgdGhhdCBjYW4gYmUgYXBwbGllZCBpbnNpZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBbJy4vKicsICcqJywgJ2EvKiddXG4gKiBnZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkoWycuLyonLCAnKicsICdhLyonLCAnLi4vKicsICcuLy4uLyonXSlcbiAqL1xuZnVuY3Rpb24gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gIWlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeShwYXR0ZXJuKSk7XG59XG5leHBvcnRzLmdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeTtcbi8qKlxuICogUmV0dXJucyBwYXR0ZXJucyB0byBiZSBleHBhbmRlZCByZWxhdGl2ZSB0byAob3V0c2lkZSkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBbJy4uLyonLCAnLi8uLi8qJ11cbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxuICovXG5mdW5jdGlvbiBnZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zLmZpbHRlcihpc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkpO1xufVxuZXhwb3J0cy5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeTtcbmZ1bmN0aW9uIGlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeShwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3RhcnRzV2l0aCgnLi4nKSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy4vLi4nKTtcbn1cbmV4cG9ydHMuaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5ID0gaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5O1xuZnVuY3Rpb24gZ2V0QmFzZURpcmVjdG9yeShwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGdsb2JQYXJlbnQocGF0dGVybiwgeyBmbGlwQmFja3NsYXNoZXM6IGZhbHNlIH0pO1xufVxuZXhwb3J0cy5nZXRCYXNlRGlyZWN0b3J5ID0gZ2V0QmFzZURpcmVjdG9yeTtcbmZ1bmN0aW9uIGhhc0dsb2JTdGFyKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5pbmNsdWRlcyhHTE9CU1RBUik7XG59XG5leHBvcnRzLmhhc0dsb2JTdGFyID0gaGFzR2xvYlN0YXI7XG5mdW5jdGlvbiBlbmRzV2l0aFNsYXNoR2xvYlN0YXIocGF0dGVybikge1xuICAgIHJldHVybiBwYXR0ZXJuLmVuZHNXaXRoKCcvJyArIEdMT0JTVEFSKTtcbn1cbmV4cG9ydHMuZW5kc1dpdGhTbGFzaEdsb2JTdGFyID0gZW5kc1dpdGhTbGFzaEdsb2JTdGFyO1xuZnVuY3Rpb24gaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4ocGF0dGVybikge1xuICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShwYXR0ZXJuKTtcbiAgICByZXR1cm4gZW5kc1dpdGhTbGFzaEdsb2JTdGFyKHBhdHRlcm4pIHx8IGlzU3RhdGljUGF0dGVybihiYXNlbmFtZSk7XG59XG5leHBvcnRzLmlzQWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJuID0gaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm47XG5mdW5jdGlvbiBleHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbihwYXR0ZXJucykge1xuICAgIHJldHVybiBwYXR0ZXJucy5yZWR1Y2UoKGNvbGxlY3Rpb24sIHBhdHRlcm4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29uY2F0KGV4cGFuZEJyYWNlRXhwYW5zaW9uKHBhdHRlcm4pKTtcbiAgICB9LCBbXSk7XG59XG5leHBvcnRzLmV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uID0gZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb247XG5mdW5jdGlvbiBleHBhbmRCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBtaWNyb21hdGNoLmJyYWNlcyhwYXR0ZXJuLCB7IGV4cGFuZDogdHJ1ZSwgbm9kdXBlczogdHJ1ZSwga2VlcEVzY2FwaW5nOiB0cnVlIH0pO1xuICAgIC8qKlxuICAgICAqIFNvcnQgdGhlIHBhdHRlcm5zIGJ5IGxlbmd0aCBzbyB0aGF0IHRoZSBzYW1lIGRlcHRoIHBhdHRlcm5zIGFyZSBwcm9jZXNzZWQgc2lkZSBieSBzaWRlLlxuICAgICAqIGBhL3tiLH0ve2MsfS8qYCBcdTIwMTMgYFsnYS8vLyonLCAnYS9iLy8qJywgJ2EvL2MvKicsICdhL2IvYy8qJ11gXG4gICAgICovXG4gICAgcGF0dGVybnMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCk7XG4gICAgLyoqXG4gICAgICogTWljcm9tYXRjaCBjYW4gcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgY2FzZSBvZiBwYXR0ZXJucyBsaWtlIGB7YSx9YC5cbiAgICAgKi9cbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuICE9PSAnJyk7XG59XG5leHBvcnRzLmV4cGFuZEJyYWNlRXhwYW5zaW9uID0gZXhwYW5kQnJhY2VFeHBhbnNpb247XG5mdW5jdGlvbiBnZXRQYXR0ZXJuUGFydHMocGF0dGVybiwgb3B0aW9ucykge1xuICAgIGxldCB7IHBhcnRzIH0gPSBtaWNyb21hdGNoLnNjYW4ocGF0dGVybiwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBwYXJ0czogdHJ1ZSB9KSk7XG4gICAgLyoqXG4gICAgICogVGhlIHNjYW4gbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgYXJyYXkgaW4gc29tZSBjYXNlcy5cbiAgICAgKiBTZWUgbWljcm9tYXRjaC9waWNvbWF0Y2gjNTggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBhcnRzID0gW3BhdHRlcm5dO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc2NhbiBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGFuIGVtcHR5IHBhcnQgZm9yIHRoZSBwYXR0ZXJuIHdpdGggYSBmb3J3YXJkIHNsYXNoLlxuICAgICAqIFRoaXMgaXMgYW5vdGhlciBwYXJ0IG9mIG1pY3JvbWF0Y2gvcGljb21hdGNoIzU4LlxuICAgICAqL1xuICAgIGlmIChwYXJ0c1swXS5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGFydHNbMF0gPSBwYXJ0c1swXS5zbGljZSgxKTtcbiAgICAgICAgcGFydHMudW5zaGlmdCgnJyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cztcbn1cbmV4cG9ydHMuZ2V0UGF0dGVyblBhcnRzID0gZ2V0UGF0dGVyblBhcnRzO1xuZnVuY3Rpb24gbWFrZVJlKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbWljcm9tYXRjaC5tYWtlUmUocGF0dGVybiwgb3B0aW9ucyk7XG59XG5leHBvcnRzLm1ha2VSZSA9IG1ha2VSZTtcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuc1RvUmUocGF0dGVybnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBtYWtlUmUocGF0dGVybiwgb3B0aW9ucykpO1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybnNUb1JlID0gY29udmVydFBhdHRlcm5zVG9SZTtcbmZ1bmN0aW9uIG1hdGNoQW55KGVudHJ5LCBwYXR0ZXJuc1JlKSB7XG4gICAgcmV0dXJuIHBhdHRlcm5zUmUuc29tZSgocGF0dGVyblJlKSA9PiBwYXR0ZXJuUmUudGVzdChlbnRyeSkpO1xufVxuZXhwb3J0cy5tYXRjaEFueSA9IG1hdGNoQW55O1xuLyoqXG4gKiBUaGlzIHBhY2thZ2Ugb25seSB3b3JrcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBhcyBhIHBhdGggc2VwYXJhdG9yLlxuICogQmVjYXVzZSBvZiB0aGlzLCB3ZSBjYW5ub3QgdXNlIHRoZSBzdGFuZGFyZCBgcGF0aC5ub3JtYWxpemVgIG1ldGhvZCwgYmVjYXVzZSBvbiBXaW5kb3dzIHBsYXRmb3JtIGl0IHdpbGwgdXNlIG9mIGJhY2tzbGFzaGVzLlxuICovXG5mdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVTbGFzaGVzKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gcGF0dGVybi5yZXBsYWNlKERPVUJMRV9TTEFTSF9SRSwgJy8nKTtcbn1cbmV4cG9ydHMucmVtb3ZlRHVwbGljYXRlU2xhc2hlcyA9IHJlbW92ZUR1cGxpY2F0ZVNsYXNoZXM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLm1lcmdlID0gdm9pZCAwO1xuY29uc3QgbWVyZ2UyID0gcmVxdWlyZShcIm1lcmdlMlwiKTtcbmZ1bmN0aW9uIG1lcmdlKHN0cmVhbXMpIHtcbiAgICBjb25zdCBtZXJnZWRTdHJlYW0gPSBtZXJnZTIoc3RyZWFtcyk7XG4gICAgc3RyZWFtcy5mb3JFYWNoKChzdHJlYW0pID0+IHtcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiBtZXJnZWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuICAgIH0pO1xuICAgIG1lcmdlZFN0cmVhbS5vbmNlKCdjbG9zZScsICgpID0+IHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykpO1xuICAgIG1lcmdlZFN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiBwcm9wYWdhdGVDbG9zZUV2ZW50VG9Tb3VyY2VzKHN0cmVhbXMpKTtcbiAgICByZXR1cm4gbWVyZ2VkU3RyZWFtO1xufVxuZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xuZnVuY3Rpb24gcHJvcGFnYXRlQ2xvc2VFdmVudFRvU291cmNlcyhzdHJlYW1zKSB7XG4gICAgc3RyZWFtcy5mb3JFYWNoKChzdHJlYW0pID0+IHN0cmVhbS5lbWl0KCdjbG9zZScpKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNFbXB0eSA9IGV4cG9ydHMuaXNTdHJpbmcgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc1N0cmluZyhpbnB1dCkge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuZnVuY3Rpb24gaXNFbXB0eShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCA9PT0gJyc7XG59XG5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLnN0cmVhbSA9IGV4cG9ydHMucGF0dGVybiA9IGV4cG9ydHMucGF0aCA9IGV4cG9ydHMuZnMgPSBleHBvcnRzLmVycm5vID0gZXhwb3J0cy5hcnJheSA9IHZvaWQgMDtcbmNvbnN0IGFycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlcIik7XG5leHBvcnRzLmFycmF5ID0gYXJyYXk7XG5jb25zdCBlcnJubyA9IHJlcXVpcmUoXCIuL2Vycm5vXCIpO1xuZXhwb3J0cy5lcnJubyA9IGVycm5vO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiLi9mc1wiKTtcbmV4cG9ydHMuZnMgPSBmcztcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwiLi9wYXRoXCIpO1xuZXhwb3J0cy5wYXRoID0gcGF0aDtcbmNvbnN0IHBhdHRlcm4gPSByZXF1aXJlKFwiLi9wYXR0ZXJuXCIpO1xuZXhwb3J0cy5wYXR0ZXJuID0gcGF0dGVybjtcbmNvbnN0IHN0cmVhbSA9IHJlcXVpcmUoXCIuL3N0cmVhbVwiKTtcbmV4cG9ydHMuc3RyZWFtID0gc3RyZWFtO1xuY29uc3Qgc3RyaW5nID0gcmVxdWlyZShcIi4vc3RyaW5nXCIpO1xuZXhwb3J0cy5zdHJpbmcgPSBzdHJpbmc7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2sgPSBleHBvcnRzLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyA9IGV4cG9ydHMuZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeSA9IGV4cG9ydHMuZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUgPSBleHBvcnRzLmdldFBvc2l0aXZlUGF0dGVybnMgPSBleHBvcnRzLmNvbnZlcnRQYXR0ZXJuc1RvVGFza3MgPSBleHBvcnRzLmdlbmVyYXRlID0gdm9pZCAwO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5mdW5jdGlvbiBnZW5lcmF0ZShpbnB1dCwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHByb2Nlc3NQYXR0ZXJucyhpbnB1dCwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IGlnbm9yZSA9IHByb2Nlc3NQYXR0ZXJucyhzZXR0aW5ncy5pZ25vcmUsIHNldHRpbmdzKTtcbiAgICBjb25zdCBwb3NpdGl2ZVBhdHRlcm5zID0gZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucyk7XG4gICAgY29uc3QgbmVnYXRpdmVQYXR0ZXJucyA9IGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlKHBhdHRlcm5zLCBpZ25vcmUpO1xuICAgIGNvbnN0IHN0YXRpY1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHV0aWxzLnBhdHRlcm4uaXNTdGF0aWNQYXR0ZXJuKHBhdHRlcm4sIHNldHRpbmdzKSk7XG4gICAgY29uc3QgZHluYW1pY1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHV0aWxzLnBhdHRlcm4uaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuLCBzZXR0aW5ncykpO1xuICAgIGNvbnN0IHN0YXRpY1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcyhzdGF0aWNQYXR0ZXJucywgbmVnYXRpdmVQYXR0ZXJucywgLyogZHluYW1pYyAqLyBmYWxzZSk7XG4gICAgY29uc3QgZHluYW1pY1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcyhkeW5hbWljUGF0dGVybnMsIG5lZ2F0aXZlUGF0dGVybnMsIC8qIGR5bmFtaWMgKi8gdHJ1ZSk7XG4gICAgcmV0dXJuIHN0YXRpY1Rhc2tzLmNvbmNhdChkeW5hbWljVGFza3MpO1xufVxuZXhwb3J0cy5nZW5lcmF0ZSA9IGdlbmVyYXRlO1xuZnVuY3Rpb24gcHJvY2Vzc1BhdHRlcm5zKGlucHV0LCBzZXR0aW5ncykge1xuICAgIGxldCBwYXR0ZXJucyA9IGlucHV0O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwYXR0ZXJuIGxpa2UgYHssKiwqKixhLyp9YCBjYW4gbGVhZCB0byBwcm9ibGVtcyBjaGVja2luZyB0aGUgZGVwdGggd2hlbiBtYXRjaGluZyBlbnRyeVxuICAgICAqIGFuZCBzb21lIHByb2JsZW1zIHdpdGggdGhlIG1pY3JvbWF0Y2ggcGFja2FnZSAoc2VlIGZhc3QtZ2xvYiBpc3N1ZXM6ICMzNjUsICMzOTQpLlxuICAgICAqXG4gICAgICogVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB3ZSBleHBhbmQgYWxsIHBhdHRlcm5zIGNvbnRhaW5pbmcgYnJhY2UgZXhwYW5zaW9uLiBUaGlzIGNhbiBsZWFkIHRvIGEgc2xpZ2h0IHNsb3dkb3duXG4gICAgICogaW4gbWF0Y2hpbmcgaW4gdGhlIGNhc2Ugb2YgYSBsYXJnZSBzZXQgb2YgcGF0dGVybnMgYWZ0ZXIgZXhwYW5zaW9uLlxuICAgICAqL1xuICAgIGlmIChzZXR0aW5ncy5icmFjZUV4cGFuc2lvbikge1xuICAgICAgICBwYXR0ZXJucyA9IHV0aWxzLnBhdHRlcm4uZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb24ocGF0dGVybnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgYGJhc2VOYW1lTWF0Y2hgIG9wdGlvbiBpcyBlbmFibGVkLCB3ZSBtdXN0IGFkZCBnbG9ic3RhciB0byBwYXR0ZXJucywgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkXG4gICAgICogYXQgYW55IG5lc3RpbmcgbGV2ZWwuXG4gICAgICpcbiAgICAgKiBXZSBkbyB0aGlzIGhlcmUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29tcGxpY2F0ZSB0aGUgZmlsdGVyaW5nIGxvZ2ljLiBGb3IgZXhhbXBsZSwgd2UgbmVlZCB0byBjaGFuZ2VcbiAgICAgKiB0aGUgcGF0dGVybiBpbiB0aGUgZmlsdGVyIGJlZm9yZSBjcmVhdGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIHBhdHRlcm5zXG4gICAgICogaW4gdGhlIGFwcGxpY2F0aW9uLiBPbmx5IG9uIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBpZiAoc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCkge1xuICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT4gcGF0dGVybi5pbmNsdWRlcygnLycpID8gcGF0dGVybiA6IGAqKi8ke3BhdHRlcm59YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGFsc28gcmVtb3ZlcyBkdXBsaWNhdGUgc2xhc2hlcyB0aGF0IG1heSBoYXZlIGJlZW4gaW4gdGhlIHBhdHRlcm4gb3IgZm9ybWVkIGFzIGEgcmVzdWx0IG9mIGV4cGFuc2lvbi5cbiAgICAgKi9cbiAgICByZXR1cm4gcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiB1dGlscy5wYXR0ZXJuLnJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMocGF0dGVybikpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRhc2tzIGdyb3VwZWQgYnkgYmFzaWMgcGF0dGVybiBkaXJlY3Rvcmllcy5cbiAqXG4gKiBQYXR0ZXJucyB0aGF0IGNhbiBiZSBmb3VuZCBpbnNpZGUgKGAuL2ApIGFuZCBvdXRzaWRlIChgLi4vYCkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGRpcmVjdG9yeSB0cmF2ZXJzYWwgc3RhcnRzIGF0IHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgZ29lcyBkZWVwZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuc1RvVGFza3MocG9zaXRpdmUsIG5lZ2F0aXZlLCBkeW5hbWljKSB7XG4gICAgY29uc3QgdGFza3MgPSBbXTtcbiAgICBjb25zdCBwYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5ID0gdXRpbHMucGF0dGVybi5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBvc2l0aXZlKTtcbiAgICBjb25zdCBwYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkgPSB1dGlscy5wYXR0ZXJuLmdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShwb3NpdGl2ZSk7XG4gICAgY29uc3Qgb3V0c2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCA9IGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkocGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSk7XG4gICAgY29uc3QgaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeShwYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkpO1xuICAgIHRhc2tzLnB1c2goLi4uY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzKG91dHNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAsIG5lZ2F0aXZlLCBkeW5hbWljKSk7XG4gICAgLypcbiAgICAgKiBGb3IgdGhlIHNha2Ugb2YgcmVkdWNpbmcgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoZSBmaWxlIHN5c3RlbSwgd2UgbWVyZ2UgYWxsIHRhc2tzIHdpdGhpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlcbiAgICAgKiBpbnRvIGEgZ2xvYmFsIHRhc2ssIGlmIGF0IGxlYXN0IG9uZSBwYXR0ZXJuIHJlZmVycyB0byB0aGUgcm9vdCAoYC5gKS4gSW4gdGhpcyBjYXNlLCB0aGUgZ2xvYmFsIHRhc2sgY292ZXJzIHRoZSByZXN0LlxuICAgICAqL1xuICAgIGlmICgnLicgaW4gaW5zaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwKSB7XG4gICAgICAgIHRhc2tzLnB1c2goY29udmVydFBhdHRlcm5Hcm91cFRvVGFzaygnLicsIHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSwgbmVnYXRpdmUsIGR5bmFtaWMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhc2tzLnB1c2goLi4uY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzKGluc2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCwgbmVnYXRpdmUsIGR5bmFtaWMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tzO1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybnNUb1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcztcbmZ1bmN0aW9uIGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcbiAgICByZXR1cm4gdXRpbHMucGF0dGVybi5nZXRQb3NpdGl2ZVBhdHRlcm5zKHBhdHRlcm5zKTtcbn1cbmV4cG9ydHMuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnM7XG5mdW5jdGlvbiBnZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZShwYXR0ZXJucywgaWdub3JlKSB7XG4gICAgY29uc3QgbmVnYXRpdmUgPSB1dGlscy5wYXR0ZXJuLmdldE5lZ2F0aXZlUGF0dGVybnMocGF0dGVybnMpLmNvbmNhdChpZ25vcmUpO1xuICAgIGNvbnN0IHBvc2l0aXZlID0gbmVnYXRpdmUubWFwKHV0aWxzLnBhdHRlcm4uY29udmVydFRvUG9zaXRpdmVQYXR0ZXJuKTtcbiAgICByZXR1cm4gcG9zaXRpdmU7XG59XG5leHBvcnRzLmdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlID0gZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmU7XG5mdW5jdGlvbiBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5KHBhdHRlcm5zKSB7XG4gICAgY29uc3QgZ3JvdXAgPSB7fTtcbiAgICByZXR1cm4gcGF0dGVybnMucmVkdWNlKChjb2xsZWN0aW9uLCBwYXR0ZXJuKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB1dGlscy5wYXR0ZXJuLmdldEJhc2VEaXJlY3RvcnkocGF0dGVybik7XG4gICAgICAgIGlmIChiYXNlIGluIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25bYmFzZV0ucHVzaChwYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25bYmFzZV0gPSBbcGF0dGVybl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfSwgZ3JvdXApO1xufVxuZXhwb3J0cy5ncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5ID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeTtcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyhwb3NpdGl2ZSwgbmVnYXRpdmUsIGR5bmFtaWMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocG9zaXRpdmUpLm1hcCgoYmFzZSkgPT4ge1xuICAgICAgICByZXR1cm4gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayhiYXNlLCBwb3NpdGl2ZVtiYXNlXSwgbmVnYXRpdmUsIGR5bmFtaWMpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3MgPSBjb252ZXJ0UGF0dGVybkdyb3Vwc1RvVGFza3M7XG5mdW5jdGlvbiBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKGJhc2UsIHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGR5bmFtaWMsXG4gICAgICAgIHBvc2l0aXZlLFxuICAgICAgICBuZWdhdGl2ZSxcbiAgICAgICAgYmFzZSxcbiAgICAgICAgcGF0dGVybnM6IFtdLmNvbmNhdChwb3NpdGl2ZSwgbmVnYXRpdmUubWFwKHV0aWxzLnBhdHRlcm4uY29udmVydFRvTmVnYXRpdmVQYXR0ZXJuKSlcbiAgICB9O1xufVxuZXhwb3J0cy5jb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrID0gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzaztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJlYWQocGF0aCwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgc2V0dGluZ3MuZnMubHN0YXQocGF0aCwgKGxzdGF0RXJyb3IsIGxzdGF0KSA9PiB7XG4gICAgICAgIGlmIChsc3RhdEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBsc3RhdEVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxzdGF0LmlzU3ltYm9saWNMaW5rKCkgfHwgIXNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGluaykge1xuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgbHN0YXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLmZzLnN0YXQocGF0aCwgKHN0YXRFcnJvciwgc3RhdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBsc3RhdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLm1hcmtTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICBzdGF0LmlzU3ltYm9saWNMaW5rID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHN0YXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5mdW5jdGlvbiBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHJlc3VsdCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWQgPSB2b2lkIDA7XG5mdW5jdGlvbiByZWFkKHBhdGgsIHNldHRpbmdzKSB7XG4gICAgY29uc3QgbHN0YXQgPSBzZXR0aW5ncy5mcy5sc3RhdFN5bmMocGF0aCk7XG4gICAgaWYgKCFsc3RhdC5pc1N5bWJvbGljTGluaygpIHx8ICFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgcmV0dXJuIGxzdGF0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0ID0gc2V0dGluZ3MuZnMuc3RhdFN5bmMocGF0aCk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5tYXJrU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICBzdGF0LmlzU3ltYm9saWNMaW5rID0gKCkgPT4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdDtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gbHN0YXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZXhwb3J0cy5yZWFkID0gcmVhZDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB2b2lkIDA7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHtcbiAgICBsc3RhdDogZnMubHN0YXQsXG4gICAgc3RhdDogZnMuc3RhdCxcbiAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcbiAgICBzdGF0U3luYzogZnMuc3RhdFN5bmNcbn07XG5mdW5jdGlvbiBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcihmc01ldGhvZHMpIHtcbiAgICBpZiAoZnNNZXRob2RzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUjtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSKSwgZnNNZXRob2RzKTtcbn1cbmV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGZzID0gcmVxdWlyZShcIi4vYWRhcHRlcnMvZnNcIik7XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5mb2xsb3dTeW1ib2xpY0xpbmssIHRydWUpO1xuICAgICAgICB0aGlzLmZzID0gZnMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIodGhpcy5fb3B0aW9ucy5mcyk7XG4gICAgICAgIHRoaXMubWFya1N5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMubWFya1N5bWJvbGljTGluaywgZmFsc2UpO1xuICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCB0cnVlKTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAhPT0gbnVsbCAmJiBvcHRpb24gIT09IHZvaWQgMCA/IG9wdGlvbiA6IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGF0U3luYyA9IGV4cG9ydHMuc3RhdCA9IGV4cG9ydHMuU2V0dGluZ3MgPSB2b2lkIDA7XG5jb25zdCBhc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBzZXR0aW5nc18xLmRlZmF1bHQ7XG5mdW5jdGlvbiBzdGF0KHBhdGgsIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKCksIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spLCBjYWxsYmFjayk7XG59XG5leHBvcnRzLnN0YXQgPSBzdGF0O1xuZnVuY3Rpb24gc3RhdFN5bmMocGF0aCwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICByZXR1cm4gc3luYy5yZWFkKHBhdGgsIHNldHRpbmdzKTtcbn1cbmV4cG9ydHMuc3RhdFN5bmMgPSBzdGF0U3luYztcbmZ1bmN0aW9uIGdldFNldHRpbmdzKHNldHRpbmdzT3JPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2V0dGluZ3NPck9wdGlvbnMgaW5zdGFuY2VvZiBzZXR0aW5nc18xLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG4iLCAiLyohIHF1ZXVlLW1pY3JvdGFzay4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xubGV0IHByb21pc2VcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbidcbiAgPyBxdWV1ZU1pY3JvdGFzay5iaW5kKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxuICAvLyByZXVzZSByZXNvbHZlZCBwcm9taXNlLCBhbmQgYWxsb2NhdGUgaXQgbGF6aWx5XG4gIDogY2IgPT4gKHByb21pc2UgfHwgKHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKSkpXG4gICAgLnRoZW4oY2IpXG4gICAgLmNhdGNoKGVyciA9PiBzZXRUaW1lb3V0KCgpID0+IHsgdGhyb3cgZXJyIH0sIDApKVxuIiwgIi8qISBydW4tcGFyYWxsZWwuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbm1vZHVsZS5leHBvcnRzID0gcnVuUGFyYWxsZWxcblxuY29uc3QgcXVldWVNaWNyb3Rhc2sgPSByZXF1aXJlKCdxdWV1ZS1taWNyb3Rhc2snKVxuXG5mdW5jdGlvbiBydW5QYXJhbGxlbCAodGFza3MsIGNiKSB7XG4gIGxldCByZXN1bHRzLCBwZW5kaW5nLCBrZXlzXG4gIGxldCBpc1N5bmMgPSB0cnVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgcmVzdWx0cyA9IFtdXG4gICAgcGVuZGluZyA9IHRhc2tzLmxlbmd0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh0YXNrcylcbiAgICByZXN1bHRzID0ge31cbiAgICBwZW5kaW5nID0ga2V5cy5sZW5ndGhcbiAgfVxuXG4gIGZ1bmN0aW9uIGRvbmUgKGVycikge1xuICAgIGZ1bmN0aW9uIGVuZCAoKSB7XG4gICAgICBpZiAoY2IpIGNiKGVyciwgcmVzdWx0cylcbiAgICAgIGNiID0gbnVsbFxuICAgIH1cbiAgICBpZiAoaXNTeW5jKSBxdWV1ZU1pY3JvdGFzayhlbmQpXG4gICAgZWxzZSBlbmQoKVxuICB9XG5cbiAgZnVuY3Rpb24gZWFjaCAoaSwgZXJyLCByZXN1bHQpIHtcbiAgICByZXN1bHRzW2ldID0gcmVzdWx0XG4gICAgaWYgKC0tcGVuZGluZyA9PT0gMCB8fCBlcnIpIHtcbiAgICAgIGRvbmUoZXJyKVxuICAgIH1cbiAgfVxuXG4gIGlmICghcGVuZGluZykge1xuICAgIC8vIGVtcHR5XG4gICAgZG9uZShudWxsKVxuICB9IGVsc2UgaWYgKGtleXMpIHtcbiAgICAvLyBvYmplY3RcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdGFza3Nba2V5XShmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsgZWFjaChrZXksIGVyciwgcmVzdWx0KSB9KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgLy8gYXJyYXlcbiAgICB0YXNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0YXNrLCBpKSB7XG4gICAgICB0YXNrKGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyBlYWNoKGksIGVyciwgcmVzdWx0KSB9KVxuICAgIH0pXG4gIH1cblxuICBpc1N5bmMgPSBmYWxzZVxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTID0gdm9pZCAwO1xuY29uc3QgTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFMgPSBwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoJy4nKTtcbmlmIChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1swXSA9PT0gdW5kZWZpbmVkIHx8IE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzFdID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYmVoYXZpb3IuIFRoZSAncHJvY2Vzcy52ZXJzaW9ucy5ub2RlJyB2YXJpYWJsZSBoYXMgaW52YWxpZCB2YWx1ZTogJHtwcm9jZXNzLnZlcnNpb25zLm5vZGV9YCk7XG59XG5jb25zdCBNQUpPUl9WRVJTSU9OID0gTnVtYmVyLnBhcnNlSW50KE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzBdLCAxMCk7XG5jb25zdCBNSU5PUl9WRVJTSU9OID0gTnVtYmVyLnBhcnNlSW50KE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTWzFdLCAxMCk7XG5jb25zdCBTVVBQT1JURURfTUFKT1JfVkVSU0lPTiA9IDEwO1xuY29uc3QgU1VQUE9SVEVEX01JTk9SX1ZFUlNJT04gPSAxMDtcbmNvbnN0IElTX01BVENIRURfQllfTUFKT1IgPSBNQUpPUl9WRVJTSU9OID4gU1VQUE9SVEVEX01BSk9SX1ZFUlNJT047XG5jb25zdCBJU19NQVRDSEVEX0JZX01BSk9SX0FORF9NSU5PUiA9IE1BSk9SX1ZFUlNJT04gPT09IFNVUFBPUlRFRF9NQUpPUl9WRVJTSU9OICYmIE1JTk9SX1ZFUlNJT04gPj0gU1VQUE9SVEVEX01JTk9SX1ZFUlNJT047XG4vKipcbiAqIElTIGB0cnVlYCBmb3IgTm9kZS5qcyAxMC4xMCBhbmQgZ3JlYXRlci5cbiAqL1xuZXhwb3J0cy5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTID0gSVNfTUFUQ0hFRF9CWV9NQUpPUiB8fCBJU19NQVRDSEVEX0JZX01BSk9SX0FORF9NSU5PUjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRGlyZW50RnJvbVN0YXRzID0gdm9pZCAwO1xuY2xhc3MgRGlyZW50RnJvbVN0YXRzIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzdGF0cykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmlzQmxvY2tEZXZpY2UgPSBzdGF0cy5pc0Jsb2NrRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzQ2hhcmFjdGVyRGV2aWNlID0gc3RhdHMuaXNDaGFyYWN0ZXJEZXZpY2UuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNEaXJlY3RvcnkgPSBzdGF0cy5pc0RpcmVjdG9yeS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0ZJRk8gPSBzdGF0cy5pc0ZJRk8uYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGaWxlID0gc3RhdHMuaXNGaWxlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU29ja2V0ID0gc3RhdHMuaXNTb2NrZXQuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNTeW1ib2xpY0xpbmsgPSBzdGF0cy5pc1N5bWJvbGljTGluay5iaW5kKHN0YXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpIHtcbiAgICByZXR1cm4gbmV3IERpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cyk7XG59XG5leHBvcnRzLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IGNyZWF0ZURpcmVudEZyb21TdGF0cztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZnMgPSB2b2lkIDA7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCIuL2ZzXCIpO1xuZXhwb3J0cy5mcyA9IGZzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5qb2luUGF0aFNlZ21lbnRzID0gdm9pZCAwO1xuZnVuY3Rpb24gam9pblBhdGhTZWdtZW50cyhhLCBiLCBzZXBhcmF0b3IpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ycmVjdCBoYW5kbGluZyBvZiBjYXNlcyB3aGVuIHRoZSBmaXJzdCBzZWdtZW50IGlzIGEgcm9vdCAoYC9gLCBgQzovYCkgb3IgVU5DIHBhdGggKGAvLz8vQzovYCkuXG4gICAgICovXG4gICAgaWYgKGEuZW5kc1dpdGgoc2VwYXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gYSArIGI7XG4gICAgfVxuICAgIHJldHVybiBhICsgc2VwYXJhdG9yICsgYjtcbn1cbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IGpvaW5QYXRoU2VnbWVudHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlYWRkaXIgPSBleHBvcnRzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gZXhwb3J0cy5yZWFkID0gdm9pZCAwO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBycGwgPSByZXF1aXJlKFwicnVuLXBhcmFsbGVsXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5mdW5jdGlvbiByZWFkKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFzZXR0aW5ncy5zdGF0cyAmJiBjb25zdGFudHNfMS5JU19TVVBQT1JUX1JFQURESVJfV0lUSF9GSUxFX1RZUEVTKSB7XG4gICAgICAgIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5mdW5jdGlvbiByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLnJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSwgKHJlYWRkaXJFcnJvciwgZGlyZW50cykgPT4ge1xuICAgICAgICBpZiAocmVhZGRpckVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCByZWFkZGlyRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBkaXJlbnRzLm1hcCgoZGlyZW50KSA9PiAoe1xuICAgICAgICAgICAgZGlyZW50LFxuICAgICAgICAgICAgbmFtZTogZGlyZW50Lm5hbWUsXG4gICAgICAgICAgICBwYXRoOiBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIGRpcmVudC5uYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcilcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoIXNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MpIHtcbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGVudHJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2tzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBtYWtlUnBsVGFza0VudHJ5KGVudHJ5LCBzZXR0aW5ncykpO1xuICAgICAgICBycGwodGFza3MsIChycGxFcnJvciwgcnBsRW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKHJwbEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgcnBsRXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIHJwbEVudHJpZXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpcldpdGhGaWxlVHlwZXMgPSByZWFkZGlyV2l0aEZpbGVUeXBlcztcbmZ1bmN0aW9uIG1ha2VScGxUYXNrRW50cnkoZW50cnksIHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIChkb25lKSA9PiB7XG4gICAgICAgIGlmICghZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLmZzLnN0YXQoZW50cnkucGF0aCwgKHN0YXRFcnJvciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5kaXJlbnQgPSB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMoZW50cnkubmFtZSwgc3RhdHMpO1xuICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiByZWFkZGlyKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgc2V0dGluZ3MuZnMucmVhZGRpcihkaXJlY3RvcnksIChyZWFkZGlyRXJyb3IsIG5hbWVzKSA9PiB7XG4gICAgICAgIGlmIChyZWFkZGlyRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJlYWRkaXJFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFza3MgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIG5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoZG9uZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZzU3RhdC5zdGF0KHBhdGgsIHNldHRpbmdzLmZzU3RhdFNldHRpbmdzLCAoZXJyb3IsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVudDogdXRpbHMuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3RhdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcnBsKHRhc2tzLCAocnBsRXJyb3IsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChycGxFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIHJwbEVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCBlbnRyaWVzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLnJlYWRkaXIgPSByZWFkZGlyO1xuZnVuY3Rpb24gY2FsbEZhaWx1cmVDYWxsYmFjayhjYWxsYmFjaywgZXJyb3IpIHtcbiAgICBjYWxsYmFjayhlcnJvcik7XG59XG5mdW5jdGlvbiBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCByZXN1bHQpIHtcbiAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkZGlyID0gZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IGV4cG9ydHMucmVhZCA9IHZvaWQgMDtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5mdW5jdGlvbiByZWFkKGRpcmVjdG9yeSwgc2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzLnN0YXRzICYmIGNvbnN0YW50c18xLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRkaXJXaXRoRmlsZVR5cGVzKGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzKTtcbn1cbmV4cG9ydHMucmVhZCA9IHJlYWQ7XG5mdW5jdGlvbiByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IHNldHRpbmdzLmZzLnJlYWRkaXJTeW5jKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkaXJlbnRzLm1hcCgoZGlyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgZGlyZW50LFxuICAgICAgICAgICAgbmFtZTogZGlyZW50Lm5hbWUsXG4gICAgICAgICAgICBwYXRoOiBjb21tb24uam9pblBhdGhTZWdtZW50cyhkaXJlY3RvcnksIGRpcmVudC5uYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcilcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc1N5bWJvbGljTGluaygpICYmIHNldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBzZXR0aW5ncy5mcy5zdGF0U3luYyhlbnRyeS5wYXRoKTtcbiAgICAgICAgICAgICAgICBlbnRyeS5kaXJlbnQgPSB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMoZW50cnkubmFtZSwgc3RhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZXhwb3J0cy5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IHJlYWRkaXJXaXRoRmlsZVR5cGVzO1xuZnVuY3Rpb24gcmVhZGRpcihkaXJlY3RvcnksIHNldHRpbmdzKSB7XG4gICAgY29uc3QgbmFtZXMgPSBzZXR0aW5ncy5mcy5yZWFkZGlyU3luYyhkaXJlY3RvcnkpO1xuICAgIHJldHVybiBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnlQYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBuYW1lLCBzZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gZnNTdGF0LnN0YXRTeW5jKGVudHJ5UGF0aCwgc2V0dGluZ3MuZnNTdGF0U2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBwYXRoOiBlbnRyeVBhdGgsXG4gICAgICAgICAgICBkaXJlbnQ6IHV0aWxzLmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhuYW1lLCBzdGF0cylcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNldHRpbmdzLnN0YXRzKSB7XG4gICAgICAgICAgICBlbnRyeS5zdGF0cyA9IHN0YXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucmVhZGRpciA9IHJlYWRkaXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0gdm9pZCAwO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5leHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB7XG4gICAgbHN0YXQ6IGZzLmxzdGF0LFxuICAgIHN0YXQ6IGZzLnN0YXQsXG4gICAgbHN0YXRTeW5jOiBmcy5sc3RhdFN5bmMsXG4gICAgc3RhdFN5bmM6IGZzLnN0YXRTeW5jLFxuICAgIHJlYWRkaXI6IGZzLnJlYWRkaXIsXG4gICAgcmVhZGRpclN5bmM6IGZzLnJlYWRkaXJTeW5jXG59O1xuZnVuY3Rpb24gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIoZnNNZXRob2RzKSB7XG4gICAgaWYgKGZzTWV0aG9kcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVI7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiksIGZzTWV0aG9kcyk7XG59XG5leHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBmc1N0YXQgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMuc3RhdFwiKTtcbmNvbnN0IGZzID0gcmVxdWlyZShcIi4vYWRhcHRlcnMvZnNcIik7XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcywgZmFsc2UpO1xuICAgICAgICB0aGlzLmZzID0gZnMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIodGhpcy5fb3B0aW9ucy5mcyk7XG4gICAgICAgIHRoaXMucGF0aFNlZ21lbnRTZXBhcmF0b3IgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnBhdGhTZWdtZW50U2VwYXJhdG9yLCBwYXRoLnNlcCk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN0YXRzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmssIHRydWUpO1xuICAgICAgICB0aGlzLmZzU3RhdFNldHRpbmdzID0gbmV3IGZzU3RhdC5TZXR0aW5ncyh7XG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbms6IHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLmZzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGlua1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAhPT0gbnVsbCAmJiBvcHRpb24gIT09IHZvaWQgMCA/IG9wdGlvbiA6IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZXR0aW5ncyA9IGV4cG9ydHMuc2NhbmRpclN5bmMgPSBleHBvcnRzLnNjYW5kaXIgPSB2b2lkIDA7XG5jb25zdCBhc3luYyA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN5bmMgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBzZXR0aW5nc18xLmRlZmF1bHQ7XG5mdW5jdGlvbiBzY2FuZGlyKHBhdGgsIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhc3luYy5yZWFkKHBhdGgsIGdldFNldHRpbmdzKCksIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXN5bmMucmVhZChwYXRoLCBnZXRTZXR0aW5ncyhvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spLCBjYWxsYmFjayk7XG59XG5leHBvcnRzLnNjYW5kaXIgPSBzY2FuZGlyO1xuZnVuY3Rpb24gc2NhbmRpclN5bmMocGF0aCwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICByZXR1cm4gc3luYy5yZWFkKHBhdGgsIHNldHRpbmdzKTtcbn1cbmV4cG9ydHMuc2NhbmRpclN5bmMgPSBzY2FuZGlyU3luYztcbmZ1bmN0aW9uIGdldFNldHRpbmdzKHNldHRpbmdzT3JPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2V0dGluZ3NPck9wdGlvbnMgaW5zdGFuY2VvZiBzZXR0aW5nc18xLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIHJldXNpZnkgKENvbnN0cnVjdG9yKSB7XG4gIHZhciBoZWFkID0gbmV3IENvbnN0cnVjdG9yKClcbiAgdmFyIHRhaWwgPSBoZWFkXG5cbiAgZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICB2YXIgY3VycmVudCA9IGhlYWRcblxuICAgIGlmIChjdXJyZW50Lm5leHQpIHtcbiAgICAgIGhlYWQgPSBjdXJyZW50Lm5leHRcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZCA9IG5ldyBDb25zdHJ1Y3RvcigpXG4gICAgICB0YWlsID0gaGVhZFxuICAgIH1cblxuICAgIGN1cnJlbnQubmV4dCA9IG51bGxcblxuICAgIHJldHVybiBjdXJyZW50XG4gIH1cblxuICBmdW5jdGlvbiByZWxlYXNlIChvYmopIHtcbiAgICB0YWlsLm5leHQgPSBvYmpcbiAgICB0YWlsID0gb2JqXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldDogZ2V0LFxuICAgIHJlbGVhc2U6IHJlbGVhc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJldXNpZnlcbiIsICIndXNlIHN0cmljdCdcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciByZXVzaWZ5ID0gcmVxdWlyZSgncmV1c2lmeScpXG5cbmZ1bmN0aW9uIGZhc3RxdWV1ZSAoY29udGV4dCwgd29ya2VyLCBjb25jdXJyZW5jeSkge1xuICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25jdXJyZW5jeSA9IHdvcmtlclxuICAgIHdvcmtlciA9IGNvbnRleHRcbiAgICBjb250ZXh0ID0gbnVsbFxuICB9XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFzdHF1ZXVlIGNvbmN1cnJlbmN5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKVxuICB9XG5cbiAgdmFyIGNhY2hlID0gcmV1c2lmeShUYXNrKVxuICB2YXIgcXVldWVIZWFkID0gbnVsbFxuICB2YXIgcXVldWVUYWlsID0gbnVsbFxuICB2YXIgX3J1bm5pbmcgPSAwXG4gIHZhciBlcnJvckhhbmRsZXIgPSBudWxsXG5cbiAgdmFyIHNlbGYgPSB7XG4gICAgcHVzaDogcHVzaCxcbiAgICBkcmFpbjogbm9vcCxcbiAgICBzYXR1cmF0ZWQ6IG5vb3AsXG4gICAgcGF1c2U6IHBhdXNlLFxuICAgIHBhdXNlZDogZmFsc2UsXG4gICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LFxuICAgIHJ1bm5pbmc6IHJ1bm5pbmcsXG4gICAgcmVzdW1lOiByZXN1bWUsXG4gICAgaWRsZTogaWRsZSxcbiAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICBnZXRRdWV1ZTogZ2V0UXVldWUsXG4gICAgdW5zaGlmdDogdW5zaGlmdCxcbiAgICBlbXB0eTogbm9vcCxcbiAgICBraWxsOiBraWxsLFxuICAgIGtpbGxBbmREcmFpbjoga2lsbEFuZERyYWluLFxuICAgIGVycm9yOiBlcnJvclxuICB9XG5cbiAgcmV0dXJuIHNlbGZcblxuICBmdW5jdGlvbiBydW5uaW5nICgpIHtcbiAgICByZXR1cm4gX3J1bm5pbmdcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdXNlICgpIHtcbiAgICBzZWxmLnBhdXNlZCA9IHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlbmd0aCAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBxdWV1ZUhlYWRcbiAgICB2YXIgY291bnRlciA9IDBcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XG4gICAgICBjb3VudGVyKytcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRlclxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UXVldWUgKCkge1xuICAgIHZhciBjdXJyZW50ID0gcXVldWVIZWFkXG4gICAgdmFyIHRhc2tzID0gW11cblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICB0YXNrcy5wdXNoKGN1cnJlbnQudmFsdWUpXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhc2tzXG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUgKCkge1xuICAgIGlmICghc2VsZi5wYXVzZWQpIHJldHVyblxuICAgIHNlbGYucGF1c2VkID0gZmFsc2VcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuY29uY3VycmVuY3k7IGkrKykge1xuICAgICAgX3J1bm5pbmcrK1xuICAgICAgcmVsZWFzZSgpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaWRsZSAoKSB7XG4gICAgcmV0dXJuIF9ydW5uaW5nID09PSAwICYmIHNlbGYubGVuZ3RoKCkgPT09IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2ggKHZhbHVlLCBkb25lKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjYWNoZS5nZXQoKVxuXG4gICAgY3VycmVudC5jb250ZXh0ID0gY29udGV4dFxuICAgIGN1cnJlbnQucmVsZWFzZSA9IHJlbGVhc2VcbiAgICBjdXJyZW50LnZhbHVlID0gdmFsdWVcbiAgICBjdXJyZW50LmNhbGxiYWNrID0gZG9uZSB8fCBub29wXG4gICAgY3VycmVudC5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXJcblxuICAgIGlmIChfcnVubmluZyA9PT0gc2VsZi5jb25jdXJyZW5jeSB8fCBzZWxmLnBhdXNlZCkge1xuICAgICAgaWYgKHF1ZXVlVGFpbCkge1xuICAgICAgICBxdWV1ZVRhaWwubmV4dCA9IGN1cnJlbnRcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVIZWFkID0gY3VycmVudFxuICAgICAgICBxdWV1ZVRhaWwgPSBjdXJyZW50XG4gICAgICAgIHNlbGYuc2F0dXJhdGVkKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3J1bm5pbmcrK1xuICAgICAgd29ya2VyLmNhbGwoY29udGV4dCwgY3VycmVudC52YWx1ZSwgY3VycmVudC53b3JrZWQpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdW5zaGlmdCAodmFsdWUsIGRvbmUpIHtcbiAgICB2YXIgY3VycmVudCA9IGNhY2hlLmdldCgpXG5cbiAgICBjdXJyZW50LmNvbnRleHQgPSBjb250ZXh0XG4gICAgY3VycmVudC5yZWxlYXNlID0gcmVsZWFzZVxuICAgIGN1cnJlbnQudmFsdWUgPSB2YWx1ZVxuICAgIGN1cnJlbnQuY2FsbGJhY2sgPSBkb25lIHx8IG5vb3BcblxuICAgIGlmIChfcnVubmluZyA9PT0gc2VsZi5jb25jdXJyZW5jeSB8fCBzZWxmLnBhdXNlZCkge1xuICAgICAgaWYgKHF1ZXVlSGVhZCkge1xuICAgICAgICBjdXJyZW50Lm5leHQgPSBxdWV1ZUhlYWRcbiAgICAgICAgcXVldWVIZWFkID0gY3VycmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVIZWFkID0gY3VycmVudFxuICAgICAgICBxdWV1ZVRhaWwgPSBjdXJyZW50XG4gICAgICAgIHNlbGYuc2F0dXJhdGVkKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3J1bm5pbmcrK1xuICAgICAgd29ya2VyLmNhbGwoY29udGV4dCwgY3VycmVudC52YWx1ZSwgY3VycmVudC53b3JrZWQpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVsZWFzZSAoaG9sZGVyKSB7XG4gICAgaWYgKGhvbGRlcikge1xuICAgICAgY2FjaGUucmVsZWFzZShob2xkZXIpXG4gICAgfVxuICAgIHZhciBuZXh0ID0gcXVldWVIZWFkXG4gICAgaWYgKG5leHQpIHtcbiAgICAgIGlmICghc2VsZi5wYXVzZWQpIHtcbiAgICAgICAgaWYgKHF1ZXVlVGFpbCA9PT0gcXVldWVIZWFkKSB7XG4gICAgICAgICAgcXVldWVUYWlsID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSGVhZCA9IG5leHQubmV4dFxuICAgICAgICBuZXh0Lm5leHQgPSBudWxsXG4gICAgICAgIHdvcmtlci5jYWxsKGNvbnRleHQsIG5leHQudmFsdWUsIG5leHQud29ya2VkKVxuICAgICAgICBpZiAocXVldWVUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgc2VsZi5lbXB0eSgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9ydW5uaW5nLS1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKC0tX3J1bm5pbmcgPT09IDApIHtcbiAgICAgIHNlbGYuZHJhaW4oKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGtpbGwgKCkge1xuICAgIHF1ZXVlSGVhZCA9IG51bGxcbiAgICBxdWV1ZVRhaWwgPSBudWxsXG4gICAgc2VsZi5kcmFpbiA9IG5vb3BcbiAgfVxuXG4gIGZ1bmN0aW9uIGtpbGxBbmREcmFpbiAoKSB7XG4gICAgcXVldWVIZWFkID0gbnVsbFxuICAgIHF1ZXVlVGFpbCA9IG51bGxcbiAgICBzZWxmLmRyYWluKClcbiAgICBzZWxmLmRyYWluID0gbm9vcFxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3IgKGhhbmRsZXIpIHtcbiAgICBlcnJvckhhbmRsZXIgPSBoYW5kbGVyXG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBUYXNrICgpIHtcbiAgdGhpcy52YWx1ZSA9IG51bGxcbiAgdGhpcy5jYWxsYmFjayA9IG5vb3BcbiAgdGhpcy5uZXh0ID0gbnVsbFxuICB0aGlzLnJlbGVhc2UgPSBub29wXG4gIHRoaXMuY29udGV4dCA9IG51bGxcbiAgdGhpcy5lcnJvckhhbmRsZXIgPSBudWxsXG5cbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgdGhpcy53b3JrZWQgPSBmdW5jdGlvbiB3b3JrZWQgKGVyciwgcmVzdWx0KSB7XG4gICAgdmFyIGNhbGxiYWNrID0gc2VsZi5jYWxsYmFja1xuICAgIHZhciBlcnJvckhhbmRsZXIgPSBzZWxmLmVycm9ySGFuZGxlclxuICAgIHZhciB2YWwgPSBzZWxmLnZhbHVlXG4gICAgc2VsZi52YWx1ZSA9IG51bGxcbiAgICBzZWxmLmNhbGxiYWNrID0gbm9vcFxuICAgIGlmIChzZWxmLmVycm9ySGFuZGxlcikge1xuICAgICAgZXJyb3JIYW5kbGVyKGVyciwgdmFsKVxuICAgIH1cbiAgICBjYWxsYmFjay5jYWxsKHNlbGYuY29udGV4dCwgZXJyLCByZXN1bHQpXG4gICAgc2VsZi5yZWxlYXNlKHNlbGYpXG4gIH1cbn1cblxuZnVuY3Rpb24gcXVldWVBc1Byb21pc2VkIChjb250ZXh0LCB3b3JrZXIsIGNvbmN1cnJlbmN5KSB7XG4gIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbmN1cnJlbmN5ID0gd29ya2VyXG4gICAgd29ya2VyID0gY29udGV4dFxuICAgIGNvbnRleHQgPSBudWxsXG4gIH1cblxuICBmdW5jdGlvbiBhc3luY1dyYXBwZXIgKGFyZywgY2IpIHtcbiAgICB3b3JrZXIuY2FsbCh0aGlzLCBhcmcpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGNiKG51bGwsIHJlcylcbiAgICAgIH0sIGNiKVxuICB9XG5cbiAgdmFyIHF1ZXVlID0gZmFzdHF1ZXVlKGNvbnRleHQsIGFzeW5jV3JhcHBlciwgY29uY3VycmVuY3kpXG5cbiAgdmFyIHB1c2hDYiA9IHF1ZXVlLnB1c2hcbiAgdmFyIHVuc2hpZnRDYiA9IHF1ZXVlLnVuc2hpZnRcblxuICBxdWV1ZS5wdXNoID0gcHVzaFxuICBxdWV1ZS51bnNoaWZ0ID0gdW5zaGlmdFxuICBxdWV1ZS5kcmFpbmVkID0gZHJhaW5lZFxuXG4gIHJldHVybiBxdWV1ZVxuXG4gIGZ1bmN0aW9uIHB1c2ggKHZhbHVlKSB7XG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBwdXNoQ2IodmFsdWUsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIExldCdzIGZvcmsgdGhlIHByb21pc2UgY2hhaW4gdG9cbiAgICAvLyBtYWtlIHRoZSBlcnJvciBidWJibGUgdXAgdG8gdGhlIHVzZXIgYnV0XG4gICAgLy8gbm90IGxlYWQgdG8gYSB1bmhhbmRsZWRSZWplY3Rpb25cbiAgICBwLmNhdGNoKG5vb3ApXG5cbiAgICByZXR1cm4gcFxuICB9XG5cbiAgZnVuY3Rpb24gdW5zaGlmdCAodmFsdWUpIHtcbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHVuc2hpZnRDYih2YWx1ZSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgLy8gTGV0J3MgZm9yayB0aGUgcHJvbWlzZSBjaGFpbiB0b1xuICAgIC8vIG1ha2UgdGhlIGVycm9yIGJ1YmJsZSB1cCB0byB0aGUgdXNlciBidXRcbiAgICAvLyBub3QgbGVhZCB0byBhIHVuaGFuZGxlZFJlamVjdGlvblxuICAgIHAuY2F0Y2gobm9vcClcblxuICAgIHJldHVybiBwXG4gIH1cblxuICBmdW5jdGlvbiBkcmFpbmVkICgpIHtcbiAgICBpZiAocXVldWUuaWRsZSgpKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0RyYWluID0gcXVldWUuZHJhaW5cblxuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHF1ZXVlLmRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcmV2aW91c0RyYWluKClcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBwXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmYXN0cXVldWVcbm1vZHVsZS5leHBvcnRzLnByb21pc2UgPSBxdWV1ZUFzUHJvbWlzZWRcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IGV4cG9ydHMucmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yID0gZXhwb3J0cy5pc0FwcGxpZWRGaWx0ZXIgPSBleHBvcnRzLmlzRmF0YWxFcnJvciA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzRmF0YWxFcnJvcihzZXR0aW5ncywgZXJyb3IpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXJyb3JGaWx0ZXIgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhc2V0dGluZ3MuZXJyb3JGaWx0ZXIoZXJyb3IpO1xufVxuZXhwb3J0cy5pc0ZhdGFsRXJyb3IgPSBpc0ZhdGFsRXJyb3I7XG5mdW5jdGlvbiBpc0FwcGxpZWRGaWx0ZXIoZmlsdGVyLCB2YWx1ZSkge1xuICAgIHJldHVybiBmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyKHZhbHVlKTtcbn1cbmV4cG9ydHMuaXNBcHBsaWVkRmlsdGVyID0gaXNBcHBsaWVkRmlsdGVyO1xuZnVuY3Rpb24gcmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yKGZpbGVwYXRoLCBzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gZmlsZXBhdGguc3BsaXQoL1svXFxcXF0vKS5qb2luKHNlcGFyYXRvcik7XG59XG5leHBvcnRzLnJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvciA9IHJlcGxhY2VQYXRoU2VnbWVudFNlcGFyYXRvcjtcbmZ1bmN0aW9uIGpvaW5QYXRoU2VnbWVudHMoYSwgYiwgc2VwYXJhdG9yKSB7XG4gICAgaWYgKGEgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29ycmVjdCBoYW5kbGluZyBvZiBjYXNlcyB3aGVuIHRoZSBmaXJzdCBzZWdtZW50IGlzIGEgcm9vdCAoYC9gLCBgQzovYCkgb3IgVU5DIHBhdGggKGAvLz8vQzovYCkuXG4gICAgICovXG4gICAgaWYgKGEuZW5kc1dpdGgoc2VwYXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gYSArIGI7XG4gICAgfVxuICAgIHJldHVybiBhICsgc2VwYXJhdG9yICsgYjtcbn1cbmV4cG9ydHMuam9pblBhdGhTZWdtZW50cyA9IGpvaW5QYXRoU2VnbWVudHM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5jbGFzcyBSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcm9vdCA9IGNvbW1vbi5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IoX3Jvb3QsIF9zZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgZnNTY2FuZGlyID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnNjYW5kaXJcIik7XG5jb25zdCBmYXN0cSA9IHJlcXVpcmUoXCJmYXN0cVwiKTtcbmNvbnN0IGNvbW1vbiA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgQXN5bmNSZWFkZXIgZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKF9yb290LCBfc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fc2NhbmRpciA9IGZzU2NhbmRpci5zY2FuZGlyO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IGV2ZW50c18xLkV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IGZhc3RxKHRoaXMuX3dvcmtlci5iaW5kKHRoaXMpLCB0aGlzLl9zZXR0aW5ncy5jb25jdXJyZW5jeSk7XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9xdWV1ZS5kcmFpbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5faXNGYXRhbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KCdlbmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5faXNGYXRhbEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZSh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncy5iYXNlUGF0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1pdHRlcjtcbiAgICB9XG4gICAgZ2V0IGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEZXN0cm95ZWQ7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcmVhZGVyIGlzIGFscmVhZHkgZGVzdHJveWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9xdWV1ZS5raWxsQW5kRHJhaW4oKTtcbiAgICB9XG4gICAgb25FbnRyeShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLm9uKCdlbnRyeScsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgb25FcnJvcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLm9uY2UoJ2Vycm9yJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICBvbkVuZChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLm9uY2UoJ2VuZCcsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgX3B1c2hUb1F1ZXVlKGRpcmVjdG9yeSwgYmFzZSkge1xuICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSB7IGRpcmVjdG9yeSwgYmFzZSB9O1xuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHF1ZXVlSXRlbSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfd29ya2VyKGl0ZW0sIGRvbmUpIHtcbiAgICAgICAgdGhpcy5fc2NhbmRpcihpdGVtLmRpcmVjdG9yeSwgdGhpcy5fc2V0dGluZ3MuZnNTY2FuZGlyU2V0dGluZ3MsIChlcnJvciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZG9uZShlcnJvciwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFbnRyeShlbnRyeSwgaXRlbS5iYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbmUobnVsbCwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9oYW5kbGVFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQgfHwgIWNvbW1vbi5pc0ZhdGFsRXJyb3IodGhpcy5fc2V0dGluZ3MsIGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICB9XG4gICAgX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pc0ZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmdWxscGF0aCA9IGVudHJ5LnBhdGg7XG4gICAgICAgIGlmIChiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjb21tb24uam9pblBhdGhTZWdtZW50cyhiYXNlLCBlbnRyeS5uYW1lLCB0aGlzLl9zZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1vbi5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZW50cnlGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVudHJ5KGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgY29tbW9uLmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5kZWVwRmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKGZ1bGxwYXRoLCBiYXNlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBlbnRyeS5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZW1pdEVudHJ5KGVudHJ5KSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZW50cnknLCBlbnRyeSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQXN5bmNSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvYXN5bmNcIik7XG5jbGFzcyBBc3luY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBhc3luY18xLmRlZmF1bHQodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gW107XG4gICAgfVxuICAgIHJlYWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbnRyeSgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2UucHVzaChlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbmQoKCkgPT4ge1xuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgdGhpcy5fc3RvcmFnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEFzeW5jUHJvdmlkZXI7XG5mdW5jdGlvbiBjYWxsRmFpbHVyZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGNhbGxTdWNjZXNzQ2FsbGJhY2soY2FsbGJhY2ssIGVudHJpZXMpIHtcbiAgICBjYWxsYmFjayhudWxsLCBlbnRyaWVzKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi4vcmVhZGVycy9hc3luY1wiKTtcbmNsYXNzIFN0cmVhbVByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBhc3luY18xLmRlZmF1bHQodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9zdHJlYW0gPSBuZXcgc3RyZWFtXzEuUmVhZGFibGUoe1xuICAgICAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWQ6ICgpID0+IHsgfSxcbiAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3JlYWRlci5pc0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW50cnkoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0ucHVzaChlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbmQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLnB1c2gobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFN0cmVhbVByb3ZpZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNTY2FuZGlyID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnNjYW5kaXJcIik7XG5jb25zdCBjb21tb24gPSByZXF1aXJlKFwiLi9jb21tb25cIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNsYXNzIFN5bmNSZWFkZXIgZXh0ZW5kcyByZWFkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fc2NhbmRpciA9IGZzU2NhbmRpci5zY2FuZGlyU3luYztcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IFtdO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MuYmFzZVBhdGgpO1xuICAgICAgICB0aGlzLl9oYW5kbGVRdWV1ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgICB9XG4gICAgX3B1c2hUb1F1ZXVlKGRpcmVjdG9yeSwgYmFzZSkge1xuICAgICAgICB0aGlzLl9xdWV1ZS5hZGQoeyBkaXJlY3RvcnksIGJhc2UgfSk7XG4gICAgfVxuICAgIF9oYW5kbGVRdWV1ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuX3F1ZXVlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVEaXJlY3RvcnkoaXRlbS5kaXJlY3RvcnksIGl0ZW0uYmFzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZURpcmVjdG9yeShkaXJlY3RvcnksIGJhc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLl9zY2FuZGlyKGRpcmVjdG9yeSwgdGhpcy5fc2V0dGluZ3MuZnNTY2FuZGlyU2V0dGluZ3MpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRW50cnkoZW50cnksIGJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAoIWNvbW1vbi5pc0ZhdGFsRXJyb3IodGhpcy5fc2V0dGluZ3MsIGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBfaGFuZGxlRW50cnkoZW50cnksIGJhc2UpIHtcbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSBlbnRyeS5wYXRoO1xuICAgICAgICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbnRyeS5wYXRoID0gY29tbW9uLmpvaW5QYXRoU2VnbWVudHMoYmFzZSwgZW50cnkubmFtZSwgdGhpcy5fc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmVudHJ5RmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1N0b3JhZ2UoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBjb21tb24uaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmRlZXBGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUoZnVsbHBhdGgsIGJhc2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGVudHJ5LnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9wdXNoVG9TdG9yYWdlKGVudHJ5KSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UucHVzaChlbnRyeSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU3luY1JlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL3N5bmNcIik7XG5jbGFzcyBTeW5jUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IHN5bmNfMS5kZWZhdWx0KHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzKTtcbiAgICB9XG4gICAgcmVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU3luY1Byb3ZpZGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnNTY2FuZGlyID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnNjYW5kaXJcIik7XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJhc2VQYXRoLCB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jb25jdXJyZW5jeSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5kZWVwRmlsdGVyLCBudWxsKTtcbiAgICAgICAgdGhpcy5lbnRyeUZpbHRlciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZW50cnlGaWx0ZXIsIG51bGwpO1xuICAgICAgICB0aGlzLmVycm9yRmlsdGVyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5lcnJvckZpbHRlciwgbnVsbCk7XG4gICAgICAgIHRoaXMucGF0aFNlZ21lbnRTZXBhcmF0b3IgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnBhdGhTZWdtZW50U2VwYXJhdG9yLCBwYXRoLnNlcCk7XG4gICAgICAgIHRoaXMuZnNTY2FuZGlyU2V0dGluZ3MgPSBuZXcgZnNTY2FuZGlyLlNldHRpbmdzKHtcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLl9vcHRpb25zLmZzLFxuICAgICAgICAgICAgcGF0aFNlZ21lbnRTZXBhcmF0b3I6IHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsXG4gICAgICAgICAgICBzdGF0czogdGhpcy5fb3B0aW9ucy5zdGF0cyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB2b2lkIDAgPyBvcHRpb24gOiB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBTZXR0aW5ncztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2V0dGluZ3MgPSBleHBvcnRzLndhbGtTdHJlYW0gPSBleHBvcnRzLndhbGtTeW5jID0gZXhwb3J0cy53YWxrID0gdm9pZCAwO1xuY29uc3QgYXN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9hc3luY1wiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJzL3N0cmVhbVwiKTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zeW5jXCIpO1xuY29uc3Qgc2V0dGluZ3NfMSA9IHJlcXVpcmUoXCIuL3NldHRpbmdzXCIpO1xuZXhwb3J0cy5TZXR0aW5ncyA9IHNldHRpbmdzXzEuZGVmYXVsdDtcbmZ1bmN0aW9uIHdhbGsoZGlyZWN0b3J5LCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmV3IGFzeW5jXzEuZGVmYXVsdChkaXJlY3RvcnksIGdldFNldHRpbmdzKCkpLnJlYWQob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXcgYXN5bmNfMS5kZWZhdWx0KGRpcmVjdG9yeSwgZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKSkucmVhZChjYWxsYmFjayk7XG59XG5leHBvcnRzLndhbGsgPSB3YWxrO1xuZnVuY3Rpb24gd2Fsa1N5bmMoZGlyZWN0b3J5LCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IHN5bmNfMS5kZWZhdWx0KGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xuICAgIHJldHVybiBwcm92aWRlci5yZWFkKCk7XG59XG5leHBvcnRzLndhbGtTeW5jID0gd2Fsa1N5bmM7XG5mdW5jdGlvbiB3YWxrU3RyZWFtKGRpcmVjdG9yeSwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBzdHJlYW1fMS5kZWZhdWx0KGRpcmVjdG9yeSwgc2V0dGluZ3MpO1xuICAgIHJldHVybiBwcm92aWRlci5yZWFkKCk7XG59XG5leHBvcnRzLndhbGtTdHJlYW0gPSB3YWxrU3RyZWFtO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3Moc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gc2V0dGluZ3NPck9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KHNldHRpbmdzT3JPcHRpb25zKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5jbGFzcyBSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fZnNTdGF0U2V0dGluZ3MgPSBuZXcgZnNTdGF0LlNldHRpbmdzKHtcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLl9zZXR0aW5ncy5mcyxcbiAgICAgICAgICAgIHRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldEZ1bGxFbnRyeVBhdGgoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIGZpbGVwYXRoKTtcbiAgICB9XG4gICAgX21ha2VFbnRyeShzdGF0cywgcGF0dGVybikge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIG5hbWU6IHBhdHRlcm4sXG4gICAgICAgICAgICBwYXRoOiBwYXR0ZXJuLFxuICAgICAgICAgICAgZGlyZW50OiB1dGlscy5mcy5jcmVhdGVEaXJlbnRGcm9tU3RhdHMocGF0dGVybiwgc3RhdHMpXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5zdGF0cykge1xuICAgICAgICAgICAgZW50cnkuc3RhdHMgPSBzdGF0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIF9pc0ZhdGFsRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICF1dGlscy5lcnJuby5pc0Vub2VudENvZGVFcnJvcihlcnJvcikgJiYgIXRoaXMuX3NldHRpbmdzLnN1cHByZXNzRXJyb3JzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IGZzU3RhdCA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy5zdGF0XCIpO1xuY29uc3QgZnNXYWxrID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLndhbGtcIik7XG5jb25zdCByZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlYWRlclwiKTtcbmNsYXNzIFJlYWRlclN0cmVhbSBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl93YWxrU3RyZWFtID0gZnNXYWxrLndhbGtTdHJlYW07XG4gICAgICAgIHRoaXMuX3N0YXQgPSBmc1N0YXQuc3RhdDtcbiAgICB9XG4gICAgZHluYW1pYyhyb290LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrU3RyZWFtKHJvb3QsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBzdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZmlsZXBhdGhzID0gcGF0dGVybnMubWFwKHRoaXMuX2dldEZ1bGxFbnRyeVBhdGgsIHRoaXMpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgc3RyZWFtXzEuUGFzc1Rocm91Z2goeyBvYmplY3RNb2RlOiB0cnVlIH0pO1xuICAgICAgICBzdHJlYW0uX3dyaXRlID0gKGluZGV4LCBfZW5jLCBkb25lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cnkoZmlsZXBhdGhzW2luZGV4XSwgcGF0dGVybnNbaW5kZXhdLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIC50aGVuKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPT0gbnVsbCAmJiBvcHRpb25zLmVudHJ5RmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gZmlsZXBhdGhzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkb25lKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH1cbiAgICBfZ2V0RW50cnkoZmlsZXBhdGgsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFN0YXQoZmlsZXBhdGgpXG4gICAgICAgICAgICAudGhlbigoc3RhdHMpID0+IHRoaXMuX21ha2VFbnRyeShzdGF0cywgcGF0dGVybikpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lcnJvckZpbHRlcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFN0YXQoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXQoZmlsZXBhdGgsIHRoaXMuX2ZzU3RhdFNldHRpbmdzLCAoZXJyb3IsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yID09PSBudWxsID8gcmVzb2x2ZShzdGF0cykgOiByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlclN0cmVhbTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGZzV2FsayA9IHJlcXVpcmUoXCJAbm9kZWxpYi9mcy53YWxrXCIpO1xuY29uc3QgcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9yZWFkZXJcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCIuL3N0cmVhbVwiKTtcbmNsYXNzIFJlYWRlckFzeW5jIGV4dGVuZHMgcmVhZGVyXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3dhbGtBc3luYyA9IGZzV2Fsay53YWxrO1xuICAgICAgICB0aGlzLl9yZWFkZXJTdHJlYW0gPSBuZXcgc3RyZWFtXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2Fsa0FzeW5jKHJvb3QsIG9wdGlvbnMsIChlcnJvciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGVudHJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gW107XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX3JlYWRlclN0cmVhbS5zdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpO1xuICAgICAgICAvLyBBZnRlciAjMjM1LCByZXBsYWNlIGl0IHdpdGggYW4gYXN5bmNocm9ub3VzIGl0ZXJhdG9yLlxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgICAgIHN0cmVhbS5vbignZGF0YScsIChlbnRyeSkgPT4gZW50cmllcy5wdXNoKGVudHJ5KSk7XG4gICAgICAgICAgICBzdHJlYW0ub25jZSgnZW5kJywgKCkgPT4gcmVzb2x2ZShlbnRyaWVzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFJlYWRlckFzeW5jO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBNYXRjaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihfcGF0dGVybnMsIF9zZXR0aW5ncywgX21pY3JvbWF0Y2hPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3BhdHRlcm5zID0gX3BhdHRlcm5zO1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMgPSBfbWljcm9tYXRjaE9wdGlvbnM7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcbiAgICAgICAgdGhpcy5fZmlsbFN0b3JhZ2UoKTtcbiAgICB9XG4gICAgX2ZpbGxTdG9yYWdlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdGhpcy5fcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5fZ2V0UGF0dGVyblNlZ21lbnRzKHBhdHRlcm4pO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLl9zcGxpdFNlZ21lbnRzSW50b1NlY3Rpb25zKHNlZ21lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2UucHVzaCh7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6IHNlY3Rpb25zLmxlbmd0aCA8PSAxLFxuICAgICAgICAgICAgICAgIHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgc2VjdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRQYXR0ZXJuU2VnbWVudHMocGF0dGVybikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHV0aWxzLnBhdHRlcm4uZ2V0UGF0dGVyblBhcnRzKHBhdHRlcm4sIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHluYW1pYyA9IHV0aWxzLnBhdHRlcm4uaXNEeW5hbWljUGF0dGVybihwYXJ0LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgICAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogcGFydFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGR5bmFtaWM6IHRydWUsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogcGFydCxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuUmU6IHV0aWxzLnBhdHRlcm4ubWFrZVJlKHBhcnQsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zcGxpdFNlZ21lbnRzSW50b1NlY3Rpb25zKHNlZ21lbnRzKSB7XG4gICAgICAgIHJldHVybiB1dGlscy5hcnJheS5zcGxpdFdoZW4oc2VnbWVudHMsIChzZWdtZW50KSA9PiBzZWdtZW50LmR5bmFtaWMgJiYgdXRpbHMucGF0dGVybi5oYXNHbG9iU3RhcihzZWdtZW50LnBhdHRlcm4pKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBNYXRjaGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgbWF0Y2hlcl8xID0gcmVxdWlyZShcIi4vbWF0Y2hlclwiKTtcbmNsYXNzIFBhcnRpYWxNYXRjaGVyIGV4dGVuZHMgbWF0Y2hlcl8xLmRlZmF1bHQge1xuICAgIG1hdGNoKGZpbGVwYXRoKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gZmlsZXBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3QgbGV2ZWxzID0gcGFydHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuX3N0b3JhZ2UuZmlsdGVyKChpbmZvKSA9PiAhaW5mby5jb21wbGV0ZSB8fCBpbmZvLnNlZ21lbnRzLmxlbmd0aCA+IGxldmVscyk7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHBhdHRlcm4uc2VjdGlvbnNbMF07XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIHBhdHRlcm4gaGFzIGEgZ2xvYnN0YXIgYW5kIHdlIG11c3QgcmVhZCBhbGwgZGlyZWN0b3JpZXMgdW5jb25kaXRpb25hbGx5LFxuICAgICAgICAgICAgICogYnV0IG9ubHkgaWYgdGhlIGxldmVsIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGdyb3VwLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIGZpeHR1cmVzL3thLGJ9LyoqXG4gICAgICAgICAgICAgKiAgXiB0cnVlL2ZhbHNlICBeIGFsd2F5cyB0cnVlXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKCFwYXR0ZXJuLmNvbXBsZXRlICYmIGxldmVscyA+IHNlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhcnRzLmV2ZXJ5KChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBwYXR0ZXJuLnNlZ21lbnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5keW5hbWljICYmIHNlZ21lbnQucGF0dGVyblJlLnRlc3QocGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2VnbWVudC5keW5hbWljICYmIHNlZ21lbnQucGF0dGVybiA9PT0gcGFydCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUGFydGlhbE1hdGNoZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi91dGlsc1wiKTtcbmNvbnN0IHBhcnRpYWxfMSA9IHJlcXVpcmUoXCIuLi9tYXRjaGVycy9wYXJ0aWFsXCIpO1xuY2xhc3MgRGVlcEZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzLCBfbWljcm9tYXRjaE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xuICAgIH1cbiAgICBnZXRGaWx0ZXIoYmFzZVBhdGgsIHBvc2l0aXZlLCBuZWdhdGl2ZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVyID0gdGhpcy5fZ2V0TWF0Y2hlcihwb3NpdGl2ZSk7XG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlUmUgPSB0aGlzLl9nZXROZWdhdGl2ZVBhdHRlcm5zUmUobmVnYXRpdmUpO1xuICAgICAgICByZXR1cm4gKGVudHJ5KSA9PiB0aGlzLl9maWx0ZXIoYmFzZVBhdGgsIGVudHJ5LCBtYXRjaGVyLCBuZWdhdGl2ZVJlKTtcbiAgICB9XG4gICAgX2dldE1hdGNoZXIocGF0dGVybnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwYXJ0aWFsXzEuZGVmYXVsdChwYXR0ZXJucywgdGhpcy5fc2V0dGluZ3MsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICB9XG4gICAgX2dldE5lZ2F0aXZlUGF0dGVybnNSZShwYXR0ZXJucykge1xuICAgICAgICBjb25zdCBhZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm5zID0gcGF0dGVybnMuZmlsdGVyKHV0aWxzLnBhdHRlcm4uaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4pO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKGFmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybnMsIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcbiAgICB9XG4gICAgX2ZpbHRlcihiYXNlUGF0aCwgZW50cnksIG1hdGNoZXIsIG5lZ2F0aXZlUmUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZEJ5RGVlcChiYXNlUGF0aCwgZW50cnkucGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkU3ltYm9saWNMaW5rKGVudHJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdXRpbHMucGF0aC5yZW1vdmVMZWFkaW5nRG90U2VnbWVudChlbnRyeS5wYXRoKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZEJ5UG9zaXRpdmVQYXR0ZXJucyhmaWxlcGF0aCwgbWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faXNTa2lwcGVkQnlOZWdhdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBuZWdhdGl2ZVJlKTtcbiAgICB9XG4gICAgX2lzU2tpcHBlZEJ5RGVlcChiYXNlUGF0aCwgZW50cnlQYXRoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBdm9pZCB1bm5lY2Vzc2FyeSBkZXB0aCBjYWxjdWxhdGlvbnMgd2hlbiBpdCBkb2Vzbid0IG1hdHRlci5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5kZWVwID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyeUxldmVsKGJhc2VQYXRoLCBlbnRyeVBhdGgpID49IHRoaXMuX3NldHRpbmdzLmRlZXA7XG4gICAgfVxuICAgIF9nZXRFbnRyeUxldmVsKGJhc2VQYXRoLCBlbnRyeVBhdGgpIHtcbiAgICAgICAgY29uc3QgZW50cnlQYXRoRGVwdGggPSBlbnRyeVBhdGguc3BsaXQoJy8nKS5sZW5ndGg7XG4gICAgICAgIGlmIChiYXNlUGF0aCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeVBhdGhEZXB0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYXNlUGF0aERlcHRoID0gYmFzZVBhdGguc3BsaXQoJy8nKS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBlbnRyeVBhdGhEZXB0aCAtIGJhc2VQYXRoRGVwdGg7XG4gICAgfVxuICAgIF9pc1NraXBwZWRTeW1ib2xpY0xpbmsoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzICYmIGVudHJ5LmRpcmVudC5pc1N5bWJvbGljTGluaygpO1xuICAgIH1cbiAgICBfaXNTa2lwcGVkQnlQb3NpdGl2ZVBhdHRlcm5zKGVudHJ5UGF0aCwgbWF0Y2hlcikge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3NldHRpbmdzLmJhc2VOYW1lTWF0Y2ggJiYgIW1hdGNoZXIubWF0Y2goZW50cnlQYXRoKTtcbiAgICB9XG4gICAgX2lzU2tpcHBlZEJ5TmVnYXRpdmVQYXR0ZXJucyhlbnRyeVBhdGgsIHBhdHRlcm5zUmUpIHtcbiAgICAgICAgcmV0dXJuICF1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGVudHJ5UGF0aCwgcGF0dGVybnNSZSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRGVlcEZpbHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY2xhc3MgRW50cnlGaWx0ZXIge1xuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncywgX21pY3JvbWF0Y2hPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyA9IF9taWNyb21hdGNoT3B0aW9ucztcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0RmlsdGVyKHBvc2l0aXZlLCBuZWdhdGl2ZSkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZVJlID0gdXRpbHMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKHBvc2l0aXZlLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlUmUgPSB1dGlscy5wYXR0ZXJuLmNvbnZlcnRQYXR0ZXJuc1RvUmUobmVnYXRpdmUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fbWljcm9tYXRjaE9wdGlvbnMpLCB7IGRvdDogdHJ1ZSB9KSk7XG4gICAgICAgIHJldHVybiAoZW50cnkpID0+IHRoaXMuX2ZpbHRlcihlbnRyeSwgcG9zaXRpdmVSZSwgbmVnYXRpdmVSZSk7XG4gICAgfVxuICAgIF9maWx0ZXIoZW50cnksIHBvc2l0aXZlUmUsIG5lZ2F0aXZlUmUpIHtcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSB1dGlscy5wYXRoLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5LnBhdGgpO1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MudW5pcXVlICYmIHRoaXMuX2lzRHVwbGljYXRlRW50cnkoZmlsZXBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29ubHlGaWxlRmlsdGVyKGVudHJ5KSB8fCB0aGlzLl9vbmx5RGlyZWN0b3J5RmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeUFic29sdXRlTmVnYXRpdmVQYXR0ZXJucyhmaWxlcGF0aCwgbmVnYXRpdmVSZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpO1xuICAgICAgICBjb25zdCBpc01hdGNoZWQgPSB0aGlzLl9pc01hdGNoVG9QYXR0ZXJucyhmaWxlcGF0aCwgcG9zaXRpdmVSZSwgaXNEaXJlY3RvcnkpICYmICF0aGlzLl9pc01hdGNoVG9QYXR0ZXJucyhmaWxlcGF0aCwgbmVnYXRpdmVSZSwgaXNEaXJlY3RvcnkpO1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MudW5pcXVlICYmIGlzTWF0Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlSW5kZXhSZWNvcmQoZmlsZXBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc01hdGNoZWQ7XG4gICAgfVxuICAgIF9pc0R1cGxpY2F0ZUVudHJ5KGZpbGVwYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LmhhcyhmaWxlcGF0aCk7XG4gICAgfVxuICAgIF9jcmVhdGVJbmRleFJlY29yZChmaWxlcGF0aCkge1xuICAgICAgICB0aGlzLmluZGV4LnNldChmaWxlcGF0aCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgX29ubHlGaWxlRmlsdGVyKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5vbmx5RmlsZXMgJiYgIWVudHJ5LmRpcmVudC5pc0ZpbGUoKTtcbiAgICB9XG4gICAgX29ubHlEaXJlY3RvcnlGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLm9ubHlEaXJlY3RvcmllcyAmJiAhZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XG4gICAgfVxuICAgIF9pc1NraXBwZWRCeUFic29sdXRlTmVnYXRpdmVQYXR0ZXJucyhlbnRyeVBhdGgsIHBhdHRlcm5zUmUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdXRpbHMucGF0aC5tYWtlQWJzb2x1dGUodGhpcy5fc2V0dGluZ3MuY3dkLCBlbnRyeVBhdGgpO1xuICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5tYXRjaEFueShmdWxscGF0aCwgcGF0dGVybnNSZSk7XG4gICAgfVxuICAgIF9pc01hdGNoVG9QYXR0ZXJucyhmaWxlcGF0aCwgcGF0dGVybnNSZSwgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgLy8gVHJ5aW5nIHRvIG1hdGNoIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBieSBwYXR0ZXJucy5cbiAgICAgICAgY29uc3QgaXNNYXRjaGVkID0gdXRpbHMucGF0dGVybi5tYXRjaEFueShmaWxlcGF0aCwgcGF0dGVybnNSZSk7XG4gICAgICAgIC8vIEEgcGF0dGVybiB3aXRoIGEgdHJhaWxsaW5nIHNsYXNoIGNhbiBiZSB1c2VkIGZvciBkaXJlY3RvcnkgbWF0Y2hpbmcuXG4gICAgICAgIC8vIFRvIGFwcGx5IHN1Y2ggcGF0dGVybiwgd2UgbmVlZCB0byBhZGQgYSB0cmFsbGluZyBzbGFzaCB0byB0aGUgcGF0aC5cbiAgICAgICAgaWYgKCFpc01hdGNoZWQgJiYgaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLm1hdGNoQW55KGZpbGVwYXRoICsgJy8nLCBwYXR0ZXJuc1JlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNNYXRjaGVkO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVudHJ5RmlsdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHNcIik7XG5jbGFzcyBFcnJvckZpbHRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgIH1cbiAgICBnZXRGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiAoZXJyb3IpID0+IHRoaXMuX2lzTm9uRmF0YWxFcnJvcihlcnJvcik7XG4gICAgfVxuICAgIF9pc05vbkZhdGFsRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmVycm5vLmlzRW5vZW50Q29kZUVycm9yKGVycm9yKSB8fCB0aGlzLl9zZXR0aW5ncy5zdXBwcmVzc0Vycm9ycztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFcnJvckZpbHRlcjtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzXCIpO1xuY2xhc3MgRW50cnlUcmFuc2Zvcm1lciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgIH1cbiAgICBnZXRUcmFuc2Zvcm1lcigpIHtcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fdHJhbnNmb3JtKGVudHJ5KTtcbiAgICB9XG4gICAgX3RyYW5zZm9ybShlbnRyeSkge1xuICAgICAgICBsZXQgZmlsZXBhdGggPSBlbnRyeS5wYXRoO1xuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIGZpbGVwYXRoID0gdXRpbHMucGF0aC5tYWtlQWJzb2x1dGUodGhpcy5fc2V0dGluZ3MuY3dkLCBmaWxlcGF0aCk7XG4gICAgICAgICAgICBmaWxlcGF0aCA9IHV0aWxzLnBhdGgudW5peGlmeShmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLm1hcmtEaXJlY3RvcmllcyAmJiBlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgZmlsZXBhdGggKz0gJy8nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3Mub2JqZWN0TW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVwYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGVudHJ5KSwgeyBwYXRoOiBmaWxlcGF0aCB9KTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFbnRyeVRyYW5zZm9ybWVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZGVlcF8xID0gcmVxdWlyZShcIi4vZmlsdGVycy9kZWVwXCIpO1xuY29uc3QgZW50cnlfMSA9IHJlcXVpcmUoXCIuL2ZpbHRlcnMvZW50cnlcIik7XG5jb25zdCBlcnJvcl8xID0gcmVxdWlyZShcIi4vZmlsdGVycy9lcnJvclwiKTtcbmNvbnN0IGVudHJ5XzIgPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1lcnMvZW50cnlcIik7XG5jbGFzcyBQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLmVycm9yRmlsdGVyID0gbmV3IGVycm9yXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZW50cnlGaWx0ZXIgPSBuZXcgZW50cnlfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzLCB0aGlzLl9nZXRNaWNyb21hdGNoT3B0aW9ucygpKTtcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyID0gbmV3IGRlZXBfMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzLCB0aGlzLl9nZXRNaWNyb21hdGNoT3B0aW9ucygpKTtcbiAgICAgICAgdGhpcy5lbnRyeVRyYW5zZm9ybWVyID0gbmV3IGVudHJ5XzIuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIF9nZXRSb290RGlyZWN0b3J5KHRhc2spIHtcbiAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIHRhc2suYmFzZSk7XG4gICAgfVxuICAgIF9nZXRSZWFkZXJPcHRpb25zKHRhc2spIHtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSB0YXNrLmJhc2UgPT09ICcuJyA/ICcnIDogdGFzay5iYXNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgICBwYXRoU2VnbWVudFNlcGFyYXRvcjogJy8nLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IHRoaXMuX3NldHRpbmdzLmNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgZGVlcEZpbHRlcjogdGhpcy5kZWVwRmlsdGVyLmdldEZpbHRlcihiYXNlUGF0aCwgdGFzay5wb3NpdGl2ZSwgdGFzay5uZWdhdGl2ZSksXG4gICAgICAgICAgICBlbnRyeUZpbHRlcjogdGhpcy5lbnRyeUZpbHRlci5nZXRGaWx0ZXIodGFzay5wb3NpdGl2ZSwgdGFzay5uZWdhdGl2ZSksXG4gICAgICAgICAgICBlcnJvckZpbHRlcjogdGhpcy5lcnJvckZpbHRlci5nZXRGaWx0ZXIoKSxcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IHRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5fc2V0dGluZ3MuZnMsXG4gICAgICAgICAgICBzdGF0czogdGhpcy5fc2V0dGluZ3Muc3RhdHMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX3NldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5lbnRyeVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG90OiB0aGlzLl9zZXR0aW5ncy5kb3QsXG4gICAgICAgICAgICBtYXRjaEJhc2U6IHRoaXMuX3NldHRpbmdzLmJhc2VOYW1lTWF0Y2gsXG4gICAgICAgICAgICBub2JyYWNlOiAhdGhpcy5fc2V0dGluZ3MuYnJhY2VFeHBhbnNpb24sXG4gICAgICAgICAgICBub2Nhc2U6ICF0aGlzLl9zZXR0aW5ncy5jYXNlU2Vuc2l0aXZlTWF0Y2gsXG4gICAgICAgICAgICBub2V4dDogIXRoaXMuX3NldHRpbmdzLmV4dGdsb2IsXG4gICAgICAgICAgICBub2dsb2JzdGFyOiAhdGhpcy5fc2V0dGluZ3MuZ2xvYnN0YXIsXG4gICAgICAgICAgICBwb3NpeDogdHJ1ZSxcbiAgICAgICAgICAgIHN0cmljdFNsYXNoZXM6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUHJvdmlkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBhc3luY18xID0gcmVxdWlyZShcIi4uL3JlYWRlcnMvYXN5bmNcIik7XG5jb25zdCBwcm92aWRlcl8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJcIik7XG5jbGFzcyBQcm92aWRlckFzeW5jIGV4dGVuZHMgcHJvdmlkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWQodGFzaykge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2dldFJlYWRlck9wdGlvbnModGFzayk7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKChlbnRyeSkgPT4gb3B0aW9ucy50cmFuc2Zvcm0oZW50cnkpKTtcbiAgICB9XG4gICAgYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyQXN5bmM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBzdHJlYW1fMiA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL3N0cmVhbVwiKTtcbmNvbnN0IHByb3ZpZGVyXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlclwiKTtcbmNsYXNzIFByb3ZpZGVyU3RyZWFtIGV4dGVuZHMgcHJvdmlkZXJfMS5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IHN0cmVhbV8yLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZWFkKHRhc2spIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2dldFJvb3REaXJlY3RvcnkodGFzayk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZWFkZXJPcHRpb25zKHRhc2spO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBuZXcgc3RyZWFtXzEuUmVhZGFibGUoeyBvYmplY3RNb2RlOiB0cnVlLCByZWFkOiAoKSA9PiB7IH0gfSk7XG4gICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiBkZXN0aW5hdGlvbi5lbWl0KCdlcnJvcicsIGVycm9yKSlcbiAgICAgICAgICAgIC5vbignZGF0YScsIChlbnRyeSkgPT4gZGVzdGluYXRpb24uZW1pdCgnZGF0YScsIG9wdGlvbnMudHJhbnNmb3JtKGVudHJ5KSkpXG4gICAgICAgICAgICAub25jZSgnZW5kJywgKCkgPT4gZGVzdGluYXRpb24uZW1pdCgnZW5kJykpO1xuICAgICAgICBkZXN0aW5hdGlvblxuICAgICAgICAgICAgLm9uY2UoJ2Nsb3NlJywgKCkgPT4gc291cmNlLmRlc3Ryb3koKSk7XG4gICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgICB9XG4gICAgYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5keW5hbWljKHJvb3QsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyU3RyZWFtO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNTdGF0ID0gcmVxdWlyZShcIkBub2RlbGliL2ZzLnN0YXRcIik7XG5jb25zdCBmc1dhbGsgPSByZXF1aXJlKFwiQG5vZGVsaWIvZnMud2Fsa1wiKTtcbmNvbnN0IHJlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVhZGVyXCIpO1xuY2xhc3MgUmVhZGVyU3luYyBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl93YWxrU3luYyA9IGZzV2Fsay53YWxrU3luYztcbiAgICAgICAgdGhpcy5fc3RhdFN5bmMgPSBmc1N0YXQuc3RhdFN5bmM7XG4gICAgfVxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Fsa1N5bmMocm9vdCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3QgZmlsZXBhdGggPSB0aGlzLl9nZXRGdWxsRW50cnlQYXRoKHBhdHRlcm4pO1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9nZXRFbnRyeShmaWxlcGF0aCwgcGF0dGVybiwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IG51bGwgfHwgIW9wdGlvbnMuZW50cnlGaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICBfZ2V0RW50cnkoZmlsZXBhdGgsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5fZ2V0U3RhdChmaWxlcGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVycm9yRmlsdGVyKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFN0YXQoZmlsZXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRTeW5jKGZpbGVwYXRoLCB0aGlzLl9mc1N0YXRTZXR0aW5ncyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUmVhZGVyU3luYztcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN5bmNfMSA9IHJlcXVpcmUoXCIuLi9yZWFkZXJzL3N5bmNcIik7XG5jb25zdCBwcm92aWRlcl8xID0gcmVxdWlyZShcIi4vcHJvdmlkZXJcIik7XG5jbGFzcyBQcm92aWRlclN5bmMgZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3luY18xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MpO1xuICAgIH1cbiAgICByZWFkKHRhc2spIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX2dldFJvb3REaXJlY3RvcnkodGFzayk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZWFkZXJPcHRpb25zKHRhc2spO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5hcGkocm9vdCwgdGFzaywgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLm1hcChvcHRpb25zLnRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGFwaShyb290LCB0YXNrLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0YXNrLmR5bmFtaWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuZHluYW1pYyhyb290LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLnN0YXRpYyh0YXNrLnBhdHRlcm5zLCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQcm92aWRlclN5bmM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgb3MgPSByZXF1aXJlKFwib3NcIik7XG4vKipcbiAqIFRoZSBgb3MuY3B1c2AgbWV0aG9kIGNhbiByZXR1cm4gemVyby4gV2UgZXhwZWN0IHRoZSBudW1iZXIgb2YgY29yZXMgdG8gYmUgZ3JlYXRlciB0aGFuIHplcm8uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi83ZmFlZGRmMjNhOThjNTM4OTZmOGI1NzRhNmU2NjU4OWU4ZmIxZWI4L2xpYi9vcy5qcyNMMTA2LUwxMDdcbiAqL1xuY29uc3QgQ1BVX0NPVU5UID0gTWF0aC5tYXgob3MuY3B1cygpLmxlbmd0aCwgMSk7XG5leHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiA9IHtcbiAgICBsc3RhdDogZnMubHN0YXQsXG4gICAgbHN0YXRTeW5jOiBmcy5sc3RhdFN5bmMsXG4gICAgc3RhdDogZnMuc3RhdCxcbiAgICBzdGF0U3luYzogZnMuc3RhdFN5bmMsXG4gICAgcmVhZGRpcjogZnMucmVhZGRpcixcbiAgICByZWFkZGlyU3luYzogZnMucmVhZGRpclN5bmNcbn07XG5jbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuYWJzb2x1dGUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmFic29sdXRlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuYmFzZU5hbWVNYXRjaCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYmFzZU5hbWVNYXRjaCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmJyYWNlRXhwYW5zaW9uID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5icmFjZUV4cGFuc2lvbiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZU1hdGNoID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jYXNlU2Vuc2l0aXZlTWF0Y2gsIHRydWUpO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jb25jdXJyZW5jeSwgQ1BVX0NPVU5UKTtcbiAgICAgICAgdGhpcy5jd2QgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmN3ZCwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgIHRoaXMuZGVlcCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZGVlcCwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLmRvdCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZG90LCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXh0Z2xvYiA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZXh0Z2xvYiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZnMgPSB0aGlzLl9nZXRGaWxlU3lzdGVtTWV0aG9kcyh0aGlzLl9vcHRpb25zLmZzKTtcbiAgICAgICAgdGhpcy5nbG9ic3RhciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZ2xvYnN0YXIsIHRydWUpO1xuICAgICAgICB0aGlzLmlnbm9yZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuaWdub3JlLCBbXSk7XG4gICAgICAgIHRoaXMubWFya0RpcmVjdG9yaWVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5tYXJrRGlyZWN0b3JpZXMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vYmplY3RNb2RlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMub25seURpcmVjdG9yaWVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vbmx5RGlyZWN0b3JpZXMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5vbmx5RmlsZXMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9ubHlGaWxlcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN0YXRzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NFcnJvcnMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN1cHByZXNzRXJyb3JzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmssIGZhbHNlKTtcbiAgICAgICAgdGhpcy51bmlxdWUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnVuaXF1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLm9ubHlEaXJlY3Rvcmllcykge1xuICAgICAgICAgICAgdGhpcy5vbmx5RmlsZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGF0cykge1xuICAgICAgICAgICAgdGhpcy5vYmplY3RNb2RlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW1vdmUgdGhlIGNhc3QgdG8gdGhlIGFycmF5IGluIHRoZSBuZXh0IG1ham9yICgjNDA0KS5cbiAgICAgICAgdGhpcy5pZ25vcmUgPSBbXS5jb25jYXQodGhpcy5pZ25vcmUpO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG9wdGlvbjtcbiAgICB9XG4gICAgX2dldEZpbGVTeXN0ZW1NZXRob2RzKG1ldGhvZHMgPSB7fSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiksIG1ldGhvZHMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFNldHRpbmdzO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuY29uc3QgdGFza01hbmFnZXIgPSByZXF1aXJlKFwiLi9tYW5hZ2Vycy90YXNrc1wiKTtcbmNvbnN0IGFzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvYXN5bmNcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCIuL3Byb3ZpZGVycy9zdHJlYW1cIik7XG5jb25zdCBzeW5jXzEgPSByZXF1aXJlKFwiLi9wcm92aWRlcnMvc3luY1wiKTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5hc3luYyBmdW5jdGlvbiBGYXN0R2xvYihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgY29uc3Qgd29ya3MgPSBnZXRXb3Jrcyhzb3VyY2UsIGFzeW5jXzEuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwod29ya3MpO1xuICAgIHJldHVybiB1dGlscy5hcnJheS5mbGF0dGVuKHJlc3VsdCk7XG59XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXNjcmlwdC1lc2xpbnQvaXNzdWVzLzYwXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG4oZnVuY3Rpb24gKEZhc3RHbG9iKSB7XG4gICAgRmFzdEdsb2IuZ2xvYiA9IEZhc3RHbG9iO1xuICAgIEZhc3RHbG9iLmdsb2JTeW5jID0gc3luYztcbiAgICBGYXN0R2xvYi5nbG9iU3RyZWFtID0gc3RyZWFtO1xuICAgIEZhc3RHbG9iLmFzeW5jID0gRmFzdEdsb2I7XG4gICAgZnVuY3Rpb24gc3luYyhzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgc3luY18xLmRlZmF1bHQsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdXRpbHMuYXJyYXkuZmxhdHRlbih3b3Jrcyk7XG4gICAgfVxuICAgIEZhc3RHbG9iLnN5bmMgPSBzeW5jO1xuICAgIGZ1bmN0aW9uIHN0cmVhbShzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgc3RyZWFtXzEuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc3RyZWFtIHJldHVybmVkIGJ5IHRoZSBwcm92aWRlciBjYW5ub3Qgd29yayB3aXRoIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvci5cbiAgICAgICAgICogVG8gc3VwcG9ydCBhc3luY2hyb25vdXMgaXRlcmF0b3JzLCByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgdGFza3MsIHdlIGFsd2F5cyBtdWx0aXBsZXggc3RyZWFtcy5cbiAgICAgICAgICogVGhpcyBhZmZlY3RzIHBlcmZvcm1hbmNlICgrMjUlKS4gSSBkb24ndCBzZWUgYmVzdCBzb2x1dGlvbiByaWdodCBub3cuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gdXRpbHMuc3RyZWFtLm1lcmdlKHdvcmtzKTtcbiAgICB9XG4gICAgRmFzdEdsb2Iuc3RyZWFtID0gc3RyZWFtO1xuICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGFza3Moc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBbXS5jb25jYXQoc291cmNlKTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGFza01hbmFnZXIuZ2VuZXJhdGUocGF0dGVybnMsIHNldHRpbmdzKTtcbiAgICB9XG4gICAgRmFzdEdsb2IuZ2VuZXJhdGVUYXNrcyA9IGdlbmVyYXRlVGFza3M7XG4gICAgZnVuY3Rpb24gaXNEeW5hbWljUGF0dGVybihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXR0ZXJuLmlzRHluYW1pY1BhdHRlcm4oc291cmNlLCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIEZhc3RHbG9iLmlzRHluYW1pY1BhdHRlcm4gPSBpc0R5bmFtaWNQYXR0ZXJuO1xuICAgIGZ1bmN0aW9uIGVzY2FwZVBhdGgoc291cmNlKSB7XG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguZXNjYXBlKHNvdXJjZSk7XG4gICAgfVxuICAgIEZhc3RHbG9iLmVzY2FwZVBhdGggPSBlc2NhcGVQYXRoO1xuICAgIGZ1bmN0aW9uIGNvbnZlcnRQYXRoVG9QYXR0ZXJuKHNvdXJjZSkge1xuICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB1dGlscy5wYXRoLmNvbnZlcnRQYXRoVG9QYXR0ZXJuKHNvdXJjZSk7XG4gICAgfVxuICAgIEZhc3RHbG9iLmNvbnZlcnRQYXRoVG9QYXR0ZXJuID0gY29udmVydFBhdGhUb1BhdHRlcm47XG4gICAgbGV0IHBvc2l4O1xuICAgIChmdW5jdGlvbiAocG9zaXgpIHtcbiAgICAgICAgZnVuY3Rpb24gZXNjYXBlUGF0aChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXRoLmVzY2FwZVBvc2l4UGF0aChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHBvc2l4LmVzY2FwZVBhdGggPSBlc2NhcGVQYXRoO1xuICAgICAgICBmdW5jdGlvbiBjb252ZXJ0UGF0aFRvUGF0dGVybihzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5wYXRoLmNvbnZlcnRQb3NpeFBhdGhUb1BhdHRlcm4oc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBwb3NpeC5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGNvbnZlcnRQYXRoVG9QYXR0ZXJuO1xuICAgIH0pKHBvc2l4ID0gRmFzdEdsb2IucG9zaXggfHwgKEZhc3RHbG9iLnBvc2l4ID0ge30pKTtcbiAgICBsZXQgd2luMzI7XG4gICAgKGZ1bmN0aW9uICh3aW4zMikge1xuICAgICAgICBmdW5jdGlvbiBlc2NhcGVQYXRoKHNvdXJjZSkge1xuICAgICAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnBhdGguZXNjYXBlV2luZG93c1BhdGgoc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB3aW4zMi5lc2NhcGVQYXRoID0gZXNjYXBlUGF0aDtcbiAgICAgICAgZnVuY3Rpb24gY29udmVydFBhdGhUb1BhdHRlcm4oc291cmNlKSB7XG4gICAgICAgICAgICBhc3NlcnRQYXR0ZXJuc0lucHV0KHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5jb252ZXJ0V2luZG93c1BhdGhUb1BhdHRlcm4oc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB3aW4zMi5jb252ZXJ0UGF0aFRvUGF0dGVybiA9IGNvbnZlcnRQYXRoVG9QYXR0ZXJuO1xuICAgIH0pKHdpbjMyID0gRmFzdEdsb2Iud2luMzIgfHwgKEZhc3RHbG9iLndpbjMyID0ge30pKTtcbn0pKEZhc3RHbG9iIHx8IChGYXN0R2xvYiA9IHt9KSk7XG5mdW5jdGlvbiBnZXRXb3Jrcyhzb3VyY2UsIF9Qcm92aWRlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHBhdHRlcm5zID0gW10uY29uY2F0KHNvdXJjZSk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KG9wdGlvbnMpO1xuICAgIGNvbnN0IHRhc2tzID0gdGFza01hbmFnZXIuZ2VuZXJhdGUocGF0dGVybnMsIHNldHRpbmdzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBfUHJvdmlkZXIoc2V0dGluZ3MpO1xuICAgIHJldHVybiB0YXNrcy5tYXAocHJvdmlkZXIucmVhZCwgcHJvdmlkZXIpO1xufVxuZnVuY3Rpb24gYXNzZXJ0UGF0dGVybnNJbnB1dChpbnB1dCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IFtdLmNvbmNhdChpbnB1dCk7XG4gICAgY29uc3QgaXNWYWxpZFNvdXJjZSA9IHNvdXJjZS5ldmVyeSgoaXRlbSkgPT4gdXRpbHMuc3RyaW5nLmlzU3RyaW5nKGl0ZW0pICYmICF1dGlscy5zdHJpbmcuaXNFbXB0eShpdGVtKSk7XG4gICAgaWYgKCFpc1ZhbGlkU291cmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdHRlcm5zIG11c3QgYmUgYSBzdHJpbmcgKG5vbiBlbXB0eSkgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gRmFzdEdsb2I7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3Qge3Byb21pc2lmeX0gPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIGlzVHlwZShmc1N0YXRUeXBlLCBzdGF0c01ldGhvZE5hbWUsIGZpbGVQYXRoKSB7XG5cdGlmICh0eXBlb2YgZmlsZVBhdGggIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiBmaWxlUGF0aH1gKTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0Y29uc3Qgc3RhdHMgPSBhd2FpdCBwcm9taXNpZnkoZnNbZnNTdGF0VHlwZV0pKGZpbGVQYXRoKTtcblx0XHRyZXR1cm4gc3RhdHNbc3RhdHNNZXRob2ROYW1lXSgpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRocm93IGVycm9yO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzVHlwZVN5bmMoZnNTdGF0VHlwZSwgc3RhdHNNZXRob2ROYW1lLCBmaWxlUGF0aCkge1xuXHRpZiAodHlwZW9mIGZpbGVQYXRoICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nLCBnb3QgJHt0eXBlb2YgZmlsZVBhdGh9YCk7XG5cdH1cblxuXHR0cnkge1xuXHRcdHJldHVybiBmc1tmc1N0YXRUeXBlXShmaWxlUGF0aClbc3RhdHNNZXRob2ROYW1lXSgpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRocm93IGVycm9yO1xuXHR9XG59XG5cbmV4cG9ydHMuaXNGaWxlID0gaXNUeXBlLmJpbmQobnVsbCwgJ3N0YXQnLCAnaXNGaWxlJyk7XG5leHBvcnRzLmlzRGlyZWN0b3J5ID0gaXNUeXBlLmJpbmQobnVsbCwgJ3N0YXQnLCAnaXNEaXJlY3RvcnknKTtcbmV4cG9ydHMuaXNTeW1saW5rID0gaXNUeXBlLmJpbmQobnVsbCwgJ2xzdGF0JywgJ2lzU3ltYm9saWNMaW5rJyk7XG5leHBvcnRzLmlzRmlsZVN5bmMgPSBpc1R5cGVTeW5jLmJpbmQobnVsbCwgJ3N0YXRTeW5jJywgJ2lzRmlsZScpO1xuZXhwb3J0cy5pc0RpcmVjdG9yeVN5bmMgPSBpc1R5cGVTeW5jLmJpbmQobnVsbCwgJ3N0YXRTeW5jJywgJ2lzRGlyZWN0b3J5Jyk7XG5leHBvcnRzLmlzU3ltbGlua1N5bmMgPSBpc1R5cGVTeW5jLmJpbmQobnVsbCwgJ2xzdGF0U3luYycsICdpc1N5bWJvbGljTGluaycpO1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBwYXRoVHlwZSA9IHJlcXVpcmUoJ3BhdGgtdHlwZScpO1xuXG5jb25zdCBnZXRFeHRlbnNpb25zID0gZXh0ZW5zaW9ucyA9PiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgeyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fWAgOiBleHRlbnNpb25zWzBdO1xuXG5jb25zdCBnZXRQYXRoID0gKGZpbGVwYXRoLCBjd2QpID0+IHtcblx0Y29uc3QgcHRoID0gZmlsZXBhdGhbMF0gPT09ICchJyA/IGZpbGVwYXRoLnNsaWNlKDEpIDogZmlsZXBhdGg7XG5cdHJldHVybiBwYXRoLmlzQWJzb2x1dGUocHRoKSA/IHB0aCA6IHBhdGguam9pbihjd2QsIHB0aCk7XG59O1xuXG5jb25zdCBhZGRFeHRlbnNpb25zID0gKGZpbGUsIGV4dGVuc2lvbnMpID0+IHtcblx0aWYgKHBhdGguZXh0bmFtZShmaWxlKSkge1xuXHRcdHJldHVybiBgKiovJHtmaWxlfWA7XG5cdH1cblxuXHRyZXR1cm4gYCoqLyR7ZmlsZX0uJHtnZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpfWA7XG59O1xuXG5jb25zdCBnZXRHbG9iID0gKGRpcmVjdG9yeSwgb3B0aW9ucykgPT4ge1xuXHRpZiAob3B0aW9ucy5maWxlcyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmZpbGVzKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGZpbGVzXFxgIHRvIGJlIG9mIHR5cGUgXFxgQXJyYXlcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5maWxlc31cXGBgKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmV4dGVuc2lvbnMgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucy5leHRlbnNpb25zKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGV4dGVuc2lvbnNcXGAgdG8gYmUgb2YgdHlwZSBcXGBBcnJheVxcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmV4dGVuc2lvbnN9XFxgYCk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5maWxlcyAmJiBvcHRpb25zLmV4dGVuc2lvbnMpIHtcblx0XHRyZXR1cm4gb3B0aW9ucy5maWxlcy5tYXAoeCA9PiBwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCBhZGRFeHRlbnNpb25zKHgsIG9wdGlvbnMuZXh0ZW5zaW9ucykpKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLmZpbGVzKSB7XG5cdFx0cmV0dXJuIG9wdGlvbnMuZmlsZXMubWFwKHggPT4gcGF0aC5wb3NpeC5qb2luKGRpcmVjdG9yeSwgYCoqLyR7eH1gKSk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5leHRlbnNpb25zKSB7XG5cdFx0cmV0dXJuIFtwYXRoLnBvc2l4LmpvaW4oZGlyZWN0b3J5LCBgKiovKi4ke2dldEV4dGVuc2lvbnMob3B0aW9ucy5leHRlbnNpb25zKX1gKV07XG5cdH1cblxuXHRyZXR1cm4gW3BhdGgucG9zaXguam9pbihkaXJlY3RvcnksICcqKicpXTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGlucHV0LCBvcHRpb25zKSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Y3dkOiBwcm9jZXNzLmN3ZCgpLFxuXHRcdC4uLm9wdGlvbnNcblx0fTtcblxuXHRpZiAodHlwZW9mIG9wdGlvbnMuY3dkICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGN3ZFxcYCB0byBiZSBvZiB0eXBlIFxcYHN0cmluZ1xcYCBidXQgcmVjZWl2ZWQgdHlwZSBcXGAke3R5cGVvZiBvcHRpb25zLmN3ZH1cXGBgKTtcblx0fVxuXG5cdGNvbnN0IGdsb2JzID0gYXdhaXQgUHJvbWlzZS5hbGwoW10uY29uY2F0KGlucHV0KS5tYXAoYXN5bmMgeCA9PiB7XG5cdFx0Y29uc3QgaXNEaXJlY3RvcnkgPSBhd2FpdCBwYXRoVHlwZS5pc0RpcmVjdG9yeShnZXRQYXRoKHgsIG9wdGlvbnMuY3dkKSk7XG5cdFx0cmV0dXJuIGlzRGlyZWN0b3J5ID8gZ2V0R2xvYih4LCBvcHRpb25zKSA6IHg7XG5cdH0pKTtcblxuXHRyZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBnbG9icyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXNwcmVhZFxufTtcblxubW9kdWxlLmV4cG9ydHMuc3luYyA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdGN3ZDogcHJvY2Vzcy5jd2QoKSxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cblx0aWYgKHR5cGVvZiBvcHRpb25zLmN3ZCAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjd2RcXGAgdG8gYmUgb2YgdHlwZSBcXGBzdHJpbmdcXGAgYnV0IHJlY2VpdmVkIHR5cGUgXFxgJHt0eXBlb2Ygb3B0aW9ucy5jd2R9XFxgYCk7XG5cdH1cblxuXHRjb25zdCBnbG9icyA9IFtdLmNvbmNhdChpbnB1dCkubWFwKHggPT4gcGF0aFR5cGUuaXNEaXJlY3RvcnlTeW5jKGdldFBhdGgoeCwgb3B0aW9ucy5jd2QpKSA/IGdldEdsb2IoeCwgb3B0aW9ucykgOiB4KTtcblxuXHRyZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBnbG9icyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXNwcmVhZFxufTtcbiIsICIvLyBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBtYWtlLWFycmF5XG5mdW5jdGlvbiBtYWtlQXJyYXkgKHN1YmplY3QpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc3ViamVjdClcbiAgICA/IHN1YmplY3RcbiAgICA6IFtzdWJqZWN0XVxufVxuXG5jb25zdCBFTVBUWSA9ICcnXG5jb25zdCBTUEFDRSA9ICcgJ1xuY29uc3QgRVNDQVBFID0gJ1xcXFwnXG5jb25zdCBSRUdFWF9URVNUX0JMQU5LX0xJTkUgPSAvXlxccyskL1xuY29uc3QgUkVHRVhfSU5WQUxJRF9UUkFJTElOR19CQUNLU0xBU0ggPSAvKD86W15cXFxcXXxeKVxcXFwkL1xuY29uc3QgUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfRVhDTEFNQVRJT04gPSAvXlxcXFwhL1xuY29uc3QgUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfSEFTSCA9IC9eXFxcXCMvXG5jb25zdCBSRUdFWF9TUExJVEFMTF9DUkxGID0gL1xccj9cXG4vZ1xuLy8gL2Zvbyxcbi8vIC4vZm9vLFxuLy8gLi4vZm9vLFxuLy8gLlxuLy8gLi5cbmNvbnN0IFJFR0VYX1RFU1RfSU5WQUxJRF9QQVRIID0gL15cXC4qXFwvfF5cXC4rJC9cblxuY29uc3QgU0xBU0ggPSAnLydcblxuLy8gRG8gbm90IHVzZSB0ZXJuYXJ5IGV4cHJlc3Npb24gaGVyZSwgc2luY2UgXCJpc3RhbmJ1bCBpZ25vcmUgbmV4dFwiIGlzIGJ1Z2d5XG5sZXQgVE1QX0tFWV9JR05PUkUgPSAnbm9kZS1pZ25vcmUnXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKSB7XG4gIFRNUF9LRVlfSUdOT1JFID0gU3ltYm9sLmZvcignbm9kZS1pZ25vcmUnKVxufVxuY29uc3QgS0VZX0lHTk9SRSA9IFRNUF9LRVlfSUdOT1JFXG5cbmNvbnN0IGRlZmluZSA9IChvYmplY3QsIGtleSwgdmFsdWUpID0+XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge3ZhbHVlfSlcblxuY29uc3QgUkVHRVhfUkVHRVhQX1JBTkdFID0gLyhbMC16XSktKFswLXpdKS9nXG5cbmNvbnN0IFJFVFVSTl9GQUxTRSA9ICgpID0+IGZhbHNlXG5cbi8vIFNhbml0aXplIHRoZSByYW5nZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuLy8gVGhlIGNhc2VzIGFyZSBjb21wbGljYXRlZCwgc2VlIHRlc3QgY2FzZXMgZm9yIGRldGFpbHNcbmNvbnN0IHNhbml0aXplUmFuZ2UgPSByYW5nZSA9PiByYW5nZS5yZXBsYWNlKFxuICBSRUdFWF9SRUdFWFBfUkFOR0UsXG4gIChtYXRjaCwgZnJvbSwgdG8pID0+IGZyb20uY2hhckNvZGVBdCgwKSA8PSB0by5jaGFyQ29kZUF0KDApXG4gICAgPyBtYXRjaFxuICAgIC8vIEludmFsaWQgcmFuZ2UgKG91dCBvZiBvcmRlcikgd2hpY2ggaXMgb2sgZm9yIGdpdGlnbm9yZSBydWxlcyBidXRcbiAgICAvLyAgIGZhdGFsIGZvciBKYXZhU2NyaXB0IHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gZWxpbWluYXRlIGl0LlxuICAgIDogRU1QVFlcbilcblxuLy8gU2VlIGZpeHR1cmVzICM1OVxuY29uc3QgY2xlYW5SYW5nZUJhY2tTbGFzaCA9IHNsYXNoZXMgPT4ge1xuICBjb25zdCB7bGVuZ3RofSA9IHNsYXNoZXNcbiAgcmV0dXJuIHNsYXNoZXMuc2xpY2UoMCwgbGVuZ3RoIC0gbGVuZ3RoICUgMilcbn1cblxuLy8gPiBJZiB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSBzbGFzaCxcbi8vID4gaXQgaXMgcmVtb3ZlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbixcbi8vID4gYnV0IGl0IHdvdWxkIG9ubHkgZmluZCBhIG1hdGNoIHdpdGggYSBkaXJlY3RvcnkuXG4vLyA+IEluIG90aGVyIHdvcmRzLCBmb28vIHdpbGwgbWF0Y2ggYSBkaXJlY3RvcnkgZm9vIGFuZCBwYXRocyB1bmRlcm5lYXRoIGl0LFxuLy8gPiBidXQgd2lsbCBub3QgbWF0Y2ggYSByZWd1bGFyIGZpbGUgb3IgYSBzeW1ib2xpYyBsaW5rIGZvb1xuLy8gPiAgKHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaG93IHBhdGhzcGVjIHdvcmtzIGluIGdlbmVyYWwgaW4gR2l0KS5cbi8vICdgZm9vL2AnIHdpbGwgbm90IG1hdGNoIHJlZ3VsYXIgZmlsZSAnYGZvb2AnIG9yIHN5bWJvbGljIGxpbmsgJ2Bmb29gJ1xuLy8gLT4gaWdub3JlLXJ1bGVzIHdpbGwgbm90IGRlYWwgd2l0aCBpdCwgYmVjYXVzZSBpdCBjb3N0cyBleHRyYSBgZnMuc3RhdGAgY2FsbFxuLy8gICAgICB5b3UgY291bGQgdXNlIG9wdGlvbiBgbWFyazogdHJ1ZWAgd2l0aCBgZ2xvYmBcblxuLy8gJ2Bmb28vYCcgc2hvdWxkIG5vdCBjb250aW51ZSB3aXRoIHRoZSAnYC4uYCdcbmNvbnN0IFJFUExBQ0VSUyA9IFtcblxuICAvLyA+IFRyYWlsaW5nIHNwYWNlcyBhcmUgaWdub3JlZCB1bmxlc3MgdGhleSBhcmUgcXVvdGVkIHdpdGggYmFja3NsYXNoIChcIlxcXCIpXG4gIFtcbiAgICAvLyAoYVxcICkgLT4gKGEgKVxuICAgIC8vIChhICApIC0+IChhKVxuICAgIC8vIChhIFxcICkgLT4gKGEgIClcbiAgICAvXFxcXD9cXHMrJC8sXG4gICAgbWF0Y2ggPT4gbWF0Y2guaW5kZXhPZignXFxcXCcpID09PSAwXG4gICAgICA/IFNQQUNFXG4gICAgICA6IEVNUFRZXG4gIF0sXG5cbiAgLy8gcmVwbGFjZSAoXFwgKSB3aXRoICcgJ1xuICBbXG4gICAgL1xcXFxcXHMvZyxcbiAgICAoKSA9PiBTUEFDRVxuICBdLFxuXG4gIC8vIEVzY2FwZSBtZXRhY2hhcmFjdGVyc1xuICAvLyB3aGljaCBpcyB3cml0dGVuIGRvd24gYnkgdXNlcnMgYnV0IG1lYW5zIHNwZWNpYWwgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG5cbiAgLy8gPiBUaGVyZSBhcmUgMTIgY2hhcmFjdGVycyB3aXRoIHNwZWNpYWwgbWVhbmluZ3M6XG4gIC8vID4gLSB0aGUgYmFja3NsYXNoIFxcLFxuICAvLyA+IC0gdGhlIGNhcmV0IF4sXG4gIC8vID4gLSB0aGUgZG9sbGFyIHNpZ24gJCxcbiAgLy8gPiAtIHRoZSBwZXJpb2Qgb3IgZG90IC4sXG4gIC8vID4gLSB0aGUgdmVydGljYWwgYmFyIG9yIHBpcGUgc3ltYm9sIHwsXG4gIC8vID4gLSB0aGUgcXVlc3Rpb24gbWFyayA/LFxuICAvLyA+IC0gdGhlIGFzdGVyaXNrIG9yIHN0YXIgKixcbiAgLy8gPiAtIHRoZSBwbHVzIHNpZ24gKyxcbiAgLy8gPiAtIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzICgsXG4gIC8vID4gLSB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcyApLFxuICAvLyA+IC0gYW5kIHRoZSBvcGVuaW5nIHNxdWFyZSBicmFja2V0IFssXG4gIC8vID4gLSB0aGUgb3BlbmluZyBjdXJseSBicmFjZSB7LFxuICAvLyA+IFRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgb2Z0ZW4gY2FsbGVkIFwibWV0YWNoYXJhY3RlcnNcIi5cbiAgW1xuICAgIC9bXFxcXCQufCorKCl7Xl0vZyxcbiAgICBtYXRjaCA9PiBgXFxcXCR7bWF0Y2h9YFxuICBdLFxuXG4gIFtcbiAgICAvLyA+IGEgcXVlc3Rpb24gbWFyayAoPykgbWF0Y2hlcyBhIHNpbmdsZSBjaGFyYWN0ZXJcbiAgICAvKD8hXFxcXClcXD8vZyxcbiAgICAoKSA9PiAnW14vXSdcbiAgXSxcblxuICAvLyBsZWFkaW5nIHNsYXNoXG4gIFtcblxuICAgIC8vID4gQSBsZWFkaW5nIHNsYXNoIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aG5hbWUuXG4gICAgLy8gPiBGb3IgZXhhbXBsZSwgXCIvKi5jXCIgbWF0Y2hlcyBcImNhdC1maWxlLmNcIiBidXQgbm90IFwibW96aWxsYS1zaGExL3NoYTEuY1wiLlxuICAgIC8vIEEgbGVhZGluZyBzbGFzaCBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGhuYW1lXG4gICAgL15cXC8vLFxuICAgICgpID0+ICdeJ1xuICBdLFxuXG4gIC8vIHJlcGxhY2Ugc3BlY2lhbCBtZXRhY2hhcmFjdGVyIHNsYXNoIGFmdGVyIHRoZSBsZWFkaW5nIHNsYXNoXG4gIFtcbiAgICAvXFwvL2csXG4gICAgKCkgPT4gJ1xcXFwvJ1xuICBdLFxuXG4gIFtcbiAgICAvLyA+IEEgbGVhZGluZyBcIioqXCIgZm9sbG93ZWQgYnkgYSBzbGFzaCBtZWFucyBtYXRjaCBpbiBhbGwgZGlyZWN0b3JpZXMuXG4gICAgLy8gPiBGb3IgZXhhbXBsZSwgXCIqKi9mb29cIiBtYXRjaGVzIGZpbGUgb3IgZGlyZWN0b3J5IFwiZm9vXCIgYW55d2hlcmUsXG4gICAgLy8gPiB0aGUgc2FtZSBhcyBwYXR0ZXJuIFwiZm9vXCIuXG4gICAgLy8gPiBcIioqL2Zvby9iYXJcIiBtYXRjaGVzIGZpbGUgb3IgZGlyZWN0b3J5IFwiYmFyXCIgYW55d2hlcmUgdGhhdCBpcyBkaXJlY3RseVxuICAgIC8vID4gICB1bmRlciBkaXJlY3RvcnkgXCJmb29cIi5cbiAgICAvLyBOb3RpY2UgdGhhdCB0aGUgJyoncyBoYXZlIGJlZW4gcmVwbGFjZWQgYXMgJ1xcXFwqJ1xuICAgIC9eXFxeKlxcXFxcXCpcXFxcXFwqXFxcXFxcLy8sXG5cbiAgICAvLyAnKiovZm9vJyA8LT4gJ2ZvbydcbiAgICAoKSA9PiAnXig/Oi4qXFxcXC8pPydcbiAgXSxcblxuICAvLyBzdGFydGluZ1xuICBbXG4gICAgLy8gdGhlcmUgd2lsbCBiZSBubyBsZWFkaW5nICcvJ1xuICAgIC8vICAgKHdoaWNoIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHNlY3Rpb24gXCJsZWFkaW5nIHNsYXNoXCIpXG4gICAgLy8gSWYgc3RhcnRzIHdpdGggJyoqJywgYWRkaW5nIGEgJ14nIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWxzbyB3b3Jrc1xuICAgIC9eKD89W15eXSkvLFxuICAgIGZ1bmN0aW9uIHN0YXJ0aW5nUmVwbGFjZXIgKCkge1xuICAgICAgLy8gSWYgaGFzIGEgc2xhc2ggYC9gIGF0IHRoZSBiZWdpbm5pbmcgb3IgbWlkZGxlXG4gICAgICByZXR1cm4gIS9cXC8oPyEkKS8udGVzdCh0aGlzKVxuICAgICAgICAvLyA+IFByaW9yIHRvIDIuMjIuMVxuICAgICAgICAvLyA+IElmIHRoZSBwYXR0ZXJuIGRvZXMgbm90IGNvbnRhaW4gYSBzbGFzaCAvLFxuICAgICAgICAvLyA+ICAgR2l0IHRyZWF0cyBpdCBhcyBhIHNoZWxsIGdsb2IgcGF0dGVyblxuICAgICAgICAvLyBBY3R1YWxseSwgaWYgdGhlcmUgaXMgb25seSBhIHRyYWlsaW5nIHNsYXNoLFxuICAgICAgICAvLyAgIGdpdCBhbHNvIHRyZWF0cyBpdCBhcyBhIHNoZWxsIGdsb2IgcGF0dGVyblxuXG4gICAgICAgIC8vIEFmdGVyIDIuMjIuMSAoY29tcGF0aWJsZSBidXQgY2xlYXJlcilcbiAgICAgICAgLy8gPiBJZiB0aGVyZSBpcyBhIHNlcGFyYXRvciBhdCB0aGUgYmVnaW5uaW5nIG9yIG1pZGRsZSAob3IgYm90aClcbiAgICAgICAgLy8gPiBvZiB0aGUgcGF0dGVybiwgdGhlbiB0aGUgcGF0dGVybiBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5XG4gICAgICAgIC8vID4gbGV2ZWwgb2YgdGhlIHBhcnRpY3VsYXIgLmdpdGlnbm9yZSBmaWxlIGl0c2VsZi5cbiAgICAgICAgLy8gPiBPdGhlcndpc2UgdGhlIHBhdHRlcm4gbWF5IGFsc28gbWF0Y2ggYXQgYW55IGxldmVsIGJlbG93XG4gICAgICAgIC8vID4gdGhlIC5naXRpZ25vcmUgbGV2ZWwuXG4gICAgICAgID8gJyg/Ol58XFxcXC8pJ1xuXG4gICAgICAgIC8vID4gT3RoZXJ3aXNlLCBHaXQgdHJlYXRzIHRoZSBwYXR0ZXJuIGFzIGEgc2hlbGwgZ2xvYiBzdWl0YWJsZSBmb3JcbiAgICAgICAgLy8gPiAgIGNvbnN1bXB0aW9uIGJ5IGZubWF0Y2goMylcbiAgICAgICAgOiAnXidcbiAgICB9XG4gIF0sXG5cbiAgLy8gdHdvIGdsb2JzdGFyc1xuICBbXG4gICAgLy8gVXNlIGxvb2thaGVhZCBhc3NlcnRpb25zIHNvIHRoYXQgd2UgY291bGQgbWF0Y2ggbW9yZSB0aGFuIG9uZSBgJy8qKidgXG4gICAgL1xcXFxcXC9cXFxcXFwqXFxcXFxcKig/PVxcXFxcXC98JCkvZyxcblxuICAgIC8vIFplcm8sIG9uZSBvciBzZXZlcmFsIGRpcmVjdG9yaWVzXG4gICAgLy8gc2hvdWxkIG5vdCB1c2UgJyonLCBvciBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXh0IHJlcGxhY2VyXG5cbiAgICAvLyBDaGVjayBpZiBpdCBpcyBub3QgdGhlIGxhc3QgYCcvKionYFxuICAgIChfLCBpbmRleCwgc3RyKSA9PiBpbmRleCArIDYgPCBzdHIubGVuZ3RoXG5cbiAgICAgIC8vIGNhc2U6IC8qKi9cbiAgICAgIC8vID4gQSBzbGFzaCBmb2xsb3dlZCBieSB0d28gY29uc2VjdXRpdmUgYXN0ZXJpc2tzIHRoZW4gYSBzbGFzaCBtYXRjaGVzXG4gICAgICAvLyA+ICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzLlxuICAgICAgLy8gPiBGb3IgZXhhbXBsZSwgXCJhLyoqL2JcIiBtYXRjaGVzIFwiYS9iXCIsIFwiYS94L2JcIiwgXCJhL3gveS9iXCIgYW5kIHNvIG9uLlxuICAgICAgLy8gJy8qKi8nXG4gICAgICA/ICcoPzpcXFxcL1teXFxcXC9dKykqJ1xuXG4gICAgICAvLyBjYXNlOiAvKipcbiAgICAgIC8vID4gQSB0cmFpbGluZyBgXCIvKipcImAgbWF0Y2hlcyBldmVyeXRoaW5nIGluc2lkZS5cblxuICAgICAgLy8gIzIxOiBldmVyeXRoaW5nIGluc2lkZSBidXQgaXQgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBjdXJyZW50IGZvbGRlclxuICAgICAgOiAnXFxcXC8uKydcbiAgXSxcblxuICAvLyBub3JtYWwgaW50ZXJtZWRpYXRlIHdpbGRjYXJkc1xuICBbXG4gICAgLy8gTmV2ZXIgcmVwbGFjZSBlc2NhcGVkICcqJ1xuICAgIC8vIGlnbm9yZSBydWxlICdcXConIHdpbGwgbWF0Y2ggdGhlIHBhdGggJyonXG5cbiAgICAvLyAnYWJjLiovJyAtPiBnb1xuICAgIC8vICdhYmMuKicgIC0+IHNraXAgdGhpcyBydWxlLFxuICAgIC8vICAgIGNveiB0cmFpbGluZyBzaW5nbGUgd2lsZGNhcmQgd2lsbCBiZSBoYW5kZWQgYnkgW3RyYWlsaW5nIHdpbGRjYXJkXVxuICAgIC8oXnxbXlxcXFxdKykoXFxcXFxcKikrKD89LispL2csXG5cbiAgICAvLyAnKi5qcycgbWF0Y2hlcyAnLmpzJ1xuICAgIC8vICcqLmpzJyBkb2Vzbid0IG1hdGNoICdhYmMnXG4gICAgKF8sIHAxLCBwMikgPT4ge1xuICAgICAgLy8gMS5cbiAgICAgIC8vID4gQW4gYXN0ZXJpc2sgXCIqXCIgbWF0Y2hlcyBhbnl0aGluZyBleGNlcHQgYSBzbGFzaC5cbiAgICAgIC8vIDIuXG4gICAgICAvLyA+IE90aGVyIGNvbnNlY3V0aXZlIGFzdGVyaXNrcyBhcmUgY29uc2lkZXJlZCByZWd1bGFyIGFzdGVyaXNrc1xuICAgICAgLy8gPiBhbmQgd2lsbCBtYXRjaCBhY2NvcmRpbmcgdG8gdGhlIHByZXZpb3VzIHJ1bGVzLlxuICAgICAgY29uc3QgdW5lc2NhcGVkID0gcDIucmVwbGFjZSgvXFxcXFxcKi9nLCAnW15cXFxcL10qJylcbiAgICAgIHJldHVybiBwMSArIHVuZXNjYXBlZFxuICAgIH1cbiAgXSxcblxuICBbXG4gICAgLy8gdW5lc2NhcGUsIHJldmVydCBzdGVwIDMgZXhjZXB0IGZvciBiYWNrIHNsYXNoXG4gICAgLy8gRm9yIGV4YW1wbGUsIGlmIGEgdXNlciBlc2NhcGUgYSAnXFxcXConLFxuICAgIC8vIGFmdGVyIHN0ZXAgMywgdGhlIHJlc3VsdCB3aWxsIGJlICdcXFxcXFxcXFxcXFwqJ1xuICAgIC9cXFxcXFxcXFxcXFwoPz1bJC58KisoKXteXSkvZyxcbiAgICAoKSA9PiBFU0NBUEVcbiAgXSxcblxuICBbXG4gICAgLy8gJ1xcXFxcXFxcJyAtPiAnXFxcXCdcbiAgICAvXFxcXFxcXFwvZyxcbiAgICAoKSA9PiBFU0NBUEVcbiAgXSxcblxuICBbXG4gICAgLy8gPiBUaGUgcmFuZ2Ugbm90YXRpb24sIGUuZy4gW2EtekEtWl0sXG4gICAgLy8gPiBjYW4gYmUgdXNlZCB0byBtYXRjaCBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gYSByYW5nZS5cblxuICAgIC8vIGBcXGAgaXMgZXNjYXBlZCBieSBzdGVwIDNcbiAgICAvKFxcXFwpP1xcWyhbXlxcXS9dKj8pKFxcXFwqKSgkfFxcXSkvZyxcbiAgICAobWF0Y2gsIGxlYWRFc2NhcGUsIHJhbmdlLCBlbmRFc2NhcGUsIGNsb3NlKSA9PiBsZWFkRXNjYXBlID09PSBFU0NBUEVcbiAgICAgIC8vICdcXFxcW2Jhcl0nIC0+ICdcXFxcXFxcXFtiYXJcXFxcXSdcbiAgICAgID8gYFxcXFxbJHtyYW5nZX0ke2NsZWFuUmFuZ2VCYWNrU2xhc2goZW5kRXNjYXBlKX0ke2Nsb3NlfWBcbiAgICAgIDogY2xvc2UgPT09ICddJ1xuICAgICAgICA/IGVuZEVzY2FwZS5sZW5ndGggJSAyID09PSAwXG4gICAgICAgICAgLy8gQSBub3JtYWwgY2FzZSwgYW5kIGl0IGlzIGEgcmFuZ2Ugbm90YXRpb25cbiAgICAgICAgICAvLyAnW2Jhcl0nXG4gICAgICAgICAgLy8gJ1tiYXJcXFxcXFxcXF0nXG4gICAgICAgICAgPyBgWyR7c2FuaXRpemVSYW5nZShyYW5nZSl9JHtlbmRFc2NhcGV9XWBcbiAgICAgICAgICAvLyBJbnZhbGlkIHJhbmdlIG5vdGF0b25cbiAgICAgICAgICAvLyAnW2JhclxcXFxdJyAtPiAnW2JhclxcXFxcXFxcXSdcbiAgICAgICAgICA6ICdbXSdcbiAgICAgICAgOiAnW10nXG4gIF0sXG5cbiAgLy8gZW5kaW5nXG4gIFtcbiAgICAvLyAnanMnIHdpbGwgbm90IG1hdGNoICdqcy4nXG4gICAgLy8gJ2FiJyB3aWxsIG5vdCBtYXRjaCAnYWJjJ1xuICAgIC8oPzpbXipdKSQvLFxuXG4gICAgLy8gV1RGIVxuICAgIC8vIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXRpZ25vcmVcbiAgICAvLyBjaGFuZ2VzIGluIFsyLjIyLjFdKGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXRpZ25vcmUvMi4yMi4xKVxuICAgIC8vIHdoaWNoIHJlLWZpeGVzICMyNCwgIzM4XG5cbiAgICAvLyA+IElmIHRoZXJlIGlzIGEgc2VwYXJhdG9yIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4gdGhlbiB0aGUgcGF0dGVyblxuICAgIC8vID4gd2lsbCBvbmx5IG1hdGNoIGRpcmVjdG9yaWVzLCBvdGhlcndpc2UgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIGJvdGhcbiAgICAvLyA+IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy5cblxuICAgIC8vICdqcyonIHdpbGwgbm90IG1hdGNoICdhLmpzJ1xuICAgIC8vICdqcy8nIHdpbGwgbm90IG1hdGNoICdhLmpzJ1xuICAgIC8vICdqcycgd2lsbCBtYXRjaCAnYS5qcycgYW5kICdhLmpzLydcbiAgICBtYXRjaCA9PiAvXFwvJC8udGVzdChtYXRjaClcbiAgICAgIC8vIGZvby8gd2lsbCBub3QgbWF0Y2ggJ2ZvbydcbiAgICAgID8gYCR7bWF0Y2h9JGBcbiAgICAgIC8vIGZvbyBtYXRjaGVzICdmb28nIGFuZCAnZm9vLydcbiAgICAgIDogYCR7bWF0Y2h9KD89JHxcXFxcLyQpYFxuICBdLFxuXG4gIC8vIHRyYWlsaW5nIHdpbGRjYXJkXG4gIFtcbiAgICAvKFxcXnxcXFxcXFwvKT9cXFxcXFwqJC8sXG4gICAgKF8sIHAxKSA9PiB7XG4gICAgICBjb25zdCBwcmVmaXggPSBwMVxuICAgICAgICAvLyAnXFxeJzpcbiAgICAgICAgLy8gJy8qJyBkb2VzIG5vdCBtYXRjaCBFTVBUWVxuICAgICAgICAvLyAnLyonIGRvZXMgbm90IG1hdGNoIGV2ZXJ5dGhpbmdcblxuICAgICAgICAvLyAnXFxcXFxcLyc6XG4gICAgICAgIC8vICdhYmMvKicgZG9lcyBub3QgbWF0Y2ggJ2FiYy8nXG4gICAgICAgID8gYCR7cDF9W14vXStgXG5cbiAgICAgICAgLy8gJ2EqJyBtYXRjaGVzICdhJ1xuICAgICAgICAvLyAnYSonIG1hdGNoZXMgJ2FhJ1xuICAgICAgICA6ICdbXi9dKidcblxuICAgICAgcmV0dXJuIGAke3ByZWZpeH0oPz0kfFxcXFwvJClgXG4gICAgfVxuICBdLFxuXVxuXG4vLyBBIHNpbXBsZSBjYWNoZSwgYmVjYXVzZSBhbiBpZ25vcmUgcnVsZSBvbmx5IGhhcyBvbmx5IG9uZSBjZXJ0YWluIG1lYW5pbmdcbmNvbnN0IHJlZ2V4Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIEBwYXJhbSB7cGF0dGVybn1cbmNvbnN0IG1ha2VSZWdleCA9IChwYXR0ZXJuLCBpZ25vcmVDYXNlKSA9PiB7XG4gIGxldCBzb3VyY2UgPSByZWdleENhY2hlW3BhdHRlcm5dXG5cbiAgaWYgKCFzb3VyY2UpIHtcbiAgICBzb3VyY2UgPSBSRVBMQUNFUlMucmVkdWNlKFxuICAgICAgKHByZXYsIGN1cnJlbnQpID0+IHByZXYucmVwbGFjZShjdXJyZW50WzBdLCBjdXJyZW50WzFdLmJpbmQocGF0dGVybikpLFxuICAgICAgcGF0dGVyblxuICAgIClcbiAgICByZWdleENhY2hlW3BhdHRlcm5dID0gc291cmNlXG4gIH1cblxuICByZXR1cm4gaWdub3JlQ2FzZVxuICAgID8gbmV3IFJlZ0V4cChzb3VyY2UsICdpJylcbiAgICA6IG5ldyBSZWdFeHAoc291cmNlKVxufVxuXG5jb25zdCBpc1N0cmluZyA9IHN1YmplY3QgPT4gdHlwZW9mIHN1YmplY3QgPT09ICdzdHJpbmcnXG5cbi8vID4gQSBibGFuayBsaW5lIG1hdGNoZXMgbm8gZmlsZXMsIHNvIGl0IGNhbiBzZXJ2ZSBhcyBhIHNlcGFyYXRvciBmb3IgcmVhZGFiaWxpdHkuXG5jb25zdCBjaGVja1BhdHRlcm4gPSBwYXR0ZXJuID0+IHBhdHRlcm5cbiAgJiYgaXNTdHJpbmcocGF0dGVybilcbiAgJiYgIVJFR0VYX1RFU1RfQkxBTktfTElORS50ZXN0KHBhdHRlcm4pXG4gICYmICFSRUdFWF9JTlZBTElEX1RSQUlMSU5HX0JBQ0tTTEFTSC50ZXN0KHBhdHRlcm4pXG5cbiAgLy8gPiBBIGxpbmUgc3RhcnRpbmcgd2l0aCAjIHNlcnZlcyBhcyBhIGNvbW1lbnQuXG4gICYmIHBhdHRlcm4uaW5kZXhPZignIycpICE9PSAwXG5cbmNvbnN0IHNwbGl0UGF0dGVybiA9IHBhdHRlcm4gPT4gcGF0dGVybi5zcGxpdChSRUdFWF9TUExJVEFMTF9DUkxGKVxuXG5jbGFzcyBJZ25vcmVSdWxlIHtcbiAgY29uc3RydWN0b3IgKFxuICAgIG9yaWdpbixcbiAgICBwYXR0ZXJuLFxuICAgIG5lZ2F0aXZlLFxuICAgIHJlZ2V4XG4gICkge1xuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luXG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVyblxuICAgIHRoaXMubmVnYXRpdmUgPSBuZWdhdGl2ZVxuICAgIHRoaXMucmVnZXggPSByZWdleFxuICB9XG59XG5cbmNvbnN0IGNyZWF0ZVJ1bGUgPSAocGF0dGVybiwgaWdub3JlQ2FzZSkgPT4ge1xuICBjb25zdCBvcmlnaW4gPSBwYXR0ZXJuXG4gIGxldCBuZWdhdGl2ZSA9IGZhbHNlXG5cbiAgLy8gPiBBbiBvcHRpb25hbCBwcmVmaXggXCIhXCIgd2hpY2ggbmVnYXRlcyB0aGUgcGF0dGVybjtcbiAgaWYgKHBhdHRlcm4uaW5kZXhPZignIScpID09PSAwKSB7XG4gICAgbmVnYXRpdmUgPSB0cnVlXG4gICAgcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyKDEpXG4gIH1cblxuICBwYXR0ZXJuID0gcGF0dGVyblxuICAvLyA+IFB1dCBhIGJhY2tzbGFzaCAoXCJcXFwiKSBpbiBmcm9udCBvZiB0aGUgZmlyc3QgXCIhXCIgZm9yIHBhdHRlcm5zIHRoYXRcbiAgLy8gPiAgIGJlZ2luIHdpdGggYSBsaXRlcmFsIFwiIVwiLCBmb3IgZXhhbXBsZSwgYFwiXFwhaW1wb3J0YW50IS50eHRcImAuXG4gIC5yZXBsYWNlKFJFR0VYX1JFUExBQ0VfTEVBRElOR19FWENBUEVEX0VYQ0xBTUFUSU9OLCAnIScpXG4gIC8vID4gUHV0IGEgYmFja3NsYXNoIChcIlxcXCIpIGluIGZyb250IG9mIHRoZSBmaXJzdCBoYXNoIGZvciBwYXR0ZXJucyB0aGF0XG4gIC8vID4gICBiZWdpbiB3aXRoIGEgaGFzaC5cbiAgLnJlcGxhY2UoUkVHRVhfUkVQTEFDRV9MRUFESU5HX0VYQ0FQRURfSEFTSCwgJyMnKVxuXG4gIGNvbnN0IHJlZ2V4ID0gbWFrZVJlZ2V4KHBhdHRlcm4sIGlnbm9yZUNhc2UpXG5cbiAgcmV0dXJuIG5ldyBJZ25vcmVSdWxlKFxuICAgIG9yaWdpbixcbiAgICBwYXR0ZXJuLFxuICAgIG5lZ2F0aXZlLFxuICAgIHJlZ2V4XG4gIClcbn1cblxuY29uc3QgdGhyb3dFcnJvciA9IChtZXNzYWdlLCBDdG9yKSA9PiB7XG4gIHRocm93IG5ldyBDdG9yKG1lc3NhZ2UpXG59XG5cbmNvbnN0IGNoZWNrUGF0aCA9IChwYXRoLCBvcmlnaW5hbFBhdGgsIGRvVGhyb3cpID0+IHtcbiAgaWYgKCFpc1N0cmluZyhwYXRoKSkge1xuICAgIHJldHVybiBkb1Rocm93KFxuICAgICAgYHBhdGggbXVzdCBiZSBhIHN0cmluZywgYnV0IGdvdCBcXGAke29yaWdpbmFsUGF0aH1cXGBgLFxuICAgICAgVHlwZUVycm9yXG4gICAgKVxuICB9XG5cbiAgLy8gV2UgZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgaWdub3JlIEVNUFRZLCBzbyB0aHJvd1xuICBpZiAoIXBhdGgpIHtcbiAgICByZXR1cm4gZG9UaHJvdyhgcGF0aCBtdXN0IG5vdCBiZSBlbXB0eWAsIFR5cGVFcnJvcilcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0IGlzIGEgcmVsYXRpdmUgcGF0aFxuICBpZiAoY2hlY2tQYXRoLmlzTm90UmVsYXRpdmUocGF0aCkpIHtcbiAgICBjb25zdCByID0gJ2BwYXRoLnJlbGF0aXZlKClgZCdcbiAgICByZXR1cm4gZG9UaHJvdyhcbiAgICAgIGBwYXRoIHNob3VsZCBiZSBhICR7cn0gc3RyaW5nLCBidXQgZ290IFwiJHtvcmlnaW5hbFBhdGh9XCJgLFxuICAgICAgUmFuZ2VFcnJvclxuICAgIClcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IGlzTm90UmVsYXRpdmUgPSBwYXRoID0+IFJFR0VYX1RFU1RfSU5WQUxJRF9QQVRILnRlc3QocGF0aClcblxuY2hlY2tQYXRoLmlzTm90UmVsYXRpdmUgPSBpc05vdFJlbGF0aXZlXG5jaGVja1BhdGguY29udmVydCA9IHAgPT4gcFxuXG5jbGFzcyBJZ25vcmUge1xuICBjb25zdHJ1Y3RvciAoe1xuICAgIGlnbm9yZWNhc2UgPSB0cnVlLFxuICAgIGlnbm9yZUNhc2UgPSBpZ25vcmVjYXNlLFxuICAgIGFsbG93UmVsYXRpdmVQYXRocyA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIGRlZmluZSh0aGlzLCBLRVlfSUdOT1JFLCB0cnVlKVxuXG4gICAgdGhpcy5fcnVsZXMgPSBbXVxuICAgIHRoaXMuX2lnbm9yZUNhc2UgPSBpZ25vcmVDYXNlXG4gICAgdGhpcy5fYWxsb3dSZWxhdGl2ZVBhdGhzID0gYWxsb3dSZWxhdGl2ZVBhdGhzXG4gICAgdGhpcy5faW5pdENhY2hlKClcbiAgfVxuXG4gIF9pbml0Q2FjaGUgKCkge1xuICAgIHRoaXMuX2lnbm9yZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIHRoaXMuX3Rlc3RDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgfVxuXG4gIF9hZGRQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gICAgLy8gIzMyXG4gICAgaWYgKHBhdHRlcm4gJiYgcGF0dGVybltLRVlfSUdOT1JFXSkge1xuICAgICAgdGhpcy5fcnVsZXMgPSB0aGlzLl9ydWxlcy5jb25jYXQocGF0dGVybi5fcnVsZXMpXG4gICAgICB0aGlzLl9hZGRlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjaGVja1BhdHRlcm4ocGF0dGVybikpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSBjcmVhdGVSdWxlKHBhdHRlcm4sIHRoaXMuX2lnbm9yZUNhc2UpXG4gICAgICB0aGlzLl9hZGRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3J1bGVzLnB1c2gocnVsZSlcbiAgICB9XG4gIH1cblxuICAvLyBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCBzdHJpbmcgfCBJZ25vcmV9IHBhdHRlcm5cbiAgYWRkIChwYXR0ZXJuKSB7XG4gICAgdGhpcy5fYWRkZWQgPSBmYWxzZVxuXG4gICAgbWFrZUFycmF5KFxuICAgICAgaXNTdHJpbmcocGF0dGVybilcbiAgICAgICAgPyBzcGxpdFBhdHRlcm4ocGF0dGVybilcbiAgICAgICAgOiBwYXR0ZXJuXG4gICAgKS5mb3JFYWNoKHRoaXMuX2FkZFBhdHRlcm4sIHRoaXMpXG5cbiAgICAvLyBTb21lIHJ1bGVzIGhhdmUganVzdCBhZGRlZCB0byB0aGUgaWdub3JlLFxuICAgIC8vIG1ha2luZyB0aGUgYmVoYXZpb3IgY2hhbmdlZC5cbiAgICBpZiAodGhpcy5fYWRkZWQpIHtcbiAgICAgIHRoaXMuX2luaXRDYWNoZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIGxlZ2FjeVxuICBhZGRQYXR0ZXJuIChwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKHBhdHRlcm4pXG4gIH1cblxuICAvLyAgICAgICAgICB8ICAgICAgICAgICBpZ25vcmVkIDogdW5pZ25vcmVkXG4gIC8vIG5lZ2F0aXZlIHwgICAwOjAgICB8ICAgMDoxICAgfCAgIDE6MCAgIHwgICAxOjFcbiAgLy8gLS0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tLVxuICAvLyAgICAgMCAgICB8ICBURVNUICAgfCAgVEVTVCAgIHwgIFNLSVAgICB8ICAgIFhcbiAgLy8gICAgIDEgICAgfCAgVEVTVElGIHwgIFNLSVAgICB8ICBURVNUICAgfCAgICBYXG5cbiAgLy8gLSBTS0lQOiBhbHdheXMgc2tpcFxuICAvLyAtIFRFU1Q6IGFsd2F5cyB0ZXN0XG4gIC8vIC0gVEVTVElGOiBvbmx5IHRlc3QgaWYgY2hlY2tVbmlnbm9yZWRcbiAgLy8gLSBYOiB0aGF0IG5ldmVyIGhhcHBlblxuXG4gIC8vIEBwYXJhbSB7Ym9vbGVhbn0gd2hldGhlciBzaG91bGQgY2hlY2sgaWYgdGhlIHBhdGggaXMgdW5pZ25vcmVkLFxuICAvLyAgIHNldHRpbmcgYGNoZWNrVW5pZ25vcmVkYCB0byBgZmFsc2VgIGNvdWxkIHJlZHVjZSBhZGRpdGlvbmFsXG4gIC8vICAgcGF0aCBtYXRjaGluZy5cblxuICAvLyBAcmV0dXJucyB7VGVzdFJlc3VsdH0gdHJ1ZSBpZiBhIGZpbGUgaXMgaWdub3JlZFxuICBfdGVzdE9uZSAocGF0aCwgY2hlY2tVbmlnbm9yZWQpIHtcbiAgICBsZXQgaWdub3JlZCA9IGZhbHNlXG4gICAgbGV0IHVuaWdub3JlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9ydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgY29uc3Qge25lZ2F0aXZlfSA9IHJ1bGVcbiAgICAgIGlmIChcbiAgICAgICAgdW5pZ25vcmVkID09PSBuZWdhdGl2ZSAmJiBpZ25vcmVkICE9PSB1bmlnbm9yZWRcbiAgICAgICAgfHwgbmVnYXRpdmUgJiYgIWlnbm9yZWQgJiYgIXVuaWdub3JlZCAmJiAhY2hlY2tVbmlnbm9yZWRcbiAgICAgICkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2hlZCA9IHJ1bGUucmVnZXgudGVzdChwYXRoKVxuXG4gICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICBpZ25vcmVkID0gIW5lZ2F0aXZlXG4gICAgICAgIHVuaWdub3JlZCA9IG5lZ2F0aXZlXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICBpZ25vcmVkLFxuICAgICAgdW5pZ25vcmVkXG4gICAgfVxuICB9XG5cbiAgLy8gQHJldHVybnMge1Rlc3RSZXN1bHR9XG4gIF90ZXN0IChvcmlnaW5hbFBhdGgsIGNhY2hlLCBjaGVja1VuaWdub3JlZCwgc2xpY2VzKSB7XG4gICAgY29uc3QgcGF0aCA9IG9yaWdpbmFsUGF0aFxuICAgICAgLy8gU3VwcG9ydHMgbnVsbGFibGUgcGF0aFxuICAgICAgJiYgY2hlY2tQYXRoLmNvbnZlcnQob3JpZ2luYWxQYXRoKVxuXG4gICAgY2hlY2tQYXRoKFxuICAgICAgcGF0aCxcbiAgICAgIG9yaWdpbmFsUGF0aCxcbiAgICAgIHRoaXMuX2FsbG93UmVsYXRpdmVQYXRoc1xuICAgICAgICA/IFJFVFVSTl9GQUxTRVxuICAgICAgICA6IHRocm93RXJyb3JcbiAgICApXG5cbiAgICByZXR1cm4gdGhpcy5fdChwYXRoLCBjYWNoZSwgY2hlY2tVbmlnbm9yZWQsIHNsaWNlcylcbiAgfVxuXG4gIF90IChwYXRoLCBjYWNoZSwgY2hlY2tVbmlnbm9yZWQsIHNsaWNlcykge1xuICAgIGlmIChwYXRoIGluIGNhY2hlKSB7XG4gICAgICByZXR1cm4gY2FjaGVbcGF0aF1cbiAgICB9XG5cbiAgICBpZiAoIXNsaWNlcykge1xuICAgICAgLy8gcGF0aC90by9hLmpzXG4gICAgICAvLyBbJ3BhdGgnLCAndG8nLCAnYS5qcyddXG4gICAgICBzbGljZXMgPSBwYXRoLnNwbGl0KFNMQVNIKVxuICAgIH1cblxuICAgIHNsaWNlcy5wb3AoKVxuXG4gICAgLy8gSWYgdGhlIHBhdGggaGFzIG5vIHBhcmVudCBkaXJlY3RvcnksIGp1c3QgdGVzdCBpdFxuICAgIGlmICghc2xpY2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNhY2hlW3BhdGhdID0gdGhpcy5fdGVzdE9uZShwYXRoLCBjaGVja1VuaWdub3JlZClcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl90KFxuICAgICAgc2xpY2VzLmpvaW4oU0xBU0gpICsgU0xBU0gsXG4gICAgICBjYWNoZSxcbiAgICAgIGNoZWNrVW5pZ25vcmVkLFxuICAgICAgc2xpY2VzXG4gICAgKVxuXG4gICAgLy8gSWYgdGhlIHBhdGggY29udGFpbnMgYSBwYXJlbnQgZGlyZWN0b3J5LCBjaGVjayB0aGUgcGFyZW50IGZpcnN0XG4gICAgcmV0dXJuIGNhY2hlW3BhdGhdID0gcGFyZW50Lmlnbm9yZWRcbiAgICAgIC8vID4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlLWluY2x1ZGUgYSBmaWxlIGlmIGEgcGFyZW50IGRpcmVjdG9yeSBvZlxuICAgICAgLy8gPiAgIHRoYXQgZmlsZSBpcyBleGNsdWRlZC5cbiAgICAgID8gcGFyZW50XG4gICAgICA6IHRoaXMuX3Rlc3RPbmUocGF0aCwgY2hlY2tVbmlnbm9yZWQpXG4gIH1cblxuICBpZ25vcmVzIChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3QocGF0aCwgdGhpcy5faWdub3JlQ2FjaGUsIGZhbHNlKS5pZ25vcmVkXG4gIH1cblxuICBjcmVhdGVGaWx0ZXIgKCkge1xuICAgIHJldHVybiBwYXRoID0+ICF0aGlzLmlnbm9yZXMocGF0aClcbiAgfVxuXG4gIGZpbHRlciAocGF0aHMpIHtcbiAgICByZXR1cm4gbWFrZUFycmF5KHBhdGhzKS5maWx0ZXIodGhpcy5jcmVhdGVGaWx0ZXIoKSlcbiAgfVxuXG4gIC8vIEByZXR1cm5zIHtUZXN0UmVzdWx0fVxuICB0ZXN0IChwYXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3QocGF0aCwgdGhpcy5fdGVzdENhY2hlLCB0cnVlKVxuICB9XG59XG5cbmNvbnN0IGZhY3RvcnkgPSBvcHRpb25zID0+IG5ldyBJZ25vcmUob3B0aW9ucylcblxuY29uc3QgaXNQYXRoVmFsaWQgPSBwYXRoID0+XG4gIGNoZWNrUGF0aChwYXRoICYmIGNoZWNrUGF0aC5jb252ZXJ0KHBhdGgpLCBwYXRoLCBSRVRVUk5fRkFMU0UpXG5cbmZhY3RvcnkuaXNQYXRoVmFsaWQgPSBpc1BhdGhWYWxpZFxuXG4vLyBGaXhlcyB0eXBlc2NyaXB0XG5mYWN0b3J5LmRlZmF1bHQgPSBmYWN0b3J5XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeVxuXG4vLyBXaW5kb3dzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAoXG4gIC8vIERldGVjdCBgcHJvY2Vzc2Agc28gdGhhdCBpdCBjYW4gcnVuIGluIGJyb3dzZXJzLlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCdcbiAgJiYgKFxuICAgIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LklHTk9SRV9URVNUX1dJTjMyXG4gICAgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICApXG4pIHtcbiAgLyogZXNsaW50IG5vLWNvbnRyb2wtcmVnZXg6IFwib2ZmXCIgKi9cbiAgY29uc3QgbWFrZVBvc2l4ID0gc3RyID0+IC9eXFxcXFxcXFxcXD9cXFxcLy50ZXN0KHN0cilcbiAgfHwgL1tcIjw+fFxcdTAwMDAtXFx1MDAxRl0rL3UudGVzdChzdHIpXG4gICAgPyBzdHJcbiAgICA6IHN0ci5yZXBsYWNlKC9cXFxcL2csICcvJylcblxuICBjaGVja1BhdGguY29udmVydCA9IG1ha2VQb3NpeFxuXG4gIC8vICdDOlxcXFxmb28nICAgICA8LSAnQzpcXFxcZm9vJyBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gJ0M6LydcbiAgLy8gJ2Q6XFxcXGZvbydcbiAgY29uc3QgUkVHSVhfSVNfV0lORE9XU19QQVRIX0FCU09MVVRFID0gL15bYS16XTpcXC8vaVxuICBjaGVja1BhdGguaXNOb3RSZWxhdGl2ZSA9IHBhdGggPT5cbiAgICBSRUdJWF9JU19XSU5ET1dTX1BBVEhfQUJTT0xVVEUudGVzdChwYXRoKVxuICAgIHx8IGlzTm90UmVsYXRpdmUocGF0aClcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzbGFzaChwYXRoKSB7XG5cdGNvbnN0IGlzRXh0ZW5kZWRMZW5ndGhQYXRoID0gL15cXFxcXFxcXFxcP1xcXFwvLnRlc3QocGF0aCk7XG5cdGNvbnN0IGhhc05vbkFzY2lpID0gL1teXFx1MDAwMC1cXHUwMDgwXSsvLnRlc3QocGF0aCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG5cdGlmIChpc0V4dGVuZGVkTGVuZ3RoUGF0aCB8fCBoYXNOb25Bc2NpaSkge1xuXHRcdHJldHVybiBwYXRoO1xuXHR9XG5cblx0cmV0dXJuIHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuIiwgImltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHtUcmFuc2Zvcm19IGZyb20gJ25vZGU6c3RyZWFtJztcblxuZXhwb3J0IGNvbnN0IHRvUGF0aCA9IHVybE9yUGF0aCA9PiB1cmxPclBhdGggaW5zdGFuY2VvZiBVUkwgPyBmaWxlVVJMVG9QYXRoKHVybE9yUGF0aCkgOiB1cmxPclBhdGg7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuXHRjb25zdHJ1Y3RvcihmaWx0ZXIpIHtcblx0XHRzdXBlcih7XG5cdFx0XHRvYmplY3RNb2RlOiB0cnVlLFxuXHRcdFx0dHJhbnNmb3JtKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuXHRcdFx0XHRjYWxsYmFjayh1bmRlZmluZWQsIGZpbHRlcihkYXRhKSA/IGRhdGEgOiB1bmRlZmluZWQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNOZWdhdGl2ZVBhdHRlcm4gPSBwYXR0ZXJuID0+IHBhdHRlcm5bMF0gPT09ICchJztcbiIsICJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBmYXN0R2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IGdpdElnbm9yZSBmcm9tICdpZ25vcmUnO1xuaW1wb3J0IHNsYXNoIGZyb20gJ3NsYXNoJztcbmltcG9ydCB7dG9QYXRoLCBpc05lZ2F0aXZlUGF0dGVybn0gZnJvbSAnLi91dGlsaXRpZXMuanMnO1xuXG5jb25zdCBpZ25vcmVGaWxlc0dsb2JPcHRpb25zID0ge1xuXHRpZ25vcmU6IFtcblx0XHQnKiovbm9kZV9tb2R1bGVzJyxcblx0XHQnKiovZmxvdy10eXBlZCcsXG5cdFx0JyoqL2NvdmVyYWdlJyxcblx0XHQnKiovLmdpdCcsXG5cdF0sXG5cdGFic29sdXRlOiB0cnVlLFxuXHRkb3Q6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgR0lUSUdOT1JFX0ZJTEVTX1BBVFRFUk4gPSAnKiovLmdpdGlnbm9yZSc7XG5cbmNvbnN0IGFwcGx5QmFzZVRvUGF0dGVybiA9IChwYXR0ZXJuLCBiYXNlKSA9PiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKVxuXHQ/ICchJyArIHBhdGgucG9zaXguam9pbihiYXNlLCBwYXR0ZXJuLnNsaWNlKDEpKVxuXHQ6IHBhdGgucG9zaXguam9pbihiYXNlLCBwYXR0ZXJuKTtcblxuY29uc3QgcGFyc2VJZ25vcmVGaWxlID0gKGZpbGUsIGN3ZCkgPT4ge1xuXHRjb25zdCBiYXNlID0gc2xhc2gocGF0aC5yZWxhdGl2ZShjd2QsIHBhdGguZGlybmFtZShmaWxlLmZpbGVQYXRoKSkpO1xuXG5cdHJldHVybiBmaWxlLmNvbnRlbnRcblx0XHQuc3BsaXQoL1xccj9cXG4vKVxuXHRcdC5maWx0ZXIobGluZSA9PiBsaW5lICYmICFsaW5lLnN0YXJ0c1dpdGgoJyMnKSlcblx0XHQubWFwKHBhdHRlcm4gPT4gYXBwbHlCYXNlVG9QYXR0ZXJuKHBhdHRlcm4sIGJhc2UpKTtcbn07XG5cbmNvbnN0IHRvUmVsYXRpdmVQYXRoID0gKGZpbGVPckRpcmVjdG9yeSwgY3dkKSA9PiB7XG5cdGN3ZCA9IHNsYXNoKGN3ZCk7XG5cdGlmIChwYXRoLmlzQWJzb2x1dGUoZmlsZU9yRGlyZWN0b3J5KSkge1xuXHRcdGlmIChzbGFzaChmaWxlT3JEaXJlY3RvcnkpLnN0YXJ0c1dpdGgoY3dkKSkge1xuXHRcdFx0cmV0dXJuIHBhdGgucmVsYXRpdmUoY3dkLCBmaWxlT3JEaXJlY3RvcnkpO1xuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvcihgUGF0aCAke2ZpbGVPckRpcmVjdG9yeX0gaXMgbm90IGluIGN3ZCAke2N3ZH1gKTtcblx0fVxuXG5cdHJldHVybiBmaWxlT3JEaXJlY3Rvcnk7XG59O1xuXG5jb25zdCBnZXRJc0lnbm9yZWRQcmVkaWNhdGUgPSAoZmlsZXMsIGN3ZCkgPT4ge1xuXHRjb25zdCBwYXR0ZXJucyA9IGZpbGVzLmZsYXRNYXAoZmlsZSA9PiBwYXJzZUlnbm9yZUZpbGUoZmlsZSwgY3dkKSk7XG5cdGNvbnN0IGlnbm9yZXMgPSBnaXRJZ25vcmUoKS5hZGQocGF0dGVybnMpO1xuXG5cdHJldHVybiBmaWxlT3JEaXJlY3RvcnkgPT4ge1xuXHRcdGZpbGVPckRpcmVjdG9yeSA9IHRvUGF0aChmaWxlT3JEaXJlY3RvcnkpO1xuXHRcdGZpbGVPckRpcmVjdG9yeSA9IHRvUmVsYXRpdmVQYXRoKGZpbGVPckRpcmVjdG9yeSwgY3dkKTtcblx0XHRyZXR1cm4gZmlsZU9yRGlyZWN0b3J5ID8gaWdub3Jlcy5pZ25vcmVzKHNsYXNoKGZpbGVPckRpcmVjdG9yeSkpIDogZmFsc2U7XG5cdH07XG59O1xuXG5jb25zdCBub3JtYWxpemVPcHRpb25zID0gKG9wdGlvbnMgPSB7fSkgPT4gKHtcblx0Y3dkOiB0b1BhdGgob3B0aW9ucy5jd2QpIHx8IHByb2Nlc3MuY3dkKCksXG5cdHN1cHByZXNzRXJyb3JzOiBCb29sZWFuKG9wdGlvbnMuc3VwcHJlc3NFcnJvcnMpLFxuXHRkZWVwOiB0eXBlb2Ygb3B0aW9ucy5kZWVwID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuZGVlcCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNJZ25vcmVkQnlJZ25vcmVGaWxlcyA9IGFzeW5jIChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB7Y3dkLCBzdXBwcmVzc0Vycm9ycywgZGVlcH0gPSBub3JtYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuXG5cdGNvbnN0IHBhdGhzID0gYXdhaXQgZmFzdEdsb2IocGF0dGVybnMsIHtjd2QsIHN1cHByZXNzRXJyb3JzLCBkZWVwLCAuLi5pZ25vcmVGaWxlc0dsb2JPcHRpb25zfSk7XG5cblx0Y29uc3QgZmlsZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRwYXRocy5tYXAoYXN5bmMgZmlsZVBhdGggPT4gKHtcblx0XHRcdGZpbGVQYXRoLFxuXHRcdFx0Y29udGVudDogYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JyksXG5cdFx0fSkpLFxuXHQpO1xuXG5cdHJldHVybiBnZXRJc0lnbm9yZWRQcmVkaWNhdGUoZmlsZXMsIGN3ZCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3Qge2N3ZCwgc3VwcHJlc3NFcnJvcnMsIGRlZXB9ID0gbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKTtcblxuXHRjb25zdCBwYXRocyA9IGZhc3RHbG9iLnN5bmMocGF0dGVybnMsIHtjd2QsIHN1cHByZXNzRXJyb3JzLCBkZWVwLCAuLi5pZ25vcmVGaWxlc0dsb2JPcHRpb25zfSk7XG5cblx0Y29uc3QgZmlsZXMgPSBwYXRocy5tYXAoZmlsZVBhdGggPT4gKHtcblx0XHRmaWxlUGF0aCxcblx0XHRjb250ZW50OiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JyksXG5cdH0pKTtcblxuXHRyZXR1cm4gZ2V0SXNJZ25vcmVkUHJlZGljYXRlKGZpbGVzLCBjd2QpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzR2l0SWdub3JlZCA9IG9wdGlvbnMgPT4gaXNJZ25vcmVkQnlJZ25vcmVGaWxlcyhHSVRJR05PUkVfRklMRVNfUEFUVEVSTiwgb3B0aW9ucyk7XG5leHBvcnQgY29uc3QgaXNHaXRJZ25vcmVkU3luYyA9IG9wdGlvbnMgPT4gaXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMoR0lUSUdOT1JFX0ZJTEVTX1BBVFRFUk4sIG9wdGlvbnMpO1xuIiwgImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBub2RlUGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IG1lcmdlMiBmcm9tICdtZXJnZTInO1xuaW1wb3J0IGZhc3RHbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZGlyR2xvYiBmcm9tICdkaXItZ2xvYic7XG5pbXBvcnQge1xuXHRHSVRJR05PUkVfRklMRVNfUEFUVEVSTixcblx0aXNJZ25vcmVkQnlJZ25vcmVGaWxlcyxcblx0aXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMsXG59IGZyb20gJy4vaWdub3JlLmpzJztcbmltcG9ydCB7RmlsdGVyU3RyZWFtLCB0b1BhdGgsIGlzTmVnYXRpdmVQYXR0ZXJufSBmcm9tICcuL3V0aWxpdGllcy5qcyc7XG5cbmNvbnN0IGFzc2VydFBhdHRlcm5zSW5wdXQgPSBwYXR0ZXJucyA9PiB7XG5cdGlmIChwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gdHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdHRlcm5zIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuXHR9XG59O1xuXG5jb25zdCB0b1BhdHRlcm5zQXJyYXkgPSBwYXR0ZXJucyA9PiB7XG5cdHBhdHRlcm5zID0gWy4uLm5ldyBTZXQoW3BhdHRlcm5zXS5mbGF0KCkpXTtcblx0YXNzZXJ0UGF0dGVybnNJbnB1dChwYXR0ZXJucyk7XG5cdHJldHVybiBwYXR0ZXJucztcbn07XG5cbmNvbnN0IGNoZWNrQ3dkT3B0aW9uID0gb3B0aW9ucyA9PiB7XG5cdGlmICghb3B0aW9ucy5jd2QpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgc3RhdDtcblx0dHJ5IHtcblx0XHRzdGF0ID0gZnMuc3RhdFN5bmMob3B0aW9ucy5jd2QpO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpZiAoIXN0YXQuaXNEaXJlY3RvcnkoKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBjd2RgIG9wdGlvbiBtdXN0IGJlIGEgcGF0aCB0byBhIGRpcmVjdG9yeScpO1xuXHR9XG59O1xuXG5jb25zdCBub3JtYWxpemVPcHRpb25zID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0aWdub3JlOiBvcHRpb25zLmlnbm9yZSB8fCBbXSxcblx0XHRleHBhbmREaXJlY3Rvcmllczogb3B0aW9ucy5leHBhbmREaXJlY3RvcmllcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHQ/IHRydWVcblx0XHRcdDogb3B0aW9ucy5leHBhbmREaXJlY3Rvcmllcyxcblx0XHRjd2Q6IHRvUGF0aChvcHRpb25zLmN3ZCksXG5cdH07XG5cblx0Y2hlY2tDd2RPcHRpb24ob3B0aW9ucyk7XG5cblx0cmV0dXJuIG9wdGlvbnM7XG59O1xuXG5jb25zdCBub3JtYWxpemVBcmd1bWVudHMgPSBmbiA9PiBhc3luYyAocGF0dGVybnMsIG9wdGlvbnMpID0+IGZuKHRvUGF0dGVybnNBcnJheShwYXR0ZXJucyksIG5vcm1hbGl6ZU9wdGlvbnMob3B0aW9ucykpO1xuY29uc3Qgbm9ybWFsaXplQXJndW1lbnRzU3luYyA9IGZuID0+IChwYXR0ZXJucywgb3B0aW9ucykgPT4gZm4odG9QYXR0ZXJuc0FycmF5KHBhdHRlcm5zKSwgbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKSk7XG5cbmNvbnN0IGdldElnbm9yZUZpbGVzUGF0dGVybnMgPSBvcHRpb25zID0+IHtcblx0Y29uc3Qge2lnbm9yZUZpbGVzLCBnaXRpZ25vcmV9ID0gb3B0aW9ucztcblxuXHRjb25zdCBwYXR0ZXJucyA9IGlnbm9yZUZpbGVzID8gdG9QYXR0ZXJuc0FycmF5KGlnbm9yZUZpbGVzKSA6IFtdO1xuXHRpZiAoZ2l0aWdub3JlKSB7XG5cdFx0cGF0dGVybnMucHVzaChHSVRJR05PUkVfRklMRVNfUEFUVEVSTik7XG5cdH1cblxuXHRyZXR1cm4gcGF0dGVybnM7XG59O1xuXG5jb25zdCBnZXRGaWx0ZXIgPSBhc3luYyBvcHRpb25zID0+IHtcblx0Y29uc3QgaWdub3JlRmlsZXNQYXR0ZXJucyA9IGdldElnbm9yZUZpbGVzUGF0dGVybnMob3B0aW9ucyk7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJGdW5jdGlvbihcblx0XHRpZ25vcmVGaWxlc1BhdHRlcm5zLmxlbmd0aCA+IDAgJiYgYXdhaXQgaXNJZ25vcmVkQnlJZ25vcmVGaWxlcyhpZ25vcmVGaWxlc1BhdHRlcm5zLCBvcHRpb25zKSxcblx0KTtcbn07XG5cbmNvbnN0IGdldEZpbHRlclN5bmMgPSBvcHRpb25zID0+IHtcblx0Y29uc3QgaWdub3JlRmlsZXNQYXR0ZXJucyA9IGdldElnbm9yZUZpbGVzUGF0dGVybnMob3B0aW9ucyk7XG5cdHJldHVybiBjcmVhdGVGaWx0ZXJGdW5jdGlvbihcblx0XHRpZ25vcmVGaWxlc1BhdHRlcm5zLmxlbmd0aCA+IDAgJiYgaXNJZ25vcmVkQnlJZ25vcmVGaWxlc1N5bmMoaWdub3JlRmlsZXNQYXR0ZXJucywgb3B0aW9ucyksXG5cdCk7XG59O1xuXG5jb25zdCBjcmVhdGVGaWx0ZXJGdW5jdGlvbiA9IGlzSWdub3JlZCA9PiB7XG5cdGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG5cblx0cmV0dXJuIGZhc3RHbG9iUmVzdWx0ID0+IHtcblx0XHRjb25zdCBwYXRoID0gZmFzdEdsb2JSZXN1bHQucGF0aCB8fCBmYXN0R2xvYlJlc3VsdDtcblx0XHRjb25zdCBwYXRoS2V5ID0gbm9kZVBhdGgubm9ybWFsaXplKHBhdGgpO1xuXHRcdGNvbnN0IHNlZW5Pcklnbm9yZWQgPSBzZWVuLmhhcyhwYXRoS2V5KSB8fCAoaXNJZ25vcmVkICYmIGlzSWdub3JlZChwYXRoKSk7XG5cdFx0c2Vlbi5hZGQocGF0aEtleSk7XG5cdFx0cmV0dXJuICFzZWVuT3JJZ25vcmVkO1xuXHR9O1xufTtcblxuY29uc3QgdW5pb25GYXN0R2xvYlJlc3VsdHMgPSAocmVzdWx0cywgZmlsdGVyKSA9PiByZXN1bHRzLmZsYXQoKS5maWx0ZXIoZmFzdEdsb2JSZXN1bHQgPT4gZmlsdGVyKGZhc3RHbG9iUmVzdWx0KSk7XG5jb25zdCB1bmlvbkZhc3RHbG9iU3RyZWFtcyA9IChzdHJlYW1zLCBmaWx0ZXIpID0+IG1lcmdlMihzdHJlYW1zKS5waXBlKG5ldyBGaWx0ZXJTdHJlYW0oZmFzdEdsb2JSZXN1bHQgPT4gZmlsdGVyKGZhc3RHbG9iUmVzdWx0KSkpO1xuXG5jb25zdCBjb252ZXJ0TmVnYXRpdmVQYXR0ZXJucyA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXNrcyA9IFtdO1xuXG5cdHdoaWxlIChwYXR0ZXJucy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBwYXR0ZXJucy5maW5kSW5kZXgocGF0dGVybiA9PiBpc05lZ2F0aXZlUGF0dGVybihwYXR0ZXJuKSk7XG5cblx0XHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0XHR0YXNrcy5wdXNoKHtwYXR0ZXJucywgb3B0aW9uc30pO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaWdub3JlUGF0dGVybiA9IHBhdHRlcm5zW2luZGV4XS5zbGljZSgxKTtcblxuXHRcdGZvciAoY29uc3QgdGFzayBvZiB0YXNrcykge1xuXHRcdFx0dGFzay5vcHRpb25zLmlnbm9yZS5wdXNoKGlnbm9yZVBhdHRlcm4pO1xuXHRcdH1cblxuXHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0dGFza3MucHVzaCh7XG5cdFx0XHRcdHBhdHRlcm5zOiBwYXR0ZXJucy5zbGljZSgwLCBpbmRleCksXG5cdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0XHRcdGlnbm9yZTogW1xuXHRcdFx0XHRcdFx0Li4ub3B0aW9ucy5pZ25vcmUsXG5cdFx0XHRcdFx0XHRpZ25vcmVQYXR0ZXJuLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRwYXR0ZXJucyA9IHBhdHRlcm5zLnNsaWNlKGluZGV4ICsgMSk7XG5cdH1cblxuXHRyZXR1cm4gdGFza3M7XG59O1xuXG5jb25zdCBnZXREaXJHbG9iT3B0aW9ucyA9IChvcHRpb25zLCBjd2QpID0+ICh7XG5cdC4uLihjd2QgPyB7Y3dkfSA6IHt9KSxcblx0Li4uKEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyB7ZmlsZXM6IG9wdGlvbnN9IDogb3B0aW9ucyksXG59KTtcblxuY29uc3QgZ2VuZXJhdGVUYXNrcyA9IGFzeW5jIChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuXHRjb25zdCBnbG9iVGFza3MgPSBjb252ZXJ0TmVnYXRpdmVQYXR0ZXJucyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cblx0Y29uc3Qge2N3ZCwgZXhwYW5kRGlyZWN0b3JpZXN9ID0gb3B0aW9ucztcblxuXHRpZiAoIWV4cGFuZERpcmVjdG9yaWVzKSB7XG5cdFx0cmV0dXJuIGdsb2JUYXNrcztcblx0fVxuXG5cdGNvbnN0IHBhdHRlcm5FeHBhbmRPcHRpb25zID0gZ2V0RGlyR2xvYk9wdGlvbnMoZXhwYW5kRGlyZWN0b3JpZXMsIGN3ZCk7XG5cdGNvbnN0IGlnbm9yZUV4cGFuZE9wdGlvbnMgPSBjd2QgPyB7Y3dkfSA6IHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0Z2xvYlRhc2tzLm1hcChhc3luYyB0YXNrID0+IHtcblx0XHRcdGxldCB7cGF0dGVybnMsIG9wdGlvbnN9ID0gdGFzaztcblxuXHRcdFx0W1xuXHRcdFx0XHRwYXR0ZXJucyxcblx0XHRcdFx0b3B0aW9ucy5pZ25vcmUsXG5cdFx0XHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuXHRcdFx0XHRkaXJHbG9iKHBhdHRlcm5zLCBwYXR0ZXJuRXhwYW5kT3B0aW9ucyksXG5cdFx0XHRcdGRpckdsb2Iob3B0aW9ucy5pZ25vcmUsIGlnbm9yZUV4cGFuZE9wdGlvbnMpLFxuXHRcdFx0XSk7XG5cblx0XHRcdHJldHVybiB7cGF0dGVybnMsIG9wdGlvbnN9O1xuXHRcdH0pLFxuXHQpO1xufTtcblxuY29uc3QgZ2VuZXJhdGVUYXNrc1N5bmMgPSAocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgZ2xvYlRhc2tzID0gY29udmVydE5lZ2F0aXZlUGF0dGVybnMocGF0dGVybnMsIG9wdGlvbnMpO1xuXG5cdGNvbnN0IHtjd2QsIGV4cGFuZERpcmVjdG9yaWVzfSA9IG9wdGlvbnM7XG5cblx0aWYgKCFleHBhbmREaXJlY3Rvcmllcykge1xuXHRcdHJldHVybiBnbG9iVGFza3M7XG5cdH1cblxuXHRjb25zdCBwYXR0ZXJuRXhwYW5kT3B0aW9ucyA9IGdldERpckdsb2JPcHRpb25zKGV4cGFuZERpcmVjdG9yaWVzLCBjd2QpO1xuXHRjb25zdCBpZ25vcmVFeHBhbmRPcHRpb25zID0gY3dkID8ge2N3ZH0gOiB1bmRlZmluZWQ7XG5cblx0cmV0dXJuIGdsb2JUYXNrcy5tYXAodGFzayA9PiB7XG5cdFx0bGV0IHtwYXR0ZXJucywgb3B0aW9uc30gPSB0YXNrO1xuXHRcdHBhdHRlcm5zID0gZGlyR2xvYi5zeW5jKHBhdHRlcm5zLCBwYXR0ZXJuRXhwYW5kT3B0aW9ucyk7XG5cdFx0b3B0aW9ucy5pZ25vcmUgPSBkaXJHbG9iLnN5bmMob3B0aW9ucy5pZ25vcmUsIGlnbm9yZUV4cGFuZE9wdGlvbnMpO1xuXHRcdHJldHVybiB7cGF0dGVybnMsIG9wdGlvbnN9O1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnbG9iYnkgPSBub3JtYWxpemVBcmd1bWVudHMoYXN5bmMgKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IFtcblx0XHR0YXNrcyxcblx0XHRmaWx0ZXIsXG5cdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0Z2VuZXJhdGVUYXNrcyhwYXR0ZXJucywgb3B0aW9ucyksXG5cdFx0Z2V0RmlsdGVyKG9wdGlvbnMpLFxuXHRdKTtcblx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHRhc2tzLm1hcCh0YXNrID0+IGZhc3RHbG9iKHRhc2sucGF0dGVybnMsIHRhc2sub3B0aW9ucykpKTtcblxuXHRyZXR1cm4gdW5pb25GYXN0R2xvYlJlc3VsdHMocmVzdWx0cywgZmlsdGVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgZ2xvYmJ5U3luYyA9IG5vcm1hbGl6ZUFyZ3VtZW50c1N5bmMoKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG5cdGNvbnN0IHRhc2tzID0gZ2VuZXJhdGVUYXNrc1N5bmMocGF0dGVybnMsIG9wdGlvbnMpO1xuXHRjb25zdCBmaWx0ZXIgPSBnZXRGaWx0ZXJTeW5jKG9wdGlvbnMpO1xuXHRjb25zdCByZXN1bHRzID0gdGFza3MubWFwKHRhc2sgPT4gZmFzdEdsb2Iuc3luYyh0YXNrLnBhdHRlcm5zLCB0YXNrLm9wdGlvbnMpKTtcblxuXHRyZXR1cm4gdW5pb25GYXN0R2xvYlJlc3VsdHMocmVzdWx0cywgZmlsdGVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgZ2xvYmJ5U3RyZWFtID0gbm9ybWFsaXplQXJndW1lbnRzU3luYygocGF0dGVybnMsIG9wdGlvbnMpID0+IHtcblx0Y29uc3QgdGFza3MgPSBnZW5lcmF0ZVRhc2tzU3luYyhwYXR0ZXJucywgb3B0aW9ucyk7XG5cdGNvbnN0IGZpbHRlciA9IGdldEZpbHRlclN5bmMob3B0aW9ucyk7XG5cdGNvbnN0IHN0cmVhbXMgPSB0YXNrcy5tYXAodGFzayA9PiBmYXN0R2xvYi5zdHJlYW0odGFzay5wYXR0ZXJucywgdGFzay5vcHRpb25zKSk7XG5cblx0cmV0dXJuIHVuaW9uRmFzdEdsb2JTdHJlYW1zKHN0cmVhbXMsIGZpbHRlcik7XG59KTtcblxuZXhwb3J0IGNvbnN0IGlzRHluYW1pY1BhdHRlcm4gPSBub3JtYWxpemVBcmd1bWVudHNTeW5jKFxuXHQocGF0dGVybnMsIG9wdGlvbnMpID0+IHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBmYXN0R2xvYi5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUdsb2JUYXNrcyA9IG5vcm1hbGl6ZUFyZ3VtZW50cyhnZW5lcmF0ZVRhc2tzKTtcbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUdsb2JUYXNrc1N5bmMgPSBub3JtYWxpemVBcmd1bWVudHNTeW5jKGdlbmVyYXRlVGFza3NTeW5jKTtcblxuZXhwb3J0IHtcblx0aXNHaXRJZ25vcmVkLFxuXHRpc0dpdElnbm9yZWRTeW5jLFxufSBmcm9tICcuL2lnbm9yZS5qcyc7XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuaW1wb3J0IHsgZ2V0VHlwZU5hbWUgfSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnbG9iYWxTY2hlbWFzKSkge1xuICAgIGlmIChrZXkgPT09IFwiYmF0Y2hcIikge1xuICAgICAgY29uc3Qgc2NoZW1hV2l0aFJlZmVyZW5jZXMgPSBlbWJlZFNjaGVtYVJlZmVyZW5jZXModmFsdWUsIGdsb2JhbFNjaGVtYXMpXG4gICAgICBnbG9iYWxTY2hlbWFzW2tleV0gPSBzY2hlbWFXaXRoUmVmZXJlbmNlc1xuICAgIH1cbiAgfVxuXG4gIC8vIEJ1aWxkIE9wZW5BUEkgc3BlY1xuICBjb25zdCBidWlsZGVyID0gT3BlbkFwaUJ1aWxkZXIuY3JlYXRlKHtcbiAgICBvcGVuYXBpOiBcIjMuMC4wXCIsXG4gICAgaW5mbzoge1xuICAgICAgdGl0bGU6IGdsb2JhbFNldHVwUGFyYW1zLmFwaU5hbWUsXG4gICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgfSxcbiAgICBzZXJ2ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIHVybDogZ2xvYmFsU2V0dXBQYXJhbXMucHJvZHVjdGlvblNlcnZlclVybCB8fCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0YWdzOiB0YWdzLm1hcCgodGFnKSA9PiAoeyBuYW1lOiB0YWcubmFtZSwgZGVzY3JpcHRpb246IHRhZy5kZXNjcmlwdGlvbiB9KSksXG4gICAgcGF0aHM6IHt9LFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lcyxcbiAgICAgIHNjaGVtYXM6IGdsb2JhbFNjaGVtYXMsXG4gICAgfSxcbiAgfSlcblxuICBmb3IgKGNvbnN0IFtcbiAgICBmaWxlX3BhdGgsXG4gICAgeyBzZXR1cFBhcmFtcywgcm91dGVTcGVjLCByb3V0ZTogcm91dGVQYXRoIH0sXG4gIF0gb2YgZmlsZXBhdGhUb1JvdXRlRm4pIHtcbiAgICBjb25zdCBtZXRob2RzID0gcm91dGVTcGVjLm1ldGhvZHNcbiAgICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSBpdCBoYXMgbm8gbWV0aG9kcy5gKVxuICAgICAgKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZGVzY3JpcHRpb24gPSByb3V0ZVNwZWMuZGVzY3JpcHRpb25cbiAgICBsZXQgZGVzY3JpcHRpb25NZXRhZGF0YToge1xuICAgICAgcmVzcG9uc2Vfa2V5Pzogc3RyaW5nXG4gICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICB9ID0ge31cblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKS50cmltKClcblxuICAgICAgaWYgKHRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGEgPSBhdHRyaWJ1dGVzXG4gICAgICAgIGRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZERlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSA9IHByZWZpeE9iamVjdEtleXNXaXRoWChcbiAgICAgIGRhc2hpZnlPYmplY3RLZXlzKGRlc2NyaXB0aW9uTWV0YWRhdGEpXG4gICAgKVxuXG4gICAgY29uc3QgbWV0aG9kUm91dGVzOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRpb25PYmplY3Q+ID0ge31cblxuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGlzUG9zdE9yUHV0T3JQYXRjaCA9IFtcIlBPU1RcIiwgXCJQVVRcIiwgXCJQQVRDSFwiXS5pbmNsdWRlcyhtZXRob2QpXG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgICAgbGV0IGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5ID8/IHJvdXRlU3BlYy5jb21tb25QYXJhbXNcblxuICAgICAgICBpZiAocm91dGVTcGVjLmpzb25Cb2R5ICYmIHJvdXRlU3BlYy5jb21tb25QYXJhbXMpIHtcbiAgICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IChcbiAgICAgICAgICAgIHJvdXRlU3BlYy5qc29uQm9keSBhcyB6LlpvZE9iamVjdDxhbnk+XG4gICAgICAgICAgKS5tZXJnZShyb3V0ZVNwZWMuY29tbW9uUGFyYW1zIGFzIHouWm9kT2JqZWN0PGFueT4pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLmpzb25Cb2R5XG4gICAgICB9XG5cbiAgICAgIGxldCBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWFcbiAgICAgIGlmIChpc1Bvc3RPclB1dE9yUGF0Y2gpIHtcbiAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgPVxuICAgICAgICAgIHJvdXRlU3BlYy5xdWVyeVBhcmFtcyA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgICAgaWYgKHJvdXRlU3BlYy5xdWVyeVBhcmFtcyAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID0gKFxuICAgICAgICAgICAgcm91dGVTcGVjLnF1ZXJ5UGFyYW1zIGFzIHouWm9kT2JqZWN0PGFueT5cbiAgICAgICAgICApLm1lcmdlKHJvdXRlU3BlYy5jb21tb25QYXJhbXMgYXMgei5ab2RPYmplY3Q8YW55PilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZTogT3BlcmF0aW9uT2JqZWN0ID0ge1xuICAgICAgICAuLi5yb3V0ZVNwZWMub3BlbkFwaU1ldGFkYXRhLFxuICAgICAgICAuLi5mb3JtYXR0ZWREZXNjcmlwdGlvbk1ldGFkYXRhLFxuICAgICAgICBzdW1tYXJ5OiByb3V0ZVBhdGgsXG4gICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICBvcGVyYXRpb25JZDogYCR7dHJhbnNmb3JtUGF0aFRvT3BlcmF0aW9uSWQocm91dGVQYXRoKX0ke3Bhc2NhbENhc2UoXG4gICAgICAgICAgbWV0aG9kXG4gICAgICAgICl9YCxcbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPS1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJCYWQgUmVxdWVzdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgNDAxOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJVbmF1dGhvcml6ZWRcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eTogQXJyYXkuaXNBcnJheShyb3V0ZVNwZWMuYXV0aClcbiAgICAgICAgICA/IHJvdXRlU3BlYy5hdXRoXG4gICAgICAgICAgICAgIC5tYXAoKGF1dGhUeXBlKSA9PiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVthdXRoVHlwZV0pXG4gICAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICA6IHNlY3VyaXR5T2JqZWN0c0ZvckF1dGhUeXBlW3JvdXRlU3BlYy5hdXRoXSxcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIHJvdXRlLnJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICAgIHNjaGVtYTogZ2VuZXJhdGVTY2hlbWEoYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSBhcyBhbnkpXG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlck9iamVjdFtdID0gT2JqZWN0LmtleXMoXG4gICAgICAgICAgICBzY2hlbWEucHJvcGVydGllcyBhcyBhbnlcbiAgICAgICAgICApLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgaW46IFwicXVlcnlcIixcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEucHJvcGVydGllcyFbbmFtZV0sXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBzY2hlbWEucmVxdWlyZWQ/LmluY2x1ZGVzKG5hbWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByb3V0ZS5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyc1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsganNvblJlc3BvbnNlIH0gPSByb3V0ZVNwZWNcbiAgICAgIGNvbnN0IHsgYWRkT2tTdGF0dXMgPSB0cnVlIH0gPSBzZXR1cFBhcmFtc1xuXG4gICAgICBpZiAoanNvblJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZVR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoanNvblJlc3BvbnNlKVxuICAgICAgICBpZiAoanNvblJlc3BvbnNlVHlwZU5hbWUgIT09IFwiWm9kT2JqZWN0XCIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSAke3JvdXRlUGF0aH0gYmVjYXVzZSB0aGUgcmVzcG9uc2UgaXMgbm90IGEgWm9kT2JqZWN0LmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU2NoZW1hID0gZ2VuZXJhdGVTY2hlbWEoXG4gICAgICAgICAgYWRkT2tTdGF0dXMgJiYganNvblJlc3BvbnNlIGluc3RhbmNlb2Ygei5ab2RPYmplY3RcbiAgICAgICAgICAgID8ganNvblJlc3BvbnNlLmV4dGVuZCh7IG9rOiB6LmJvb2xlYW4oKSB9KVxuICAgICAgICAgICAgOiBqc29uUmVzcG9uc2VcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHNjaGVtYVdpdGhSZWZlcmVuY2VzID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKFxuICAgICAgICAgIHJlc3BvbnNlU2NoZW1hLFxuICAgICAgICAgIGdsb2JhbFNjaGVtYXNcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChyb3V0ZS5yZXNwb25zZXMgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBub3QgaGFyZGNvZGUgMjAwIGhlcmVcbiAgICAgICAgICByb3V0ZS5yZXNwb25zZXNbMjAwXS5jb250ZW50ID0ge1xuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFXaXRoUmVmZXJlbmNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJvdXRlLnRhZ3MgPSBbXVxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICBpZiAodGFnLmRvZXNSb3V0ZUhhdmVUYWcgJiYgdGFnLmRvZXNSb3V0ZUhhdmVUYWcocm91dGUuc3VtbWFyeSB8fCBcIlwiKSkge1xuICAgICAgICAgIHJvdXRlLnRhZ3MucHVzaCh0YWcubmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGEgPSBhd2FpdCBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICAgICAgICBtZXRob2RzOiBbbWV0aG9kXSwgLy8gT25seSBwYXNzIHRoaXMgc3BlY2lmaWMgbWV0aG9kXG4gICAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgICAgc2RrUmV0dXJuVmFsdWU6XG4gICAgICAgICAgZGVzY3JpcHRpb25NZXRhZGF0YT8ucmVzcG9uc2Vfa2V5ID8/IHJvdXRlU3BlYy5zZGtSZXR1cm5WYWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIE9iamVjdC5hc3NpZ24ocm91dGUsIG1ldGhvZHNNYXBwZWRUb0Zlcm5TZGtNZXRhZGF0YVttZXRob2RdKVxuICAgICAgbWV0aG9kUm91dGVzW21ldGhvZC50b0xvd2VyQ2FzZSgpXSA9IHJvdXRlXG4gICAgfVxuXG4gICAgYnVpbGRlci5hZGRQYXRoKHJvdXRlUGF0aCwgbWV0aG9kUm91dGVzKVxuICB9XG5cbiAgaWYgKG91dHB1dEZpbGUpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0RmlsZSwgYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMikpXG4gIH1cblxuICByZXR1cm4gYnVpbGRlci5nZXRTcGVjQXNKc29uKHVuZGVmaW5lZCwgMilcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFJvdXRlU3BlYywgU2V0dXBQYXJhbXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUgfSBmcm9tIFwiLi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgc2V0dXBQYXJhbXM6IFNldHVwUGFyYW1zXG4gIHJvdXRlU3BlYzogUm91dGVTcGVjXG4gIHJvdXRlRm46IEZ1bmN0aW9uXG4gIHJvdXRlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUm91dGVzSW5QYWNrYWdlID0gYXN5bmMgKG9wdHM6IHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbn0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4+ID0+IHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgZ2xvYmJ5ID0gKGF3YWl0IGltcG9ydChcImdsb2JieVwiKSkuZ2xvYmJ5XG4gIGNvbnN0IHtcbiAgICBwYWNrYWdlRGlyLFxuICAgIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIixcbiAgICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlID0gZGVmYXVsdE1hcEZpbGVQYXRoVG9IVFRQUm91dGUob3B0cy5hcGlQcmVmaXgpLFxuICB9ID0gb3B0c1xuICAvLyBMb2FkIGFsbCByb3V0ZSBzcGVjc1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG4gIGNvbnNvbGUubG9nKGBzZWFyY2hpbmcgXCIke2Z1bGxQYXRoR2xvYn1cIi4uLmApXG4gIGNvbnN0IGZpbGVwYXRocyA9IGF3YWl0IGdsb2JieShgJHtmdWxsUGF0aEdsb2J9YClcbiAgY29uc29sZS5sb2coYGZvdW5kICR7ZmlsZXBhdGhzLmxlbmd0aH0gZmlsZXNgKVxuICBpZiAoZmlsZXBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZmlsZXMgZm91bmQgYXQgXCIke2Z1bGxQYXRoR2xvYn1cImApXG4gIH1cbiAgY29uc3QgZmlsZXBhdGhUb1JvdXRlRm4gPSBuZXcgTWFwPHN0cmluZywgUm91dGVJbmZvPigpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXBhdGhzLm1hcChhc3luYyAocCkgPT4ge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiByb3V0ZUZuIH0gPSBhd2FpdCByZXF1aXJlKHBhdGgucmVzb2x2ZShwKSlcblxuICAgICAgaWYgKHJvdXRlRm4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJvdXRlRm4uX3JvdXRlU3BlYz8uZXhjbHVkZUZyb21PcGVuQXBpICYmXG4gICAgICAgICAgIW9wdHMuaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlc1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH0gYmVjYXVzZSBpdCB3YXMgZXhjbHVkZWQgZnJvbSBPcGVuQVBJIGdlbmVyYXRpb25cImBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3V0ZUZuLl9zZXR1cFBhcmFtcykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYElnbm9yaW5nIFwiJHtwfVwiIGJlY2F1c2UgaXQgd2Fzbid0IGNyZWF0ZWQgd2l0aCB3aXRoUm91dGVTcGVjYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmaWxlcGF0aFRvUm91dGVGbi5zZXQocCwge1xuICAgICAgICAgIHNldHVwUGFyYW1zOiByb3V0ZUZuLl9zZXR1cFBhcmFtcyxcbiAgICAgICAgICByb3V0ZVNwZWM6IHJvdXRlRm4uX3JvdXRlU3BlYyxcbiAgICAgICAgICByb3V0ZTogbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZShwKSxcbiAgICAgICAgICByb3V0ZUZuLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgQ291bGRuJ3QgZmluZCByb3V0ZSAke3B9YCkpXG4gICAgICB9XG4gICAgfSlcbiAgKVxuXG4gIHJldHVybiBmaWxlcGF0aFRvUm91dGVGblxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlID1cbiAgKGFwaV9wcmVmaXg6IHN0cmluZyA9IFwiL2FwaVwiKSA9PlxuICAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb3V0ZSA9IGZpbGVfcGF0aFxuICAgICAgLy8gcmVwbGFjZSAuLyBpZiBpdCBzdGFydHMgd2l0aCAuL1xuICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCBcIi9cIilcbiAgICAgIC8vIHJlcGxhY2Ugc3RhcnRpbmcgL1xuICAgICAgLnJlcGxhY2UoL15cXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvc3JjIGlmIGl0IHN0YXJ0cyB3aXRoIC9zcmNcbiAgICAgIC5yZXBsYWNlKC9ec3JjXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL3BhZ2VzIGlmIGl0IHN0YXJ0cyB3aXRoIC9wYWdlc1xuICAgICAgLnJlcGxhY2UoL15wYWdlc1xcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9hcGkgaWYgaXQgc3RhcnRzIHdpdGggL2FwaVxuICAgICAgLnJlcGxhY2UoL15hcGlcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAudHMgaWYgaXQgZW5kcyB3aXRoIC50c1xuICAgICAgLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpXG4gICAgICAvLyByZW1vdmUgcHVibGljIHJlZmVyZW5jZVxuICAgICAgLnJlcGxhY2UoXCJwdWJsaWNcIiwgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgaW5kZXggaWYgaXQgZW5kcyB3aXRoIGluZGV4XG4gICAgICAucmVwbGFjZSgvXFwvXFxpbmRleCg/IS4pLywgXCJcIilcblxuICAgIHJldHVybiBwYXRoLmpvaW4oYXBpX3ByZWZpeCwgcm91dGUpXG4gIH1cbiIsICIvKipcbiAqIFpvZCBPcGVuQVBJIEdlbmVyYXRvci5cbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmF0aW5lL3pvZC1wbHVnaW5zXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQnJpYW4gTWNCcmlkZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTY2hlbWFPYmplY3QsIFNjaGVtYU9iamVjdFR5cGUgfSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuaW1wb3J0IHsgeiwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5pbXBvcnQgeyBwcmVmaXhPYmplY3RLZXlzV2l0aFggfSBmcm9tIFwiLi4vdXRpbHMvcHJlZml4LW9iamVjdC1rZXlzLXdpdGgteFwiXG5pbXBvcnQgeyBkYXNoaWZ5T2JqZWN0S2V5cyB9IGZyb20gXCIuLi91dGlscy9kYXNoaWZ5LW9iamVjdC1rZXlzXCJcbmltcG9ydCB7XG4gIGdldFR5cGVOYW1lLFxuICBnZXREZWYsXG4gIGdldEVmZmVjdHNTY2hlbWEsXG4gIGdldEVmZmVjdCxcbiAgZ2V0Q2hlY2tzLFxuICBnZXRJbm5lclR5cGUsXG4gIGdldEVudW1WYWx1ZXMsXG4gIGdldExpdGVyYWxWYWx1ZSxcbiAgZ2V0RGVmYXVsdFZhbHVlLFxuICBnZXRBcnJheUNvbnN0cmFpbnRzLFxuICBnZXRSZWNvcmRWYWx1ZVR5cGUsXG4gIGdldENhdGNoYWxsLFxuICBnZXRVbmtub3duS2V5cyxcbiAgZ2V0SW50ZXJzZWN0aW9uUGFydHMsXG4gIGdldFVuaW9uT3B0aW9ucyxcbiAgZ2V0RGlzY3JpbWluYXRvcixcbiAgZ2V0QnJhbmRlZFR5cGUsXG4gIGdldFBpcGVsaW5lUGFydHMsXG4gIGdldFNoYXBlLFxufSBmcm9tIFwiLi4vLi4vbGliL3pvZC1jb21wYXRcIlxuXG4vLyBUeXBlIGFsaWFzIGZvciBab2QgMy80IGNvbXBhdGliaWxpdHlcbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8YW55PlxuXG4vLyBFeHRlbmRlZCBTY2hlbWFPYmplY3QgdGhhdCBpbmNsdWRlcyBPcGVuQVBJIDMuMCdzIG51bGxhYmxlIHByb3BlcnR5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxudHlwZSBFeHRlbmRlZFNjaGVtYU9iamVjdCA9IFNjaGVtYU9iamVjdCAmIHsgbnVsbGFibGU/OiBib29sZWFuIH1cbnR5cGUgQW5hdGluZVNjaGVtYU9iamVjdCA9IEV4dGVuZGVkU2NoZW1hT2JqZWN0ICYgeyBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXSB9XG5cbi8qKlxuICogU2hhbGxvdyBtZXJnZSBtdWx0aXBsZSBzY2hlbWEgb2JqZWN0cyBpbnRvIG9uZS5cbiAqIERlZXAgbWVyZ2UgaXMgbm90IG5lZWRlZCBzaW5jZSBtZXRhT3BlbkFwaSBvbmx5IGNvbnRhaW5zIGZsYXQgbWV0YWRhdGFcbiAqIChkZXNjcmlwdGlvbiwgZGVwcmVjYXRlZCwgeC0qIGV4dGVuc2lvbnMpLCBub3QgbmVzdGVkIHNjaGVtYSBzdHJ1Y3R1cmVzLlxuICovXG5mdW5jdGlvbiBtZXJnZVNjaGVtYXMoXG4gIC4uLnNjaGVtYXM6IEFycmF5PFBhcnRpYWw8RXh0ZW5kZWRTY2hlbWFPYmplY3Q+IHwgdW5kZWZpbmVkPlxuKTogRXh0ZW5kZWRTY2hlbWFPYmplY3Qge1xuICBjb25zdCByZXN1bHQ6IEV4dGVuZGVkU2NoZW1hT2JqZWN0ID0ge31cbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBzY2hlbWEpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQXBpWm9kQW55IGV4dGVuZHMgWm9kVHlwZUFueSB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgT3BlbkFwaVpvZEFueU9iamVjdCBleHRlbmRzIEFueVpvZE9iamVjdCB7XG4gIG1ldGFPcGVuQXBpPzogQW5hdGluZVNjaGVtYU9iamVjdCB8IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxufVxuXG5pbnRlcmZhY2UgUGFyc2luZ0FyZ3M8VD4ge1xuICB6b2RSZWY6IFRcbiAgc2NoZW1hczogQW5hdGluZVNjaGVtYU9iamVjdFtdXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbiAgaGlkZURlZmluaXRpb25zPzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEFwaTxUIGV4dGVuZHMgT3BlbkFwaVpvZEFueT4oXG4gIHNjaGVtYTogVCxcbiAgc2NoZW1hT2JqZWN0OiBBbmF0aW5lU2NoZW1hT2JqZWN0ID0ge31cbik6IFQge1xuICBzY2hlbWEubWV0YU9wZW5BcGkgPSBPYmplY3QuYXNzaWduKHNjaGVtYS5tZXRhT3BlbkFwaSB8fCB7fSwgc2NoZW1hT2JqZWN0KVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGVab2RPYmplY3Qoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgaGlkZURlZmluaXRpb25zLFxufTogUGFyc2luZ0FyZ3M8T3BlbkFwaVpvZEFueU9iamVjdD4pIHtcbiAgLy8gR2V0IHNoYXBlIHVzaW5nIHRoZSBjb21wYXQgaGVscGVyICh3b3JrcyBpbiBib3RoIFpvZCAzIGFuZCA0KVxuICBjb25zdCBzaGFwZSA9IGdldFNoYXBlKHpvZFJlZiBhcyBab2RUeXBlQW55KSB8fCB7fVxuICBjb25zdCByZWR1Y2VkID0gT2JqZWN0LmtleXMoc2hhcGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiBoaWRlRGVmaW5pdGlvbnM/LmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoY2FycnksIGtleSkgPT4gKHtcbiAgICAgICAgLi4uY2FycnksXG4gICAgICAgIFtrZXldOiBnZW5lcmF0ZVNjaGVtYShzaGFwZVtrZXldLCB1c2VPdXRwdXQpLFxuICAgICAgfSksXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBTY2hlbWFPYmplY3Q+XG4gICAgKVxuXG4gIHJldHVybiByZWR1Y2VkXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmOiBPcGVuQXBpWm9kQW55KTogU2NoZW1hT2JqZWN0IHtcbiAgaWYgKCF6b2RSZWYuZGVzY3JpcHRpb24pIHJldHVybiB7fVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoem9kUmVmLmRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKVxuICAgIHJldHVybiB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfVxuICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICBjb25zdCBvdXRwdXQ6IFNjaGVtYU9iamVjdCA9IHt9XG4gIGlmIChib2R5LnRyaW0oKSkgb3V0cHV0LmRlc2NyaXB0aW9uID0gYm9keS50cmltKClcbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG91dHB1dC5kZXByZWNhdGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKFxuICAgICAgcHJlZml4T2JqZWN0S2V5c1dpdGhYKGRhc2hpZnlPYmplY3RLZXlzKGF0dHJpYnV0ZXMpKVxuICAgICkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuZnVuY3Rpb24gcGFyc2VUcmFuc2Zvcm1hdGlvbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGlubmVyU2NoZW1hID0gZ2V0RWZmZWN0c1NjaGVtYSh6b2RSZWYpXG4gIGNvbnN0IGlucHV0ID0gaW5uZXJTY2hlbWEgPyBnZW5lcmF0ZVNjaGVtYShpbm5lclNjaGVtYSwgdXNlT3V0cHV0KSA6IHt9XG5cbiAgbGV0IG91dHB1dCA9IFwidW5kZWZpbmVkXCJcbiAgY29uc3QgZWZmZWN0ID0gZ2V0RWZmZWN0KHpvZFJlZilcbiAgaWYgKHVzZU91dHB1dCAmJiBlZmZlY3QpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1FZmZlY3QgPSBlZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGVmZmVjdCA6IG51bGxcbiAgICBpZiAodHJhbnNmb3JtRWZmZWN0ICYmIFwidHJhbnNmb3JtXCIgaW4gdHJhbnNmb3JtRWZmZWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBvdXRwdXQgPSB0eXBlb2YgdHJhbnNmb3JtRWZmZWN0LnRyYW5zZm9ybShcbiAgICAgICAgICBbXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGAke2lucHV0LnR5cGV9YClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgIDogXCJib29sZWFuXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogXCJvYmplY3RcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBcIm51bGxcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IFwiYXJyYXlcIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgeyBhZGRJc3N1ZTogKCkgPT4gdW5kZWZpbmVkLCBwYXRoOiBbXSB9IC8vIFRPRE86IERpc2NvdmVyIGlmIGNvbnRleHQgaXMgbmVjZXNzYXJ5IGhlcmVcbiAgICAgICAgKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiovXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgLi4uKHpvZFJlZi5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHpvZFJlZi5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uaW5wdXQsXG4gICAgICAuLi4oW1wibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwiYm9vbGVhblwiLCBcIm51bGxcIl0uaW5jbHVkZXMob3V0cHV0KVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6IG91dHB1dCBhcyBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwiYm9vbGVhblwiIHwgXCJudWxsXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kU3RyaW5nPik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGJhc2VTY2hlbWE6IFNjaGVtYU9iamVjdCA9IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICB9XG4gIGNvbnN0IGNoZWNrcyA9IGdldENoZWNrcyh6b2RSZWYpXG4gIGNoZWNrcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgLy8gR2V0IHRoZSBraW5kIC0gWm9kIDMgdXNlcyBpdGVtLmtpbmQsIFpvZCA0IHVzZXMgaXRlbS5jaGVjayAobm9ybWFsaXplZCBieSBnZXRDaGVja3MpXG4gICAgY29uc3Qga2luZCA9IGl0ZW0ua2luZCB8fCBpdGVtLmNoZWNrXG4gICAgLy8gR2V0IGZvcm1hdCBmb3IgWm9kIDQgc3RyaW5nIGZvcm1hdCBjaGVja3NcbiAgICBjb25zdCBmb3JtYXQgPSBpdGVtLmZvcm1hdFxuXG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImVtYWlsXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjdWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJjdWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcInVyaVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBab2QgNCB1c2VzIFwic3RyaW5nX2Zvcm1hdFwiIGFzIHRoZSBjaGVjayB0eXBlIHdpdGggZm9ybWF0IHByb3BlcnR5XG4gICAgICBjYXNlIFwic3RyaW5nX2Zvcm1hdFwiOlxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImVtYWlsXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJlbWFpbFwiXG4gICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PT0gXCJ1dWlkXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgZWxzZSBpZiAoZm9ybWF0ID09PSBcImN1aWRcIikgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImN1aWRcIlxuICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT09IFwidXJsXCIpIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1cmlcIlxuICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT09IFwiZGF0ZXRpbWVcIikgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgIGNhc2UgXCJtYXhfbGVuZ3RoXCI6XG4gICAgICAgIC8vIFpvZCAzOiBpdGVtLnZhbHVlLCBab2QgNCAobm9ybWFsaXplZCk6IGl0ZW0ubWF4aW11bVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWUgPz8gaXRlbS5tYXhpbXVtXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICBjYXNlIFwibWluX2xlbmd0aFwiOlxuICAgICAgICAvLyBab2QgMzogaXRlbS52YWx1ZSwgWm9kIDQgKG5vcm1hbGl6ZWQpOiBpdGVtLm1pbmltdW1cbiAgICAgICAgYmFzZVNjaGVtYS5taW5MZW5ndGggPSBpdGVtLnZhbHVlID8/IGl0ZW0ubWluaW11bVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlZ2V4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEucGF0dGVybiA9IGl0ZW0ucmVnZXg/LnNvdXJjZSA/PyBpdGVtLnBhdHRlcm4/LnNvdXJjZVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdW1iZXI+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgYmFzZVNjaGVtYTogU2NoZW1hT2JqZWN0ID0ge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgZm9ybWF0OiBcImZsb2F0XCIsXG4gIH1cbiAgY29uc3QgY2hlY2tzID0gZ2V0Q2hlY2tzKHpvZFJlZilcbiAgY2hlY2tzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBzd2l0Y2ggKGl0ZW0ua2luZCkge1xuICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICBiYXNlU2NoZW1hLm1heGltdW0gPSBpdGVtLnZhbHVlXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVVBTVFJFQU06IFRoZSBvcGVuYXBpMy10cyB0eXBlcyBhcmUgd3Jvbmc6IGV4Y2x1c2l2ZU1heGltdW0gaXMgYSBib29sZWFuIGluIHRoaXMgdmVyc2lvbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi92M18wL2RhdGEtbW9kZWxzL2RhdGEtdHlwZXMvXG4gICAgICAgIGlmICghaXRlbS5pbmNsdXNpdmUpIGJhc2VTY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtaW5cIjpcbiAgICAgICAgYmFzZVNjaGVtYS5taW5pbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVQU1RSRUFNOiBUaGUgb3BlbmFwaTMtdHMgdHlwZXMgYXJlIHdyb25nOiBleGNsdXNpdmVNaW5pbXVtIGlzIGEgYm9vbGVhbiBpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vdjNfMC9kYXRhLW1vZGVscy9kYXRhLXR5cGVzL1xuICAgICAgICBpZiAoIWl0ZW0uaW5jbHVzaXZlKSBiYXNlU2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiaW50XCI6XG4gICAgICAgIGJhc2VTY2hlbWEudHlwZSA9IFwiaW50ZWdlclwiXG4gICAgICAgIGRlbGV0ZSBiYXNlU2NoZW1hLmZvcm1hdFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm11bHRpcGxlT2ZcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tdWx0aXBsZU9mID0gaXRlbS52YWx1ZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXhjbHVkZWREZWZpbml0aW9uczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmhpZGVEZWZpbml0aW9ucykpIHtcbiAgICAgIGV4Y2x1ZGVkRGVmaW5pdGlvbnMucHVzaCguLi5zY2hlbWEuaGlkZURlZmluaXRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGNsdWRlZERlZmluaXRpb25zXG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPEFueVpvZE9iamVjdD4pOiBTY2hlbWFPYmplY3Qge1xuICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IFNjaGVtYU9iamVjdFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdXG5cbiAgY29uc3QgY2F0Y2hhbGwgPSBnZXRDYXRjaGFsbCh6b2RSZWYpXG4gIGNvbnN0IHVua25vd25LZXlzID0gZ2V0VW5rbm93bktleXMoem9kUmVmKVxuXG4gIC8vIGBjYXRjaGFsbGAgb2J2aWF0ZXMgYHN0cmljdGAsIGBzdHJpcGAsIGFuZCBgcGFzc3Rocm91Z2hgXG4gIGlmIChcbiAgICAhKFxuICAgICAgY2F0Y2hhbGwgaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8XG4gICAgICAoY2F0Y2hhbGwgJiYgZ2V0VHlwZU5hbWUoY2F0Y2hhbGwpID09PSBcIlpvZE5ldmVyXCIpXG4gICAgKVxuICApIHtcbiAgICBpZiAoY2F0Y2hhbGwpIHtcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZ2VuZXJhdGVTY2hlbWEoY2F0Y2hhbGwsIHVzZU91dHB1dClcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwicGFzc3Rocm91Z2hcIikge1xuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gdHJ1ZVxuICB9IGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmljdFwiKSB7XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZVxuICB9XG5cbiAgLy8gU28gdGhhdCBgdW5kZWZpbmVkYCB2YWx1ZXMgZG9uJ3QgZW5kIHVwIGluIHRoZSBzY2hlbWEgYW5kIGJlIHdlaXJkXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID1cbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsID8geyBhZGRpdGlvbmFsUHJvcGVydGllcyB9IDoge31cblxuICBjb25zdCBvYmplY3RTaGFwZSA9IGdldFNoYXBlKHpvZFJlZiBhcyBab2RUeXBlQW55KSB8fCB7fVxuICBjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvYmplY3RTaGFwZSkuZmlsdGVyKChrZXkpID0+IHtcbiAgICBjb25zdCBpdGVtID0gb2JqZWN0U2hhcGVba2V5XVxuICAgIGNvbnN0IGl0ZW1UeXBlTmFtZSA9IGdldFR5cGVOYW1lKGl0ZW0pXG4gICAgcmV0dXJuIChcbiAgICAgICEoXG4gICAgICAgIGl0ZW0uaXNPcHRpb25hbCgpIHx8XG4gICAgICAgIGl0ZW0gaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQgfHxcbiAgICAgICAgaXRlbVR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIlxuICAgICAgKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiB6LlpvZE5ldmVyIHx8IGl0ZW1UeXBlTmFtZSA9PT0gXCJab2REZWZhdWx0XCIpXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IHJlcXVpcmVkID1cbiAgICByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHsgcmVxdWlyZWQ6IHJlcXVpcmVkUHJvcGVydGllcyB9IDoge31cblxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIHByb3BlcnRpZXM6IGl0ZXJhdGVab2RPYmplY3Qoe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBPcGVuQXBpWm9kQW55T2JqZWN0LFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICAgIGhpZGVEZWZpbml0aW9uczogZ2V0RXhjbHVkZWREZWZpbml0aW9uc0Zyb21TY2hlbWEoc2NoZW1hcyksXG4gICAgICB9KSxcbiAgICAgIC4uLnJlcXVpcmVkLFxuICAgICAgLi4uYWRkaXRpb25hbFByb3BlcnRpZXMsXG4gICAgICAuLi5oaWRlRGVmaW5pdGlvbnMsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVjb3JkKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlY29yZD4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB2YWx1ZVR5cGUgPSBnZXRSZWNvcmRWYWx1ZVR5cGUoem9kUmVmKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOlxuICAgICAgICB2YWx1ZVR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd25cbiAgICAgICAgICA/IHt9XG4gICAgICAgICAgOiB2YWx1ZVR5cGVcbiAgICAgICAgICA/IGdlbmVyYXRlU2NoZW1hKHZhbHVlVHlwZSwgdXNlT3V0cHV0KVxuICAgICAgICAgIDoge30sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCaWdJbnQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwiaW50ZWdlclwiIGFzIFNjaGVtYU9iamVjdFR5cGUsIGZvcm1hdDogXCJpbnQ2NFwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZEJvb2xlYW4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwiYm9vbGVhblwiIGFzIFNjaGVtYU9iamVjdFR5cGUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZSh7IHpvZFJlZiwgc2NoZW1hcyB9OiBQYXJzaW5nQXJnczx6LlpvZERhdGU+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7IHR5cGU6IFwic3RyaW5nXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGwoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kT3B0aW9uYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dCksXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGxhYmxlKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZE51bGxhYmxlPE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi51bndyYXAoKSwgdXNlT3V0cHV0KVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHsgLi4uc2NoZW1hLCB0eXBlOiBzY2hlbWEudHlwZSwgbnVsbGFibGU6IHRydWUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2REZWZhdWx0PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGlubmVyVHlwZSA9IGdldElubmVyVHlwZSh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgZGVmYXVsdDogZ2V0RGVmYXVsdFZhbHVlKHpvZFJlZiksXG4gICAgICAuLi4oaW5uZXJUeXBlID8gZ2VuZXJhdGVTY2hlbWEoaW5uZXJUeXBlLCB1c2VPdXRwdXQpIDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUFycmF5KHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEFycmF5PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnN0cmFpbnRzOiBTY2hlbWFPYmplY3QgPSB7fVxuICBjb25zdCB7IGV4YWN0TGVuZ3RoLCBtaW5MZW5ndGgsIG1heExlbmd0aCB9ID0gZ2V0QXJyYXlDb25zdHJhaW50cyh6b2RSZWYpXG5cbiAgaWYgKGV4YWN0TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IGV4YWN0TGVuZ3RoLnZhbHVlXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSBleGFjdExlbmd0aC52YWx1ZVxuICB9XG5cbiAgaWYgKG1pbkxlbmd0aCAhPSBudWxsKSBjb25zdHJhaW50cy5taW5JdGVtcyA9IG1pbkxlbmd0aC52YWx1ZVxuICBpZiAobWF4TGVuZ3RoICE9IG51bGwpIGNvbnN0cmFpbnRzLm1heEl0ZW1zID0gbWF4TGVuZ3RoLnZhbHVlXG5cbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICB0eXBlOiBcImFycmF5XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGl0ZW1zOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuZWxlbWVudCwgdXNlT3V0cHV0KSxcbiAgICAgIC4uLmNvbnN0cmFpbnRzLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWwoeyBzY2hlbWFzLCB6b2RSZWYgfTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHZhbHVlID0gZ2V0TGl0ZXJhbFZhbHVlKHpvZFJlZilcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICB0eXBlOiB0eXBlb2YgdmFsdWUgYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIixcbiAgICAgIGVudW06IFt2YWx1ZV0sXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRW51bSh7IHNjaGVtYXMsIHpvZFJlZiB9OiBQYXJzaW5nQXJnczxhbnk+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgdmFsdWVzID0gZ2V0RW51bVZhbHVlcyh6b2RSZWYpXG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICAgIHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgICAgLi4uc2NoZW1hc1xuICAgIClcbiAgfVxuICBjb25zdCB2YWx1ZXNBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IE9iamVjdC52YWx1ZXModmFsdWVzKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiB2YWx1ZXNBcnJheVswXSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIixcbiAgICAgIGVudW06IHZhbHVlc0FycmF5LFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUludGVyc2VjdGlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlQW55LCB6LlpvZFR5cGVBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IGdldEludGVyc2VjdGlvblBhcnRzKHpvZFJlZilcbiAgcmV0dXJuIG1lcmdlU2NoZW1hcyhcbiAgICB7XG4gICAgICBhbGxPZjogW1xuICAgICAgICBsZWZ0ID8gZ2VuZXJhdGVTY2hlbWEobGVmdCwgdXNlT3V0cHV0KSA6IHt9LFxuICAgICAgICByaWdodCA/IGdlbmVyYXRlU2NoZW1hKHJpZ2h0LCB1c2VPdXRwdXQpIDoge30sXG4gICAgICBdLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczxhbnk+KTogU2NoZW1hT2JqZWN0IHtcbiAgY29uc3QgY29udGVudHMgPSBnZXRVbmlvbk9wdGlvbnMoem9kUmVmKVxuICBpZiAoXG4gICAgY29udGVudHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+IHByZXYgJiYgZ2V0VHlwZU5hbWUoY29udGVudCkgPT09IFwiWm9kTGl0ZXJhbFwiLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKSB7XG4gICAgLy8gc3BlY2lhbCBjYXNlIHRvIHRyYW5zZm9ybSB1bmlvbnMgb2YgbGl0ZXJhbHMgaW50byBlbnVtc1xuICAgIGNvbnN0IGxpdGVyYWxzID0gY29udGVudHMgYXMgWm9kVHlwZUFueVtdXG4gICAgY29uc3QgdHlwZSA9IGxpdGVyYWxzLnJlZHVjZSgocHJldiwgY29udGVudCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRMaXRlcmFsVmFsdWUoY29udGVudClcbiAgICAgIHJldHVybiAhcHJldiB8fCBwcmV2ID09PSB0eXBlb2YgdmFsdWUgPyB0eXBlb2YgdmFsdWUgOiBudWxsXG4gICAgfSwgbnVsbCBhcyBudWxsIHwgc3RyaW5nKVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIsXG4gICAgICAgICAgZW51bTogbGl0ZXJhbHMubWFwKChsaXRlcmFsKSA9PiBnZXRMaXRlcmFsVmFsdWUobGl0ZXJhbCkpLFxuICAgICAgICB9LFxuICAgICAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgICAgIC4uLnNjaGVtYXNcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc051bGxhYmxlID0gY29udGVudHMuc29tZShcbiAgICAoY29udGVudCkgPT4gZ2V0VHlwZU5hbWUoY29udGVudCkgPT09IFwiWm9kTnVsbFwiXG4gIClcbiAgY29uc3Qgbm9uTnVsbENvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKFxuICAgIChjb250ZW50KSA9PiBnZXRUeXBlTmFtZShjb250ZW50KSAhPT0gXCJab2ROdWxsXCJcbiAgKVxuXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgb25lT2Y6IG5vbk51bGxDb250ZW50cy5tYXAoKHNjaGVtYSkgPT4gZ2VuZXJhdGVTY2hlbWEoc2NoZW1hLCB1c2VPdXRwdXQpKSxcbiAgICAgIC4uLihpc051bGxhYmxlID8geyBudWxsYWJsZTogdHJ1ZSB9IDoge30pLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSBnZXREaXNjcmltaW5hdG9yKHpvZFJlZilcbiAgY29uc3Qgb3B0aW9ucyA9IGdldFVuaW9uT3B0aW9ucyh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXMoXG4gICAge1xuICAgICAgLi4uKGRpc2NyaW1pbmF0b3JcbiAgICAgICAgPyB7IGRpc2NyaW1pbmF0b3I6IHsgcHJvcGVydHlOYW1lOiBkaXNjcmltaW5hdG9yIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICAgIG9uZU9mOiBvcHRpb25zLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU5ldmVyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROZXZlcj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2VTY2hlbWFzKHsgcmVhZE9ubHk6IHRydWUgfSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZUJyYW5kZWQoeyBzY2hlbWFzLCB6b2RSZWYgfTogUGFyc2luZ0FyZ3M8YW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHR5cGUgPSBnZXRCcmFuZGVkVHlwZSh6b2RSZWYpXG4gIHJldHVybiBtZXJnZVNjaGVtYXModHlwZSA/IGdlbmVyYXRlU2NoZW1hKHR5cGUpIDoge30sIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGNhdGNoQWxsUGFyc2VyKHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8Wm9kVHlwZUFueT4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2VTY2hlbWFzKHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VQaXBlbGluZSh7IHpvZFJlZiwgdXNlT3V0cHV0IH06IFBhcnNpbmdBcmdzPGFueT4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCB7IGluOiBpblNjaGVtYSwgb3V0OiBvdXRTY2hlbWEgfSA9IGdldFBpcGVsaW5lUGFydHMoem9kUmVmKVxuICBpZiAodXNlT3V0cHV0ICYmIG91dFNjaGVtYSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVNjaGVtYShvdXRTY2hlbWEsIHVzZU91dHB1dClcbiAgfVxuICByZXR1cm4gaW5TY2hlbWEgPyBnZW5lcmF0ZVNjaGVtYShpblNjaGVtYSwgdXNlT3V0cHV0KSA6IHt9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVhZG9ubHkoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPGFueT4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBpbm5lclR5cGUgPSBnZXRJbm5lclR5cGUoem9kUmVmKVxuICByZXR1cm4gbWVyZ2VTY2hlbWFzKFxuICAgIGlubmVyVHlwZSA/IGdlbmVyYXRlU2NoZW1hKGlubmVyVHlwZSwgdXNlT3V0cHV0KSA6IHt9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuY29uc3Qgd29ya2VyTWFwID0ge1xuICBab2RPYmplY3Q6IHBhcnNlT2JqZWN0LFxuICBab2RSZWNvcmQ6IHBhcnNlUmVjb3JkLFxuICBab2RTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICBab2ROdW1iZXI6IHBhcnNlTnVtYmVyLFxuICBab2RCaWdJbnQ6IHBhcnNlQmlnSW50LFxuICBab2RCb29sZWFuOiBwYXJzZUJvb2xlYW4sXG4gIFpvZERhdGU6IHBhcnNlRGF0ZSxcbiAgWm9kTnVsbDogcGFyc2VOdWxsLFxuICBab2RPcHRpb25hbDogcGFyc2VPcHRpb25hbCxcbiAgWm9kTnVsbGFibGU6IHBhcnNlTnVsbGFibGUsXG4gIFpvZERlZmF1bHQ6IHBhcnNlRGVmYXVsdCxcbiAgWm9kQXJyYXk6IHBhcnNlQXJyYXksXG4gIFpvZExpdGVyYWw6IHBhcnNlTGl0ZXJhbCxcbiAgWm9kRW51bTogcGFyc2VFbnVtLFxuICBab2ROYXRpdmVFbnVtOiBwYXJzZUVudW0sXG4gIFpvZFRyYW5zZm9ybWVyOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RFZmZlY3RzOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RJbnRlcnNlY3Rpb246IHBhcnNlSW50ZXJzZWN0aW9uLFxuICBab2RVbmlvbjogcGFyc2VVbmlvbixcbiAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbixcbiAgWm9kTmV2ZXI6IHBhcnNlTmV2ZXIsXG4gIFpvZEJyYW5kZWQ6IHBhcnNlQnJhbmRlZCxcbiAgLy8gVE9ETyBUcmFuc2Zvcm0gdGhlIHJlc3QgdG8gc2NoZW1hc1xuICBab2RVbmRlZmluZWQ6IGNhdGNoQWxsUGFyc2VyLFxuICAvLyBUT0RPOiBgcHJlZml4SXRlbXNgIGlzIGFsbG93ZWQgaW4gT3BlbkFQSSAzLjEgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHR1cGxlc1xuICBab2RUdXBsZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZE1hcDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEZ1bmN0aW9uOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTGF6eTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFByb21pc2U6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RBbnk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RVbmtub3duOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVm9pZDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFBpcGVsaW5lOiBwYXJzZVBpcGVsaW5lLFxuICBab2RSZWFkb25seTogcGFyc2VSZWFkb25seSxcbn1cbnR5cGUgV29ya2VyS2V5cyA9IGtleW9mIHR5cGVvZiB3b3JrZXJNYXBcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hKFxuICB6b2RSZWY6IE9wZW5BcGlab2RBbnksXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbWV0YU9wZW5BcGkgPSB7fSB9ID0gem9kUmVmXG4gIGNvbnN0IHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXSA9IFtcbiAgICAuLi4oQXJyYXkuaXNBcnJheShtZXRhT3BlbkFwaSkgPyBtZXRhT3BlbkFwaSA6IFttZXRhT3BlbkFwaV0pLFxuICBdXG4gIHRyeSB7XG4gICAgY29uc3QgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh6b2RSZWYpIGFzIFdvcmtlcktleXNcbiAgICBpZiAodHlwZU5hbWUgaW4gd29ya2VyTWFwKSB7XG4gICAgICByZXR1cm4gd29ya2VyTWFwW3R5cGVOYW1lXSh7XG4gICAgICAgIHpvZFJlZjogem9kUmVmIGFzIG5ldmVyLFxuICAgICAgICBzY2hlbWFzLFxuICAgICAgICB1c2VPdXRwdXQsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBjYXRjaEFsbFBhcnNlcih7IHpvZFJlZiwgc2NoZW1hcyB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfVxufVxuIiwgIi8qKlxuICogRnJvbnQtTWF0dGVyXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanhzb24vZnJvbnQtbWF0dGVyXG4gKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEphc29uIENhbXBiZWxsIChcIkF1dGhvclwiKVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgbG9hZCB9IGZyb20gXCJqcy15YW1sXCJcbmNvbnN0IG9wdGlvbmFsQnl0ZU9yZGVyTWFyayA9IFwiXFxcXHVmZWZmP1wiXG5jb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiID8gcHJvY2Vzcy5wbGF0Zm9ybSA6IFwiXCJcbmNvbnN0IHBhdHRlcm4gPVxuICBcIl4oXCIgK1xuICBvcHRpb25hbEJ5dGVPcmRlck1hcmsgK1xuICBcIig9IHlhbWwgPXwtLS0pXCIgK1xuICBcIiQoW1xcXFxzXFxcXFNdKj8pXCIgK1xuICBcIl4oPzpcXFxcMnxcXFxcLlxcXFwuXFxcXC4pXFxcXHMqXCIgK1xuICBcIiRcIiArXG4gIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJcXFxccj9cIiA6IFwiXCIpICtcbiAgXCIoPzpcXFxcbik/KVwiXG4vLyBOT1RFOiBJZiB0aGlzIHBhdHRlcm4gdXNlcyB0aGUgJ2cnIGZsYWcgdGhlIGByZWdleGAgdmFyaWFibGUgZGVmaW5pdGlvbiB3aWxsXG4vLyBuZWVkIHRvIGJlIG1vdmVkIGRvd24gaW50byB0aGUgZnVuY3Rpb25zIHRoYXQgdXNlIGl0LlxuY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwibVwiKVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9udE1hdHRlcihcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIG9wdGlvbnMgPSB7fVxuKTogeyBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgYm9keTogc3RyaW5nOyBib2R5QmVnaW46IG51bWJlciB9IHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0geyBhbGxvd1Vuc2FmZTogZmFsc2UgfVxuICBvcHRpb25zID1cbiAgICBvcHRpb25zIGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICA/IHsgLi4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfVxuICAgICAgOiBkZWZhdWx0T3B0aW9uc1xuICB2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoLyhcXHI/XFxuKS8pXG4gIGlmIChsaW5lc1swXSAmJiAvPSB5YW1sID18LS0tLy50ZXN0KGxpbmVzWzBdKSkge1xuICAgIHJldHVybiBwYXJzZShzdHJpbmcpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlTG9jYXRpb24obWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSwgYm9keTogc3RyaW5nKSB7XG4gIHZhciBsaW5lID0gMVxuICB2YXIgcG9zID0gYm9keS5pbmRleE9mKFwiXFxuXCIpXG4gIHZhciBvZmZzZXQgPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuXG4gIHdoaWxlIChwb3MgIT09IC0xKSB7XG4gICAgaWYgKHBvcyA+PSBvZmZzZXQpIHtcbiAgICAgIHJldHVybiBsaW5lXG4gICAgfVxuICAgIGxpbmUrK1xuICAgIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiLCBwb3MgKyAxKVxuICB9XG5cbiAgcmV0dXJuIGxpbmVcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc3RyaW5nOiBzdHJpbmcpOiB7XG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGJvZHk6IHN0cmluZ1xuICBib2R5QmVnaW46IG51bWJlclxufSB7XG4gIHZhciBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYm9keTogc3RyaW5nLFxuICAgICAgYm9keUJlZ2luOiAxLFxuICAgIH1cbiAgfVxuXG4gIHZhciB5YW1sID0gbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0ucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIilcbiAgdmFyIGF0dHJpYnV0ZXMgPSAobG9hZCh5YW1sKSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgdmFyIGJvZHkgPSBzdHJpbmcucmVwbGFjZShtYXRjaFswXSwgXCJcIilcbiAgdmFyIGxpbmUgPSBjb21wdXRlTG9jYXRpb24obWF0Y2gsIHN0cmluZylcblxuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgYm9keTogYm9keSxcbiAgICBib2R5QmVnaW46IGxpbmUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3RGcm9udE1hdHRlcihzdHJpbmc6IHN0cmluZykge1xuICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIlxuXG4gIHJldHVybiByZWdleC50ZXN0KHN0cmluZylcbn1cbiIsICJ0eXBlIFByZWZpeGVkT2JqZWN0PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIGB4LSR7c3RyaW5nICYgS31gXTogVFtLXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4T2JqZWN0S2V5c1dpdGhYPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvYmo6IFRcbik6IFByZWZpeGVkT2JqZWN0PFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbYHgtJHtrZXl9YCwgdmFsdWVdKVxuICApIGFzIFByZWZpeGVkT2JqZWN0PFQ+XG59XG4iLCAidHlwZSBTbmFrZVRvRGFzaDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBLIGV4dGVuZHMgc3RyaW5nID8gU25ha2VUb0Rhc2hTdHJpbmc8Sz4gOiBLXTogVFtLXVxufVxuXG50eXBlIFNuYWtlVG9EYXNoU3RyaW5nPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIFR9XyR7aW5mZXIgVX1gXG4gID8gYCR7VH0tJHtTbmFrZVRvRGFzaFN0cmluZzxVPn1gXG4gIDogU1xuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGlmeU9iamVjdEtleXM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogU25ha2VUb0Rhc2g8VD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXkucmVwbGFjZSgvXy9nLCBcIi1cIiksIHZhbHVlXSlcbiAgKSBhcyBTbmFrZVRvRGFzaDxUPlxufVxuIiwgIi8qKlxuICogWm9kIENvbXBhdGliaWxpdHkgTGF5ZXJcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb21wYXRpYmlsaXR5IGJldHdlZW4gWm9kIHYzIGFuZCBab2QgdjQuXG4gKiBJbiBab2QgdjQsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgY2hhbmdlZDpcbiAqIC0gYC5fZGVmYCBtb3ZlZCB0byBgLl96b2QuZGVmYFxuICogLSBgLl9kZWYudHlwZU5hbWVgIG1vdmVkIHRvIGAuX3pvZC5kZWYudHlwZWBcbiAqXG4gKiBUaGlzIG1vZHVsZSBhYnN0cmFjdHMgdGhlc2UgZGlmZmVyZW5jZXMgdG8gc3VwcG9ydCBib3RoIHZlcnNpb25zLlxuICovXG5cbmltcG9ydCB7IFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcblxuLyoqXG4gKiBDaGVjayBpZiB3ZSdyZSB1c2luZyBab2QgdjQrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1pvZFY0KHNjaGVtYTogWm9kVHlwZUFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gXCJfem9kXCIgaW4gc2NoZW1hXG59XG5cbi8qKlxuICogR2V0IHRoZSBpbnRlcm5hbCBkZWZpbml0aW9uIG9iamVjdCBmcm9tIGEgWm9kIHNjaGVtYS5cbiAqIFdvcmtzIHdpdGggYm90aCBab2QgdjMgKC5fZGVmKSBhbmQgWm9kIHY0ICguX3pvZC5kZWYpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWYoc2NoZW1hOiBab2RUeXBlQW55KTogYW55IHtcbiAgaWYgKFwiX3pvZFwiIGluIHNjaGVtYSkge1xuICAgIC8vIFpvZCB2NFxuICAgIHJldHVybiAoc2NoZW1hIGFzIGFueSkuX3pvZC5kZWZcbiAgfVxuICAvLyBab2QgdjNcbiAgcmV0dXJuIChzY2hlbWEgYXMgYW55KS5fZGVmXG59XG5cbi8qKlxuICogR2V0IHRoZSB0eXBlIG5hbWUgb2YgYSBab2Qgc2NoZW1hLlxuICogWm9kIHYzOiBzY2hlbWEuX2RlZi50eXBlTmFtZSAoZS5nLiwgXCJab2RTdHJpbmdcIilcbiAqIFpvZCB2NDogc2NoZW1hLl96b2QuZGVmLnR5cGUgKGUuZy4sIFwic3RyaW5nXCIpIC0gYnV0IHdlIG5vcm1hbGl6ZSB0byB2My1zdHlsZSBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZU5hbWUoc2NoZW1hOiBab2RUeXBlQW55KTogc3RyaW5nIHtcbiAgaWYgKFwiX3pvZFwiIGluIHNjaGVtYSkge1xuICAgIC8vIFpvZCB2NCAtIHRoZSB0eXBlIGlzIHN0b3JlZCBkaWZmZXJlbnRseVxuICAgIGNvbnN0IHpvZCA9IChzY2hlbWEgYXMgYW55KS5fem9kXG4gICAgLy8gSW4gWm9kIHY0LCB0aGUgY29uc3RydWN0b3IgbmFtZSBnaXZlcyB1cyB0aGUgdHlwZVxuICAgIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHNjaGVtYS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgaWYgKGNvbnN0cnVjdG9yTmFtZSAmJiBjb25zdHJ1Y3Rvck5hbWUuc3RhcnRzV2l0aChcIiRab2RcIikpIHtcbiAgICAgIC8vIFpvZCB2NCB1c2VzICRab2RTdHJpbmcsICRab2ROdW1iZXIsIGV0YyAtIGNvbnZlcnQgdG8gWm9kU3RyaW5nLCBab2ROdW1iZXJcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWUuc2xpY2UoMSlcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gZGVmLnR5cGUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHpvZC5kZWYgJiYgem9kLmRlZi50eXBlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplWm9kVjRUeXBlKHpvZC5kZWYudHlwZSlcbiAgICB9XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZSB8fCBcIlVua25vd25cIlxuICB9XG4gIC8vIFpvZCB2M1xuICByZXR1cm4gKHNjaGVtYSBhcyBhbnkpLl9kZWY/LnR5cGVOYW1lIHx8IFwiVW5rbm93blwiXG59XG5cbi8qKlxuICogTm9ybWFsaXplIFpvZCB2NCB0eXBlIG5hbWVzIHRvIHYzLXN0eWxlIG5hbWVzIGZvciBjb25zaXN0ZW5jeVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVab2RWNFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHlwZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBzdHJpbmc6IFwiWm9kU3RyaW5nXCIsXG4gICAgbnVtYmVyOiBcIlpvZE51bWJlclwiLFxuICAgIGJpZ2ludDogXCJab2RCaWdJbnRcIixcbiAgICBib29sZWFuOiBcIlpvZEJvb2xlYW5cIixcbiAgICBkYXRlOiBcIlpvZERhdGVcIixcbiAgICB1bmRlZmluZWQ6IFwiWm9kVW5kZWZpbmVkXCIsXG4gICAgbnVsbDogXCJab2ROdWxsXCIsXG4gICAgdm9pZDogXCJab2RWb2lkXCIsXG4gICAgYW55OiBcIlpvZEFueVwiLFxuICAgIHVua25vd246IFwiWm9kVW5rbm93blwiLFxuICAgIG5ldmVyOiBcIlpvZE5ldmVyXCIsXG4gICAgbGl0ZXJhbDogXCJab2RMaXRlcmFsXCIsXG4gICAgZW51bTogXCJab2RFbnVtXCIsXG4gICAgbmF0aXZlRW51bTogXCJab2ROYXRpdmVFbnVtXCIsXG4gICAgb2JqZWN0OiBcIlpvZE9iamVjdFwiLFxuICAgIGFycmF5OiBcIlpvZEFycmF5XCIsXG4gICAgdHVwbGU6IFwiWm9kVHVwbGVcIixcbiAgICB1bmlvbjogXCJab2RVbmlvblwiLFxuICAgIGRpc2NyaW1pbmF0ZWRVbmlvbjogXCJab2REaXNjcmltaW5hdGVkVW5pb25cIixcbiAgICBpbnRlcnNlY3Rpb246IFwiWm9kSW50ZXJzZWN0aW9uXCIsXG4gICAgcmVjb3JkOiBcIlpvZFJlY29yZFwiLFxuICAgIG1hcDogXCJab2RNYXBcIixcbiAgICBzZXQ6IFwiWm9kU2V0XCIsXG4gICAgZnVuY3Rpb246IFwiWm9kRnVuY3Rpb25cIixcbiAgICBsYXp5OiBcIlpvZExhenlcIixcbiAgICBwcm9taXNlOiBcIlpvZFByb21pc2VcIixcbiAgICBvcHRpb25hbDogXCJab2RPcHRpb25hbFwiLFxuICAgIG51bGxhYmxlOiBcIlpvZE51bGxhYmxlXCIsXG4gICAgZGVmYXVsdDogXCJab2REZWZhdWx0XCIsXG4gICAgZWZmZWN0czogXCJab2RFZmZlY3RzXCIsXG4gICAgdHJhbnNmb3JtZXI6IFwiWm9kVHJhbnNmb3JtZXJcIixcbiAgICBicmFuZGVkOiBcIlpvZEJyYW5kZWRcIixcbiAgICBwaXBlbGluZTogXCJab2RQaXBlbGluZVwiLFxuICAgIHJlYWRvbmx5OiBcIlpvZFJlYWRvbmx5XCIsXG4gIH1cbiAgcmV0dXJuIHR5cGVNYXBbdHlwZV0gfHwgYFpvZCR7dHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR5cGUuc2xpY2UoMSl9YFxufVxuXG4vKipcbiAqIEdldCB0aGUgaW5uZXIgc2NoZW1hIGZyb20gYSBab2RFZmZlY3RzL1pvZFRyYW5zZm9ybWVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3RzU2NoZW1hKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy5zY2hlbWFcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGlubmVyIHR5cGUgZnJvbSBab2RPcHRpb25hbCwgWm9kTnVsbGFibGUsIFpvZERlZmF1bHQsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElubmVyVHlwZShzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uaW5uZXJUeXBlXG59XG5cbi8qKlxuICogR2V0IHRoZSBzaGFwZSBvZiBhIFpvZE9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcGUoXG4gIHNjaGVtYTogWm9kVHlwZUFueVxuKTogUmVjb3JkPHN0cmluZywgWm9kVHlwZUFueT4gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICBpZiAodHlwZW9mIGRlZj8uc2hhcGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBkZWYuc2hhcGUoKVxuICB9XG4gIHJldHVybiBkZWY/LnNoYXBlXG59XG5cbi8qKlxuICogR2V0IHRoZSBjaGVja3MgYXJyYXkgZnJvbSBhIHN0cmluZy9udW1iZXIgc2NoZW1hXG4gKiBJbiBab2QgNCwgY2hlY2tzIGFyZSBvYmplY3RzIHdpdGggX3pvZC5kZWYgY29udGFpbmluZyB0aGUgY2hlY2sgZGV0YWlsc1xuICogV2Ugbm9ybWFsaXplIHRoZW0gdG8gaGF2ZSB0aGUgcHJvcGVydGllcyBkaXJlY3RseSBhY2Nlc3NpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGVja3Moc2NoZW1hOiBab2RUeXBlQW55KTogYW55W10ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICBjb25zdCBjaGVja3MgPSBkZWY/LmNoZWNrcyB8fCBbXVxuXG4gIC8vIE5vcm1hbGl6ZSBab2QgNCBjaGVjayBvYmplY3RzXG4gIHJldHVybiBjaGVja3MubWFwKChjaGVjazogYW55KSA9PiB7XG4gICAgaWYgKGNoZWNrLl96b2Q/LmRlZikge1xuICAgICAgLy8gWm9kIDQ6IGZsYXR0ZW4gX3pvZC5kZWYgcHJvcGVydGllcyBvbnRvIHRoZSBjaGVjayBvYmplY3RcbiAgICAgIHJldHVybiB7IC4uLmNoZWNrLl96b2QuZGVmIH1cbiAgICB9XG4gICAgLy8gWm9kIDM6IGFscmVhZHkgaGFzIHByb3BlcnRpZXMgZGlyZWN0bHlcbiAgICByZXR1cm4gY2hlY2tcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgdmFsdWVzIGZyb20gYSBab2RFbnVtIG9yIFpvZE5hdGl2ZUVudW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIHNjaGVtYTogWm9kVHlwZUFueVxuKTogYW55W10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgLy8gWm9kIDQ6IHVzZSBzY2hlbWEub3B0aW9ucyAoYXJyYXkpIG9yIHNjaGVtYS5lbnVtIChvYmplY3QpXG4gIGlmIChcIm9wdGlvbnNcIiBpbiBzY2hlbWEgJiYgQXJyYXkuaXNBcnJheSgoc2NoZW1hIGFzIGFueSkub3B0aW9ucykpIHtcbiAgICByZXR1cm4gKHNjaGVtYSBhcyBhbnkpLm9wdGlvbnNcbiAgfVxuICBpZiAoXCJlbnVtXCIgaW4gc2NoZW1hICYmIChzY2hlbWEgYXMgYW55KS5lbnVtKSB7XG4gICAgcmV0dXJuIChzY2hlbWEgYXMgYW55KS5lbnVtXG4gIH1cbiAgLy8gWm9kIDMgZmFsbGJhY2tcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgLy8gWm9kIDQgYWxzbyBoYXMgZW50cmllcyBpbiBkZWZcbiAgcmV0dXJuIGRlZj8udmFsdWVzIHx8IGRlZj8uZW50cmllc1xufVxuXG4vKipcbiAqIEdldCB0aGUgbGl0ZXJhbCB2YWx1ZSBmcm9tIGEgWm9kTGl0ZXJhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGl0ZXJhbFZhbHVlKHNjaGVtYTogWm9kVHlwZUFueSk6IGFueSB7XG4gIC8vIFpvZCA0OiB0cnkgc2NoZW1hLnZhbHVlIGZpcnN0IChwdWJsaWMgQVBJKVxuICBpZiAoXCJ2YWx1ZVwiIGluIHNjaGVtYSkge1xuICAgIHJldHVybiAoc2NoZW1hIGFzIGFueSkudmFsdWVcbiAgfVxuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICAvLyBab2QgNDogdmFsdWVzIGlzIGFuIGFycmF5XG4gIGlmIChBcnJheS5pc0FycmF5KGRlZj8udmFsdWVzKSkge1xuICAgIHJldHVybiBkZWYudmFsdWVzWzBdXG4gIH1cbiAgLy8gWm9kIDM6IHZhbHVlIGlzIGEgc2luZ2xlIHZhbHVlXG4gIHJldHVybiBkZWY/LnZhbHVlXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZyb20gYSBab2REZWZhdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hOiBab2RUeXBlQW55KTogYW55IHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgaWYgKHR5cGVvZiBkZWY/LmRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGRlZi5kZWZhdWx0VmFsdWUoKVxuICB9XG4gIHJldHVybiBkZWY/LmRlZmF1bHRWYWx1ZVxufVxuXG4vKipcbiAqIEdldCBhcnJheSBjb25zdHJhaW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlDb25zdHJhaW50cyhzY2hlbWE6IFpvZFR5cGVBbnkpOiB7XG4gIGV4YWN0TGVuZ3RoPzogeyB2YWx1ZTogbnVtYmVyIH1cbiAgbWluTGVuZ3RoPzogeyB2YWx1ZTogbnVtYmVyIH1cbiAgbWF4TGVuZ3RoPzogeyB2YWx1ZTogbnVtYmVyIH1cbn0ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4ge1xuICAgIGV4YWN0TGVuZ3RoOiBkZWY/LmV4YWN0TGVuZ3RoLFxuICAgIG1pbkxlbmd0aDogZGVmPy5taW5MZW5ndGgsXG4gICAgbWF4TGVuZ3RoOiBkZWY/Lm1heExlbmd0aCxcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgZWxlbWVudCB0eXBlIGZyb20gYSBab2RBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlUeXBlKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy50eXBlXG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSB0eXBlIGZyb20gYSBab2RSZWNvcmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY29yZFZhbHVlVHlwZShzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8udmFsdWVUeXBlXG59XG5cbi8qKlxuICogR2V0IGNhdGNoYWxsIGZyb20gWm9kT2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXRjaGFsbChzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uY2F0Y2hhbGxcbn1cblxuLyoqXG4gKiBHZXQgdW5rbm93bktleXMgZnJvbSBab2RPYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVua25vd25LZXlzKFxuICBzY2hlbWE6IFpvZFR5cGVBbnlcbik6IFwicGFzc3Rocm91Z2hcIiB8IFwic3RyaWN0XCIgfCBcInN0cmlwXCIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy51bmtub3duS2V5c1xufVxuXG4vKipcbiAqIEdldCBsZWZ0L3JpZ2h0IGZyb20gWm9kSW50ZXJzZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25QYXJ0cyhzY2hlbWE6IFpvZFR5cGVBbnkpOiB7XG4gIGxlZnQ/OiBab2RUeXBlQW55XG4gIHJpZ2h0PzogWm9kVHlwZUFueVxufSB7XG4gIGNvbnN0IGRlZiA9IGdldERlZihzY2hlbWEpXG4gIHJldHVybiB7XG4gICAgbGVmdDogZGVmPy5sZWZ0LFxuICAgIHJpZ2h0OiBkZWY/LnJpZ2h0LFxuICB9XG59XG5cbi8qKlxuICogR2V0IG9wdGlvbnMgZnJvbSBab2RVbmlvbiBvciBab2REaXNjcmltaW5hdGVkVW5pb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaW9uT3B0aW9ucyhzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55W10ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICBjb25zdCBvcHRpb25zID0gZGVmPy5vcHRpb25zXG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ob3B0aW9ucy52YWx1ZXMoKSlcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cbiAgcmV0dXJuIFtdXG59XG5cbi8qKlxuICogR2V0IGRpc2NyaW1pbmF0b3IgZnJvbSBab2REaXNjcmltaW5hdGVkVW5pb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc2NyaW1pbmF0b3Ioc2NoZW1hOiBab2RUeXBlQW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uZGlzY3JpbWluYXRvclxufVxuXG4vKipcbiAqIEdldCBlZmZlY3QgZnJvbSBab2RFZmZlY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3Qoc2NoZW1hOiBab2RUeXBlQW55KTogYW55IHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8uZWZmZWN0XG59XG5cbi8qKlxuICogR2V0IHBpcGVsaW5lIGluL291dCBmcm9tIFpvZFBpcGVsaW5lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQaXBlbGluZVBhcnRzKHNjaGVtYTogWm9kVHlwZUFueSk6IHtcbiAgaW4/OiBab2RUeXBlQW55XG4gIG91dD86IFpvZFR5cGVBbnlcbn0ge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4ge1xuICAgIGluOiBkZWY/LmluLFxuICAgIG91dDogZGVmPy5vdXQsXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJyYW5kZWQgdHlwZSBmcm9tIFpvZEJyYW5kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyYW5kZWRUeXBlKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy50eXBlXG59XG5cbi8qKlxuICogR2V0IHR1cGxlIGl0ZW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUdXBsZUl0ZW1zKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnlbXSB7XG4gIGNvbnN0IGRlZiA9IGdldERlZihzY2hlbWEpXG4gIHJldHVybiBkZWY/Lml0ZW1zIHx8IFtdXG59XG5cbi8qKlxuICogR2V0IGZ1bmN0aW9uIGFyZ3MgYW5kIHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uUGFydHMoc2NoZW1hOiBab2RUeXBlQW55KToge1xuICBhcmdzPzogWm9kVHlwZUFueVxuICByZXR1cm5zPzogWm9kVHlwZUFueVxufSB7XG4gIGNvbnN0IGRlZiA9IGdldERlZihzY2hlbWEpXG4gIHJldHVybiB7XG4gICAgYXJnczogZGVmPy5hcmdzLFxuICAgIHJldHVybnM6IGRlZj8ucmV0dXJucyxcbiAgfVxufVxuXG4vKipcbiAqIEdldCBtYXAga2V5IGFuZCB2YWx1ZSB0eXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwVHlwZXMoc2NoZW1hOiBab2RUeXBlQW55KToge1xuICBrZXlUeXBlPzogWm9kVHlwZUFueVxuICB2YWx1ZVR5cGU/OiBab2RUeXBlQW55XG59IHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIHtcbiAgICBrZXlUeXBlOiBkZWY/LmtleVR5cGUsXG4gICAgdmFsdWVUeXBlOiBkZWY/LnZhbHVlVHlwZSxcbiAgfVxufVxuXG4vKipcbiAqIEdldCBzZXQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0VmFsdWVUeXBlKHNjaGVtYTogWm9kVHlwZUFueSk6IFpvZFR5cGVBbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy52YWx1ZVR5cGVcbn1cblxuLyoqXG4gKiBHZXQgcHJvbWlzZSB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9taXNlVHlwZShzY2hlbWE6IFpvZFR5cGVBbnkpOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmID0gZ2V0RGVmKHNjaGVtYSlcbiAgcmV0dXJuIGRlZj8udHlwZVxufVxuXG4vKipcbiAqIEdldCB0aGUgY3VzdG9tIHR5cGUgZ2V0dGVyIGlmIGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VzdG9tVHlwZUdldHRlcihzY2hlbWE6IFpvZFR5cGVBbnkpOiBhbnkge1xuICBjb25zdCBkZWYgPSBnZXREZWYoc2NoZW1hKVxuICByZXR1cm4gZGVmPy5nZXRUeXBlXG59XG4iLCAiaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmZ1bmN0aW9uIGZpbmRLZXlJbk9iaihvYmo6IGFueSwgdmFsdWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmVzdWx0S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBfLmZvck93bihvYmosICh2LCBrKSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodikgJiYgXy5pc01hdGNoKHYsIHZhbHVlKSkge1xuICAgICAgcmVzdWx0S2V5ID0ga1xuICAgICAgLy8gU3RvcCB0aGUgaXRlcmF0aW9uXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0pXG4gIHJldHVybiByZXN1bHRLZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShvYmoxLCAocmVzdWx0LCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0tleSA9IGZpbmRLZXlJbk9iaihvYmoyLCB2YWx1ZSlcbiAgICAgIGlmIChtYXRjaGluZ0tleSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHtcbiAgICAgICAgICAkcmVmOiBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHttYXRjaGluZ0tleX1gLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyh2YWx1ZSwgb2JqMilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBSb3V0ZVNwZWMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cbiAgaWYgKGxhc3RQYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIGxhc3RQYXJ0LmVuZHNXaXRoKFwiXVwiKSkge1xuICAgIC8vIENvbnZlcnQgW3BhcmFtXSB0byBieV9wYXJhbVxuICAgIGNvbnN0IHBhcmFtID0gbGFzdFBhcnQuc2xpY2UoMSwgLTEpXG4gICAgcmV0dXJuIGBieV8ke3BhcmFtfWBcbiAgfVxuXG4gIHJldHVybiBsYXN0UGFydFxufVxuXG4vLyBmZXJuIGRvY3M6IGh0dHBzOi8vYnVpbGR3aXRoZmVybi5jb20vZG9jcy9zcGVjL2V4dGVuc2lvbnNcbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtHcm91cE5hbWUocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKVxuICByZXR1cm4gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSlcbn1cblxuZnVuY3Rpb24gZ2V0RmVyblNka01ldGFkYXRhKFxuICBwYXRoOiBzdHJpbmcsXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbik6XG4gIHwge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWVcbiAgICB9XG4gIHwge1xuICAgICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogc3RyaW5nW11cbiAgICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiBzdHJpbmdcbiAgICB9IHtcbiAgaWYgKHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIikubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwieC1mZXJuLWlnbm9yZVwiOiB0cnVlLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJ4LWZlcm4tc2RrLWdyb3VwLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoKSxcbiAgICBcIngtZmVybi1zZGstbWV0aG9kLW5hbWVcIjogdHJhbnNmb3JtUGF0aFRvRmVyblNka01ldGhvZE5hbWUocGF0aCksXG4gICAgLi4uKHNka1JldHVyblZhbHVlXG4gICAgICA/IHtcbiAgICAgICAgICBcIngtZmVybi1zZGstcmV0dXJuLXZhbHVlXCI6IHNka1JldHVyblZhbHVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgbWV0aG9kcyxcbiAgcGF0aCxcbiAgc2RrUmV0dXJuVmFsdWUsXG59OiB7XG4gIG1ldGhvZHM6IFJvdXRlU3BlY1tcIm1ldGhvZHNcIl1cbiAgcGF0aDogc3RyaW5nXG4gIHNka1JldHVyblZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgZmVyblNka01ldGFkYXRhID0gZ2V0RmVyblNka01ldGFkYXRhKHBhdGgsIHNka1JldHVyblZhbHVlKVxuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW21ldGhvZHNbMF1dOiBmZXJuU2RrTWV0YWRhdGEsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWFwcGVkTWV0aG9kcyA9IHt9XG5cbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0gZmVyblNka01ldGFkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcHBlZE1ldGhvZHNbbWV0aG9kXSA9IHtcbiAgICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXBwZWRNZXRob2RzXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHsgcGFyc2VSb3V0ZXNJblBhY2thZ2UgfSBmcm9tIFwiLi4vbGliL3BhcnNlLXJvdXRlcy1pbi1wYWNrYWdlXCJcbmltcG9ydCB7IHpvZFRvVHMsIHByaW50Tm9kZSB9IGZyb20gXCIuLi9saWIvem9kLXRvLXRzXCJcbmltcG9ydCBwcmV0dGllciBmcm9tIFwicHJldHRpZXJcIlxuaW1wb3J0IHsgeiwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHtcbiAgZ2V0VHlwZU5hbWUsXG4gIGdldEVmZmVjdHNTY2hlbWEsXG4gIGdldElubmVyVHlwZSxcbiAgZ2V0U2hhcGUsXG59IGZyb20gXCIuLi8uLi9saWIvem9kLWNvbXBhdFwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHJvdXRlcyB0aGF0IGhhdmUgYGV4Y2x1ZGVGcm9tT3BlbkFwaWAgc2V0IHRvIHRydWUgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqIFNldCB0aGlzIHRvIHRydWUgdG8gaW5jbHVkZSB0aGVtLlxuICAgKi9cbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91dGVUeXBlcyA9IGFzeW5jIChvcHRzOiBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzKSA9PiB7XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZSA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgY29uc3Qgc29ydGVkUm91dGVzID0gQXJyYXkuZnJvbShmaWxlcGF0aFRvUm91dGUuZW50cmllcygpKS5zb3J0KChhLCBiKSA9PlxuICAgIGFbMV0ucm91dGUubG9jYWxlQ29tcGFyZShiWzFdLnJvdXRlKVxuICApXG4gIGNvbnN0IGZpbHRlcmVkUm91dGVzID0gc29ydGVkUm91dGVzLmZpbHRlcihcbiAgICAoW18sIHsgcm91dGUgfV0pID0+ICFvcHRzLmZpbHRlclJvdXRlcyB8fCBvcHRzLmZpbHRlclJvdXRlcyhyb3V0ZSlcbiAgKVxuXG4gIC8vIFRPRE8gd2hlbiBsZXNzIGxhenksIHVzZSB0cy1tb3JwaCBmb3IgYmV0dGVyIGdlbmVyYXRpb25cbiAgY29uc3Qgcm91dGVEZWZzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3QgW18sIHsgcm91dGUsIHJvdXRlU3BlYywgc2V0dXBQYXJhbXMgfV0gb2YgZmlsdGVyZWRSb3V0ZXMpIHtcbiAgICBjb25zdCBtYXhEdXJhdGlvbiA9IHJvdXRlU3BlYy5tYXhEdXJhdGlvbiA/PyBzZXR1cFBhcmFtcy5tYXhEdXJhdGlvblxuICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IE9iamVjdC5rZXlzKFxuICAgICAgcm91dGVTcGVjLnF1ZXJ5UGFyYW1zID8gZ2V0U2hhcGUocm91dGVTcGVjLnF1ZXJ5UGFyYW1zKSA/PyB7fSA6IHt9XG4gICAgKVxuICAgIGNvbnN0IHBhdGhQYXJhbWV0ZXJzID0gcXVlcnlLZXlzLmZpbHRlcigoa2V5KSA9PiByb3V0ZS5pbmNsdWRlcyhgWyR7a2V5fV1gKSlcblxuICAgIC8vIHF1ZXJ5UGFyYW1zIG1pZ2h0IGJlIGEgWm9kRWZmZWN0cyBvciBab2RPcHRpb25hbCBpbiBzb21lIGNhc2VzXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBab2RUeXBlQW55IHwgdW5kZWZpbmVkID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgd2hpbGUgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKHF1ZXJ5UGFyYW1zKVxuICAgICAgaWYgKHR5cGVOYW1lID09PSBcIlpvZEVmZmVjdHNcIikge1xuICAgICAgICBjb25zdCBpbm5lciA9IGdldEVmZmVjdHNTY2hlbWEocXVlcnlQYXJhbXMpXG4gICAgICAgIGlmIChpbm5lcikge1xuICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gaW5uZXJcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVOYW1lID09PSBcIlpvZE9wdGlvbmFsXCIpIHtcbiAgICAgICAgY29uc3QgaW5uZXIgPSBnZXRJbm5lclR5cGUocXVlcnlQYXJhbXMpXG4gICAgICAgIGlmIChpbm5lcikge1xuICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gaW5uZXJcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHF1ZXJ5UGFyYW1zICYmXG4gICAgICBcIm9taXRcIiBpbiBxdWVyeVBhcmFtcyAmJlxuICAgICAgdHlwZW9mIChxdWVyeVBhcmFtcyBhcyBhbnkpLm9taXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgYW55KS5vbWl0KFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMocGF0aFBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gW3BhcmFtLCB0cnVlXSkpXG4gICAgICApXG4gICAgfVxuXG4gICAgcm91dGVEZWZzLnB1c2goXG4gICAgICBgXG5cIiR7cm91dGV9XCI6IHtcbiAgcm91dGU6IFwiJHtyb3V0ZX1cIixcbiAgbWV0aG9kOiAke3JvdXRlU3BlYy5tZXRob2RzLm1hcCgobSkgPT4gYFwiJHttfVwiYCkuam9pbihcIiB8IFwiKX0sXG4gIHF1ZXJ5UGFyYW1zOiAke3F1ZXJ5UGFyYW1zID8gcHJpbnROb2RlKHpvZFRvVHMocXVlcnlQYXJhbXMpLm5vZGUpIDogXCJ7fVwifSxcbiAganNvbkJvZHk6ICR7XG4gICAgcm91dGVTcGVjLmpzb25Cb2R5ID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmpzb25Cb2R5KS5ub2RlKSA6IFwie31cIlxuICB9LFxuICBjb21tb25QYXJhbXM6ICR7XG4gICAgcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuICAgICAgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuY29tbW9uUGFyYW1zKS5ub2RlKVxuICAgICAgOiBcInt9XCJcbiAgfSxcbiAgZm9ybURhdGE6ICR7XG4gICAgcm91dGVTcGVjLmZvcm1EYXRhID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmZvcm1EYXRhKS5ub2RlKSA6IFwie31cIlxuICB9LFxuICBqc29uUmVzcG9uc2U6ICR7XG4gICAgcm91dGVTcGVjLmpzb25SZXNwb25zZVxuICAgICAgPyBwcmludE5vZGUoXG4gICAgICAgICAgem9kVG9UcyhcbiAgICAgICAgICAgIHNldHVwUGFyYW1zLmFkZE9rU3RhdHVzICYmXG4gICAgICAgICAgICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2UgaW5zdGFuY2VvZiB6LlpvZE9iamVjdFxuICAgICAgICAgICAgICA/IHJvdXRlU3BlYy5qc29uUmVzcG9uc2UuZXh0ZW5kKHsgb2s6IHouYm9vbGVhbigpIH0pXG4gICAgICAgICAgICAgIDogcm91dGVTcGVjLmpzb25SZXNwb25zZVxuICAgICAgICAgICkubm9kZVxuICAgICAgICApXG4gICAgICA6IFwie31cIlxuICB9LFxuICBtYXhEdXJhdGlvbjogJHttYXhEdXJhdGlvbiA/PyBcInVuZGVmaW5lZFwifVxufWAudHJpbSgpXG4gICAgKVxuICB9XG4gIGNvbnN0IHJvdXRlRGVmU3RyID0gcm91dGVEZWZzLmpvaW4oXCIsXFxuXCIpXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHByZXR0aWVyLmZvcm1hdChcbiAgICBgZXhwb3J0IHR5cGUgUm91dGVzID0ge1xuJHtyb3V0ZURlZlN0cn1cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXNwb25zZTxQYXRoIGV4dGVuZHMga2V5b2YgUm91dGVzPiA9XG4gIFJvdXRlc1tQYXRoXVtcImpzb25SZXNwb25zZVwiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RCb2R5PFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvbkJvZHlcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cblxuZXhwb3J0IHR5cGUgUm91dGVSZXF1ZXN0UGFyYW1zPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wicXVlcnlQYXJhbXNcIl0gJiBSb3V0ZXNbUGF0aF1bXCJjb21tb25QYXJhbXNcIl1cbmAudHJpbSgpLFxuICAgIHsgc2VtaTogZmFsc2UsIHBhcnNlcjogXCJ0eXBlc2NyaXB0XCIgfVxuICApXG5cbiAgaWYgKG9wdHMub3V0cHV0RmlsZSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvcHRzLm91dHB1dEZpbGUsIG91dHB1dClcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICIvLyBAdHMtbm9jaGVjayAtIFZlbmRvcmVkIGNvZGUgd2l0aCBab2QgMy80IHR5cGUgaW5jb21wYXRpYmlsaXRpZXMgKHJ1bnRpbWUgd29ya3MgY29ycmVjdGx5KVxuLyoqXG4gKiBab2QgVG8gVFNcbiAqXG4gKiBWZW5kb3JlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYWNoaW5yYWphL3pvZC10by10c1xuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFNhY2hpbiBSYWphXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuaW1wb3J0IHsgWm9kVHlwZSwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5pbXBvcnQge1xuICBnZXRUeXBlTmFtZSxcbiAgZ2V0RGVmLFxuICBnZXRMaXRlcmFsVmFsdWUsXG4gIGdldFNoYXBlLFxuICBnZXRBcnJheVR5cGUsXG4gIGdldEVudW1WYWx1ZXMsXG4gIGdldFVuaW9uT3B0aW9ucyxcbiAgZ2V0RWZmZWN0c1NjaGVtYSxcbiAgZ2V0SW5uZXJUeXBlLFxuICBnZXRUdXBsZUl0ZW1zLFxuICBnZXRSZWNvcmRWYWx1ZVR5cGUsXG4gIGdldE1hcFR5cGVzLFxuICBnZXRTZXRWYWx1ZVR5cGUsXG4gIGdldEludGVyc2VjdGlvblBhcnRzLFxuICBnZXRQcm9taXNlVHlwZSxcbiAgZ2V0RnVuY3Rpb25QYXJ0cyxcbiAgZ2V0Q3VzdG9tVHlwZUdldHRlcixcbn0gZnJvbSBcIi4uLy4uL2xpYi96b2QtY29tcGF0XCJcblxuY29uc3QgeyBmYWN0b3J5OiBmLCBTeW50YXhLaW5kLCBTY3JpcHRLaW5kLCBTY3JpcHRUYXJnZXQsIEVtaXRIaW50IH0gPSB0c1xuXG5jb25zdCBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuKSA9PiB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoaWRlbnRpZmllcikpIHtcbiAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShpZGVudGlmaWVyKVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJcbn1cblxuY29uc3QgY3JlYXRlVHlwZVJlZmVyZW5jZUZyb21TdHJpbmcgPSAoaWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKSlcblxuY29uc3QgY3JlYXRlVW5rbm93bktleXdvcmROb2RlID0gKCkgPT5cbiAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Vbmtub3duS2V5d29yZClcblxuZXhwb3J0IGNvbnN0IHByaW50Tm9kZSA9IChcbiAgbm9kZTogdHMuTm9kZSxcbiAgcHJpbnRlck9wdGlvbnM/OiB0cy5QcmludGVyT3B0aW9uc1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgXCJwcmludC50c1wiLFxuICAgIFwiXCIsXG4gICAgU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICBmYWxzZSxcbiAgICBTY3JpcHRLaW5kLlRTXG4gIClcbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIocHJpbnRlck9wdGlvbnMpXG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZShFbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSlcbn1cblxuY29uc3QgaWRlbnRpZmllclJFID0gL15bJEEtWl9hLXpdW1xcdyRdKiQvXG5cbmNvbnN0IGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwgPSAoc3RyaW5nXzogc3RyaW5nKSA9PiB7XG4gIGlmIChpZGVudGlmaWVyUkUudGVzdChzdHJpbmdfKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZUlkZW50aWZpZXIoc3RyaW5nXylcbiAgfVxuXG4gIHJldHVybiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwoc3RyaW5nXylcbn1cblxuY29uc3QgYWRkSnNEb2NDb21tZW50ID0gKG5vZGU6IHRzLk5vZGUsIHRleHQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB7IGRlc2NyaXB0aW9uLCBkZXByZWNhdGVkIH0gPSBwYXJzZURlc2NyaXB0aW9uKHRleHQpXG5cbiAgbGV0IGNvbW1lbnQgPSBgKiAke2Rlc2NyaXB0aW9ufWBcbiAgaWYgKGRlcHJlY2F0ZWQpIHtcbiAgICBjb21tZW50ICs9IGBcXG4gKiBAZGVwcmVjYXRlZCAke1xuICAgICAgdHlwZW9mIGRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIgPyBkZXByZWNhdGVkIDogXCJcIlxuICAgIH1gXG4gIH0gZWxzZSB7XG4gICAgY29tbWVudCArPSBgIGBcbiAgfVxuXG4gIHRzLmFkZFN5bnRoZXRpY0xlYWRpbmdDb21tZW50KFxuICAgIG5vZGUsXG4gICAgU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhLFxuICAgIGNvbW1lbnQsXG4gICAgdHJ1ZVxuICApXG59XG5cbnR5cGUgUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgZGVwcmVjYXRlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQYXJzZWREZXNjcmlwdGlvbiB7XG4gIGlmICghZGVzY3JpcHRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIH1cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KGRlc2NyaXB0aW9uKVxuICBpZiAoIXRlc3RGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pKSByZXR1cm4geyBkZXNjcmlwdGlvbiB9XG4gIGNvbnN0IHsgYXR0cmlidXRlcywgYm9keSB9ID0gcGFyc2VGcm9udE1hdHRlcih0cmltbWVkRGVzY3JpcHRpb24pXG4gIGNvbnN0IG91dHB1dDogUGFyc2VkRGVzY3JpcHRpb24gPSB7XG4gICAgZGVzY3JpcHRpb246IGJvZHkudHJpbSgpLFxuICB9XG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgb3V0cHV0LmRlcHJlY2F0ZWQgPVxuICAgICAgICAgIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZC5sZW5ndGggPiAwID8gYXR0cmlidXRlcy5kZXByZWNhdGVkIDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkZXNjcmlwdGlvblwiIHx8IGtleSA9PT0gXCJkZXByZWNhdGVkXCIpIGNvbnRpbnVlXG4gICAgICBvdXRwdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXRcbn1cblxudHlwZSBMaXRlcmFsVHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cblxudHlwZSBab2RUb1RzT3B0aW9ucyA9IHtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBgbmF0aXZlRW51bXNgIGluc3RlYWQgKi9cbiAgcmVzb2x2ZU5hdGl2ZUVudW1zPzogYm9vbGVhblxuICBuYXRpdmVFbnVtcz86IFwiaWRlbnRpZmllclwiIHwgXCJyZXNvbHZlXCIgfCBcInVuaW9uXCJcbn1cblxuY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAocmF3PzogWm9kVG9Uc09wdGlvbnMpID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7XG4gICAgbmF0aXZlRW51bXM6IHJhdz8ucmVzb2x2ZU5hdGl2ZUVudW1zID8gXCJyZXNvbHZlXCIgOiBcImlkZW50aWZpZXJcIixcbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc29sdmVkLCAuLi5yYXcgfVxufVxuXG50eXBlIFJlc29sdmVkWm9kVG9Uc09wdGlvbnMgPSBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlT3B0aW9ucz5cblxudHlwZSBab2RUb1RzU3RvcmUgPSB7XG4gIG5hdGl2ZUVudW1zOiB0cy5FbnVtRGVjbGFyYXRpb25bXVxufVxuXG50eXBlIFpvZFRvVHNSZXR1cm4gPSB7XG4gIG5vZGU6IHRzLlR5cGVOb2RlXG4gIHN0b3JlOiBab2RUb1RzU3RvcmVcbn1cblxudHlwZSBHZXRUeXBlRnVuY3Rpb24gPSAoXG4gIHR5cGVzY3JpcHQ6IHR5cGVvZiB0cyxcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFpvZFRvVHNPcHRpb25zXG4pID0+IHRzLklkZW50aWZpZXIgfCB0cy5UeXBlTm9kZVxuXG5jb25zdCBjYWxsR2V0VHlwZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBsZXQgdHlwZTogUmV0dXJuVHlwZTxHZXRUeXBlRnVuY3Rpb24+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgZ2V0VHlwZSA9IGdldEN1c3RvbVR5cGVHZXR0ZXIoem9kKVxuICAvLyB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhY2Nlc3NpbmcgJ3R5cGUnXG4gIGlmIChnZXRUeXBlKSB0eXBlID0gZ2V0VHlwZSh0cywgaWRlbnRpZmllciwgb3B0aW9ucylcbiAgcmV0dXJuIHR5cGVcbn1cblxuZXhwb3J0IGNvbnN0IHpvZFRvVHMgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcj86IHN0cmluZyxcbiAgb3B0aW9ucz86IFpvZFRvVHNPcHRpb25zXG4pOiBab2RUb1RzUmV0dXJuID0+IHtcbiAgaWYgKCEoem9kIGluc3RhbmNlb2YgWm9kVHlwZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZTogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCksXG4gICAgICBzdG9yZTogeyBuYXRpdmVFbnVtczogW10gfSxcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWRJZGVudGlmaWVyID0gaWRlbnRpZmllciA/PyBcIklkZW50aWZpZXJcIlxuXG4gIGNvbnN0IHJlc29sdmVkT3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpXG5cbiAgY29uc3Qgc3RvcmU6IFpvZFRvVHNTdG9yZSA9IHsgbmF0aXZlRW51bXM6IFtdIH1cblxuICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoem9kLCByZXNvbHZlZElkZW50aWZpZXIsIHN0b3JlLCByZXNvbHZlZE9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbm9kZSwgc3RvcmUgfVxufVxuXG5jb25zdCB6b2RUb1RzTm9kZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIHN0b3JlOiBab2RUb1RzU3RvcmUsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBjb25zdCB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKHpvZClcblxuICBjb25zdCBnZXRUeXBlVHlwZSA9IGNhbGxHZXRUeXBlKHpvZCwgaWRlbnRpZmllciwgb3B0aW9ucylcbiAgLy8gc3BlY2lhbCBjYXNlIG5hdGl2ZSBlbnVtLCB3aGljaCBuZWVkcyBhbiBpZGVudGlmaWVyIG5vZGVcbiAgaWYgKGdldFR5cGVUeXBlICYmIHR5cGVOYW1lICE9PSBcIlpvZE5hdGl2ZUVudW1cIikge1xuICAgIHJldHVybiBtYXliZUlkZW50aWZpZXJUb1R5cGVSZWZlcmVuY2UoZ2V0VHlwZVR5cGUpXG4gIH1cblxuICBjb25zdCBvdGhlckFyZ3VtZW50cyA9IFtpZGVudGlmaWVyLCBzdG9yZSwgb3B0aW9uc10gYXMgY29uc3RcblxuICBzd2l0Y2ggKHR5cGVOYW1lKSB7XG4gICAgY2FzZSBcIlpvZFN0cmluZ1wiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTnVtYmVyXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLk51bWJlcktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RCaWdJbnRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQmlnSW50S2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZEJvb2xlYW5cIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2REYXRlXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIkRhdGVcIikpXG4gICAgfVxuICAgIGNhc2UgXCJab2RVbmRlZmluZWRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE51bGxcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlTnVsbCgpKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVm9pZFwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5Wb2lkS2V5d29yZCksXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCksXG4gICAgICBdKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQW55XCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkFueUtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RVbmtub3duXCI6IHtcbiAgICAgIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTmV2ZXJcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuTmV2ZXJLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kTGF6eVwiOiB7XG4gICAgICAvLyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB3aGF0IHRoZSBsYXp5IHZhbHVlIGlzIHJlZmVycmluZyB0b1xuICAgICAgLy8gc28gd2UgZm9yY2UgdGhlIHVzZXIgdG8gZGVjbGFyZSBpdFxuICAgICAgaWYgKCFnZXRUeXBlVHlwZSkgcmV0dXJuIGNyZWF0ZVR5cGVSZWZlcmVuY2VGcm9tU3RyaW5nKGlkZW50aWZpZXIpXG4gICAgICBicmVha1xuICAgIH1cbiAgICBjYXNlIFwiWm9kTGl0ZXJhbFwiOiB7XG4gICAgICAvLyB6LmxpdGVyYWwoJ2hpJykgLT4gJ2hpJ1xuICAgICAgbGV0IGxpdGVyYWw6IHRzLkxpdGVyYWxFeHByZXNzaW9uIHwgdHMuQm9vbGVhbkxpdGVyYWxcblxuICAgICAgY29uc3QgbGl0ZXJhbFZhbHVlID0gZ2V0TGl0ZXJhbFZhbHVlKHpvZCkgYXMgTGl0ZXJhbFR5cGVcbiAgICAgIHN3aXRjaCAodHlwZW9mIGxpdGVyYWxWYWx1ZSkge1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgICAgICBsaXRlcmFsID0gZi5jcmVhdGVOdW1lcmljTGl0ZXJhbChsaXRlcmFsVmFsdWUpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGxpdGVyYWxWYWx1ZSA9PT0gdHJ1ZSA/IGYuY3JlYXRlVHJ1ZSgpIDogZi5jcmVhdGVGYWxzZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGYuY3JlYXRlU3RyaW5nTGl0ZXJhbChsaXRlcmFsVmFsdWUpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUobGl0ZXJhbClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE9iamVjdFwiOiB7XG4gICAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlKHpvZCkgfHwge31cbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyhzaGFwZSlcblxuICAgICAgY29uc3QgbWVtYmVyczogdHMuVHlwZUVsZW1lbnRbXSA9IHByb3BlcnRpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgbmV4dFpvZE5vZGUgPSB2YWx1ZSBhcyBab2RUeXBlQW55XG4gICAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZShuZXh0Wm9kTm9kZSwgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgICAgY29uc3QgbmV4dFpvZE5vZGVUeXBlTmFtZSA9IGdldFR5cGVOYW1lKG5leHRab2ROb2RlKVxuICAgICAgICBjb25zdCBpc09wdGlvbmFsID1cbiAgICAgICAgICBuZXh0Wm9kTm9kZVR5cGVOYW1lID09PSBcIlpvZE9wdGlvbmFsXCIgfHwgbmV4dFpvZE5vZGUuaXNPcHRpb25hbCgpXG5cbiAgICAgICAgY29uc3QgcHJvcGVydHlTaWduYXR1cmUgPSBmLmNyZWF0ZVByb3BlcnR5U2lnbmF0dXJlKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsKGtleSksXG4gICAgICAgICAgaXNPcHRpb25hbCA/IGYuY3JlYXRlVG9rZW4oU3ludGF4S2luZC5RdWVzdGlvblRva2VuKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0eXBlXG4gICAgICAgIClcblxuICAgICAgICBpZiAobmV4dFpvZE5vZGUuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICBhZGRKc0RvY0NvbW1lbnQocHJvcGVydHlTaWduYXR1cmUsIG5leHRab2ROb2RlLmRlc2NyaXB0aW9uKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5U2lnbmF0dXJlXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKG1lbWJlcnMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEFycmF5XCI6IHtcbiAgICAgIGNvbnN0IGFycmF5VHlwZSA9IGdldEFycmF5VHlwZSh6b2QpXG4gICAgICBjb25zdCB0eXBlID0gYXJyYXlUeXBlXG4gICAgICAgID8gem9kVG9Uc05vZGUoYXJyYXlUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgICAgOiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlQXJyYXlUeXBlTm9kZSh0eXBlKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRW51bVwiOiB7XG4gICAgICAvLyB6LmVudW1bJ2EnLCAnYicsICdjJ10gLT4gJ2EnIHwgJ2InIHwgJ2NcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGdldEVudW1WYWx1ZXMoem9kKVxuICAgICAgY29uc3QgdmFsdWVzQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyB2YWx1ZXMgOiBPYmplY3QudmFsdWVzKHZhbHVlcylcbiAgICAgIGNvbnN0IHR5cGVzID0gdmFsdWVzQXJyYXkubWFwKCh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgICBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUpKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVW5pb25cIjoge1xuICAgICAgLy8gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IHN0cmluZyB8IG51bWJlclxuICAgICAgY29uc3QgdW5pb25PcHRpb25zID0gZ2V0VW5pb25PcHRpb25zKHpvZClcbiAgICAgIGNvbnN0IHR5cGVzOiB0cy5UeXBlTm9kZVtdID0gdW5pb25PcHRpb25zLm1hcCgob3B0aW9uKSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCI6IHtcbiAgICAgIC8vIHouZGlzY3JpbWluYXRlZFVuaW9uKCdraW5kJywgW3oub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdhJyksIGE6IHouc3RyaW5nKCkgfSksIHoub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdiJyksIGI6IHoubnVtYmVyKCkgfSldKSAtPiB7IGtpbmQ6ICdhJywgYTogc3RyaW5nIH0gfCB7IGtpbmQ6ICdiJywgYjogbnVtYmVyIH1cbiAgICAgIGNvbnN0IHVuaW9uT3B0aW9ucyA9IGdldFVuaW9uT3B0aW9ucyh6b2QpXG4gICAgICBjb25zdCB0eXBlczogdHMuVHlwZU5vZGVbXSA9IHVuaW9uT3B0aW9ucy5tYXAoKG9wdGlvbikgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVVuaW9uVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEVmZmVjdHNcIjoge1xuICAgICAgLy8gaWdub3JlIGFueSBlZmZlY3RzLCB0aGV5IHdvbid0IGZhY3RvciBpbnRvIHRoZSB0eXBlc1xuICAgICAgY29uc3QgZWZmZWN0c1NjaGVtYSA9IGdldEVmZmVjdHNTY2hlbWEoem9kKVxuICAgICAgaWYgKCFlZmZlY3RzU2NoZW1hKSByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IG5vZGUgPSB6b2RUb1RzTm9kZShlZmZlY3RzU2NoZW1hLCAuLi5vdGhlckFyZ3VtZW50cykgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE5hdGl2ZUVudW1cIjoge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGVUeXBlXG4gICAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyh6b2QpXG4gICAgICBjb25zdCBlbnVtVmFsdWVzT2JqID1cbiAgICAgICAgdHlwZW9mIGVudW1WYWx1ZXMgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZW51bVZhbHVlcylcbiAgICAgICAgICA/IGVudW1WYWx1ZXNcbiAgICAgICAgICA6IHt9XG5cbiAgICAgIGlmIChvcHRpb25zLm5hdGl2ZUVudW1zID09PSBcInVuaW9uXCIpIHtcbiAgICAgICAgLy8gYWxsb3cgb3ZlcnJpZGluZyB3aXRoIHRoaXMgb3B0aW9uXG4gICAgICAgIGlmICh0eXBlKSByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKHR5cGUpXG5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKGVudW1WYWx1ZXNPYmopLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUgYXMgc3RyaW5nKSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICAgIH1cblxuICAgICAgLy8gei5uYXRpdmVFbnVtKEZydWl0cykgLT4gRnJ1aXRzXG4gICAgICAvLyBjYW4gcmVzb2x2ZSBGcnVpdHMgaW50byBzdG9yZSBhbmQgdXNlciBjYW4gaGFuZGxlIGVudW1zXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBpZiAob3B0aW9ucy5uYXRpdmVFbnVtcyA9PT0gXCJyZXNvbHZlXCIpIHtcbiAgICAgICAgY29uc3QgZW51bU1lbWJlcnMgPSBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICBlbnVtVmFsdWVzT2JqIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbiAgICAgICAgKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxpdGVyYWwgPVxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICAgID8gZi5jcmVhdGVOdW1lcmljTGl0ZXJhbCh2YWx1ZSlcbiAgICAgICAgICAgICAgOiBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUpXG5cbiAgICAgICAgICByZXR1cm4gZi5jcmVhdGVFbnVtTWVtYmVyKGdldElkZW50aWZpZXJPclN0cmluZ0xpdGVyYWwoa2V5KSwgbGl0ZXJhbClcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodHMuaXNJZGVudGlmaWVyKHR5cGUpKSB7XG4gICAgICAgICAgc3RvcmUubmF0aXZlRW51bXMucHVzaChcbiAgICAgICAgICAgIGYuY3JlYXRlRW51bURlY2xhcmF0aW9uKHVuZGVmaW5lZCwgdHlwZSwgZW51bU1lbWJlcnMpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdnZXRUeXBlIG9uIG5hdGl2ZUVudW0gbXVzdCByZXR1cm4gYW4gaWRlbnRpZmllciB3aGVuIG5hdGl2ZUVudW1zIGlzIFwicmVzb2x2ZVwiJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKHR5cGUpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE9wdGlvbmFsXCI6IHtcbiAgICAgIGNvbnN0IGlubmVyID0gZ2V0SW5uZXJUeXBlKHpvZClcbiAgICAgIGlmICghaW5uZXIpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoaW5uZXIsIC4uLm90aGVyQXJndW1lbnRzKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE51bGxhYmxlXCI6IHtcbiAgICAgIGNvbnN0IGlubmVyID0gZ2V0SW5uZXJUeXBlKHpvZClcbiAgICAgIGlmICghaW5uZXIpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVG9Uc05vZGUoaW5uZXIsIC4uLm90aGVyQXJndW1lbnRzKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVMaXRlcmFsVHlwZU5vZGUoZi5jcmVhdGVOdWxsKCkpLFxuICAgICAgXSlcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVHVwbGVcIjoge1xuICAgICAgLy8gei50dXBsZShbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IFtzdHJpbmcsIG51bWJlcl1cbiAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0VHVwbGVJdGVtcyh6b2QpXG4gICAgICBjb25zdCB0eXBlcyA9IGl0ZW1zLm1hcCgob3B0aW9uOiBab2RUeXBlQW55KSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVHVwbGVUeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kUmVjb3JkXCI6IHtcbiAgICAgIC8vIHoucmVjb3JkKHoubnVtYmVyKCkpIC0+IHsgW3g6IHN0cmluZ106IG51bWJlciB9XG4gICAgICBjb25zdCByZWNvcmRWYWx1ZVR5cGUgPSBnZXRSZWNvcmRWYWx1ZVR5cGUoem9kKVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gcmVjb3JkVmFsdWVUeXBlXG4gICAgICAgID8gem9kVG9Uc05vZGUocmVjb3JkVmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgICAgOiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlTGl0ZXJhbE5vZGUoW1xuICAgICAgICBmLmNyZWF0ZUluZGV4U2lnbmF0dXJlKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKFwieFwiKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdmFsdWVUeXBlXG4gICAgICAgICksXG4gICAgICBdKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RNYXBcIjoge1xuICAgICAgLy8gei5tYXAoei5zdHJpbmcoKSkgLT4gTWFwPHN0cmluZz5cbiAgICAgIGNvbnN0IHsga2V5VHlwZTogbWFwS2V5VHlwZSwgdmFsdWVUeXBlOiBtYXBWYWx1ZVR5cGUgfSA9IGdldE1hcFR5cGVzKHpvZClcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IG1hcFZhbHVlVHlwZVxuICAgICAgICA/IHpvZFRvVHNOb2RlKG1hcFZhbHVlVHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IGtleVR5cGUgPSBtYXBLZXlUeXBlXG4gICAgICAgID8gem9kVG9Uc05vZGUobWFwS2V5VHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiTWFwXCIpLCBbXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFNldFwiOiB7XG4gICAgICAvLyB6LnNldCh6LnN0cmluZygpKSAtPiBTZXQ8c3RyaW5nPlxuICAgICAgY29uc3Qgc2V0VmFsdWVUeXBlID0gZ2V0U2V0VmFsdWVUeXBlKHpvZClcbiAgICAgIGNvbnN0IHR5cGUgPSBzZXRWYWx1ZVR5cGVcbiAgICAgICAgPyB6b2RUb1RzTm9kZShzZXRWYWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlNldFwiKSwgW3R5cGVdKVxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kSW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIC8vIHoubnVtYmVyKCkuYW5kKHouc3RyaW5nKCkpIC0+IG51bWJlciAmIHN0cmluZ1xuICAgICAgY29uc3QgeyBsZWZ0OiBpbnRlcnNlY3RMZWZ0LCByaWdodDogaW50ZXJzZWN0UmlnaHQgfSA9XG4gICAgICAgIGdldEludGVyc2VjdGlvblBhcnRzKHpvZClcbiAgICAgIGNvbnN0IGxlZnQgPSBpbnRlcnNlY3RMZWZ0XG4gICAgICAgID8gem9kVG9Uc05vZGUoaW50ZXJzZWN0TGVmdCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IHJpZ2h0ID0gaW50ZXJzZWN0UmlnaHRcbiAgICAgICAgPyB6b2RUb1RzTm9kZShpbnRlcnNlY3RSaWdodCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUludGVyc2VjdGlvblR5cGVOb2RlKFtsZWZ0LCByaWdodF0pXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RQcm9taXNlXCI6IHtcbiAgICAgIC8vIHoucHJvbWlzZSh6LnN0cmluZygpKSAtPiBQcm9taXNlPHN0cmluZz5cbiAgICAgIGNvbnN0IHByb21pc2VUeXBlID0gZ2V0UHJvbWlzZVR5cGUoem9kKVxuICAgICAgY29uc3QgdHlwZSA9IHByb21pc2VUeXBlXG4gICAgICAgID8gem9kVG9Uc05vZGUocHJvbWlzZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgICA6IGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGYuY3JlYXRlSWRlbnRpZmllcihcIlByb21pc2VcIiksIFtcbiAgICAgICAgdHlwZSxcbiAgICAgIF0pXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZEZ1bmN0aW9uXCI6IHtcbiAgICAgIC8vIHouZnVuY3Rpb24oKS5hcmdzKHouc3RyaW5nKCkpLnJldHVybnMoei5udW1iZXIoKSkgLT4gKGFyZ3NfMDogc3RyaW5nKSA9PiBudW1iZXJcbiAgICAgIGNvbnN0IHsgYXJnczogZnVuY0FyZ3MsIHJldHVybnM6IGZ1bmNSZXR1cm5zIH0gPSBnZXRGdW5jdGlvblBhcnRzKHpvZClcbiAgICAgIGNvbnN0IGFyZ3NJdGVtcyA9IGZ1bmNBcmdzID8gZ2V0VHVwbGVJdGVtcyhmdW5jQXJncykgOiBbXVxuICAgICAgY29uc3QgYXJndW1lbnRUeXBlcyA9IGFyZ3NJdGVtcy5tYXAoXG4gICAgICAgIChhcmd1bWVudDogWm9kVHlwZUFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZSA9IHpvZFRvVHNOb2RlKGFyZ3VtZW50LCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7aW5kZXh9YCksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmd1bWVudFR5cGVcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICkgYXMgdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25bXVxuXG4gICAgICBhcmd1bWVudFR5cGVzLnB1c2goXG4gICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlVG9rZW4oU3ludGF4S2luZC5Eb3REb3REb3RUb2tlbiksXG4gICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7YXJndW1lbnRUeXBlcy5sZW5ndGh9YCksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlQXJyYXlUeXBlTm9kZShjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKSlcbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gZnVuY1JldHVybnNcbiAgICAgICAgPyB6b2RUb1RzTm9kZShmdW5jUmV0dXJucywgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICAgIDogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlRnVuY3Rpb25UeXBlTm9kZShcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBhcmd1bWVudFR5cGVzLFxuICAgICAgICByZXR1cm5UeXBlXG4gICAgICApXG5cbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZERlZmF1bHRcIjoge1xuICAgICAgLy8gei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlZmF1bHQoJ2hpJykgLT4gc3RyaW5nXG4gICAgICBjb25zdCBkZWZhdWx0SW5uZXIgPSBnZXRJbm5lclR5cGUoem9kKVxuICAgICAgaWYgKCFkZWZhdWx0SW5uZXIpIHJldHVybiBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKVxuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKGRlZmF1bHRJbm5lciwgLi4ub3RoZXJBcmd1bWVudHMpIGFzIHRzLlR5cGVOb2RlXG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkTm9kZXM6IHRzLk5vZGVbXSA9IFtdXG5cbiAgICAgIHR5cGUuZm9yRWFjaENoaWxkKChub2RlKSA9PiB7XG4gICAgICAgIGlmICghW1N5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZF0uaW5jbHVkZXMobm9kZS5raW5kKSkge1xuICAgICAgICAgIGZpbHRlcmVkTm9kZXMucHVzaChub2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lZWRlZCB0byBzZXQgY2hpbGRyZW5cbiAgICAgIHR5cGUudHlwZXMgPSBmaWx0ZXJlZE5vZGVzXG5cbiAgICAgIHJldHVybiB0eXBlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFByb2plY3QsIFN5bnRheEtpbmQgfSBmcm9tIFwidHMtbW9ycGhcIlxuaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tIFwiZXNidWlsZFwiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIGFsbG93ZWRJbXBvcnRQYXR0ZXJucz86IHN0cmluZ1tdXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHJvdXRlcyB0aGF0IGhhdmUgYGV4Y2x1ZGVGcm9tT3BlbkFwaWAgc2V0IHRvIHRydWUgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqIFNldCB0aGlzIHRvIHRydWUgdG8gaW5jbHVkZSB0aGVtLlxuICAgKi9cbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbiAgZXNidWlsZE9wdGlvbnM/OiBlc2J1aWxkLkJ1aWxkT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdFJvdXRlU3BlY3MgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCB7IHBhY2thZ2VEaXIsIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIiB9ID0gb3B0c1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG5cbiAgY29uc3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KHsgY29tcGlsZXJPcHRpb25zOiB7IGRlY2xhcmF0aW9uOiB0cnVlIH0gfSlcblxuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvamVjdC5hZGRTb3VyY2VGaWxlc0F0UGF0aHMoZnVsbFBhdGhHbG9iKSkge1xuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBzb3VyY2VGaWxlLmdldEV4cG9ydEFzc2lnbm1lbnQoXG4gICAgICAoZCkgPT4gIWQuaXNFeHBvcnRFcXVhbHMoKVxuICAgIClcbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsID0gZGVmYXVsdEV4cG9ydFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB3aXRoUm91dGVTcGVjQ2FsbCA9IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghd2l0aFJvdXRlU3BlY0NhbGwpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgW3JvdXRlU3BlY10gPSB3aXRoUm91dGVTcGVjQ2FsbC5nZXRBcmd1bWVudHMoKVxuICAgIGlmICghcm91dGVTcGVjKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNvdXJjZUZpbGUuYWRkU3RhdGVtZW50cyhcbiAgICAgIGBleHBvcnQgY29uc3QgZXh0cmFjdGVkUm91dGVTcGVjID0gJHtyb3V0ZVNwZWMuZ2V0VGV4dCgpfWBcbiAgICApXG5cbiAgICBkZWZhdWx0RXhwb3J0LnJlbW92ZSgpXG5cbiAgICAvLyBSZW1vdmUgYWxsIHVudXNlZCBpbXBvcnRzIHNvIGZpbGUgY2FuIGJlIHRyZWUgc2hha2VuXG4gICAgLy8gKEFzc3VtZXMgYWxsIGltcG9ydHMgYXJlIGZyZWUgb2Ygc2lkZS1lZmZlY3RzKVxuICAgIGxldCBsYXN0V2lkdGg6IG51bWJlclxuICAgIGRvIHtcbiAgICAgIGxhc3RXaWR0aCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFdpZHRoKClcbiAgICAgIC8vIE1heSBuZWVkIHRvIGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lc1xuICAgICAgc291cmNlRmlsZS5maXhVbnVzZWRJZGVudGlmaWVycygpXG4gICAgfSB3aGlsZSAobGFzdFdpZHRoICE9PSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpKVxuXG4gICAgY29uc3QgYWJzb2x1dGVQYWNrYWdlRGlyID0gcGF0aC5yZXNvbHZlKHBhY2thZ2VEaXIpXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgIGFic29sdXRlUGFja2FnZURpcixcbiAgICAgIHNvdXJjZUZpbGUuZ2V0RmlsZVBhdGgoKVxuICAgIClcbiAgICBwYXRocy5wdXNoKHJlbGF0aXZlUGF0aClcbiAgfVxuXG4gIGNvbnN0IHBhdGhUb0lkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gYWRkIHByZWZpeCB0byBhdm9pZCBzdGFydGluZyB3aXRoIGEgbnVtYmVyXG4gICAgcGF0aFRvSWRbcGF0aF0gPVxuICAgICAgXCJoYXNoXCIgKyBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUocGF0aCkuZGlnZXN0KFwiaGV4XCIpXG4gIH1cblxuICBjb25zdCBlbnRyeVBvaW50Q29udGVudCA9IGBcbiAgJHtwYXRoc1xuICAgIC5tYXAoKHApID0+IGBpbXBvcnQge2V4dHJhY3RlZFJvdXRlU3BlYyBhcyAke3BhdGhUb0lkW3BdfX0gZnJvbSBcIi4vJHtwfVwiYClcbiAgICAuam9pbihcIlxcblwiKX1cblxuICBleHBvcnQgY29uc3Qgcm91dGVzID0ge1xuICAgICR7cGF0aHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgaHR0cFJvdXRlID0gKFxuICAgICAgICAgIG9wdHMubWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA/P1xuICAgICAgICAgIGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KVxuICAgICAgICApKHApXG5cbiAgICAgICAgcmV0dXJuIGBcIiR7aHR0cFJvdXRlfVwiOiAke3BhdGhUb0lkW3BdfWBcbiAgICAgIH0pXG4gICAgICAuam9pbihcIixcXG5cIil9XG4gIH1cbiAgYFxuXG4gIC8vIENvcHkgYWxsb3dlZCBpbXBvcnQgZ2xvYnMgaW50byBwcm9qZWN0XG4gIGlmIChvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucykge1xuICAgIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKG9wdHMuYWxsb3dlZEltcG9ydFBhdHRlcm5zKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdHlwZXMgKC5kLnRzKVxuICBjb25zdCBlbnRyeVBvaW50ID0gcHJvamVjdC5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIFwiZXh0cmFjdGVkLXJvdXRlLXNwZWNzLnRzXCIsXG4gICAgZW50cnlQb2ludENvbnRlbnRcbiAgKVxuICBjb25zdCBlbWl0UmVzdWx0ID0gZW50cnlQb2ludC5nZXRFbWl0T3V0cHV0KHsgZW1pdE9ubHlEdHNGaWxlczogdHJ1ZSB9KVxuICBpZiAob3B0cy5vdXRwdXRGaWxlKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25GaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHBhdGguZGlybmFtZShvcHRzLm91dHB1dEZpbGUpLFxuICAgICAgcGF0aC5iYXNlbmFtZShvcHRzLm91dHB1dEZpbGUpLnJlcGxhY2UoXCIubWpzXCIsIFwiXCIpLnJlcGxhY2UoXCIuanNcIiwgXCJcIikgK1xuICAgICAgICBcIi5kLnRzXCJcbiAgICApXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgZGVjbGFyYXRpb25GaWxlUGF0aCxcbiAgICAgIGVtaXRSZXN1bHQuZ2V0T3V0cHV0RmlsZXMoKVswXS5nZXRUZXh0KClcbiAgICApXG4gIH1cblxuICAvLyBHZW5lcmF0ZSB2YWx1ZXMgKC5qcylcbiAgY29uc3QgcGtnUmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgcGF0aC5qb2luKHBhY2thZ2VEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuICAgIFwidXRmLThcIlxuICApXG4gIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocGtnUmF3KVxuXG4gIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgIC4uLm9wdHMuZXNidWlsZE9wdGlvbnMsXG4gICAgc3RkaW46IHtcbiAgICAgIGNvbnRlbnRzOiBlbnRyeVBvaW50Q29udGVudCxcbiAgICAgIHJlc29sdmVEaXI6IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKSxcbiAgICB9LFxuICAgIG91dGZpbGU6IG9wdHMub3V0cHV0RmlsZSxcbiAgICBidW5kbGU6IHRydWUsXG4gICAgcGxhdGZvcm06IFwibm9kZVwiLFxuICAgIGZvcm1hdDogXCJlc21cIixcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICBleHRlcm5hbDogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRlcGVuZGVuY2llcyksXG4gICAgICAuLi5PYmplY3Qua2V5cyhwa2cuZGV2RGVwZW5kZW5jaWVzKSxcbiAgICAgIC4uLihvcHRzLmVzYnVpbGRPcHRpb25zPy5leHRlcm5hbCA/PyBbXSksXG4gICAgXSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICAvLyBXaXRoIHRoaXMgcGx1Z2luLCBlc2J1aWxkIHdpbGwgbmV2ZXIgdG91Y2ggdGhlIGFjdHVhbCBmaWxlc3lzdGVtIGFuZCB0aHVzIGNhbm5vdCBpbnRlcmFjdCB3aXRoIGltcG9ydHMgdGhhdCBkb24ndCBtYXRjaCBhbGxvd2VkSW1wb3J0UGF0dGVybnNbXS5cbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJyZXNvbHZlLXZpcnR1YWwtZnNcIixcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC8uKi8gfSwgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcHJvamVjdC5nZXRTb3VyY2VGaWxlKGFyZ3MucGF0aCk/LmdldEZ1bGxUZXh0KClcbiAgICAgICAgICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogXCJleHBvcnQgZGVmYXVsdCB7fVwiLFxuICAgICAgICAgICAgICAgIGxvYWRlcjogXCJ0c1wiLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZURpcjogcGF0aC5kaXJuYW1lKGFyZ3MucGF0aCksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8ucGx1Z2lucyA/PyBbXSksXG4gICAgXSxcbiAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3dFQSxTQUFTLGlCQUFpQjtBQUN6QixRQUFNLFFBQVEsb0JBQUksSUFBSTtBQUV0QixhQUFXLENBQUMsV0FBVyxLQUFLLEtBQUssT0FBTyxRQUFRLE1BQU0sR0FBRztBQUN4RCxlQUFXLENBQUMsV0FBVyxLQUFLLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUN2RCxhQUFPLGFBQWE7QUFBQSxRQUNuQixNQUFNLFFBQVUsTUFBTTtBQUFBLFFBQ3RCLE9BQU8sUUFBVSxNQUFNO0FBQUEsTUFDeEI7QUFFQSxZQUFNLGFBQWEsT0FBTztBQUUxQixZQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRTtBQUFBLElBQzdCO0FBRUEsV0FBTyxlQUFlLFFBQVEsV0FBVztBQUFBLE1BQ3hDLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxJQUNiLENBQUM7QUFBQSxFQUNGO0FBRUEsU0FBTyxlQUFlLFFBQVEsU0FBUztBQUFBLElBQ3RDLE9BQU87QUFBQSxJQUNQLFlBQVk7QUFBQSxFQUNiLENBQUM7QUFFRCxTQUFPLE1BQU0sUUFBUTtBQUNyQixTQUFPLFFBQVEsUUFBUTtBQUV2QixTQUFPLE1BQU0sT0FBTyxXQUFXO0FBQy9CLFNBQU8sTUFBTSxVQUFVLFlBQVk7QUFDbkMsU0FBTyxNQUFNLFVBQVUsWUFBWTtBQUNuQyxTQUFPLFFBQVEsT0FBTyxXQUFXLHNCQUFzQjtBQUN2RCxTQUFPLFFBQVEsVUFBVSxZQUFZLHNCQUFzQjtBQUMzRCxTQUFPLFFBQVEsVUFBVSxZQUFZLHNCQUFzQjtBQUczRCxTQUFPLGlCQUFpQixRQUFRO0FBQUEsSUFDL0IsY0FBYztBQUFBLE1BQ2IsTUFBTSxLQUFLLE9BQU8sTUFBTTtBQUd2QixZQUFJLFFBQVEsU0FBUyxVQUFVLE1BQU07QUFDcEMsY0FBSSxNQUFNLEdBQUc7QUFDWixtQkFBTztBQUFBLFVBQ1I7QUFFQSxjQUFJLE1BQU0sS0FBSztBQUNkLG1CQUFPO0FBQUEsVUFDUjtBQUVBLGlCQUFPLEtBQUssT0FBUSxNQUFNLEtBQUssTUFBTyxFQUFFLElBQUk7QUFBQSxRQUM3QztBQUVBLGVBQU8sS0FDSCxLQUFLLEtBQUssTUFBTSxNQUFNLE1BQU0sQ0FBQyxJQUM3QixJQUFJLEtBQUssTUFBTSxRQUFRLE1BQU0sQ0FBQyxJQUMvQixLQUFLLE1BQU0sT0FBTyxNQUFNLENBQUM7QUFBQSxNQUM3QjtBQUFBLE1BQ0EsWUFBWTtBQUFBLElBQ2I7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNULE1BQU0sS0FBSztBQUNWLGNBQU0sVUFBVSx5QkFBeUIsS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO0FBQzlELFlBQUksQ0FBQyxTQUFTO0FBQ2IsaUJBQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUFBLFFBQ2hCO0FBRUEsWUFBSSxDQUFDLFdBQVcsSUFBSTtBQUVwQixZQUFJLFlBQVksV0FBVyxHQUFHO0FBQzdCLHdCQUFjLENBQUMsR0FBRyxXQUFXLEVBQUUsSUFBSSxlQUFhLFlBQVksU0FBUyxFQUFFLEtBQUssRUFBRTtBQUFBLFFBQy9FO0FBRUEsY0FBTSxVQUFVLE9BQU8sU0FBUyxhQUFhLEVBQUU7QUFFL0MsZUFBTztBQUFBLFVBRUwsV0FBVyxLQUFNO0FBQUEsVUFDakIsV0FBVyxJQUFLO0FBQUEsVUFDakIsVUFBVTtBQUFBLFFBRVg7QUFBQSxNQUNEO0FBQUEsTUFDQSxZQUFZO0FBQUEsSUFDYjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ2IsT0FBTyxTQUFPLE9BQU8sYUFBYSxHQUFHLE9BQU8sU0FBUyxHQUFHLENBQUM7QUFBQSxNQUN6RCxZQUFZO0FBQUEsSUFDYjtBQUFBLElBQ0EsZUFBZTtBQUFBLE1BQ2QsTUFBTSxNQUFNO0FBQ1gsWUFBSSxPQUFPLEdBQUc7QUFDYixpQkFBTyxLQUFLO0FBQUEsUUFDYjtBQUVBLFlBQUksT0FBTyxJQUFJO0FBQ2QsaUJBQU8sTUFBTSxPQUFPO0FBQUEsUUFDckI7QUFFQSxZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFFSixZQUFJLFFBQVEsS0FBSztBQUNoQixrQkFBUyxPQUFPLE9BQU8sS0FBTSxLQUFLO0FBQ2xDLGtCQUFRO0FBQ1IsaUJBQU87QUFBQSxRQUNSLE9BQU87QUFDTixrQkFBUTtBQUVSLGdCQUFNLFlBQVksT0FBTztBQUV6QixnQkFBTSxLQUFLLE1BQU0sT0FBTyxFQUFFLElBQUk7QUFDOUIsa0JBQVEsS0FBSyxNQUFNLFlBQVksQ0FBQyxJQUFJO0FBQ3BDLGlCQUFRLFlBQVksSUFBSztBQUFBLFFBQzFCO0FBRUEsY0FBTSxRQUFRLEtBQUssSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJO0FBRTNDLFlBQUksVUFBVSxHQUFHO0FBQ2hCLGlCQUFPO0FBQUEsUUFDUjtBQUdBLFlBQUksU0FBUyxNQUFPLEtBQUssTUFBTSxJQUFJLEtBQUssSUFBTSxLQUFLLE1BQU0sS0FBSyxLQUFLLElBQUssS0FBSyxNQUFNLEdBQUc7QUFFdEYsWUFBSSxVQUFVLEdBQUc7QUFDaEIsb0JBQVU7QUFBQSxRQUNYO0FBRUEsZUFBTztBQUFBLE1BQ1I7QUFBQSxNQUNBLFlBQVk7QUFBQSxJQUNiO0FBQUEsSUFDQSxXQUFXO0FBQUEsTUFDVixPQUFPLENBQUMsS0FBSyxPQUFPLFNBQVMsT0FBTyxjQUFjLE9BQU8sYUFBYSxLQUFLLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDdkYsWUFBWTtBQUFBLElBQ2I7QUFBQSxJQUNBLFdBQVc7QUFBQSxNQUNWLE9BQU8sU0FBTyxPQUFPLGNBQWMsT0FBTyxhQUFhLEdBQUcsQ0FBQztBQUFBLE1BQzNELFlBQVk7QUFBQSxJQUNiO0FBQUEsRUFDRCxDQUFDO0FBRUQsU0FBTztBQUNSO0FBMU5BLElBQU0sd0JBRUEsWUFFQSxhQUVBLGFBRUEsUUEyRE8sZUFDQSxzQkFDQSxzQkFDQSxZQXNKUCxZQUVDO0FBOU5QO0FBQUE7QUFBQTtBQUFBLElBQU0seUJBQXlCO0FBRS9CLElBQU0sYUFBYSxDQUFDLFNBQVMsTUFBTSxVQUFRLFFBQVUsT0FBTztBQUU1RCxJQUFNLGNBQWMsQ0FBQyxTQUFTLE1BQU0sVUFBUSxRQUFVLEtBQUssWUFBWTtBQUV2RSxJQUFNLGNBQWMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxLQUFLLE9BQU8sU0FBUyxRQUFVLEtBQUssWUFBWSxPQUFPLFNBQVM7QUFFckcsSUFBTSxTQUFTO0FBQUEsTUFDZCxVQUFVO0FBQUEsUUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQUEsUUFFWixNQUFNLENBQUMsR0FBRyxFQUFFO0FBQUEsUUFDWixLQUFLLENBQUMsR0FBRyxFQUFFO0FBQUEsUUFDWCxRQUFRLENBQUMsR0FBRyxFQUFFO0FBQUEsUUFDZCxXQUFXLENBQUMsR0FBRyxFQUFFO0FBQUEsUUFDakIsVUFBVSxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ2pCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7QUFBQSxRQUNmLFFBQVEsQ0FBQyxHQUFHLEVBQUU7QUFBQSxRQUNkLGVBQWUsQ0FBQyxHQUFHLEVBQUU7QUFBQSxNQUN0QjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ04sT0FBTyxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ2QsS0FBSyxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ1osT0FBTyxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ2QsUUFBUSxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ2YsTUFBTSxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ2IsU0FBUyxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ2hCLE1BQU0sQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUNiLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUdkLGFBQWEsQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUNwQixNQUFNLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFDYixNQUFNLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFDYixXQUFXLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFDbEIsYUFBYSxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ3BCLGNBQWMsQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUNyQixZQUFZLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFDbkIsZUFBZSxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ3RCLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUNuQixhQUFhLENBQUMsSUFBSSxFQUFFO0FBQUEsTUFDckI7QUFBQSxNQUNBLFNBQVM7QUFBQSxRQUNSLFNBQVMsQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUNoQixPQUFPLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFDZCxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFDaEIsVUFBVSxDQUFDLElBQUksRUFBRTtBQUFBLFFBQ2pCLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUNmLFdBQVcsQ0FBQyxJQUFJLEVBQUU7QUFBQSxRQUNsQixRQUFRLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFDZixTQUFTLENBQUMsSUFBSSxFQUFFO0FBQUEsUUFHaEIsZUFBZSxDQUFDLEtBQUssRUFBRTtBQUFBLFFBQ3ZCLFFBQVEsQ0FBQyxLQUFLLEVBQUU7QUFBQSxRQUNoQixRQUFRLENBQUMsS0FBSyxFQUFFO0FBQUEsUUFDaEIsYUFBYSxDQUFDLEtBQUssRUFBRTtBQUFBLFFBQ3JCLGVBQWUsQ0FBQyxLQUFLLEVBQUU7QUFBQSxRQUN2QixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7QUFBQSxRQUN4QixjQUFjLENBQUMsS0FBSyxFQUFFO0FBQUEsUUFDdEIsaUJBQWlCLENBQUMsS0FBSyxFQUFFO0FBQUEsUUFDekIsY0FBYyxDQUFDLEtBQUssRUFBRTtBQUFBLFFBQ3RCLGVBQWUsQ0FBQyxLQUFLLEVBQUU7QUFBQSxNQUN4QjtBQUFBLElBQ0Q7QUFFTyxJQUFNLGdCQUFnQixPQUFPLEtBQUssT0FBTyxRQUFRO0FBQ2pELElBQU0sdUJBQXVCLE9BQU8sS0FBSyxPQUFPLEtBQUs7QUFDckQsSUFBTSx1QkFBdUIsT0FBTyxLQUFLLE9BQU8sT0FBTztBQUN2RCxJQUFNLGFBQWEsQ0FBQyxHQUFHLHNCQUFzQixHQUFHLG9CQUFvQjtBQXNKM0UsSUFBTSxhQUFhLGVBQWU7QUFFbEMsSUFBTyxzQkFBUTtBQUFBO0FBQUE7OztBQ3hOZixTQUFTLFFBQVEsTUFBTSxPQUFPLFdBQVcsT0FBTyxXQUFXLEtBQUssT0FBTyxvQkFBQUEsUUFBUSxNQUFNO0FBQ3BGLFFBQU0sU0FBUyxLQUFLLFdBQVcsR0FBRyxJQUFJLEtBQU0sS0FBSyxXQUFXLElBQUksTUFBTTtBQUN0RSxRQUFNLFdBQVcsS0FBSyxRQUFRLFNBQVMsSUFBSTtBQUMzQyxRQUFNLHFCQUFxQixLQUFLLFFBQVEsSUFBSTtBQUM1QyxTQUFPLGFBQWEsT0FBTyx1QkFBdUIsTUFBTSxXQUFXO0FBQ3BFO0FBcUJBLFNBQVMsZ0JBQWdCO0FBQ3hCLE1BQUksaUJBQWlCLEtBQUs7QUFDekIsUUFBSSxJQUFJLGdCQUFnQixRQUFRO0FBQy9CLGFBQU87QUFBQSxJQUNSO0FBRUEsUUFBSSxJQUFJLGdCQUFnQixTQUFTO0FBQ2hDLGFBQU87QUFBQSxJQUNSO0FBRUEsV0FBTyxJQUFJLFlBQVksV0FBVyxJQUFJLElBQUksS0FBSyxJQUFJLE9BQU8sU0FBUyxJQUFJLGFBQWEsRUFBRSxHQUFHLENBQUM7QUFBQSxFQUMzRjtBQUNEO0FBRUEsU0FBUyxlQUFlLE9BQU87QUFDOUIsTUFBSSxVQUFVLEdBQUc7QUFDaEIsV0FBTztBQUFBLEVBQ1I7QUFFQSxTQUFPO0FBQUEsSUFDTjtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsUUFBUSxTQUFTO0FBQUEsSUFDakIsUUFBUSxTQUFTO0FBQUEsRUFDbEI7QUFDRDtBQUVBLFNBQVMsZUFBZSxZQUFZLEVBQUMsYUFBYSxhQUFhLEtBQUksSUFBSSxDQUFDLEdBQUc7QUFDMUUsUUFBTSxtQkFBbUIsY0FBYztBQUN2QyxNQUFJLHFCQUFxQixRQUFXO0FBQ25DLHFCQUFpQjtBQUFBLEVBQ2xCO0FBRUEsUUFBTSxhQUFhLGFBQWEsaUJBQWlCO0FBRWpELE1BQUksZUFBZSxHQUFHO0FBQ3JCLFdBQU87QUFBQSxFQUNSO0FBRUEsTUFBSSxZQUFZO0FBQ2YsUUFBSSxRQUFRLFdBQVcsS0FDbkIsUUFBUSxZQUFZLEtBQ3BCLFFBQVEsaUJBQWlCLEdBQUc7QUFDL0IsYUFBTztBQUFBLElBQ1I7QUFFQSxRQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3pCLGFBQU87QUFBQSxJQUNSO0FBQUEsRUFDRDtBQUlBLE1BQUksY0FBYyxPQUFPLGdCQUFnQixLQUFLO0FBQzdDLFdBQU87QUFBQSxFQUNSO0FBRUEsTUFBSSxjQUFjLENBQUMsZUFBZSxlQUFlLFFBQVc7QUFDM0QsV0FBTztBQUFBLEVBQ1I7QUFFQSxRQUFNLE1BQU0sY0FBYztBQUUxQixNQUFJLElBQUksU0FBUyxRQUFRO0FBQ3hCLFdBQU87QUFBQSxFQUNSO0FBRUEsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFHakMsVUFBTSxZQUFZLGVBQUFDLFFBQUcsUUFBUSxFQUFFLE1BQU0sR0FBRztBQUN4QyxRQUNDLE9BQU8sVUFBVSxFQUFFLEtBQUssTUFDckIsT0FBTyxVQUFVLEVBQUUsS0FBSyxPQUMxQjtBQUNELGFBQU8sT0FBTyxVQUFVLEVBQUUsS0FBSyxRQUFTLElBQUk7QUFBQSxJQUM3QztBQUVBLFdBQU87QUFBQSxFQUNSO0FBRUEsTUFBSSxRQUFRLEtBQUs7QUFDaEIsUUFBSSxvQkFBb0IsT0FBTyxtQkFBbUIsS0FBSztBQUN0RCxhQUFPO0FBQUEsSUFDUjtBQUVBLFFBQUksQ0FBQyxVQUFVLFlBQVksWUFBWSxhQUFhLGFBQWEsT0FBTyxFQUFFLEtBQUssVUFBUSxRQUFRLEdBQUcsS0FBSyxJQUFJLFlBQVksWUFBWTtBQUNsSSxhQUFPO0FBQUEsSUFDUjtBQUVBLFdBQU87QUFBQSxFQUNSO0FBRUEsTUFBSSxzQkFBc0IsS0FBSztBQUM5QixXQUFPLGdDQUFnQyxLQUFLLElBQUksZ0JBQWdCLElBQUksSUFBSTtBQUFBLEVBQ3pFO0FBRUEsTUFBSSxJQUFJLGNBQWMsYUFBYTtBQUNsQyxXQUFPO0FBQUEsRUFDUjtBQUVBLE1BQUksSUFBSSxTQUFTLGVBQWU7QUFDL0IsV0FBTztBQUFBLEVBQ1I7QUFFQSxNQUFJLGtCQUFrQixLQUFLO0FBQzFCLFVBQU0sVUFBVSxPQUFPLFVBQVUsSUFBSSx3QkFBd0IsSUFBSSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFFbEYsWUFBUSxJQUFJO0FBQUEsV0FDTixhQUFhO0FBQ2pCLGVBQU8sV0FBVyxJQUFJLElBQUk7QUFBQSxNQUMzQjtBQUFBLFdBRUssa0JBQWtCO0FBQ3RCLGVBQU87QUFBQSxNQUNSO0FBQUE7QUFBQSxFQUdGO0FBRUEsTUFBSSxpQkFBaUIsS0FBSyxJQUFJLElBQUksR0FBRztBQUNwQyxXQUFPO0FBQUEsRUFDUjtBQUVBLE1BQUksOERBQThELEtBQUssSUFBSSxJQUFJLEdBQUc7QUFDakYsV0FBTztBQUFBLEVBQ1I7QUFFQSxNQUFJLGVBQWUsS0FBSztBQUN2QixXQUFPO0FBQUEsRUFDUjtBQUVBLFNBQU87QUFDUjtBQUVPLFNBQVMsb0JBQW9CLFFBQVEsVUFBVSxDQUFDLEdBQUc7QUFDekQsUUFBTSxRQUFRLGVBQWUsUUFBUTtBQUFBLElBQ3BDLGFBQWEsVUFBVSxPQUFPO0FBQUEsSUFDOUIsR0FBRztBQUFBLEVBQ0osQ0FBQztBQUVELFNBQU8sZUFBZSxLQUFLO0FBQzVCO0FBOUtBLHlCQUNBLGdCQUNBLGlCQVdPLEtBRUgsZ0JBaUtFLGVBS0M7QUFyTFA7QUFBQTtBQUFBO0FBQUEsMEJBQW9CO0FBQ3BCLHFCQUFlO0FBQ2Ysc0JBQWdCO0FBV2hCLEtBQU0sRUFBQyxRQUFPLG9CQUFBRDtBQUdkLFFBQ0MsUUFBUSxVQUFVLEtBQ2YsUUFBUSxXQUFXLEtBQ25CLFFBQVEsYUFBYSxLQUNyQixRQUFRLGFBQWEsR0FDdkI7QUFDRCx1QkFBaUI7QUFBQSxJQUNsQixXQUNDLFFBQVEsT0FBTyxLQUNaLFFBQVEsUUFBUSxLQUNoQixRQUFRLFlBQVksS0FDcEIsUUFBUSxjQUFjLEdBQ3hCO0FBQ0QsdUJBQWlCO0FBQUEsSUFDbEI7QUFrSkEsSUFBTSxnQkFBZ0I7QUFBQSxNQUNyQixRQUFRLG9CQUFvQixFQUFDLE9BQU8sZ0JBQUFFLFFBQUksT0FBTyxDQUFDLEVBQUMsQ0FBQztBQUFBLE1BQ2xELFFBQVEsb0JBQW9CLEVBQUMsT0FBTyxnQkFBQUEsUUFBSSxPQUFPLENBQUMsRUFBQyxDQUFDO0FBQUEsSUFDbkQ7QUFFQSxJQUFPLHlCQUFRO0FBQUE7QUFBQTs7O0FDcExSLFNBQVMsaUJBQWlCLFFBQVEsV0FBVyxVQUFVO0FBQzdELE1BQUksUUFBUSxPQUFPLFFBQVEsU0FBUztBQUNwQyxNQUFJLFVBQVUsSUFBSTtBQUNqQixXQUFPO0FBQUEsRUFDUjtBQUVBLFFBQU0sa0JBQWtCLFVBQVU7QUFDbEMsTUFBSSxXQUFXO0FBQ2YsTUFBSSxjQUFjO0FBQ2xCLEtBQUc7QUFDRixtQkFBZSxPQUFPLE1BQU0sVUFBVSxLQUFLLElBQUksWUFBWTtBQUMzRCxlQUFXLFFBQVE7QUFDbkIsWUFBUSxPQUFPLFFBQVEsV0FBVyxRQUFRO0FBQUEsRUFDM0MsU0FBUyxVQUFVO0FBRW5CLGlCQUFlLE9BQU8sTUFBTSxRQUFRO0FBQ3BDLFNBQU87QUFDUjtBQUVPLFNBQVMsK0JBQStCLFFBQVEsUUFBUSxTQUFTLE9BQU87QUFDOUUsTUFBSSxXQUFXO0FBQ2YsTUFBSSxjQUFjO0FBQ2xCLEtBQUc7QUFDRixVQUFNLFFBQVEsT0FBTyxRQUFRLE9BQU87QUFDcEMsbUJBQWUsT0FBTyxNQUFNLFVBQVcsUUFBUSxRQUFRLElBQUksS0FBTSxJQUFJLFVBQVUsUUFBUSxTQUFTLFFBQVE7QUFDeEcsZUFBVyxRQUFRO0FBQ25CLFlBQVEsT0FBTyxRQUFRLE1BQU0sUUFBUTtBQUFBLEVBQ3RDLFNBQVMsVUFBVTtBQUVuQixpQkFBZSxPQUFPLE1BQU0sUUFBUTtBQUNwQyxTQUFPO0FBQ1I7QUFoQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpREEsU0FBUyxZQUFZLFNBQVM7QUFDN0IsU0FBTyxhQUFhLE9BQU87QUFDNUI7QUFuREEsSUFPZSxhQUFxQixhQUU5QixXQUNBLFFBQ0EsVUFHQSxjQU9BQyxTQUVBLGNBVU8sT0FPUCxjQWlDQSxjQW9CQSxZQXlCQSxPQWFBLGNBb0JBLGVBZ0JBLFlBb0NBLE9BQ08sYUFvQk47QUFoT1A7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBNE1BO0FBdk1BLEtBQU0sRUFBQyxRQUFRLGFBQWEsUUFBUSxnQkFBZTtBQUVuRCxJQUFNLFlBQVksT0FBTyxXQUFXO0FBQ3BDLElBQU0sU0FBUyxPQUFPLFFBQVE7QUFDOUIsSUFBTSxXQUFXLE9BQU8sVUFBVTtBQUdsQyxJQUFNLGVBQWU7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Q7QUFFQSxJQUFNQSxVQUFTLHVCQUFPLE9BQU8sSUFBSTtBQUVqQyxJQUFNLGVBQWUsQ0FBQyxRQUFRLFVBQVUsQ0FBQyxNQUFNO0FBQzlDLFVBQUksUUFBUSxTQUFTLEVBQUUsT0FBTyxVQUFVLFFBQVEsS0FBSyxLQUFLLFFBQVEsU0FBUyxLQUFLLFFBQVEsU0FBUyxJQUFJO0FBQ3BHLGNBQU0sSUFBSSxNQUFNLHFEQUFxRDtBQUFBLE1BQ3RFO0FBR0EsWUFBTSxhQUFhLGNBQWMsWUFBWSxRQUFRO0FBQ3JELGFBQU8sUUFBUSxRQUFRLFVBQVUsU0FBWSxhQUFhLFFBQVE7QUFBQSxJQUNuRTtBQUVPLElBQU0sUUFBTixNQUFZO0FBQUEsTUFDbEIsWUFBWSxTQUFTO0FBRXBCLGVBQU8sYUFBYSxPQUFPO0FBQUEsTUFDNUI7QUFBQSxJQUNEO0FBRUEsSUFBTSxlQUFlLGFBQVc7QUFDL0IsWUFBTUMsU0FBUSxJQUFJLFlBQVksUUFBUSxLQUFLLEdBQUc7QUFDOUMsbUJBQWFBLFFBQU8sT0FBTztBQUUzQixhQUFPLGVBQWVBLFFBQU8sWUFBWSxTQUFTO0FBRWxELGFBQU9BO0FBQUEsSUFDUjtBQU1BLFdBQU8sZUFBZSxZQUFZLFdBQVcsU0FBUyxTQUFTO0FBRS9ELGVBQVcsQ0FBQyxXQUFXLEtBQUssS0FBSyxPQUFPLFFBQVEsbUJBQVUsR0FBRztBQUM1RCxNQUFBRCxRQUFPLGFBQWE7QUFBQSxRQUNuQixNQUFNO0FBQ0wsZ0JBQU0sVUFBVSxjQUFjLE1BQU0sYUFBYSxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssT0FBTyxHQUFHLEtBQUssU0FBUztBQUN2RyxpQkFBTyxlQUFlLE1BQU0sV0FBVyxFQUFDLE9BQU8sUUFBTyxDQUFDO0FBQ3ZELGlCQUFPO0FBQUEsUUFDUjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBRUEsSUFBQUEsUUFBTyxVQUFVO0FBQUEsTUFDaEIsTUFBTTtBQUNMLGNBQU0sVUFBVSxjQUFjLE1BQU0sS0FBSyxTQUFTLElBQUk7QUFDdEQsZUFBTyxlQUFlLE1BQU0sV0FBVyxFQUFDLE9BQU8sUUFBTyxDQUFDO0FBQ3ZELGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRDtBQUVBLElBQU0sZUFBZSxDQUFDLE9BQU8sT0FBTyxTQUFTLGVBQWU7QUFDM0QsVUFBSSxVQUFVLE9BQU87QUFDcEIsWUFBSSxVQUFVLFdBQVc7QUFDeEIsaUJBQU8sb0JBQVcsTUFBTSxRQUFRLEdBQUcsVUFBVTtBQUFBLFFBQzlDO0FBRUEsWUFBSSxVQUFVLFdBQVc7QUFDeEIsaUJBQU8sb0JBQVcsTUFBTSxRQUFRLG9CQUFXLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFBQSxRQUN2RTtBQUVBLGVBQU8sb0JBQVcsTUFBTSxLQUFLLG9CQUFXLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFBQSxNQUNqRTtBQUVBLFVBQUksVUFBVSxPQUFPO0FBQ3BCLGVBQU8sYUFBYSxPQUFPLE9BQU8sTUFBTSxHQUFHLG9CQUFXLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFBQSxNQUM5RTtBQUVBLGFBQU8sb0JBQVcsTUFBTSxPQUFPLEdBQUcsVUFBVTtBQUFBLElBQzdDO0FBRUEsSUFBTSxhQUFhLENBQUMsT0FBTyxPQUFPLFNBQVM7QUFFM0MsZUFBVyxTQUFTLFlBQVk7QUFDL0IsTUFBQUEsUUFBTyxTQUFTO0FBQUEsUUFDZixNQUFNO0FBQ0wsZ0JBQU0sRUFBQyxNQUFLLElBQUk7QUFDaEIsaUJBQU8sWUFBYSxZQUFZO0FBQy9CLGtCQUFNLFNBQVMsYUFBYSxhQUFhLE9BQU8sYUFBYSxRQUFRLFNBQVMsR0FBRyxVQUFVLEdBQUcsb0JBQVcsTUFBTSxPQUFPLEtBQUssT0FBTztBQUNsSSxtQkFBTyxjQUFjLE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxVQUNsRDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBRUEsWUFBTSxVQUFVLE9BQU8sTUFBTSxHQUFHLFlBQVksSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxNQUFBQSxRQUFPLFdBQVc7QUFBQSxRQUNqQixNQUFNO0FBQ0wsZ0JBQU0sRUFBQyxNQUFLLElBQUk7QUFDaEIsaUJBQU8sWUFBYSxZQUFZO0FBQy9CLGtCQUFNLFNBQVMsYUFBYSxhQUFhLE9BQU8sYUFBYSxRQUFRLFdBQVcsR0FBRyxVQUFVLEdBQUcsb0JBQVcsUUFBUSxPQUFPLEtBQUssT0FBTztBQUN0SSxtQkFBTyxjQUFjLE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxVQUNsRDtBQUFBLFFBQ0Q7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUVBLElBQU0sUUFBUSxPQUFPLGlCQUFpQixNQUFNO0FBQUEsSUFBQyxHQUFHO0FBQUEsTUFDL0MsR0FBR0E7QUFBQSxNQUNILE9BQU87QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLE1BQU07QUFDTCxpQkFBTyxLQUFLLFdBQVc7QUFBQSxRQUN4QjtBQUFBLFFBQ0EsSUFBSSxPQUFPO0FBQ1YsZUFBSyxXQUFXLFFBQVE7QUFBQSxRQUN6QjtBQUFBLE1BQ0Q7QUFBQSxJQUNELENBQUM7QUFFRCxJQUFNLGVBQWUsQ0FBQyxNQUFNLE9BQU8sV0FBVztBQUM3QyxVQUFJO0FBQ0osVUFBSTtBQUNKLFVBQUksV0FBVyxRQUFXO0FBQ3pCLGtCQUFVO0FBQ1YsbUJBQVc7QUFBQSxNQUNaLE9BQU87QUFDTixrQkFBVSxPQUFPLFVBQVU7QUFDM0IsbUJBQVcsUUFBUSxPQUFPO0FBQUEsTUFDM0I7QUFFQSxhQUFPO0FBQUEsUUFDTjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUVBLElBQU0sZ0JBQWdCLENBQUMsTUFBTSxTQUFTLGFBQWE7QUFHbEQsWUFBTSxVQUFVLElBQUksZUFBZSxXQUFXLFNBQVUsV0FBVyxXQUFXLElBQU0sS0FBSyxXQUFXLEtBQU0sV0FBVyxLQUFLLEdBQUcsQ0FBQztBQUk5SCxhQUFPLGVBQWUsU0FBUyxLQUFLO0FBRXBDLGNBQVEsYUFBYTtBQUNyQixjQUFRLFVBQVU7QUFDbEIsY0FBUSxZQUFZO0FBRXBCLGFBQU87QUFBQSxJQUNSO0FBRUEsSUFBTSxhQUFhLENBQUMsTUFBTSxXQUFXO0FBQ3BDLFVBQUksS0FBSyxTQUFTLEtBQUssQ0FBQyxRQUFRO0FBQy9CLGVBQU8sS0FBSyxZQUFZLEtBQUs7QUFBQSxNQUM5QjtBQUVBLFVBQUksU0FBUyxLQUFLO0FBRWxCLFVBQUksV0FBVyxRQUFXO0FBQ3pCLGVBQU87QUFBQSxNQUNSO0FBRUEsWUFBTSxFQUFDLFNBQVMsU0FBUSxJQUFJO0FBQzVCLFVBQUksT0FBTyxTQUFTLE1BQVEsR0FBRztBQUM5QixlQUFPLFdBQVcsUUFBVztBQUk1QixtQkFBUyxpQkFBaUIsUUFBUSxPQUFPLE9BQU8sT0FBTyxJQUFJO0FBRTNELG1CQUFTLE9BQU87QUFBQSxRQUNqQjtBQUFBLE1BQ0Q7QUFLQSxZQUFNLFVBQVUsT0FBTyxRQUFRLElBQUk7QUFDbkMsVUFBSSxZQUFZLElBQUk7QUFDbkIsaUJBQVMsK0JBQStCLFFBQVEsVUFBVSxTQUFTLE9BQU87QUFBQSxNQUMzRTtBQUVBLGFBQU8sVUFBVSxTQUFTO0FBQUEsSUFDM0I7QUFFQSxXQUFPLGlCQUFpQixZQUFZLFdBQVdBLE9BQU07QUFFckQsSUFBTSxRQUFRLFlBQVk7QUFDbkIsSUFBTSxjQUFjLFlBQVksRUFBQyxPQUFPLGNBQWMsWUFBWSxRQUFRLEVBQUMsQ0FBQztBQW9CbkYsSUFBTyxpQkFBUTtBQUFBO0FBQUE7OztBQ2hPZjtBQUFBLGdEQUFBRSxTQUFBO0FBQUE7QUFBQTtBQVFBLFFBQU0sU0FBUyxRQUFRO0FBQ3ZCLFFBQU0sY0FBYyxPQUFPO0FBQzNCLFFBQU0sUUFBUSxNQUFNLFVBQVU7QUFFOUIsSUFBQUEsUUFBTyxVQUFVQztBQUVqQixhQUFTQSxVQUFVO0FBQ2pCLFlBQU0sZUFBZSxDQUFDO0FBQ3RCLFlBQU0sT0FBTyxNQUFNLEtBQUssU0FBUztBQUNqQyxVQUFJLFVBQVU7QUFDZCxVQUFJLFVBQVUsS0FBSyxLQUFLLFNBQVM7QUFFakMsVUFBSSxXQUFXLENBQUMsTUFBTSxRQUFRLE9BQU8sS0FBSyxRQUFRLFFBQVEsTUFBTTtBQUM5RCxhQUFLLElBQUk7QUFBQSxNQUNYLE9BQU87QUFDTCxrQkFBVSxDQUFDO0FBQUEsTUFDYjtBQUVBLFlBQU0sUUFBUSxRQUFRLFFBQVE7QUFDOUIsWUFBTSxjQUFjLFFBQVEsY0FBYztBQUMxQyxVQUFJLFFBQVEsY0FBYyxNQUFNO0FBQzlCLGdCQUFRLGFBQWE7QUFBQSxNQUN2QjtBQUNBLFVBQUksUUFBUSxpQkFBaUIsTUFBTTtBQUNqQyxnQkFBUSxnQkFBZ0IsS0FBSztBQUFBLE1BQy9CO0FBQ0EsWUFBTSxlQUFlLFlBQVksT0FBTztBQUV4QyxlQUFTLFlBQWE7QUFDcEIsaUJBQVMsSUFBSSxHQUFHLE1BQU0sVUFBVSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ3BELHVCQUFhLEtBQUssYUFBYSxVQUFVLElBQUksT0FBTyxDQUFDO0FBQUEsUUFDdkQ7QUFDQSxvQkFBWTtBQUNaLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxjQUFlO0FBQ3RCLFlBQUksU0FBUztBQUNYO0FBQUEsUUFDRjtBQUNBLGtCQUFVO0FBRVYsWUFBSSxVQUFVLGFBQWEsTUFBTTtBQUNqQyxZQUFJLENBQUMsU0FBUztBQUNaLGtCQUFRLFNBQVMsU0FBUztBQUMxQjtBQUFBLFFBQ0Y7QUFDQSxZQUFJLENBQUMsTUFBTSxRQUFRLE9BQU8sR0FBRztBQUMzQixvQkFBVSxDQUFDLE9BQU87QUFBQSxRQUNwQjtBQUVBLFlBQUksYUFBYSxRQUFRLFNBQVM7QUFFbEMsaUJBQVMsT0FBUTtBQUNmLGNBQUksRUFBRSxhQUFhLEdBQUc7QUFDcEI7QUFBQSxVQUNGO0FBQ0Esb0JBQVU7QUFDVixzQkFBWTtBQUFBLFFBQ2Q7QUFFQSxpQkFBUyxLQUFNLFFBQVE7QUFDckIsbUJBQVMsUUFBUztBQUNoQixtQkFBTyxlQUFlLG1CQUFtQixLQUFLO0FBQzlDLG1CQUFPLGVBQWUsT0FBTyxLQUFLO0FBQ2xDLGdCQUFJLGFBQWE7QUFDZixxQkFBTyxlQUFlLFNBQVMsT0FBTztBQUFBLFlBQ3hDO0FBQ0EsaUJBQUs7QUFBQSxVQUNQO0FBQ0EsbUJBQVMsUUFBUyxLQUFLO0FBQ3JCLHlCQUFhLEtBQUssU0FBUyxHQUFHO0FBQUEsVUFDaEM7QUFFQSxjQUFJLE9BQU8sZUFBZSxZQUFZO0FBQ3BDLG1CQUFPLEtBQUs7QUFBQSxVQUNkO0FBRUEsaUJBQU8sR0FBRyxtQkFBbUIsS0FBSztBQUNsQyxpQkFBTyxHQUFHLE9BQU8sS0FBSztBQUV0QixjQUFJLGFBQWE7QUFDZixtQkFBTyxHQUFHLFNBQVMsT0FBTztBQUFBLFVBQzVCO0FBRUEsaUJBQU8sS0FBSyxjQUFjLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFFeEMsaUJBQU8sT0FBTztBQUFBLFFBQ2hCO0FBRUEsaUJBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7QUFDdkMsZUFBSyxRQUFRLEVBQUU7QUFBQSxRQUNqQjtBQUVBLGFBQUs7QUFBQSxNQUNQO0FBRUEsZUFBUyxZQUFhO0FBQ3BCLGtCQUFVO0FBRVYscUJBQWEsS0FBSyxZQUFZO0FBQzlCLFlBQUksT0FBTztBQUNULHVCQUFhLElBQUk7QUFBQSxRQUNuQjtBQUFBLE1BQ0Y7QUFFQSxtQkFBYSxnQkFBZ0IsQ0FBQztBQUM5QixtQkFBYSxNQUFNO0FBQ25CLG1CQUFhLEdBQUcsVUFBVSxTQUFVLFFBQVE7QUFDMUMsZUFBTyxLQUFLLGlCQUFpQjtBQUFBLE1BQy9CLENBQUM7QUFFRCxVQUFJLEtBQUssUUFBUTtBQUNmLGtCQUFVLE1BQU0sTUFBTSxJQUFJO0FBQUEsTUFDNUI7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUdBLGFBQVMsYUFBYyxTQUFTLFNBQVM7QUFDdkMsVUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFFM0IsWUFBSSxDQUFDLFFBQVEsa0JBQWtCLFFBQVEsTUFBTTtBQUMzQyxvQkFBVSxRQUFRLEtBQUssWUFBWSxPQUFPLENBQUM7QUFBQSxRQUM3QztBQUNBLFlBQUksQ0FBQyxRQUFRLGtCQUFrQixDQUFDLFFBQVEsU0FBUyxDQUFDLFFBQVEsTUFBTTtBQUM5RCxnQkFBTSxJQUFJLE1BQU0scUNBQXFDO0FBQUEsUUFDdkQ7QUFDQSxnQkFBUSxNQUFNO0FBQUEsTUFDaEIsT0FBTztBQUNMLGlCQUFTLElBQUksR0FBRyxNQUFNLFFBQVEsUUFBUSxJQUFJLEtBQUssS0FBSztBQUNsRCxrQkFBUSxLQUFLLGFBQWEsUUFBUSxJQUFJLE9BQU87QUFBQSxRQUMvQztBQUFBLE1BQ0Y7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUE7OztBQy9JQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxZQUFRLFlBQVksUUFBUSxVQUFVO0FBQ3RDLGFBQVMsUUFBUSxPQUFPO0FBQ3BCLGFBQU8sTUFBTSxPQUFPLENBQUMsWUFBWSxTQUFTLENBQUMsRUFBRSxPQUFPLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQztBQUFBLElBQzdFO0FBQ0EsWUFBUSxVQUFVO0FBQ2xCLGFBQVMsVUFBVSxPQUFPLFdBQVc7QUFDakMsWUFBTSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFVBQUksYUFBYTtBQUNqQixpQkFBVyxRQUFRLE9BQU87QUFDdEIsWUFBSSxVQUFVLElBQUksR0FBRztBQUNqQjtBQUNBLGlCQUFPLGNBQWMsQ0FBQztBQUFBLFFBQzFCLE9BQ0s7QUFDRCxpQkFBTyxZQUFZLEtBQUssSUFBSTtBQUFBLFFBQ2hDO0FBQUEsTUFDSjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsWUFBUSxZQUFZO0FBQUE7QUFBQTs7O0FDckJwQjtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxZQUFRLG9CQUFvQjtBQUM1QixhQUFTLGtCQUFrQixPQUFPO0FBQzlCLGFBQU8sTUFBTSxTQUFTO0FBQUEsSUFDMUI7QUFDQSxZQUFRLG9CQUFvQjtBQUFBO0FBQUE7OztBQ041QjtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxZQUFRLHdCQUF3QjtBQUNoQyxRQUFNLGtCQUFOLE1BQXNCO0FBQUEsTUFDbEIsWUFBWSxNQUFNLE9BQU87QUFDckIsYUFBSyxPQUFPO0FBQ1osYUFBSyxnQkFBZ0IsTUFBTSxjQUFjLEtBQUssS0FBSztBQUNuRCxhQUFLLG9CQUFvQixNQUFNLGtCQUFrQixLQUFLLEtBQUs7QUFDM0QsYUFBSyxjQUFjLE1BQU0sWUFBWSxLQUFLLEtBQUs7QUFDL0MsYUFBSyxTQUFTLE1BQU0sT0FBTyxLQUFLLEtBQUs7QUFDckMsYUFBSyxTQUFTLE1BQU0sT0FBTyxLQUFLLEtBQUs7QUFDckMsYUFBSyxXQUFXLE1BQU0sU0FBUyxLQUFLLEtBQUs7QUFDekMsYUFBSyxpQkFBaUIsTUFBTSxlQUFlLEtBQUssS0FBSztBQUFBLE1BQ3pEO0FBQUEsSUFDSjtBQUNBLGFBQVMsc0JBQXNCLE1BQU0sT0FBTztBQUN4QyxhQUFPLElBQUksZ0JBQWdCLE1BQU0sS0FBSztBQUFBLElBQzFDO0FBQ0EsWUFBUSx3QkFBd0I7QUFBQTtBQUFBOzs7QUNsQmhDO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEsNEJBQTRCLFFBQVEsOEJBQThCLFFBQVEsdUJBQXVCLFFBQVEsa0JBQWtCLFFBQVEsb0JBQW9CLFFBQVEsU0FBUyxRQUFRLDBCQUEwQixRQUFRLGVBQWUsUUFBUSxVQUFVO0FBQzNQLFFBQU1DLE1BQUssUUFBUTtBQUNuQixRQUFNQyxRQUFPLFFBQVE7QUFDckIsUUFBTSxzQkFBc0JELElBQUcsU0FBUyxNQUFNO0FBQzlDLFFBQU0sdUNBQXVDO0FBTTdDLFFBQU0sa0NBQWtDO0FBQ3hDLFFBQU0sb0NBQW9DO0FBSzFDLFFBQU0scUJBQXFCO0FBTTNCLFFBQU0seUJBQXlCO0FBSS9CLGFBQVMsUUFBUSxVQUFVO0FBQ3ZCLGFBQU8sU0FBUyxRQUFRLE9BQU8sR0FBRztBQUFBLElBQ3RDO0FBQ0EsWUFBUSxVQUFVO0FBQ2xCLGFBQVMsYUFBYSxLQUFLLFVBQVU7QUFDakMsYUFBT0MsTUFBSyxRQUFRLEtBQUssUUFBUTtBQUFBLElBQ3JDO0FBQ0EsWUFBUSxlQUFlO0FBQ3ZCLGFBQVMsd0JBQXdCLE9BQU87QUFHcEMsVUFBSSxNQUFNLE9BQU8sQ0FBQyxNQUFNLEtBQUs7QUFDekIsY0FBTSxtQkFBbUIsTUFBTSxPQUFPLENBQUM7QUFDdkMsWUFBSSxxQkFBcUIsT0FBTyxxQkFBcUIsTUFBTTtBQUN2RCxpQkFBTyxNQUFNLE1BQU0sb0NBQW9DO0FBQUEsUUFDM0Q7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxZQUFRLDBCQUEwQjtBQUNsQyxZQUFRLFNBQVMsc0JBQXNCLG9CQUFvQjtBQUMzRCxhQUFTLGtCQUFrQkMsVUFBUztBQUNoQyxhQUFPQSxTQUFRLFFBQVEsbUNBQW1DLE1BQU07QUFBQSxJQUNwRTtBQUNBLFlBQVEsb0JBQW9CO0FBQzVCLGFBQVMsZ0JBQWdCQSxVQUFTO0FBQzlCLGFBQU9BLFNBQVEsUUFBUSxpQ0FBaUMsTUFBTTtBQUFBLElBQ2xFO0FBQ0EsWUFBUSxrQkFBa0I7QUFDMUIsWUFBUSx1QkFBdUIsc0JBQXNCLDhCQUE4QjtBQUNuRixhQUFTLDRCQUE0QixVQUFVO0FBQzNDLGFBQU8sa0JBQWtCLFFBQVEsRUFDNUIsUUFBUSxvQkFBb0IsTUFBTSxFQUNsQyxRQUFRLHdCQUF3QixHQUFHO0FBQUEsSUFDNUM7QUFDQSxZQUFRLDhCQUE4QjtBQUN0QyxhQUFTLDBCQUEwQixVQUFVO0FBQ3pDLGFBQU8sZ0JBQWdCLFFBQVE7QUFBQSxJQUNuQztBQUNBLFlBQVEsNEJBQTRCO0FBQUE7QUFBQTs7O0FDbkVwQztBQUFBLG9EQUFBQyxTQUFBO0FBQUE7QUFPQSxJQUFBQSxRQUFPLFVBQVUsU0FBUyxVQUFVLEtBQUs7QUFDdkMsVUFBSSxPQUFPLFFBQVEsWUFBWSxRQUFRLElBQUk7QUFDekMsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJO0FBQ0osYUFBUSxRQUFRLHlCQUF5QixLQUFLLEdBQUcsR0FBSTtBQUNuRCxZQUFJLE1BQU07QUFBSSxpQkFBTztBQUNyQixjQUFNLElBQUksTUFBTSxNQUFNLFFBQVEsTUFBTSxHQUFHLE1BQU07QUFBQSxNQUMvQztBQUVBLGFBQU87QUFBQSxJQUNUO0FBQUE7QUFBQTs7O0FDbkJBO0FBQUEsaURBQUFDLFNBQUE7QUFBQTtBQU9BLFFBQUksWUFBWTtBQUNoQixRQUFJLFFBQVEsRUFBRSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssSUFBRztBQUMxQyxRQUFJLGNBQWMsU0FBUyxLQUFLO0FBQzlCLFVBQUksSUFBSSxPQUFPLEtBQUs7QUFDbEIsZUFBTztBQUFBLE1BQ1Q7QUFDQSxVQUFJLFFBQVE7QUFDWixVQUFJLFlBQVk7QUFDaEIsVUFBSSxtQkFBbUI7QUFDdkIsVUFBSSxrQkFBa0I7QUFDdEIsVUFBSSxrQkFBa0I7QUFDdEIsVUFBSSxpQkFBaUI7QUFDckIsYUFBTyxRQUFRLElBQUksUUFBUTtBQUN6QixZQUFJLElBQUksV0FBVyxLQUFLO0FBQ3RCLGlCQUFPO0FBQUEsUUFDVDtBQUVBLFlBQUksSUFBSSxRQUFRLE9BQU8sT0FBTyxVQUFVLEtBQUssSUFBSSxNQUFNLEdBQUc7QUFDeEQsaUJBQU87QUFBQSxRQUNUO0FBRUEsWUFBSSxxQkFBcUIsTUFBTSxJQUFJLFdBQVcsT0FBTyxJQUFJLFFBQVEsT0FBTyxLQUFLO0FBQzNFLGNBQUksbUJBQW1CLE9BQU87QUFDNUIsK0JBQW1CLElBQUksUUFBUSxLQUFLLEtBQUs7QUFBQSxVQUMzQztBQUNBLGNBQUksbUJBQW1CLE9BQU87QUFDNUIsZ0JBQUksbUJBQW1CLE1BQU0saUJBQWlCLGtCQUFrQjtBQUM5RCxxQkFBTztBQUFBLFlBQ1Q7QUFDQSw2QkFBaUIsSUFBSSxRQUFRLE1BQU0sS0FBSztBQUN4QyxnQkFBSSxtQkFBbUIsTUFBTSxpQkFBaUIsa0JBQWtCO0FBQzlELHFCQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBRUEsWUFBSSxvQkFBb0IsTUFBTSxJQUFJLFdBQVcsT0FBTyxJQUFJLFFBQVEsT0FBTyxLQUFLO0FBQzFFLDRCQUFrQixJQUFJLFFBQVEsS0FBSyxLQUFLO0FBQ3hDLGNBQUksa0JBQWtCLE9BQU87QUFDM0IsNkJBQWlCLElBQUksUUFBUSxNQUFNLEtBQUs7QUFDeEMsZ0JBQUksbUJBQW1CLE1BQU0saUJBQWlCLGlCQUFpQjtBQUM3RCxxQkFBTztBQUFBLFlBQ1Q7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLFlBQUksb0JBQW9CLE1BQU0sSUFBSSxXQUFXLE9BQU8sSUFBSSxRQUFRLE9BQU8sT0FBTyxRQUFRLEtBQUssSUFBSSxRQUFRLEVBQUUsS0FBSyxJQUFJLFFBQVEsT0FBTyxLQUFLO0FBQ3BJLDRCQUFrQixJQUFJLFFBQVEsS0FBSyxLQUFLO0FBQ3hDLGNBQUksa0JBQWtCLE9BQU87QUFDM0IsNkJBQWlCLElBQUksUUFBUSxNQUFNLEtBQUs7QUFDeEMsZ0JBQUksbUJBQW1CLE1BQU0saUJBQWlCLGlCQUFpQjtBQUM3RCxxQkFBTztBQUFBLFlBQ1Q7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLFlBQUksY0FBYyxNQUFNLElBQUksV0FBVyxPQUFPLElBQUksUUFBUSxPQUFPLEtBQUs7QUFDcEUsY0FBSSxZQUFZLE9BQU87QUFDckIsd0JBQVksSUFBSSxRQUFRLEtBQUssS0FBSztBQUFBLFVBQ3BDO0FBQ0EsY0FBSSxjQUFjLE1BQU0sSUFBSSxZQUFZLE9BQU8sS0FBSztBQUNsRCw4QkFBa0IsSUFBSSxRQUFRLEtBQUssU0FBUztBQUM1QyxnQkFBSSxrQkFBa0IsV0FBVztBQUMvQiwrQkFBaUIsSUFBSSxRQUFRLE1BQU0sU0FBUztBQUM1QyxrQkFBSSxtQkFBbUIsTUFBTSxpQkFBaUIsaUJBQWlCO0FBQzdELHVCQUFPO0FBQUEsY0FDVDtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLFlBQUksSUFBSSxXQUFXLE1BQU07QUFDdkIsY0FBSSxPQUFPLElBQUksUUFBUTtBQUN2QixtQkFBUztBQUNULGNBQUksUUFBUSxNQUFNO0FBRWxCLGNBQUksT0FBTztBQUNULGdCQUFJLElBQUksSUFBSSxRQUFRLE9BQU8sS0FBSztBQUNoQyxnQkFBSSxNQUFNLElBQUk7QUFDWixzQkFBUSxJQUFJO0FBQUEsWUFDZDtBQUFBLFVBQ0Y7QUFFQSxjQUFJLElBQUksV0FBVyxLQUFLO0FBQ3RCLG1CQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0YsT0FBTztBQUNMO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksZUFBZSxTQUFTLEtBQUs7QUFDL0IsVUFBSSxJQUFJLE9BQU8sS0FBSztBQUNsQixlQUFPO0FBQUEsTUFDVDtBQUNBLFVBQUksUUFBUTtBQUNaLGFBQU8sUUFBUSxJQUFJLFFBQVE7QUFDekIsWUFBSSxjQUFjLEtBQUssSUFBSSxNQUFNLEdBQUc7QUFDbEMsaUJBQU87QUFBQSxRQUNUO0FBRUEsWUFBSSxJQUFJLFdBQVcsTUFBTTtBQUN2QixjQUFJLE9BQU8sSUFBSSxRQUFRO0FBQ3ZCLG1CQUFTO0FBQ1QsY0FBSSxRQUFRLE1BQU07QUFFbEIsY0FBSSxPQUFPO0FBQ1QsZ0JBQUksSUFBSSxJQUFJLFFBQVEsT0FBTyxLQUFLO0FBQ2hDLGdCQUFJLE1BQU0sSUFBSTtBQUNaLHNCQUFRLElBQUk7QUFBQSxZQUNkO0FBQUEsVUFDRjtBQUVBLGNBQUksSUFBSSxXQUFXLEtBQUs7QUFDdEIsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRixPQUFPO0FBQ0w7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBRUEsSUFBQUEsUUFBTyxVQUFVLFNBQVMsT0FBTyxLQUFLLFNBQVM7QUFDN0MsVUFBSSxPQUFPLFFBQVEsWUFBWSxRQUFRLElBQUk7QUFDekMsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJLFVBQVUsR0FBRyxHQUFHO0FBQ2xCLGVBQU87QUFBQSxNQUNUO0FBRUEsVUFBSSxRQUFRO0FBR1osVUFBSSxXQUFXLFFBQVEsV0FBVyxPQUFPO0FBQ3ZDLGdCQUFRO0FBQUEsTUFDVjtBQUVBLGFBQU8sTUFBTSxHQUFHO0FBQUEsSUFDbEI7QUFBQTtBQUFBOzs7QUNySkE7QUFBQSw0RUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFJLFNBQVM7QUFDYixRQUFJLG1CQUFtQixRQUFRLFFBQVEsTUFBTTtBQUM3QyxRQUFJLFVBQVUsUUFBUSxNQUFNLFNBQVMsTUFBTTtBQUUzQyxRQUFJQyxTQUFRO0FBQ1osUUFBSSxZQUFZO0FBQ2hCLFFBQUksWUFBWTtBQUNoQixRQUFJQyxVQUFTO0FBQ2IsUUFBSSxVQUFVO0FBUWQsSUFBQUYsUUFBTyxVQUFVLFNBQVMsV0FBVyxLQUFLLE1BQU07QUFDOUMsVUFBSSxVQUFVLE9BQU8sT0FBTyxFQUFFLGlCQUFpQixLQUFLLEdBQUcsSUFBSTtBQUczRCxVQUFJLFFBQVEsbUJBQW1CLFdBQVcsSUFBSSxRQUFRQyxNQUFLLElBQUksR0FBRztBQUNoRSxjQUFNLElBQUksUUFBUSxXQUFXQSxNQUFLO0FBQUEsTUFDcEM7QUFHQSxVQUFJLFVBQVUsS0FBSyxHQUFHLEdBQUc7QUFDdkIsZUFBT0E7QUFBQSxNQUNUO0FBR0EsYUFBTztBQUdQLFNBQUc7QUFDRCxjQUFNLGlCQUFpQixHQUFHO0FBQUEsTUFDNUIsU0FBUyxPQUFPLEdBQUcsS0FBS0MsUUFBTyxLQUFLLEdBQUc7QUFHdkMsYUFBTyxJQUFJLFFBQVEsU0FBUyxJQUFJO0FBQUEsSUFDbEM7QUFBQTtBQUFBOzs7QUN6Q0E7QUFBQTtBQUFBO0FBQUE7QUFFQSxZQUFRLFlBQVksU0FBTztBQUN6QixVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGVBQU8sT0FBTyxVQUFVLEdBQUc7QUFBQSxNQUM3QjtBQUNBLFVBQUksT0FBTyxRQUFRLFlBQVksSUFBSSxLQUFLLE1BQU0sSUFBSTtBQUNoRCxlQUFPLE9BQU8sVUFBVSxPQUFPLEdBQUcsQ0FBQztBQUFBLE1BQ3JDO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFNQSxZQUFRLE9BQU8sQ0FBQyxNQUFNLFNBQVMsS0FBSyxNQUFNLEtBQUssQ0FBQUMsVUFBUUEsTUFBSyxTQUFTLElBQUk7QUFNekUsWUFBUSxlQUFlLENBQUMsS0FBSyxLQUFLLE9BQU8sR0FBRyxVQUFVO0FBQ3BELFVBQUksVUFBVTtBQUFPLGVBQU87QUFDNUIsVUFBSSxDQUFDLFFBQVEsVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLFVBQVUsR0FBRztBQUFHLGVBQU87QUFDL0QsY0FBUyxPQUFPLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxPQUFPLElBQUksS0FBTTtBQUFBLElBQ3pEO0FBTUEsWUFBUSxhQUFhLENBQUMsT0FBTyxJQUFJLEdBQUcsU0FBUztBQUMzQyxVQUFJLE9BQU8sTUFBTSxNQUFNO0FBQ3ZCLFVBQUksQ0FBQztBQUFNO0FBRVgsVUFBSyxRQUFRLEtBQUssU0FBUyxRQUFTLEtBQUssU0FBUyxVQUFVLEtBQUssU0FBUyxTQUFTO0FBQ2pGLFlBQUksS0FBSyxZQUFZLE1BQU07QUFDekIsZUFBSyxRQUFRLE9BQU8sS0FBSztBQUN6QixlQUFLLFVBQVU7QUFBQSxRQUNqQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBTUEsWUFBUSxlQUFlLFVBQVE7QUFDN0IsVUFBSSxLQUFLLFNBQVM7QUFBUyxlQUFPO0FBQ2xDLFVBQUssS0FBSyxVQUFVLElBQUksS0FBSyxVQUFVLE1BQU8sR0FBRztBQUMvQyxhQUFLLFVBQVU7QUFDZixlQUFPO0FBQUEsTUFDVDtBQUNBLGFBQU87QUFBQSxJQUNUO0FBTUEsWUFBUSxpQkFBaUIsV0FBUztBQUNoQyxVQUFJLE1BQU0sU0FBUztBQUFTLGVBQU87QUFDbkMsVUFBSSxNQUFNLFlBQVksUUFBUSxNQUFNO0FBQVEsZUFBTztBQUNuRCxVQUFLLE1BQU0sVUFBVSxJQUFJLE1BQU0sVUFBVSxNQUFPLEdBQUc7QUFDakQsY0FBTSxVQUFVO0FBQ2hCLGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFBSSxNQUFNLFNBQVMsUUFBUSxNQUFNLFVBQVUsTUFBTTtBQUMvQyxjQUFNLFVBQVU7QUFDaEIsZUFBTztBQUFBLE1BQ1Q7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQU1BLFlBQVEsZ0JBQWdCLFVBQVE7QUFDOUIsVUFBSSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsU0FBUztBQUNqRCxlQUFPO0FBQUEsTUFDVDtBQUNBLGFBQU8sS0FBSyxTQUFTLFFBQVEsS0FBSyxVQUFVO0FBQUEsSUFDOUM7QUFNQSxZQUFRLFNBQVMsV0FBUyxNQUFNLE9BQU8sQ0FBQyxLQUFLLFNBQVM7QUFDcEQsVUFBSSxLQUFLLFNBQVM7QUFBUSxZQUFJLEtBQUssS0FBSyxLQUFLO0FBQzdDLFVBQUksS0FBSyxTQUFTO0FBQVMsYUFBSyxPQUFPO0FBQ3ZDLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQyxDQUFDO0FBTUwsWUFBUSxVQUFVLElBQUksU0FBUztBQUM3QixZQUFNLFNBQVMsQ0FBQztBQUNoQixZQUFNLE9BQU8sU0FBTztBQUNsQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNuQyxjQUFJLE1BQU0sSUFBSTtBQUNkLGdCQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksUUFBUSxVQUFVLE9BQU8sS0FBSyxHQUFHO0FBQUEsUUFDNUU7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUNBLFdBQUssSUFBSTtBQUNULGFBQU87QUFBQSxJQUNUO0FBQUE7QUFBQTs7O0FDL0dBO0FBQUEsd0RBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBTSxRQUFRO0FBRWQsSUFBQUEsUUFBTyxVQUFVLENBQUMsS0FBSyxVQUFVLENBQUMsTUFBTTtBQUN0QyxVQUFJLFlBQVksQ0FBQyxNQUFNLFNBQVMsQ0FBQyxNQUFNO0FBQ3JDLFlBQUksZUFBZSxRQUFRLGlCQUFpQixNQUFNLGVBQWUsTUFBTTtBQUN2RSxZQUFJLGNBQWMsS0FBSyxZQUFZLFFBQVEsUUFBUSxrQkFBa0I7QUFDckUsWUFBSSxTQUFTO0FBRWIsWUFBSSxLQUFLLE9BQU87QUFDZCxlQUFLLGdCQUFnQixnQkFBZ0IsTUFBTSxjQUFjLElBQUksR0FBRztBQUM5RCxtQkFBTyxPQUFPLEtBQUs7QUFBQSxVQUNyQjtBQUNBLGlCQUFPLEtBQUs7QUFBQSxRQUNkO0FBRUEsWUFBSSxLQUFLLE9BQU87QUFDZCxpQkFBTyxLQUFLO0FBQUEsUUFDZDtBQUVBLFlBQUksS0FBSyxPQUFPO0FBQ2QsbUJBQVMsU0FBUyxLQUFLLE9BQU87QUFDNUIsc0JBQVUsVUFBVSxLQUFLO0FBQUEsVUFDM0I7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxhQUFPLFVBQVUsR0FBRztBQUFBLElBQ3RCO0FBQUE7QUFBQTs7O0FDOUJBO0FBQUEsbURBQUFDLFNBQUE7QUFBQTtBQUFBO0FBU0EsSUFBQUEsUUFBTyxVQUFVLFNBQVMsS0FBSztBQUM3QixVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGVBQU8sTUFBTSxRQUFRO0FBQUEsTUFDdkI7QUFDQSxVQUFJLE9BQU8sUUFBUSxZQUFZLElBQUksS0FBSyxNQUFNLElBQUk7QUFDaEQsZUFBTyxPQUFPLFdBQVcsT0FBTyxTQUFTLENBQUMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxHQUFHO0FBQUEsTUFDaEU7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUE7OztBQ2pCQTtBQUFBLHdEQUFBQyxTQUFBO0FBQUE7QUFBQTtBQVNBLFFBQU0sV0FBVztBQUVqQixRQUFNLGVBQWUsQ0FBQyxLQUFLLEtBQUssWUFBWTtBQUMxQyxVQUFJLFNBQVMsR0FBRyxNQUFNLE9BQU87QUFDM0IsY0FBTSxJQUFJLFVBQVUsMERBQTBEO0FBQUEsTUFDaEY7QUFFQSxVQUFJLFFBQVEsVUFBVSxRQUFRLEtBQUs7QUFDakMsZUFBTyxPQUFPLEdBQUc7QUFBQSxNQUNuQjtBQUVBLFVBQUksU0FBUyxHQUFHLE1BQU0sT0FBTztBQUMzQixjQUFNLElBQUksVUFBVSw0REFBNEQ7QUFBQSxNQUNsRjtBQUVBLFVBQUksT0FBTyxFQUFFLFlBQVksTUFBTSxHQUFHLFFBQVE7QUFDMUMsVUFBSSxPQUFPLEtBQUssZ0JBQWdCLFdBQVc7QUFDekMsYUFBSyxhQUFhLEtBQUssZ0JBQWdCO0FBQUEsTUFDekM7QUFFQSxVQUFJLFFBQVEsT0FBTyxLQUFLLFVBQVU7QUFDbEMsVUFBSSxZQUFZLE9BQU8sS0FBSyxTQUFTO0FBQ3JDLFVBQUksVUFBVSxPQUFPLEtBQUssT0FBTztBQUNqQyxVQUFJLE9BQU8sT0FBTyxLQUFLLElBQUk7QUFDM0IsVUFBSSxXQUFXLE1BQU0sTUFBTSxNQUFNLE1BQU0sUUFBUSxZQUFZLFVBQVU7QUFFckUsVUFBSSxhQUFhLE1BQU0sZUFBZSxRQUFRLEdBQUc7QUFDL0MsZUFBTyxhQUFhLE1BQU0sVUFBVTtBQUFBLE1BQ3RDO0FBRUEsVUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUc7QUFDekIsVUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUc7QUFFekIsVUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRztBQUN6QixZQUFJLFNBQVMsTUFBTSxNQUFNO0FBQ3pCLFlBQUksS0FBSyxTQUFTO0FBQ2hCLGlCQUFPLElBQUk7QUFBQSxRQUNiO0FBQ0EsWUFBSSxLQUFLLFNBQVMsT0FBTztBQUN2QixpQkFBTztBQUFBLFFBQ1Q7QUFDQSxlQUFPLE1BQU07QUFBQSxNQUNmO0FBRUEsVUFBSSxXQUFXLFdBQVcsR0FBRyxLQUFLLFdBQVcsR0FBRztBQUNoRCxVQUFJLFFBQVEsRUFBRSxLQUFLLEtBQUssR0FBRyxFQUFFO0FBQzdCLFVBQUksWUFBWSxDQUFDO0FBQ2pCLFVBQUksWUFBWSxDQUFDO0FBRWpCLFVBQUksVUFBVTtBQUNaLGNBQU0sV0FBVztBQUNqQixjQUFNLFNBQVMsT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUFBLE1BQ25DO0FBRUEsVUFBSSxJQUFJLEdBQUc7QUFDVCxZQUFJLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUk7QUFDbkMsb0JBQVksZ0JBQWdCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxPQUFPLElBQUk7QUFDNUQsWUFBSSxNQUFNLElBQUk7QUFBQSxNQUNoQjtBQUVBLFVBQUksS0FBSyxHQUFHO0FBQ1Ysb0JBQVksZ0JBQWdCLEdBQUcsR0FBRyxPQUFPLElBQUk7QUFBQSxNQUMvQztBQUVBLFlBQU0sWUFBWTtBQUNsQixZQUFNLFlBQVk7QUFDbEIsWUFBTSxTQUFTLGdCQUFnQixXQUFXLFdBQVcsSUFBSTtBQUV6RCxVQUFJLEtBQUssWUFBWSxNQUFNO0FBQ3pCLGNBQU0sU0FBUyxJQUFJLE1BQU07QUFBQSxNQUMzQixXQUFXLEtBQUssU0FBUyxTQUFVLFVBQVUsU0FBUyxVQUFVLFNBQVUsR0FBRztBQUMzRSxjQUFNLFNBQVMsTUFBTSxNQUFNO0FBQUEsTUFDN0I7QUFFQSxtQkFBYSxNQUFNLFlBQVk7QUFDL0IsYUFBTyxNQUFNO0FBQUEsSUFDZjtBQUVBLGFBQVMsZ0JBQWdCLEtBQUssS0FBSyxTQUFTO0FBQzFDLFVBQUksZUFBZSxlQUFlLEtBQUssS0FBSyxLQUFLLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFDckUsVUFBSSxlQUFlLGVBQWUsS0FBSyxLQUFLLElBQUksT0FBTyxPQUFPLEtBQUssQ0FBQztBQUNwRSxVQUFJLGNBQWMsZUFBZSxLQUFLLEtBQUssTUFBTSxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ3BFLFVBQUksY0FBYyxhQUFhLE9BQU8sV0FBVyxFQUFFLE9BQU8sWUFBWTtBQUN0RSxhQUFPLFlBQVksS0FBSyxHQUFHO0FBQUEsSUFDN0I7QUFFQSxhQUFTLGNBQWMsS0FBSyxLQUFLO0FBQy9CLFVBQUksUUFBUTtBQUNaLFVBQUksUUFBUTtBQUVaLFVBQUksT0FBTyxXQUFXLEtBQUssS0FBSztBQUNoQyxVQUFJLFFBQVEsb0JBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUV6QixhQUFPLE9BQU8sUUFBUSxRQUFRLEtBQUs7QUFDakMsY0FBTSxJQUFJLElBQUk7QUFDZCxpQkFBUztBQUNULGVBQU8sV0FBVyxLQUFLLEtBQUs7QUFBQSxNQUM5QjtBQUVBLGFBQU8sV0FBVyxNQUFNLEdBQUcsS0FBSyxJQUFJO0FBRXBDLGFBQU8sTUFBTSxRQUFRLFFBQVEsS0FBSztBQUNoQyxjQUFNLElBQUksSUFBSTtBQUNkLGlCQUFTO0FBQ1QsZUFBTyxXQUFXLE1BQU0sR0FBRyxLQUFLLElBQUk7QUFBQSxNQUN0QztBQUVBLGNBQVEsQ0FBQyxHQUFHLEtBQUs7QUFDakIsWUFBTSxLQUFLLE9BQU87QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFTQSxhQUFTLGVBQWUsT0FBTyxNQUFNLFNBQVM7QUFDNUMsVUFBSSxVQUFVLE1BQU07QUFDbEIsZUFBTyxFQUFFLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxRQUFRLEVBQUU7QUFBQSxNQUNoRDtBQUVBLFVBQUksU0FBUyxJQUFJLE9BQU8sSUFBSTtBQUM1QixVQUFJLFNBQVMsT0FBTztBQUNwQixVQUFJQyxXQUFVO0FBQ2QsVUFBSSxRQUFRO0FBRVosZUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUs7QUFDL0IsWUFBSSxDQUFDLFlBQVksU0FBUyxJQUFJLE9BQU87QUFFckMsWUFBSSxlQUFlLFdBQVc7QUFDNUIsVUFBQUEsWUFBVztBQUFBLFFBRWIsV0FBVyxlQUFlLE9BQU8sY0FBYyxLQUFLO0FBQ2xELFVBQUFBLFlBQVcsaUJBQWlCLFlBQVksV0FBVyxPQUFPO0FBQUEsUUFFNUQsT0FBTztBQUNMO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLE9BQU87QUFDVCxRQUFBQSxZQUFXLFFBQVEsY0FBYyxPQUFPLFFBQVE7QUFBQSxNQUNsRDtBQUVBLGFBQU8sRUFBRSxTQUFBQSxVQUFTLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTztBQUFBLElBQzNDO0FBRUEsYUFBUyxnQkFBZ0IsS0FBSyxLQUFLLEtBQUssU0FBUztBQUMvQyxVQUFJLFNBQVMsY0FBYyxLQUFLLEdBQUc7QUFDbkMsVUFBSSxTQUFTLENBQUM7QUFDZCxVQUFJLFFBQVE7QUFDWixVQUFJO0FBRUosZUFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUN0QyxZQUFJQyxPQUFNLE9BQU87QUFDakIsWUFBSSxNQUFNLGVBQWUsT0FBTyxLQUFLLEdBQUcsT0FBT0EsSUFBRyxHQUFHLE9BQU87QUFDNUQsWUFBSSxRQUFRO0FBRVosWUFBSSxDQUFDLElBQUksWUFBWSxRQUFRLEtBQUssWUFBWSxJQUFJLFNBQVM7QUFDekQsY0FBSSxLQUFLLE1BQU0sU0FBUyxHQUFHO0FBQ3pCLGlCQUFLLE1BQU0sSUFBSTtBQUFBLFVBQ2pCO0FBRUEsZUFBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDNUIsZUFBSyxTQUFTLEtBQUssVUFBVSxhQUFhLEtBQUssS0FBSztBQUNwRCxrQkFBUUEsT0FBTTtBQUNkO0FBQUEsUUFDRjtBQUVBLFlBQUksSUFBSSxVQUFVO0FBQ2hCLGtCQUFRLFNBQVNBLE1BQUssS0FBSyxPQUFPO0FBQUEsUUFDcEM7QUFFQSxZQUFJLFNBQVMsUUFBUSxJQUFJLFVBQVUsYUFBYSxJQUFJLEtBQUs7QUFDekQsZUFBTyxLQUFLLEdBQUc7QUFDZixnQkFBUUEsT0FBTTtBQUNkLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFFQSxhQUFTLGVBQWUsS0FBSyxZQUFZLFFBQVEsY0FBYyxTQUFTO0FBQ3RFLFVBQUksU0FBUyxDQUFDO0FBRWQsZUFBUyxPQUFPLEtBQUs7QUFDbkIsWUFBSSxFQUFFLE9BQU8sSUFBSTtBQUdqQixZQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxZQUFZLFVBQVUsTUFBTSxHQUFHO0FBQzVELGlCQUFPLEtBQUssU0FBUyxNQUFNO0FBQUEsUUFDN0I7QUFHQSxZQUFJLGdCQUFnQixTQUFTLFlBQVksVUFBVSxNQUFNLEdBQUc7QUFDMUQsaUJBQU8sS0FBSyxTQUFTLE1BQU07QUFBQSxRQUM3QjtBQUFBLE1BQ0Y7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQU1BLGFBQVMsSUFBSSxHQUFHLEdBQUc7QUFDakIsVUFBSSxNQUFNLENBQUM7QUFDWCxlQUFTLElBQUksR0FBRyxJQUFJLEVBQUUsUUFBUTtBQUFLLFlBQUksS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztBQUN4RCxhQUFPO0FBQUEsSUFDVDtBQUVBLGFBQVMsUUFBUSxHQUFHLEdBQUc7QUFDckIsYUFBTyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksS0FBSztBQUFBLElBQ2xDO0FBRUEsYUFBUyxTQUFTLEtBQUssS0FBSyxLQUFLO0FBQy9CLGFBQU8sSUFBSSxLQUFLLFNBQU8sSUFBSSxTQUFTLEdBQUc7QUFBQSxJQUN6QztBQUVBLGFBQVMsV0FBVyxLQUFLLEtBQUs7QUFDNUIsYUFBTyxPQUFPLE9BQU8sR0FBRyxFQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQUEsSUFDNUQ7QUFFQSxhQUFTLFdBQVcsU0FBUyxPQUFPO0FBQ2xDLGFBQU8sVUFBVyxVQUFVLEtBQUssSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUNoRDtBQUVBLGFBQVMsYUFBYSxRQUFRO0FBQzVCLFVBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxFQUFFLElBQUk7QUFDN0IsVUFBSSxRQUFRLFFBQVEsR0FBRztBQUNyQixlQUFPLElBQUksU0FBUyxPQUFPLE1BQU0sT0FBTztBQUFBLE1BQzFDO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFFQSxhQUFTLGlCQUFpQixHQUFHLEdBQUcsU0FBUztBQUN2QyxhQUFPLElBQUksSUFBSyxJQUFJLE1BQU0sSUFBSyxLQUFLLE1BQU07QUFBQSxJQUM1QztBQUVBLGFBQVMsV0FBVyxLQUFLO0FBQ3ZCLGFBQU8sWUFBWSxLQUFLLEdBQUc7QUFBQSxJQUM3QjtBQUVBLGFBQVMsU0FBUyxPQUFPLEtBQUssU0FBUztBQUNyQyxVQUFJLENBQUMsSUFBSSxVQUFVO0FBQ2pCLGVBQU87QUFBQSxNQUNUO0FBRUEsVUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLFNBQVMsT0FBTyxLQUFLLEVBQUUsTUFBTTtBQUNyRCxVQUFJLFFBQVEsUUFBUSxlQUFlO0FBRW5DLGNBQVE7QUFBQSxhQUNEO0FBQ0gsaUJBQU87QUFBQSxhQUNKO0FBQ0gsaUJBQU8sUUFBUSxPQUFPO0FBQUEsYUFDbkI7QUFDSCxpQkFBTyxRQUFRLFdBQVc7QUFBQSxpQkFDbkI7QUFDUCxpQkFBTyxRQUFRLE9BQU8sVUFBVSxLQUFLO0FBQUEsUUFDdkM7QUFBQTtBQUFBLElBRUo7QUFNQSxpQkFBYSxRQUFRLENBQUM7QUFDdEIsaUJBQWEsYUFBYSxNQUFPLGFBQWEsUUFBUSxDQUFDO0FBTXZELElBQUFGLFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQy9SakI7QUFBQSxvREFBQUcsU0FBQTtBQUFBO0FBQUE7QUFTQSxRQUFNLE9BQU8sUUFBUTtBQUNyQixRQUFNLGVBQWU7QUFFckIsUUFBTSxXQUFXLFNBQU8sUUFBUSxRQUFRLE9BQU8sUUFBUSxZQUFZLENBQUMsTUFBTSxRQUFRLEdBQUc7QUFFckYsUUFBTSxZQUFZLGNBQVk7QUFDNUIsYUFBTyxXQUFTLGFBQWEsT0FBTyxPQUFPLEtBQUssSUFBSSxPQUFPLEtBQUs7QUFBQSxJQUNsRTtBQUVBLFFBQU0sZUFBZSxXQUFTO0FBQzVCLGFBQU8sT0FBTyxVQUFVLFlBQWEsT0FBTyxVQUFVLFlBQVksVUFBVTtBQUFBLElBQzlFO0FBRUEsUUFBTSxXQUFXLFNBQU8sT0FBTyxVQUFVLENBQUMsR0FBRztBQUU3QyxRQUFNLFFBQVEsV0FBUztBQUNyQixVQUFJLFFBQVEsR0FBRztBQUNmLFVBQUksUUFBUTtBQUNaLFVBQUksTUFBTSxPQUFPO0FBQUssZ0JBQVEsTUFBTSxNQUFNLENBQUM7QUFDM0MsVUFBSSxVQUFVO0FBQUssZUFBTztBQUMxQixhQUFPLE1BQU0sRUFBRSxXQUFXO0FBQUk7QUFDOUIsYUFBTyxRQUFRO0FBQUEsSUFDakI7QUFFQSxRQUFNLFlBQVksQ0FBQyxPQUFPLEtBQUssWUFBWTtBQUN6QyxVQUFJLE9BQU8sVUFBVSxZQUFZLE9BQU8sUUFBUSxVQUFVO0FBQ3hELGVBQU87QUFBQSxNQUNUO0FBQ0EsYUFBTyxRQUFRLGNBQWM7QUFBQSxJQUMvQjtBQUVBLFFBQU0sTUFBTSxDQUFDLE9BQU8sV0FBVyxhQUFhO0FBQzFDLFVBQUksWUFBWSxHQUFHO0FBQ2pCLFlBQUksT0FBTyxNQUFNLE9BQU8sTUFBTSxNQUFNO0FBQ3BDLFlBQUk7QUFBTSxrQkFBUSxNQUFNLE1BQU0sQ0FBQztBQUMvQixnQkFBUyxPQUFPLE1BQU0sU0FBUyxPQUFPLFlBQVksSUFBSSxXQUFXLEdBQUc7QUFBQSxNQUN0RTtBQUNBLFVBQUksYUFBYSxPQUFPO0FBQ3RCLGVBQU8sT0FBTyxLQUFLO0FBQUEsTUFDckI7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQU0sV0FBVyxDQUFDLE9BQU8sY0FBYztBQUNyQyxVQUFJLFdBQVcsTUFBTSxPQUFPLE1BQU0sTUFBTTtBQUN4QyxVQUFJLFVBQVU7QUFDWixnQkFBUSxNQUFNLE1BQU0sQ0FBQztBQUNyQjtBQUFBLE1BQ0Y7QUFDQSxhQUFPLE1BQU0sU0FBUztBQUFXLGdCQUFRLE1BQU07QUFDL0MsYUFBTyxXQUFZLE1BQU0sUUFBUztBQUFBLElBQ3BDO0FBRUEsUUFBTSxhQUFhLENBQUMsT0FBTyxZQUFZO0FBQ3JDLFlBQU0sVUFBVSxLQUFLLENBQUMsR0FBRyxNQUFNLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUM7QUFDekQsWUFBTSxVQUFVLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQztBQUV6RCxVQUFJLFNBQVMsUUFBUSxVQUFVLEtBQUs7QUFDcEMsVUFBSSxZQUFZO0FBQ2hCLFVBQUksWUFBWTtBQUNoQixVQUFJO0FBRUosVUFBSSxNQUFNLFVBQVUsUUFBUTtBQUMxQixvQkFBWSxNQUFNLFVBQVUsS0FBSyxHQUFHO0FBQUEsTUFDdEM7QUFFQSxVQUFJLE1BQU0sVUFBVSxRQUFRO0FBQzFCLG9CQUFZLEtBQUssU0FBUyxNQUFNLFVBQVUsS0FBSyxHQUFHO0FBQUEsTUFDcEQ7QUFFQSxVQUFJLGFBQWEsV0FBVztBQUMxQixpQkFBUyxHQUFHLGFBQWE7QUFBQSxNQUMzQixPQUFPO0FBQ0wsaUJBQVMsYUFBYTtBQUFBLE1BQ3hCO0FBRUEsVUFBSSxRQUFRLE1BQU07QUFDaEIsZUFBTyxJQUFJLFNBQVM7QUFBQSxNQUN0QjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBTSxVQUFVLENBQUMsR0FBRyxHQUFHLFdBQVcsWUFBWTtBQUM1QyxVQUFJLFdBQVc7QUFDYixlQUFPLGFBQWEsR0FBRyxHQUFHLEVBQUUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQUEsTUFDdkQ7QUFFQSxVQUFJLFFBQVEsT0FBTyxhQUFhLENBQUM7QUFDakMsVUFBSSxNQUFNO0FBQUcsZUFBTztBQUVwQixVQUFJLE9BQU8sT0FBTyxhQUFhLENBQUM7QUFDaEMsYUFBTyxJQUFJLFNBQVM7QUFBQSxJQUN0QjtBQUVBLFFBQU0sVUFBVSxDQUFDLE9BQU8sS0FBSyxZQUFZO0FBQ3ZDLFVBQUksTUFBTSxRQUFRLEtBQUssR0FBRztBQUN4QixZQUFJLE9BQU8sUUFBUSxTQUFTO0FBQzVCLFlBQUksU0FBUyxRQUFRLFVBQVUsS0FBSztBQUNwQyxlQUFPLE9BQU8sSUFBSSxTQUFTLE1BQU0sS0FBSyxHQUFHLE9BQU8sTUFBTSxLQUFLLEdBQUc7QUFBQSxNQUNoRTtBQUNBLGFBQU8sYUFBYSxPQUFPLEtBQUssT0FBTztBQUFBLElBQ3pDO0FBRUEsUUFBTSxhQUFhLElBQUksU0FBUztBQUM5QixhQUFPLElBQUksV0FBVyw4QkFBOEIsS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDM0U7QUFFQSxRQUFNLGVBQWUsQ0FBQyxPQUFPLEtBQUssWUFBWTtBQUM1QyxVQUFJLFFBQVEsaUJBQWlCO0FBQU0sY0FBTSxXQUFXLENBQUMsT0FBTyxHQUFHLENBQUM7QUFDaEUsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUVBLFFBQU0sY0FBYyxDQUFDLE1BQU0sWUFBWTtBQUNyQyxVQUFJLFFBQVEsaUJBQWlCLE1BQU07QUFDakMsY0FBTSxJQUFJLFVBQVUsa0JBQWtCLHNCQUFzQjtBQUFBLE1BQzlEO0FBQ0EsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUVBLFFBQU0sY0FBYyxDQUFDLE9BQU8sS0FBSyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU07QUFDMUQsVUFBSSxJQUFJLE9BQU8sS0FBSztBQUNwQixVQUFJLElBQUksT0FBTyxHQUFHO0FBRWxCLFVBQUksQ0FBQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxVQUFVLENBQUMsR0FBRztBQUNoRCxZQUFJLFFBQVEsaUJBQWlCO0FBQU0sZ0JBQU0sV0FBVyxDQUFDLE9BQU8sR0FBRyxDQUFDO0FBQ2hFLGVBQU8sQ0FBQztBQUFBLE1BQ1Y7QUFHQSxVQUFJLE1BQU07QUFBRyxZQUFJO0FBQ2pCLFVBQUksTUFBTTtBQUFHLFlBQUk7QUFFakIsVUFBSSxhQUFhLElBQUk7QUFDckIsVUFBSSxjQUFjLE9BQU8sS0FBSztBQUM5QixVQUFJLFlBQVksT0FBTyxHQUFHO0FBQzFCLFVBQUksYUFBYSxPQUFPLElBQUk7QUFDNUIsYUFBTyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDO0FBRWpDLFVBQUksU0FBUyxNQUFNLFdBQVcsS0FBSyxNQUFNLFNBQVMsS0FBSyxNQUFNLFVBQVU7QUFDdkUsVUFBSSxTQUFTLFNBQVMsS0FBSyxJQUFJLFlBQVksUUFBUSxVQUFVLFFBQVEsV0FBVyxNQUFNLElBQUk7QUFDMUYsVUFBSSxXQUFXLFdBQVcsU0FBUyxVQUFVLE9BQU8sS0FBSyxPQUFPLE1BQU07QUFDdEUsVUFBSSxTQUFTLFFBQVEsYUFBYSxVQUFVLFFBQVE7QUFFcEQsVUFBSSxRQUFRLFdBQVcsU0FBUyxHQUFHO0FBQ2pDLGVBQU8sUUFBUSxTQUFTLE9BQU8sTUFBTSxHQUFHLFNBQVMsS0FBSyxNQUFNLEdBQUcsTUFBTSxPQUFPO0FBQUEsTUFDOUU7QUFFQSxVQUFJLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsRUFBRTtBQUMzQyxVQUFJLE9BQU8sU0FBTyxNQUFNLE1BQU0sSUFBSSxjQUFjLGFBQWEsS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDO0FBQy9FLFVBQUksUUFBUSxDQUFDO0FBQ2IsVUFBSSxRQUFRO0FBRVosYUFBTyxhQUFhLEtBQUssSUFBSSxLQUFLLEdBQUc7QUFDbkMsWUFBSSxRQUFRLFlBQVksUUFBUSxPQUFPLEdBQUc7QUFDeEMsZUFBSyxDQUFDO0FBQUEsUUFDUixPQUFPO0FBQ0wsZ0JBQU0sS0FBSyxJQUFJLE9BQU8sR0FBRyxLQUFLLEdBQUcsUUFBUSxRQUFRLENBQUM7QUFBQSxRQUNwRDtBQUNBLFlBQUksYUFBYSxJQUFJLE9BQU8sSUFBSTtBQUNoQztBQUFBLE1BQ0Y7QUFFQSxVQUFJLFFBQVEsWUFBWSxNQUFNO0FBQzVCLGVBQU8sT0FBTyxJQUNWLFdBQVcsT0FBTyxPQUFPLElBQ3pCLFFBQVEsT0FBTyxNQUFNLEVBQUUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQUEsTUFDdEQ7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQU0sY0FBYyxDQUFDLE9BQU8sS0FBSyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU07QUFDMUQsVUFBSyxDQUFDLFNBQVMsS0FBSyxLQUFLLE1BQU0sU0FBUyxLQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxTQUFTLEdBQUk7QUFDaEYsZUFBTyxhQUFhLE9BQU8sS0FBSyxPQUFPO0FBQUEsTUFDekM7QUFHQSxVQUFJLFNBQVMsUUFBUSxjQUFjLFNBQU8sT0FBTyxhQUFhLEdBQUc7QUFDakUsVUFBSSxJQUFJLEdBQUcsUUFBUSxXQUFXLENBQUM7QUFDL0IsVUFBSSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUM7QUFFN0IsVUFBSSxhQUFhLElBQUk7QUFDckIsVUFBSSxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUM7QUFDdkIsVUFBSSxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUM7QUFFdkIsVUFBSSxRQUFRLFdBQVcsU0FBUyxHQUFHO0FBQ2pDLGVBQU8sUUFBUSxLQUFLLEtBQUssT0FBTyxPQUFPO0FBQUEsTUFDekM7QUFFQSxVQUFJLFFBQVEsQ0FBQztBQUNiLFVBQUksUUFBUTtBQUVaLGFBQU8sYUFBYSxLQUFLLElBQUksS0FBSyxHQUFHO0FBQ25DLGNBQU0sS0FBSyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQzNCLFlBQUksYUFBYSxJQUFJLE9BQU8sSUFBSTtBQUNoQztBQUFBLE1BQ0Y7QUFFQSxVQUFJLFFBQVEsWUFBWSxNQUFNO0FBQzVCLGVBQU8sUUFBUSxPQUFPLE1BQU0sRUFBRSxNQUFNLE9BQU8sUUFBUSxDQUFDO0FBQUEsTUFDdEQ7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQU0sT0FBTyxDQUFDLE9BQU8sS0FBSyxNQUFNLFVBQVUsQ0FBQyxNQUFNO0FBQy9DLFVBQUksT0FBTyxRQUFRLGFBQWEsS0FBSyxHQUFHO0FBQ3RDLGVBQU8sQ0FBQyxLQUFLO0FBQUEsTUFDZjtBQUVBLFVBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLGFBQWEsR0FBRyxHQUFHO0FBQzlDLGVBQU8sYUFBYSxPQUFPLEtBQUssT0FBTztBQUFBLE1BQ3pDO0FBRUEsVUFBSSxPQUFPLFNBQVMsWUFBWTtBQUM5QixlQUFPLEtBQUssT0FBTyxLQUFLLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLE1BQ2hEO0FBRUEsVUFBSSxTQUFTLElBQUksR0FBRztBQUNsQixlQUFPLEtBQUssT0FBTyxLQUFLLEdBQUcsSUFBSTtBQUFBLE1BQ2pDO0FBRUEsVUFBSSxPQUFPLEVBQUUsR0FBRyxRQUFRO0FBQ3hCLFVBQUksS0FBSyxZQUFZO0FBQU0sYUFBSyxPQUFPO0FBQ3ZDLGFBQU8sUUFBUSxLQUFLLFFBQVE7QUFFNUIsVUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHO0FBQ25CLFlBQUksUUFBUSxRQUFRLENBQUMsU0FBUyxJQUFJO0FBQUcsaUJBQU8sWUFBWSxNQUFNLElBQUk7QUFDbEUsZUFBTyxLQUFLLE9BQU8sS0FBSyxHQUFHLElBQUk7QUFBQSxNQUNqQztBQUVBLFVBQUksU0FBUyxLQUFLLEtBQUssU0FBUyxHQUFHLEdBQUc7QUFDcEMsZUFBTyxZQUFZLE9BQU8sS0FBSyxNQUFNLElBQUk7QUFBQSxNQUMzQztBQUVBLGFBQU8sWUFBWSxPQUFPLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUk7QUFBQSxJQUNsRTtBQUVBLElBQUFBLFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ3hQakI7QUFBQSxzREFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFNLE9BQU87QUFDYixRQUFNLFFBQVE7QUFFZCxRQUFNLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxNQUFNO0FBQ3JDLFVBQUksT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLE1BQU07QUFDaEMsWUFBSSxlQUFlLE1BQU0sZUFBZSxNQUFNO0FBQzlDLFlBQUksY0FBYyxLQUFLLFlBQVksUUFBUSxRQUFRLGtCQUFrQjtBQUNyRSxZQUFJLFVBQVUsaUJBQWlCLFFBQVEsZ0JBQWdCO0FBQ3ZELFlBQUksU0FBUyxRQUFRLGtCQUFrQixPQUFPLE9BQU87QUFDckQsWUFBSSxTQUFTO0FBRWIsWUFBSSxLQUFLLFdBQVcsTUFBTTtBQUN4QixpQkFBTyxTQUFTLEtBQUs7QUFBQSxRQUN2QjtBQUNBLFlBQUksS0FBSyxZQUFZLE1BQU07QUFDekIsaUJBQU8sU0FBUyxLQUFLO0FBQUEsUUFDdkI7QUFFQSxZQUFJLEtBQUssU0FBUyxRQUFRO0FBQ3hCLGlCQUFPLFVBQVcsU0FBUyxLQUFLLFFBQVM7QUFBQSxRQUMzQztBQUVBLFlBQUksS0FBSyxTQUFTLFNBQVM7QUFDekIsaUJBQU8sVUFBVyxTQUFTLEtBQUssUUFBUztBQUFBLFFBQzNDO0FBRUEsWUFBSSxLQUFLLFNBQVMsU0FBUztBQUN6QixpQkFBTyxLQUFLLEtBQUssU0FBUyxVQUFVLEtBQU0sVUFBVSxLQUFLLFFBQVE7QUFBQSxRQUNuRTtBQUVBLFlBQUksS0FBSyxPQUFPO0FBQ2QsaUJBQU8sS0FBSztBQUFBLFFBQ2Q7QUFFQSxZQUFJLEtBQUssU0FBUyxLQUFLLFNBQVMsR0FBRztBQUNqQyxjQUFJLE9BQU8sTUFBTSxPQUFPLEtBQUssS0FBSztBQUNsQyxjQUFJLFFBQVEsS0FBSyxHQUFHLE1BQU0sRUFBRSxHQUFHLFNBQVMsTUFBTSxPQUFPLFNBQVMsS0FBSyxDQUFDO0FBRXBFLGNBQUksTUFBTSxXQUFXLEdBQUc7QUFDdEIsbUJBQU8sS0FBSyxTQUFTLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxXQUFXO0FBQUEsVUFDOUQ7QUFBQSxRQUNGO0FBRUEsWUFBSSxLQUFLLE9BQU87QUFDZCxtQkFBUyxTQUFTLEtBQUssT0FBTztBQUM1QixzQkFBVSxLQUFLLE9BQU8sSUFBSTtBQUFBLFVBQzVCO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTyxLQUFLLEdBQUc7QUFBQSxJQUNqQjtBQUVBLElBQUFBLFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ3hEakI7QUFBQSxxREFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFNLE9BQU87QUFDYixRQUFNLFlBQVk7QUFDbEIsUUFBTSxRQUFRO0FBRWQsUUFBTSxTQUFTLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxVQUFVLFVBQVU7QUFDMUQsVUFBSSxTQUFTLENBQUM7QUFFZCxjQUFRLENBQUMsRUFBRSxPQUFPLEtBQUs7QUFDdkIsY0FBUSxDQUFDLEVBQUUsT0FBTyxLQUFLO0FBRXZCLFVBQUksQ0FBQyxNQUFNO0FBQVEsZUFBTztBQUMxQixVQUFJLENBQUMsTUFBTSxRQUFRO0FBQ2pCLGVBQU8sVUFBVSxNQUFNLFFBQVEsS0FBSyxFQUFFLElBQUksU0FBTyxJQUFJLE1BQU0sSUFBSTtBQUFBLE1BQ2pFO0FBRUEsZUFBUyxRQUFRLE9BQU87QUFDdEIsWUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3ZCLG1CQUFTLFNBQVMsTUFBTTtBQUN0QixtQkFBTyxLQUFLLE9BQU8sT0FBTyxPQUFPLE9BQU8sQ0FBQztBQUFBLFVBQzNDO0FBQUEsUUFDRixPQUFPO0FBQ0wsbUJBQVMsT0FBTyxPQUFPO0FBQ3JCLGdCQUFJLFlBQVksUUFBUSxPQUFPLFFBQVE7QUFBVSxvQkFBTSxJQUFJO0FBQzNELG1CQUFPLEtBQUssTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLE1BQU0sS0FBSyxPQUFPLElBQUssT0FBTyxHQUFJO0FBQUEsVUFDNUU7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBLGFBQU8sTUFBTSxRQUFRLE1BQU07QUFBQSxJQUM3QjtBQUVBLFFBQU0sU0FBUyxDQUFDLEtBQUssVUFBVSxDQUFDLE1BQU07QUFDcEMsVUFBSSxhQUFhLFFBQVEsZUFBZSxTQUFTLE1BQU8sUUFBUTtBQUVoRSxVQUFJLE9BQU8sQ0FBQyxNQUFNLFNBQVMsQ0FBQyxNQUFNO0FBQ2hDLGFBQUssUUFBUSxDQUFDO0FBRWQsWUFBSSxJQUFJO0FBQ1IsWUFBSSxJQUFJLE9BQU87QUFFZixlQUFPLEVBQUUsU0FBUyxXQUFXLEVBQUUsU0FBUyxVQUFVLEVBQUUsUUFBUTtBQUMxRCxjQUFJLEVBQUU7QUFDTixjQUFJLEVBQUU7QUFBQSxRQUNSO0FBRUEsWUFBSSxLQUFLLFdBQVcsS0FBSyxRQUFRO0FBQy9CLFlBQUUsS0FBSyxPQUFPLEVBQUUsSUFBSSxHQUFHLFVBQVUsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUNoRDtBQUFBLFFBQ0Y7QUFFQSxZQUFJLEtBQUssU0FBUyxXQUFXLEtBQUssWUFBWSxRQUFRLEtBQUssTUFBTSxXQUFXLEdBQUc7QUFDN0UsWUFBRSxLQUFLLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLEtBQUssU0FBUyxLQUFLLFNBQVMsR0FBRztBQUNqQyxjQUFJLE9BQU8sTUFBTSxPQUFPLEtBQUssS0FBSztBQUVsQyxjQUFJLE1BQU0sYUFBYSxHQUFHLE1BQU0sUUFBUSxNQUFNLFVBQVUsR0FBRztBQUN6RCxrQkFBTSxJQUFJLFdBQVcscUdBQXFHO0FBQUEsVUFDNUg7QUFFQSxjQUFJLFFBQVEsS0FBSyxHQUFHLE1BQU0sT0FBTztBQUNqQyxjQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3RCLG9CQUFRLFVBQVUsTUFBTSxPQUFPO0FBQUEsVUFDakM7QUFFQSxZQUFFLEtBQUssT0FBTyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUM7QUFDN0IsZUFBSyxRQUFRLENBQUM7QUFDZDtBQUFBLFFBQ0Y7QUFFQSxZQUFJLFVBQVUsTUFBTSxhQUFhLElBQUk7QUFDckMsWUFBSSxRQUFRLEtBQUs7QUFDakIsWUFBSSxRQUFRO0FBRVosZUFBTyxNQUFNLFNBQVMsV0FBVyxNQUFNLFNBQVMsVUFBVSxNQUFNLFFBQVE7QUFDdEUsa0JBQVEsTUFBTTtBQUNkLGtCQUFRLE1BQU07QUFBQSxRQUNoQjtBQUVBLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFDMUMsY0FBSSxRQUFRLEtBQUssTUFBTTtBQUV2QixjQUFJLE1BQU0sU0FBUyxXQUFXLEtBQUssU0FBUyxTQUFTO0FBQ25ELGdCQUFJLE1BQU07QUFBRyxvQkFBTSxLQUFLLEVBQUU7QUFDMUIsa0JBQU0sS0FBSyxFQUFFO0FBQ2I7QUFBQSxVQUNGO0FBRUEsY0FBSSxNQUFNLFNBQVMsU0FBUztBQUMxQixjQUFFLEtBQUssT0FBTyxFQUFFLElBQUksR0FBRyxPQUFPLE9BQU8sQ0FBQztBQUN0QztBQUFBLFVBQ0Y7QUFFQSxjQUFJLE1BQU0sU0FBUyxNQUFNLFNBQVMsUUFBUTtBQUN4QyxrQkFBTSxLQUFLLE9BQU8sTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDM0M7QUFBQSxVQUNGO0FBRUEsY0FBSSxNQUFNLE9BQU87QUFDZixpQkFBSyxPQUFPLElBQUk7QUFBQSxVQUNsQjtBQUFBLFFBQ0Y7QUFFQSxlQUFPO0FBQUEsTUFDVDtBQUVBLGFBQU8sTUFBTSxRQUFRLEtBQUssR0FBRyxDQUFDO0FBQUEsSUFDaEM7QUFFQSxJQUFBQSxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUNoSGpCO0FBQUEsd0RBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsSUFBQUEsUUFBTyxVQUFVO0FBQUEsTUFDZixZQUFZLE9BQU87QUFBQSxNQUduQixRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFHUixrQkFBa0I7QUFBQSxNQUNsQixrQkFBa0I7QUFBQSxNQUNsQixrQkFBa0I7QUFBQSxNQUNsQixrQkFBa0I7QUFBQSxNQUVsQix1QkFBdUI7QUFBQSxNQUN2Qix3QkFBd0I7QUFBQSxNQUV4QixlQUFlO0FBQUEsTUFHZixnQkFBZ0I7QUFBQSxNQUNoQixTQUFTO0FBQUEsTUFDVCxnQkFBZ0I7QUFBQSxNQUNoQixlQUFlO0FBQUEsTUFDZixzQkFBc0I7QUFBQSxNQUN0Qix3QkFBd0I7QUFBQSxNQUN4QixZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsTUFDVixtQkFBbUI7QUFBQSxNQUNuQixZQUFZO0FBQUEsTUFDWix1QkFBdUI7QUFBQSxNQUN2QixnQkFBZ0I7QUFBQSxNQUNoQixvQkFBb0I7QUFBQSxNQUNwQixXQUFXO0FBQUEsTUFDWCxtQkFBbUI7QUFBQSxNQUNuQix5QkFBeUI7QUFBQSxNQUN6Qix1QkFBdUI7QUFBQSxNQUN2QiwwQkFBMEI7QUFBQSxNQUMxQixnQkFBZ0I7QUFBQSxNQUNoQixxQkFBcUI7QUFBQSxNQUNyQixjQUFjO0FBQUEsTUFDZCxXQUFXO0FBQUEsTUFDWCxvQkFBb0I7QUFBQSxNQUNwQiwwQkFBMEI7QUFBQSxNQUMxQix3QkFBd0I7QUFBQSxNQUN4QiwyQkFBMkI7QUFBQSxNQUMzQixnQkFBZ0I7QUFBQSxNQUNoQixtQkFBbUI7QUFBQSxNQUNuQixZQUFZO0FBQUEsTUFDWixVQUFVO0FBQUEsTUFDVixpQkFBaUI7QUFBQSxNQUNqQixvQkFBb0I7QUFBQSxNQUNwQiwrQkFBK0I7QUFBQSxJQUNqQztBQUFBO0FBQUE7OztBQ3hEQTtBQUFBLG9EQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQU0sWUFBWTtBQU1sQixRQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixJQUFJO0FBTUosUUFBTUMsU0FBUSxDQUFDLE9BQU8sVUFBVSxDQUFDLE1BQU07QUFDckMsVUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixjQUFNLElBQUksVUFBVSxtQkFBbUI7QUFBQSxNQUN6QztBQUVBLFVBQUksT0FBTyxXQUFXLENBQUM7QUFDdkIsVUFBSSxNQUFNLE9BQU8sS0FBSyxjQUFjLFdBQVcsS0FBSyxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUk7QUFDdEYsVUFBSSxNQUFNLFNBQVMsS0FBSztBQUN0QixjQUFNLElBQUksWUFBWSxpQkFBaUIsTUFBTSxvQ0FBb0MsTUFBTTtBQUFBLE1BQ3pGO0FBRUEsVUFBSSxNQUFNLEVBQUUsTUFBTSxRQUFRLE9BQU8sT0FBTyxDQUFDLEVBQUU7QUFDM0MsVUFBSSxRQUFRLENBQUMsR0FBRztBQUNoQixVQUFJLFFBQVE7QUFDWixVQUFJLE9BQU87QUFDWCxVQUFJLFdBQVc7QUFDZixVQUFJLFNBQVMsTUFBTTtBQUNuQixVQUFJLFFBQVE7QUFDWixVQUFJLFFBQVE7QUFDWixVQUFJO0FBQ0osVUFBSSxPQUFPLENBQUM7QUFNWixZQUFNLFVBQVUsTUFBTSxNQUFNO0FBQzVCLFlBQU0sT0FBTyxVQUFRO0FBQ25CLFlBQUksS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLE9BQU87QUFDL0MsZUFBSyxPQUFPO0FBQUEsUUFDZDtBQUVBLFlBQUksUUFBUSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsUUFBUTtBQUN4RCxlQUFLLFNBQVMsS0FBSztBQUNuQjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLE1BQU0sS0FBSyxJQUFJO0FBQ3JCLGFBQUssU0FBUztBQUNkLGFBQUssT0FBTztBQUNaLGVBQU87QUFDUCxlQUFPO0FBQUEsTUFDVDtBQUVBLFdBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQixhQUFPLFFBQVEsUUFBUTtBQUNyQixnQkFBUSxNQUFNLE1BQU0sU0FBUztBQUM3QixnQkFBUSxRQUFRO0FBTWhCLFlBQUksVUFBVSxpQ0FBaUMsVUFBVSxxQkFBcUI7QUFDNUU7QUFBQSxRQUNGO0FBTUEsWUFBSSxVQUFVLGdCQUFnQjtBQUM1QixlQUFLLEVBQUUsTUFBTSxRQUFRLFFBQVEsUUFBUSxlQUFlLFFBQVEsTUFBTSxRQUFRLEVBQUUsQ0FBQztBQUM3RTtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsMkJBQTJCO0FBQ3ZDLGVBQUssRUFBRSxNQUFNLFFBQVEsT0FBTyxPQUFPLE1BQU0sQ0FBQztBQUMxQztBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsMEJBQTBCO0FBQ3RDO0FBRUEsY0FBSSxTQUFTO0FBQ2IsY0FBSTtBQUVKLGlCQUFPLFFBQVEsV0FBVyxPQUFPLFFBQVEsSUFBSTtBQUMzQyxxQkFBUztBQUVULGdCQUFJLFNBQVMsMEJBQTBCO0FBQ3JDO0FBQ0E7QUFBQSxZQUNGO0FBRUEsZ0JBQUksU0FBUyxnQkFBZ0I7QUFDM0IsdUJBQVMsUUFBUTtBQUNqQjtBQUFBLFlBQ0Y7QUFFQSxnQkFBSSxTQUFTLDJCQUEyQjtBQUN0QztBQUVBLGtCQUFJLGFBQWEsR0FBRztBQUNsQjtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUVBLGVBQUssRUFBRSxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQzVCO0FBQUEsUUFDRjtBQU1BLFlBQUksVUFBVSx1QkFBdUI7QUFDbkMsa0JBQVEsS0FBSyxFQUFFLE1BQU0sU0FBUyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3pDLGdCQUFNLEtBQUssS0FBSztBQUNoQixlQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sQ0FBQztBQUM1QjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLFVBQVUsd0JBQXdCO0FBQ3BDLGNBQUksTUFBTSxTQUFTLFNBQVM7QUFDMUIsaUJBQUssRUFBRSxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQzVCO0FBQUEsVUFDRjtBQUNBLGtCQUFRLE1BQU0sSUFBSTtBQUNsQixlQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sQ0FBQztBQUM1QixrQkFBUSxNQUFNLE1BQU0sU0FBUztBQUM3QjtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUscUJBQXFCLFVBQVUscUJBQXFCLFVBQVUsZUFBZTtBQUN6RixjQUFJLE9BQU87QUFDWCxjQUFJO0FBRUosY0FBSSxRQUFRLGVBQWUsTUFBTTtBQUMvQixvQkFBUTtBQUFBLFVBQ1Y7QUFFQSxpQkFBTyxRQUFRLFdBQVcsT0FBTyxRQUFRLElBQUk7QUFDM0MsZ0JBQUksU0FBUyxnQkFBZ0I7QUFDM0IsdUJBQVMsT0FBTyxRQUFRO0FBQ3hCO0FBQUEsWUFDRjtBQUVBLGdCQUFJLFNBQVMsTUFBTTtBQUNqQixrQkFBSSxRQUFRLGVBQWU7QUFBTSx5QkFBUztBQUMxQztBQUFBLFlBQ0Y7QUFFQSxxQkFBUztBQUFBLFVBQ1g7QUFFQSxlQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sQ0FBQztBQUM1QjtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsdUJBQXVCO0FBQ25DO0FBRUEsY0FBSSxTQUFTLEtBQUssU0FBUyxLQUFLLE1BQU0sTUFBTSxFQUFFLE1BQU0sT0FBTyxNQUFNLFdBQVc7QUFDNUUsY0FBSSxRQUFRO0FBQUEsWUFDVixNQUFNO0FBQUEsWUFDTixNQUFNO0FBQUEsWUFDTixPQUFPO0FBQUEsWUFDUDtBQUFBLFlBQ0E7QUFBQSxZQUNBLFFBQVE7QUFBQSxZQUNSLFFBQVE7QUFBQSxZQUNSLE9BQU8sQ0FBQztBQUFBLFVBQ1Y7QUFFQSxrQkFBUSxLQUFLLEtBQUs7QUFDbEIsZ0JBQU0sS0FBSyxLQUFLO0FBQ2hCLGVBQUssRUFBRSxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQzVCO0FBQUEsUUFDRjtBQU1BLFlBQUksVUFBVSx3QkFBd0I7QUFDcEMsY0FBSSxNQUFNLFNBQVMsU0FBUztBQUMxQixpQkFBSyxFQUFFLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFDNUI7QUFBQSxVQUNGO0FBRUEsY0FBSSxPQUFPO0FBQ1gsa0JBQVEsTUFBTSxJQUFJO0FBQ2xCLGdCQUFNLFFBQVE7QUFFZCxlQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEI7QUFFQSxrQkFBUSxNQUFNLE1BQU0sU0FBUztBQUM3QjtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsY0FBYyxRQUFRLEdBQUc7QUFDckMsY0FBSSxNQUFNLFNBQVMsR0FBRztBQUNwQixrQkFBTSxTQUFTO0FBQ2YsZ0JBQUksT0FBTyxNQUFNLE1BQU0sTUFBTTtBQUM3QixrQkFBTSxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sUUFBUSxPQUFPLFVBQVUsS0FBSyxFQUFFLENBQUM7QUFBQSxVQUNoRTtBQUVBLGVBQUssRUFBRSxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQzdCLGdCQUFNO0FBQ047QUFBQSxRQUNGO0FBTUEsWUFBSSxVQUFVLFlBQVksUUFBUSxLQUFLLE1BQU0sV0FBVyxHQUFHO0FBQ3pELGNBQUksV0FBVyxNQUFNO0FBRXJCLGNBQUksVUFBVSxLQUFLLFNBQVMsV0FBVyxHQUFHO0FBQ3hDLGlCQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sQ0FBQztBQUM1QjtBQUFBLFVBQ0Y7QUFFQSxjQUFJLEtBQUssU0FBUyxPQUFPO0FBQ3ZCLGtCQUFNLFFBQVEsQ0FBQztBQUNmLGlCQUFLLFNBQVM7QUFDZCxpQkFBSyxPQUFPO0FBRVosZ0JBQUksTUFBTSxNQUFNLFdBQVcsS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0FBQ3hELG9CQUFNLFVBQVU7QUFDaEIsb0JBQU0sU0FBUztBQUNmLG1CQUFLLE9BQU87QUFDWjtBQUFBLFlBQ0Y7QUFFQSxrQkFBTTtBQUNOLGtCQUFNLE9BQU8sQ0FBQztBQUNkO0FBQUEsVUFDRjtBQUVBLGNBQUksS0FBSyxTQUFTLFNBQVM7QUFDekIscUJBQVMsSUFBSTtBQUViLGdCQUFJLFNBQVMsU0FBUyxTQUFTLFNBQVM7QUFDeEMsbUJBQU8sU0FBUyxLQUFLLFFBQVE7QUFDN0IsbUJBQU87QUFDUCxrQkFBTTtBQUNOO0FBQUEsVUFDRjtBQUVBLGVBQUssRUFBRSxNQUFNLE9BQU8sTUFBTSxDQUFDO0FBQzNCO0FBQUEsUUFDRjtBQU1BLGFBQUssRUFBRSxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQUEsTUFDOUI7QUFHQSxTQUFHO0FBQ0QsZ0JBQVEsTUFBTSxJQUFJO0FBRWxCLFlBQUksTUFBTSxTQUFTLFFBQVE7QUFDekIsZ0JBQU0sTUFBTSxRQUFRLFVBQVE7QUFDMUIsZ0JBQUksQ0FBQyxLQUFLLE9BQU87QUFDZixrQkFBSSxLQUFLLFNBQVM7QUFBUSxxQkFBSyxTQUFTO0FBQ3hDLGtCQUFJLEtBQUssU0FBUztBQUFTLHFCQUFLLFVBQVU7QUFDMUMsa0JBQUksQ0FBQyxLQUFLO0FBQU8scUJBQUssT0FBTztBQUM3QixtQkFBSyxVQUFVO0FBQUEsWUFDakI7QUFBQSxVQUNGLENBQUM7QUFHRCxjQUFJLFNBQVMsTUFBTSxNQUFNLFNBQVM7QUFDbEMsY0FBSUMsU0FBUSxPQUFPLE1BQU0sUUFBUSxLQUFLO0FBRXRDLGlCQUFPLE1BQU0sT0FBT0EsUUFBTyxHQUFHLEdBQUcsTUFBTSxLQUFLO0FBQUEsUUFDOUM7QUFBQSxNQUNGLFNBQVMsTUFBTSxTQUFTO0FBRXhCLFdBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQixhQUFPO0FBQUEsSUFDVDtBQUVBLElBQUFGLFFBQU8sVUFBVUM7QUFBQTtBQUFBOzs7QUM1VWpCO0FBQUEsZ0RBQUFFLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBTSxZQUFZO0FBQ2xCLFFBQU0sVUFBVTtBQUNoQixRQUFNLFNBQVM7QUFDZixRQUFNQyxTQUFRO0FBZ0JkLFFBQU0sU0FBUyxDQUFDLE9BQU8sVUFBVSxDQUFDLE1BQU07QUFDdEMsVUFBSSxTQUFTLENBQUM7QUFFZCxVQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDeEIsaUJBQVNDLFlBQVcsT0FBTztBQUN6QixjQUFJLFNBQVMsT0FBTyxPQUFPQSxVQUFTLE9BQU87QUFDM0MsY0FBSSxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBQ3pCLG1CQUFPLEtBQUssR0FBRyxNQUFNO0FBQUEsVUFDdkIsT0FBTztBQUNMLG1CQUFPLEtBQUssTUFBTTtBQUFBLFVBQ3BCO0FBQUEsUUFDRjtBQUFBLE1BQ0YsT0FBTztBQUNMLGlCQUFTLENBQUMsRUFBRSxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sQ0FBQztBQUFBLE1BQ2xEO0FBRUEsVUFBSSxXQUFXLFFBQVEsV0FBVyxRQUFRLFFBQVEsWUFBWSxNQUFNO0FBQ2xFLGlCQUFTLENBQUMsR0FBRyxJQUFJLElBQUksTUFBTSxDQUFDO0FBQUEsTUFDOUI7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQWdCQSxXQUFPLFFBQVEsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxNQUFNRCxPQUFNLE9BQU8sT0FBTztBQWdCNUQsV0FBTyxZQUFZLENBQUMsT0FBTyxVQUFVLENBQUMsTUFBTTtBQUMxQyxVQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGVBQU8sVUFBVSxPQUFPLE1BQU0sT0FBTyxPQUFPLEdBQUcsT0FBTztBQUFBLE1BQ3hEO0FBQ0EsYUFBTyxVQUFVLE9BQU8sT0FBTztBQUFBLElBQ2pDO0FBaUJBLFdBQU8sVUFBVSxDQUFDLE9BQU8sVUFBVSxDQUFDLE1BQU07QUFDeEMsVUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixnQkFBUSxPQUFPLE1BQU0sT0FBTyxPQUFPO0FBQUEsTUFDckM7QUFDQSxhQUFPLFFBQVEsT0FBTyxPQUFPO0FBQUEsSUFDL0I7QUFtQkEsV0FBTyxTQUFTLENBQUMsT0FBTyxVQUFVLENBQUMsTUFBTTtBQUN2QyxVQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGdCQUFRLE9BQU8sTUFBTSxPQUFPLE9BQU87QUFBQSxNQUNyQztBQUVBLFVBQUksU0FBUyxPQUFPLE9BQU8sT0FBTztBQUdsQyxVQUFJLFFBQVEsWUFBWSxNQUFNO0FBQzVCLGlCQUFTLE9BQU8sT0FBTyxPQUFPO0FBQUEsTUFDaEM7QUFHQSxVQUFJLFFBQVEsWUFBWSxNQUFNO0FBQzVCLGlCQUFTLENBQUMsR0FBRyxJQUFJLElBQUksTUFBTSxDQUFDO0FBQUEsTUFDOUI7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQWtCQSxXQUFPLFNBQVMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxNQUFNO0FBQ3ZDLFVBQUksVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHO0FBQ3BDLGVBQU8sQ0FBQyxLQUFLO0FBQUEsTUFDZjtBQUVELGFBQU8sUUFBUSxXQUFXLE9BQ3JCLE9BQU8sUUFBUSxPQUFPLE9BQU8sSUFDN0IsT0FBTyxPQUFPLE9BQU8sT0FBTztBQUFBLElBQ2xDO0FBTUEsSUFBQUQsUUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDektqQixJQUFBRyxxQkFBQTtBQUFBLDJEQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQU1DLFFBQU8sUUFBUTtBQUNyQixRQUFNLFlBQVk7QUFDbEIsUUFBTSxlQUFlLEtBQUs7QUFNMUIsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sZUFBZTtBQUNyQixRQUFNLGdCQUFnQjtBQUN0QixRQUFNLGdCQUFnQjtBQUN0QixRQUFNLFdBQVc7QUFDakIsUUFBTSxRQUFRO0FBQ2QsUUFBTSxhQUFhLE1BQU07QUFDekIsUUFBTSxlQUFlLFFBQVE7QUFDN0IsUUFBTSxhQUFhLEdBQUcsbUJBQW1CO0FBQ3pDLFFBQU0sU0FBUyxNQUFNO0FBQ3JCLFFBQU0sVUFBVSxNQUFNLGVBQWU7QUFDckMsUUFBTSxlQUFlLE1BQU0sbUJBQW1CO0FBQzlDLFFBQU0sZ0JBQWdCLE1BQU07QUFDNUIsUUFBTSxlQUFlLE1BQU07QUFDM0IsUUFBTSxPQUFPLEdBQUc7QUFFaEIsUUFBTSxjQUFjO0FBQUEsTUFDbEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFNQSxRQUFNLGdCQUFnQjtBQUFBLE1BQ3BCLEdBQUc7QUFBQSxNQUVILGVBQWUsSUFBSTtBQUFBLE1BQ25CLE9BQU87QUFBQSxNQUNQLE1BQU0sR0FBRztBQUFBLE1BQ1QsWUFBWSxHQUFHLHVCQUF1QjtBQUFBLE1BQ3RDLFFBQVEsTUFBTTtBQUFBLE1BQ2QsU0FBUyxZQUFZLGNBQWMsdUJBQXVCO0FBQUEsTUFDMUQsY0FBYyxNQUFNLHVCQUF1QjtBQUFBLE1BQzNDLGVBQWUsTUFBTSx1QkFBdUI7QUFBQSxNQUM1QyxjQUFjLE1BQU07QUFBQSxNQUNwQixjQUFjLFNBQVM7QUFBQSxNQUN2QixZQUFZLE9BQU87QUFBQSxJQUNyQjtBQU1BLFFBQU0scUJBQXFCO0FBQUEsTUFDekIsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLElBQ1Y7QUFFQSxJQUFBRCxRQUFPLFVBQVU7QUFBQSxNQUNmLFlBQVksT0FBTztBQUFBLE1BQ25CO0FBQUEsTUFHQSxpQkFBaUI7QUFBQSxNQUNqQix5QkFBeUI7QUFBQSxNQUN6QixxQkFBcUI7QUFBQSxNQUNyQiw2QkFBNkI7QUFBQSxNQUM3Qiw0QkFBNEI7QUFBQSxNQUM1Qix3QkFBd0I7QUFBQSxNQUd4QixjQUFjO0FBQUEsUUFDWixPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsUUFDVCxZQUFZO0FBQUEsTUFDZDtBQUFBLE1BR0EsUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BR1Isa0JBQWtCO0FBQUEsTUFDbEIsa0JBQWtCO0FBQUEsTUFDbEIsa0JBQWtCO0FBQUEsTUFDbEIsa0JBQWtCO0FBQUEsTUFFbEIsdUJBQXVCO0FBQUEsTUFDdkIsd0JBQXdCO0FBQUEsTUFFeEIsZUFBZTtBQUFBLE1BR2YsZ0JBQWdCO0FBQUEsTUFDaEIsU0FBUztBQUFBLE1BQ1QscUJBQXFCO0FBQUEsTUFDckIsc0JBQXNCO0FBQUEsTUFDdEIsd0JBQXdCO0FBQUEsTUFDeEIsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osVUFBVTtBQUFBLE1BQ1YsbUJBQW1CO0FBQUEsTUFDbkIsWUFBWTtBQUFBLE1BQ1osdUJBQXVCO0FBQUEsTUFDdkIsZ0JBQWdCO0FBQUEsTUFDaEIsb0JBQW9CO0FBQUEsTUFDcEIsbUJBQW1CO0FBQUEsTUFDbkIsV0FBVztBQUFBLE1BQ1gsbUJBQW1CO0FBQUEsTUFDbkIseUJBQXlCO0FBQUEsTUFDekIsdUJBQXVCO0FBQUEsTUFDdkIsMEJBQTBCO0FBQUEsTUFDMUIsZ0JBQWdCO0FBQUEsTUFDaEIscUJBQXFCO0FBQUEsTUFDckIsY0FBYztBQUFBLE1BQ2QsV0FBVztBQUFBLE1BQ1gsb0JBQW9CO0FBQUEsTUFDcEIsMEJBQTBCO0FBQUEsTUFDMUIsd0JBQXdCO0FBQUEsTUFDeEIsMkJBQTJCO0FBQUEsTUFDM0IsZ0JBQWdCO0FBQUEsTUFDaEIsbUJBQW1CO0FBQUEsTUFDbkIsWUFBWTtBQUFBLE1BQ1osVUFBVTtBQUFBLE1BQ1YsaUJBQWlCO0FBQUEsTUFDakIsb0JBQW9CO0FBQUEsTUFDcEIsK0JBQStCO0FBQUEsTUFFL0IsS0FBS0MsTUFBSztBQUFBLE1BTVYsYUFBYSxPQUFPO0FBQ2xCLGVBQU87QUFBQSxVQUNMLEtBQUssRUFBRSxNQUFNLFVBQVUsTUFBTSxhQUFhLE9BQU8sS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUNwRSxLQUFLLEVBQUUsTUFBTSxTQUFTLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxVQUMvQyxLQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxVQUM5QyxLQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxVQUM5QyxLQUFLLEVBQUUsTUFBTSxNQUFNLE1BQU0sT0FBTyxPQUFPLElBQUk7QUFBQSxRQUM3QztBQUFBLE1BQ0Y7QUFBQSxNQU1BLFVBQVUsT0FBTztBQUNmLGVBQU8sVUFBVSxPQUFPLGdCQUFnQjtBQUFBLE1BQzFDO0FBQUEsSUFDRjtBQUFBO0FBQUE7OztBQ2xMQSxJQUFBQyxpQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBLFFBQU1DLFFBQU8sUUFBUTtBQUNyQixRQUFNLFFBQVEsUUFBUSxhQUFhO0FBQ25DLFFBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixJQUFJO0FBRUosWUFBUSxXQUFXLFNBQU8sUUFBUSxRQUFRLE9BQU8sUUFBUSxZQUFZLENBQUMsTUFBTSxRQUFRLEdBQUc7QUFDdkYsWUFBUSxnQkFBZ0IsU0FBTyxvQkFBb0IsS0FBSyxHQUFHO0FBQzNELFlBQVEsY0FBYyxTQUFPLElBQUksV0FBVyxLQUFLLFFBQVEsY0FBYyxHQUFHO0FBQzFFLFlBQVEsY0FBYyxTQUFPLElBQUksUUFBUSw0QkFBNEIsTUFBTTtBQUMzRSxZQUFRLGlCQUFpQixTQUFPLElBQUksUUFBUSxpQkFBaUIsR0FBRztBQUVoRSxZQUFRLG9CQUFvQixTQUFPO0FBQ2pDLGFBQU8sSUFBSSxRQUFRLHdCQUF3QixXQUFTO0FBQ2xELGVBQU8sVUFBVSxPQUFPLEtBQUs7QUFBQSxNQUMvQixDQUFDO0FBQUEsSUFDSDtBQUVBLFlBQVEsc0JBQXNCLE1BQU07QUFDbEMsWUFBTSxPQUFPLFFBQVEsUUFBUSxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsRUFBRSxJQUFJLE1BQU07QUFDM0QsVUFBSSxLQUFLLFdBQVcsS0FBSyxLQUFLLE1BQU0sS0FBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sSUFBSztBQUN6RSxlQUFPO0FBQUEsTUFDVDtBQUNBLGFBQU87QUFBQSxJQUNUO0FBRUEsWUFBUSxZQUFZLGFBQVc7QUFDN0IsVUFBSSxXQUFXLE9BQU8sUUFBUSxZQUFZLFdBQVc7QUFDbkQsZUFBTyxRQUFRO0FBQUEsTUFDakI7QUFDQSxhQUFPLFVBQVUsUUFBUUEsTUFBSyxRQUFRO0FBQUEsSUFDeEM7QUFFQSxZQUFRLGFBQWEsQ0FBQyxPQUFPLE1BQU0sWUFBWTtBQUM3QyxZQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTztBQUMzQyxVQUFJLFFBQVE7QUFBSSxlQUFPO0FBQ3ZCLFVBQUksTUFBTSxNQUFNLE9BQU87QUFBTSxlQUFPLFFBQVEsV0FBVyxPQUFPLE1BQU0sTUFBTSxDQUFDO0FBQzNFLGFBQU8sR0FBRyxNQUFNLE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxNQUFNLEdBQUc7QUFBQSxJQUNuRDtBQUVBLFlBQVEsZUFBZSxDQUFDLE9BQU8sUUFBUSxDQUFDLE1BQU07QUFDNUMsVUFBSSxTQUFTO0FBQ2IsVUFBSSxPQUFPLFdBQVcsSUFBSSxHQUFHO0FBQzNCLGlCQUFTLE9BQU8sTUFBTSxDQUFDO0FBQ3ZCLGNBQU0sU0FBUztBQUFBLE1BQ2pCO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFFQSxZQUFRLGFBQWEsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNO0FBQ3hELFlBQU0sVUFBVSxRQUFRLFdBQVcsS0FBSztBQUN4QyxZQUFNLFNBQVMsUUFBUSxXQUFXLEtBQUs7QUFFdkMsVUFBSSxTQUFTLEdBQUcsYUFBYSxTQUFTO0FBQ3RDLFVBQUksTUFBTSxZQUFZLE1BQU07QUFDMUIsaUJBQVMsVUFBVTtBQUFBLE1BQ3JCO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQTtBQUFBOzs7QUMvREE7QUFBQSxzREFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFNLFFBQVE7QUFDZCxRQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixJQUFJO0FBRUosUUFBTSxrQkFBa0IsVUFBUTtBQUM5QixhQUFPLFNBQVMsc0JBQXNCLFNBQVM7QUFBQSxJQUNqRDtBQUVBLFFBQU0sUUFBUSxXQUFTO0FBQ3JCLFVBQUksTUFBTSxhQUFhLE1BQU07QUFDM0IsY0FBTSxRQUFRLE1BQU0sYUFBYSxXQUFXO0FBQUEsTUFDOUM7QUFBQSxJQUNGO0FBbUJBLFFBQU0sT0FBTyxDQUFDLE9BQU8sWUFBWTtBQUMvQixZQUFNLE9BQU8sV0FBVyxDQUFDO0FBRXpCLFlBQU0sU0FBUyxNQUFNLFNBQVM7QUFDOUIsWUFBTSxZQUFZLEtBQUssVUFBVSxRQUFRLEtBQUssY0FBYztBQUM1RCxZQUFNLFVBQVUsQ0FBQztBQUNqQixZQUFNLFNBQVMsQ0FBQztBQUNoQixZQUFNLFFBQVEsQ0FBQztBQUVmLFVBQUksTUFBTTtBQUNWLFVBQUksUUFBUTtBQUNaLFVBQUksUUFBUTtBQUNaLFVBQUksWUFBWTtBQUNoQixVQUFJLFVBQVU7QUFDZCxVQUFJLFlBQVk7QUFDaEIsVUFBSSxTQUFTO0FBQ2IsVUFBSSxZQUFZO0FBQ2hCLFVBQUksYUFBYTtBQUNqQixVQUFJLGVBQWU7QUFDbkIsVUFBSSxjQUFjO0FBQ2xCLFVBQUksVUFBVTtBQUNkLFVBQUksaUJBQWlCO0FBQ3JCLFVBQUksV0FBVztBQUNmLFVBQUksU0FBUztBQUNiLFVBQUk7QUFDSixVQUFJO0FBQ0osVUFBSSxRQUFRLEVBQUUsT0FBTyxJQUFJLE9BQU8sR0FBRyxRQUFRLE1BQU07QUFFakQsWUFBTSxNQUFNLE1BQU0sU0FBUztBQUMzQixZQUFNLE9BQU8sTUFBTSxJQUFJLFdBQVcsUUFBUSxDQUFDO0FBQzNDLFlBQU0sVUFBVSxNQUFNO0FBQ3BCLGVBQU87QUFDUCxlQUFPLElBQUksV0FBVyxFQUFFLEtBQUs7QUFBQSxNQUMvQjtBQUVBLGFBQU8sUUFBUSxRQUFRO0FBQ3JCLGVBQU8sUUFBUTtBQUNmLFlBQUk7QUFFSixZQUFJLFNBQVMscUJBQXFCO0FBQ2hDLHdCQUFjLE1BQU0sY0FBYztBQUNsQyxpQkFBTyxRQUFRO0FBRWYsY0FBSSxTQUFTLHVCQUF1QjtBQUNsQywyQkFBZTtBQUFBLFVBQ2pCO0FBQ0E7QUFBQSxRQUNGO0FBRUEsWUFBSSxpQkFBaUIsUUFBUSxTQUFTLHVCQUF1QjtBQUMzRDtBQUVBLGlCQUFPLElBQUksTUFBTSxTQUFTLE9BQU8sUUFBUSxJQUFJO0FBQzNDLGdCQUFJLFNBQVMscUJBQXFCO0FBQ2hDLDRCQUFjLE1BQU0sY0FBYztBQUNsQyxzQkFBUTtBQUNSO0FBQUEsWUFDRjtBQUVBLGdCQUFJLFNBQVMsdUJBQXVCO0FBQ2xDO0FBQ0E7QUFBQSxZQUNGO0FBRUEsZ0JBQUksaUJBQWlCLFFBQVEsU0FBUyxhQUFhLE9BQU8sUUFBUSxPQUFPLFVBQVU7QUFDakYsd0JBQVUsTUFBTSxVQUFVO0FBQzFCLHVCQUFTLE1BQU0sU0FBUztBQUN4Qix5QkFBVztBQUVYLGtCQUFJLGNBQWMsTUFBTTtBQUN0QjtBQUFBLGNBQ0Y7QUFFQTtBQUFBLFlBQ0Y7QUFFQSxnQkFBSSxpQkFBaUIsUUFBUSxTQUFTLFlBQVk7QUFDaEQsd0JBQVUsTUFBTSxVQUFVO0FBQzFCLHVCQUFTLE1BQU0sU0FBUztBQUN4Qix5QkFBVztBQUVYLGtCQUFJLGNBQWMsTUFBTTtBQUN0QjtBQUFBLGNBQ0Y7QUFFQTtBQUFBLFlBQ0Y7QUFFQSxnQkFBSSxTQUFTLHdCQUF3QjtBQUNuQztBQUVBLGtCQUFJLFdBQVcsR0FBRztBQUNoQiwrQkFBZTtBQUNmLDBCQUFVLE1BQU0sVUFBVTtBQUMxQiwyQkFBVztBQUNYO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBRUEsY0FBSSxjQUFjLE1BQU07QUFDdEI7QUFBQSxVQUNGO0FBRUE7QUFBQSxRQUNGO0FBRUEsWUFBSSxTQUFTLG9CQUFvQjtBQUMvQixrQkFBUSxLQUFLLEtBQUs7QUFDbEIsaUJBQU8sS0FBSyxLQUFLO0FBQ2pCLGtCQUFRLEVBQUUsT0FBTyxJQUFJLE9BQU8sR0FBRyxRQUFRLE1BQU07QUFFN0MsY0FBSSxhQUFhO0FBQU07QUFDdkIsY0FBSSxTQUFTLFlBQVksVUFBVyxRQUFRLEdBQUk7QUFDOUMscUJBQVM7QUFDVDtBQUFBLFVBQ0Y7QUFFQSxzQkFBWSxRQUFRO0FBQ3BCO0FBQUEsUUFDRjtBQUVBLFlBQUksS0FBSyxVQUFVLE1BQU07QUFDdkIsZ0JBQU0sZ0JBQWdCLFNBQVMsYUFDMUIsU0FBUyxXQUNULFNBQVMsaUJBQ1QsU0FBUyxzQkFDVCxTQUFTO0FBRWQsY0FBSSxrQkFBa0IsUUFBUSxLQUFLLE1BQU0sdUJBQXVCO0FBQzlELHFCQUFTLE1BQU0sU0FBUztBQUN4Qix3QkFBWSxNQUFNLFlBQVk7QUFDOUIsdUJBQVc7QUFDWCxnQkFBSSxTQUFTLHlCQUF5QixVQUFVLE9BQU87QUFDckQsK0JBQWlCO0FBQUEsWUFDbkI7QUFFQSxnQkFBSSxjQUFjLE1BQU07QUFDdEIscUJBQU8sSUFBSSxNQUFNLFNBQVMsT0FBTyxRQUFRLElBQUk7QUFDM0Msb0JBQUksU0FBUyxxQkFBcUI7QUFDaEMsZ0NBQWMsTUFBTSxjQUFjO0FBQ2xDLHlCQUFPLFFBQVE7QUFDZjtBQUFBLGdCQUNGO0FBRUEsb0JBQUksU0FBUyx3QkFBd0I7QUFDbkMsMkJBQVMsTUFBTSxTQUFTO0FBQ3hCLDZCQUFXO0FBQ1g7QUFBQSxnQkFDRjtBQUFBLGNBQ0Y7QUFDQTtBQUFBLFlBQ0Y7QUFDQTtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBRUEsWUFBSSxTQUFTLGVBQWU7QUFDMUIsY0FBSSxTQUFTO0FBQWUseUJBQWEsTUFBTSxhQUFhO0FBQzVELG1CQUFTLE1BQU0sU0FBUztBQUN4QixxQkFBVztBQUVYLGNBQUksY0FBYyxNQUFNO0FBQ3RCO0FBQUEsVUFDRjtBQUNBO0FBQUEsUUFDRjtBQUVBLFlBQUksU0FBUyxvQkFBb0I7QUFDL0IsbUJBQVMsTUFBTSxTQUFTO0FBQ3hCLHFCQUFXO0FBRVgsY0FBSSxjQUFjLE1BQU07QUFDdEI7QUFBQSxVQUNGO0FBQ0E7QUFBQSxRQUNGO0FBRUEsWUFBSSxTQUFTLDBCQUEwQjtBQUNyQyxpQkFBTyxJQUFJLE1BQU0sU0FBUyxPQUFPLFFBQVEsSUFBSTtBQUMzQyxnQkFBSSxTQUFTLHFCQUFxQjtBQUNoQyw0QkFBYyxNQUFNLGNBQWM7QUFDbEMsc0JBQVE7QUFDUjtBQUFBLFlBQ0Y7QUFFQSxnQkFBSSxTQUFTLDJCQUEyQjtBQUN0QywwQkFBWSxNQUFNLFlBQVk7QUFDOUIsdUJBQVMsTUFBTSxTQUFTO0FBQ3hCLHlCQUFXO0FBQ1g7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUVBLGNBQUksY0FBYyxNQUFNO0FBQ3RCO0FBQUEsVUFDRjtBQUVBO0FBQUEsUUFDRjtBQUVBLFlBQUksS0FBSyxhQUFhLFFBQVEsU0FBUyx5QkFBeUIsVUFBVSxPQUFPO0FBQy9FLG9CQUFVLE1BQU0sVUFBVTtBQUMxQjtBQUNBO0FBQUEsUUFDRjtBQUVBLFlBQUksS0FBSyxZQUFZLFFBQVEsU0FBUyx1QkFBdUI7QUFDM0QsbUJBQVMsTUFBTSxTQUFTO0FBRXhCLGNBQUksY0FBYyxNQUFNO0FBQ3RCLG1CQUFPLElBQUksTUFBTSxTQUFTLE9BQU8sUUFBUSxJQUFJO0FBQzNDLGtCQUFJLFNBQVMsdUJBQXVCO0FBQ2xDLDhCQUFjLE1BQU0sY0FBYztBQUNsQyx1QkFBTyxRQUFRO0FBQ2Y7QUFBQSxjQUNGO0FBRUEsa0JBQUksU0FBUyx3QkFBd0I7QUFDbkMsMkJBQVc7QUFDWDtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQ0E7QUFBQSxVQUNGO0FBQ0E7QUFBQSxRQUNGO0FBRUEsWUFBSSxXQUFXLE1BQU07QUFDbkIscUJBQVc7QUFFWCxjQUFJLGNBQWMsTUFBTTtBQUN0QjtBQUFBLFVBQ0Y7QUFFQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxLQUFLLFVBQVUsTUFBTTtBQUN2QixvQkFBWTtBQUNaLGlCQUFTO0FBQUEsTUFDWDtBQUVBLFVBQUksT0FBTztBQUNYLFVBQUksU0FBUztBQUNiLFVBQUksT0FBTztBQUVYLFVBQUksUUFBUSxHQUFHO0FBQ2IsaUJBQVMsSUFBSSxNQUFNLEdBQUcsS0FBSztBQUMzQixjQUFNLElBQUksTUFBTSxLQUFLO0FBQ3JCLHFCQUFhO0FBQUEsTUFDZjtBQUVBLFVBQUksUUFBUSxXQUFXLFFBQVEsWUFBWSxHQUFHO0FBQzVDLGVBQU8sSUFBSSxNQUFNLEdBQUcsU0FBUztBQUM3QixlQUFPLElBQUksTUFBTSxTQUFTO0FBQUEsTUFDNUIsV0FBVyxXQUFXLE1BQU07QUFDMUIsZUFBTztBQUNQLGVBQU87QUFBQSxNQUNULE9BQU87QUFDTCxlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUksUUFBUSxTQUFTLE1BQU0sU0FBUyxPQUFPLFNBQVMsS0FBSztBQUN2RCxZQUFJLGdCQUFnQixLQUFLLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxHQUFHO0FBQ3JELGlCQUFPLEtBQUssTUFBTSxHQUFHLEVBQUU7QUFBQSxRQUN6QjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLEtBQUssYUFBYSxNQUFNO0FBQzFCLFlBQUk7QUFBTSxpQkFBTyxNQUFNLGtCQUFrQixJQUFJO0FBRTdDLFlBQUksUUFBUSxnQkFBZ0IsTUFBTTtBQUNoQyxpQkFBTyxNQUFNLGtCQUFrQixJQUFJO0FBQUEsUUFDckM7QUFBQSxNQUNGO0FBRUEsWUFBTSxRQUFRO0FBQUEsUUFDWjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUVBLFVBQUksS0FBSyxXQUFXLE1BQU07QUFDeEIsY0FBTSxXQUFXO0FBQ2pCLFlBQUksQ0FBQyxnQkFBZ0IsSUFBSSxHQUFHO0FBQzFCLGlCQUFPLEtBQUssS0FBSztBQUFBLFFBQ25CO0FBQ0EsY0FBTSxTQUFTO0FBQUEsTUFDakI7QUFFQSxVQUFJLEtBQUssVUFBVSxRQUFRLEtBQUssV0FBVyxNQUFNO0FBQy9DLFlBQUk7QUFFSixpQkFBUyxNQUFNLEdBQUcsTUFBTSxRQUFRLFFBQVEsT0FBTztBQUM3QyxnQkFBTSxJQUFJLFlBQVksWUFBWSxJQUFJO0FBQ3RDLGdCQUFNLElBQUksUUFBUTtBQUNsQixnQkFBTSxRQUFRLE1BQU0sTUFBTSxHQUFHLENBQUM7QUFDOUIsY0FBSSxLQUFLLFFBQVE7QUFDZixnQkFBSSxRQUFRLEtBQUssVUFBVSxHQUFHO0FBQzVCLHFCQUFPLEtBQUssV0FBVztBQUN2QixxQkFBTyxLQUFLLFFBQVE7QUFBQSxZQUN0QixPQUFPO0FBQ0wscUJBQU8sS0FBSyxRQUFRO0FBQUEsWUFDdEI7QUFDQSxrQkFBTSxPQUFPLElBQUk7QUFDakIsa0JBQU0sWUFBWSxPQUFPLEtBQUs7QUFBQSxVQUNoQztBQUNBLGNBQUksUUFBUSxLQUFLLFVBQVUsSUFBSTtBQUM3QixrQkFBTSxLQUFLLEtBQUs7QUFBQSxVQUNsQjtBQUNBLHNCQUFZO0FBQUEsUUFDZDtBQUVBLFlBQUksYUFBYSxZQUFZLElBQUksTUFBTSxRQUFRO0FBQzdDLGdCQUFNLFFBQVEsTUFBTSxNQUFNLFlBQVksQ0FBQztBQUN2QyxnQkFBTSxLQUFLLEtBQUs7QUFFaEIsY0FBSSxLQUFLLFFBQVE7QUFDZixtQkFBTyxPQUFPLFNBQVMsR0FBRyxRQUFRO0FBQ2xDLGtCQUFNLE9BQU8sT0FBTyxTQUFTLEVBQUU7QUFDL0Isa0JBQU0sWUFBWSxPQUFPLE9BQU8sU0FBUyxHQUFHO0FBQUEsVUFDOUM7QUFBQSxRQUNGO0FBRUEsY0FBTSxVQUFVO0FBQ2hCLGNBQU0sUUFBUTtBQUFBLE1BQ2hCO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFFQSxJQUFBQSxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUN0WWpCLElBQUFDLGlCQUFBO0FBQUEsdURBQUFDLFNBQUE7QUFBQTtBQUFBO0FBRUEsUUFBTSxZQUFZO0FBQ2xCLFFBQU0sUUFBUTtBQU1kLFFBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSTtBQU1KLFFBQU0sY0FBYyxDQUFDLE1BQU0sWUFBWTtBQUNyQyxVQUFJLE9BQU8sUUFBUSxnQkFBZ0IsWUFBWTtBQUM3QyxlQUFPLFFBQVEsWUFBWSxHQUFHLE1BQU0sT0FBTztBQUFBLE1BQzdDO0FBRUEsV0FBSyxLQUFLO0FBQ1YsWUFBTSxRQUFRLElBQUksS0FBSyxLQUFLLEdBQUc7QUFFL0IsVUFBSTtBQUVGLFlBQUksT0FBTyxLQUFLO0FBQUEsTUFDbEIsU0FBUyxJQUFQO0FBQ0EsZUFBTyxLQUFLLElBQUksT0FBSyxNQUFNLFlBQVksQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQUEsTUFDdEQ7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQU1BLFFBQU0sY0FBYyxDQUFDLE1BQU0sU0FBUztBQUNsQyxhQUFPLFdBQVcsVUFBVSxvQkFBb0I7QUFBQSxJQUNsRDtBQVNBLFFBQU1DLFNBQVEsQ0FBQyxPQUFPLFlBQVk7QUFDaEMsVUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixjQUFNLElBQUksVUFBVSxtQkFBbUI7QUFBQSxNQUN6QztBQUVBLGNBQVEsYUFBYSxVQUFVO0FBRS9CLFlBQU0sT0FBTyxFQUFFLEdBQUcsUUFBUTtBQUMxQixZQUFNLE1BQU0sT0FBTyxLQUFLLGNBQWMsV0FBVyxLQUFLLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSTtBQUV4RixVQUFJLE1BQU0sTUFBTTtBQUNoQixVQUFJLE1BQU0sS0FBSztBQUNiLGNBQU0sSUFBSSxZQUFZLGlCQUFpQix3Q0FBd0MsS0FBSztBQUFBLE1BQ3RGO0FBRUEsWUFBTSxNQUFNLEVBQUUsTUFBTSxPQUFPLE9BQU8sSUFBSSxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQ2pFLFlBQU0sU0FBUyxDQUFDLEdBQUc7QUFFbkIsWUFBTSxVQUFVLEtBQUssVUFBVSxLQUFLO0FBQ3BDLFlBQU0sUUFBUSxNQUFNLFVBQVUsT0FBTztBQUdyQyxZQUFNLGlCQUFpQixVQUFVLFVBQVUsS0FBSztBQUNoRCxZQUFNLGdCQUFnQixVQUFVLGFBQWEsY0FBYztBQUUzRCxZQUFNO0FBQUEsUUFDSjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRixJQUFJO0FBRUosWUFBTSxXQUFXLENBQUFDLFVBQVE7QUFDdkIsZUFBTyxJQUFJLGdCQUFnQixlQUFlQSxNQUFLLE1BQU0sYUFBYTtBQUFBLE1BQ3BFO0FBRUEsWUFBTSxRQUFRLEtBQUssTUFBTSxLQUFLO0FBQzlCLFlBQU0sYUFBYSxLQUFLLE1BQU0sUUFBUTtBQUN0QyxVQUFJLE9BQU8sS0FBSyxTQUFTLE9BQU8sU0FBUyxJQUFJLElBQUk7QUFFakQsVUFBSSxLQUFLLFNBQVM7QUFDaEIsZUFBTyxJQUFJO0FBQUEsTUFDYjtBQUdBLFVBQUksT0FBTyxLQUFLLFVBQVUsV0FBVztBQUNuQyxhQUFLLFlBQVksS0FBSztBQUFBLE1BQ3hCO0FBRUEsWUFBTSxRQUFRO0FBQUEsUUFDWjtBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1AsT0FBTztBQUFBLFFBQ1AsS0FBSyxLQUFLLFFBQVE7QUFBQSxRQUNsQixVQUFVO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixXQUFXO0FBQUEsUUFDWCxTQUFTO0FBQUEsUUFDVCxVQUFVO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixVQUFVO0FBQUEsUUFDVjtBQUFBLE1BQ0Y7QUFFQSxjQUFRLE1BQU0sYUFBYSxPQUFPLEtBQUs7QUFDdkMsWUFBTSxNQUFNO0FBRVosWUFBTSxXQUFXLENBQUM7QUFDbEIsWUFBTSxTQUFTLENBQUM7QUFDaEIsWUFBTSxRQUFRLENBQUM7QUFDZixVQUFJLE9BQU87QUFDWCxVQUFJO0FBTUosWUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLE1BQU07QUFDeEMsWUFBTSxPQUFPLE1BQU0sT0FBTyxDQUFDLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUTtBQUN6RCxZQUFNLFVBQVUsTUFBTSxVQUFVLE1BQU0sTUFBTSxFQUFFLE1BQU0sVUFBVTtBQUM5RCxZQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDbkQsWUFBTSxVQUFVLENBQUNDLFNBQVEsSUFBSSxNQUFNLE1BQU07QUFDdkMsY0FBTSxZQUFZQTtBQUNsQixjQUFNLFNBQVM7QUFBQSxNQUNqQjtBQUVBLFlBQU0sU0FBUyxXQUFTO0FBQ3RCLGNBQU0sVUFBVSxNQUFNLFVBQVUsT0FBTyxNQUFNLFNBQVMsTUFBTTtBQUM1RCxnQkFBUSxNQUFNLEtBQUs7QUFBQSxNQUNyQjtBQUVBLFlBQU0sU0FBUyxNQUFNO0FBQ25CLFlBQUksUUFBUTtBQUVaLGVBQU8sS0FBSyxNQUFNLFFBQVEsS0FBSyxDQUFDLE1BQU0sT0FBTyxLQUFLLENBQUMsTUFBTSxNQUFNO0FBQzdELGtCQUFRO0FBQ1IsZ0JBQU07QUFDTjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLFFBQVEsTUFBTSxHQUFHO0FBQ25CLGlCQUFPO0FBQUEsUUFDVDtBQUVBLGNBQU0sVUFBVTtBQUNoQixjQUFNO0FBQ04sZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFlBQVksVUFBUTtBQUN4QixjQUFNO0FBQ04sY0FBTSxLQUFLLElBQUk7QUFBQSxNQUNqQjtBQUVBLFlBQU0sWUFBWSxVQUFRO0FBQ3hCLGNBQU07QUFDTixjQUFNLElBQUk7QUFBQSxNQUNaO0FBVUEsWUFBTSxPQUFPLFNBQU87QUFDbEIsWUFBSSxLQUFLLFNBQVMsWUFBWTtBQUM1QixnQkFBTSxVQUFVLE1BQU0sU0FBUyxNQUFNLElBQUksU0FBUyxXQUFXLElBQUksU0FBUztBQUMxRSxnQkFBTSxZQUFZLElBQUksWUFBWSxRQUFTLFNBQVMsV0FBVyxJQUFJLFNBQVMsVUFBVSxJQUFJLFNBQVM7QUFFbkcsY0FBSSxJQUFJLFNBQVMsV0FBVyxJQUFJLFNBQVMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXO0FBQzFFLGtCQUFNLFNBQVMsTUFBTSxPQUFPLE1BQU0sR0FBRyxDQUFDLEtBQUssT0FBTyxNQUFNO0FBQ3hELGlCQUFLLE9BQU87QUFDWixpQkFBSyxRQUFRO0FBQ2IsaUJBQUssU0FBUztBQUNkLGtCQUFNLFVBQVUsS0FBSztBQUFBLFVBQ3ZCO0FBQUEsUUFDRjtBQUVBLFlBQUksU0FBUyxVQUFVLElBQUksU0FBUyxTQUFTO0FBQzNDLG1CQUFTLFNBQVMsU0FBUyxHQUFHLFNBQVMsSUFBSTtBQUFBLFFBQzdDO0FBRUEsWUFBSSxJQUFJLFNBQVMsSUFBSTtBQUFRLGlCQUFPLEdBQUc7QUFDdkMsWUFBSSxRQUFRLEtBQUssU0FBUyxVQUFVLElBQUksU0FBUyxRQUFRO0FBQ3ZELGVBQUssU0FBUyxJQUFJO0FBQ2xCLGVBQUssVUFBVSxLQUFLLFVBQVUsTUFBTSxJQUFJO0FBQ3hDO0FBQUEsUUFDRjtBQUVBLFlBQUksT0FBTztBQUNYLGVBQU8sS0FBSyxHQUFHO0FBQ2YsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLGNBQWMsQ0FBQyxNQUFNQSxXQUFVO0FBQ25DLGNBQU0sUUFBUSxFQUFFLEdBQUcsY0FBY0EsU0FBUSxZQUFZLEdBQUcsT0FBTyxHQUFHO0FBRWxFLGNBQU0sT0FBTztBQUNiLGNBQU0sU0FBUyxNQUFNO0FBQ3JCLGNBQU0sU0FBUyxNQUFNO0FBQ3JCLGNBQU0sVUFBVSxLQUFLLFVBQVUsTUFBTSxNQUFNLE1BQU07QUFFakQsa0JBQVUsUUFBUTtBQUNsQixhQUFLLEVBQUUsTUFBTSxPQUFBQSxRQUFPLFFBQVEsTUFBTSxTQUFTLEtBQUssU0FBUyxDQUFDO0FBQzFELGFBQUssRUFBRSxNQUFNLFNBQVMsU0FBUyxNQUFNLE9BQU8sUUFBUSxHQUFHLE9BQU8sQ0FBQztBQUMvRCxpQkFBUyxLQUFLLEtBQUs7QUFBQSxNQUNyQjtBQUVBLFlBQU0sZUFBZSxXQUFTO0FBQzVCLFlBQUksU0FBUyxNQUFNLFNBQVMsS0FBSyxVQUFVLE1BQU07QUFDakQsWUFBSTtBQUVKLFlBQUksTUFBTSxTQUFTLFVBQVU7QUFDM0IsY0FBSSxjQUFjO0FBRWxCLGNBQUksTUFBTSxTQUFTLE1BQU0sTUFBTSxTQUFTLEtBQUssTUFBTSxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQ3RFLDBCQUFjLFNBQVMsSUFBSTtBQUFBLFVBQzdCO0FBRUEsY0FBSSxnQkFBZ0IsUUFBUSxJQUFJLEtBQUssUUFBUSxLQUFLLFVBQVUsQ0FBQyxHQUFHO0FBQzlELHFCQUFTLE1BQU0sUUFBUSxPQUFPO0FBQUEsVUFDaEM7QUFFQSxjQUFJLE1BQU0sTUFBTSxTQUFTLEdBQUcsTUFBTSxPQUFPLFVBQVUsTUFBTSxlQUFlLEtBQUssSUFBSSxHQUFHO0FBTWxGLGtCQUFNLGFBQWFGLE9BQU0sTUFBTSxFQUFFLEdBQUcsU0FBUyxXQUFXLE1BQU0sQ0FBQyxFQUFFO0FBRWpFLHFCQUFTLE1BQU0sUUFBUSxJQUFJLGNBQWM7QUFBQSxVQUMzQztBQUVBLGNBQUksTUFBTSxLQUFLLFNBQVMsT0FBTztBQUM3QixrQkFBTSxpQkFBaUI7QUFBQSxVQUN6QjtBQUFBLFFBQ0Y7QUFFQSxhQUFLLEVBQUUsTUFBTSxTQUFTLFNBQVMsTUFBTSxPQUFPLE9BQU8sQ0FBQztBQUNwRCxrQkFBVSxRQUFRO0FBQUEsTUFDcEI7QUFNQSxVQUFJLEtBQUssY0FBYyxTQUFTLENBQUMsc0JBQXNCLEtBQUssS0FBSyxHQUFHO0FBQ2xFLFlBQUksY0FBYztBQUVsQixZQUFJLFNBQVMsTUFBTSxRQUFRLDZCQUE2QixDQUFDLEdBQUcsS0FBSyxPQUFPLE9BQU8sTUFBTSxVQUFVO0FBQzdGLGNBQUksVUFBVSxNQUFNO0FBQ2xCLDBCQUFjO0FBQ2QsbUJBQU87QUFBQSxVQUNUO0FBRUEsY0FBSSxVQUFVLEtBQUs7QUFDakIsZ0JBQUksS0FBSztBQUNQLHFCQUFPLE1BQU0sU0FBUyxPQUFPLE1BQU0sT0FBTyxLQUFLLE1BQU0sSUFBSTtBQUFBLFlBQzNEO0FBQ0EsZ0JBQUksVUFBVSxHQUFHO0FBQ2YscUJBQU8sY0FBYyxPQUFPLE1BQU0sT0FBTyxLQUFLLE1BQU0sSUFBSTtBQUFBLFlBQzFEO0FBQ0EsbUJBQU8sTUFBTSxPQUFPLE1BQU0sTUFBTTtBQUFBLFVBQ2xDO0FBRUEsY0FBSSxVQUFVLEtBQUs7QUFDakIsbUJBQU8sWUFBWSxPQUFPLE1BQU0sTUFBTTtBQUFBLFVBQ3hDO0FBRUEsY0FBSSxVQUFVLEtBQUs7QUFDakIsZ0JBQUksS0FBSztBQUNQLHFCQUFPLE1BQU0sU0FBUyxPQUFPLE9BQU87QUFBQSxZQUN0QztBQUNBLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLE1BQU0sSUFBSSxLQUFLO0FBQUEsUUFDeEIsQ0FBQztBQUVELFlBQUksZ0JBQWdCLE1BQU07QUFDeEIsY0FBSSxLQUFLLGFBQWEsTUFBTTtBQUMxQixxQkFBUyxPQUFPLFFBQVEsT0FBTyxFQUFFO0FBQUEsVUFDbkMsT0FBTztBQUNMLHFCQUFTLE9BQU8sUUFBUSxRQUFRLE9BQUs7QUFDbkMscUJBQU8sRUFBRSxTQUFTLE1BQU0sSUFBSSxTQUFVLElBQUksT0FBTztBQUFBLFlBQ25ELENBQUM7QUFBQSxVQUNIO0FBQUEsUUFDRjtBQUVBLFlBQUksV0FBVyxTQUFTLEtBQUssYUFBYSxNQUFNO0FBQzlDLGdCQUFNLFNBQVM7QUFDZixpQkFBTztBQUFBLFFBQ1Q7QUFFQSxjQUFNLFNBQVMsTUFBTSxXQUFXLFFBQVEsT0FBTyxPQUFPO0FBQ3RELGVBQU87QUFBQSxNQUNUO0FBTUEsYUFBTyxDQUFDLElBQUksR0FBRztBQUNiLGdCQUFRLFFBQVE7QUFFaEIsWUFBSSxVQUFVLE1BQVU7QUFDdEI7QUFBQSxRQUNGO0FBTUEsWUFBSSxVQUFVLE1BQU07QUFDbEIsZ0JBQU0sT0FBTyxLQUFLO0FBRWxCLGNBQUksU0FBUyxPQUFPLEtBQUssU0FBUyxNQUFNO0FBQ3RDO0FBQUEsVUFDRjtBQUVBLGNBQUksU0FBUyxPQUFPLFNBQVMsS0FBSztBQUNoQztBQUFBLFVBQ0Y7QUFFQSxjQUFJLENBQUMsTUFBTTtBQUNULHFCQUFTO0FBQ1QsaUJBQUssRUFBRSxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQzVCO0FBQUEsVUFDRjtBQUdBLGdCQUFNLFFBQVEsT0FBTyxLQUFLLFVBQVUsQ0FBQztBQUNyQyxjQUFJLFVBQVU7QUFFZCxjQUFJLFNBQVMsTUFBTSxHQUFHLFNBQVMsR0FBRztBQUNoQyxzQkFBVSxNQUFNLEdBQUc7QUFDbkIsa0JBQU0sU0FBUztBQUNmLGdCQUFJLFVBQVUsTUFBTSxHQUFHO0FBQ3JCLHVCQUFTO0FBQUEsWUFDWDtBQUFBLFVBQ0Y7QUFFQSxjQUFJLEtBQUssYUFBYSxNQUFNO0FBQzFCLG9CQUFRLFFBQVE7QUFBQSxVQUNsQixPQUFPO0FBQ0wscUJBQVMsUUFBUTtBQUFBLFVBQ25CO0FBRUEsY0FBSSxNQUFNLGFBQWEsR0FBRztBQUN4QixpQkFBSyxFQUFFLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFDNUI7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQU9BLFlBQUksTUFBTSxXQUFXLE1BQU0sVUFBVSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxPQUFPO0FBQ3RGLGNBQUksS0FBSyxVQUFVLFNBQVMsVUFBVSxLQUFLO0FBQ3pDLGtCQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxnQkFBSSxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQ3ZCLG1CQUFLLFFBQVE7QUFFYixrQkFBSSxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQ3ZCLHNCQUFNLE1BQU0sS0FBSyxNQUFNLFlBQVksR0FBRztBQUN0QyxzQkFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEdBQUcsR0FBRztBQUNuQyxzQkFBTUcsUUFBTyxLQUFLLE1BQU0sTUFBTSxNQUFNLENBQUM7QUFDckMsc0JBQU0sUUFBUSxtQkFBbUJBO0FBQ2pDLG9CQUFJLE9BQU87QUFDVCx1QkFBSyxRQUFRLE1BQU07QUFDbkIsd0JBQU0sWUFBWTtBQUNsQiwwQkFBUTtBQUVSLHNCQUFJLENBQUMsSUFBSSxVQUFVLE9BQU8sUUFBUSxJQUFJLE1BQU0sR0FBRztBQUM3Qyx3QkFBSSxTQUFTO0FBQUEsa0JBQ2Y7QUFDQTtBQUFBLGdCQUNGO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBRUEsY0FBSyxVQUFVLE9BQU8sS0FBSyxNQUFNLE9BQVMsVUFBVSxPQUFPLEtBQUssTUFBTSxLQUFNO0FBQzFFLG9CQUFRLEtBQUs7QUFBQSxVQUNmO0FBRUEsY0FBSSxVQUFVLFFBQVEsS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLE9BQU87QUFDaEUsb0JBQVEsS0FBSztBQUFBLFVBQ2Y7QUFFQSxjQUFJLEtBQUssVUFBVSxRQUFRLFVBQVUsT0FBTyxLQUFLLFVBQVUsS0FBSztBQUM5RCxvQkFBUTtBQUFBLFVBQ1Y7QUFFQSxlQUFLLFNBQVM7QUFDZCxpQkFBTyxFQUFFLE1BQU0sQ0FBQztBQUNoQjtBQUFBLFFBQ0Y7QUFPQSxZQUFJLE1BQU0sV0FBVyxLQUFLLFVBQVUsS0FBSztBQUN2QyxrQkFBUSxNQUFNLFlBQVksS0FBSztBQUMvQixlQUFLLFNBQVM7QUFDZCxpQkFBTyxFQUFFLE1BQU0sQ0FBQztBQUNoQjtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsS0FBSztBQUNqQixnQkFBTSxTQUFTLE1BQU0sV0FBVyxJQUFJLElBQUk7QUFDeEMsY0FBSSxLQUFLLGVBQWUsTUFBTTtBQUM1QixpQkFBSyxFQUFFLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFBQSxVQUM5QjtBQUNBO0FBQUEsUUFDRjtBQU1BLFlBQUksVUFBVSxLQUFLO0FBQ2pCLG9CQUFVLFFBQVE7QUFDbEIsZUFBSyxFQUFFLE1BQU0sU0FBUyxNQUFNLENBQUM7QUFDN0I7QUFBQSxRQUNGO0FBRUEsWUFBSSxVQUFVLEtBQUs7QUFDakIsY0FBSSxNQUFNLFdBQVcsS0FBSyxLQUFLLG1CQUFtQixNQUFNO0FBQ3RELGtCQUFNLElBQUksWUFBWSxZQUFZLFdBQVcsR0FBRyxDQUFDO0FBQUEsVUFDbkQ7QUFFQSxnQkFBTSxVQUFVLFNBQVMsU0FBUyxTQUFTO0FBQzNDLGNBQUksV0FBVyxNQUFNLFdBQVcsUUFBUSxTQUFTLEdBQUc7QUFDbEQseUJBQWEsU0FBUyxJQUFJLENBQUM7QUFDM0I7QUFBQSxVQUNGO0FBRUEsZUFBSyxFQUFFLE1BQU0sU0FBUyxPQUFPLFFBQVEsTUFBTSxTQUFTLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLG9CQUFVLFFBQVE7QUFDbEI7QUFBQSxRQUNGO0FBTUEsWUFBSSxVQUFVLEtBQUs7QUFDakIsY0FBSSxLQUFLLGNBQWMsUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUN6RCxnQkFBSSxLQUFLLGNBQWMsUUFBUSxLQUFLLG1CQUFtQixNQUFNO0FBQzNELG9CQUFNLElBQUksWUFBWSxZQUFZLFdBQVcsR0FBRyxDQUFDO0FBQUEsWUFDbkQ7QUFFQSxvQkFBUSxLQUFLO0FBQUEsVUFDZixPQUFPO0FBQ0wsc0JBQVUsVUFBVTtBQUFBLFVBQ3RCO0FBRUEsZUFBSyxFQUFFLE1BQU0sV0FBVyxNQUFNLENBQUM7QUFDL0I7QUFBQSxRQUNGO0FBRUEsWUFBSSxVQUFVLEtBQUs7QUFDakIsY0FBSSxLQUFLLGNBQWMsUUFBUyxRQUFRLEtBQUssU0FBUyxhQUFhLEtBQUssTUFBTSxXQUFXLEdBQUk7QUFDM0YsaUJBQUssRUFBRSxNQUFNLFFBQVEsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQ2xEO0FBQUEsVUFDRjtBQUVBLGNBQUksTUFBTSxhQUFhLEdBQUc7QUFDeEIsZ0JBQUksS0FBSyxtQkFBbUIsTUFBTTtBQUNoQyxvQkFBTSxJQUFJLFlBQVksWUFBWSxXQUFXLEdBQUcsQ0FBQztBQUFBLFlBQ25EO0FBRUEsaUJBQUssRUFBRSxNQUFNLFFBQVEsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQ2xEO0FBQUEsVUFDRjtBQUVBLG9CQUFVLFVBQVU7QUFFcEIsZ0JBQU0sWUFBWSxLQUFLLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLGNBQUksS0FBSyxVQUFVLFFBQVEsVUFBVSxPQUFPLE9BQU8sQ0FBQyxVQUFVLFNBQVMsR0FBRyxHQUFHO0FBQzNFLG9CQUFRLElBQUk7QUFBQSxVQUNkO0FBRUEsZUFBSyxTQUFTO0FBQ2QsaUJBQU8sRUFBRSxNQUFNLENBQUM7QUFJaEIsY0FBSSxLQUFLLG9CQUFvQixTQUFTLE1BQU0sY0FBYyxTQUFTLEdBQUc7QUFDcEU7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sVUFBVSxNQUFNLFlBQVksS0FBSyxLQUFLO0FBQzVDLGdCQUFNLFNBQVMsTUFBTSxPQUFPLE1BQU0sR0FBRyxDQUFDLEtBQUssTUFBTSxNQUFNO0FBSXZELGNBQUksS0FBSyxvQkFBb0IsTUFBTTtBQUNqQyxrQkFBTSxVQUFVO0FBQ2hCLGlCQUFLLFFBQVE7QUFDYjtBQUFBLFVBQ0Y7QUFHQSxlQUFLLFFBQVEsSUFBSSxVQUFVLFdBQVcsS0FBSztBQUMzQyxnQkFBTSxVQUFVLEtBQUs7QUFDckI7QUFBQSxRQUNGO0FBTUEsWUFBSSxVQUFVLE9BQU8sS0FBSyxZQUFZLE1BQU07QUFDMUMsb0JBQVUsUUFBUTtBQUVsQixnQkFBTSxPQUFPO0FBQUEsWUFDWCxNQUFNO0FBQUEsWUFDTjtBQUFBLFlBQ0EsUUFBUTtBQUFBLFlBQ1IsYUFBYSxNQUFNLE9BQU87QUFBQSxZQUMxQixhQUFhLE1BQU0sT0FBTztBQUFBLFVBQzVCO0FBRUEsaUJBQU8sS0FBSyxJQUFJO0FBQ2hCLGVBQUssSUFBSTtBQUNUO0FBQUEsUUFDRjtBQUVBLFlBQUksVUFBVSxLQUFLO0FBQ2pCLGdCQUFNLFFBQVEsT0FBTyxPQUFPLFNBQVM7QUFFckMsY0FBSSxLQUFLLFlBQVksUUFBUSxDQUFDLE9BQU87QUFDbkMsaUJBQUssRUFBRSxNQUFNLFFBQVEsT0FBTyxRQUFRLE1BQU0sQ0FBQztBQUMzQztBQUFBLFVBQ0Y7QUFFQSxjQUFJLFNBQVM7QUFFYixjQUFJLE1BQU0sU0FBUyxNQUFNO0FBQ3ZCLGtCQUFNLE1BQU0sT0FBTyxNQUFNO0FBQ3pCLGtCQUFNLFFBQVEsQ0FBQztBQUVmLHFCQUFTLElBQUksSUFBSSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDeEMscUJBQU8sSUFBSTtBQUNYLGtCQUFJLElBQUksR0FBRyxTQUFTLFNBQVM7QUFDM0I7QUFBQSxjQUNGO0FBQ0Esa0JBQUksSUFBSSxHQUFHLFNBQVMsUUFBUTtBQUMxQixzQkFBTSxRQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsY0FDNUI7QUFBQSxZQUNGO0FBRUEscUJBQVMsWUFBWSxPQUFPLElBQUk7QUFDaEMsa0JBQU0sWUFBWTtBQUFBLFVBQ3BCO0FBRUEsY0FBSSxNQUFNLFVBQVUsUUFBUSxNQUFNLFNBQVMsTUFBTTtBQUMvQyxrQkFBTSxNQUFNLE1BQU0sT0FBTyxNQUFNLEdBQUcsTUFBTSxXQUFXO0FBQ25ELGtCQUFNLE9BQU8sTUFBTSxPQUFPLE1BQU0sTUFBTSxXQUFXO0FBQ2pELGtCQUFNLFFBQVEsTUFBTSxTQUFTO0FBQzdCLG9CQUFRLFNBQVM7QUFDakIsa0JBQU0sU0FBUztBQUNmLHVCQUFXLEtBQUssTUFBTTtBQUNwQixvQkFBTSxVQUFXLEVBQUUsVUFBVSxFQUFFO0FBQUEsWUFDakM7QUFBQSxVQUNGO0FBRUEsZUFBSyxFQUFFLE1BQU0sU0FBUyxPQUFPLE9BQU8sQ0FBQztBQUNyQyxvQkFBVSxRQUFRO0FBQ2xCLGlCQUFPLElBQUk7QUFDWDtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsS0FBSztBQUNqQixjQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3ZCLHFCQUFTLFNBQVMsU0FBUyxHQUFHO0FBQUEsVUFDaEM7QUFDQSxlQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sQ0FBQztBQUM1QjtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsS0FBSztBQUNqQixjQUFJLFNBQVM7QUFFYixnQkFBTSxRQUFRLE9BQU8sT0FBTyxTQUFTO0FBQ3JDLGNBQUksU0FBUyxNQUFNLE1BQU0sU0FBUyxPQUFPLFVBQVU7QUFDakQsa0JBQU0sUUFBUTtBQUNkLHFCQUFTO0FBQUEsVUFDWDtBQUVBLGVBQUssRUFBRSxNQUFNLFNBQVMsT0FBTyxPQUFPLENBQUM7QUFDckM7QUFBQSxRQUNGO0FBTUEsWUFBSSxVQUFVLEtBQUs7QUFLakIsY0FBSSxLQUFLLFNBQVMsU0FBUyxNQUFNLFVBQVUsTUFBTSxRQUFRLEdBQUc7QUFDMUQsa0JBQU0sUUFBUSxNQUFNLFFBQVE7QUFDNUIsa0JBQU0sV0FBVztBQUNqQixrQkFBTSxTQUFTO0FBQ2YsbUJBQU8sSUFBSTtBQUNYLG1CQUFPO0FBQ1A7QUFBQSxVQUNGO0FBRUEsZUFBSyxFQUFFLE1BQU0sU0FBUyxPQUFPLFFBQVEsY0FBYyxDQUFDO0FBQ3BEO0FBQUEsUUFDRjtBQU1BLFlBQUksVUFBVSxLQUFLO0FBQ2pCLGNBQUksTUFBTSxTQUFTLEtBQUssS0FBSyxTQUFTLE9BQU87QUFDM0MsZ0JBQUksS0FBSyxVQUFVO0FBQUssbUJBQUssU0FBUztBQUN0QyxrQkFBTSxRQUFRLE9BQU8sT0FBTyxTQUFTO0FBQ3JDLGlCQUFLLE9BQU87QUFDWixpQkFBSyxVQUFVO0FBQ2YsaUJBQUssU0FBUztBQUNkLGtCQUFNLE9BQU87QUFDYjtBQUFBLFVBQ0Y7QUFFQSxjQUFLLE1BQU0sU0FBUyxNQUFNLFdBQVksS0FBSyxLQUFLLFNBQVMsU0FBUyxLQUFLLFNBQVMsU0FBUztBQUN2RixpQkFBSyxFQUFFLE1BQU0sUUFBUSxPQUFPLFFBQVEsWUFBWSxDQUFDO0FBQ2pEO0FBQUEsVUFDRjtBQUVBLGVBQUssRUFBRSxNQUFNLE9BQU8sT0FBTyxRQUFRLFlBQVksQ0FBQztBQUNoRDtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsS0FBSztBQUNqQixnQkFBTSxVQUFVLFFBQVEsS0FBSyxVQUFVO0FBQ3ZDLGNBQUksQ0FBQyxXQUFXLEtBQUssY0FBYyxRQUFRLEtBQUssTUFBTSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUs7QUFDNUUsd0JBQVksU0FBUyxLQUFLO0FBQzFCO0FBQUEsVUFDRjtBQUVBLGNBQUksUUFBUSxLQUFLLFNBQVMsU0FBUztBQUNqQyxrQkFBTSxPQUFPLEtBQUs7QUFDbEIsZ0JBQUksU0FBUztBQUViLGdCQUFJLFNBQVMsT0FBTyxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7QUFDaEQsb0JBQU0sSUFBSSxNQUFNLHlEQUF5RDtBQUFBLFlBQzNFO0FBRUEsZ0JBQUssS0FBSyxVQUFVLE9BQU8sQ0FBQyxTQUFTLEtBQUssSUFBSSxLQUFPLFNBQVMsT0FBTyxDQUFDLGVBQWUsS0FBSyxVQUFVLENBQUMsR0FBSTtBQUN2Ryx1QkFBUyxLQUFLO0FBQUEsWUFDaEI7QUFFQSxpQkFBSyxFQUFFLE1BQU0sUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUNwQztBQUFBLFVBQ0Y7QUFFQSxjQUFJLEtBQUssUUFBUSxTQUFTLEtBQUssU0FBUyxXQUFXLEtBQUssU0FBUyxRQUFRO0FBQ3ZFLGlCQUFLLEVBQUUsTUFBTSxTQUFTLE9BQU8sUUFBUSxhQUFhLENBQUM7QUFDbkQ7QUFBQSxVQUNGO0FBRUEsZUFBSyxFQUFFLE1BQU0sU0FBUyxPQUFPLFFBQVEsTUFBTSxDQUFDO0FBQzVDO0FBQUEsUUFDRjtBQU1BLFlBQUksVUFBVSxLQUFLO0FBQ2pCLGNBQUksS0FBSyxjQUFjLFFBQVEsS0FBSyxNQUFNLEtBQUs7QUFDN0MsZ0JBQUksS0FBSyxDQUFDLE1BQU0sT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxHQUFHO0FBQzlDLDBCQUFZLFVBQVUsS0FBSztBQUMzQjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBRUEsY0FBSSxLQUFLLGFBQWEsUUFBUSxNQUFNLFVBQVUsR0FBRztBQUMvQyxtQkFBTztBQUNQO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsS0FBSztBQUNqQixjQUFJLEtBQUssY0FBYyxRQUFRLEtBQUssTUFBTSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUs7QUFDaEUsd0JBQVksUUFBUSxLQUFLO0FBQ3pCO0FBQUEsVUFDRjtBQUVBLGNBQUssUUFBUSxLQUFLLFVBQVUsT0FBUSxLQUFLLFVBQVUsT0FBTztBQUN4RCxpQkFBSyxFQUFFLE1BQU0sUUFBUSxPQUFPLFFBQVEsYUFBYSxDQUFDO0FBQ2xEO0FBQUEsVUFDRjtBQUVBLGNBQUssU0FBUyxLQUFLLFNBQVMsYUFBYSxLQUFLLFNBQVMsV0FBVyxLQUFLLFNBQVMsWUFBYSxNQUFNLFNBQVMsR0FBRztBQUM3RyxpQkFBSyxFQUFFLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFDNUI7QUFBQSxVQUNGO0FBRUEsZUFBSyxFQUFFLE1BQU0sUUFBUSxPQUFPLGFBQWEsQ0FBQztBQUMxQztBQUFBLFFBQ0Y7QUFNQSxZQUFJLFVBQVUsS0FBSztBQUNqQixjQUFJLEtBQUssY0FBYyxRQUFRLEtBQUssTUFBTSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUs7QUFDaEUsaUJBQUssRUFBRSxNQUFNLE1BQU0sU0FBUyxNQUFNLE9BQU8sUUFBUSxHQUFHLENBQUM7QUFDckQ7QUFBQSxVQUNGO0FBRUEsZUFBSyxFQUFFLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFDNUI7QUFBQSxRQUNGO0FBTUEsWUFBSSxVQUFVLEtBQUs7QUFDakIsY0FBSSxVQUFVLE9BQU8sVUFBVSxLQUFLO0FBQ2xDLG9CQUFRLEtBQUs7QUFBQSxVQUNmO0FBRUEsZ0JBQU0sUUFBUSx3QkFBd0IsS0FBSyxVQUFVLENBQUM7QUFDdEQsY0FBSSxPQUFPO0FBQ1QscUJBQVMsTUFBTTtBQUNmLGtCQUFNLFNBQVMsTUFBTSxHQUFHO0FBQUEsVUFDMUI7QUFFQSxlQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sQ0FBQztBQUM1QjtBQUFBLFFBQ0Y7QUFNQSxZQUFJLFNBQVMsS0FBSyxTQUFTLGNBQWMsS0FBSyxTQUFTLE9BQU87QUFDNUQsZUFBSyxPQUFPO0FBQ1osZUFBSyxPQUFPO0FBQ1osZUFBSyxTQUFTO0FBQ2QsZUFBSyxTQUFTO0FBQ2QsZ0JBQU0sWUFBWTtBQUNsQixnQkFBTSxXQUFXO0FBQ2pCLGtCQUFRLEtBQUs7QUFDYjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLE9BQU8sVUFBVTtBQUNyQixZQUFJLEtBQUssY0FBYyxRQUFRLFVBQVUsS0FBSyxJQUFJLEdBQUc7QUFDbkQsc0JBQVksUUFBUSxLQUFLO0FBQ3pCO0FBQUEsUUFDRjtBQUVBLFlBQUksS0FBSyxTQUFTLFFBQVE7QUFDeEIsY0FBSSxLQUFLLGVBQWUsTUFBTTtBQUM1QixvQkFBUSxLQUFLO0FBQ2I7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sUUFBUSxLQUFLO0FBQ25CLGdCQUFNLFNBQVMsTUFBTTtBQUNyQixnQkFBTSxVQUFVLE1BQU0sU0FBUyxXQUFXLE1BQU0sU0FBUztBQUN6RCxnQkFBTSxZQUFZLFdBQVcsT0FBTyxTQUFTLFVBQVUsT0FBTyxTQUFTO0FBRXZFLGNBQUksS0FBSyxTQUFTLFNBQVMsQ0FBQyxXQUFZLEtBQUssTUFBTSxLQUFLLE9BQU8sTUFBTztBQUNwRSxpQkFBSyxFQUFFLE1BQU0sUUFBUSxPQUFPLFFBQVEsR0FBRyxDQUFDO0FBQ3hDO0FBQUEsVUFDRjtBQUVBLGdCQUFNLFVBQVUsTUFBTSxTQUFTLE1BQU0sTUFBTSxTQUFTLFdBQVcsTUFBTSxTQUFTO0FBQzlFLGdCQUFNLFlBQVksU0FBUyxXQUFXLE1BQU0sU0FBUyxVQUFVLE1BQU0sU0FBUztBQUM5RSxjQUFJLENBQUMsV0FBVyxNQUFNLFNBQVMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXO0FBQ2hFLGlCQUFLLEVBQUUsTUFBTSxRQUFRLE9BQU8sUUFBUSxHQUFHLENBQUM7QUFDeEM7QUFBQSxVQUNGO0FBR0EsaUJBQU8sS0FBSyxNQUFNLEdBQUcsQ0FBQyxNQUFNLE9BQU87QUFDakMsa0JBQU0sUUFBUSxNQUFNLE1BQU0sUUFBUTtBQUNsQyxnQkFBSSxTQUFTLFVBQVUsS0FBSztBQUMxQjtBQUFBLFlBQ0Y7QUFDQSxtQkFBTyxLQUFLLE1BQU0sQ0FBQztBQUNuQixvQkFBUSxPQUFPLENBQUM7QUFBQSxVQUNsQjtBQUVBLGNBQUksTUFBTSxTQUFTLFNBQVMsSUFBSSxHQUFHO0FBQ2pDLGlCQUFLLE9BQU87QUFDWixpQkFBSyxTQUFTO0FBQ2QsaUJBQUssU0FBUyxTQUFTLElBQUk7QUFDM0Isa0JBQU0sU0FBUyxLQUFLO0FBQ3BCLGtCQUFNLFdBQVc7QUFDakIsb0JBQVEsS0FBSztBQUNiO0FBQUEsVUFDRjtBQUVBLGNBQUksTUFBTSxTQUFTLFdBQVcsTUFBTSxLQUFLLFNBQVMsU0FBUyxDQUFDLGFBQWEsSUFBSSxHQUFHO0FBQzlFLGtCQUFNLFNBQVMsTUFBTSxPQUFPLE1BQU0sR0FBRyxFQUFFLE1BQU0sU0FBUyxLQUFLLFFBQVEsTUFBTTtBQUN6RSxrQkFBTSxTQUFTLE1BQU0sTUFBTTtBQUUzQixpQkFBSyxPQUFPO0FBQ1osaUJBQUssU0FBUyxTQUFTLElBQUksS0FBSyxLQUFLLGdCQUFnQixNQUFNO0FBQzNELGlCQUFLLFNBQVM7QUFDZCxrQkFBTSxXQUFXO0FBQ2pCLGtCQUFNLFVBQVUsTUFBTSxTQUFTLEtBQUs7QUFDcEMsb0JBQVEsS0FBSztBQUNiO0FBQUEsVUFDRjtBQUVBLGNBQUksTUFBTSxTQUFTLFdBQVcsTUFBTSxLQUFLLFNBQVMsU0FBUyxLQUFLLE9BQU8sS0FBSztBQUMxRSxrQkFBTSxNQUFNLEtBQUssT0FBTyxTQUFTLE9BQU87QUFFeEMsa0JBQU0sU0FBUyxNQUFNLE9BQU8sTUFBTSxHQUFHLEVBQUUsTUFBTSxTQUFTLEtBQUssUUFBUSxNQUFNO0FBQ3pFLGtCQUFNLFNBQVMsTUFBTSxNQUFNO0FBRTNCLGlCQUFLLE9BQU87QUFDWixpQkFBSyxTQUFTLEdBQUcsU0FBUyxJQUFJLElBQUksaUJBQWlCLGdCQUFnQjtBQUNuRSxpQkFBSyxTQUFTO0FBRWQsa0JBQU0sVUFBVSxNQUFNLFNBQVMsS0FBSztBQUNwQyxrQkFBTSxXQUFXO0FBRWpCLG9CQUFRLFFBQVEsUUFBUSxDQUFDO0FBRXpCLGlCQUFLLEVBQUUsTUFBTSxTQUFTLE9BQU8sS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUM5QztBQUFBLFVBQ0Y7QUFFQSxjQUFJLE1BQU0sU0FBUyxTQUFTLEtBQUssT0FBTyxLQUFLO0FBQzNDLGlCQUFLLE9BQU87QUFDWixpQkFBSyxTQUFTO0FBQ2QsaUJBQUssU0FBUyxRQUFRLGlCQUFpQixTQUFTLElBQUksSUFBSTtBQUN4RCxrQkFBTSxTQUFTLEtBQUs7QUFDcEIsa0JBQU0sV0FBVztBQUNqQixvQkFBUSxRQUFRLFFBQVEsQ0FBQztBQUN6QixpQkFBSyxFQUFFLE1BQU0sU0FBUyxPQUFPLEtBQUssUUFBUSxHQUFHLENBQUM7QUFDOUM7QUFBQSxVQUNGO0FBR0EsZ0JBQU0sU0FBUyxNQUFNLE9BQU8sTUFBTSxHQUFHLENBQUMsS0FBSyxPQUFPLE1BQU07QUFHeEQsZUFBSyxPQUFPO0FBQ1osZUFBSyxTQUFTLFNBQVMsSUFBSTtBQUMzQixlQUFLLFNBQVM7QUFHZCxnQkFBTSxVQUFVLEtBQUs7QUFDckIsZ0JBQU0sV0FBVztBQUNqQixrQkFBUSxLQUFLO0FBQ2I7QUFBQSxRQUNGO0FBRUEsY0FBTSxRQUFRLEVBQUUsTUFBTSxRQUFRLE9BQU8sUUFBUSxLQUFLO0FBRWxELFlBQUksS0FBSyxTQUFTLE1BQU07QUFDdEIsZ0JBQU0sU0FBUztBQUNmLGNBQUksS0FBSyxTQUFTLFNBQVMsS0FBSyxTQUFTLFNBQVM7QUFDaEQsa0JBQU0sU0FBUyxRQUFRLE1BQU07QUFBQSxVQUMvQjtBQUNBLGVBQUssS0FBSztBQUNWO0FBQUEsUUFDRjtBQUVBLFlBQUksU0FBUyxLQUFLLFNBQVMsYUFBYSxLQUFLLFNBQVMsWUFBWSxLQUFLLFVBQVUsTUFBTTtBQUNyRixnQkFBTSxTQUFTO0FBQ2YsZUFBSyxLQUFLO0FBQ1Y7QUFBQSxRQUNGO0FBRUEsWUFBSSxNQUFNLFVBQVUsTUFBTSxTQUFTLEtBQUssU0FBUyxXQUFXLEtBQUssU0FBUyxPQUFPO0FBQy9FLGNBQUksS0FBSyxTQUFTLE9BQU87QUFDdkIsa0JBQU0sVUFBVTtBQUNoQixpQkFBSyxVQUFVO0FBQUEsVUFFakIsV0FBVyxLQUFLLFFBQVEsTUFBTTtBQUM1QixrQkFBTSxVQUFVO0FBQ2hCLGlCQUFLLFVBQVU7QUFBQSxVQUVqQixPQUFPO0FBQ0wsa0JBQU0sVUFBVTtBQUNoQixpQkFBSyxVQUFVO0FBQUEsVUFDakI7QUFFQSxjQUFJLEtBQUssTUFBTSxLQUFLO0FBQ2xCLGtCQUFNLFVBQVU7QUFDaEIsaUJBQUssVUFBVTtBQUFBLFVBQ2pCO0FBQUEsUUFDRjtBQUVBLGFBQUssS0FBSztBQUFBLE1BQ1o7QUFFQSxhQUFPLE1BQU0sV0FBVyxHQUFHO0FBQ3pCLFlBQUksS0FBSyxtQkFBbUI7QUFBTSxnQkFBTSxJQUFJLFlBQVksWUFBWSxXQUFXLEdBQUcsQ0FBQztBQUNuRixjQUFNLFNBQVMsTUFBTSxXQUFXLE1BQU0sUUFBUSxHQUFHO0FBQ2pELGtCQUFVLFVBQVU7QUFBQSxNQUN0QjtBQUVBLGFBQU8sTUFBTSxTQUFTLEdBQUc7QUFDdkIsWUFBSSxLQUFLLG1CQUFtQjtBQUFNLGdCQUFNLElBQUksWUFBWSxZQUFZLFdBQVcsR0FBRyxDQUFDO0FBQ25GLGNBQU0sU0FBUyxNQUFNLFdBQVcsTUFBTSxRQUFRLEdBQUc7QUFDakQsa0JBQVUsUUFBUTtBQUFBLE1BQ3BCO0FBRUEsYUFBTyxNQUFNLFNBQVMsR0FBRztBQUN2QixZQUFJLEtBQUssbUJBQW1CO0FBQU0sZ0JBQU0sSUFBSSxZQUFZLFlBQVksV0FBVyxHQUFHLENBQUM7QUFDbkYsY0FBTSxTQUFTLE1BQU0sV0FBVyxNQUFNLFFBQVEsR0FBRztBQUNqRCxrQkFBVSxRQUFRO0FBQUEsTUFDcEI7QUFFQSxVQUFJLEtBQUssa0JBQWtCLFNBQVMsS0FBSyxTQUFTLFVBQVUsS0FBSyxTQUFTLFlBQVk7QUFDcEYsYUFBSyxFQUFFLE1BQU0sZUFBZSxPQUFPLElBQUksUUFBUSxHQUFHLGlCQUFpQixDQUFDO0FBQUEsTUFDdEU7QUFHQSxVQUFJLE1BQU0sY0FBYyxNQUFNO0FBQzVCLGNBQU0sU0FBUztBQUVmLG1CQUFXLFNBQVMsTUFBTSxRQUFRO0FBQ2hDLGdCQUFNLFVBQVUsTUFBTSxVQUFVLE9BQU8sTUFBTSxTQUFTLE1BQU07QUFFNUQsY0FBSSxNQUFNLFFBQVE7QUFDaEIsa0JBQU0sVUFBVSxNQUFNO0FBQUEsVUFDeEI7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxJQUNUO0FBUUEsSUFBQUgsT0FBTSxZQUFZLENBQUMsT0FBTyxZQUFZO0FBQ3BDLFlBQU0sT0FBTyxFQUFFLEdBQUcsUUFBUTtBQUMxQixZQUFNLE1BQU0sT0FBTyxLQUFLLGNBQWMsV0FBVyxLQUFLLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSTtBQUN4RixZQUFNLE1BQU0sTUFBTTtBQUNsQixVQUFJLE1BQU0sS0FBSztBQUNiLGNBQU0sSUFBSSxZQUFZLGlCQUFpQix3Q0FBd0MsS0FBSztBQUFBLE1BQ3RGO0FBRUEsY0FBUSxhQUFhLFVBQVU7QUFDL0IsWUFBTSxRQUFRLE1BQU0sVUFBVSxPQUFPO0FBR3JDLFlBQU07QUFBQSxRQUNKO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGLElBQUksVUFBVSxVQUFVLEtBQUs7QUFFN0IsWUFBTSxRQUFRLEtBQUssTUFBTSxVQUFVO0FBQ25DLFlBQU0sV0FBVyxLQUFLLE1BQU0sZ0JBQWdCO0FBQzVDLFlBQU0sVUFBVSxLQUFLLFVBQVUsS0FBSztBQUNwQyxZQUFNLFFBQVEsRUFBRSxTQUFTLE9BQU8sUUFBUSxHQUFHO0FBQzNDLFVBQUksT0FBTyxLQUFLLFNBQVMsT0FBTyxRQUFRO0FBRXhDLFVBQUksS0FBSyxTQUFTO0FBQ2hCLGVBQU8sSUFBSTtBQUFBLE1BQ2I7QUFFQSxZQUFNLFdBQVcsQ0FBQUMsVUFBUTtBQUN2QixZQUFJQSxNQUFLLGVBQWU7QUFBTSxpQkFBTztBQUNyQyxlQUFPLElBQUksZ0JBQWdCLGVBQWVBLE1BQUssTUFBTSxhQUFhO0FBQUEsTUFDcEU7QUFFQSxZQUFNLFNBQVMsU0FBTztBQUNwQixnQkFBUTtBQUFBLGVBQ0Q7QUFDSCxtQkFBTyxHQUFHLFFBQVEsV0FBVztBQUFBLGVBRTFCO0FBQ0gsbUJBQU8sR0FBRyxjQUFjLFdBQVc7QUFBQSxlQUVoQztBQUNILG1CQUFPLEdBQUcsUUFBUSxPQUFPLGNBQWMsV0FBVztBQUFBLGVBRS9DO0FBQ0gsbUJBQU8sR0FBRyxRQUFRLE9BQU8sZ0JBQWdCLFdBQVcsV0FBVztBQUFBLGVBRTVEO0FBQ0gsbUJBQU8sUUFBUSxTQUFTLElBQUk7QUFBQSxlQUV6QjtBQUNILG1CQUFPLE1BQU0sUUFBUSxTQUFTLElBQUksSUFBSSxrQkFBa0IsV0FBVyxXQUFXO0FBQUEsZUFFM0U7QUFDSCxtQkFBTyxNQUFNLFFBQVEsU0FBUyxJQUFJLElBQUksa0JBQWtCLFdBQVcsT0FBTyxjQUFjLFdBQVc7QUFBQSxlQUVoRztBQUNILG1CQUFPLE1BQU0sUUFBUSxTQUFTLElBQUksSUFBSSxrQkFBa0IsY0FBYyxXQUFXO0FBQUEsbUJBRTFFO0FBQ1Asa0JBQU0sUUFBUSxpQkFBaUIsS0FBSyxHQUFHO0FBQ3ZDLGdCQUFJLENBQUM7QUFBTztBQUVaLGtCQUFNRyxVQUFTLE9BQU8sTUFBTSxFQUFFO0FBQzlCLGdCQUFJLENBQUNBO0FBQVE7QUFFYixtQkFBT0EsVUFBUyxjQUFjLE1BQU07QUFBQSxVQUN0QztBQUFBO0FBQUEsTUFFSjtBQUVBLFlBQU0sU0FBUyxNQUFNLGFBQWEsT0FBTyxLQUFLO0FBQzlDLFVBQUksU0FBUyxPQUFPLE1BQU07QUFFMUIsVUFBSSxVQUFVLEtBQUssa0JBQWtCLE1BQU07QUFDekMsa0JBQVUsR0FBRztBQUFBLE1BQ2Y7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQUVBLElBQUFMLFFBQU8sVUFBVUM7QUFBQTtBQUFBOzs7QUNsa0NqQjtBQUFBLDJEQUFBSyxTQUFBO0FBQUE7QUFBQTtBQUVBLFFBQU1DLFFBQU8sUUFBUTtBQUNyQixRQUFNLE9BQU87QUFDYixRQUFNQyxTQUFRO0FBQ2QsUUFBTSxRQUFRO0FBQ2QsUUFBTSxZQUFZO0FBQ2xCLFFBQU0sV0FBVyxTQUFPLE9BQU8sT0FBTyxRQUFRLFlBQVksQ0FBQyxNQUFNLFFBQVEsR0FBRztBQXdCNUUsUUFBTSxZQUFZLENBQUMsTUFBTSxTQUFTLGNBQWMsVUFBVTtBQUN4RCxVQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUc7QUFDdkIsY0FBTSxNQUFNLEtBQUssSUFBSSxXQUFTLFVBQVUsT0FBTyxTQUFTLFdBQVcsQ0FBQztBQUNwRSxjQUFNLGVBQWUsU0FBTztBQUMxQixxQkFBVyxXQUFXLEtBQUs7QUFDekIsa0JBQU1DLFNBQVEsUUFBUSxHQUFHO0FBQ3pCLGdCQUFJQTtBQUFPLHFCQUFPQTtBQUFBLFVBQ3BCO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFVBQVUsU0FBUyxJQUFJLEtBQUssS0FBSyxVQUFVLEtBQUs7QUFFdEQsVUFBSSxTQUFTLE1BQU8sT0FBTyxTQUFTLFlBQVksQ0FBQyxTQUFVO0FBQ3pELGNBQU0sSUFBSSxVQUFVLDJDQUEyQztBQUFBLE1BQ2pFO0FBRUEsWUFBTSxPQUFPLFdBQVcsQ0FBQztBQUN6QixZQUFNLFFBQVEsTUFBTSxVQUFVLE9BQU87QUFDckMsWUFBTUMsU0FBUSxVQUNWLFVBQVUsVUFBVSxNQUFNLE9BQU8sSUFDakMsVUFBVSxPQUFPLE1BQU0sU0FBUyxPQUFPLElBQUk7QUFFL0MsWUFBTSxRQUFRQSxPQUFNO0FBQ3BCLGFBQU9BLE9BQU07QUFFYixVQUFJLFlBQVksTUFBTTtBQUN0QixVQUFJLEtBQUssUUFBUTtBQUNmLGNBQU0sYUFBYSxFQUFFLEdBQUcsU0FBUyxRQUFRLE1BQU0sU0FBUyxNQUFNLFVBQVUsS0FBSztBQUM3RSxvQkFBWSxVQUFVLEtBQUssUUFBUSxZQUFZLFdBQVc7QUFBQSxNQUM1RDtBQUVBLFlBQU0sVUFBVSxDQUFDLE9BQU8sZUFBZSxVQUFVO0FBQy9DLGNBQU0sRUFBRSxTQUFTLE9BQU8sT0FBTyxJQUFJLFVBQVUsS0FBSyxPQUFPQSxRQUFPLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RixjQUFNLFNBQVMsRUFBRSxNQUFNLE9BQU8sT0FBQUEsUUFBTyxPQUFPLE9BQU8sUUFBUSxPQUFPLFFBQVE7QUFFMUUsWUFBSSxPQUFPLEtBQUssYUFBYSxZQUFZO0FBQ3ZDLGVBQUssU0FBUyxNQUFNO0FBQUEsUUFDdEI7QUFFQSxZQUFJLFlBQVksT0FBTztBQUNyQixpQkFBTyxVQUFVO0FBQ2pCLGlCQUFPLGVBQWUsU0FBUztBQUFBLFFBQ2pDO0FBRUEsWUFBSSxVQUFVLEtBQUssR0FBRztBQUNwQixjQUFJLE9BQU8sS0FBSyxhQUFhLFlBQVk7QUFDdkMsaUJBQUssU0FBUyxNQUFNO0FBQUEsVUFDdEI7QUFDQSxpQkFBTyxVQUFVO0FBQ2pCLGlCQUFPLGVBQWUsU0FBUztBQUFBLFFBQ2pDO0FBRUEsWUFBSSxPQUFPLEtBQUssWUFBWSxZQUFZO0FBQ3RDLGVBQUssUUFBUSxNQUFNO0FBQUEsUUFDckI7QUFDQSxlQUFPLGVBQWUsU0FBUztBQUFBLE1BQ2pDO0FBRUEsVUFBSSxhQUFhO0FBQ2YsZ0JBQVEsUUFBUTtBQUFBLE1BQ2xCO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFtQkEsY0FBVSxPQUFPLENBQUMsT0FBT0EsUUFBTyxTQUFTLEVBQUUsTUFBTSxNQUFNLElBQUksQ0FBQyxNQUFNO0FBQ2hFLFVBQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsY0FBTSxJQUFJLFVBQVUsK0JBQStCO0FBQUEsTUFDckQ7QUFFQSxVQUFJLFVBQVUsSUFBSTtBQUNoQixlQUFPLEVBQUUsU0FBUyxPQUFPLFFBQVEsR0FBRztBQUFBLE1BQ3RDO0FBRUEsWUFBTSxPQUFPLFdBQVcsQ0FBQztBQUN6QixZQUFNLFNBQVMsS0FBSyxXQUFXLFFBQVEsTUFBTSxpQkFBaUI7QUFDOUQsVUFBSSxRQUFRLFVBQVU7QUFDdEIsVUFBSSxTQUFVLFNBQVMsU0FBVSxPQUFPLEtBQUssSUFBSTtBQUVqRCxVQUFJLFVBQVUsT0FBTztBQUNuQixpQkFBUyxTQUFTLE9BQU8sS0FBSyxJQUFJO0FBQ2xDLGdCQUFRLFdBQVc7QUFBQSxNQUNyQjtBQUVBLFVBQUksVUFBVSxTQUFTLEtBQUssWUFBWSxNQUFNO0FBQzVDLFlBQUksS0FBSyxjQUFjLFFBQVEsS0FBSyxhQUFhLE1BQU07QUFDckQsa0JBQVEsVUFBVSxVQUFVLE9BQU9BLFFBQU8sU0FBUyxLQUFLO0FBQUEsUUFDMUQsT0FBTztBQUNMLGtCQUFRQSxPQUFNLEtBQUssTUFBTTtBQUFBLFFBQzNCO0FBQUEsTUFDRjtBQUVBLGFBQU8sRUFBRSxTQUFTLFFBQVEsS0FBSyxHQUFHLE9BQU8sT0FBTztBQUFBLElBQ2xEO0FBZ0JBLGNBQVUsWUFBWSxDQUFDLE9BQU8sTUFBTSxTQUFTLFFBQVEsTUFBTSxVQUFVLE9BQU8sTUFBTTtBQUNoRixZQUFNQSxTQUFRLGdCQUFnQixTQUFTLE9BQU8sVUFBVSxPQUFPLE1BQU0sT0FBTztBQUM1RSxhQUFPQSxPQUFNLEtBQUtILE1BQUssU0FBUyxLQUFLLENBQUM7QUFBQSxJQUN4QztBQW1CQSxjQUFVLFVBQVUsQ0FBQyxLQUFLLFVBQVUsWUFBWSxVQUFVLFVBQVUsT0FBTyxFQUFFLEdBQUc7QUFnQmhGLGNBQVUsUUFBUSxDQUFDSSxVQUFTLFlBQVk7QUFDdEMsVUFBSSxNQUFNLFFBQVFBLFFBQU87QUFBRyxlQUFPQSxTQUFRLElBQUksT0FBSyxVQUFVLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDL0UsYUFBT0gsT0FBTUcsVUFBUyxFQUFFLEdBQUcsU0FBUyxXQUFXLE1BQU0sQ0FBQztBQUFBLElBQ3hEO0FBNkJBLGNBQVUsT0FBTyxDQUFDLE9BQU8sWUFBWSxLQUFLLE9BQU8sT0FBTztBQWN4RCxjQUFVLFlBQVksQ0FBQyxPQUFPLFNBQVMsZUFBZSxPQUFPLGNBQWMsVUFBVTtBQUNuRixVQUFJLGlCQUFpQixNQUFNO0FBQ3pCLGVBQU8sTUFBTTtBQUFBLE1BQ2Y7QUFFQSxZQUFNLE9BQU8sV0FBVyxDQUFDO0FBQ3pCLFlBQU0sVUFBVSxLQUFLLFdBQVcsS0FBSztBQUNyQyxZQUFNLFNBQVMsS0FBSyxXQUFXLEtBQUs7QUFFcEMsVUFBSSxTQUFTLEdBQUcsYUFBYSxNQUFNLFVBQVU7QUFDN0MsVUFBSSxTQUFTLE1BQU0sWUFBWSxNQUFNO0FBQ25DLGlCQUFTLE9BQU87QUFBQSxNQUNsQjtBQUVBLFlBQU1ELFNBQVEsVUFBVSxRQUFRLFFBQVEsT0FBTztBQUMvQyxVQUFJLGdCQUFnQixNQUFNO0FBQ3hCLFFBQUFBLE9BQU0sUUFBUTtBQUFBLE1BQ2hCO0FBRUEsYUFBT0E7QUFBQSxJQUNUO0FBcUJBLGNBQVUsU0FBUyxDQUFDLE9BQU8sVUFBVSxDQUFDLEdBQUcsZUFBZSxPQUFPLGNBQWMsVUFBVTtBQUNyRixVQUFJLENBQUMsU0FBUyxPQUFPLFVBQVUsVUFBVTtBQUN2QyxjQUFNLElBQUksVUFBVSw2QkFBNkI7QUFBQSxNQUNuRDtBQUVBLFVBQUksU0FBUyxFQUFFLFNBQVMsT0FBTyxXQUFXLEtBQUs7QUFFL0MsVUFBSSxRQUFRLGNBQWMsVUFBVSxNQUFNLE9BQU8sT0FBTyxNQUFNLE9BQU8sTUFBTTtBQUN6RSxlQUFPLFNBQVNGLE9BQU0sVUFBVSxPQUFPLE9BQU87QUFBQSxNQUNoRDtBQUVBLFVBQUksQ0FBQyxPQUFPLFFBQVE7QUFDbEIsaUJBQVNBLE9BQU0sT0FBTyxPQUFPO0FBQUEsTUFDL0I7QUFFQSxhQUFPLFVBQVUsVUFBVSxRQUFRLFNBQVMsY0FBYyxXQUFXO0FBQUEsSUFDdkU7QUFtQkEsY0FBVSxVQUFVLENBQUMsUUFBUSxZQUFZO0FBQ3ZDLFVBQUk7QUFDRixjQUFNLE9BQU8sV0FBVyxDQUFDO0FBQ3pCLGVBQU8sSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEtBQUssU0FBUyxNQUFNLEdBQUc7QUFBQSxNQUNsRSxTQUFTLEtBQVA7QUFDQSxZQUFJLFdBQVcsUUFBUSxVQUFVO0FBQU0sZ0JBQU07QUFDN0MsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBT0EsY0FBVSxZQUFZO0FBTXRCLElBQUFGLFFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ3JWakIsSUFBQU0scUJBQUE7QUFBQSxtREFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxJQUFBQSxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUNGakI7QUFBQSxvREFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxRQUFNLE9BQU8sUUFBUTtBQUNyQixRQUFNLFNBQVM7QUFDZixRQUFNLFlBQVk7QUFDbEIsUUFBTSxRQUFRO0FBQ2QsUUFBTSxnQkFBZ0IsU0FBTyxRQUFRLE1BQU0sUUFBUTtBQW9CbkQsUUFBTSxhQUFhLENBQUMsTUFBTSxVQUFVLFlBQVk7QUFDOUMsaUJBQVcsQ0FBQyxFQUFFLE9BQU8sUUFBUTtBQUM3QixhQUFPLENBQUMsRUFBRSxPQUFPLElBQUk7QUFFckIsVUFBSSxPQUFPLG9CQUFJLElBQUk7QUFDbkIsVUFBSSxPQUFPLG9CQUFJLElBQUk7QUFDbkIsVUFBSSxRQUFRLG9CQUFJLElBQUk7QUFDcEIsVUFBSSxZQUFZO0FBRWhCLFVBQUksV0FBVyxXQUFTO0FBQ3RCLGNBQU0sSUFBSSxNQUFNLE1BQU07QUFDdEIsWUFBSSxXQUFXLFFBQVEsVUFBVTtBQUMvQixrQkFBUSxTQUFTLEtBQUs7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFFQSxlQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3hDLFlBQUksVUFBVSxVQUFVLE9BQU8sU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLFNBQVMsU0FBUyxHQUFHLElBQUk7QUFDM0UsWUFBSSxVQUFVLFFBQVEsTUFBTSxXQUFXLFFBQVEsTUFBTTtBQUNyRCxZQUFJO0FBQVM7QUFFYixpQkFBUyxRQUFRLE1BQU07QUFDckIsY0FBSSxVQUFVLFFBQVEsTUFBTSxJQUFJO0FBRWhDLGNBQUksUUFBUSxVQUFVLENBQUMsUUFBUSxVQUFVLFFBQVE7QUFDakQsY0FBSSxDQUFDO0FBQU87QUFFWixjQUFJLFNBQVM7QUFDWCxpQkFBSyxJQUFJLFFBQVEsTUFBTTtBQUFBLFVBQ3pCLE9BQU87QUFDTCxpQkFBSyxPQUFPLFFBQVEsTUFBTTtBQUMxQixpQkFBSyxJQUFJLFFBQVEsTUFBTTtBQUFBLFVBQ3pCO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLFNBQVMsY0FBYyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSTtBQUNsRSxVQUFJLFVBQVUsT0FBTyxPQUFPLFVBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO0FBRW5ELFVBQUksV0FBVyxRQUFRLFdBQVcsR0FBRztBQUNuQyxZQUFJLFFBQVEsYUFBYSxNQUFNO0FBQzdCLGdCQUFNLElBQUksTUFBTSx5QkFBeUIsU0FBUyxLQUFLLElBQUksSUFBSTtBQUFBLFFBQ2pFO0FBRUEsWUFBSSxRQUFRLFdBQVcsUUFBUSxRQUFRLGFBQWEsTUFBTTtBQUN4RCxpQkFBTyxRQUFRLFdBQVcsU0FBUyxJQUFJLE9BQUssRUFBRSxRQUFRLE9BQU8sRUFBRSxDQUFDLElBQUk7QUFBQSxRQUN0RTtBQUFBLE1BQ0Y7QUFFQSxhQUFPO0FBQUEsSUFDVDtBQU1BLGVBQVcsUUFBUTtBQXFCbkIsZUFBVyxVQUFVLENBQUNDLFVBQVMsWUFBWSxVQUFVQSxVQUFTLE9BQU87QUFtQnJFLGVBQVcsVUFBVSxDQUFDLEtBQUssVUFBVSxZQUFZLFVBQVUsVUFBVSxPQUFPLEVBQUUsR0FBRztBQU1qRixlQUFXLE1BQU0sV0FBVztBQW1CNUIsZUFBVyxNQUFNLENBQUMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUFNO0FBQ2pELGlCQUFXLENBQUMsRUFBRSxPQUFPLFFBQVEsRUFBRSxJQUFJLE1BQU07QUFDekMsVUFBSSxTQUFTLG9CQUFJLElBQUk7QUFDckIsVUFBSSxRQUFRLENBQUM7QUFFYixVQUFJLFdBQVcsV0FBUztBQUN0QixZQUFJLFFBQVE7QUFBVSxrQkFBUSxTQUFTLEtBQUs7QUFDNUMsY0FBTSxLQUFLLE1BQU0sTUFBTTtBQUFBLE1BQ3pCO0FBRUEsVUFBSSxVQUFVLElBQUksSUFBSSxXQUFXLE1BQU0sVUFBVSxFQUFFLEdBQUcsU0FBUyxTQUFTLENBQUMsQ0FBQztBQUUxRSxlQUFTLFFBQVEsT0FBTztBQUN0QixZQUFJLENBQUMsUUFBUSxJQUFJLElBQUksR0FBRztBQUN0QixpQkFBTyxJQUFJLElBQUk7QUFBQSxRQUNqQjtBQUFBLE1BQ0Y7QUFDQSxhQUFPLENBQUMsR0FBRyxNQUFNO0FBQUEsSUFDbkI7QUFzQkEsZUFBVyxXQUFXLENBQUMsS0FBS0EsVUFBUyxZQUFZO0FBQy9DLFVBQUksT0FBTyxRQUFRLFVBQVU7QUFDM0IsY0FBTSxJQUFJLFVBQVUsdUJBQXVCLEtBQUssUUFBUSxHQUFHLElBQUk7QUFBQSxNQUNqRTtBQUVBLFVBQUksTUFBTSxRQUFRQSxRQUFPLEdBQUc7QUFDMUIsZUFBT0EsU0FBUSxLQUFLLE9BQUssV0FBVyxTQUFTLEtBQUssR0FBRyxPQUFPLENBQUM7QUFBQSxNQUMvRDtBQUVBLFVBQUksT0FBT0EsYUFBWSxVQUFVO0FBQy9CLFlBQUksY0FBYyxHQUFHLEtBQUssY0FBY0EsUUFBTyxHQUFHO0FBQ2hELGlCQUFPO0FBQUEsUUFDVDtBQUVBLFlBQUksSUFBSSxTQUFTQSxRQUFPLEtBQU0sSUFBSSxXQUFXLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxFQUFFLFNBQVNBLFFBQU8sR0FBSTtBQUNyRixpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBRUEsYUFBTyxXQUFXLFFBQVEsS0FBS0EsVUFBUyxFQUFFLEdBQUcsU0FBUyxVQUFVLEtBQUssQ0FBQztBQUFBLElBQ3hFO0FBc0JBLGVBQVcsWUFBWSxDQUFDLEtBQUssVUFBVSxZQUFZO0FBQ2pELFVBQUksQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLGNBQU0sSUFBSSxVQUFVLDZDQUE2QztBQUFBLE1BQ25FO0FBQ0EsVUFBSSxPQUFPLFdBQVcsT0FBTyxLQUFLLEdBQUcsR0FBRyxVQUFVLE9BQU87QUFDekQsVUFBSSxNQUFNLENBQUM7QUFDWCxlQUFTLE9BQU87QUFBTSxZQUFJLE9BQU8sSUFBSTtBQUNyQyxhQUFPO0FBQUEsSUFDVDtBQXFCQSxlQUFXLE9BQU8sQ0FBQyxNQUFNLFVBQVUsWUFBWTtBQUM3QyxVQUFJLFFBQVEsQ0FBQyxFQUFFLE9BQU8sSUFBSTtBQUUxQixlQUFTQSxZQUFXLENBQUMsRUFBRSxPQUFPLFFBQVEsR0FBRztBQUN2QyxZQUFJLFVBQVUsVUFBVSxPQUFPQSxRQUFPLEdBQUcsT0FBTztBQUNoRCxZQUFJLE1BQU0sS0FBSyxVQUFRLFFBQVEsSUFBSSxDQUFDLEdBQUc7QUFDckMsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBMEJBLGVBQVcsUUFBUSxDQUFDLE1BQU0sVUFBVSxZQUFZO0FBQzlDLFVBQUksUUFBUSxDQUFDLEVBQUUsT0FBTyxJQUFJO0FBRTFCLGVBQVNBLFlBQVcsQ0FBQyxFQUFFLE9BQU8sUUFBUSxHQUFHO0FBQ3ZDLFlBQUksVUFBVSxVQUFVLE9BQU9BLFFBQU8sR0FBRyxPQUFPO0FBQ2hELFlBQUksQ0FBQyxNQUFNLE1BQU0sVUFBUSxRQUFRLElBQUksQ0FBQyxHQUFHO0FBQ3ZDLGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQTZCQSxlQUFXLE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWTtBQUMzQyxVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGNBQU0sSUFBSSxVQUFVLHVCQUF1QixLQUFLLFFBQVEsR0FBRyxJQUFJO0FBQUEsTUFDakU7QUFFQSxhQUFPLENBQUMsRUFBRSxPQUFPLFFBQVEsRUFBRSxNQUFNLE9BQUssVUFBVSxHQUFHLE9BQU8sRUFBRSxHQUFHLENBQUM7QUFBQSxJQUNsRTtBQXFCQSxlQUFXLFVBQVUsQ0FBQyxNQUFNLE9BQU8sWUFBWTtBQUM3QyxVQUFJLFFBQVEsTUFBTSxVQUFVLE9BQU87QUFDbkMsVUFBSUMsU0FBUSxVQUFVLE9BQU8sT0FBTyxJQUFJLEdBQUcsRUFBRSxHQUFHLFNBQVMsU0FBUyxLQUFLLENBQUM7QUFDeEUsVUFBSSxRQUFRQSxPQUFNLEtBQUssUUFBUSxNQUFNLGVBQWUsS0FBSyxJQUFJLEtBQUs7QUFFbEUsVUFBSSxPQUFPO0FBQ1QsZUFBTyxNQUFNLE1BQU0sQ0FBQyxFQUFFLElBQUksT0FBSyxNQUFNLFNBQVMsS0FBSyxDQUFDO0FBQUEsTUFDdEQ7QUFBQSxJQUNGO0FBa0JBLGVBQVcsU0FBUyxJQUFJLFNBQVMsVUFBVSxPQUFPLEdBQUcsSUFBSTtBQWdCekQsZUFBVyxPQUFPLElBQUksU0FBUyxVQUFVLEtBQUssR0FBRyxJQUFJO0FBZ0JyRCxlQUFXLFFBQVEsQ0FBQyxVQUFVLFlBQVk7QUFDeEMsVUFBSSxNQUFNLENBQUM7QUFDWCxlQUFTRCxZQUFXLENBQUMsRUFBRSxPQUFPLFlBQVksQ0FBQyxDQUFDLEdBQUc7QUFDN0MsaUJBQVMsT0FBTyxPQUFPLE9BQU9BLFFBQU8sR0FBRyxPQUFPLEdBQUc7QUFDaEQsY0FBSSxLQUFLLFVBQVUsTUFBTSxLQUFLLE9BQU8sQ0FBQztBQUFBLFFBQ3hDO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBbUJBLGVBQVcsU0FBUyxDQUFDQSxVQUFTLFlBQVk7QUFDeEMsVUFBSSxPQUFPQSxhQUFZO0FBQVUsY0FBTSxJQUFJLFVBQVUsbUJBQW1CO0FBQ3hFLFVBQUssV0FBVyxRQUFRLFlBQVksUUFBUyxDQUFDLFNBQVMsS0FBS0EsUUFBTyxHQUFHO0FBQ3BFLGVBQU8sQ0FBQ0EsUUFBTztBQUFBLE1BQ2pCO0FBQ0EsYUFBTyxPQUFPQSxVQUFTLE9BQU87QUFBQSxJQUNoQztBQU1BLGVBQVcsY0FBYyxDQUFDQSxVQUFTLFlBQVk7QUFDN0MsVUFBSSxPQUFPQSxhQUFZO0FBQVUsY0FBTSxJQUFJLFVBQVUsbUJBQW1CO0FBQ3hFLGFBQU8sV0FBVyxPQUFPQSxVQUFTLEVBQUUsR0FBRyxTQUFTLFFBQVEsS0FBSyxDQUFDO0FBQUEsSUFDaEU7QUFNQSxJQUFBRCxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUNsZGpCO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEseUJBQXlCLFFBQVEsV0FBVyxRQUFRLHNCQUFzQixRQUFRLFNBQVMsUUFBUSxrQkFBa0IsUUFBUSx1QkFBdUIsUUFBUSxtQ0FBbUMsUUFBUSxnQ0FBZ0MsUUFBUSx3QkFBd0IsUUFBUSxjQUFjLFFBQVEsbUJBQW1CLFFBQVEsb0NBQW9DLFFBQVEscUNBQXFDLFFBQVEsb0NBQW9DLFFBQVEsc0JBQXNCLFFBQVEsc0JBQXNCLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsMkJBQTJCLFFBQVEsMkJBQTJCLFFBQVEsbUJBQW1CLFFBQVEsa0JBQWtCO0FBQ3ByQixRQUFNRyxRQUFPLFFBQVE7QUFDckIsUUFBTSxhQUFhO0FBQ25CLFFBQU0sYUFBYTtBQUNuQixRQUFNLFdBQVc7QUFDakIsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTSx5QkFBeUI7QUFDL0IsUUFBTSxtQ0FBbUM7QUFDekMsUUFBTSx5QkFBeUI7QUFDL0IsUUFBTSw0QkFBNEI7QUFDbEMsUUFBTSxnQ0FBZ0M7QUFLdEMsUUFBTSxrQkFBa0I7QUFDeEIsYUFBUyxnQkFBZ0JDLFVBQVMsVUFBVSxDQUFDLEdBQUc7QUFDNUMsYUFBTyxDQUFDQyxrQkFBaUJELFVBQVMsT0FBTztBQUFBLElBQzdDO0FBQ0EsWUFBUSxrQkFBa0I7QUFDMUIsYUFBU0Msa0JBQWlCRCxVQUFTLFVBQVUsQ0FBQyxHQUFHO0FBTTdDLFVBQUlBLGFBQVksSUFBSTtBQUNoQixlQUFPO0FBQUEsTUFDWDtBQUtBLFVBQUksUUFBUSx1QkFBdUIsU0FBU0EsU0FBUSxTQUFTLGFBQWEsR0FBRztBQUN6RSxlQUFPO0FBQUEsTUFDWDtBQUNBLFVBQUksdUJBQXVCLEtBQUtBLFFBQU8sS0FBSyxpQ0FBaUMsS0FBS0EsUUFBTyxLQUFLLHVCQUF1QixLQUFLQSxRQUFPLEdBQUc7QUFDaEksZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLFFBQVEsWUFBWSxTQUFTLDBCQUEwQixLQUFLQSxRQUFPLEdBQUc7QUFDdEUsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLFFBQVEsbUJBQW1CLFNBQVMsa0JBQWtCQSxRQUFPLEdBQUc7QUFDaEUsZUFBTztBQUFBLE1BQ1g7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLFlBQVEsbUJBQW1CQztBQUMzQixhQUFTLGtCQUFrQkQsVUFBUztBQUNoQyxZQUFNLG9CQUFvQkEsU0FBUSxRQUFRLEdBQUc7QUFDN0MsVUFBSSxzQkFBc0IsSUFBSTtBQUMxQixlQUFPO0FBQUEsTUFDWDtBQUNBLFlBQU0sb0JBQW9CQSxTQUFRLFFBQVEsS0FBSyxvQkFBb0IsQ0FBQztBQUNwRSxVQUFJLHNCQUFzQixJQUFJO0FBQzFCLGVBQU87QUFBQSxNQUNYO0FBQ0EsWUFBTSxlQUFlQSxTQUFRLE1BQU0sbUJBQW1CLGlCQUFpQjtBQUN2RSxhQUFPLDhCQUE4QixLQUFLLFlBQVk7QUFBQSxJQUMxRDtBQUNBLGFBQVMseUJBQXlCQSxVQUFTO0FBQ3ZDLGFBQU9FLG1CQUFrQkYsUUFBTyxJQUFJQSxTQUFRLE1BQU0sQ0FBQyxJQUFJQTtBQUFBLElBQzNEO0FBQ0EsWUFBUSwyQkFBMkI7QUFDbkMsYUFBUyx5QkFBeUJBLFVBQVM7QUFDdkMsYUFBTyxNQUFNQTtBQUFBLElBQ2pCO0FBQ0EsWUFBUSwyQkFBMkI7QUFDbkMsYUFBU0UsbUJBQWtCRixVQUFTO0FBQ2hDLGFBQU9BLFNBQVEsV0FBVyxHQUFHLEtBQUtBLFNBQVEsT0FBTztBQUFBLElBQ3JEO0FBQ0EsWUFBUSxvQkFBb0JFO0FBQzVCLGFBQVMsa0JBQWtCRixVQUFTO0FBQ2hDLGFBQU8sQ0FBQ0UsbUJBQWtCRixRQUFPO0FBQUEsSUFDckM7QUFDQSxZQUFRLG9CQUFvQjtBQUM1QixhQUFTLG9CQUFvQixVQUFVO0FBQ25DLGFBQU8sU0FBUyxPQUFPRSxrQkFBaUI7QUFBQSxJQUM1QztBQUNBLFlBQVEsc0JBQXNCO0FBQzlCLGFBQVMsb0JBQW9CLFVBQVU7QUFDbkMsYUFBTyxTQUFTLE9BQU8saUJBQWlCO0FBQUEsSUFDNUM7QUFDQSxZQUFRLHNCQUFzQjtBQVE5QixhQUFTLGtDQUFrQyxVQUFVO0FBQ2pELGFBQU8sU0FBUyxPQUFPLENBQUNGLGFBQVksQ0FBQyxrQ0FBa0NBLFFBQU8sQ0FBQztBQUFBLElBQ25GO0FBQ0EsWUFBUSxvQ0FBb0M7QUFRNUMsYUFBUyxtQ0FBbUMsVUFBVTtBQUNsRCxhQUFPLFNBQVMsT0FBTyxpQ0FBaUM7QUFBQSxJQUM1RDtBQUNBLFlBQVEscUNBQXFDO0FBQzdDLGFBQVMsa0NBQWtDQSxVQUFTO0FBQ2hELGFBQU9BLFNBQVEsV0FBVyxJQUFJLEtBQUtBLFNBQVEsV0FBVyxNQUFNO0FBQUEsSUFDaEU7QUFDQSxZQUFRLG9DQUFvQztBQUM1QyxhQUFTLGlCQUFpQkEsVUFBUztBQUMvQixhQUFPLFdBQVdBLFVBQVMsRUFBRSxpQkFBaUIsTUFBTSxDQUFDO0FBQUEsSUFDekQ7QUFDQSxZQUFRLG1CQUFtQjtBQUMzQixhQUFTLFlBQVlBLFVBQVM7QUFDMUIsYUFBT0EsU0FBUSxTQUFTLFFBQVE7QUFBQSxJQUNwQztBQUNBLFlBQVEsY0FBYztBQUN0QixhQUFTLHNCQUFzQkEsVUFBUztBQUNwQyxhQUFPQSxTQUFRLFNBQVMsTUFBTSxRQUFRO0FBQUEsSUFDMUM7QUFDQSxZQUFRLHdCQUF3QjtBQUNoQyxhQUFTLDhCQUE4QkEsVUFBUztBQUM1QyxZQUFNLFdBQVdELE1BQUssU0FBU0MsUUFBTztBQUN0QyxhQUFPLHNCQUFzQkEsUUFBTyxLQUFLLGdCQUFnQixRQUFRO0FBQUEsSUFDckU7QUFDQSxZQUFRLGdDQUFnQztBQUN4QyxhQUFTLGlDQUFpQyxVQUFVO0FBQ2hELGFBQU8sU0FBUyxPQUFPLENBQUMsWUFBWUEsYUFBWTtBQUM1QyxlQUFPLFdBQVcsT0FBTyxxQkFBcUJBLFFBQU8sQ0FBQztBQUFBLE1BQzFELEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDVDtBQUNBLFlBQVEsbUNBQW1DO0FBQzNDLGFBQVMscUJBQXFCQSxVQUFTO0FBQ25DLFlBQU0sV0FBVyxXQUFXLE9BQU9BLFVBQVMsRUFBRSxRQUFRLE1BQU0sU0FBUyxNQUFNLGNBQWMsS0FBSyxDQUFDO0FBSy9GLGVBQVMsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNO0FBSTNDLGFBQU8sU0FBUyxPQUFPLENBQUNBLGFBQVlBLGFBQVksRUFBRTtBQUFBLElBQ3REO0FBQ0EsWUFBUSx1QkFBdUI7QUFDL0IsYUFBUyxnQkFBZ0JBLFVBQVMsU0FBUztBQUN2QyxVQUFJLEVBQUUsTUFBTSxJQUFJLFdBQVcsS0FBS0EsVUFBUyxPQUFPLE9BQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxPQUFPLEdBQUcsRUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDO0FBS25HLFVBQUksTUFBTSxXQUFXLEdBQUc7QUFDcEIsZ0JBQVEsQ0FBQ0EsUUFBTztBQUFBLE1BQ3BCO0FBS0EsVUFBSSxNQUFNLEdBQUcsV0FBVyxHQUFHLEdBQUc7QUFDMUIsY0FBTSxLQUFLLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDM0IsY0FBTSxRQUFRLEVBQUU7QUFBQSxNQUNwQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsWUFBUSxrQkFBa0I7QUFDMUIsYUFBUyxPQUFPQSxVQUFTLFNBQVM7QUFDOUIsYUFBTyxXQUFXLE9BQU9BLFVBQVMsT0FBTztBQUFBLElBQzdDO0FBQ0EsWUFBUSxTQUFTO0FBQ2pCLGFBQVMsb0JBQW9CLFVBQVUsU0FBUztBQUM1QyxhQUFPLFNBQVMsSUFBSSxDQUFDQSxhQUFZLE9BQU9BLFVBQVMsT0FBTyxDQUFDO0FBQUEsSUFDN0Q7QUFDQSxZQUFRLHNCQUFzQjtBQUM5QixhQUFTLFNBQVMsT0FBTyxZQUFZO0FBQ2pDLGFBQU8sV0FBVyxLQUFLLENBQUMsY0FBYyxVQUFVLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDL0Q7QUFDQSxZQUFRLFdBQVc7QUFLbkIsYUFBUyx1QkFBdUJBLFVBQVM7QUFDckMsYUFBT0EsU0FBUSxRQUFRLGlCQUFpQixHQUFHO0FBQUEsSUFDL0M7QUFDQSxZQUFRLHlCQUF5QjtBQUFBO0FBQUE7OztBQzNMakM7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSxRQUFRO0FBQ2hCLFFBQU1HLFVBQVM7QUFDZixhQUFTLE1BQU0sU0FBUztBQUNwQixZQUFNLGVBQWVBLFFBQU8sT0FBTztBQUNuQyxjQUFRLFFBQVEsQ0FBQyxXQUFXO0FBQ3hCLGVBQU8sS0FBSyxTQUFTLENBQUMsVUFBVSxhQUFhLEtBQUssU0FBUyxLQUFLLENBQUM7QUFBQSxNQUNyRSxDQUFDO0FBQ0QsbUJBQWEsS0FBSyxTQUFTLE1BQU0sNkJBQTZCLE9BQU8sQ0FBQztBQUN0RSxtQkFBYSxLQUFLLE9BQU8sTUFBTSw2QkFBNkIsT0FBTyxDQUFDO0FBQ3BFLGFBQU87QUFBQSxJQUNYO0FBQ0EsWUFBUSxRQUFRO0FBQ2hCLGFBQVMsNkJBQTZCLFNBQVM7QUFDM0MsY0FBUSxRQUFRLENBQUMsV0FBVyxPQUFPLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDcEQ7QUFBQTtBQUFBOzs7QUNoQkE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSxVQUFVLFFBQVEsV0FBVztBQUNyQyxhQUFTLFNBQVMsT0FBTztBQUNyQixhQUFPLE9BQU8sVUFBVTtBQUFBLElBQzVCO0FBQ0EsWUFBUSxXQUFXO0FBQ25CLGFBQVMsUUFBUSxPQUFPO0FBQ3BCLGFBQU8sVUFBVTtBQUFBLElBQ3JCO0FBQ0EsWUFBUSxVQUFVO0FBQUE7QUFBQTs7O0FDVmxCLElBQUFDLGlCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEsU0FBUyxRQUFRLFNBQVMsUUFBUSxVQUFVLFFBQVEsT0FBTyxRQUFRLEtBQUssUUFBUSxRQUFRLFFBQVEsUUFBUTtBQUNoSCxRQUFNLFFBQVE7QUFDZCxZQUFRLFFBQVE7QUFDaEIsUUFBTSxRQUFRO0FBQ2QsWUFBUSxRQUFRO0FBQ2hCLFFBQU1DLE1BQUs7QUFDWCxZQUFRLEtBQUtBO0FBQ2IsUUFBTUMsUUFBTztBQUNiLFlBQVEsT0FBT0E7QUFDZixRQUFNQyxXQUFVO0FBQ2hCLFlBQVEsVUFBVUE7QUFDbEIsUUFBTSxTQUFTO0FBQ2YsWUFBUSxTQUFTO0FBQ2pCLFFBQU0sU0FBUztBQUNmLFlBQVEsU0FBUztBQUFBO0FBQUE7OztBQ2hCakI7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSw0QkFBNEIsUUFBUSw4QkFBOEIsUUFBUSwrQkFBK0IsUUFBUSxnQ0FBZ0MsUUFBUSxzQkFBc0IsUUFBUSx5QkFBeUIsUUFBUSxXQUFXO0FBQzNPLFFBQU0sUUFBUTtBQUNkLGFBQVMsU0FBUyxPQUFPLFVBQVU7QUFDL0IsWUFBTSxXQUFXLGdCQUFnQixPQUFPLFFBQVE7QUFDaEQsWUFBTSxTQUFTLGdCQUFnQixTQUFTLFFBQVEsUUFBUTtBQUN4RCxZQUFNLG1CQUFtQixvQkFBb0IsUUFBUTtBQUNyRCxZQUFNLG1CQUFtQiw4QkFBOEIsVUFBVSxNQUFNO0FBQ3ZFLFlBQU0saUJBQWlCLGlCQUFpQixPQUFPLENBQUNDLGFBQVksTUFBTSxRQUFRLGdCQUFnQkEsVUFBUyxRQUFRLENBQUM7QUFDNUcsWUFBTSxrQkFBa0IsaUJBQWlCLE9BQU8sQ0FBQ0EsYUFBWSxNQUFNLFFBQVEsaUJBQWlCQSxVQUFTLFFBQVEsQ0FBQztBQUM5RyxZQUFNLGNBQWMsdUJBQXVCLGdCQUFnQixrQkFBZ0MsS0FBSztBQUNoRyxZQUFNLGVBQWUsdUJBQXVCLGlCQUFpQixrQkFBZ0MsSUFBSTtBQUNqRyxhQUFPLFlBQVksT0FBTyxZQUFZO0FBQUEsSUFDMUM7QUFDQSxZQUFRLFdBQVc7QUFDbkIsYUFBUyxnQkFBZ0IsT0FBTyxVQUFVO0FBQ3RDLFVBQUksV0FBVztBQVFmLFVBQUksU0FBUyxnQkFBZ0I7QUFDekIsbUJBQVcsTUFBTSxRQUFRLGlDQUFpQyxRQUFRO0FBQUEsTUFDdEU7QUFTQSxVQUFJLFNBQVMsZUFBZTtBQUN4QixtQkFBVyxTQUFTLElBQUksQ0FBQ0EsYUFBWUEsU0FBUSxTQUFTLEdBQUcsSUFBSUEsV0FBVSxNQUFNQSxVQUFTO0FBQUEsTUFDMUY7QUFJQSxhQUFPLFNBQVMsSUFBSSxDQUFDQSxhQUFZLE1BQU0sUUFBUSx1QkFBdUJBLFFBQU8sQ0FBQztBQUFBLElBQ2xGO0FBT0EsYUFBUyx1QkFBdUIsVUFBVSxVQUFVLFNBQVM7QUFDekQsWUFBTSxRQUFRLENBQUM7QUFDZixZQUFNLGtDQUFrQyxNQUFNLFFBQVEsbUNBQW1DLFFBQVE7QUFDakcsWUFBTSxpQ0FBaUMsTUFBTSxRQUFRLGtDQUFrQyxRQUFRO0FBQy9GLFlBQU0sK0JBQStCLDZCQUE2QiwrQkFBK0I7QUFDakcsWUFBTSw4QkFBOEIsNkJBQTZCLDhCQUE4QjtBQUMvRixZQUFNLEtBQUssR0FBRyw0QkFBNEIsOEJBQThCLFVBQVUsT0FBTyxDQUFDO0FBSzFGLFVBQUksT0FBTyw2QkFBNkI7QUFDcEMsY0FBTSxLQUFLLDBCQUEwQixLQUFLLGdDQUFnQyxVQUFVLE9BQU8sQ0FBQztBQUFBLE1BQ2hHLE9BQ0s7QUFDRCxjQUFNLEtBQUssR0FBRyw0QkFBNEIsNkJBQTZCLFVBQVUsT0FBTyxDQUFDO0FBQUEsTUFDN0Y7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLFlBQVEseUJBQXlCO0FBQ2pDLGFBQVMsb0JBQW9CLFVBQVU7QUFDbkMsYUFBTyxNQUFNLFFBQVEsb0JBQW9CLFFBQVE7QUFBQSxJQUNyRDtBQUNBLFlBQVEsc0JBQXNCO0FBQzlCLGFBQVMsOEJBQThCLFVBQVUsUUFBUTtBQUNyRCxZQUFNLFdBQVcsTUFBTSxRQUFRLG9CQUFvQixRQUFRLEVBQUUsT0FBTyxNQUFNO0FBQzFFLFlBQU0sV0FBVyxTQUFTLElBQUksTUFBTSxRQUFRLHdCQUF3QjtBQUNwRSxhQUFPO0FBQUEsSUFDWDtBQUNBLFlBQVEsZ0NBQWdDO0FBQ3hDLGFBQVMsNkJBQTZCLFVBQVU7QUFDNUMsWUFBTSxRQUFRLENBQUM7QUFDZixhQUFPLFNBQVMsT0FBTyxDQUFDLFlBQVlBLGFBQVk7QUFDNUMsY0FBTSxPQUFPLE1BQU0sUUFBUSxpQkFBaUJBLFFBQU87QUFDbkQsWUFBSSxRQUFRLFlBQVk7QUFDcEIscUJBQVcsTUFBTSxLQUFLQSxRQUFPO0FBQUEsUUFDakMsT0FDSztBQUNELHFCQUFXLFFBQVEsQ0FBQ0EsUUFBTztBQUFBLFFBQy9CO0FBQ0EsZUFBTztBQUFBLE1BQ1gsR0FBRyxLQUFLO0FBQUEsSUFDWjtBQUNBLFlBQVEsK0JBQStCO0FBQ3ZDLGFBQVMsNEJBQTRCLFVBQVUsVUFBVSxTQUFTO0FBQzlELGFBQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUztBQUN2QyxlQUFPLDBCQUEwQixNQUFNLFNBQVMsT0FBTyxVQUFVLE9BQU87QUFBQSxNQUM1RSxDQUFDO0FBQUEsSUFDTDtBQUNBLFlBQVEsOEJBQThCO0FBQ3RDLGFBQVMsMEJBQTBCLE1BQU0sVUFBVSxVQUFVLFNBQVM7QUFDbEUsYUFBTztBQUFBLFFBQ0g7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLFVBQVUsQ0FBQyxFQUFFLE9BQU8sVUFBVSxTQUFTLElBQUksTUFBTSxRQUFRLHdCQUF3QixDQUFDO0FBQUEsTUFDdEY7QUFBQSxJQUNKO0FBQ0EsWUFBUSw0QkFBNEI7QUFBQTtBQUFBOzs7QUM3R3BDO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEsT0FBTztBQUNmLGFBQVMsS0FBS0MsT0FBTSxVQUFVLFVBQVU7QUFDcEMsZUFBUyxHQUFHLE1BQU1BLE9BQU0sQ0FBQyxZQUFZLFVBQVU7QUFDM0MsWUFBSSxlQUFlLE1BQU07QUFDckIsOEJBQW9CLFVBQVUsVUFBVTtBQUN4QztBQUFBLFFBQ0o7QUFDQSxZQUFJLENBQUMsTUFBTSxlQUFlLEtBQUssQ0FBQyxTQUFTLG9CQUFvQjtBQUN6RCw4QkFBb0IsVUFBVSxLQUFLO0FBQ25DO0FBQUEsUUFDSjtBQUNBLGlCQUFTLEdBQUcsS0FBS0EsT0FBTSxDQUFDLFdBQVcsU0FBUztBQUN4QyxjQUFJLGNBQWMsTUFBTTtBQUNwQixnQkFBSSxTQUFTLGdDQUFnQztBQUN6QyxrQ0FBb0IsVUFBVSxTQUFTO0FBQ3ZDO0FBQUEsWUFDSjtBQUNBLGdDQUFvQixVQUFVLEtBQUs7QUFDbkM7QUFBQSxVQUNKO0FBQ0EsY0FBSSxTQUFTLGtCQUFrQjtBQUMzQixpQkFBSyxpQkFBaUIsTUFBTTtBQUFBLFVBQ2hDO0FBQ0EsOEJBQW9CLFVBQVUsSUFBSTtBQUFBLFFBQ3RDLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNMO0FBQ0EsWUFBUSxPQUFPO0FBQ2YsYUFBUyxvQkFBb0IsVUFBVSxPQUFPO0FBQzFDLGVBQVMsS0FBSztBQUFBLElBQ2xCO0FBQ0EsYUFBUyxvQkFBb0IsVUFBVSxRQUFRO0FBQzNDLGVBQVMsTUFBTSxNQUFNO0FBQUEsSUFDekI7QUFBQTtBQUFBOzs7QUNuQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSxPQUFPO0FBQ2YsYUFBUyxLQUFLQyxPQUFNLFVBQVU7QUFDMUIsWUFBTSxRQUFRLFNBQVMsR0FBRyxVQUFVQSxLQUFJO0FBQ3hDLFVBQUksQ0FBQyxNQUFNLGVBQWUsS0FBSyxDQUFDLFNBQVMsb0JBQW9CO0FBQ3pELGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSTtBQUNBLGNBQU0sT0FBTyxTQUFTLEdBQUcsU0FBU0EsS0FBSTtBQUN0QyxZQUFJLFNBQVMsa0JBQWtCO0FBQzNCLGVBQUssaUJBQWlCLE1BQU07QUFBQSxRQUNoQztBQUNBLGVBQU87QUFBQSxNQUNYLFNBQ08sT0FBUDtBQUNJLFlBQUksQ0FBQyxTQUFTLGdDQUFnQztBQUMxQyxpQkFBTztBQUFBLFFBQ1g7QUFDQSxjQUFNO0FBQUEsTUFDVjtBQUFBLElBQ0o7QUFDQSxZQUFRLE9BQU87QUFBQTtBQUFBOzs7QUN0QmYsSUFBQUMsY0FBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxZQUFRLDBCQUEwQixRQUFRLHNCQUFzQjtBQUNoRSxRQUFNQyxNQUFLLFFBQVE7QUFDbkIsWUFBUSxzQkFBc0I7QUFBQSxNQUMxQixPQUFPQSxJQUFHO0FBQUEsTUFDVixNQUFNQSxJQUFHO0FBQUEsTUFDVCxXQUFXQSxJQUFHO0FBQUEsTUFDZCxVQUFVQSxJQUFHO0FBQUEsSUFDakI7QUFDQSxhQUFTLHdCQUF3QixXQUFXO0FBQ3hDLFVBQUksY0FBYyxRQUFXO0FBQ3pCLGVBQU8sUUFBUTtBQUFBLE1BQ25CO0FBQ0EsYUFBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxRQUFRLG1CQUFtQixHQUFHLFNBQVM7QUFBQSxJQUNsRjtBQUNBLFlBQVEsMEJBQTBCO0FBQUE7QUFBQTs7O0FDaEJsQztBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxRQUFNQyxNQUFLO0FBQ1gsUUFBTSxXQUFOLE1BQWU7QUFBQSxNQUNYLFlBQVksV0FBVyxDQUFDLEdBQUc7QUFDdkIsYUFBSyxXQUFXO0FBQ2hCLGFBQUsscUJBQXFCLEtBQUssVUFBVSxLQUFLLFNBQVMsb0JBQW9CLElBQUk7QUFDL0UsYUFBSyxLQUFLQSxJQUFHLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtBQUNyRCxhQUFLLG1CQUFtQixLQUFLLFVBQVUsS0FBSyxTQUFTLGtCQUFrQixLQUFLO0FBQzVFLGFBQUssaUNBQWlDLEtBQUssVUFBVSxLQUFLLFNBQVMsZ0NBQWdDLElBQUk7QUFBQSxNQUMzRztBQUFBLE1BQ0EsVUFBVSxRQUFRLE9BQU87QUFDckIsZUFBTyxXQUFXLFFBQVEsV0FBVyxTQUFTLFNBQVM7QUFBQSxNQUMzRDtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUNmbEI7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSxXQUFXLFFBQVEsT0FBTyxRQUFRLFdBQVc7QUFDckQsUUFBTSxRQUFRO0FBQ2QsUUFBTSxPQUFPO0FBQ2IsUUFBTSxhQUFhO0FBQ25CLFlBQVEsV0FBVyxXQUFXO0FBQzlCLGFBQVMsS0FBS0MsT0FBTSw2QkFBNkIsVUFBVTtBQUN2RCxVQUFJLE9BQU8sZ0NBQWdDLFlBQVk7QUFDbkQsY0FBTSxLQUFLQSxPQUFNLFlBQVksR0FBRywyQkFBMkI7QUFDM0Q7QUFBQSxNQUNKO0FBQ0EsWUFBTSxLQUFLQSxPQUFNLFlBQVksMkJBQTJCLEdBQUcsUUFBUTtBQUFBLElBQ3ZFO0FBQ0EsWUFBUSxPQUFPO0FBQ2YsYUFBUyxTQUFTQSxPQUFNLG1CQUFtQjtBQUN2QyxZQUFNLFdBQVcsWUFBWSxpQkFBaUI7QUFDOUMsYUFBTyxLQUFLLEtBQUtBLE9BQU0sUUFBUTtBQUFBLElBQ25DO0FBQ0EsWUFBUSxXQUFXO0FBQ25CLGFBQVMsWUFBWSxvQkFBb0IsQ0FBQyxHQUFHO0FBQ3pDLFVBQUksNkJBQTZCLFdBQVcsU0FBUztBQUNqRCxlQUFPO0FBQUEsTUFDWDtBQUNBLGFBQU8sSUFBSSxXQUFXLFFBQVEsaUJBQWlCO0FBQUEsSUFDbkQ7QUFBQTtBQUFBOzs7QUN6QkE7QUFBQSx5REFBQUMsU0FBQTtBQUFBO0FBQ0EsUUFBSTtBQUVKLElBQUFBLFFBQU8sVUFBVSxPQUFPLG1CQUFtQixhQUN2QyxlQUFlLEtBQUssT0FBTyxXQUFXLGNBQWMsU0FBUyxNQUFNLElBRW5FLFNBQU8sWUFBWSxVQUFVLFFBQVEsUUFBUSxJQUM1QyxLQUFLLEVBQUUsRUFDUCxNQUFNLFNBQU8sV0FBVyxNQUFNO0FBQUUsWUFBTTtBQUFBLElBQUksR0FBRyxDQUFDLENBQUM7QUFBQTtBQUFBOzs7QUNScEQ7QUFBQSxzREFBQUMsU0FBQTtBQUFBO0FBQ0EsSUFBQUEsUUFBTyxVQUFVO0FBRWpCLFFBQU1DLGtCQUFpQjtBQUV2QixhQUFTLFlBQWEsT0FBTyxJQUFJO0FBQy9CLFVBQUksU0FBUyxTQUFTO0FBQ3RCLFVBQUksU0FBUztBQUViLFVBQUksTUFBTSxRQUFRLEtBQUssR0FBRztBQUN4QixrQkFBVSxDQUFDO0FBQ1gsa0JBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU87QUFDTCxlQUFPLE9BQU8sS0FBSyxLQUFLO0FBQ3hCLGtCQUFVLENBQUM7QUFDWCxrQkFBVSxLQUFLO0FBQUEsTUFDakI7QUFFQSxlQUFTLEtBQU0sS0FBSztBQUNsQixpQkFBUyxNQUFPO0FBQ2QsY0FBSTtBQUFJLGVBQUcsS0FBSyxPQUFPO0FBQ3ZCLGVBQUs7QUFBQSxRQUNQO0FBQ0EsWUFBSTtBQUFRLFVBQUFBLGdCQUFlLEdBQUc7QUFBQTtBQUN6QixjQUFJO0FBQUEsTUFDWDtBQUVBLGVBQVMsS0FBTSxHQUFHLEtBQUssUUFBUTtBQUM3QixnQkFBUSxLQUFLO0FBQ2IsWUFBSSxFQUFFLFlBQVksS0FBSyxLQUFLO0FBQzFCLGVBQUssR0FBRztBQUFBLFFBQ1Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxDQUFDLFNBQVM7QUFFWixhQUFLLElBQUk7QUFBQSxNQUNYLFdBQVcsTUFBTTtBQUVmLGFBQUssUUFBUSxTQUFVLEtBQUs7QUFDMUIsZ0JBQU0sS0FBSyxTQUFVLEtBQUssUUFBUTtBQUFFLGlCQUFLLEtBQUssS0FBSyxNQUFNO0FBQUEsVUFBRSxDQUFDO0FBQUEsUUFDOUQsQ0FBQztBQUFBLE1BQ0gsT0FBTztBQUVMLGNBQU0sUUFBUSxTQUFVLE1BQU0sR0FBRztBQUMvQixlQUFLLFNBQVUsS0FBSyxRQUFRO0FBQUUsaUJBQUssR0FBRyxLQUFLLE1BQU07QUFBQSxVQUFFLENBQUM7QUFBQSxRQUN0RCxDQUFDO0FBQUEsTUFDSDtBQUVBLGVBQVM7QUFBQSxJQUNYO0FBQUE7QUFBQTs7O0FDbERBLElBQUFDLHFCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEscUNBQXFDO0FBQzdDLFFBQU0sNkJBQTZCLFFBQVEsU0FBUyxLQUFLLE1BQU0sR0FBRztBQUNsRSxRQUFJLDJCQUEyQixPQUFPLFVBQWEsMkJBQTJCLE9BQU8sUUFBVztBQUM1RixZQUFNLElBQUksTUFBTSxnRkFBZ0YsUUFBUSxTQUFTLE1BQU07QUFBQSxJQUMzSDtBQUNBLFFBQU0sZ0JBQWdCLE9BQU8sU0FBUywyQkFBMkIsSUFBSSxFQUFFO0FBQ3ZFLFFBQU0sZ0JBQWdCLE9BQU8sU0FBUywyQkFBMkIsSUFBSSxFQUFFO0FBQ3ZFLFFBQU0sMEJBQTBCO0FBQ2hDLFFBQU0sMEJBQTBCO0FBQ2hDLFFBQU0sc0JBQXNCLGdCQUFnQjtBQUM1QyxRQUFNLGdDQUFnQyxrQkFBa0IsMkJBQTJCLGlCQUFpQjtBQUlwRyxZQUFRLHFDQUFxQyx1QkFBdUI7QUFBQTtBQUFBOzs7QUNoQnBFLElBQUFDLGNBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSx3QkFBd0I7QUFDaEMsUUFBTSxrQkFBTixNQUFzQjtBQUFBLE1BQ2xCLFlBQVksTUFBTSxPQUFPO0FBQ3JCLGFBQUssT0FBTztBQUNaLGFBQUssZ0JBQWdCLE1BQU0sY0FBYyxLQUFLLEtBQUs7QUFDbkQsYUFBSyxvQkFBb0IsTUFBTSxrQkFBa0IsS0FBSyxLQUFLO0FBQzNELGFBQUssY0FBYyxNQUFNLFlBQVksS0FBSyxLQUFLO0FBQy9DLGFBQUssU0FBUyxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQ3JDLGFBQUssU0FBUyxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQ3JDLGFBQUssV0FBVyxNQUFNLFNBQVMsS0FBSyxLQUFLO0FBQ3pDLGFBQUssaUJBQWlCLE1BQU0sZUFBZSxLQUFLLEtBQUs7QUFBQSxNQUN6RDtBQUFBLElBQ0o7QUFDQSxhQUFTLHNCQUFzQixNQUFNLE9BQU87QUFDeEMsYUFBTyxJQUFJLGdCQUFnQixNQUFNLEtBQUs7QUFBQSxJQUMxQztBQUNBLFlBQVEsd0JBQXdCO0FBQUE7QUFBQTs7O0FDbEJoQyxJQUFBQyxpQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxZQUFRLEtBQUs7QUFDYixRQUFNQyxNQUFLO0FBQ1gsWUFBUSxLQUFLQTtBQUFBO0FBQUE7OztBQ0piO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEsbUJBQW1CO0FBQzNCLGFBQVMsaUJBQWlCLEdBQUcsR0FBRyxXQUFXO0FBSXZDLFVBQUksRUFBRSxTQUFTLFNBQVMsR0FBRztBQUN2QixlQUFPLElBQUk7QUFBQSxNQUNmO0FBQ0EsYUFBTyxJQUFJLFlBQVk7QUFBQSxJQUMzQjtBQUNBLFlBQVEsbUJBQW1CO0FBQUE7QUFBQTs7O0FDWjNCLElBQUFDLGlCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEsVUFBVSxRQUFRLHVCQUF1QixRQUFRLE9BQU87QUFDaEUsUUFBTSxTQUFTO0FBQ2YsUUFBTSxNQUFNO0FBQ1osUUFBTSxjQUFjO0FBQ3BCLFFBQU0sUUFBUTtBQUNkLFFBQU0sU0FBUztBQUNmLGFBQVMsS0FBSyxXQUFXLFVBQVUsVUFBVTtBQUN6QyxVQUFJLENBQUMsU0FBUyxTQUFTLFlBQVksb0NBQW9DO0FBQ25FLDZCQUFxQixXQUFXLFVBQVUsUUFBUTtBQUNsRDtBQUFBLE1BQ0o7QUFDQSxjQUFRLFdBQVcsVUFBVSxRQUFRO0FBQUEsSUFDekM7QUFDQSxZQUFRLE9BQU87QUFDZixhQUFTLHFCQUFxQixXQUFXLFVBQVUsVUFBVTtBQUN6RCxlQUFTLEdBQUcsUUFBUSxXQUFXLEVBQUUsZUFBZSxLQUFLLEdBQUcsQ0FBQyxjQUFjLFlBQVk7QUFDL0UsWUFBSSxpQkFBaUIsTUFBTTtBQUN2Qiw4QkFBb0IsVUFBVSxZQUFZO0FBQzFDO0FBQUEsUUFDSjtBQUNBLGNBQU0sVUFBVSxRQUFRLElBQUksQ0FBQyxZQUFZO0FBQUEsVUFDckM7QUFBQSxVQUNBLE1BQU0sT0FBTztBQUFBLFVBQ2IsTUFBTSxPQUFPLGlCQUFpQixXQUFXLE9BQU8sTUFBTSxTQUFTLG9CQUFvQjtBQUFBLFFBQ3ZGLEVBQUU7QUFDRixZQUFJLENBQUMsU0FBUyxxQkFBcUI7QUFDL0IsOEJBQW9CLFVBQVUsT0FBTztBQUNyQztBQUFBLFFBQ0o7QUFDQSxjQUFNLFFBQVEsUUFBUSxJQUFJLENBQUMsVUFBVSxpQkFBaUIsT0FBTyxRQUFRLENBQUM7QUFDdEUsWUFBSSxPQUFPLENBQUMsVUFBVSxlQUFlO0FBQ2pDLGNBQUksYUFBYSxNQUFNO0FBQ25CLGdDQUFvQixVQUFVLFFBQVE7QUFDdEM7QUFBQSxVQUNKO0FBQ0EsOEJBQW9CLFVBQVUsVUFBVTtBQUFBLFFBQzVDLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNMO0FBQ0EsWUFBUSx1QkFBdUI7QUFDL0IsYUFBUyxpQkFBaUIsT0FBTyxVQUFVO0FBQ3ZDLGFBQU8sQ0FBQyxTQUFTO0FBQ2IsWUFBSSxDQUFDLE1BQU0sT0FBTyxlQUFlLEdBQUc7QUFDaEMsZUFBSyxNQUFNLEtBQUs7QUFDaEI7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsR0FBRyxLQUFLLE1BQU0sTUFBTSxDQUFDLFdBQVcsVUFBVTtBQUMvQyxjQUFJLGNBQWMsTUFBTTtBQUNwQixnQkFBSSxTQUFTLGdDQUFnQztBQUN6QyxtQkFBSyxTQUFTO0FBQ2Q7QUFBQSxZQUNKO0FBQ0EsaUJBQUssTUFBTSxLQUFLO0FBQ2hCO0FBQUEsVUFDSjtBQUNBLGdCQUFNLFNBQVMsTUFBTSxHQUFHLHNCQUFzQixNQUFNLE1BQU0sS0FBSztBQUMvRCxlQUFLLE1BQU0sS0FBSztBQUFBLFFBQ3BCLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDSjtBQUNBLGFBQVMsUUFBUSxXQUFXLFVBQVUsVUFBVTtBQUM1QyxlQUFTLEdBQUcsUUFBUSxXQUFXLENBQUMsY0FBYyxVQUFVO0FBQ3BELFlBQUksaUJBQWlCLE1BQU07QUFDdkIsOEJBQW9CLFVBQVUsWUFBWTtBQUMxQztBQUFBLFFBQ0o7QUFDQSxjQUFNLFFBQVEsTUFBTSxJQUFJLENBQUMsU0FBUztBQUM5QixnQkFBTUMsUUFBTyxPQUFPLGlCQUFpQixXQUFXLE1BQU0sU0FBUyxvQkFBb0I7QUFDbkYsaUJBQU8sQ0FBQyxTQUFTO0FBQ2IsbUJBQU8sS0FBS0EsT0FBTSxTQUFTLGdCQUFnQixDQUFDLE9BQU8sVUFBVTtBQUN6RCxrQkFBSSxVQUFVLE1BQU07QUFDaEIscUJBQUssS0FBSztBQUNWO0FBQUEsY0FDSjtBQUNBLG9CQUFNLFFBQVE7QUFBQSxnQkFDVjtBQUFBLGdCQUNBLE1BQUFBO0FBQUEsZ0JBQ0EsUUFBUSxNQUFNLEdBQUcsc0JBQXNCLE1BQU0sS0FBSztBQUFBLGNBQ3REO0FBQ0Esa0JBQUksU0FBUyxPQUFPO0FBQ2hCLHNCQUFNLFFBQVE7QUFBQSxjQUNsQjtBQUNBLG1CQUFLLE1BQU0sS0FBSztBQUFBLFlBQ3BCLENBQUM7QUFBQSxVQUNMO0FBQUEsUUFDSixDQUFDO0FBQ0QsWUFBSSxPQUFPLENBQUMsVUFBVSxZQUFZO0FBQzlCLGNBQUksYUFBYSxNQUFNO0FBQ25CLGdDQUFvQixVQUFVLFFBQVE7QUFDdEM7QUFBQSxVQUNKO0FBQ0EsOEJBQW9CLFVBQVUsT0FBTztBQUFBLFFBQ3pDLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNMO0FBQ0EsWUFBUSxVQUFVO0FBQ2xCLGFBQVMsb0JBQW9CLFVBQVUsT0FBTztBQUMxQyxlQUFTLEtBQUs7QUFBQSxJQUNsQjtBQUNBLGFBQVMsb0JBQW9CLFVBQVUsUUFBUTtBQUMzQyxlQUFTLE1BQU0sTUFBTTtBQUFBLElBQ3pCO0FBQUE7QUFBQTs7O0FDdkdBLElBQUFDLGdCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEsVUFBVSxRQUFRLHVCQUF1QixRQUFRLE9BQU87QUFDaEUsUUFBTSxTQUFTO0FBQ2YsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sUUFBUTtBQUNkLFFBQU0sU0FBUztBQUNmLGFBQVMsS0FBSyxXQUFXLFVBQVU7QUFDL0IsVUFBSSxDQUFDLFNBQVMsU0FBUyxZQUFZLG9DQUFvQztBQUNuRSxlQUFPLHFCQUFxQixXQUFXLFFBQVE7QUFBQSxNQUNuRDtBQUNBLGFBQU8sUUFBUSxXQUFXLFFBQVE7QUFBQSxJQUN0QztBQUNBLFlBQVEsT0FBTztBQUNmLGFBQVMscUJBQXFCLFdBQVcsVUFBVTtBQUMvQyxZQUFNLFVBQVUsU0FBUyxHQUFHLFlBQVksV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQzFFLGFBQU8sUUFBUSxJQUFJLENBQUMsV0FBVztBQUMzQixjQUFNLFFBQVE7QUFBQSxVQUNWO0FBQUEsVUFDQSxNQUFNLE9BQU87QUFBQSxVQUNiLE1BQU0sT0FBTyxpQkFBaUIsV0FBVyxPQUFPLE1BQU0sU0FBUyxvQkFBb0I7QUFBQSxRQUN2RjtBQUNBLFlBQUksTUFBTSxPQUFPLGVBQWUsS0FBSyxTQUFTLHFCQUFxQjtBQUMvRCxjQUFJO0FBQ0Esa0JBQU0sUUFBUSxTQUFTLEdBQUcsU0FBUyxNQUFNLElBQUk7QUFDN0Msa0JBQU0sU0FBUyxNQUFNLEdBQUcsc0JBQXNCLE1BQU0sTUFBTSxLQUFLO0FBQUEsVUFDbkUsU0FDTyxPQUFQO0FBQ0ksZ0JBQUksU0FBUyxnQ0FBZ0M7QUFDekMsb0JBQU07QUFBQSxZQUNWO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFDQSxlQUFPO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFDTDtBQUNBLFlBQVEsdUJBQXVCO0FBQy9CLGFBQVMsUUFBUSxXQUFXLFVBQVU7QUFDbEMsWUFBTSxRQUFRLFNBQVMsR0FBRyxZQUFZLFNBQVM7QUFDL0MsYUFBTyxNQUFNLElBQUksQ0FBQyxTQUFTO0FBQ3ZCLGNBQU0sWUFBWSxPQUFPLGlCQUFpQixXQUFXLE1BQU0sU0FBUyxvQkFBb0I7QUFDeEYsY0FBTSxRQUFRLE9BQU8sU0FBUyxXQUFXLFNBQVMsY0FBYztBQUNoRSxjQUFNLFFBQVE7QUFBQSxVQUNWO0FBQUEsVUFDQSxNQUFNO0FBQUEsVUFDTixRQUFRLE1BQU0sR0FBRyxzQkFBc0IsTUFBTSxLQUFLO0FBQUEsUUFDdEQ7QUFDQSxZQUFJLFNBQVMsT0FBTztBQUNoQixnQkFBTSxRQUFRO0FBQUEsUUFDbEI7QUFDQSxlQUFPO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFDTDtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQ3JEbEIsSUFBQUMsY0FBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxZQUFRLDBCQUEwQixRQUFRLHNCQUFzQjtBQUNoRSxRQUFNQyxNQUFLLFFBQVE7QUFDbkIsWUFBUSxzQkFBc0I7QUFBQSxNQUMxQixPQUFPQSxJQUFHO0FBQUEsTUFDVixNQUFNQSxJQUFHO0FBQUEsTUFDVCxXQUFXQSxJQUFHO0FBQUEsTUFDZCxVQUFVQSxJQUFHO0FBQUEsTUFDYixTQUFTQSxJQUFHO0FBQUEsTUFDWixhQUFhQSxJQUFHO0FBQUEsSUFDcEI7QUFDQSxhQUFTLHdCQUF3QixXQUFXO0FBQ3hDLFVBQUksY0FBYyxRQUFXO0FBQ3pCLGVBQU8sUUFBUTtBQUFBLE1BQ25CO0FBQ0EsYUFBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxRQUFRLG1CQUFtQixHQUFHLFNBQVM7QUFBQSxJQUNsRjtBQUNBLFlBQVEsMEJBQTBCO0FBQUE7QUFBQTs7O0FDbEJsQyxJQUFBQyxvQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxRQUFNQyxRQUFPLFFBQVE7QUFDckIsUUFBTSxTQUFTO0FBQ2YsUUFBTUMsTUFBSztBQUNYLFFBQU0sV0FBTixNQUFlO0FBQUEsTUFDWCxZQUFZLFdBQVcsQ0FBQyxHQUFHO0FBQ3ZCLGFBQUssV0FBVztBQUNoQixhQUFLLHNCQUFzQixLQUFLLFVBQVUsS0FBSyxTQUFTLHFCQUFxQixLQUFLO0FBQ2xGLGFBQUssS0FBS0EsSUFBRyx3QkFBd0IsS0FBSyxTQUFTLEVBQUU7QUFDckQsYUFBSyx1QkFBdUIsS0FBSyxVQUFVLEtBQUssU0FBUyxzQkFBc0JELE1BQUssR0FBRztBQUN2RixhQUFLLFFBQVEsS0FBSyxVQUFVLEtBQUssU0FBUyxPQUFPLEtBQUs7QUFDdEQsYUFBSyxpQ0FBaUMsS0FBSyxVQUFVLEtBQUssU0FBUyxnQ0FBZ0MsSUFBSTtBQUN2RyxhQUFLLGlCQUFpQixJQUFJLE9BQU8sU0FBUztBQUFBLFVBQ3RDLG9CQUFvQixLQUFLO0FBQUEsVUFDekIsSUFBSSxLQUFLO0FBQUEsVUFDVCxnQ0FBZ0MsS0FBSztBQUFBLFFBQ3pDLENBQUM7QUFBQSxNQUNMO0FBQUEsTUFDQSxVQUFVLFFBQVEsT0FBTztBQUNyQixlQUFPLFdBQVcsUUFBUSxXQUFXLFNBQVMsU0FBUztBQUFBLE1BQzNEO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQ3ZCbEIsSUFBQUUsZUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxZQUFRLFdBQVcsUUFBUSxjQUFjLFFBQVEsVUFBVTtBQUMzRCxRQUFNLFFBQVE7QUFDZCxRQUFNLE9BQU87QUFDYixRQUFNLGFBQWE7QUFDbkIsWUFBUSxXQUFXLFdBQVc7QUFDOUIsYUFBUyxRQUFRQyxPQUFNLDZCQUE2QixVQUFVO0FBQzFELFVBQUksT0FBTyxnQ0FBZ0MsWUFBWTtBQUNuRCxjQUFNLEtBQUtBLE9BQU0sWUFBWSxHQUFHLDJCQUEyQjtBQUMzRDtBQUFBLE1BQ0o7QUFDQSxZQUFNLEtBQUtBLE9BQU0sWUFBWSwyQkFBMkIsR0FBRyxRQUFRO0FBQUEsSUFDdkU7QUFDQSxZQUFRLFVBQVU7QUFDbEIsYUFBUyxZQUFZQSxPQUFNLG1CQUFtQjtBQUMxQyxZQUFNLFdBQVcsWUFBWSxpQkFBaUI7QUFDOUMsYUFBTyxLQUFLLEtBQUtBLE9BQU0sUUFBUTtBQUFBLElBQ25DO0FBQ0EsWUFBUSxjQUFjO0FBQ3RCLGFBQVMsWUFBWSxvQkFBb0IsQ0FBQyxHQUFHO0FBQ3pDLFVBQUksNkJBQTZCLFdBQVcsU0FBUztBQUNqRCxlQUFPO0FBQUEsTUFDWDtBQUNBLGFBQU8sSUFBSSxXQUFXLFFBQVEsaUJBQWlCO0FBQUEsSUFDbkQ7QUFBQTtBQUFBOzs7QUN6QkE7QUFBQSxtREFBQUMsU0FBQTtBQUFBO0FBQUE7QUFFQSxhQUFTLFFBQVMsYUFBYTtBQUM3QixVQUFJLE9BQU8sSUFBSSxZQUFZO0FBQzNCLFVBQUksT0FBTztBQUVYLGVBQVMsTUFBTztBQUNkLFlBQUksVUFBVTtBQUVkLFlBQUksUUFBUSxNQUFNO0FBQ2hCLGlCQUFPLFFBQVE7QUFBQSxRQUNqQixPQUFPO0FBQ0wsaUJBQU8sSUFBSSxZQUFZO0FBQ3ZCLGlCQUFPO0FBQUEsUUFDVDtBQUVBLGdCQUFRLE9BQU87QUFFZixlQUFPO0FBQUEsTUFDVDtBQUVBLGVBQVMsUUFBUyxLQUFLO0FBQ3JCLGFBQUssT0FBTztBQUNaLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTztBQUFBLFFBQ0w7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxJQUFBQSxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUNoQ2pCO0FBQUEsK0NBQUFDLFNBQUE7QUFBQTtBQUFBO0FBSUEsUUFBSSxVQUFVO0FBRWQsYUFBUyxVQUFXLFNBQVMsUUFBUSxhQUFhO0FBQ2hELFVBQUksT0FBTyxZQUFZLFlBQVk7QUFDakMsc0JBQWM7QUFDZCxpQkFBUztBQUNULGtCQUFVO0FBQUEsTUFDWjtBQUVBLFVBQUksY0FBYyxHQUFHO0FBQ25CLGNBQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBLE1BQ2hFO0FBRUEsVUFBSSxRQUFRLFFBQVEsSUFBSTtBQUN4QixVQUFJLFlBQVk7QUFDaEIsVUFBSSxZQUFZO0FBQ2hCLFVBQUksV0FBVztBQUNmLFVBQUksZUFBZTtBQUVuQixVQUFJLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUCxXQUFXO0FBQUEsUUFDWDtBQUFBLFFBQ0EsUUFBUTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLE9BQU87QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUVQLGVBQVMsVUFBVztBQUNsQixlQUFPO0FBQUEsTUFDVDtBQUVBLGVBQVMsUUFBUztBQUNoQixhQUFLLFNBQVM7QUFBQSxNQUNoQjtBQUVBLGVBQVMsU0FBVTtBQUNqQixZQUFJLFVBQVU7QUFDZCxZQUFJLFVBQVU7QUFFZCxlQUFPLFNBQVM7QUFDZCxvQkFBVSxRQUFRO0FBQ2xCO0FBQUEsUUFDRjtBQUVBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxXQUFZO0FBQ25CLFlBQUksVUFBVTtBQUNkLFlBQUksUUFBUSxDQUFDO0FBRWIsZUFBTyxTQUFTO0FBQ2QsZ0JBQU0sS0FBSyxRQUFRLEtBQUs7QUFDeEIsb0JBQVUsUUFBUTtBQUFBLFFBQ3BCO0FBRUEsZUFBTztBQUFBLE1BQ1Q7QUFFQSxlQUFTLFNBQVU7QUFDakIsWUFBSSxDQUFDLEtBQUs7QUFBUTtBQUNsQixhQUFLLFNBQVM7QUFDZCxpQkFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLGFBQWEsS0FBSztBQUN6QztBQUNBLGtCQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0Y7QUFFQSxlQUFTLE9BQVE7QUFDZixlQUFPLGFBQWEsS0FBSyxLQUFLLE9BQU8sTUFBTTtBQUFBLE1BQzdDO0FBRUEsZUFBUyxLQUFNLE9BQU8sTUFBTTtBQUMxQixZQUFJLFVBQVUsTUFBTSxJQUFJO0FBRXhCLGdCQUFRLFVBQVU7QUFDbEIsZ0JBQVEsVUFBVTtBQUNsQixnQkFBUSxRQUFRO0FBQ2hCLGdCQUFRLFdBQVcsUUFBUTtBQUMzQixnQkFBUSxlQUFlO0FBRXZCLFlBQUksYUFBYSxLQUFLLGVBQWUsS0FBSyxRQUFRO0FBQ2hELGNBQUksV0FBVztBQUNiLHNCQUFVLE9BQU87QUFDakIsd0JBQVk7QUFBQSxVQUNkLE9BQU87QUFDTCx3QkFBWTtBQUNaLHdCQUFZO0FBQ1osaUJBQUssVUFBVTtBQUFBLFVBQ2pCO0FBQUEsUUFDRixPQUFPO0FBQ0w7QUFDQSxpQkFBTyxLQUFLLFNBQVMsUUFBUSxPQUFPLFFBQVEsTUFBTTtBQUFBLFFBQ3BEO0FBQUEsTUFDRjtBQUVBLGVBQVMsUUFBUyxPQUFPLE1BQU07QUFDN0IsWUFBSSxVQUFVLE1BQU0sSUFBSTtBQUV4QixnQkFBUSxVQUFVO0FBQ2xCLGdCQUFRLFVBQVU7QUFDbEIsZ0JBQVEsUUFBUTtBQUNoQixnQkFBUSxXQUFXLFFBQVE7QUFFM0IsWUFBSSxhQUFhLEtBQUssZUFBZSxLQUFLLFFBQVE7QUFDaEQsY0FBSSxXQUFXO0FBQ2Isb0JBQVEsT0FBTztBQUNmLHdCQUFZO0FBQUEsVUFDZCxPQUFPO0FBQ0wsd0JBQVk7QUFDWix3QkFBWTtBQUNaLGlCQUFLLFVBQVU7QUFBQSxVQUNqQjtBQUFBLFFBQ0YsT0FBTztBQUNMO0FBQ0EsaUJBQU8sS0FBSyxTQUFTLFFBQVEsT0FBTyxRQUFRLE1BQU07QUFBQSxRQUNwRDtBQUFBLE1BQ0Y7QUFFQSxlQUFTLFFBQVMsUUFBUTtBQUN4QixZQUFJLFFBQVE7QUFDVixnQkFBTSxRQUFRLE1BQU07QUFBQSxRQUN0QjtBQUNBLFlBQUksT0FBTztBQUNYLFlBQUksTUFBTTtBQUNSLGNBQUksQ0FBQyxLQUFLLFFBQVE7QUFDaEIsZ0JBQUksY0FBYyxXQUFXO0FBQzNCLDBCQUFZO0FBQUEsWUFDZDtBQUNBLHdCQUFZLEtBQUs7QUFDakIsaUJBQUssT0FBTztBQUNaLG1CQUFPLEtBQUssU0FBUyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQzVDLGdCQUFJLGNBQWMsTUFBTTtBQUN0QixtQkFBSyxNQUFNO0FBQUEsWUFDYjtBQUFBLFVBQ0YsT0FBTztBQUNMO0FBQUEsVUFDRjtBQUFBLFFBQ0YsV0FBVyxFQUFFLGFBQWEsR0FBRztBQUMzQixlQUFLLE1BQU07QUFBQSxRQUNiO0FBQUEsTUFDRjtBQUVBLGVBQVMsT0FBUTtBQUNmLG9CQUFZO0FBQ1osb0JBQVk7QUFDWixhQUFLLFFBQVE7QUFBQSxNQUNmO0FBRUEsZUFBUyxlQUFnQjtBQUN2QixvQkFBWTtBQUNaLG9CQUFZO0FBQ1osYUFBSyxNQUFNO0FBQ1gsYUFBSyxRQUFRO0FBQUEsTUFDZjtBQUVBLGVBQVMsTUFBTyxTQUFTO0FBQ3ZCLHVCQUFlO0FBQUEsTUFDakI7QUFBQSxJQUNGO0FBRUEsYUFBUyxPQUFRO0FBQUEsSUFBQztBQUVsQixhQUFTLE9BQVE7QUFDZixXQUFLLFFBQVE7QUFDYixXQUFLLFdBQVc7QUFDaEIsV0FBSyxPQUFPO0FBQ1osV0FBSyxVQUFVO0FBQ2YsV0FBSyxVQUFVO0FBQ2YsV0FBSyxlQUFlO0FBRXBCLFVBQUksT0FBTztBQUVYLFdBQUssU0FBUyxTQUFTLE9BQVEsS0FBSyxRQUFRO0FBQzFDLFlBQUksV0FBVyxLQUFLO0FBQ3BCLFlBQUksZUFBZSxLQUFLO0FBQ3hCLFlBQUksTUFBTSxLQUFLO0FBQ2YsYUFBSyxRQUFRO0FBQ2IsYUFBSyxXQUFXO0FBQ2hCLFlBQUksS0FBSyxjQUFjO0FBQ3JCLHVCQUFhLEtBQUssR0FBRztBQUFBLFFBQ3ZCO0FBQ0EsaUJBQVMsS0FBSyxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQ3ZDLGFBQUssUUFBUSxJQUFJO0FBQUEsTUFDbkI7QUFBQSxJQUNGO0FBRUEsYUFBUyxnQkFBaUIsU0FBUyxRQUFRLGFBQWE7QUFDdEQsVUFBSSxPQUFPLFlBQVksWUFBWTtBQUNqQyxzQkFBYztBQUNkLGlCQUFTO0FBQ1Qsa0JBQVU7QUFBQSxNQUNaO0FBRUEsZUFBUyxhQUFjLEtBQUssSUFBSTtBQUM5QixlQUFPLEtBQUssTUFBTSxHQUFHLEVBQ2xCLEtBQUssU0FBVSxLQUFLO0FBQ25CLGFBQUcsTUFBTSxHQUFHO0FBQUEsUUFDZCxHQUFHLEVBQUU7QUFBQSxNQUNUO0FBRUEsVUFBSSxRQUFRLFVBQVUsU0FBUyxjQUFjLFdBQVc7QUFFeEQsVUFBSSxTQUFTLE1BQU07QUFDbkIsVUFBSSxZQUFZLE1BQU07QUFFdEIsWUFBTSxPQUFPO0FBQ2IsWUFBTSxVQUFVO0FBQ2hCLFlBQU0sVUFBVTtBQUVoQixhQUFPO0FBRVAsZUFBUyxLQUFNLE9BQU87QUFDcEIsWUFBSSxJQUFJLElBQUksUUFBUSxTQUFVLFNBQVMsUUFBUTtBQUM3QyxpQkFBTyxPQUFPLFNBQVUsS0FBSyxRQUFRO0FBQ25DLGdCQUFJLEtBQUs7QUFDUCxxQkFBTyxHQUFHO0FBQ1Y7QUFBQSxZQUNGO0FBQ0Esb0JBQVEsTUFBTTtBQUFBLFVBQ2hCLENBQUM7QUFBQSxRQUNILENBQUM7QUFLRCxVQUFFLE1BQU0sSUFBSTtBQUVaLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxRQUFTLE9BQU87QUFDdkIsWUFBSSxJQUFJLElBQUksUUFBUSxTQUFVLFNBQVMsUUFBUTtBQUM3QyxvQkFBVSxPQUFPLFNBQVUsS0FBSyxRQUFRO0FBQ3RDLGdCQUFJLEtBQUs7QUFDUCxxQkFBTyxHQUFHO0FBQ1Y7QUFBQSxZQUNGO0FBQ0Esb0JBQVEsTUFBTTtBQUFBLFVBQ2hCLENBQUM7QUFBQSxRQUNILENBQUM7QUFLRCxVQUFFLE1BQU0sSUFBSTtBQUVaLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxVQUFXO0FBQ2xCLFlBQUksTUFBTSxLQUFLLEdBQUc7QUFDaEIsaUJBQU8sSUFBSSxRQUFRLFNBQVUsU0FBUztBQUNwQyxvQkFBUTtBQUFBLFVBQ1YsQ0FBQztBQUFBLFFBQ0g7QUFFQSxZQUFJLGdCQUFnQixNQUFNO0FBRTFCLFlBQUksSUFBSSxJQUFJLFFBQVEsU0FBVSxTQUFTO0FBQ3JDLGdCQUFNLFFBQVEsV0FBWTtBQUN4QiwwQkFBYztBQUNkLG9CQUFRO0FBQUEsVUFDVjtBQUFBLFFBQ0YsQ0FBQztBQUVELGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUVBLElBQUFBLFFBQU8sVUFBVTtBQUNqQixJQUFBQSxRQUFPLFFBQVEsVUFBVTtBQUFBO0FBQUE7OztBQ2hTekIsSUFBQUMsa0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSxtQkFBbUIsUUFBUSw4QkFBOEIsUUFBUSxrQkFBa0IsUUFBUSxlQUFlO0FBQ2xILGFBQVMsYUFBYSxVQUFVLE9BQU87QUFDbkMsVUFBSSxTQUFTLGdCQUFnQixNQUFNO0FBQy9CLGVBQU87QUFBQSxNQUNYO0FBQ0EsYUFBTyxDQUFDLFNBQVMsWUFBWSxLQUFLO0FBQUEsSUFDdEM7QUFDQSxZQUFRLGVBQWU7QUFDdkIsYUFBUyxnQkFBZ0IsUUFBUSxPQUFPO0FBQ3BDLGFBQU8sV0FBVyxRQUFRLE9BQU8sS0FBSztBQUFBLElBQzFDO0FBQ0EsWUFBUSxrQkFBa0I7QUFDMUIsYUFBUyw0QkFBNEIsVUFBVSxXQUFXO0FBQ3RELGFBQU8sU0FBUyxNQUFNLE9BQU8sRUFBRSxLQUFLLFNBQVM7QUFBQSxJQUNqRDtBQUNBLFlBQVEsOEJBQThCO0FBQ3RDLGFBQVMsaUJBQWlCLEdBQUcsR0FBRyxXQUFXO0FBQ3ZDLFVBQUksTUFBTSxJQUFJO0FBQ1YsZUFBTztBQUFBLE1BQ1g7QUFJQSxVQUFJLEVBQUUsU0FBUyxTQUFTLEdBQUc7QUFDdkIsZUFBTyxJQUFJO0FBQUEsTUFDZjtBQUNBLGFBQU8sSUFBSSxZQUFZO0FBQUEsSUFDM0I7QUFDQSxZQUFRLG1CQUFtQjtBQUFBO0FBQUE7OztBQzlCM0I7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTSxTQUFTO0FBQ2YsUUFBTSxTQUFOLE1BQWE7QUFBQSxNQUNULFlBQVksT0FBTyxXQUFXO0FBQzFCLGFBQUssUUFBUTtBQUNiLGFBQUssWUFBWTtBQUNqQixhQUFLLFFBQVEsT0FBTyw0QkFBNEIsT0FBTyxVQUFVLG9CQUFvQjtBQUFBLE1BQ3pGO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQ1ZsQixJQUFBQyxpQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxRQUFNLFdBQVcsUUFBUTtBQUN6QixRQUFNLFlBQVk7QUFDbEIsUUFBTSxRQUFRO0FBQ2QsUUFBTSxTQUFTO0FBQ2YsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sY0FBTixjQUEwQixTQUFTLFFBQVE7QUFBQSxNQUN2QyxZQUFZLE9BQU8sV0FBVztBQUMxQixjQUFNLE9BQU8sU0FBUztBQUN0QixhQUFLLFlBQVk7QUFDakIsYUFBSyxXQUFXLFVBQVU7QUFDMUIsYUFBSyxXQUFXLElBQUksU0FBUyxhQUFhO0FBQzFDLGFBQUssU0FBUyxNQUFNLEtBQUssUUFBUSxLQUFLLElBQUksR0FBRyxLQUFLLFVBQVUsV0FBVztBQUN2RSxhQUFLLGdCQUFnQjtBQUNyQixhQUFLLGVBQWU7QUFDcEIsYUFBSyxPQUFPLFFBQVEsTUFBTTtBQUN0QixjQUFJLENBQUMsS0FBSyxlQUFlO0FBQ3JCLGlCQUFLLFNBQVMsS0FBSyxLQUFLO0FBQUEsVUFDNUI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLE1BQ0EsT0FBTztBQUNILGFBQUssZ0JBQWdCO0FBQ3JCLGFBQUssZUFBZTtBQUNwQixxQkFBYSxNQUFNO0FBQ2YsZUFBSyxhQUFhLEtBQUssT0FBTyxLQUFLLFVBQVUsUUFBUTtBQUFBLFFBQ3pELENBQUM7QUFDRCxlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUFBLE1BQ0EsSUFBSSxjQUFjO0FBQ2QsZUFBTyxLQUFLO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFVBQVU7QUFDTixZQUFJLEtBQUssY0FBYztBQUNuQixnQkFBTSxJQUFJLE1BQU0saUNBQWlDO0FBQUEsUUFDckQ7QUFDQSxhQUFLLGVBQWU7QUFDcEIsYUFBSyxPQUFPLGFBQWE7QUFBQSxNQUM3QjtBQUFBLE1BQ0EsUUFBUSxVQUFVO0FBQ2QsYUFBSyxTQUFTLEdBQUcsU0FBUyxRQUFRO0FBQUEsTUFDdEM7QUFBQSxNQUNBLFFBQVEsVUFBVTtBQUNkLGFBQUssU0FBUyxLQUFLLFNBQVMsUUFBUTtBQUFBLE1BQ3hDO0FBQUEsTUFDQSxNQUFNLFVBQVU7QUFDWixhQUFLLFNBQVMsS0FBSyxPQUFPLFFBQVE7QUFBQSxNQUN0QztBQUFBLE1BQ0EsYUFBYSxXQUFXLE1BQU07QUFDMUIsY0FBTSxZQUFZLEVBQUUsV0FBVyxLQUFLO0FBQ3BDLGFBQUssT0FBTyxLQUFLLFdBQVcsQ0FBQyxVQUFVO0FBQ25DLGNBQUksVUFBVSxNQUFNO0FBQ2hCLGlCQUFLLGFBQWEsS0FBSztBQUFBLFVBQzNCO0FBQUEsUUFDSixDQUFDO0FBQUEsTUFDTDtBQUFBLE1BQ0EsUUFBUSxNQUFNLE1BQU07QUFDaEIsYUFBSyxTQUFTLEtBQUssV0FBVyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsT0FBTyxZQUFZO0FBQ2hGLGNBQUksVUFBVSxNQUFNO0FBQ2hCLGlCQUFLLE9BQU8sTUFBUztBQUNyQjtBQUFBLFVBQ0o7QUFDQSxxQkFBVyxTQUFTLFNBQVM7QUFDekIsaUJBQUssYUFBYSxPQUFPLEtBQUssSUFBSTtBQUFBLFVBQ3RDO0FBQ0EsZUFBSyxNQUFNLE1BQVM7QUFBQSxRQUN4QixDQUFDO0FBQUEsTUFDTDtBQUFBLE1BQ0EsYUFBYSxPQUFPO0FBQ2hCLFlBQUksS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLGFBQWEsS0FBSyxXQUFXLEtBQUssR0FBRztBQUNsRTtBQUFBLFFBQ0o7QUFDQSxhQUFLLGdCQUFnQjtBQUNyQixhQUFLLGVBQWU7QUFDcEIsYUFBSyxTQUFTLEtBQUssU0FBUyxLQUFLO0FBQUEsTUFDckM7QUFBQSxNQUNBLGFBQWEsT0FBTyxNQUFNO0FBQ3RCLFlBQUksS0FBSyxnQkFBZ0IsS0FBSyxlQUFlO0FBQ3pDO0FBQUEsUUFDSjtBQUNBLGNBQU0sV0FBVyxNQUFNO0FBQ3ZCLFlBQUksU0FBUyxRQUFXO0FBQ3BCLGdCQUFNLE9BQU8sT0FBTyxpQkFBaUIsTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLG9CQUFvQjtBQUFBLFFBQzlGO0FBQ0EsWUFBSSxPQUFPLGdCQUFnQixLQUFLLFVBQVUsYUFBYSxLQUFLLEdBQUc7QUFDM0QsZUFBSyxXQUFXLEtBQUs7QUFBQSxRQUN6QjtBQUNBLFlBQUksTUFBTSxPQUFPLFlBQVksS0FBSyxPQUFPLGdCQUFnQixLQUFLLFVBQVUsWUFBWSxLQUFLLEdBQUc7QUFDeEYsZUFBSyxhQUFhLFVBQVUsU0FBUyxTQUFZLFNBQVksTUFBTSxJQUFJO0FBQUEsUUFDM0U7QUFBQSxNQUNKO0FBQUEsTUFDQSxXQUFXLE9BQU87QUFDZCxhQUFLLFNBQVMsS0FBSyxTQUFTLEtBQUs7QUFBQSxNQUNyQztBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUNoR2xCLElBQUFDLGlCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU0sVUFBVTtBQUNoQixRQUFNLGdCQUFOLE1BQW9CO0FBQUEsTUFDaEIsWUFBWSxPQUFPLFdBQVc7QUFDMUIsYUFBSyxRQUFRO0FBQ2IsYUFBSyxZQUFZO0FBQ2pCLGFBQUssVUFBVSxJQUFJLFFBQVEsUUFBUSxLQUFLLE9BQU8sS0FBSyxTQUFTO0FBQzdELGFBQUssV0FBVyxDQUFDO0FBQUEsTUFDckI7QUFBQSxNQUNBLEtBQUssVUFBVTtBQUNYLGFBQUssUUFBUSxRQUFRLENBQUMsVUFBVTtBQUM1Qiw4QkFBb0IsVUFBVSxLQUFLO0FBQUEsUUFDdkMsQ0FBQztBQUNELGFBQUssUUFBUSxRQUFRLENBQUMsVUFBVTtBQUM1QixlQUFLLFNBQVMsS0FBSyxLQUFLO0FBQUEsUUFDNUIsQ0FBQztBQUNELGFBQUssUUFBUSxNQUFNLE1BQU07QUFDckIsOEJBQW9CLFVBQVUsS0FBSyxRQUFRO0FBQUEsUUFDL0MsQ0FBQztBQUNELGFBQUssUUFBUSxLQUFLO0FBQUEsTUFDdEI7QUFBQSxJQUNKO0FBQ0EsWUFBUSxVQUFVO0FBQ2xCLGFBQVMsb0JBQW9CLFVBQVUsT0FBTztBQUMxQyxlQUFTLEtBQUs7QUFBQSxJQUNsQjtBQUNBLGFBQVMsb0JBQW9CLFVBQVUsU0FBUztBQUM1QyxlQUFTLE1BQU0sT0FBTztBQUFBLElBQzFCO0FBQUE7QUFBQTs7O0FDN0JBLElBQUFDLGtCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU0sV0FBVyxRQUFRO0FBQ3pCLFFBQU0sVUFBVTtBQUNoQixRQUFNLGlCQUFOLE1BQXFCO0FBQUEsTUFDakIsWUFBWSxPQUFPLFdBQVc7QUFDMUIsYUFBSyxRQUFRO0FBQ2IsYUFBSyxZQUFZO0FBQ2pCLGFBQUssVUFBVSxJQUFJLFFBQVEsUUFBUSxLQUFLLE9BQU8sS0FBSyxTQUFTO0FBQzdELGFBQUssVUFBVSxJQUFJLFNBQVMsU0FBUztBQUFBLFVBQ2pDLFlBQVk7QUFBQSxVQUNaLE1BQU0sTUFBTTtBQUFBLFVBQUU7QUFBQSxVQUNkLFNBQVMsTUFBTTtBQUNYLGdCQUFJLENBQUMsS0FBSyxRQUFRLGFBQWE7QUFDM0IsbUJBQUssUUFBUSxRQUFRO0FBQUEsWUFDekI7QUFBQSxVQUNKO0FBQUEsUUFDSixDQUFDO0FBQUEsTUFDTDtBQUFBLE1BQ0EsT0FBTztBQUNILGFBQUssUUFBUSxRQUFRLENBQUMsVUFBVTtBQUM1QixlQUFLLFFBQVEsS0FBSyxTQUFTLEtBQUs7QUFBQSxRQUNwQyxDQUFDO0FBQ0QsYUFBSyxRQUFRLFFBQVEsQ0FBQyxVQUFVO0FBQzVCLGVBQUssUUFBUSxLQUFLLEtBQUs7QUFBQSxRQUMzQixDQUFDO0FBQ0QsYUFBSyxRQUFRLE1BQU0sTUFBTTtBQUNyQixlQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsUUFDMUIsQ0FBQztBQUNELGFBQUssUUFBUSxLQUFLO0FBQ2xCLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQ2pDbEIsSUFBQUMsZ0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTSxZQUFZO0FBQ2xCLFFBQU0sU0FBUztBQUNmLFFBQU0sV0FBVztBQUNqQixRQUFNLGFBQU4sY0FBeUIsU0FBUyxRQUFRO0FBQUEsTUFDdEMsY0FBYztBQUNWLGNBQU0sR0FBRyxTQUFTO0FBQ2xCLGFBQUssV0FBVyxVQUFVO0FBQzFCLGFBQUssV0FBVyxDQUFDO0FBQ2pCLGFBQUssU0FBUyxvQkFBSSxJQUFJO0FBQUEsTUFDMUI7QUFBQSxNQUNBLE9BQU87QUFDSCxhQUFLLGFBQWEsS0FBSyxPQUFPLEtBQUssVUFBVSxRQUFRO0FBQ3JELGFBQUssYUFBYTtBQUNsQixlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUFBLE1BQ0EsYUFBYSxXQUFXLE1BQU07QUFDMUIsYUFBSyxPQUFPLElBQUksRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLE1BQ3ZDO0FBQUEsTUFDQSxlQUFlO0FBQ1gsbUJBQVcsUUFBUSxLQUFLLE9BQU8sT0FBTyxHQUFHO0FBQ3JDLGVBQUssaUJBQWlCLEtBQUssV0FBVyxLQUFLLElBQUk7QUFBQSxRQUNuRDtBQUFBLE1BQ0o7QUFBQSxNQUNBLGlCQUFpQixXQUFXLE1BQU07QUFDOUIsWUFBSTtBQUNBLGdCQUFNLFVBQVUsS0FBSyxTQUFTLFdBQVcsS0FBSyxVQUFVLGlCQUFpQjtBQUN6RSxxQkFBVyxTQUFTLFNBQVM7QUFDekIsaUJBQUssYUFBYSxPQUFPLElBQUk7QUFBQSxVQUNqQztBQUFBLFFBQ0osU0FDTyxPQUFQO0FBQ0ksZUFBSyxhQUFhLEtBQUs7QUFBQSxRQUMzQjtBQUFBLE1BQ0o7QUFBQSxNQUNBLGFBQWEsT0FBTztBQUNoQixZQUFJLENBQUMsT0FBTyxhQUFhLEtBQUssV0FBVyxLQUFLLEdBQUc7QUFDN0M7QUFBQSxRQUNKO0FBQ0EsY0FBTTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLGFBQWEsT0FBTyxNQUFNO0FBQ3RCLGNBQU0sV0FBVyxNQUFNO0FBQ3ZCLFlBQUksU0FBUyxRQUFXO0FBQ3BCLGdCQUFNLE9BQU8sT0FBTyxpQkFBaUIsTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLG9CQUFvQjtBQUFBLFFBQzlGO0FBQ0EsWUFBSSxPQUFPLGdCQUFnQixLQUFLLFVBQVUsYUFBYSxLQUFLLEdBQUc7QUFDM0QsZUFBSyxlQUFlLEtBQUs7QUFBQSxRQUM3QjtBQUNBLFlBQUksTUFBTSxPQUFPLFlBQVksS0FBSyxPQUFPLGdCQUFnQixLQUFLLFVBQVUsWUFBWSxLQUFLLEdBQUc7QUFDeEYsZUFBSyxhQUFhLFVBQVUsU0FBUyxTQUFZLFNBQVksTUFBTSxJQUFJO0FBQUEsUUFDM0U7QUFBQSxNQUNKO0FBQUEsTUFDQSxlQUFlLE9BQU87QUFDbEIsYUFBSyxTQUFTLEtBQUssS0FBSztBQUFBLE1BQzVCO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQzFEbEIsSUFBQUMsZ0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTSxTQUFTO0FBQ2YsUUFBTSxlQUFOLE1BQW1CO0FBQUEsTUFDZixZQUFZLE9BQU8sV0FBVztBQUMxQixhQUFLLFFBQVE7QUFDYixhQUFLLFlBQVk7QUFDakIsYUFBSyxVQUFVLElBQUksT0FBTyxRQUFRLEtBQUssT0FBTyxLQUFLLFNBQVM7QUFBQSxNQUNoRTtBQUFBLE1BQ0EsT0FBTztBQUNILGVBQU8sS0FBSyxRQUFRLEtBQUs7QUFBQSxNQUM3QjtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUNibEIsSUFBQUMsb0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTUMsUUFBTyxRQUFRO0FBQ3JCLFFBQU0sWUFBWTtBQUNsQixRQUFNLFdBQU4sTUFBZTtBQUFBLE1BQ1gsWUFBWSxXQUFXLENBQUMsR0FBRztBQUN2QixhQUFLLFdBQVc7QUFDaEIsYUFBSyxXQUFXLEtBQUssVUFBVSxLQUFLLFNBQVMsVUFBVSxNQUFTO0FBQ2hFLGFBQUssY0FBYyxLQUFLLFVBQVUsS0FBSyxTQUFTLGFBQWEsT0FBTyxpQkFBaUI7QUFDckYsYUFBSyxhQUFhLEtBQUssVUFBVSxLQUFLLFNBQVMsWUFBWSxJQUFJO0FBQy9ELGFBQUssY0FBYyxLQUFLLFVBQVUsS0FBSyxTQUFTLGFBQWEsSUFBSTtBQUNqRSxhQUFLLGNBQWMsS0FBSyxVQUFVLEtBQUssU0FBUyxhQUFhLElBQUk7QUFDakUsYUFBSyx1QkFBdUIsS0FBSyxVQUFVLEtBQUssU0FBUyxzQkFBc0JBLE1BQUssR0FBRztBQUN2RixhQUFLLG9CQUFvQixJQUFJLFVBQVUsU0FBUztBQUFBLFVBQzVDLHFCQUFxQixLQUFLLFNBQVM7QUFBQSxVQUNuQyxJQUFJLEtBQUssU0FBUztBQUFBLFVBQ2xCLHNCQUFzQixLQUFLLFNBQVM7QUFBQSxVQUNwQyxPQUFPLEtBQUssU0FBUztBQUFBLFVBQ3JCLGdDQUFnQyxLQUFLLFNBQVM7QUFBQSxRQUNsRCxDQUFDO0FBQUEsTUFDTDtBQUFBLE1BQ0EsVUFBVSxRQUFRLE9BQU87QUFDckIsZUFBTyxXQUFXLFFBQVEsV0FBVyxTQUFTLFNBQVM7QUFBQSxNQUMzRDtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUN6QmxCLElBQUFDLGVBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsWUFBUSxXQUFXLFFBQVEsYUFBYSxRQUFRLFdBQVcsUUFBUSxPQUFPO0FBQzFFLFFBQU0sVUFBVTtBQUNoQixRQUFNLFdBQVc7QUFDakIsUUFBTSxTQUFTO0FBQ2YsUUFBTSxhQUFhO0FBQ25CLFlBQVEsV0FBVyxXQUFXO0FBQzlCLGFBQVMsS0FBSyxXQUFXLDZCQUE2QixVQUFVO0FBQzVELFVBQUksT0FBTyxnQ0FBZ0MsWUFBWTtBQUNuRCxZQUFJLFFBQVEsUUFBUSxXQUFXLFlBQVksQ0FBQyxFQUFFLEtBQUssMkJBQTJCO0FBQzlFO0FBQUEsTUFDSjtBQUNBLFVBQUksUUFBUSxRQUFRLFdBQVcsWUFBWSwyQkFBMkIsQ0FBQyxFQUFFLEtBQUssUUFBUTtBQUFBLElBQzFGO0FBQ0EsWUFBUSxPQUFPO0FBQ2YsYUFBUyxTQUFTLFdBQVcsbUJBQW1CO0FBQzVDLFlBQU0sV0FBVyxZQUFZLGlCQUFpQjtBQUM5QyxZQUFNLFdBQVcsSUFBSSxPQUFPLFFBQVEsV0FBVyxRQUFRO0FBQ3ZELGFBQU8sU0FBUyxLQUFLO0FBQUEsSUFDekI7QUFDQSxZQUFRLFdBQVc7QUFDbkIsYUFBUyxXQUFXLFdBQVcsbUJBQW1CO0FBQzlDLFlBQU0sV0FBVyxZQUFZLGlCQUFpQjtBQUM5QyxZQUFNLFdBQVcsSUFBSSxTQUFTLFFBQVEsV0FBVyxRQUFRO0FBQ3pELGFBQU8sU0FBUyxLQUFLO0FBQUEsSUFDekI7QUFDQSxZQUFRLGFBQWE7QUFDckIsYUFBUyxZQUFZLG9CQUFvQixDQUFDLEdBQUc7QUFDekMsVUFBSSw2QkFBNkIsV0FBVyxTQUFTO0FBQ2pELGVBQU87QUFBQSxNQUNYO0FBQ0EsYUFBTyxJQUFJLFdBQVcsUUFBUSxpQkFBaUI7QUFBQSxJQUNuRDtBQUFBO0FBQUE7OztBQ2pDQSxJQUFBQyxrQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxRQUFNQyxRQUFPLFFBQVE7QUFDckIsUUFBTSxTQUFTO0FBQ2YsUUFBTSxRQUFRO0FBQ2QsUUFBTSxTQUFOLE1BQWE7QUFBQSxNQUNULFlBQVksV0FBVztBQUNuQixhQUFLLFlBQVk7QUFDakIsYUFBSyxrQkFBa0IsSUFBSSxPQUFPLFNBQVM7QUFBQSxVQUN2QyxvQkFBb0IsS0FBSyxVQUFVO0FBQUEsVUFDbkMsSUFBSSxLQUFLLFVBQVU7QUFBQSxVQUNuQixnQ0FBZ0MsS0FBSyxVQUFVO0FBQUEsUUFDbkQsQ0FBQztBQUFBLE1BQ0w7QUFBQSxNQUNBLGtCQUFrQixVQUFVO0FBQ3hCLGVBQU9BLE1BQUssUUFBUSxLQUFLLFVBQVUsS0FBSyxRQUFRO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLFdBQVcsT0FBT0MsVUFBUztBQUN2QixjQUFNLFFBQVE7QUFBQSxVQUNWLE1BQU1BO0FBQUEsVUFDTixNQUFNQTtBQUFBLFVBQ04sUUFBUSxNQUFNLEdBQUcsc0JBQXNCQSxVQUFTLEtBQUs7QUFBQSxRQUN6RDtBQUNBLFlBQUksS0FBSyxVQUFVLE9BQU87QUFDdEIsZ0JBQU0sUUFBUTtBQUFBLFFBQ2xCO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFBQSxNQUNBLGNBQWMsT0FBTztBQUNqQixlQUFPLENBQUMsTUFBTSxNQUFNLGtCQUFrQixLQUFLLEtBQUssQ0FBQyxLQUFLLFVBQVU7QUFBQSxNQUNwRTtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUNoQ2xCLElBQUFDLGtCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU0sV0FBVyxRQUFRO0FBQ3pCLFFBQU0sU0FBUztBQUNmLFFBQU0sU0FBUztBQUNmLFFBQU0sV0FBVztBQUNqQixRQUFNLGVBQU4sY0FBMkIsU0FBUyxRQUFRO0FBQUEsTUFDeEMsY0FBYztBQUNWLGNBQU0sR0FBRyxTQUFTO0FBQ2xCLGFBQUssY0FBYyxPQUFPO0FBQzFCLGFBQUssUUFBUSxPQUFPO0FBQUEsTUFDeEI7QUFBQSxNQUNBLFFBQVEsTUFBTSxTQUFTO0FBQ25CLGVBQU8sS0FBSyxZQUFZLE1BQU0sT0FBTztBQUFBLE1BQ3pDO0FBQUEsTUFDQSxPQUFPLFVBQVUsU0FBUztBQUN0QixjQUFNLFlBQVksU0FBUyxJQUFJLEtBQUssbUJBQW1CLElBQUk7QUFDM0QsY0FBTSxTQUFTLElBQUksU0FBUyxZQUFZLEVBQUUsWUFBWSxLQUFLLENBQUM7QUFDNUQsZUFBTyxTQUFTLENBQUMsT0FBTyxNQUFNLFNBQVM7QUFDbkMsaUJBQU8sS0FBSyxVQUFVLFVBQVUsUUFBUSxTQUFTLFFBQVEsT0FBTyxFQUMzRCxLQUFLLENBQUMsVUFBVTtBQUNqQixnQkFBSSxVQUFVLFFBQVEsUUFBUSxZQUFZLEtBQUssR0FBRztBQUM5QyxxQkFBTyxLQUFLLEtBQUs7QUFBQSxZQUNyQjtBQUNBLGdCQUFJLFVBQVUsVUFBVSxTQUFTLEdBQUc7QUFDaEMscUJBQU8sSUFBSTtBQUFBLFlBQ2Y7QUFDQSxpQkFBSztBQUFBLFVBQ1QsQ0FBQyxFQUNJLE1BQU0sSUFBSTtBQUFBLFFBQ25CO0FBQ0EsaUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDdkMsaUJBQU8sTUFBTSxDQUFDO0FBQUEsUUFDbEI7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsVUFBVSxVQUFVQyxVQUFTLFNBQVM7QUFDbEMsZUFBTyxLQUFLLFNBQVMsUUFBUSxFQUN4QixLQUFLLENBQUMsVUFBVSxLQUFLLFdBQVcsT0FBT0EsUUFBTyxDQUFDLEVBQy9DLE1BQU0sQ0FBQyxVQUFVO0FBQ2xCLGNBQUksUUFBUSxZQUFZLEtBQUssR0FBRztBQUM1QixtQkFBTztBQUFBLFVBQ1g7QUFDQSxnQkFBTTtBQUFBLFFBQ1YsQ0FBQztBQUFBLE1BQ0w7QUFBQSxNQUNBLFNBQVMsVUFBVTtBQUNmLGVBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3BDLGVBQUssTUFBTSxVQUFVLEtBQUssaUJBQWlCLENBQUMsT0FBTyxVQUFVO0FBQ3pELG1CQUFPLFVBQVUsT0FBTyxRQUFRLEtBQUssSUFBSSxPQUFPLEtBQUs7QUFBQSxVQUN6RCxDQUFDO0FBQUEsUUFDTCxDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUN0RGxCLElBQUFDLGlCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU0sU0FBUztBQUNmLFFBQU0sV0FBVztBQUNqQixRQUFNLFdBQVc7QUFDakIsUUFBTSxjQUFOLGNBQTBCLFNBQVMsUUFBUTtBQUFBLE1BQ3ZDLGNBQWM7QUFDVixjQUFNLEdBQUcsU0FBUztBQUNsQixhQUFLLGFBQWEsT0FBTztBQUN6QixhQUFLLGdCQUFnQixJQUFJLFNBQVMsUUFBUSxLQUFLLFNBQVM7QUFBQSxNQUM1RDtBQUFBLE1BQ0EsUUFBUSxNQUFNLFNBQVM7QUFDbkIsZUFBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDcEMsZUFBSyxXQUFXLE1BQU0sU0FBUyxDQUFDLE9BQU8sWUFBWTtBQUMvQyxnQkFBSSxVQUFVLE1BQU07QUFDaEIsc0JBQVEsT0FBTztBQUFBLFlBQ25CLE9BQ0s7QUFDRCxxQkFBTyxLQUFLO0FBQUEsWUFDaEI7QUFBQSxVQUNKLENBQUM7QUFBQSxRQUNMLENBQUM7QUFBQSxNQUNMO0FBQUEsTUFDQSxNQUFNLE9BQU8sVUFBVSxTQUFTO0FBQzVCLGNBQU0sVUFBVSxDQUFDO0FBQ2pCLGNBQU0sU0FBUyxLQUFLLGNBQWMsT0FBTyxVQUFVLE9BQU87QUFFMUQsZUFBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDcEMsaUJBQU8sS0FBSyxTQUFTLE1BQU07QUFDM0IsaUJBQU8sR0FBRyxRQUFRLENBQUMsVUFBVSxRQUFRLEtBQUssS0FBSyxDQUFDO0FBQ2hELGlCQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsT0FBTyxDQUFDO0FBQUEsUUFDN0MsQ0FBQztBQUFBLE1BQ0w7QUFBQSxJQUNKO0FBQ0EsWUFBUSxVQUFVO0FBQUE7QUFBQTs7O0FDbENsQjtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxRQUFNLFFBQVE7QUFDZCxRQUFNLFVBQU4sTUFBYztBQUFBLE1BQ1YsWUFBWSxXQUFXLFdBQVcsb0JBQW9CO0FBQ2xELGFBQUssWUFBWTtBQUNqQixhQUFLLFlBQVk7QUFDakIsYUFBSyxxQkFBcUI7QUFDMUIsYUFBSyxXQUFXLENBQUM7QUFDakIsYUFBSyxhQUFhO0FBQUEsTUFDdEI7QUFBQSxNQUNBLGVBQWU7QUFDWCxtQkFBV0MsWUFBVyxLQUFLLFdBQVc7QUFDbEMsZ0JBQU0sV0FBVyxLQUFLLG9CQUFvQkEsUUFBTztBQUNqRCxnQkFBTSxXQUFXLEtBQUssMkJBQTJCLFFBQVE7QUFDekQsZUFBSyxTQUFTLEtBQUs7QUFBQSxZQUNmLFVBQVUsU0FBUyxVQUFVO0FBQUEsWUFDN0IsU0FBQUE7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0osQ0FBQztBQUFBLFFBQ0w7QUFBQSxNQUNKO0FBQUEsTUFDQSxvQkFBb0JBLFVBQVM7QUFDekIsY0FBTSxRQUFRLE1BQU0sUUFBUSxnQkFBZ0JBLFVBQVMsS0FBSyxrQkFBa0I7QUFDNUUsZUFBTyxNQUFNLElBQUksQ0FBQyxTQUFTO0FBQ3ZCLGdCQUFNLFVBQVUsTUFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssU0FBUztBQUNuRSxjQUFJLENBQUMsU0FBUztBQUNWLG1CQUFPO0FBQUEsY0FDSCxTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsWUFDYjtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFlBQ0gsU0FBUztBQUFBLFlBQ1QsU0FBUztBQUFBLFlBQ1QsV0FBVyxNQUFNLFFBQVEsT0FBTyxNQUFNLEtBQUssa0JBQWtCO0FBQUEsVUFDakU7QUFBQSxRQUNKLENBQUM7QUFBQSxNQUNMO0FBQUEsTUFDQSwyQkFBMkIsVUFBVTtBQUNqQyxlQUFPLE1BQU0sTUFBTSxVQUFVLFVBQVUsQ0FBQyxZQUFZLFFBQVEsV0FBVyxNQUFNLFFBQVEsWUFBWSxRQUFRLE9BQU8sQ0FBQztBQUFBLE1BQ3JIO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQzVDbEI7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTSxZQUFZO0FBQ2xCLFFBQU0saUJBQU4sY0FBNkIsVUFBVSxRQUFRO0FBQUEsTUFDM0MsTUFBTSxVQUFVO0FBQ1osY0FBTSxRQUFRLFNBQVMsTUFBTSxHQUFHO0FBQ2hDLGNBQU0sU0FBUyxNQUFNO0FBQ3JCLGNBQU0sV0FBVyxLQUFLLFNBQVMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFlBQVksS0FBSyxTQUFTLFNBQVMsTUFBTTtBQUMvRixtQkFBV0MsWUFBVyxVQUFVO0FBQzVCLGdCQUFNLFVBQVVBLFNBQVEsU0FBUztBQVFqQyxjQUFJLENBQUNBLFNBQVEsWUFBWSxTQUFTLFFBQVEsUUFBUTtBQUM5QyxtQkFBTztBQUFBLFVBQ1g7QUFDQSxnQkFBTSxRQUFRLE1BQU0sTUFBTSxDQUFDLE1BQU0sVUFBVTtBQUN2QyxrQkFBTSxVQUFVQSxTQUFRLFNBQVM7QUFDakMsZ0JBQUksUUFBUSxXQUFXLFFBQVEsVUFBVSxLQUFLLElBQUksR0FBRztBQUNqRCxxQkFBTztBQUFBLFlBQ1g7QUFDQSxnQkFBSSxDQUFDLFFBQVEsV0FBVyxRQUFRLFlBQVksTUFBTTtBQUM5QyxxQkFBTztBQUFBLFlBQ1g7QUFDQSxtQkFBTztBQUFBLFVBQ1gsQ0FBQztBQUNELGNBQUksT0FBTztBQUNQLG1CQUFPO0FBQUEsVUFDWDtBQUFBLFFBQ0o7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUNyQ2xCO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU0sUUFBUTtBQUNkLFFBQU0sWUFBWTtBQUNsQixRQUFNLGFBQU4sTUFBaUI7QUFBQSxNQUNiLFlBQVksV0FBVyxvQkFBb0I7QUFDdkMsYUFBSyxZQUFZO0FBQ2pCLGFBQUsscUJBQXFCO0FBQUEsTUFDOUI7QUFBQSxNQUNBLFVBQVUsVUFBVSxVQUFVLFVBQVU7QUFDcEMsY0FBTSxVQUFVLEtBQUssWUFBWSxRQUFRO0FBQ3pDLGNBQU0sYUFBYSxLQUFLLHVCQUF1QixRQUFRO0FBQ3ZELGVBQU8sQ0FBQyxVQUFVLEtBQUssUUFBUSxVQUFVLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDdkU7QUFBQSxNQUNBLFlBQVksVUFBVTtBQUNsQixlQUFPLElBQUksVUFBVSxRQUFRLFVBQVUsS0FBSyxXQUFXLEtBQUssa0JBQWtCO0FBQUEsTUFDbEY7QUFBQSxNQUNBLHVCQUF1QixVQUFVO0FBQzdCLGNBQU0sK0JBQStCLFNBQVMsT0FBTyxNQUFNLFFBQVEsNkJBQTZCO0FBQ2hHLGVBQU8sTUFBTSxRQUFRLG9CQUFvQiw4QkFBOEIsS0FBSyxrQkFBa0I7QUFBQSxNQUNsRztBQUFBLE1BQ0EsUUFBUSxVQUFVLE9BQU8sU0FBUyxZQUFZO0FBQzFDLFlBQUksS0FBSyxpQkFBaUIsVUFBVSxNQUFNLElBQUksR0FBRztBQUM3QyxpQkFBTztBQUFBLFFBQ1g7QUFDQSxZQUFJLEtBQUssdUJBQXVCLEtBQUssR0FBRztBQUNwQyxpQkFBTztBQUFBLFFBQ1g7QUFDQSxjQUFNLFdBQVcsTUFBTSxLQUFLLHdCQUF3QixNQUFNLElBQUk7QUFDOUQsWUFBSSxLQUFLLDZCQUE2QixVQUFVLE9BQU8sR0FBRztBQUN0RCxpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPLEtBQUssNkJBQTZCLFVBQVUsVUFBVTtBQUFBLE1BQ2pFO0FBQUEsTUFDQSxpQkFBaUIsVUFBVSxXQUFXO0FBSWxDLFlBQUksS0FBSyxVQUFVLFNBQVMsVUFBVTtBQUNsQyxpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPLEtBQUssZUFBZSxVQUFVLFNBQVMsS0FBSyxLQUFLLFVBQVU7QUFBQSxNQUN0RTtBQUFBLE1BQ0EsZUFBZSxVQUFVLFdBQVc7QUFDaEMsY0FBTSxpQkFBaUIsVUFBVSxNQUFNLEdBQUcsRUFBRTtBQUM1QyxZQUFJLGFBQWEsSUFBSTtBQUNqQixpQkFBTztBQUFBLFFBQ1g7QUFDQSxjQUFNLGdCQUFnQixTQUFTLE1BQU0sR0FBRyxFQUFFO0FBQzFDLGVBQU8saUJBQWlCO0FBQUEsTUFDNUI7QUFBQSxNQUNBLHVCQUF1QixPQUFPO0FBQzFCLGVBQU8sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLE1BQU0sT0FBTyxlQUFlO0FBQUEsTUFDOUU7QUFBQSxNQUNBLDZCQUE2QixXQUFXLFNBQVM7QUFDN0MsZUFBTyxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxRQUFRLE1BQU0sU0FBUztBQUFBLE1BQ3BFO0FBQUEsTUFDQSw2QkFBNkIsV0FBVyxZQUFZO0FBQ2hELGVBQU8sQ0FBQyxNQUFNLFFBQVEsU0FBUyxXQUFXLFVBQVU7QUFBQSxNQUN4RDtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUM3RGxCO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU0sUUFBUTtBQUNkLFFBQU0sY0FBTixNQUFrQjtBQUFBLE1BQ2QsWUFBWSxXQUFXLG9CQUFvQjtBQUN2QyxhQUFLLFlBQVk7QUFDakIsYUFBSyxxQkFBcUI7QUFDMUIsYUFBSyxRQUFRLG9CQUFJLElBQUk7QUFBQSxNQUN6QjtBQUFBLE1BQ0EsVUFBVSxVQUFVLFVBQVU7QUFDMUIsY0FBTSxhQUFhLE1BQU0sUUFBUSxvQkFBb0IsVUFBVSxLQUFLLGtCQUFrQjtBQUN0RixjQUFNLGFBQWEsTUFBTSxRQUFRLG9CQUFvQixVQUFVLE9BQU8sT0FBTyxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssa0JBQWtCLEdBQUcsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ3ZJLGVBQU8sQ0FBQyxVQUFVLEtBQUssUUFBUSxPQUFPLFlBQVksVUFBVTtBQUFBLE1BQ2hFO0FBQUEsTUFDQSxRQUFRLE9BQU8sWUFBWSxZQUFZO0FBQ25DLGNBQU0sV0FBVyxNQUFNLEtBQUssd0JBQXdCLE1BQU0sSUFBSTtBQUM5RCxZQUFJLEtBQUssVUFBVSxVQUFVLEtBQUssa0JBQWtCLFFBQVEsR0FBRztBQUMzRCxpQkFBTztBQUFBLFFBQ1g7QUFDQSxZQUFJLEtBQUssZ0JBQWdCLEtBQUssS0FBSyxLQUFLLHFCQUFxQixLQUFLLEdBQUc7QUFDakUsaUJBQU87QUFBQSxRQUNYO0FBQ0EsWUFBSSxLQUFLLHFDQUFxQyxVQUFVLFVBQVUsR0FBRztBQUNqRSxpQkFBTztBQUFBLFFBQ1g7QUFDQSxjQUFNLGNBQWMsTUFBTSxPQUFPLFlBQVk7QUFDN0MsY0FBTSxZQUFZLEtBQUssbUJBQW1CLFVBQVUsWUFBWSxXQUFXLEtBQUssQ0FBQyxLQUFLLG1CQUFtQixVQUFVLFlBQVksV0FBVztBQUMxSSxZQUFJLEtBQUssVUFBVSxVQUFVLFdBQVc7QUFDcEMsZUFBSyxtQkFBbUIsUUFBUTtBQUFBLFFBQ3BDO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFBQSxNQUNBLGtCQUFrQixVQUFVO0FBQ3hCLGVBQU8sS0FBSyxNQUFNLElBQUksUUFBUTtBQUFBLE1BQ2xDO0FBQUEsTUFDQSxtQkFBbUIsVUFBVTtBQUN6QixhQUFLLE1BQU0sSUFBSSxVQUFVLE1BQVM7QUFBQSxNQUN0QztBQUFBLE1BQ0EsZ0JBQWdCLE9BQU87QUFDbkIsZUFBTyxLQUFLLFVBQVUsYUFBYSxDQUFDLE1BQU0sT0FBTyxPQUFPO0FBQUEsTUFDNUQ7QUFBQSxNQUNBLHFCQUFxQixPQUFPO0FBQ3hCLGVBQU8sS0FBSyxVQUFVLG1CQUFtQixDQUFDLE1BQU0sT0FBTyxZQUFZO0FBQUEsTUFDdkU7QUFBQSxNQUNBLHFDQUFxQyxXQUFXLFlBQVk7QUFDeEQsWUFBSSxDQUFDLEtBQUssVUFBVSxVQUFVO0FBQzFCLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGNBQU0sV0FBVyxNQUFNLEtBQUssYUFBYSxLQUFLLFVBQVUsS0FBSyxTQUFTO0FBQ3RFLGVBQU8sTUFBTSxRQUFRLFNBQVMsVUFBVSxVQUFVO0FBQUEsTUFDdEQ7QUFBQSxNQUNBLG1CQUFtQixVQUFVLFlBQVksYUFBYTtBQUVsRCxjQUFNLFlBQVksTUFBTSxRQUFRLFNBQVMsVUFBVSxVQUFVO0FBRzdELFlBQUksQ0FBQyxhQUFhLGFBQWE7QUFDM0IsaUJBQU8sTUFBTSxRQUFRLFNBQVMsV0FBVyxLQUFLLFVBQVU7QUFBQSxRQUM1RDtBQUNBLGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQzlEbEI7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTSxRQUFRO0FBQ2QsUUFBTSxjQUFOLE1BQWtCO0FBQUEsTUFDZCxZQUFZLFdBQVc7QUFDbkIsYUFBSyxZQUFZO0FBQUEsTUFDckI7QUFBQSxNQUNBLFlBQVk7QUFDUixlQUFPLENBQUMsVUFBVSxLQUFLLGlCQUFpQixLQUFLO0FBQUEsTUFDakQ7QUFBQSxNQUNBLGlCQUFpQixPQUFPO0FBQ3BCLGVBQU8sTUFBTSxNQUFNLGtCQUFrQixLQUFLLEtBQUssS0FBSyxVQUFVO0FBQUEsTUFDbEU7QUFBQSxJQUNKO0FBQ0EsWUFBUSxVQUFVO0FBQUE7QUFBQTs7O0FDZGxCLElBQUFDLGlCQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU0sUUFBUTtBQUNkLFFBQU0sbUJBQU4sTUFBdUI7QUFBQSxNQUNuQixZQUFZLFdBQVc7QUFDbkIsYUFBSyxZQUFZO0FBQUEsTUFDckI7QUFBQSxNQUNBLGlCQUFpQjtBQUNiLGVBQU8sQ0FBQyxVQUFVLEtBQUssV0FBVyxLQUFLO0FBQUEsTUFDM0M7QUFBQSxNQUNBLFdBQVcsT0FBTztBQUNkLFlBQUksV0FBVyxNQUFNO0FBQ3JCLFlBQUksS0FBSyxVQUFVLFVBQVU7QUFDekIscUJBQVcsTUFBTSxLQUFLLGFBQWEsS0FBSyxVQUFVLEtBQUssUUFBUTtBQUMvRCxxQkFBVyxNQUFNLEtBQUssUUFBUSxRQUFRO0FBQUEsUUFDMUM7QUFDQSxZQUFJLEtBQUssVUFBVSxtQkFBbUIsTUFBTSxPQUFPLFlBQVksR0FBRztBQUM5RCxzQkFBWTtBQUFBLFFBQ2hCO0FBQ0EsWUFBSSxDQUFDLEtBQUssVUFBVSxZQUFZO0FBQzVCLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGVBQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFBQSxNQUNyRTtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUN6QmxCO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFFBQU1DLFFBQU8sUUFBUTtBQUNyQixRQUFNLFNBQVM7QUFDZixRQUFNLFVBQVU7QUFDaEIsUUFBTSxVQUFVO0FBQ2hCLFFBQU0sVUFBVTtBQUNoQixRQUFNLFdBQU4sTUFBZTtBQUFBLE1BQ1gsWUFBWSxXQUFXO0FBQ25CLGFBQUssWUFBWTtBQUNqQixhQUFLLGNBQWMsSUFBSSxRQUFRLFFBQVEsS0FBSyxTQUFTO0FBQ3JELGFBQUssY0FBYyxJQUFJLFFBQVEsUUFBUSxLQUFLLFdBQVcsS0FBSyxzQkFBc0IsQ0FBQztBQUNuRixhQUFLLGFBQWEsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEtBQUssc0JBQXNCLENBQUM7QUFDakYsYUFBSyxtQkFBbUIsSUFBSSxRQUFRLFFBQVEsS0FBSyxTQUFTO0FBQUEsTUFDOUQ7QUFBQSxNQUNBLGtCQUFrQixNQUFNO0FBQ3BCLGVBQU9BLE1BQUssUUFBUSxLQUFLLFVBQVUsS0FBSyxLQUFLLElBQUk7QUFBQSxNQUNyRDtBQUFBLE1BQ0Esa0JBQWtCLE1BQU07QUFDcEIsY0FBTSxXQUFXLEtBQUssU0FBUyxNQUFNLEtBQUssS0FBSztBQUMvQyxlQUFPO0FBQUEsVUFDSDtBQUFBLFVBQ0Esc0JBQXNCO0FBQUEsVUFDdEIsYUFBYSxLQUFLLFVBQVU7QUFBQSxVQUM1QixZQUFZLEtBQUssV0FBVyxVQUFVLFVBQVUsS0FBSyxVQUFVLEtBQUssUUFBUTtBQUFBLFVBQzVFLGFBQWEsS0FBSyxZQUFZLFVBQVUsS0FBSyxVQUFVLEtBQUssUUFBUTtBQUFBLFVBQ3BFLGFBQWEsS0FBSyxZQUFZLFVBQVU7QUFBQSxVQUN4QyxxQkFBcUIsS0FBSyxVQUFVO0FBQUEsVUFDcEMsSUFBSSxLQUFLLFVBQVU7QUFBQSxVQUNuQixPQUFPLEtBQUssVUFBVTtBQUFBLFVBQ3RCLGdDQUFnQyxLQUFLLFVBQVU7QUFBQSxVQUMvQyxXQUFXLEtBQUssaUJBQWlCLGVBQWU7QUFBQSxRQUNwRDtBQUFBLE1BQ0o7QUFBQSxNQUNBLHdCQUF3QjtBQUNwQixlQUFPO0FBQUEsVUFDSCxLQUFLLEtBQUssVUFBVTtBQUFBLFVBQ3BCLFdBQVcsS0FBSyxVQUFVO0FBQUEsVUFDMUIsU0FBUyxDQUFDLEtBQUssVUFBVTtBQUFBLFVBQ3pCLFFBQVEsQ0FBQyxLQUFLLFVBQVU7QUFBQSxVQUN4QixPQUFPLENBQUMsS0FBSyxVQUFVO0FBQUEsVUFDdkIsWUFBWSxDQUFDLEtBQUssVUFBVTtBQUFBLFVBQzVCLE9BQU87QUFBQSxVQUNQLGVBQWU7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsWUFBUSxVQUFVO0FBQUE7QUFBQTs7O0FDL0NsQixJQUFBQyxpQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxRQUFNLFVBQVU7QUFDaEIsUUFBTSxhQUFhO0FBQ25CLFFBQU0sZ0JBQU4sY0FBNEIsV0FBVyxRQUFRO0FBQUEsTUFDM0MsY0FBYztBQUNWLGNBQU0sR0FBRyxTQUFTO0FBQ2xCLGFBQUssVUFBVSxJQUFJLFFBQVEsUUFBUSxLQUFLLFNBQVM7QUFBQSxNQUNyRDtBQUFBLE1BQ0EsTUFBTSxLQUFLLE1BQU07QUFDYixjQUFNLE9BQU8sS0FBSyxrQkFBa0IsSUFBSTtBQUN4QyxjQUFNLFVBQVUsS0FBSyxrQkFBa0IsSUFBSTtBQUMzQyxjQUFNLFVBQVUsTUFBTSxLQUFLLElBQUksTUFBTSxNQUFNLE9BQU87QUFDbEQsZUFBTyxRQUFRLElBQUksQ0FBQyxVQUFVLFFBQVEsVUFBVSxLQUFLLENBQUM7QUFBQSxNQUMxRDtBQUFBLE1BQ0EsSUFBSSxNQUFNLE1BQU0sU0FBUztBQUNyQixZQUFJLEtBQUssU0FBUztBQUNkLGlCQUFPLEtBQUssUUFBUSxRQUFRLE1BQU0sT0FBTztBQUFBLFFBQzdDO0FBQ0EsZUFBTyxLQUFLLFFBQVEsT0FBTyxLQUFLLFVBQVUsT0FBTztBQUFBLE1BQ3JEO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQ3RCbEIsSUFBQUMsa0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTSxXQUFXLFFBQVE7QUFDekIsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sYUFBYTtBQUNuQixRQUFNLGlCQUFOLGNBQTZCLFdBQVcsUUFBUTtBQUFBLE1BQzVDLGNBQWM7QUFDVixjQUFNLEdBQUcsU0FBUztBQUNsQixhQUFLLFVBQVUsSUFBSSxTQUFTLFFBQVEsS0FBSyxTQUFTO0FBQUEsTUFDdEQ7QUFBQSxNQUNBLEtBQUssTUFBTTtBQUNQLGNBQU0sT0FBTyxLQUFLLGtCQUFrQixJQUFJO0FBQ3hDLGNBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJO0FBQzNDLGNBQU0sU0FBUyxLQUFLLElBQUksTUFBTSxNQUFNLE9BQU87QUFDM0MsY0FBTSxjQUFjLElBQUksU0FBUyxTQUFTLEVBQUUsWUFBWSxNQUFNLE1BQU0sTUFBTTtBQUFBLFFBQUUsRUFBRSxDQUFDO0FBQy9FLGVBQ0ssS0FBSyxTQUFTLENBQUMsVUFBVSxZQUFZLEtBQUssU0FBUyxLQUFLLENBQUMsRUFDekQsR0FBRyxRQUFRLENBQUMsVUFBVSxZQUFZLEtBQUssUUFBUSxRQUFRLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFDeEUsS0FBSyxPQUFPLE1BQU0sWUFBWSxLQUFLLEtBQUssQ0FBQztBQUM5QyxvQkFDSyxLQUFLLFNBQVMsTUFBTSxPQUFPLFFBQVEsQ0FBQztBQUN6QyxlQUFPO0FBQUEsTUFDWDtBQUFBLE1BQ0EsSUFBSSxNQUFNLE1BQU0sU0FBUztBQUNyQixZQUFJLEtBQUssU0FBUztBQUNkLGlCQUFPLEtBQUssUUFBUSxRQUFRLE1BQU0sT0FBTztBQUFBLFFBQzdDO0FBQ0EsZUFBTyxLQUFLLFFBQVEsT0FBTyxLQUFLLFVBQVUsT0FBTztBQUFBLE1BQ3JEO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQzlCbEIsSUFBQUMsZ0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxXQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsUUFBTSxTQUFTO0FBQ2YsUUFBTSxTQUFTO0FBQ2YsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sYUFBTixjQUF5QixTQUFTLFFBQVE7QUFBQSxNQUN0QyxjQUFjO0FBQ1YsY0FBTSxHQUFHLFNBQVM7QUFDbEIsYUFBSyxZQUFZLE9BQU87QUFDeEIsYUFBSyxZQUFZLE9BQU87QUFBQSxNQUM1QjtBQUFBLE1BQ0EsUUFBUSxNQUFNLFNBQVM7QUFDbkIsZUFBTyxLQUFLLFVBQVUsTUFBTSxPQUFPO0FBQUEsTUFDdkM7QUFBQSxNQUNBLE9BQU8sVUFBVSxTQUFTO0FBQ3RCLGNBQU0sVUFBVSxDQUFDO0FBQ2pCLG1CQUFXQyxZQUFXLFVBQVU7QUFDNUIsZ0JBQU0sV0FBVyxLQUFLLGtCQUFrQkEsUUFBTztBQUMvQyxnQkFBTSxRQUFRLEtBQUssVUFBVSxVQUFVQSxVQUFTLE9BQU87QUFDdkQsY0FBSSxVQUFVLFFBQVEsQ0FBQyxRQUFRLFlBQVksS0FBSyxHQUFHO0FBQy9DO0FBQUEsVUFDSjtBQUNBLGtCQUFRLEtBQUssS0FBSztBQUFBLFFBQ3RCO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFBQSxNQUNBLFVBQVUsVUFBVUEsVUFBUyxTQUFTO0FBQ2xDLFlBQUk7QUFDQSxnQkFBTSxRQUFRLEtBQUssU0FBUyxRQUFRO0FBQ3BDLGlCQUFPLEtBQUssV0FBVyxPQUFPQSxRQUFPO0FBQUEsUUFDekMsU0FDTyxPQUFQO0FBQ0ksY0FBSSxRQUFRLFlBQVksS0FBSyxHQUFHO0FBQzVCLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGdCQUFNO0FBQUEsUUFDVjtBQUFBLE1BQ0o7QUFBQSxNQUNBLFNBQVMsVUFBVTtBQUNmLGVBQU8sS0FBSyxVQUFVLFVBQVUsS0FBSyxlQUFlO0FBQUEsTUFDeEQ7QUFBQSxJQUNKO0FBQ0EsWUFBUSxVQUFVO0FBQUE7QUFBQTs7O0FDMUNsQixJQUFBQyxnQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxRQUFNLFNBQVM7QUFDZixRQUFNLGFBQWE7QUFDbkIsUUFBTSxlQUFOLGNBQTJCLFdBQVcsUUFBUTtBQUFBLE1BQzFDLGNBQWM7QUFDVixjQUFNLEdBQUcsU0FBUztBQUNsQixhQUFLLFVBQVUsSUFBSSxPQUFPLFFBQVEsS0FBSyxTQUFTO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLEtBQUssTUFBTTtBQUNQLGNBQU0sT0FBTyxLQUFLLGtCQUFrQixJQUFJO0FBQ3hDLGNBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJO0FBQzNDLGNBQU0sVUFBVSxLQUFLLElBQUksTUFBTSxNQUFNLE9BQU87QUFDNUMsZUFBTyxRQUFRLElBQUksUUFBUSxTQUFTO0FBQUEsTUFDeEM7QUFBQSxNQUNBLElBQUksTUFBTSxNQUFNLFNBQVM7QUFDckIsWUFBSSxLQUFLLFNBQVM7QUFDZCxpQkFBTyxLQUFLLFFBQVEsUUFBUSxNQUFNLE9BQU87QUFBQSxRQUM3QztBQUNBLGVBQU8sS0FBSyxRQUFRLE9BQU8sS0FBSyxVQUFVLE9BQU87QUFBQSxNQUNyRDtBQUFBLElBQ0o7QUFDQSxZQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUN0QmxCLElBQUFDLG9CQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsV0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFlBQVEsOEJBQThCO0FBQ3RDLFFBQU1DLE1BQUssUUFBUTtBQUNuQixRQUFNQyxNQUFLLFFBQVE7QUFLbkIsUUFBTSxZQUFZLEtBQUssSUFBSUEsSUFBRyxLQUFLLEVBQUUsUUFBUSxDQUFDO0FBQzlDLFlBQVEsOEJBQThCO0FBQUEsTUFDbEMsT0FBT0QsSUFBRztBQUFBLE1BQ1YsV0FBV0EsSUFBRztBQUFBLE1BQ2QsTUFBTUEsSUFBRztBQUFBLE1BQ1QsVUFBVUEsSUFBRztBQUFBLE1BQ2IsU0FBU0EsSUFBRztBQUFBLE1BQ1osYUFBYUEsSUFBRztBQUFBLElBQ3BCO0FBQ0EsUUFBTSxXQUFOLE1BQWU7QUFBQSxNQUNYLFlBQVksV0FBVyxDQUFDLEdBQUc7QUFDdkIsYUFBSyxXQUFXO0FBQ2hCLGFBQUssV0FBVyxLQUFLLFVBQVUsS0FBSyxTQUFTLFVBQVUsS0FBSztBQUM1RCxhQUFLLGdCQUFnQixLQUFLLFVBQVUsS0FBSyxTQUFTLGVBQWUsS0FBSztBQUN0RSxhQUFLLGlCQUFpQixLQUFLLFVBQVUsS0FBSyxTQUFTLGdCQUFnQixJQUFJO0FBQ3ZFLGFBQUsscUJBQXFCLEtBQUssVUFBVSxLQUFLLFNBQVMsb0JBQW9CLElBQUk7QUFDL0UsYUFBSyxjQUFjLEtBQUssVUFBVSxLQUFLLFNBQVMsYUFBYSxTQUFTO0FBQ3RFLGFBQUssTUFBTSxLQUFLLFVBQVUsS0FBSyxTQUFTLEtBQUssUUFBUSxJQUFJLENBQUM7QUFDMUQsYUFBSyxPQUFPLEtBQUssVUFBVSxLQUFLLFNBQVMsTUFBTSxRQUFRO0FBQ3ZELGFBQUssTUFBTSxLQUFLLFVBQVUsS0FBSyxTQUFTLEtBQUssS0FBSztBQUNsRCxhQUFLLFVBQVUsS0FBSyxVQUFVLEtBQUssU0FBUyxTQUFTLElBQUk7QUFDekQsYUFBSyxzQkFBc0IsS0FBSyxVQUFVLEtBQUssU0FBUyxxQkFBcUIsSUFBSTtBQUNqRixhQUFLLEtBQUssS0FBSyxzQkFBc0IsS0FBSyxTQUFTLEVBQUU7QUFDckQsYUFBSyxXQUFXLEtBQUssVUFBVSxLQUFLLFNBQVMsVUFBVSxJQUFJO0FBQzNELGFBQUssU0FBUyxLQUFLLFVBQVUsS0FBSyxTQUFTLFFBQVEsQ0FBQyxDQUFDO0FBQ3JELGFBQUssa0JBQWtCLEtBQUssVUFBVSxLQUFLLFNBQVMsaUJBQWlCLEtBQUs7QUFDMUUsYUFBSyxhQUFhLEtBQUssVUFBVSxLQUFLLFNBQVMsWUFBWSxLQUFLO0FBQ2hFLGFBQUssa0JBQWtCLEtBQUssVUFBVSxLQUFLLFNBQVMsaUJBQWlCLEtBQUs7QUFDMUUsYUFBSyxZQUFZLEtBQUssVUFBVSxLQUFLLFNBQVMsV0FBVyxJQUFJO0FBQzdELGFBQUssUUFBUSxLQUFLLFVBQVUsS0FBSyxTQUFTLE9BQU8sS0FBSztBQUN0RCxhQUFLLGlCQUFpQixLQUFLLFVBQVUsS0FBSyxTQUFTLGdCQUFnQixLQUFLO0FBQ3hFLGFBQUssaUNBQWlDLEtBQUssVUFBVSxLQUFLLFNBQVMsZ0NBQWdDLEtBQUs7QUFDeEcsYUFBSyxTQUFTLEtBQUssVUFBVSxLQUFLLFNBQVMsUUFBUSxJQUFJO0FBQ3ZELFlBQUksS0FBSyxpQkFBaUI7QUFDdEIsZUFBSyxZQUFZO0FBQUEsUUFDckI7QUFDQSxZQUFJLEtBQUssT0FBTztBQUNaLGVBQUssYUFBYTtBQUFBLFFBQ3RCO0FBRUEsYUFBSyxTQUFTLENBQUMsRUFBRSxPQUFPLEtBQUssTUFBTTtBQUFBLE1BQ3ZDO0FBQUEsTUFDQSxVQUFVLFFBQVEsT0FBTztBQUNyQixlQUFPLFdBQVcsU0FBWSxRQUFRO0FBQUEsTUFDMUM7QUFBQSxNQUNBLHNCQUFzQixVQUFVLENBQUMsR0FBRztBQUNoQyxlQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sQ0FBQyxHQUFHLFFBQVEsMkJBQTJCLEdBQUcsT0FBTztBQUFBLE1BQ3hGO0FBQUEsSUFDSjtBQUNBLFlBQVEsVUFBVTtBQUFBO0FBQUE7OztBQzFEbEIsSUFBQUUsZUFBQTtBQUFBLHVEQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUNBLFFBQU0sY0FBYztBQUNwQixRQUFNLFVBQVU7QUFDaEIsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sU0FBUztBQUNmLFFBQU0sYUFBYTtBQUNuQixRQUFNLFFBQVE7QUFDZCxtQkFBZSxTQUFTLFFBQVEsU0FBUztBQUNyQyxNQUFBQyxxQkFBb0IsTUFBTTtBQUMxQixZQUFNLFFBQVEsU0FBUyxRQUFRLFFBQVEsU0FBUyxPQUFPO0FBQ3ZELFlBQU0sU0FBUyxNQUFNLFFBQVEsSUFBSSxLQUFLO0FBQ3RDLGFBQU8sTUFBTSxNQUFNLFFBQVEsTUFBTTtBQUFBLElBQ3JDO0FBR0EsS0FBQyxTQUFVQyxXQUFVO0FBQ2pCLE1BQUFBLFVBQVMsT0FBT0E7QUFDaEIsTUFBQUEsVUFBUyxXQUFXO0FBQ3BCLE1BQUFBLFVBQVMsYUFBYTtBQUN0QixNQUFBQSxVQUFTLFFBQVFBO0FBQ2pCLGVBQVMsS0FBSyxRQUFRLFNBQVM7QUFDM0IsUUFBQUQscUJBQW9CLE1BQU07QUFDMUIsY0FBTSxRQUFRLFNBQVMsUUFBUSxPQUFPLFNBQVMsT0FBTztBQUN0RCxlQUFPLE1BQU0sTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUNwQztBQUNBLE1BQUFDLFVBQVMsT0FBTztBQUNoQixlQUFTLE9BQU8sUUFBUSxTQUFTO0FBQzdCLFFBQUFELHFCQUFvQixNQUFNO0FBQzFCLGNBQU0sUUFBUSxTQUFTLFFBQVEsU0FBUyxTQUFTLE9BQU87QUFNeEQsZUFBTyxNQUFNLE9BQU8sTUFBTSxLQUFLO0FBQUEsTUFDbkM7QUFDQSxNQUFBQyxVQUFTLFNBQVM7QUFDbEIsZUFBU0MsZUFBYyxRQUFRLFNBQVM7QUFDcEMsUUFBQUYscUJBQW9CLE1BQU07QUFDMUIsY0FBTSxXQUFXLENBQUMsRUFBRSxPQUFPLE1BQU07QUFDakMsY0FBTSxXQUFXLElBQUksV0FBVyxRQUFRLE9BQU87QUFDL0MsZUFBTyxZQUFZLFNBQVMsVUFBVSxRQUFRO0FBQUEsTUFDbEQ7QUFDQSxNQUFBQyxVQUFTLGdCQUFnQkM7QUFDekIsZUFBU0Msa0JBQWlCLFFBQVEsU0FBUztBQUN2QyxRQUFBSCxxQkFBb0IsTUFBTTtBQUMxQixjQUFNLFdBQVcsSUFBSSxXQUFXLFFBQVEsT0FBTztBQUMvQyxlQUFPLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxRQUFRO0FBQUEsTUFDMUQ7QUFDQSxNQUFBQyxVQUFTLG1CQUFtQkU7QUFDNUIsZUFBUyxXQUFXLFFBQVE7QUFDeEIsUUFBQUgscUJBQW9CLE1BQU07QUFDMUIsZUFBTyxNQUFNLEtBQUssT0FBTyxNQUFNO0FBQUEsTUFDbkM7QUFDQSxNQUFBQyxVQUFTLGFBQWE7QUFDdEIsZUFBUyxxQkFBcUIsUUFBUTtBQUNsQyxRQUFBRCxxQkFBb0IsTUFBTTtBQUMxQixlQUFPLE1BQU0sS0FBSyxxQkFBcUIsTUFBTTtBQUFBLE1BQ2pEO0FBQ0EsTUFBQUMsVUFBUyx1QkFBdUI7QUFDaEMsVUFBSTtBQUNKLE9BQUMsU0FBVUcsUUFBTztBQUNkLGlCQUFTQyxZQUFXLFFBQVE7QUFDeEIsVUFBQUwscUJBQW9CLE1BQU07QUFDMUIsaUJBQU8sTUFBTSxLQUFLLGdCQUFnQixNQUFNO0FBQUEsUUFDNUM7QUFDQSxRQUFBSSxPQUFNLGFBQWFDO0FBQ25CLGlCQUFTQyxzQkFBcUIsUUFBUTtBQUNsQyxVQUFBTixxQkFBb0IsTUFBTTtBQUMxQixpQkFBTyxNQUFNLEtBQUssMEJBQTBCLE1BQU07QUFBQSxRQUN0RDtBQUNBLFFBQUFJLE9BQU0sdUJBQXVCRTtBQUFBLE1BQ2pDLEdBQUcsUUFBUUwsVUFBUyxVQUFVQSxVQUFTLFFBQVEsQ0FBQyxFQUFFO0FBQ2xELFVBQUk7QUFDSixPQUFDLFNBQVVNLFFBQU87QUFDZCxpQkFBU0YsWUFBVyxRQUFRO0FBQ3hCLFVBQUFMLHFCQUFvQixNQUFNO0FBQzFCLGlCQUFPLE1BQU0sS0FBSyxrQkFBa0IsTUFBTTtBQUFBLFFBQzlDO0FBQ0EsUUFBQU8sT0FBTSxhQUFhRjtBQUNuQixpQkFBU0Msc0JBQXFCLFFBQVE7QUFDbEMsVUFBQU4scUJBQW9CLE1BQU07QUFDMUIsaUJBQU8sTUFBTSxLQUFLLDRCQUE0QixNQUFNO0FBQUEsUUFDeEQ7QUFDQSxRQUFBTyxPQUFNLHVCQUF1QkQ7QUFBQSxNQUNqQyxHQUFHLFFBQVFMLFVBQVMsVUFBVUEsVUFBUyxRQUFRLENBQUMsRUFBRTtBQUFBLElBQ3RELEdBQUcsYUFBYSxXQUFXLENBQUMsRUFBRTtBQUM5QixhQUFTLFNBQVMsUUFBUSxXQUFXLFNBQVM7QUFDMUMsWUFBTSxXQUFXLENBQUMsRUFBRSxPQUFPLE1BQU07QUFDakMsWUFBTSxXQUFXLElBQUksV0FBVyxRQUFRLE9BQU87QUFDL0MsWUFBTSxRQUFRLFlBQVksU0FBUyxVQUFVLFFBQVE7QUFDckQsWUFBTSxXQUFXLElBQUksVUFBVSxRQUFRO0FBQ3ZDLGFBQU8sTUFBTSxJQUFJLFNBQVMsTUFBTSxRQUFRO0FBQUEsSUFDNUM7QUFDQSxhQUFTRCxxQkFBb0IsT0FBTztBQUNoQyxZQUFNLFNBQVMsQ0FBQyxFQUFFLE9BQU8sS0FBSztBQUM5QixZQUFNLGdCQUFnQixPQUFPLE1BQU0sQ0FBQyxTQUFTLE1BQU0sT0FBTyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sT0FBTyxRQUFRLElBQUksQ0FBQztBQUN2RyxVQUFJLENBQUMsZUFBZTtBQUNoQixjQUFNLElBQUksVUFBVSw4REFBOEQ7QUFBQSxNQUN0RjtBQUFBLElBQ0o7QUFDQSxJQUFBRCxRQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUNyR2pCO0FBQUE7QUFBQTtBQUFBO0FBQ0EsUUFBTSxFQUFDLFVBQVMsSUFBSSxRQUFRO0FBQzVCLFFBQU1TLE1BQUssUUFBUTtBQUVuQixtQkFBZSxPQUFPLFlBQVksaUJBQWlCLFVBQVU7QUFDNUQsVUFBSSxPQUFPLGFBQWEsVUFBVTtBQUNqQyxjQUFNLElBQUksVUFBVSwwQkFBMEIsT0FBTyxVQUFVO0FBQUEsTUFDaEU7QUFFQSxVQUFJO0FBQ0gsY0FBTSxRQUFRLE1BQU0sVUFBVUEsSUFBRyxXQUFXLEVBQUUsUUFBUTtBQUN0RCxlQUFPLE1BQU0saUJBQWlCO0FBQUEsTUFDL0IsU0FBUyxPQUFQO0FBQ0QsWUFBSSxNQUFNLFNBQVMsVUFBVTtBQUM1QixpQkFBTztBQUFBLFFBQ1I7QUFFQSxjQUFNO0FBQUEsTUFDUDtBQUFBLElBQ0Q7QUFFQSxhQUFTLFdBQVcsWUFBWSxpQkFBaUIsVUFBVTtBQUMxRCxVQUFJLE9BQU8sYUFBYSxVQUFVO0FBQ2pDLGNBQU0sSUFBSSxVQUFVLDBCQUEwQixPQUFPLFVBQVU7QUFBQSxNQUNoRTtBQUVBLFVBQUk7QUFDSCxlQUFPQSxJQUFHLFlBQVksUUFBUSxFQUFFLGlCQUFpQjtBQUFBLE1BQ2xELFNBQVMsT0FBUDtBQUNELFlBQUksTUFBTSxTQUFTLFVBQVU7QUFDNUIsaUJBQU87QUFBQSxRQUNSO0FBRUEsY0FBTTtBQUFBLE1BQ1A7QUFBQSxJQUNEO0FBRUEsWUFBUSxTQUFTLE9BQU8sS0FBSyxNQUFNLFFBQVEsUUFBUTtBQUNuRCxZQUFRLGNBQWMsT0FBTyxLQUFLLE1BQU0sUUFBUSxhQUFhO0FBQzdELFlBQVEsWUFBWSxPQUFPLEtBQUssTUFBTSxTQUFTLGdCQUFnQjtBQUMvRCxZQUFRLGFBQWEsV0FBVyxLQUFLLE1BQU0sWUFBWSxRQUFRO0FBQy9ELFlBQVEsa0JBQWtCLFdBQVcsS0FBSyxNQUFNLFlBQVksYUFBYTtBQUN6RSxZQUFRLGdCQUFnQixXQUFXLEtBQUssTUFBTSxhQUFhLGdCQUFnQjtBQUFBO0FBQUE7OztBQzFDM0U7QUFBQSxrREFBQUMsU0FBQTtBQUFBO0FBQUE7QUFDQSxRQUFNQyxRQUFPLFFBQVE7QUFDckIsUUFBTSxXQUFXO0FBRWpCLFFBQU0sZ0JBQWdCLGdCQUFjLFdBQVcsU0FBUyxJQUFJLElBQUksV0FBVyxLQUFLLEdBQUcsT0FBTyxXQUFXO0FBRXJHLFFBQU0sVUFBVSxDQUFDLFVBQVUsUUFBUTtBQUNsQyxZQUFNLE1BQU0sU0FBUyxPQUFPLE1BQU0sU0FBUyxNQUFNLENBQUMsSUFBSTtBQUN0RCxhQUFPQSxNQUFLLFdBQVcsR0FBRyxJQUFJLE1BQU1BLE1BQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN2RDtBQUVBLFFBQU0sZ0JBQWdCLENBQUMsTUFBTSxlQUFlO0FBQzNDLFVBQUlBLE1BQUssUUFBUSxJQUFJLEdBQUc7QUFDdkIsZUFBTyxNQUFNO0FBQUEsTUFDZDtBQUVBLGFBQU8sTUFBTSxRQUFRLGNBQWMsVUFBVTtBQUFBLElBQzlDO0FBRUEsUUFBTSxVQUFVLENBQUMsV0FBVyxZQUFZO0FBQ3ZDLFVBQUksUUFBUSxTQUFTLENBQUMsTUFBTSxRQUFRLFFBQVEsS0FBSyxHQUFHO0FBQ25ELGNBQU0sSUFBSSxVQUFVLGtFQUFrRSxPQUFPLFFBQVEsU0FBUztBQUFBLE1BQy9HO0FBRUEsVUFBSSxRQUFRLGNBQWMsQ0FBQyxNQUFNLFFBQVEsUUFBUSxVQUFVLEdBQUc7QUFDN0QsY0FBTSxJQUFJLFVBQVUsdUVBQXVFLE9BQU8sUUFBUSxjQUFjO0FBQUEsTUFDekg7QUFFQSxVQUFJLFFBQVEsU0FBUyxRQUFRLFlBQVk7QUFDeEMsZUFBTyxRQUFRLE1BQU0sSUFBSSxPQUFLQSxNQUFLLE1BQU0sS0FBSyxXQUFXLGNBQWMsR0FBRyxRQUFRLFVBQVUsQ0FBQyxDQUFDO0FBQUEsTUFDL0Y7QUFFQSxVQUFJLFFBQVEsT0FBTztBQUNsQixlQUFPLFFBQVEsTUFBTSxJQUFJLE9BQUtBLE1BQUssTUFBTSxLQUFLLFdBQVcsTUFBTSxHQUFHLENBQUM7QUFBQSxNQUNwRTtBQUVBLFVBQUksUUFBUSxZQUFZO0FBQ3ZCLGVBQU8sQ0FBQ0EsTUFBSyxNQUFNLEtBQUssV0FBVyxRQUFRLGNBQWMsUUFBUSxVQUFVLEdBQUcsQ0FBQztBQUFBLE1BQ2hGO0FBRUEsYUFBTyxDQUFDQSxNQUFLLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQztBQUFBLElBQ3pDO0FBRUEsSUFBQUQsUUFBTyxVQUFVLE9BQU8sT0FBTyxZQUFZO0FBQzFDLGdCQUFVO0FBQUEsUUFDVCxLQUFLLFFBQVEsSUFBSTtBQUFBLFFBQ2pCLEdBQUc7QUFBQSxNQUNKO0FBRUEsVUFBSSxPQUFPLFFBQVEsUUFBUSxVQUFVO0FBQ3BDLGNBQU0sSUFBSSxVQUFVLGlFQUFpRSxPQUFPLFFBQVEsT0FBTztBQUFBLE1BQzVHO0FBRUEsWUFBTSxRQUFRLE1BQU0sUUFBUSxJQUFJLENBQUMsRUFBRSxPQUFPLEtBQUssRUFBRSxJQUFJLE9BQU0sTUFBSztBQUMvRCxjQUFNLGNBQWMsTUFBTSxTQUFTLFlBQVksUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDO0FBQ3RFLGVBQU8sY0FBYyxRQUFRLEdBQUcsT0FBTyxJQUFJO0FBQUEsTUFDNUMsQ0FBQyxDQUFDO0FBRUYsYUFBTyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxLQUFLO0FBQUEsSUFDakM7QUFFQSxJQUFBQSxRQUFPLFFBQVEsT0FBTyxDQUFDLE9BQU8sWUFBWTtBQUN6QyxnQkFBVTtBQUFBLFFBQ1QsS0FBSyxRQUFRLElBQUk7QUFBQSxRQUNqQixHQUFHO0FBQUEsTUFDSjtBQUVBLFVBQUksT0FBTyxRQUFRLFFBQVEsVUFBVTtBQUNwQyxjQUFNLElBQUksVUFBVSxpRUFBaUUsT0FBTyxRQUFRLE9BQU87QUFBQSxNQUM1RztBQUVBLFlBQU0sUUFBUSxDQUFDLEVBQUUsT0FBTyxLQUFLLEVBQUUsSUFBSSxPQUFLLFNBQVMsZ0JBQWdCLFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxJQUFJLFFBQVEsR0FBRyxPQUFPLElBQUksQ0FBQztBQUVuSCxhQUFPLENBQUMsRUFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUs7QUFBQSxJQUNqQztBQUFBO0FBQUE7OztBQzFFQTtBQUFBLGdEQUFBRSxTQUFBO0FBQUE7QUFDQSxhQUFTLFVBQVcsU0FBUztBQUMzQixhQUFPLE1BQU0sUUFBUSxPQUFPLElBQ3hCLFVBQ0EsQ0FBQyxPQUFPO0FBQUEsSUFDZDtBQUVBLFFBQU0sUUFBUTtBQUNkLFFBQU0sUUFBUTtBQUNkLFFBQU0sU0FBUztBQUNmLFFBQU0sd0JBQXdCO0FBQzlCLFFBQU0sbUNBQW1DO0FBQ3pDLFFBQU0sNENBQTRDO0FBQ2xELFFBQU0scUNBQXFDO0FBQzNDLFFBQU0sc0JBQXNCO0FBTTVCLFFBQU0sMEJBQTBCO0FBRWhDLFFBQU0sUUFBUTtBQUdkLFFBQUksaUJBQWlCO0FBRXJCLFFBQUksT0FBTyxXQUFXLGFBQWE7QUFDakMsdUJBQWlCLE9BQU8sSUFBSSxhQUFhO0FBQUEsSUFDM0M7QUFDQSxRQUFNLGFBQWE7QUFFbkIsUUFBTSxTQUFTLENBQUMsUUFBUSxLQUFLLFVBQzNCLE9BQU8sZUFBZSxRQUFRLEtBQUssRUFBQyxNQUFLLENBQUM7QUFFNUMsUUFBTSxxQkFBcUI7QUFFM0IsUUFBTSxlQUFlLE1BQU07QUFJM0IsUUFBTSxnQkFBZ0IsV0FBUyxNQUFNO0FBQUEsTUFDbkM7QUFBQSxNQUNBLENBQUMsT0FBTyxNQUFNLE9BQU8sS0FBSyxXQUFXLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUN0RCxRQUdBO0FBQUEsSUFDTjtBQUdBLFFBQU0sc0JBQXNCLGFBQVc7QUFDckMsWUFBTSxFQUFDLE9BQU0sSUFBSTtBQUNqQixhQUFPLFFBQVEsTUFBTSxHQUFHLFNBQVMsU0FBUyxDQUFDO0FBQUEsSUFDN0M7QUFhQSxRQUFNLFlBQVk7QUFBQSxNQUdoQjtBQUFBLFFBSUU7QUFBQSxRQUNBLFdBQVMsTUFBTSxRQUFRLElBQUksTUFBTSxJQUM3QixRQUNBO0FBQUEsTUFDTjtBQUFBLE1BR0E7QUFBQSxRQUNFO0FBQUEsUUFDQSxNQUFNO0FBQUEsTUFDUjtBQUFBLE1BbUJBO0FBQUEsUUFDRTtBQUFBLFFBQ0EsV0FBUyxLQUFLO0FBQUEsTUFDaEI7QUFBQSxNQUVBO0FBQUEsUUFFRTtBQUFBLFFBQ0EsTUFBTTtBQUFBLE1BQ1I7QUFBQSxNQUdBO0FBQUEsUUFLRTtBQUFBLFFBQ0EsTUFBTTtBQUFBLE1BQ1I7QUFBQSxNQUdBO0FBQUEsUUFDRTtBQUFBLFFBQ0EsTUFBTTtBQUFBLE1BQ1I7QUFBQSxNQUVBO0FBQUEsUUFPRTtBQUFBLFFBR0EsTUFBTTtBQUFBLE1BQ1I7QUFBQSxNQUdBO0FBQUEsUUFJRTtBQUFBLFFBQ0EsU0FBUyxtQkFBb0I7QUFFM0IsaUJBQU8sQ0FBQyxVQUFVLEtBQUssSUFBSSxJQWF2QixjQUlBO0FBQUEsUUFDTjtBQUFBLE1BQ0Y7QUFBQSxNQUdBO0FBQUEsUUFFRTtBQUFBLFFBTUEsQ0FBQ0MsSUFBRyxPQUFPLFFBQVEsUUFBUSxJQUFJLElBQUksU0FPL0Isb0JBTUE7QUFBQSxNQUNOO0FBQUEsTUFHQTtBQUFBLFFBT0U7QUFBQSxRQUlBLENBQUNBLElBQUcsSUFBSSxPQUFPO0FBTWIsZ0JBQU0sWUFBWSxHQUFHLFFBQVEsU0FBUyxTQUFTO0FBQy9DLGlCQUFPLEtBQUs7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUFBLE1BRUE7QUFBQSxRQUlFO0FBQUEsUUFDQSxNQUFNO0FBQUEsTUFDUjtBQUFBLE1BRUE7QUFBQSxRQUVFO0FBQUEsUUFDQSxNQUFNO0FBQUEsTUFDUjtBQUFBLE1BRUE7QUFBQSxRQUtFO0FBQUEsUUFDQSxDQUFDLE9BQU8sWUFBWSxPQUFPLFdBQVcsVUFBVSxlQUFlLFNBRTNELE1BQU0sUUFBUSxvQkFBb0IsU0FBUyxJQUFJLFVBQy9DLFVBQVUsTUFDUixVQUFVLFNBQVMsTUFBTSxJQUl2QixJQUFJLGNBQWMsS0FBSyxJQUFJLGVBRzNCLE9BQ0Y7QUFBQSxNQUNSO0FBQUEsTUFHQTtBQUFBLFFBR0U7QUFBQSxRQWNBLFdBQVMsTUFBTSxLQUFLLEtBQUssSUFFckIsR0FBRyxXQUVILEdBQUc7QUFBQSxNQUNUO0FBQUEsTUFHQTtBQUFBLFFBQ0U7QUFBQSxRQUNBLENBQUNBLElBQUcsT0FBTztBQUNULGdCQUFNLFNBQVMsS0FPWCxHQUFHLFlBSUg7QUFFSixpQkFBTyxHQUFHO0FBQUEsUUFDWjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBR0EsUUFBTSxhQUFhLHVCQUFPLE9BQU8sSUFBSTtBQUdyQyxRQUFNLFlBQVksQ0FBQ0MsVUFBUyxlQUFlO0FBQ3pDLFVBQUksU0FBUyxXQUFXQTtBQUV4QixVQUFJLENBQUMsUUFBUTtBQUNYLGlCQUFTLFVBQVU7QUFBQSxVQUNqQixDQUFDLE1BQU0sWUFBWSxLQUFLLFFBQVEsUUFBUSxJQUFJLFFBQVEsR0FBRyxLQUFLQSxRQUFPLENBQUM7QUFBQSxVQUNwRUE7QUFBQSxRQUNGO0FBQ0EsbUJBQVdBLFlBQVc7QUFBQSxNQUN4QjtBQUVBLGFBQU8sYUFDSCxJQUFJLE9BQU8sUUFBUSxHQUFHLElBQ3RCLElBQUksT0FBTyxNQUFNO0FBQUEsSUFDdkI7QUFFQSxRQUFNLFdBQVcsYUFBVyxPQUFPLFlBQVk7QUFHL0MsUUFBTSxlQUFlLENBQUFBLGFBQVdBLFlBQzNCLFNBQVNBLFFBQU8sS0FDaEIsQ0FBQyxzQkFBc0IsS0FBS0EsUUFBTyxLQUNuQyxDQUFDLGlDQUFpQyxLQUFLQSxRQUFPLEtBRzlDQSxTQUFRLFFBQVEsR0FBRyxNQUFNO0FBRTlCLFFBQU0sZUFBZSxDQUFBQSxhQUFXQSxTQUFRLE1BQU0sbUJBQW1CO0FBRWpFLFFBQU0sYUFBTixNQUFpQjtBQUFBLE1BQ2YsWUFDRSxRQUNBQSxVQUNBLFVBQ0FDLFFBQ0E7QUFDQSxhQUFLLFNBQVM7QUFDZCxhQUFLLFVBQVVEO0FBQ2YsYUFBSyxXQUFXO0FBQ2hCLGFBQUssUUFBUUM7QUFBQSxNQUNmO0FBQUEsSUFDRjtBQUVBLFFBQU0sYUFBYSxDQUFDRCxVQUFTLGVBQWU7QUFDMUMsWUFBTSxTQUFTQTtBQUNmLFVBQUksV0FBVztBQUdmLFVBQUlBLFNBQVEsUUFBUSxHQUFHLE1BQU0sR0FBRztBQUM5QixtQkFBVztBQUNYLFFBQUFBLFdBQVVBLFNBQVEsT0FBTyxDQUFDO0FBQUEsTUFDNUI7QUFFQSxNQUFBQSxXQUFVQSxTQUdULFFBQVEsMkNBQTJDLEdBQUcsRUFHdEQsUUFBUSxvQ0FBb0MsR0FBRztBQUVoRCxZQUFNQyxTQUFRLFVBQVVELFVBQVMsVUFBVTtBQUUzQyxhQUFPLElBQUk7QUFBQSxRQUNUO0FBQUEsUUFDQUE7QUFBQSxRQUNBO0FBQUEsUUFDQUM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFFBQU0sYUFBYSxDQUFDLFNBQVMsU0FBUztBQUNwQyxZQUFNLElBQUksS0FBSyxPQUFPO0FBQUEsSUFDeEI7QUFFQSxRQUFNLFlBQVksQ0FBQ0MsT0FBTSxjQUFjLFlBQVk7QUFDakQsVUFBSSxDQUFDLFNBQVNBLEtBQUksR0FBRztBQUNuQixlQUFPO0FBQUEsVUFDTCxvQ0FBb0M7QUFBQSxVQUNwQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBR0EsVUFBSSxDQUFDQSxPQUFNO0FBQ1QsZUFBTyxRQUFRLDBCQUEwQixTQUFTO0FBQUEsTUFDcEQ7QUFHQSxVQUFJLFVBQVUsY0FBY0EsS0FBSSxHQUFHO0FBQ2pDLGNBQU0sSUFBSTtBQUNWLGVBQU87QUFBQSxVQUNMLG9CQUFvQixzQkFBc0I7QUFBQSxVQUMxQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFNLGdCQUFnQixDQUFBQSxVQUFRLHdCQUF3QixLQUFLQSxLQUFJO0FBRS9ELGNBQVUsZ0JBQWdCO0FBQzFCLGNBQVUsVUFBVSxPQUFLO0FBRXpCLFFBQU0sU0FBTixNQUFhO0FBQUEsTUFDWCxZQUFhO0FBQUEsUUFDWCxhQUFhO0FBQUEsUUFDYixhQUFhO0FBQUEsUUFDYixxQkFBcUI7QUFBQSxNQUN2QixJQUFJLENBQUMsR0FBRztBQUNOLGVBQU8sTUFBTSxZQUFZLElBQUk7QUFFN0IsYUFBSyxTQUFTLENBQUM7QUFDZixhQUFLLGNBQWM7QUFDbkIsYUFBSyxzQkFBc0I7QUFDM0IsYUFBSyxXQUFXO0FBQUEsTUFDbEI7QUFBQSxNQUVBLGFBQWM7QUFDWixhQUFLLGVBQWUsdUJBQU8sT0FBTyxJQUFJO0FBQ3RDLGFBQUssYUFBYSx1QkFBTyxPQUFPLElBQUk7QUFBQSxNQUN0QztBQUFBLE1BRUEsWUFBYUYsVUFBUztBQUVwQixZQUFJQSxZQUFXQSxTQUFRLGFBQWE7QUFDbEMsZUFBSyxTQUFTLEtBQUssT0FBTyxPQUFPQSxTQUFRLE1BQU07QUFDL0MsZUFBSyxTQUFTO0FBQ2Q7QUFBQSxRQUNGO0FBRUEsWUFBSSxhQUFhQSxRQUFPLEdBQUc7QUFDekIsZ0JBQU0sT0FBTyxXQUFXQSxVQUFTLEtBQUssV0FBVztBQUNqRCxlQUFLLFNBQVM7QUFDZCxlQUFLLE9BQU8sS0FBSyxJQUFJO0FBQUEsUUFDdkI7QUFBQSxNQUNGO0FBQUEsTUFHQSxJQUFLQSxVQUFTO0FBQ1osYUFBSyxTQUFTO0FBRWQ7QUFBQSxVQUNFLFNBQVNBLFFBQU8sSUFDWixhQUFhQSxRQUFPLElBQ3BCQTtBQUFBLFFBQ04sRUFBRSxRQUFRLEtBQUssYUFBYSxJQUFJO0FBSWhDLFlBQUksS0FBSyxRQUFRO0FBQ2YsZUFBSyxXQUFXO0FBQUEsUUFDbEI7QUFFQSxlQUFPO0FBQUEsTUFDVDtBQUFBLE1BR0EsV0FBWUEsVUFBUztBQUNuQixlQUFPLEtBQUssSUFBSUEsUUFBTztBQUFBLE1BQ3pCO0FBQUEsTUFrQkEsU0FBVUUsT0FBTSxnQkFBZ0I7QUFDOUIsWUFBSSxVQUFVO0FBQ2QsWUFBSSxZQUFZO0FBRWhCLGFBQUssT0FBTyxRQUFRLFVBQVE7QUFDMUIsZ0JBQU0sRUFBQyxTQUFRLElBQUk7QUFDbkIsY0FDRSxjQUFjLFlBQVksWUFBWSxhQUNuQyxZQUFZLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxnQkFDMUM7QUFDQTtBQUFBLFVBQ0Y7QUFFQSxnQkFBTSxVQUFVLEtBQUssTUFBTSxLQUFLQSxLQUFJO0FBRXBDLGNBQUksU0FBUztBQUNYLHNCQUFVLENBQUM7QUFDWCx3QkFBWTtBQUFBLFVBQ2Q7QUFBQSxRQUNGLENBQUM7QUFFRCxlQUFPO0FBQUEsVUFDTDtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BR0EsTUFBTyxjQUFjLE9BQU8sZ0JBQWdCLFFBQVE7QUFDbEQsY0FBTUEsUUFBTyxnQkFFUixVQUFVLFFBQVEsWUFBWTtBQUVuQztBQUFBLFVBQ0VBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsS0FBSyxzQkFDRCxlQUNBO0FBQUEsUUFDTjtBQUVBLGVBQU8sS0FBSyxHQUFHQSxPQUFNLE9BQU8sZ0JBQWdCLE1BQU07QUFBQSxNQUNwRDtBQUFBLE1BRUEsR0FBSUEsT0FBTSxPQUFPLGdCQUFnQixRQUFRO0FBQ3ZDLFlBQUlBLFNBQVEsT0FBTztBQUNqQixpQkFBTyxNQUFNQTtBQUFBLFFBQ2Y7QUFFQSxZQUFJLENBQUMsUUFBUTtBQUdYLG1CQUFTQSxNQUFLLE1BQU0sS0FBSztBQUFBLFFBQzNCO0FBRUEsZUFBTyxJQUFJO0FBR1gsWUFBSSxDQUFDLE9BQU8sUUFBUTtBQUNsQixpQkFBTyxNQUFNQSxTQUFRLEtBQUssU0FBU0EsT0FBTSxjQUFjO0FBQUEsUUFDekQ7QUFFQSxjQUFNLFNBQVMsS0FBSztBQUFBLFVBQ2xCLE9BQU8sS0FBSyxLQUFLLElBQUk7QUFBQSxVQUNyQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUdBLGVBQU8sTUFBTUEsU0FBUSxPQUFPLFVBR3hCLFNBQ0EsS0FBSyxTQUFTQSxPQUFNLGNBQWM7QUFBQSxNQUN4QztBQUFBLE1BRUEsUUFBU0EsT0FBTTtBQUNiLGVBQU8sS0FBSyxNQUFNQSxPQUFNLEtBQUssY0FBYyxLQUFLLEVBQUU7QUFBQSxNQUNwRDtBQUFBLE1BRUEsZUFBZ0I7QUFDZCxlQUFPLENBQUFBLFVBQVEsQ0FBQyxLQUFLLFFBQVFBLEtBQUk7QUFBQSxNQUNuQztBQUFBLE1BRUEsT0FBUSxPQUFPO0FBQ2IsZUFBTyxVQUFVLEtBQUssRUFBRSxPQUFPLEtBQUssYUFBYSxDQUFDO0FBQUEsTUFDcEQ7QUFBQSxNQUdBLEtBQU1BLE9BQU07QUFDVixlQUFPLEtBQUssTUFBTUEsT0FBTSxLQUFLLFlBQVksSUFBSTtBQUFBLE1BQy9DO0FBQUEsSUFDRjtBQUVBLFFBQU0sVUFBVSxhQUFXLElBQUksT0FBTyxPQUFPO0FBRTdDLFFBQU0sY0FBYyxDQUFBQSxVQUNsQixVQUFVQSxTQUFRLFVBQVUsUUFBUUEsS0FBSSxHQUFHQSxPQUFNLFlBQVk7QUFFL0QsWUFBUSxjQUFjO0FBR3RCLFlBQVEsVUFBVTtBQUVsQixJQUFBSixRQUFPLFVBQVU7QUFLakIsUUFFRSxPQUFPLFlBQVksZ0JBRWpCLFFBQVEsT0FBTyxRQUFRLElBQUkscUJBQ3hCLFFBQVEsYUFBYSxVQUUxQjtBQUVBLFlBQU0sWUFBWSxTQUFPLFlBQVksS0FBSyxHQUFHLEtBQzFDLHdCQUF3QixLQUFLLEdBQUcsSUFDL0IsTUFDQSxJQUFJLFFBQVEsT0FBTyxHQUFHO0FBRTFCLGdCQUFVLFVBQVU7QUFJcEIsWUFBTSxpQ0FBaUM7QUFDdkMsZ0JBQVUsZ0JBQWdCLENBQUFJLFVBQ3hCLCtCQUErQixLQUFLQSxLQUFJLEtBQ3JDLGNBQWNBLEtBQUk7QUFBQSxJQUN6QjtBQUFBO0FBQUE7OztBQ3ptQmUsU0FBUixNQUF1QkMsT0FBTTtBQUNuQyxRQUFNLHVCQUF1QixZQUFZLEtBQUtBLEtBQUk7QUFDbEQsUUFBTSxjQUFjLG9CQUFvQixLQUFLQSxLQUFJO0FBRWpELE1BQUksd0JBQXdCLGFBQWE7QUFDeEMsV0FBT0E7QUFBQSxFQUNSO0FBRUEsU0FBT0EsTUFBSyxRQUFRLE9BQU8sR0FBRztBQUMvQjtBQVRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0FBLHFCQUNBLG9CQUVhLFFBRUEsY0FXQTtBQWhCYixJQUFBQyxrQkFBQTtBQUFBO0FBQUE7QUFBQSxzQkFBNEI7QUFDNUIseUJBQXdCO0FBRWpCLElBQU0sU0FBUyxlQUFhLHFCQUFxQixVQUFNLCtCQUFjLFNBQVMsSUFBSTtBQUVsRixJQUFNLGVBQU4sY0FBMkIsNkJBQVU7QUFBQSxNQUMzQyxZQUFZLFFBQVE7QUFDbkIsY0FBTTtBQUFBLFVBQ0wsWUFBWTtBQUFBLFVBQ1osVUFBVSxNQUFNLFVBQVUsVUFBVTtBQUNuQyxxQkFBUyxRQUFXLE9BQU8sSUFBSSxJQUFJLE9BQU8sTUFBUztBQUFBLFVBQ3BEO0FBQUEsUUFDRCxDQUFDO0FBQUEsTUFDRjtBQUFBLElBQ0Q7QUFFTyxJQUFNLG9CQUFvQixDQUFBQyxhQUFXQSxTQUFRLE9BQU87QUFBQTtBQUFBOzs7QUNoQjNELElBQUFDLHNCQUNBLGdCQUNBLGtCQUNBLGtCQUNBLGVBSU0sd0JBV08seUJBRVAsb0JBSUEsaUJBU0EsZ0JBYUEsdUJBV0Esa0JBTU8sd0JBZUEsNEJBYUEsY0FDQTtBQTdGYjtBQUFBO0FBQUE7QUFBQSxJQUFBQSx1QkFBb0I7QUFDcEIscUJBQWU7QUFDZix1QkFBaUI7QUFDakIsdUJBQXFCO0FBQ3JCLG9CQUFzQjtBQUN0QjtBQUNBLElBQUFDO0FBRUEsSUFBTSx5QkFBeUI7QUFBQSxNQUM5QixRQUFRO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Q7QUFBQSxNQUNBLFVBQVU7QUFBQSxNQUNWLEtBQUs7QUFBQSxJQUNOO0FBRU8sSUFBTSwwQkFBMEI7QUFFdkMsSUFBTSxxQkFBcUIsQ0FBQ0MsVUFBUyxTQUFTLGtCQUFrQkEsUUFBTyxJQUNwRSxNQUFNLGlCQUFBQyxRQUFLLE1BQU0sS0FBSyxNQUFNRCxTQUFRLE1BQU0sQ0FBQyxDQUFDLElBQzVDLGlCQUFBQyxRQUFLLE1BQU0sS0FBSyxNQUFNRCxRQUFPO0FBRWhDLElBQU0sa0JBQWtCLENBQUMsTUFBTSxRQUFRO0FBQ3RDLFlBQU0sT0FBTyxNQUFNLGlCQUFBQyxRQUFLLFNBQVMsS0FBSyxpQkFBQUEsUUFBSyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7QUFFbEUsYUFBTyxLQUFLLFFBQ1YsTUFBTSxPQUFPLEVBQ2IsT0FBTyxVQUFRLFFBQVEsQ0FBQyxLQUFLLFdBQVcsR0FBRyxDQUFDLEVBQzVDLElBQUksQ0FBQUQsYUFBVyxtQkFBbUJBLFVBQVMsSUFBSSxDQUFDO0FBQUEsSUFDbkQ7QUFFQSxJQUFNLGlCQUFpQixDQUFDLGlCQUFpQixRQUFRO0FBQ2hELFlBQU0sTUFBTSxHQUFHO0FBQ2YsVUFBSSxpQkFBQUMsUUFBSyxXQUFXLGVBQWUsR0FBRztBQUNyQyxZQUFJLE1BQU0sZUFBZSxFQUFFLFdBQVcsR0FBRyxHQUFHO0FBQzNDLGlCQUFPLGlCQUFBQSxRQUFLLFNBQVMsS0FBSyxlQUFlO0FBQUEsUUFDMUM7QUFFQSxjQUFNLElBQUksTUFBTSxRQUFRLGlDQUFpQyxLQUFLO0FBQUEsTUFDL0Q7QUFFQSxhQUFPO0FBQUEsSUFDUjtBQUVBLElBQU0sd0JBQXdCLENBQUMsT0FBTyxRQUFRO0FBQzdDLFlBQU0sV0FBVyxNQUFNLFFBQVEsVUFBUSxnQkFBZ0IsTUFBTSxHQUFHLENBQUM7QUFDakUsWUFBTSxjQUFVLGNBQUFDLFNBQVUsRUFBRSxJQUFJLFFBQVE7QUFFeEMsYUFBTyxxQkFBbUI7QUFDekIsMEJBQWtCLE9BQU8sZUFBZTtBQUN4QywwQkFBa0IsZUFBZSxpQkFBaUIsR0FBRztBQUNyRCxlQUFPLGtCQUFrQixRQUFRLFFBQVEsTUFBTSxlQUFlLENBQUMsSUFBSTtBQUFBLE1BQ3BFO0FBQUEsSUFDRDtBQUVBLElBQU0sbUJBQW1CLENBQUMsVUFBVSxDQUFDLE9BQU87QUFBQSxNQUMzQyxLQUFLLE9BQU8sUUFBUSxHQUFHLEtBQUsscUJBQUFDLFFBQVEsSUFBSTtBQUFBLE1BQ3hDLGdCQUFnQixRQUFRLFFBQVEsY0FBYztBQUFBLE1BQzlDLE1BQU0sT0FBTyxRQUFRLFNBQVMsV0FBVyxRQUFRLE9BQU8sT0FBTztBQUFBLElBQ2hFO0FBRU8sSUFBTSx5QkFBeUIsT0FBTyxVQUFVLFlBQVk7QUFDbEUsWUFBTSxFQUFDLEtBQUssZ0JBQWdCLEtBQUksSUFBSSxpQkFBaUIsT0FBTztBQUU1RCxZQUFNLFFBQVEsVUFBTSxpQkFBQUMsU0FBUyxVQUFVLEVBQUMsS0FBSyxnQkFBZ0IsTUFBTSxHQUFHLHVCQUFzQixDQUFDO0FBRTdGLFlBQU0sUUFBUSxNQUFNLFFBQVE7QUFBQSxRQUMzQixNQUFNLElBQUksT0FBTSxjQUFhO0FBQUEsVUFDNUI7QUFBQSxVQUNBLFNBQVMsTUFBTSxlQUFBQyxRQUFHLFNBQVMsU0FBUyxVQUFVLE1BQU07QUFBQSxRQUNyRCxFQUFFO0FBQUEsTUFDSDtBQUVBLGFBQU8sc0JBQXNCLE9BQU8sR0FBRztBQUFBLElBQ3hDO0FBRU8sSUFBTSw2QkFBNkIsQ0FBQyxVQUFVLFlBQVk7QUFDaEUsWUFBTSxFQUFDLEtBQUssZ0JBQWdCLEtBQUksSUFBSSxpQkFBaUIsT0FBTztBQUU1RCxZQUFNLFFBQVEsaUJBQUFELFFBQVMsS0FBSyxVQUFVLEVBQUMsS0FBSyxnQkFBZ0IsTUFBTSxHQUFHLHVCQUFzQixDQUFDO0FBRTVGLFlBQU0sUUFBUSxNQUFNLElBQUksZUFBYTtBQUFBLFFBQ3BDO0FBQUEsUUFDQSxTQUFTLGVBQUFDLFFBQUcsYUFBYSxVQUFVLE1BQU07QUFBQSxNQUMxQyxFQUFFO0FBRUYsYUFBTyxzQkFBc0IsT0FBTyxHQUFHO0FBQUEsSUFDeEM7QUFFTyxJQUFNLGVBQWUsYUFBVyx1QkFBdUIseUJBQXlCLE9BQU87QUFDdkYsSUFBTSxtQkFBbUIsYUFBVywyQkFBMkIseUJBQXlCLE9BQU87QUFBQTtBQUFBOzs7QUM3RnRHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxpQkFDQUMsbUJBQ0EsZUFDQUMsbUJBQ0EsaUJBUU0scUJBTUEsaUJBTUEsZ0JBaUJBQyxtQkFlQSxvQkFDQSx3QkFFQSx3QkFXQSxXQU9BLGVBT0Esc0JBWUEsc0JBQ0Esc0JBRUEseUJBb0NBLG1CQUtBLGVBNkJBLG1CQW9CTyxRQWFBLFlBUUEsY0FRQSxrQkFJQSxtQkFDQTtBQS9OYjtBQUFBO0FBQUE7QUFBQSxJQUFBSCxrQkFBZTtBQUNmLElBQUFDLG9CQUFxQjtBQUNyQixvQkFBbUI7QUFDbkIsSUFBQUMsb0JBQXFCO0FBQ3JCLHNCQUFvQjtBQUNwQjtBQUtBLElBQUFFO0FBdU5BO0FBck5BLElBQU0sc0JBQXNCLGNBQVk7QUFDdkMsVUFBSSxTQUFTLEtBQUssQ0FBQUMsYUFBVyxPQUFPQSxhQUFZLFFBQVEsR0FBRztBQUMxRCxjQUFNLElBQUksVUFBVSxrREFBa0Q7QUFBQSxNQUN2RTtBQUFBLElBQ0Q7QUFFQSxJQUFNLGtCQUFrQixjQUFZO0FBQ25DLGlCQUFXLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekMsMEJBQW9CLFFBQVE7QUFDNUIsYUFBTztBQUFBLElBQ1I7QUFFQSxJQUFNLGlCQUFpQixhQUFXO0FBQ2pDLFVBQUksQ0FBQyxRQUFRLEtBQUs7QUFDakI7QUFBQSxNQUNEO0FBRUEsVUFBSTtBQUNKLFVBQUk7QUFDSCxlQUFPLGdCQUFBQyxRQUFHLFNBQVMsUUFBUSxHQUFHO0FBQUEsTUFDL0IsUUFBRTtBQUNEO0FBQUEsTUFDRDtBQUVBLFVBQUksQ0FBQyxLQUFLLFlBQVksR0FBRztBQUN4QixjQUFNLElBQUksTUFBTSxnREFBZ0Q7QUFBQSxNQUNqRTtBQUFBLElBQ0Q7QUFFQSxJQUFNSCxvQkFBbUIsQ0FBQyxVQUFVLENBQUMsTUFBTTtBQUMxQyxnQkFBVTtBQUFBLFFBQ1QsR0FBRztBQUFBLFFBQ0gsUUFBUSxRQUFRLFVBQVUsQ0FBQztBQUFBLFFBQzNCLG1CQUFtQixRQUFRLHNCQUFzQixTQUM5QyxPQUNBLFFBQVE7QUFBQSxRQUNYLEtBQUssT0FBTyxRQUFRLEdBQUc7QUFBQSxNQUN4QjtBQUVBLHFCQUFlLE9BQU87QUFFdEIsYUFBTztBQUFBLElBQ1I7QUFFQSxJQUFNLHFCQUFxQixRQUFNLE9BQU8sVUFBVSxZQUFZLEdBQUcsZ0JBQWdCLFFBQVEsR0FBR0Esa0JBQWlCLE9BQU8sQ0FBQztBQUNySCxJQUFNLHlCQUF5QixRQUFNLENBQUMsVUFBVSxZQUFZLEdBQUcsZ0JBQWdCLFFBQVEsR0FBR0Esa0JBQWlCLE9BQU8sQ0FBQztBQUVuSCxJQUFNLHlCQUF5QixhQUFXO0FBQ3pDLFlBQU0sRUFBQyxhQUFhLFVBQVMsSUFBSTtBQUVqQyxZQUFNLFdBQVcsY0FBYyxnQkFBZ0IsV0FBVyxJQUFJLENBQUM7QUFDL0QsVUFBSSxXQUFXO0FBQ2QsaUJBQVMsS0FBSyx1QkFBdUI7QUFBQSxNQUN0QztBQUVBLGFBQU87QUFBQSxJQUNSO0FBRUEsSUFBTSxZQUFZLE9BQU0sWUFBVztBQUNsQyxZQUFNLHNCQUFzQix1QkFBdUIsT0FBTztBQUMxRCxhQUFPO0FBQUEsUUFDTixvQkFBb0IsU0FBUyxLQUFLLE1BQU0sdUJBQXVCLHFCQUFxQixPQUFPO0FBQUEsTUFDNUY7QUFBQSxJQUNEO0FBRUEsSUFBTSxnQkFBZ0IsYUFBVztBQUNoQyxZQUFNLHNCQUFzQix1QkFBdUIsT0FBTztBQUMxRCxhQUFPO0FBQUEsUUFDTixvQkFBb0IsU0FBUyxLQUFLLDJCQUEyQixxQkFBcUIsT0FBTztBQUFBLE1BQzFGO0FBQUEsSUFDRDtBQUVBLElBQU0sdUJBQXVCLGVBQWE7QUFDekMsWUFBTSxPQUFPLG9CQUFJLElBQUk7QUFFckIsYUFBTyxvQkFBa0I7QUFDeEIsY0FBTUksUUFBTyxlQUFlLFFBQVE7QUFDcEMsY0FBTSxVQUFVLGtCQUFBQyxRQUFTLFVBQVVELEtBQUk7QUFDdkMsY0FBTSxnQkFBZ0IsS0FBSyxJQUFJLE9BQU8sS0FBTSxhQUFhLFVBQVVBLEtBQUk7QUFDdkUsYUFBSyxJQUFJLE9BQU87QUFDaEIsZUFBTyxDQUFDO0FBQUEsTUFDVDtBQUFBLElBQ0Q7QUFFQSxJQUFNLHVCQUF1QixDQUFDLFNBQVMsV0FBVyxRQUFRLEtBQUssRUFBRSxPQUFPLG9CQUFrQixPQUFPLGNBQWMsQ0FBQztBQUNoSCxJQUFNLHVCQUF1QixDQUFDLFNBQVMsZUFBVyxjQUFBRSxTQUFPLE9BQU8sRUFBRSxLQUFLLElBQUksYUFBYSxvQkFBa0IsT0FBTyxjQUFjLENBQUMsQ0FBQztBQUVqSSxJQUFNLDBCQUEwQixDQUFDLFVBQVUsWUFBWTtBQUN0RCxZQUFNLFFBQVEsQ0FBQztBQUVmLGFBQU8sU0FBUyxTQUFTLEdBQUc7QUFDM0IsY0FBTSxRQUFRLFNBQVMsVUFBVSxDQUFBSixhQUFXLGtCQUFrQkEsUUFBTyxDQUFDO0FBRXRFLFlBQUksVUFBVSxJQUFJO0FBQ2pCLGdCQUFNLEtBQUssRUFBQyxVQUFVLFFBQU8sQ0FBQztBQUM5QjtBQUFBLFFBQ0Q7QUFFQSxjQUFNLGdCQUFnQixTQUFTLE9BQU8sTUFBTSxDQUFDO0FBRTdDLG1CQUFXLFFBQVEsT0FBTztBQUN6QixlQUFLLFFBQVEsT0FBTyxLQUFLLGFBQWE7QUFBQSxRQUN2QztBQUVBLFlBQUksVUFBVSxHQUFHO0FBQ2hCLGdCQUFNLEtBQUs7QUFBQSxZQUNWLFVBQVUsU0FBUyxNQUFNLEdBQUcsS0FBSztBQUFBLFlBQ2pDLFNBQVM7QUFBQSxjQUNSLEdBQUc7QUFBQSxjQUNILFFBQVE7QUFBQSxnQkFDUCxHQUFHLFFBQVE7QUFBQSxnQkFDWDtBQUFBLGNBQ0Q7QUFBQSxZQUNEO0FBQUEsVUFDRCxDQUFDO0FBQUEsUUFDRjtBQUVBLG1CQUFXLFNBQVMsTUFBTSxRQUFRLENBQUM7QUFBQSxNQUNwQztBQUVBLGFBQU87QUFBQSxJQUNSO0FBRUEsSUFBTSxvQkFBb0IsQ0FBQyxTQUFTLFNBQVM7QUFBQSxNQUM1QyxHQUFJLE1BQU0sRUFBQyxJQUFHLElBQUksQ0FBQztBQUFBLE1BQ25CLEdBQUksTUFBTSxRQUFRLE9BQU8sSUFBSSxFQUFDLE9BQU8sUUFBTyxJQUFJO0FBQUEsSUFDakQ7QUFFQSxJQUFNLGdCQUFnQixPQUFPLFVBQVUsWUFBWTtBQUNsRCxZQUFNLFlBQVksd0JBQXdCLFVBQVUsT0FBTztBQUUzRCxZQUFNLEVBQUMsS0FBSyxrQkFBaUIsSUFBSTtBQUVqQyxVQUFJLENBQUMsbUJBQW1CO0FBQ3ZCLGVBQU87QUFBQSxNQUNSO0FBRUEsWUFBTSx1QkFBdUIsa0JBQWtCLG1CQUFtQixHQUFHO0FBQ3JFLFlBQU0sc0JBQXNCLE1BQU0sRUFBQyxJQUFHLElBQUk7QUFFMUMsYUFBTyxRQUFRO0FBQUEsUUFDZCxVQUFVLElBQUksT0FBTSxTQUFRO0FBQzNCLGNBQUksRUFBQyxVQUFBSyxXQUFVLFNBQUFDLFNBQU8sSUFBSTtBQUUxQjtBQUFBLFlBQ0NEO0FBQUEsWUFDQUMsU0FBUTtBQUFBLFVBQ1QsSUFBSSxNQUFNLFFBQVEsSUFBSTtBQUFBLGdCQUNyQixnQkFBQUMsU0FBUUYsV0FBVSxvQkFBb0I7QUFBQSxnQkFDdEMsZ0JBQUFFLFNBQVFELFNBQVEsUUFBUSxtQkFBbUI7QUFBQSxVQUM1QyxDQUFDO0FBRUQsaUJBQU8sRUFBQyxVQUFBRCxXQUFVLFNBQUFDLFNBQU87QUFBQSxRQUMxQixDQUFDO0FBQUEsTUFDRjtBQUFBLElBQ0Q7QUFFQSxJQUFNLG9CQUFvQixDQUFDLFVBQVUsWUFBWTtBQUNoRCxZQUFNLFlBQVksd0JBQXdCLFVBQVUsT0FBTztBQUUzRCxZQUFNLEVBQUMsS0FBSyxrQkFBaUIsSUFBSTtBQUVqQyxVQUFJLENBQUMsbUJBQW1CO0FBQ3ZCLGVBQU87QUFBQSxNQUNSO0FBRUEsWUFBTSx1QkFBdUIsa0JBQWtCLG1CQUFtQixHQUFHO0FBQ3JFLFlBQU0sc0JBQXNCLE1BQU0sRUFBQyxJQUFHLElBQUk7QUFFMUMsYUFBTyxVQUFVLElBQUksVUFBUTtBQUM1QixZQUFJLEVBQUMsVUFBQUQsV0FBVSxTQUFBQyxTQUFPLElBQUk7QUFDMUIsUUFBQUQsWUFBVyxnQkFBQUUsUUFBUSxLQUFLRixXQUFVLG9CQUFvQjtBQUN0RCxRQUFBQyxTQUFRLFNBQVMsZ0JBQUFDLFFBQVEsS0FBS0QsU0FBUSxRQUFRLG1CQUFtQjtBQUNqRSxlQUFPLEVBQUMsVUFBQUQsV0FBVSxTQUFBQyxTQUFPO0FBQUEsTUFDMUIsQ0FBQztBQUFBLElBQ0Y7QUFFTyxJQUFNLFNBQVMsbUJBQW1CLE9BQU8sVUFBVSxZQUFZO0FBQ3JFLFlBQU07QUFBQSxRQUNMO0FBQUEsUUFDQTtBQUFBLE1BQ0QsSUFBSSxNQUFNLFFBQVEsSUFBSTtBQUFBLFFBQ3JCLGNBQWMsVUFBVSxPQUFPO0FBQUEsUUFDL0IsVUFBVSxPQUFPO0FBQUEsTUFDbEIsQ0FBQztBQUNELFlBQU0sVUFBVSxNQUFNLFFBQVEsSUFBSSxNQUFNLElBQUksY0FBUSxrQkFBQUUsU0FBUyxLQUFLLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQztBQUUxRixhQUFPLHFCQUFxQixTQUFTLE1BQU07QUFBQSxJQUM1QyxDQUFDO0FBRU0sSUFBTSxhQUFhLHVCQUF1QixDQUFDLFVBQVUsWUFBWTtBQUN2RSxZQUFNLFFBQVEsa0JBQWtCLFVBQVUsT0FBTztBQUNqRCxZQUFNLFNBQVMsY0FBYyxPQUFPO0FBQ3BDLFlBQU0sVUFBVSxNQUFNLElBQUksVUFBUSxrQkFBQUEsUUFBUyxLQUFLLEtBQUssVUFBVSxLQUFLLE9BQU8sQ0FBQztBQUU1RSxhQUFPLHFCQUFxQixTQUFTLE1BQU07QUFBQSxJQUM1QyxDQUFDO0FBRU0sSUFBTSxlQUFlLHVCQUF1QixDQUFDLFVBQVUsWUFBWTtBQUN6RSxZQUFNLFFBQVEsa0JBQWtCLFVBQVUsT0FBTztBQUNqRCxZQUFNLFNBQVMsY0FBYyxPQUFPO0FBQ3BDLFlBQU0sVUFBVSxNQUFNLElBQUksVUFBUSxrQkFBQUEsUUFBUyxPQUFPLEtBQUssVUFBVSxLQUFLLE9BQU8sQ0FBQztBQUU5RSxhQUFPLHFCQUFxQixTQUFTLE1BQU07QUFBQSxJQUM1QyxDQUFDO0FBRU0sSUFBTSxtQkFBbUI7QUFBQSxNQUMvQixDQUFDLFVBQVUsWUFBWSxTQUFTLEtBQUssQ0FBQVIsYUFBVyxrQkFBQVEsUUFBUyxpQkFBaUJSLFVBQVMsT0FBTyxDQUFDO0FBQUEsSUFDNUY7QUFFTyxJQUFNLG9CQUFvQixtQkFBbUIsYUFBYTtBQUMxRCxJQUFNLHdCQUF3Qix1QkFBdUIsaUJBQWlCO0FBQUE7QUFBQTs7O0FDL043RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBQTtBQUFBLHNCQUFlO0FBQ2YsbUJBSU87QUFFUCxJQUFBUyxjQUFrQjs7O0FDUGxCO0FBQUEsSUFBQUMsb0JBQWlCOzs7QUNBakI7QUFBQSxrQkFBaUI7QUFFVixJQUFNLGdDQUNYLENBQUMsYUFBcUIsV0FDdEIsQ0FBQyxjQUFzQjtBQUNyQixRQUFNLFFBQVEsVUFFWCxRQUFRLFNBQVMsR0FBRyxFQUVwQixRQUFRLE9BQU8sRUFBRSxFQUVqQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFlBQVksRUFBRSxFQUV0QixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFNBQVMsRUFBRSxFQUVuQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLGlCQUFpQixFQUFFO0FBRTlCLFNBQU8sWUFBQUMsUUFBSyxLQUFLLFlBQVksS0FBSztBQUNwQzs7O0FEYkssSUFBTSx1QkFBdUIsT0FBTyxTQU1KO0FBQ3JDLFFBQU1DLFVBQVMsTUFBTSwrREFBaUI7QUFDdEMsUUFBTUMsV0FBVSxNQUFNLCtEQUFrQjtBQUN4QyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gseUJBQXlCLDhCQUE4QixLQUFLLFNBQVM7QUFBQSxFQUN2RSxJQUFJO0FBRUosUUFBTSxlQUFlLGtCQUFBQyxRQUFLLE1BQU0sS0FBSyxZQUFZLFFBQVE7QUFDekQsVUFBUSxJQUFJLGNBQWMsa0JBQWtCO0FBQzVDLFFBQU0sWUFBWSxNQUFNRCxRQUFPLEdBQUcsY0FBYztBQUNoRCxVQUFRLElBQUksU0FBUyxVQUFVLGNBQWM7QUFDN0MsTUFBSSxVQUFVLFdBQVcsR0FBRztBQUMxQixVQUFNLElBQUksTUFBTSxzQkFBc0IsZUFBZTtBQUFBLEVBQ3ZEO0FBQ0EsUUFBTSxvQkFBb0Isb0JBQUksSUFBdUI7QUFFckQsUUFBTSxRQUFRO0FBQUEsSUFDWixVQUFVLElBQUksT0FBTyxNQUFNO0FBcEMvQjtBQXFDTSxZQUFNLEVBQUUsU0FBUyxRQUFRLElBQUksTUFBTSxRQUFRLGtCQUFBQyxRQUFLLFFBQVEsQ0FBQztBQUV6RCxVQUFJLFNBQVM7QUFDWCxjQUNFLGFBQVEsZUFBUixtQkFBb0IsdUJBQ3BCLENBQUMsS0FBSyw4QkFDTjtBQUNBLGtCQUFRO0FBQUEsWUFDTkYsT0FBTTtBQUFBLGNBQ0osYUFBYTtBQUFBLFlBQ2Y7QUFBQSxVQUNGO0FBQ0E7QUFBQSxRQUNGO0FBQ0EsWUFBSSxDQUFDLFFBQVEsY0FBYztBQUN6QixrQkFBUTtBQUFBLFlBQ05BLE9BQU07QUFBQSxjQUNKLGFBQWE7QUFBQSxZQUNmO0FBQUEsVUFDRjtBQUNBO0FBQUEsUUFDRjtBQUNBLDBCQUFrQixJQUFJLEdBQUc7QUFBQSxVQUN2QixhQUFhLFFBQVE7QUFBQSxVQUNyQixXQUFXLFFBQVE7QUFBQSxVQUNuQixPQUFPLHVCQUF1QixDQUFDO0FBQUEsVUFDL0I7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNILE9BQU87QUFDTCxnQkFBUSxLQUFLQSxPQUFNLE9BQU8sdUJBQXVCLEdBQUcsQ0FBQztBQUFBLE1BQ3ZEO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVDs7O0FFeEVBO0FBNkJBLGlCQUE4Qjs7O0FDN0I5QjtBQTRCQSxxQkFBcUI7QUFDckIsSUFBTSx3QkFBd0I7QUFDOUIsSUFBTSxXQUFXLE9BQU8sWUFBWSxjQUFjLFFBQVEsV0FBVztBQUNyRSxJQUFNLFVBQ0osT0FDQSx3QkFDQSx3REFJQyxhQUFhLFVBQVUsU0FBUyxNQUNqQztBQUdGLElBQU0sUUFBUSxJQUFJLE9BQU8sU0FBUyxHQUFHO0FBRTlCLFNBQVMsaUJBQ2QsUUFDQSxVQUFVLENBQUMsR0FDK0Q7QUFDMUUsV0FBUyxVQUFVO0FBQ25CLE1BQUksaUJBQWlCLEVBQUUsYUFBYSxNQUFNO0FBQzFDLFlBQ0UsbUJBQW1CLFNBQ2YsRUFBRSxHQUFHLGdCQUFnQixHQUFHLFFBQVEsSUFDaEM7QUFDTixNQUFJLFFBQVEsT0FBTyxNQUFNLFNBQVM7QUFDbEMsTUFBSSxNQUFNLE1BQU0sZUFBZSxLQUFLLE1BQU0sRUFBRSxHQUFHO0FBQzdDLFdBQU8sTUFBTSxNQUFNO0FBQUEsRUFDckIsT0FBTztBQUNMLFdBQU87QUFBQSxNQUNMLFlBQVksQ0FBQztBQUFBLE1BQ2IsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixPQUF3QixNQUFjO0FBQzdELE1BQUksT0FBTztBQUNYLE1BQUksTUFBTSxLQUFLLFFBQVEsSUFBSTtBQUMzQixNQUFJLFNBQVMsTUFBTSxRQUFRLE1BQU0sR0FBRztBQUVwQyxTQUFPLFFBQVEsSUFBSTtBQUNqQixRQUFJLE9BQU8sUUFBUTtBQUNqQixhQUFPO0FBQUEsSUFDVDtBQUNBO0FBQ0EsVUFBTSxLQUFLLFFBQVEsTUFBTSxNQUFNLENBQUM7QUFBQSxFQUNsQztBQUVBLFNBQU87QUFDVDtBQUVBLFNBQVMsTUFBTSxRQUliO0FBQ0EsTUFBSSxRQUFRLE1BQU0sS0FBSyxNQUFNO0FBQzdCLE1BQUksQ0FBQyxPQUFPO0FBQ1YsV0FBTztBQUFBLE1BQ0wsWUFBWSxDQUFDO0FBQUEsTUFDYixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sTUFBTSxNQUFNLFNBQVMsR0FBRyxRQUFRLGNBQWMsRUFBRTtBQUMzRCxNQUFJLGlCQUFjLHFCQUFLLElBQUksS0FBSyxDQUFDO0FBQ2pDLE1BQUksT0FBTyxPQUFPLFFBQVEsTUFBTSxJQUFJLEVBQUU7QUFDdEMsTUFBSSxPQUFPLGdCQUFnQixPQUFPLE1BQU07QUFFeEMsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQSxXQUFXO0FBQUEsRUFDYjtBQUNGO0FBRU8sU0FBUyxnQkFBZ0IsUUFBZ0I7QUFDOUMsV0FBUyxVQUFVO0FBRW5CLFNBQU8sTUFBTSxLQUFLLE1BQU07QUFDMUI7OztBRGpGQSxvQkFBbUI7OztBRS9CbkI7QUFJTyxTQUFTLHNCQUNkLEtBQ21CO0FBQ25CLFNBQU8sT0FBTztBQUFBLElBQ1osT0FBTyxRQUFRLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssT0FBTyxLQUFLLENBQUM7QUFBQSxFQUMvRDtBQUNGOzs7QUNWQTtBQVFPLFNBQVMsa0JBQW9DLEtBQXdCO0FBQzFFLFNBQU8sT0FBTztBQUFBLElBQ1osT0FBTyxRQUFRLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUMzRTtBQUNGOzs7QUNaQTtBQXdCTyxTQUFTLE9BQU8sUUFBeUI7QUFDOUMsTUFBSSxVQUFVLFFBQVE7QUFFcEIsV0FBUSxPQUFlLEtBQUs7QUFBQSxFQUM5QjtBQUVBLFNBQVEsT0FBZTtBQUN6QjtBQU9PLFNBQVMsWUFBWSxRQUE0QjtBQXRDeEQ7QUF1Q0UsTUFBSSxVQUFVLFFBQVE7QUFFcEIsVUFBTSxNQUFPLE9BQWU7QUFFNUIsVUFBTSxrQkFBa0IsT0FBTyxZQUFZO0FBQzNDLFFBQUksbUJBQW1CLGdCQUFnQixXQUFXLE1BQU0sR0FBRztBQUV6RCxhQUFPLGdCQUFnQixNQUFNLENBQUM7QUFBQSxJQUNoQztBQUVBLFFBQUksSUFBSSxPQUFPLElBQUksSUFBSSxNQUFNO0FBQzNCLGFBQU8sbUJBQW1CLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDeEM7QUFDQSxXQUFPLG1CQUFtQjtBQUFBLEVBQzVCO0FBRUEsV0FBUSxZQUFlLFNBQWYsbUJBQXFCLGFBQVk7QUFDM0M7QUFLQSxTQUFTLG1CQUFtQixNQUFzQjtBQUNoRCxRQUFNLFVBQWtDO0FBQUEsSUFDdEMsUUFBUTtBQUFBLElBQ1IsUUFBUTtBQUFBLElBQ1IsUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sS0FBSztBQUFBLElBQ0wsU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQ04sWUFBWTtBQUFBLElBQ1osUUFBUTtBQUFBLElBQ1IsT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1AsT0FBTztBQUFBLElBQ1Asb0JBQW9CO0FBQUEsSUFDcEIsY0FBYztBQUFBLElBQ2QsUUFBUTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsVUFBVTtBQUFBLElBQ1YsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLElBQ1QsYUFBYTtBQUFBLElBQ2IsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLEVBQ1o7QUFDQSxTQUFPLFFBQVEsU0FBUyxNQUFNLEtBQUssT0FBTyxDQUFDLEVBQUUsWUFBWSxJQUFJLEtBQUssTUFBTSxDQUFDO0FBQzNFO0FBS08sU0FBUyxpQkFBaUIsUUFBNEM7QUFDM0UsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7QUFLTyxTQUFTLGFBQWEsUUFBNEM7QUFDdkUsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7QUFLTyxTQUFTLFNBQ2QsUUFDd0M7QUFDeEMsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixNQUFJLFFBQU8sMkJBQUssV0FBVSxZQUFZO0FBQ3BDLFdBQU8sSUFBSSxNQUFNO0FBQUEsRUFDbkI7QUFDQSxTQUFPLDJCQUFLO0FBQ2Q7QUFPTyxTQUFTLFVBQVUsUUFBMkI7QUFDbkQsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixRQUFNLFVBQVMsMkJBQUssV0FBVSxDQUFDO0FBRy9CLFNBQU8sT0FBTyxJQUFJLENBQUMsVUFBZTtBQTVJcEM7QUE2SUksU0FBSSxXQUFNLFNBQU4sbUJBQVksS0FBSztBQUVuQixhQUFPLEVBQUUsR0FBRyxNQUFNLEtBQUssSUFBSTtBQUFBLElBQzdCO0FBRUEsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNIO0FBS08sU0FBUyxjQUNkLFFBQ3lDO0FBRXpDLE1BQUksYUFBYSxVQUFVLE1BQU0sUUFBUyxPQUFlLE9BQU8sR0FBRztBQUNqRSxXQUFRLE9BQWU7QUFBQSxFQUN6QjtBQUNBLE1BQUksVUFBVSxVQUFXLE9BQWUsTUFBTTtBQUM1QyxXQUFRLE9BQWU7QUFBQSxFQUN6QjtBQUVBLFFBQU0sTUFBTSxPQUFPLE1BQU07QUFFekIsVUFBTywyQkFBSyxZQUFVLDJCQUFLO0FBQzdCO0FBS08sU0FBUyxnQkFBZ0IsUUFBeUI7QUFFdkQsTUFBSSxXQUFXLFFBQVE7QUFDckIsV0FBUSxPQUFlO0FBQUEsRUFDekI7QUFDQSxRQUFNLE1BQU0sT0FBTyxNQUFNO0FBRXpCLE1BQUksTUFBTSxRQUFRLDJCQUFLLE1BQU0sR0FBRztBQUM5QixXQUFPLElBQUksT0FBTztBQUFBLEVBQ3BCO0FBRUEsU0FBTywyQkFBSztBQUNkO0FBS08sU0FBUyxnQkFBZ0IsUUFBeUI7QUFDdkQsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixNQUFJLFFBQU8sMkJBQUssa0JBQWlCLFlBQVk7QUFDM0MsV0FBTyxJQUFJLGFBQWE7QUFBQSxFQUMxQjtBQUNBLFNBQU8sMkJBQUs7QUFDZDtBQUtPLFNBQVMsb0JBQW9CLFFBSWxDO0FBQ0EsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPO0FBQUEsSUFDTCxhQUFhLDJCQUFLO0FBQUEsSUFDbEIsV0FBVywyQkFBSztBQUFBLElBQ2hCLFdBQVcsMkJBQUs7QUFBQSxFQUNsQjtBQUNGO0FBS08sU0FBUyxhQUFhLFFBQTRDO0FBQ3ZFLFFBQU0sTUFBTSxPQUFPLE1BQU07QUFDekIsU0FBTywyQkFBSztBQUNkO0FBS08sU0FBUyxtQkFBbUIsUUFBNEM7QUFDN0UsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7QUFLTyxTQUFTLFlBQVksUUFBNEM7QUFDdEUsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7QUFLTyxTQUFTLGVBQ2QsUUFDZ0Q7QUFDaEQsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7QUFLTyxTQUFTLHFCQUFxQixRQUduQztBQUNBLFFBQU0sTUFBTSxPQUFPLE1BQU07QUFDekIsU0FBTztBQUFBLElBQ0wsTUFBTSwyQkFBSztBQUFBLElBQ1gsT0FBTywyQkFBSztBQUFBLEVBQ2Q7QUFDRjtBQUtPLFNBQVMsZ0JBQWdCLFFBQWtDO0FBQ2hFLFFBQU0sTUFBTSxPQUFPLE1BQU07QUFDekIsUUFBTSxVQUFVLDJCQUFLO0FBQ3JCLE1BQUksbUJBQW1CLEtBQUs7QUFDMUIsV0FBTyxNQUFNLEtBQUssUUFBUSxPQUFPLENBQUM7QUFBQSxFQUNwQztBQUNBLE1BQUksTUFBTSxRQUFRLE9BQU8sR0FBRztBQUMxQixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sQ0FBQztBQUNWO0FBS08sU0FBUyxpQkFBaUIsUUFBd0M7QUFDdkUsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7QUFLTyxTQUFTLFVBQVUsUUFBeUI7QUFDakQsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7QUFLTyxTQUFTLGlCQUFpQixRQUcvQjtBQUNBLFFBQU0sTUFBTSxPQUFPLE1BQU07QUFDekIsU0FBTztBQUFBLElBQ0wsSUFBSSwyQkFBSztBQUFBLElBQ1QsS0FBSywyQkFBSztBQUFBLEVBQ1o7QUFDRjtBQUtPLFNBQVMsZUFBZSxRQUE0QztBQUN6RSxRQUFNLE1BQU0sT0FBTyxNQUFNO0FBQ3pCLFNBQU8sMkJBQUs7QUFDZDtBQUtPLFNBQVMsY0FBYyxRQUFrQztBQUM5RCxRQUFNLE1BQU0sT0FBTyxNQUFNO0FBQ3pCLFVBQU8sMkJBQUssVUFBUyxDQUFDO0FBQ3hCO0FBS08sU0FBUyxpQkFBaUIsUUFHL0I7QUFDQSxRQUFNLE1BQU0sT0FBTyxNQUFNO0FBQ3pCLFNBQU87QUFBQSxJQUNMLE1BQU0sMkJBQUs7QUFBQSxJQUNYLFNBQVMsMkJBQUs7QUFBQSxFQUNoQjtBQUNGO0FBS08sU0FBUyxZQUFZLFFBRzFCO0FBQ0EsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPO0FBQUEsSUFDTCxTQUFTLDJCQUFLO0FBQUEsSUFDZCxXQUFXLDJCQUFLO0FBQUEsRUFDbEI7QUFDRjtBQUtPLFNBQVMsZ0JBQWdCLFFBQTRDO0FBQzFFLFFBQU0sTUFBTSxPQUFPLE1BQU07QUFDekIsU0FBTywyQkFBSztBQUNkO0FBS08sU0FBUyxlQUFlLFFBQTRDO0FBQ3pFLFFBQU0sTUFBTSxPQUFPLE1BQU07QUFDekIsU0FBTywyQkFBSztBQUNkO0FBS08sU0FBUyxvQkFBb0IsUUFBeUI7QUFDM0QsUUFBTSxNQUFNLE9BQU8sTUFBTTtBQUN6QixTQUFPLDJCQUFLO0FBQ2Q7OztBSmhUQSxTQUFTLGdCQUNKLFNBQ21CO0FBQ3RCLFFBQU0sU0FBK0IsQ0FBQztBQUN0QyxhQUFXLFVBQVUsU0FBUztBQUM1QixRQUFJLFFBQVE7QUFDVixhQUFPLE9BQU8sUUFBUSxNQUFNO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBeUJBLFNBQVMsaUJBQWlCO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBQXFDO0FBRW5DLFFBQU0sUUFBUSxTQUFTLE1BQW9CLEtBQUssQ0FBQztBQUNqRCxRQUFNLFVBQVUsT0FBTyxLQUFLLEtBQUssRUFDOUIsT0FBTyxDQUFDLFNBQVEsbURBQWlCLFNBQVMsVUFBUyxLQUFLLEVBQ3hEO0FBQUEsSUFDQyxDQUFDLE9BQU8sU0FBUztBQUFBLE1BQ2YsR0FBRztBQUFBLE1BQ0gsQ0FBQyxNQUFNLGVBQWUsTUFBTSxNQUFNLFNBQVM7QUFBQSxJQUM3QztBQUFBLElBQ0EsQ0FBQztBQUFBLEVBQ0g7QUFFRixTQUFPO0FBQ1Q7QUFFQSxTQUFTLGlCQUFpQixRQUFxQztBQUM3RCxNQUFJLENBQUMsT0FBTztBQUFhLFdBQU8sQ0FBQztBQUNqQyxRQUFNLHlCQUFxQixjQUFBRyxTQUFPLE9BQU8sV0FBVztBQUNwRCxNQUFJLENBQUMsZ0JBQWdCLGtCQUFrQjtBQUNyQyxXQUFPLEVBQUUsYUFBYSxPQUFPLFlBQVk7QUFDM0MsUUFBTSxFQUFFLFlBQVksS0FBSyxJQUFJLGlCQUFpQixrQkFBa0I7QUFDaEUsUUFBTSxTQUF1QixDQUFDO0FBQzlCLE1BQUksS0FBSyxLQUFLO0FBQUcsV0FBTyxjQUFjLEtBQUssS0FBSztBQUNoRCxNQUFJLE9BQU8sZUFBZSxZQUFZLGVBQWUsTUFBTTtBQUN6RCxRQUFJLGdCQUFnQixjQUFjLFdBQVcsWUFBWTtBQUN2RCxhQUFPLGFBQWE7QUFBQSxJQUN0QjtBQUVBLFdBQU87QUFBQSxNQUNMLHNCQUFzQixrQkFBa0IsVUFBVSxDQUFDO0FBQUEsSUFDckQsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTTtBQUMxQixhQUFPLE9BQU87QUFBQSxJQUNoQixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVDtBQUVBLFNBQVMsb0JBQW9CO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBQW1DO0FBQ2pDLFFBQU0sY0FBYyxpQkFBaUIsTUFBTTtBQUMzQyxRQUFNLFFBQVEsY0FBYyxlQUFlLGFBQWEsU0FBUyxJQUFJLENBQUM7QUFFdEUsTUFBSSxTQUFTO0FBQ2IsUUFBTSxTQUFTLFVBQVUsTUFBTTtBQUMvQixNQUFJLGFBQWEsUUFBUTtBQUN2QixVQUFNLGtCQUFrQixPQUFPLFNBQVMsY0FBYyxTQUFTO0FBQy9ELFFBQUksbUJBQW1CLGVBQWUsaUJBQWlCO0FBQ3JELFVBQUk7QUFDRixpQkFBUyxPQUFPLGdCQUFnQjtBQUFBLFVBQzlCLENBQUMsV0FBVyxRQUFRLEVBQUUsU0FBUyxHQUFHLE1BQU0sTUFBTSxJQUMxQyxJQUNBLGFBQWEsTUFBTSxPQUNuQixLQUNBLGNBQWMsTUFBTSxPQUNwQixRQUNBLGFBQWEsTUFBTSxPQUNuQixDQUFDLElBQ0QsV0FBVyxNQUFNLE9BQ2pCLE9BQ0EsWUFBWSxNQUFNLE9BQ2xCLENBQUMsSUFDRDtBQUFBLFVBQ0osRUFBRSxVQUFVLE1BQU0sUUFBVyxNQUFNLENBQUMsRUFBRTtBQUFBLFFBQ3hDO0FBQUEsTUFDRixTQUFTLEdBQVA7QUFBQSxNQUVGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsR0FBSSxPQUFPLGNBQWMsRUFBRSxhQUFhLE9BQU8sWUFBWSxJQUFJLENBQUM7QUFBQSxNQUNoRSxHQUFHO0FBQUEsTUFDSCxHQUFJLENBQUMsVUFBVSxVQUFVLFdBQVcsTUFBTSxFQUFFLFNBQVMsTUFBTSxJQUN2RDtBQUFBLFFBQ0UsTUFBTTtBQUFBLE1BQ1IsSUFDQSxDQUFDO0FBQUEsSUFDUDtBQUFBLElBQ0EsR0FBRztBQUFBLEVBQ0w7QUFDRjtBQUVBLFNBQVMsWUFBWTtBQUFBLEVBQ25CO0FBQUEsRUFDQTtBQUNGLEdBQTJDO0FBQ3pDLFFBQU0sYUFBMkI7QUFBQSxJQUMvQixNQUFNO0FBQUEsRUFDUjtBQUNBLFFBQU0sU0FBUyxVQUFVLE1BQU07QUFDL0IsU0FBTyxRQUFRLENBQUMsU0FBUztBQTNNM0I7QUE2TUksVUFBTSxPQUFPLEtBQUssUUFBUSxLQUFLO0FBRS9CLFVBQU0sU0FBUyxLQUFLO0FBRXBCLFlBQVE7QUFBQSxXQUNEO0FBQ0gsbUJBQVcsU0FBUztBQUNwQjtBQUFBLFdBQ0c7QUFDSCxtQkFBVyxTQUFTO0FBQ3BCO0FBQUEsV0FDRztBQUNILG1CQUFXLFNBQVM7QUFDcEI7QUFBQSxXQUNHO0FBQ0gsbUJBQVcsU0FBUztBQUNwQjtBQUFBLFdBQ0c7QUFDSCxtQkFBVyxTQUFTO0FBQ3BCO0FBQUEsV0FFRztBQUNILFlBQUksV0FBVztBQUFTLHFCQUFXLFNBQVM7QUFBQSxpQkFDbkMsV0FBVztBQUFRLHFCQUFXLFNBQVM7QUFBQSxpQkFDdkMsV0FBVztBQUFRLHFCQUFXLFNBQVM7QUFBQSxpQkFDdkMsV0FBVztBQUFPLHFCQUFXLFNBQVM7QUFBQSxpQkFDdEMsV0FBVztBQUFZLHFCQUFXLFNBQVM7QUFDcEQ7QUFBQSxXQUNHO0FBQ0gsbUJBQVcsWUFBWSxLQUFLO0FBQzVCLG1CQUFXLFlBQVksS0FBSztBQUM1QjtBQUFBLFdBQ0c7QUFBQSxXQUNBO0FBRUgsbUJBQVcsYUFBWSxVQUFLLFVBQUwsWUFBYyxLQUFLO0FBQzFDO0FBQUEsV0FDRztBQUFBLFdBQ0E7QUFFSCxtQkFBVyxhQUFZLFVBQUssVUFBTCxZQUFjLEtBQUs7QUFDMUM7QUFBQSxXQUNHO0FBQ0gsbUJBQVcsV0FBVSxnQkFBSyxVQUFMLG1CQUFZLFdBQVosYUFBc0IsVUFBSyxZQUFMLG1CQUFjO0FBQ3pEO0FBQUE7QUFBQSxFQUVOLENBQUM7QUFDRCxTQUFPLGFBQWEsWUFBWSxpQkFBaUIsTUFBTSxHQUFHLEdBQUcsT0FBTztBQUN0RTtBQUVBLFNBQVMsWUFBWTtBQUFBLEVBQ25CO0FBQUEsRUFDQTtBQUNGLEdBQTJDO0FBQ3pDLFFBQU0sYUFBMkI7QUFBQSxJQUMvQixNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsRUFDVjtBQUNBLFFBQU0sU0FBUyxVQUFVLE1BQU07QUFDL0IsU0FBTyxRQUFRLENBQUMsU0FBUztBQUN2QixZQUFRLEtBQUs7QUFBQSxXQUNOO0FBQ0gsbUJBQVcsVUFBVSxLQUFLO0FBRzFCLFlBQUksQ0FBQyxLQUFLO0FBQVcscUJBQVcsbUJBQW1CO0FBQ25EO0FBQUEsV0FDRztBQUNILG1CQUFXLFVBQVUsS0FBSztBQUcxQixZQUFJLENBQUMsS0FBSztBQUFXLHFCQUFXLG1CQUFtQjtBQUNuRDtBQUFBLFdBQ0c7QUFDSCxtQkFBVyxPQUFPO0FBQ2xCLGVBQU8sV0FBVztBQUNsQjtBQUFBLFdBQ0c7QUFDSCxtQkFBVyxhQUFhLEtBQUs7QUFBQTtBQUFBLEVBRW5DLENBQUM7QUFDRCxTQUFPLGFBQWEsWUFBWSxpQkFBaUIsTUFBTSxHQUFHLEdBQUcsT0FBTztBQUN0RTtBQUVBLFNBQVMsaUNBQ1AsU0FDVTtBQUNWLFFBQU0sc0JBQWdDLENBQUM7QUFDdkMsYUFBVyxVQUFVLFNBQVM7QUFDNUIsUUFBSSxNQUFNLFFBQVEsT0FBTyxlQUFlLEdBQUc7QUFDekMsMEJBQW9CLEtBQUssR0FBRyxPQUFPLGVBQWU7QUFBQSxJQUNwRDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFlBQVk7QUFBQSxFQUNuQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBQTRDO0FBQzFDLE1BQUk7QUFFSixRQUFNLFdBQVcsWUFBWSxNQUFNO0FBQ25DLFFBQU0sY0FBYyxlQUFlLE1BQU07QUFHekMsTUFDRSxFQUNFLG9CQUFvQixhQUFFLFlBQ3JCLFlBQVksWUFBWSxRQUFRLE1BQU0sYUFFekM7QUFDQSxRQUFJLFVBQVU7QUFDWiw2QkFBdUIsZUFBZSxVQUFVLFNBQVM7QUFBQSxJQUMzRDtBQUFBLEVBQ0YsV0FBVyxnQkFBZ0IsZUFBZTtBQUN4QywyQkFBdUI7QUFBQSxFQUN6QixXQUFXLGdCQUFnQixVQUFVO0FBQ25DLDJCQUF1QjtBQUFBLEVBQ3pCO0FBR0EseUJBQ0Usd0JBQXdCLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxDQUFDO0FBRTdELFFBQU0sY0FBYyxTQUFTLE1BQW9CLEtBQUssQ0FBQztBQUN2RCxRQUFNLHFCQUFxQixPQUFPLEtBQUssV0FBVyxFQUFFLE9BQU8sQ0FBQyxRQUFRO0FBQ2xFLFVBQU0sT0FBTyxZQUFZO0FBQ3pCLFVBQU0sZUFBZSxZQUFZLElBQUk7QUFDckMsV0FDRSxFQUNFLEtBQUssV0FBVyxLQUNoQixnQkFBZ0IsYUFBRSxjQUNsQixpQkFBaUIsaUJBQ2QsRUFBRSxnQkFBZ0IsYUFBRSxZQUFZLGlCQUFpQjtBQUFBLEVBRTFELENBQUM7QUFFRCxRQUFNLFdBQ0osbUJBQW1CLFNBQVMsSUFBSSxFQUFFLFVBQVUsbUJBQW1CLElBQUksQ0FBQztBQUV0RSxTQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sWUFBWSxpQkFBaUI7QUFBQSxRQUMzQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSxpQkFBaUIsaUNBQWlDLE9BQU87QUFBQSxNQUMzRCxDQUFDO0FBQUEsTUFDRCxHQUFHO0FBQUEsTUFDSCxHQUFHO0FBQUEsTUFDSCxHQUFHO0FBQUEsSUFDTDtBQUFBLElBQ0EsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixHQUFHO0FBQUEsRUFDTDtBQUNGO0FBRUEsU0FBUyxZQUFZO0FBQUEsRUFDbkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBQTJDO0FBQ3pDLFFBQU0sWUFBWSxtQkFBbUIsTUFBTTtBQUMzQyxTQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sc0JBQ0UscUJBQXFCLGFBQUUsYUFDbkIsQ0FBQyxJQUNELFlBQ0EsZUFBZSxXQUFXLFNBQVMsSUFDbkMsQ0FBQztBQUFBLElBQ1Q7QUFBQSxJQUNBLGlCQUFpQixNQUFNO0FBQUEsSUFDdkIsR0FBRztBQUFBLEVBQ0w7QUFDRjtBQUVBLFNBQVMsWUFBWTtBQUFBLEVBQ25CO0FBQUEsRUFDQTtBQUNGLEdBQTJDO0FBQ3pDLFNBQU87QUFBQSxJQUNMLEVBQUUsTUFBTSxXQUErQixRQUFRLFFBQVE7QUFBQSxJQUN2RCxpQkFBaUIsTUFBTTtBQUFBLElBQ3ZCLEdBQUc7QUFBQSxFQUNMO0FBQ0Y7QUFFQSxTQUFTLGFBQWE7QUFBQSxFQUNwQjtBQUFBLEVBQ0E7QUFDRixHQUE0QztBQUMxQyxTQUFPO0FBQUEsSUFDTCxFQUFFLE1BQU0sVUFBOEI7QUFBQSxJQUN0QyxpQkFBaUIsTUFBTTtBQUFBLElBQ3ZCLEdBQUc7QUFBQSxFQUNMO0FBQ0Y7QUFFQSxTQUFTLFVBQVUsRUFBRSxRQUFRLFFBQVEsR0FBeUM7QUFDNUUsU0FBTztBQUFBLElBQ0wsRUFBRSxNQUFNLFVBQThCLFFBQVEsWUFBWTtBQUFBLElBQzFELGlCQUFpQixNQUFNO0FBQUEsSUFDdkIsR0FBRztBQUFBLEVBQ0w7QUFDRjtBQUVBLFNBQVMsVUFBVSxFQUFFLFFBQVEsUUFBUSxHQUF5QztBQUM1RSxTQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGlCQUFpQixNQUFNO0FBQUEsSUFDdkIsR0FBRztBQUFBLEVBQ0w7QUFDRjtBQUVBLFNBQVMsY0FBYztBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUE0RDtBQUMxRCxTQUFPO0FBQUEsSUFDTCxlQUFlLE9BQU8sT0FBTyxHQUFHLFNBQVM7QUFBQSxJQUN6QyxpQkFBaUIsTUFBTTtBQUFBLElBQ3ZCLEdBQUc7QUFBQSxFQUNMO0FBQ0Y7QUFFQSxTQUFTLGNBQWM7QUFBQSxFQUNyQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsR0FBNEQ7QUFDMUQsUUFBTSxTQUFTLGVBQWUsT0FBTyxPQUFPLEdBQUcsU0FBUztBQUN4RCxTQUFPO0FBQUEsSUFDTCxFQUFFLEdBQUcsUUFBUSxNQUFNLE9BQU8sTUFBTSxVQUFVLEtBQUs7QUFBQSxJQUMvQyxpQkFBaUIsTUFBTTtBQUFBLElBQ3ZCLEdBQUc7QUFBQSxFQUNMO0FBQ0Y7QUFFQSxTQUFTLGFBQWE7QUFBQSxFQUNwQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsR0FBMkQ7QUFDekQsUUFBTSxZQUFZLGFBQWEsTUFBTTtBQUNyQyxTQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsU0FBUyxnQkFBZ0IsTUFBTTtBQUFBLE1BQy9CLEdBQUksWUFBWSxlQUFlLFdBQVcsU0FBUyxJQUFJLENBQUM7QUFBQSxJQUMxRDtBQUFBLElBQ0EsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixHQUFHO0FBQUEsRUFDTDtBQUNGO0FBRUEsU0FBUyxXQUFXO0FBQUEsRUFDbEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBQXlEO0FBQ3ZELFFBQU0sY0FBNEIsQ0FBQztBQUNuQyxRQUFNLEVBQUUsYUFBYSxXQUFXLFVBQVUsSUFBSSxvQkFBb0IsTUFBTTtBQUV4RSxNQUFJLGVBQWUsTUFBTTtBQUN2QixnQkFBWSxXQUFXLFlBQVk7QUFDbkMsZ0JBQVksV0FBVyxZQUFZO0FBQUEsRUFDckM7QUFFQSxNQUFJLGFBQWE7QUFBTSxnQkFBWSxXQUFXLFVBQVU7QUFDeEQsTUFBSSxhQUFhO0FBQU0sZ0JBQVksV0FBVyxVQUFVO0FBRXhELFNBQU87QUFBQSxJQUNMO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPLGVBQWUsT0FBTyxTQUFTLFNBQVM7QUFBQSxNQUMvQyxHQUFHO0FBQUEsSUFDTDtBQUFBLElBQ0EsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixHQUFHO0FBQUEsRUFDTDtBQUNGO0FBRUEsU0FBUyxhQUFhLEVBQUUsU0FBUyxPQUFPLEdBQW1DO0FBQ3pFLFFBQU0sUUFBUSxnQkFBZ0IsTUFBTTtBQUNwQyxTQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsTUFBTSxPQUFPO0FBQUEsTUFDYixNQUFNLENBQUMsS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUNBLGlCQUFpQixNQUFNO0FBQUEsSUFDdkIsR0FBRztBQUFBLEVBQ0w7QUFDRjtBQUVBLFNBQVMsVUFBVSxFQUFFLFNBQVMsT0FBTyxHQUFtQztBQUN0RSxRQUFNLFNBQVMsY0FBYyxNQUFNO0FBQ25DLE1BQUksQ0FBQyxRQUFRO0FBQ1gsV0FBTztBQUFBLE1BQ0wsRUFBRSxNQUFNLFNBQVM7QUFBQSxNQUNqQixpQkFBaUIsTUFBTTtBQUFBLE1BQ3ZCLEdBQUc7QUFBQSxJQUNMO0FBQUEsRUFDRjtBQUNBLFFBQU0sY0FBYyxNQUFNLFFBQVEsTUFBTSxJQUFJLFNBQVMsT0FBTyxPQUFPLE1BQU07QUFDekUsU0FBTztBQUFBLElBQ0w7QUFBQSxNQUNFLE1BQU0sT0FBTyxZQUFZO0FBQUEsTUFDekIsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLGlCQUFpQixNQUFNO0FBQUEsSUFDdkIsR0FBRztBQUFBLEVBQ0w7QUFDRjtBQUVBLFNBQVMsa0JBQWtCO0FBQUEsRUFDekI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBQTZFO0FBQzNFLFFBQU0sRUFBRSxNQUFNLE1BQU0sSUFBSSxxQkFBcUIsTUFBTTtBQUNuRCxTQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsT0FBTztBQUFBLFFBQ0wsT0FBTyxlQUFlLE1BQU0sU0FBUyxJQUFJLENBQUM7QUFBQSxRQUMxQyxRQUFRLGVBQWUsT0FBTyxTQUFTLElBQUksQ0FBQztBQUFBLE1BQzlDO0FBQUEsSUFDRjtBQUFBLElBQ0EsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixHQUFHO0FBQUEsRUFDTDtBQUNGO0FBRUEsU0FBUyxXQUFXO0FBQUEsRUFDbEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBQW1DO0FBQ2pDLFFBQU0sV0FBVyxnQkFBZ0IsTUFBTTtBQUN2QyxNQUNFLFNBQVM7QUFBQSxJQUNQLENBQUMsTUFBTSxZQUFZLFFBQVEsWUFBWSxPQUFPLE1BQU07QUFBQSxJQUNwRDtBQUFBLEVBQ0YsR0FDQTtBQUVBLFVBQU0sV0FBVztBQUNqQixVQUFNLE9BQU8sU0FBUyxPQUFPLENBQUMsTUFBTSxZQUFZO0FBQzlDLFlBQU0sUUFBUSxnQkFBZ0IsT0FBTztBQUNyQyxhQUFPLENBQUMsUUFBUSxTQUFTLE9BQU8sUUFBUSxPQUFPLFFBQVE7QUFBQSxJQUN6RCxHQUFHLElBQXFCO0FBRXhCLFFBQUksTUFBTTtBQUNSLGFBQU87QUFBQSxRQUNMO0FBQUEsVUFDRTtBQUFBLFVBQ0EsTUFBTSxTQUFTLElBQUksQ0FBQyxZQUFZLGdCQUFnQixPQUFPLENBQUM7QUFBQSxRQUMxRDtBQUFBLFFBQ0EsaUJBQWlCLE1BQU07QUFBQSxRQUN2QixHQUFHO0FBQUEsTUFDTDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhLFNBQVM7QUFBQSxJQUMxQixDQUFDLFlBQVksWUFBWSxPQUFPLE1BQU07QUFBQSxFQUN4QztBQUNBLFFBQU0sa0JBQWtCLFNBQVM7QUFBQSxJQUMvQixDQUFDLFlBQVksWUFBWSxPQUFPLE1BQU07QUFBQSxFQUN4QztBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsTUFDRSxPQUFPLGdCQUFnQixJQUFJLENBQUMsV0FBVyxlQUFlLFFBQVEsU0FBUyxDQUFDO0FBQUEsTUFDeEUsR0FBSSxhQUFhLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQztBQUFBLElBQ3pDO0FBQUEsSUFDQSxpQkFBaUIsTUFBTTtBQUFBLElBQ3ZCLEdBQUc7QUFBQSxFQUNMO0FBQ0Y7QUFFQSxTQUFTLHdCQUF3QjtBQUFBLEVBQy9CO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUFtQztBQUNqQyxRQUFNLGdCQUFnQixpQkFBaUIsTUFBTTtBQUM3QyxRQUFNLFVBQVUsZ0JBQWdCLE1BQU07QUFDdEMsU0FBTztBQUFBLElBQ0w7QUFBQSxNQUNFLEdBQUksZ0JBQ0EsRUFBRSxlQUFlLEVBQUUsY0FBYyxjQUFjLEVBQUUsSUFDakQsQ0FBQztBQUFBLE1BQ0wsT0FBTyxRQUFRLElBQUksQ0FBQyxXQUFXLGVBQWUsUUFBUSxTQUFTLENBQUM7QUFBQSxJQUNsRTtBQUFBLElBQ0EsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixHQUFHO0FBQUEsRUFDTDtBQUNGO0FBRUEsU0FBUyxXQUFXO0FBQUEsRUFDbEI7QUFBQSxFQUNBO0FBQ0YsR0FBMEM7QUFDeEMsU0FBTyxhQUFhLEVBQUUsVUFBVSxLQUFLLEdBQUcsaUJBQWlCLE1BQU0sR0FBRyxHQUFHLE9BQU87QUFDOUU7QUFFQSxTQUFTLGFBQWEsRUFBRSxTQUFTLE9BQU8sR0FBbUM7QUFDekUsUUFBTSxPQUFPLGVBQWUsTUFBTTtBQUNsQyxTQUFPLGFBQWEsT0FBTyxlQUFlLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPO0FBQ2xFO0FBRUEsU0FBUyxlQUFlO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQ0YsR0FBMEM7QUFDeEMsU0FBTyxhQUFhLGlCQUFpQixNQUFNLEdBQUcsR0FBRyxPQUFPO0FBQzFEO0FBRUEsU0FBUyxjQUFjLEVBQUUsUUFBUSxVQUFVLEdBQW1DO0FBQzVFLFFBQU0sRUFBRSxJQUFJLFVBQVUsS0FBSyxVQUFVLElBQUksaUJBQWlCLE1BQU07QUFDaEUsTUFBSSxhQUFhLFdBQVc7QUFDMUIsV0FBTyxlQUFlLFdBQVcsU0FBUztBQUFBLEVBQzVDO0FBQ0EsU0FBTyxXQUFXLGVBQWUsVUFBVSxTQUFTLElBQUksQ0FBQztBQUMzRDtBQUVBLFNBQVMsY0FBYztBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUFtQztBQUNqQyxRQUFNLFlBQVksYUFBYSxNQUFNO0FBQ3JDLFNBQU87QUFBQSxJQUNMLFlBQVksZUFBZSxXQUFXLFNBQVMsSUFBSSxDQUFDO0FBQUEsSUFDcEQsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixHQUFHO0FBQUEsRUFDTDtBQUNGO0FBRUEsSUFBTSxZQUFZO0FBQUEsRUFDaEIsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsU0FBUztBQUFBLEVBQ1QsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBLEVBQ2IsWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsZUFBZTtBQUFBLEVBQ2YsZ0JBQWdCO0FBQUEsRUFDaEIsWUFBWTtBQUFBLEVBQ1osaUJBQWlCO0FBQUEsRUFDakIsVUFBVTtBQUFBLEVBQ1YsdUJBQXVCO0FBQUEsRUFDdkIsVUFBVTtBQUFBLEVBQ1YsWUFBWTtBQUFBLEVBRVosY0FBYztBQUFBLEVBRWQsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osUUFBUTtBQUFBLEVBQ1IsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUNmO0FBR08sU0FBUyxlQUNkLFFBQ0EsV0FDYztBQUNkLFFBQU0sRUFBRSxjQUFjLENBQUMsRUFBRSxJQUFJO0FBQzdCLFFBQU0sVUFBaUM7QUFBQSxJQUNyQyxHQUFJLE1BQU0sUUFBUSxXQUFXLElBQUksY0FBYyxDQUFDLFdBQVc7QUFBQSxFQUM3RDtBQUNBLE1BQUk7QUFDRixVQUFNLFdBQVcsWUFBWSxNQUFNO0FBQ25DLFFBQUksWUFBWSxXQUFXO0FBQ3pCLGFBQU8sVUFBVSxVQUFVO0FBQUEsUUFDekI7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUFPLGVBQWUsRUFBRSxRQUFRLFFBQVEsQ0FBQztBQUFBLEVBQzNDLFNBQVMsS0FBUDtBQUNBLFlBQVEsTUFBTSxHQUFHO0FBQ2pCLFdBQU8sZUFBZSxFQUFFLFFBQVEsUUFBUSxDQUFDO0FBQUEsRUFDM0M7QUFDRjs7O0FLM3NCQTtBQUFBLG9CQUFjO0FBRWQsU0FBUyxhQUFhLEtBQVUsT0FBMkI7QUFDekQsTUFBSSxZQUEyQjtBQUMvQixnQkFBQUMsUUFBRSxPQUFPLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDdEIsUUFBSSxjQUFBQSxRQUFFLFNBQVMsQ0FBQyxLQUFLLGNBQUFBLFFBQUUsUUFBUSxHQUFHLEtBQUssR0FBRztBQUN4QyxrQkFBWTtBQUVaLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRixDQUFDO0FBQ0QsU0FBTztBQUNUO0FBRU8sU0FBUyxzQkFBc0IsTUFBVyxNQUFnQjtBQUMvRCxTQUFPLGNBQUFBLFFBQUUsVUFBVSxNQUFNLENBQUMsUUFBUSxPQUFPLFFBQVE7QUFDL0MsUUFBSSxjQUFBQSxRQUFFLFNBQVMsS0FBSyxHQUFHO0FBQ3JCLFlBQU0sY0FBYyxhQUFhLE1BQU0sS0FBSztBQUM1QyxVQUFJLGFBQWE7QUFDZixlQUFPLE9BQU87QUFBQSxVQUNaLE1BQU0sd0JBQXdCO0FBQUEsUUFDaEM7QUFBQSxNQUNGLE9BQU87QUFDTCxlQUFPLE9BQU8sc0JBQXNCLE9BQU8sSUFBSTtBQUFBLE1BQ2pEO0FBQUEsSUFDRixPQUFPO0FBQ0wsYUFBTyxPQUFPO0FBQUEsSUFDaEI7QUFBQSxFQUNGLENBQUM7QUFDSDs7O0FDN0JBO0FBRUEsU0FBUyxpQ0FBaUNDLE9BQWM7QUFDdEQsUUFBTSxRQUFRQSxNQUFLLE1BQU0sR0FBRyxFQUFFLE9BQU8sQ0FBQyxTQUFTLFNBQVMsRUFBRTtBQUMxRCxRQUFNLFdBQVcsTUFBTSxNQUFNLFNBQVM7QUFDdEMsTUFBSSxTQUFTLFdBQVcsR0FBRyxLQUFLLFNBQVMsU0FBUyxHQUFHLEdBQUc7QUFFdEQsVUFBTSxRQUFRLFNBQVMsTUFBTSxHQUFHLEVBQUU7QUFDbEMsV0FBTyxNQUFNO0FBQUEsRUFDZjtBQUVBLFNBQU87QUFDVDtBQUdBLFNBQVMsZ0NBQWdDQSxPQUFjO0FBQ3JELFFBQU0sUUFBUUEsTUFBSyxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUU7QUFDMUQsU0FBTyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQztBQUN4QztBQUVBLFNBQVMsbUJBQ1BBLE9BQ0EsZ0JBUUk7QUFDSixNQUFJQSxNQUFLLE1BQU0sR0FBRyxFQUFFLE9BQU8sQ0FBQyxTQUFTLFNBQVMsRUFBRSxFQUFFLFdBQVcsR0FBRztBQUM5RCxXQUFPO0FBQUEsTUFDTCxpQkFBaUI7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCx5QkFBeUIsZ0NBQWdDQSxLQUFJO0FBQUEsSUFDN0QsMEJBQTBCLGlDQUFpQ0EsS0FBSTtBQUFBLElBQy9ELEdBQUksaUJBQ0E7QUFBQSxNQUNFLDJCQUEyQjtBQUFBLElBQzdCLElBQ0EsQ0FBQztBQUFBLEVBQ1A7QUFDRjtBQUVBLGVBQXNCLDRCQUE0QjtBQUFBLEVBQ2hEO0FBQUEsRUFDQSxNQUFBQTtBQUFBLEVBQ0E7QUFDRixHQUlHO0FBQ0QsUUFBTSxrQkFBa0IsbUJBQW1CQSxPQUFNLGNBQWM7QUFDL0QsTUFBSSxRQUFRLFdBQVcsR0FBRztBQUN4QixXQUFPO0FBQUEsTUFDTCxDQUFDLFFBQVEsS0FBSztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUVBLFFBQU0sZ0JBQWdCLENBQUM7QUFFdkIsVUFBUSxRQUFRLENBQUMsV0FBVztBQUMxQixRQUFJLFdBQVcsUUFBUTtBQUNyQixvQkFBYyxVQUFVO0FBQUEsSUFDMUIsT0FBTztBQUNMLG9CQUFjLFVBQVU7QUFBQSxRQUN0QixpQkFBaUI7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPO0FBQ1Q7OztBVGhFQSxJQUFBQyxpQkFBbUI7QUFLbkIsU0FBUyw0QkFBNEIsS0FBYTtBQUNoRCxNQUFJLElBQUksV0FBVyxHQUFHO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxZQUFZLElBQUksT0FBTyxDQUFDLEVBQUUsWUFBWTtBQUM1QyxTQUFPLFlBQVksSUFBSSxNQUFNLENBQUM7QUFDaEM7QUFFQSxTQUFTLDJCQUEyQkMsT0FBc0I7QUFDeEQsUUFBTSxRQUFRQSxNQUNYLFFBQVEsTUFBTSxHQUFHLEVBQ2pCLE1BQU0sR0FBRyxFQUNULE9BQU8sQ0FBQyxTQUFTLFNBQVMsRUFBRTtBQUMvQixRQUFNLG1CQUFtQixNQUFNLElBQUksQ0FBQyxTQUFTO0FBQzNDLFFBQUksS0FBSyxXQUFXLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxHQUFHO0FBRTlDLFlBQU0sY0FBYyxLQUFLLE1BQU0sR0FBRyxFQUFFO0FBQ3BDLFlBQU0sUUFBUSxZQUFZLE1BQU0sR0FBRztBQUNuQyxZQUFNLG1CQUFtQixNQUFNO0FBQUEsUUFDN0IsQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDLEVBQUUsWUFBWSxJQUFJLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFDdkQ7QUFDQSxhQUFPLEtBQUssaUJBQWlCLEtBQUssRUFBRTtBQUFBLElBQ3RDLE9BQU87QUFFTCxZQUFNLFFBQVEsS0FBSyxNQUFNLEdBQUc7QUFDNUIsWUFBTSxtQkFBbUIsTUFBTTtBQUFBLFFBQzdCLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxFQUFFLFlBQVksSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUFBLE1BQ3ZEO0FBQ0EsYUFBTyxpQkFBaUIsS0FBSyxFQUFFO0FBQUEsSUFDakM7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPLDRCQUE0QixpQkFBaUIsS0FBSyxFQUFFLENBQUM7QUFDOUQ7QUFFQSxTQUFTLFdBQVcsT0FBdUI7QUFDekMsUUFBTSxRQUFRLE1BQU0sTUFBTSxHQUFHO0FBQzdCLFFBQU0sbUJBQW1CLE1BQU07QUFBQSxJQUM3QixDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsRUFBRSxZQUFZLElBQUksS0FBSyxNQUFNLENBQUMsRUFBRSxZQUFZO0FBQUEsRUFDckU7QUFDQSxRQUFNLG1CQUFtQixpQkFBaUIsS0FBSyxFQUFFO0FBQ2pELFNBQU87QUFDVDtBQXVCQSxlQUFzQixnQkFBZ0IsTUFBMkI7QUFwRmpFO0FBcUZFLFFBQU1DLFVBQVMsTUFBTSwrREFBaUI7QUFDdEMsUUFBTSxFQUFFLFlBQVksT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUVsQyxRQUFNLG9CQUFvQixNQUFNLHFCQUFxQixJQUFJO0FBR3pELFFBQU0sRUFBRSxhQUFhLGtCQUFrQixJQUFJLGtCQUFrQixPQUFPLEVBQUUsS0FBSyxFQUN4RTtBQUVILFFBQU0sbUJBQWtCLHVCQUFrQixvQkFBbEIsWUFBcUMsQ0FBQztBQUM5RCxRQUFNLDZCQUE2QixDQUFDO0FBQ3BDLGFBQVcsWUFBWSxPQUFPLEtBQUssa0JBQWtCLGlCQUFpQixHQUFHO0FBQ3ZFLFVBQU0sS0FBSyxrQkFBa0Isa0JBQWtCO0FBQy9DLFFBQUksR0FBRyxnQkFBZ0I7QUFDckIsc0JBQWdCLFlBQWEsR0FBVztBQUFBLElBQzFDLE9BQU87QUFDTCxjQUFRO0FBQUEsUUFDTkEsT0FBTTtBQUFBLFVBQ0osOEJBQThCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBQ2hDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSwrQkFBMkIsWUFBYSxHQUFXLG1CQUFtQjtBQUFBLE1BQ3BFO0FBQUEsUUFDRSxDQUFDLFdBQVcsQ0FBQztBQUFBLE1BQ2Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFFBQU0sZ0JBQWdCLENBQUM7QUFDdkIsYUFBVyxDQUFDLFlBQVksU0FBUyxLQUFLLE9BQU87QUFBQSxLQUMzQyx1QkFBa0Isa0JBQWxCLFlBQW1DLENBQUM7QUFBQSxFQUN0QyxHQUFHO0FBQ0Qsa0JBQWMsY0FBYyxlQUFlLFNBQVM7QUFBQSxFQUN0RDtBQUVBLGFBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPLFFBQVEsYUFBYSxHQUFHO0FBQ3hELFFBQUksUUFBUSxTQUFTO0FBQ25CLFlBQU0sdUJBQXVCLHNCQUFzQixPQUFPLGFBQWE7QUFDdkUsb0JBQWMsT0FBTztBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUdBLFFBQU0sVUFBVSw0QkFBZSxPQUFPO0FBQUEsSUFDcEMsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0osT0FBTyxrQkFBa0I7QUFBQSxNQUN6QixTQUFTO0FBQUEsSUFDWDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1A7QUFBQSxRQUNFLEtBQUssa0JBQWtCLHVCQUF1QjtBQUFBLE1BQ2hEO0FBQUEsSUFDRjtBQUFBLElBQ0EsTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLE1BQU0sYUFBYSxJQUFJLFlBQVksRUFBRTtBQUFBLElBQzFFLE9BQU8sQ0FBQztBQUFBLElBQ1IsWUFBWTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLFNBQVM7QUFBQSxJQUNYO0FBQUEsRUFDRixDQUFDO0FBRUQsYUFBVztBQUFBLElBQ1Q7QUFBQSxJQUNBLEVBQUUsYUFBYSxXQUFXLE9BQU8sVUFBVTtBQUFBLEVBQzdDLEtBQUssbUJBQW1CO0FBQ3RCLFVBQU0sVUFBVSxVQUFVO0FBQzFCLFFBQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsY0FBUTtBQUFBLFFBQ05BLE9BQU0sT0FBTyxrQkFBa0Isc0NBQXNDO0FBQUEsTUFDdkU7QUFDQTtBQUFBLElBQ0Y7QUFFQSxRQUFJLGNBQWMsVUFBVTtBQUM1QixRQUFJLHNCQUdBLENBQUM7QUFFTCxRQUFJLGFBQWE7QUFDZixZQUFNLHlCQUFxQixlQUFBQyxTQUFPLFdBQVcsRUFBRSxLQUFLO0FBRXBELFVBQUksZ0JBQWdCLGtCQUFrQixHQUFHO0FBQ3ZDLGNBQU0sRUFBRSxZQUFZLEtBQUssSUFBSSxpQkFBaUIsa0JBQWtCO0FBQ2hFLDhCQUFzQjtBQUN0QixzQkFBYyxLQUFLLEtBQUs7QUFBQSxNQUMxQixPQUFPO0FBQ0wsc0JBQWM7QUFBQSxNQUNoQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLCtCQUErQjtBQUFBLE1BQ25DLGtCQUFrQixtQkFBbUI7QUFBQSxJQUN2QztBQUVBLFVBQU0sZUFBZ0QsQ0FBQztBQUV2RCxlQUFXLFVBQVUsU0FBUztBQUM1QixZQUFNLHFCQUFxQixDQUFDLFFBQVEsT0FBTyxPQUFPLEVBQUUsU0FBUyxNQUFNO0FBR25FLFVBQUk7QUFDSixVQUFJLG9CQUFvQjtBQUN0QixtQ0FBMEIsZUFBVSxhQUFWLFlBQXNCLFVBQVU7QUFFMUQsWUFBSSxVQUFVLFlBQVksVUFBVSxjQUFjO0FBQ2hELG9DQUNFLFVBQVUsU0FDVixNQUFNLFVBQVUsWUFBZ0M7QUFBQSxRQUNwRDtBQUFBLE1BQ0YsT0FBTztBQUNMLGtDQUEwQixVQUFVO0FBQUEsTUFDdEM7QUFFQSxVQUFJO0FBQ0osVUFBSSxvQkFBb0I7QUFDdEIsbUNBQTJCLFVBQVU7QUFBQSxNQUN2QyxPQUFPO0FBQ0wsb0NBQ0UsZUFBVSxnQkFBVixZQUF5QixVQUFVO0FBRXJDLFlBQUksVUFBVSxlQUFlLFVBQVUsY0FBYztBQUNuRCxxQ0FDRSxVQUFVLFlBQ1YsTUFBTSxVQUFVLFlBQWdDO0FBQUEsUUFDcEQ7QUFBQSxNQUNGO0FBRUEsWUFBTSxRQUF5QjtBQUFBLFFBQzdCLEdBQUcsVUFBVTtBQUFBLFFBQ2IsR0FBRztBQUFBLFFBQ0gsU0FBUztBQUFBLFFBQ1QsR0FBSSxlQUFlLEVBQUUsWUFBWTtBQUFBLFFBQ2pDLGFBQWEsR0FBRywyQkFBMkIsU0FBUyxJQUFJO0FBQUEsVUFDdEQ7QUFBQSxRQUNGO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDVCxLQUFLO0FBQUEsWUFDSCxhQUFhO0FBQUEsVUFDZjtBQUFBLFVBQ0EsS0FBSztBQUFBLFlBQ0gsYUFBYTtBQUFBLFVBQ2Y7QUFBQSxVQUNBLEtBQUs7QUFBQSxZQUNILGFBQWE7QUFBQSxVQUNmO0FBQUEsUUFDRjtBQUFBLFFBQ0EsVUFBVSxNQUFNLFFBQVEsVUFBVSxJQUFJLElBQ2xDLFVBQVUsS0FDUCxJQUFJLENBQUMsYUFBYSwyQkFBMkIsU0FBUyxFQUN0RCxLQUFLLElBQ1IsMkJBQTJCLFVBQVU7QUFBQSxNQUMzQztBQUVBLFVBQUkseUJBQXlCO0FBQzNCLGNBQU0sY0FBYztBQUFBLFVBQ2xCLFNBQVM7QUFBQSxZQUNQLG9CQUFvQjtBQUFBLGNBQ2xCLFFBQVEsZUFBZSx1QkFBOEI7QUFBQSxZQUN2RDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLFVBQUksMEJBQTBCO0FBQzVCLGNBQU0sU0FBUyxlQUFlLHdCQUErQjtBQUM3RCxZQUFJLE9BQU8sWUFBWTtBQUNyQixnQkFBTSxhQUFnQyxPQUFPO0FBQUEsWUFDM0MsT0FBTztBQUFBLFVBQ1QsRUFBRSxJQUFJLENBQUMsU0FBUztBQWpRMUIsZ0JBQUFDO0FBa1FZLG1CQUFPO0FBQUEsY0FDTDtBQUFBLGNBQ0EsSUFBSTtBQUFBLGNBQ0osUUFBUSxPQUFPLFdBQVk7QUFBQSxjQUMzQixXQUFVQSxNQUFBLE9BQU8sYUFBUCxnQkFBQUEsSUFBaUIsU0FBUztBQUFBLFlBQ3RDO0FBQUEsVUFDRixDQUFDO0FBRUQsZ0JBQU0sYUFBYTtBQUFBLFFBQ3JCO0FBQUEsTUFDRjtBQUVBLFlBQU0sRUFBRSxhQUFhLElBQUk7QUFDekIsWUFBTSxFQUFFLGNBQWMsS0FBSyxJQUFJO0FBRS9CLFVBQUksY0FBYztBQUNoQixjQUFNLHVCQUF1QixZQUFZLFlBQVk7QUFDckQsWUFBSSx5QkFBeUIsYUFBYTtBQUN4QyxrQkFBUTtBQUFBLFlBQ05GLE9BQU07QUFBQSxjQUNKLGtCQUFrQjtBQUFBLFlBQ3BCO0FBQUEsVUFDRjtBQUNBO0FBQUEsUUFDRjtBQUVBLGNBQU0saUJBQWlCO0FBQUEsVUFDckIsZUFBZSx3QkFBd0IsY0FBRSxZQUNyQyxhQUFhLE9BQU8sRUFBRSxJQUFJLGNBQUUsUUFBUSxFQUFFLENBQUMsSUFDdkM7QUFBQSxRQUNOO0FBRUEsY0FBTSx1QkFBdUI7QUFBQSxVQUMzQjtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBRUEsWUFBSSxNQUFNLGFBQWEsTUFBTTtBQUUzQixnQkFBTSxVQUFVLEtBQUssVUFBVTtBQUFBLFlBQzdCLG9CQUFvQjtBQUFBLGNBQ2xCLFFBQVE7QUFBQSxZQUNWO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsWUFBTSxPQUFPLENBQUM7QUFDZCxpQkFBVyxPQUFPLE1BQU07QUFDdEIsWUFBSSxJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixNQUFNLFdBQVcsRUFBRSxHQUFHO0FBQ3JFLGdCQUFNLEtBQUssS0FBSyxJQUFJLElBQUk7QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLGlDQUFpQyxNQUFNLDRCQUE0QjtBQUFBLFFBQ3ZFLFNBQVMsQ0FBQyxNQUFNO0FBQUEsUUFDaEIsTUFBTTtBQUFBLFFBQ04saUJBQ0UsZ0VBQXFCLGlCQUFyQixZQUFxQyxVQUFVO0FBQUEsTUFDbkQsQ0FBQztBQUVELGFBQU8sT0FBTyxPQUFPLCtCQUErQixPQUFPO0FBQzNELG1CQUFhLE9BQU8sWUFBWSxLQUFLO0FBQUEsSUFDdkM7QUFFQSxZQUFRLFFBQVEsV0FBVyxZQUFZO0FBQUEsRUFDekM7QUFFQSxNQUFJLFlBQVk7QUFDZCxVQUFNLGdCQUFBRyxRQUFHLFVBQVUsWUFBWSxRQUFRLGNBQWMsUUFBVyxDQUFDLENBQUM7QUFBQSxFQUNwRTtBQUVBLFNBQU8sUUFBUSxjQUFjLFFBQVcsQ0FBQztBQUMzQzs7O0FVM1VBO0FBQUEsSUFBQUMsTUFBb0I7OztBQ0FwQjtBQTZCQSx3QkFBZTtBQUNmLElBQUFDLGNBQW9DO0FBRXBDLElBQUFDLGlCQUFtQjtBQXFCbkIsSUFBTSxFQUFFLFNBQVMsR0FBRyxZQUFZLFlBQVksY0FBYyxTQUFTLElBQUksa0JBQUFDO0FBRXZFLElBQU0saUNBQWlDLENBQ3JDLGVBQ0c7QUFDSCxNQUFJLGtCQUFBQSxRQUFHLGFBQWEsVUFBVSxHQUFHO0FBQy9CLFdBQU8sRUFBRSx3QkFBd0IsVUFBVTtBQUFBLEVBQzdDO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTSxnQ0FBZ0MsQ0FBQyxlQUNyQyxFQUFFLHdCQUF3QixFQUFFLGlCQUFpQixVQUFVLENBQUM7QUFFMUQsSUFBTSwyQkFBMkIsTUFDL0IsRUFBRSxzQkFBc0IsV0FBVyxjQUFjO0FBRTVDLElBQU0sWUFBWSxDQUN2QixNQUNBLG1CQUNXO0FBQ1gsUUFBTSxhQUFhLGtCQUFBQSxRQUFHO0FBQUEsSUFDcEI7QUFBQSxJQUNBO0FBQUEsSUFDQSxhQUFhO0FBQUEsSUFDYjtBQUFBLElBQ0EsV0FBVztBQUFBLEVBQ2I7QUFDQSxRQUFNLFVBQVUsa0JBQUFBLFFBQUcsY0FBYyxjQUFjO0FBQy9DLFNBQU8sUUFBUSxVQUFVLFNBQVMsYUFBYSxNQUFNLFVBQVU7QUFDakU7QUFFQSxJQUFNLGVBQWU7QUFFckIsSUFBTSwrQkFBK0IsQ0FBQyxZQUFvQjtBQUN4RCxNQUFJLGFBQWEsS0FBSyxPQUFPLEdBQUc7QUFDOUIsV0FBTyxFQUFFLGlCQUFpQixPQUFPO0FBQUEsRUFDbkM7QUFFQSxTQUFPLEVBQUUsb0JBQW9CLE9BQU87QUFDdEM7QUFFQSxJQUFNLGtCQUFrQixDQUFDLE1BQWUsU0FBaUI7QUFDdkQsUUFBTSxFQUFFLGFBQWEsV0FBVyxJQUFJQyxrQkFBaUIsSUFBSTtBQUV6RCxNQUFJLFVBQVUsS0FBSztBQUNuQixNQUFJLFlBQVk7QUFDZCxlQUFXO0FBQUEsaUJBQ1QsT0FBTyxlQUFlLFdBQVcsYUFBYTtBQUFBLEVBRWxELE9BQU87QUFDTCxlQUFXO0FBQUEsRUFDYjtBQUVBLG9CQUFBRCxRQUFHO0FBQUEsSUFDRDtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBUUEsU0FBU0Msa0JBQWlCLGFBQXdDO0FBQ2hFLE1BQUksQ0FBQztBQUNILFdBQU87QUFBQSxNQUNMLGFBQWE7QUFBQSxJQUNmO0FBQ0YsUUFBTSx5QkFBcUIsZUFBQUMsU0FBTyxXQUFXO0FBQzdDLE1BQUksQ0FBQyxnQkFBZ0Isa0JBQWtCO0FBQUcsV0FBTyxFQUFFLFlBQVk7QUFDL0QsUUFBTSxFQUFFLFlBQVksS0FBSyxJQUFJLGlCQUFpQixrQkFBa0I7QUFDaEUsUUFBTSxTQUE0QjtBQUFBLElBQ2hDLGFBQWEsS0FBSyxLQUFLO0FBQUEsRUFDekI7QUFDQSxNQUFJLE9BQU8sZUFBZSxZQUFZLGVBQWUsTUFBTTtBQUN6RCxRQUFJLGdCQUFnQixjQUFjLFdBQVcsWUFBWTtBQUN2RCxVQUFJLE9BQU8sV0FBVyxlQUFlLFdBQVc7QUFDOUMsZUFBTyxhQUFhO0FBQUEsTUFDdEIsV0FBVyxPQUFPLFdBQVcsZUFBZSxVQUFVO0FBQ3BELGVBQU8sYUFDTCxXQUFXLFdBQVcsU0FBUyxJQUFJLFdBQVcsYUFBYTtBQUFBLE1BQy9EO0FBQUEsSUFDRjtBQUNBLGVBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPLFFBQVEsVUFBVSxHQUFHO0FBQ3JELFVBQUksUUFBUSxpQkFBaUIsUUFBUTtBQUFjO0FBQ25ELGFBQU8sT0FBTztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQVVBLElBQU0saUJBQWlCLENBQUMsUUFBeUI7QUFDL0MsUUFBTSxXQUFXO0FBQUEsSUFDZixjQUFhLDJCQUFLLHNCQUFxQixZQUFZO0FBQUEsRUFDckQ7QUFFQSxTQUFPLEVBQUUsR0FBRyxVQUFVLEdBQUcsSUFBSTtBQUMvQjtBQW1CQSxJQUFNLGNBQWMsQ0FDbEIsS0FDQSxZQUNBLFlBQ0c7QUFDSCxNQUFJO0FBRUosUUFBTSxVQUFVLG9CQUFvQixHQUFHO0FBRXZDLE1BQUk7QUFBUyxXQUFPLFFBQVEsa0JBQUFGLFNBQUksWUFBWSxPQUFPO0FBQ25ELFNBQU87QUFDVDtBQUVPLElBQU0sVUFBVSxDQUNyQixLQUNBLFlBQ0EsWUFDa0I7QUFDbEIsTUFBSSxFQUFFLGVBQWUsc0JBQVU7QUFDN0IsV0FBTztBQUFBLE1BQ0wsTUFBTSx5QkFBeUI7QUFBQSxNQUMvQixPQUFPLEVBQUUsYUFBYSxDQUFDLEVBQUU7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDQSxRQUFNLHFCQUFxQixrQ0FBYztBQUV6QyxRQUFNLGtCQUFrQixlQUFlLE9BQU87QUFFOUMsUUFBTSxRQUFzQixFQUFFLGFBQWEsQ0FBQyxFQUFFO0FBRTlDLFFBQU0sT0FBTyxZQUFZLEtBQUssb0JBQW9CLE9BQU8sZUFBZTtBQUV4RSxTQUFPLEVBQUUsTUFBTSxNQUFNO0FBQ3ZCO0FBRUEsSUFBTSxjQUFjLENBQ2xCLEtBQ0EsWUFDQSxPQUNBLFlBQ0c7QUFDSCxRQUFNLFdBQVcsWUFBWSxHQUFHO0FBRWhDLFFBQU0sY0FBYyxZQUFZLEtBQUssWUFBWSxPQUFPO0FBRXhELE1BQUksZUFBZSxhQUFhLGlCQUFpQjtBQUMvQyxXQUFPLCtCQUErQixXQUFXO0FBQUEsRUFDbkQ7QUFFQSxRQUFNLGlCQUFpQixDQUFDLFlBQVksT0FBTyxPQUFPO0FBRWxELFVBQVE7QUFBQSxTQUNELGFBQWE7QUFDaEIsYUFBTyxFQUFFLHNCQUFzQixXQUFXLGFBQWE7QUFBQSxJQUN6RDtBQUFBLFNBQ0ssYUFBYTtBQUNoQixhQUFPLEVBQUUsc0JBQXNCLFdBQVcsYUFBYTtBQUFBLElBQ3pEO0FBQUEsU0FDSyxhQUFhO0FBQ2hCLGFBQU8sRUFBRSxzQkFBc0IsV0FBVyxhQUFhO0FBQUEsSUFDekQ7QUFBQSxTQUNLLGNBQWM7QUFDakIsYUFBTyxFQUFFLHNCQUFzQixXQUFXLGNBQWM7QUFBQSxJQUMxRDtBQUFBLFNBQ0ssV0FBVztBQUNkLGFBQU8sRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsTUFBTSxDQUFDO0FBQUEsSUFDN0Q7QUFBQSxTQUNLLGdCQUFnQjtBQUNuQixhQUFPLEVBQUUsc0JBQXNCLFdBQVcsZ0JBQWdCO0FBQUEsSUFDNUQ7QUFBQSxTQUNLLFdBQVc7QUFDZCxhQUFPLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxDQUFDO0FBQUEsSUFDL0M7QUFBQSxTQUNLLFdBQVc7QUFDZCxhQUFPLEVBQUUsb0JBQW9CO0FBQUEsUUFDM0IsRUFBRSxzQkFBc0IsV0FBVyxXQUFXO0FBQUEsUUFDOUMsRUFBRSxzQkFBc0IsV0FBVyxnQkFBZ0I7QUFBQSxNQUNyRCxDQUFDO0FBQUEsSUFDSDtBQUFBLFNBQ0ssVUFBVTtBQUNiLGFBQU8sRUFBRSxzQkFBc0IsV0FBVyxVQUFVO0FBQUEsSUFDdEQ7QUFBQSxTQUNLLGNBQWM7QUFDakIsYUFBTyx5QkFBeUI7QUFBQSxJQUNsQztBQUFBLFNBQ0ssWUFBWTtBQUNmLGFBQU8sRUFBRSxzQkFBc0IsV0FBVyxZQUFZO0FBQUEsSUFDeEQ7QUFBQSxTQUNLLFdBQVc7QUFHZCxVQUFJLENBQUM7QUFBYSxlQUFPLDhCQUE4QixVQUFVO0FBQ2pFO0FBQUEsSUFDRjtBQUFBLFNBQ0ssY0FBYztBQUVqQixVQUFJO0FBRUosWUFBTSxlQUFlLGdCQUFnQixHQUFHO0FBQ3hDLGNBQVEsT0FBTztBQUFBLGFBQ1IsVUFBVTtBQUNiLG9CQUFVLEVBQUUscUJBQXFCLFlBQVk7QUFDN0M7QUFBQSxRQUNGO0FBQUEsYUFDSyxXQUFXO0FBQ2Qsb0JBQVUsaUJBQWlCLE9BQU8sRUFBRSxXQUFXLElBQUksRUFBRSxZQUFZO0FBQ2pFO0FBQUEsUUFDRjtBQUFBLGlCQUNTO0FBQ1Asb0JBQVUsRUFBRSxvQkFBb0IsWUFBWTtBQUM1QztBQUFBLFFBQ0Y7QUFBQTtBQUdGLGFBQU8sRUFBRSxzQkFBc0IsT0FBTztBQUFBLElBQ3hDO0FBQUEsU0FDSyxhQUFhO0FBQ2hCLFlBQU0sUUFBUSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLFlBQU0sYUFBYSxPQUFPLFFBQVEsS0FBSztBQUV2QyxZQUFNLFVBQTRCLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU07QUFDakUsY0FBTSxjQUFjO0FBQ3BCLGNBQU0sT0FBTyxZQUFZLGFBQWEsR0FBRyxjQUFjO0FBRXZELGNBQU0sc0JBQXNCLFlBQVksV0FBVztBQUNuRCxjQUFNLGFBQ0osd0JBQXdCLGlCQUFpQixZQUFZLFdBQVc7QUFFbEUsY0FBTSxvQkFBb0IsRUFBRTtBQUFBLFVBQzFCO0FBQUEsVUFDQSw2QkFBNkIsR0FBRztBQUFBLFVBQ2hDLGFBQWEsRUFBRSxZQUFZLFdBQVcsYUFBYSxJQUFJO0FBQUEsVUFDdkQ7QUFBQSxRQUNGO0FBRUEsWUFBSSxZQUFZLGFBQWE7QUFDM0IsMEJBQWdCLG1CQUFtQixZQUFZLFdBQVc7QUFBQSxRQUM1RDtBQUVBLGVBQU87QUFBQSxNQUNULENBQUM7QUFDRCxhQUFPLEVBQUUsc0JBQXNCLE9BQU87QUFBQSxJQUN4QztBQUFBLFNBRUssWUFBWTtBQUNmLFlBQU0sWUFBWSxhQUFhLEdBQUc7QUFDbEMsWUFBTSxPQUFPLFlBQ1QsWUFBWSxXQUFXLEdBQUcsY0FBYyxJQUN4Qyx5QkFBeUI7QUFDN0IsWUFBTSxPQUFPLEVBQUUsb0JBQW9CLElBQUk7QUFDdkMsYUFBTztBQUFBLElBQ1Q7QUFBQSxTQUVLLFdBQVc7QUFFZCxZQUFNLFNBQVMsY0FBYyxHQUFHO0FBQ2hDLFlBQU0sY0FBYyxNQUFNLFFBQVEsTUFBTSxJQUFJLFNBQVMsT0FBTyxPQUFPLE1BQU07QUFDekUsWUFBTSxRQUFRLFlBQVk7QUFBQSxRQUFJLENBQUMsVUFDN0IsRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsS0FBSyxDQUFDO0FBQUEsTUFDdEQ7QUFDQSxhQUFPLEVBQUUsb0JBQW9CLEtBQUs7QUFBQSxJQUNwQztBQUFBLFNBRUssWUFBWTtBQUVmLFlBQU0sZUFBZSxnQkFBZ0IsR0FBRztBQUN4QyxZQUFNLFFBQXVCLGFBQWE7QUFBQSxRQUFJLENBQUMsV0FDN0MsWUFBWSxRQUFRLEdBQUcsY0FBYztBQUFBLE1BQ3ZDO0FBQ0EsYUFBTyxFQUFFLG9CQUFvQixLQUFLO0FBQUEsSUFDcEM7QUFBQSxTQUVLLHlCQUF5QjtBQUU1QixZQUFNLGVBQWUsZ0JBQWdCLEdBQUc7QUFDeEMsWUFBTSxRQUF1QixhQUFhO0FBQUEsUUFBSSxDQUFDLFdBQzdDLFlBQVksUUFBUSxHQUFHLGNBQWM7QUFBQSxNQUN2QztBQUNBLGFBQU8sRUFBRSxvQkFBb0IsS0FBSztBQUFBLElBQ3BDO0FBQUEsU0FFSyxjQUFjO0FBRWpCLFlBQU0sZ0JBQWdCLGlCQUFpQixHQUFHO0FBQzFDLFVBQUksQ0FBQztBQUFlLGVBQU8seUJBQXlCO0FBQ3BELFlBQU0sT0FBTyxZQUFZLGVBQWUsR0FBRyxjQUFjO0FBQ3pELGFBQU87QUFBQSxJQUNUO0FBQUEsU0FFSyxpQkFBaUI7QUFDcEIsWUFBTSxPQUFPO0FBQ2IsWUFBTSxhQUFhLGNBQWMsR0FBRztBQUNwQyxZQUFNLGdCQUNKLE9BQU8sZUFBZSxZQUFZLENBQUMsTUFBTSxRQUFRLFVBQVUsSUFDdkQsYUFDQSxDQUFDO0FBRVAsVUFBSSxRQUFRLGdCQUFnQixTQUFTO0FBRW5DLFlBQUk7QUFBTSxpQkFBTywrQkFBK0IsSUFBSTtBQUVwRCxjQUFNLFFBQVEsT0FBTyxPQUFPLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVTtBQUN4RCxjQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLG1CQUFPLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEtBQUssQ0FBQztBQUFBLFVBQzlEO0FBQ0EsaUJBQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsS0FBZSxDQUFDO0FBQUEsUUFDdkUsQ0FBQztBQUNELGVBQU8sRUFBRSxvQkFBb0IsS0FBSztBQUFBLE1BQ3BDO0FBSUEsVUFBSSxDQUFDO0FBQU0sZUFBTyx5QkFBeUI7QUFFM0MsVUFBSSxRQUFRLGdCQUFnQixXQUFXO0FBQ3JDLGNBQU0sY0FBYyxPQUFPO0FBQUEsVUFDekI7QUFBQSxRQUNGLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU07QUFDdEIsZ0JBQU0sVUFDSixPQUFPLFVBQVUsV0FDYixFQUFFLHFCQUFxQixLQUFLLElBQzVCLEVBQUUsb0JBQW9CLEtBQUs7QUFFakMsaUJBQU8sRUFBRSxpQkFBaUIsNkJBQTZCLEdBQUcsR0FBRyxPQUFPO0FBQUEsUUFDdEUsQ0FBQztBQUVELFlBQUksa0JBQUFBLFFBQUcsYUFBYSxJQUFJLEdBQUc7QUFDekIsZ0JBQU0sWUFBWTtBQUFBLFlBQ2hCLEVBQUUsc0JBQXNCLFFBQVcsTUFBTSxXQUFXO0FBQUEsVUFDdEQ7QUFBQSxRQUNGLE9BQU87QUFDTCxnQkFBTSxJQUFJO0FBQUEsWUFDUjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLGFBQU8sK0JBQStCLElBQUk7QUFBQSxJQUM1QztBQUFBLFNBRUssZUFBZTtBQUNsQixZQUFNLFFBQVEsYUFBYSxHQUFHO0FBQzlCLFVBQUksQ0FBQztBQUFPLGVBQU8seUJBQXlCO0FBQzVDLFlBQU0sWUFBWSxZQUFZLE9BQU8sR0FBRyxjQUFjO0FBQ3RELGFBQU8sRUFBRSxvQkFBb0I7QUFBQSxRQUMzQjtBQUFBLFFBQ0EsRUFBRSxzQkFBc0IsV0FBVyxnQkFBZ0I7QUFBQSxNQUNyRCxDQUFDO0FBQUEsSUFDSDtBQUFBLFNBRUssZUFBZTtBQUNsQixZQUFNLFFBQVEsYUFBYSxHQUFHO0FBQzlCLFVBQUksQ0FBQztBQUFPLGVBQU8seUJBQXlCO0FBQzVDLFlBQU0sWUFBWSxZQUFZLE9BQU8sR0FBRyxjQUFjO0FBQ3RELGFBQU8sRUFBRSxvQkFBb0I7QUFBQSxRQUMzQjtBQUFBLFFBQ0EsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLENBQUM7QUFBQSxNQUN4QyxDQUFDO0FBQUEsSUFDSDtBQUFBLFNBRUssWUFBWTtBQUVmLFlBQU0sUUFBUSxjQUFjLEdBQUc7QUFDL0IsWUFBTSxRQUFRLE1BQU07QUFBQSxRQUFJLENBQUMsV0FDdkIsWUFBWSxRQUFRLEdBQUcsY0FBYztBQUFBLE1BQ3ZDO0FBQ0EsYUFBTyxFQUFFLG9CQUFvQixLQUFLO0FBQUEsSUFDcEM7QUFBQSxTQUVLLGFBQWE7QUFFaEIsWUFBTSxrQkFBa0IsbUJBQW1CLEdBQUc7QUFDOUMsWUFBTSxZQUFZLGtCQUNkLFlBQVksaUJBQWlCLEdBQUcsY0FBYyxJQUM5Qyx5QkFBeUI7QUFFN0IsWUFBTSxPQUFPLEVBQUUsc0JBQXNCO0FBQUEsUUFDbkMsRUFBRTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsWUFDRSxFQUFFO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBLEVBQUUsaUJBQWlCLEdBQUc7QUFBQSxjQUN0QjtBQUFBLGNBQ0EsRUFBRSxzQkFBc0IsV0FBVyxhQUFhO0FBQUEsWUFDbEQ7QUFBQSxVQUNGO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGLENBQUM7QUFFRCxhQUFPO0FBQUEsSUFDVDtBQUFBLFNBRUssVUFBVTtBQUViLFlBQU0sRUFBRSxTQUFTLFlBQVksV0FBVyxhQUFhLElBQUksWUFBWSxHQUFHO0FBQ3hFLFlBQU0sWUFBWSxlQUNkLFlBQVksY0FBYyxHQUFHLGNBQWMsSUFDM0MseUJBQXlCO0FBQzdCLFlBQU0sVUFBVSxhQUNaLFlBQVksWUFBWSxHQUFHLGNBQWMsSUFDekMseUJBQXlCO0FBRTdCLFlBQU0sT0FBTyxFQUFFLHdCQUF3QixFQUFFLGlCQUFpQixLQUFLLEdBQUc7QUFBQSxRQUNoRTtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUM7QUFFRCxhQUFPO0FBQUEsSUFDVDtBQUFBLFNBRUssVUFBVTtBQUViLFlBQU0sZUFBZSxnQkFBZ0IsR0FBRztBQUN4QyxZQUFNLE9BQU8sZUFDVCxZQUFZLGNBQWMsR0FBRyxjQUFjLElBQzNDLHlCQUF5QjtBQUU3QixZQUFNLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hFLGFBQU87QUFBQSxJQUNUO0FBQUEsU0FFSyxtQkFBbUI7QUFFdEIsWUFBTSxFQUFFLE1BQU0sZUFBZSxPQUFPLGVBQWUsSUFDakQscUJBQXFCLEdBQUc7QUFDMUIsWUFBTSxPQUFPLGdCQUNULFlBQVksZUFBZSxHQUFHLGNBQWMsSUFDNUMseUJBQXlCO0FBQzdCLFlBQU0sUUFBUSxpQkFDVixZQUFZLGdCQUFnQixHQUFHLGNBQWMsSUFDN0MseUJBQXlCO0FBQzdCLFlBQU0sT0FBTyxFQUFFLDJCQUEyQixDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQ3ZELGFBQU87QUFBQSxJQUNUO0FBQUEsU0FFSyxjQUFjO0FBRWpCLFlBQU0sY0FBYyxlQUFlLEdBQUc7QUFDdEMsWUFBTSxPQUFPLGNBQ1QsWUFBWSxhQUFhLEdBQUcsY0FBYyxJQUMxQyx5QkFBeUI7QUFFN0IsWUFBTSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLFNBQVMsR0FBRztBQUFBLFFBQ3BFO0FBQUEsTUFDRixDQUFDO0FBRUQsYUFBTztBQUFBLElBQ1Q7QUFBQSxTQUVLLGVBQWU7QUFFbEIsWUFBTSxFQUFFLE1BQU0sVUFBVSxTQUFTLFlBQVksSUFBSSxpQkFBaUIsR0FBRztBQUNyRSxZQUFNLFlBQVksV0FBVyxjQUFjLFFBQVEsSUFBSSxDQUFDO0FBQ3hELFlBQU0sZ0JBQWdCLFVBQVU7QUFBQSxRQUM5QixDQUFDLFVBQXNCLFVBQWtCO0FBQ3ZDLGdCQUFNLGVBQWUsWUFBWSxVQUFVLEdBQUcsY0FBYztBQUU1RCxpQkFBTyxFQUFFO0FBQUEsWUFDUDtBQUFBLFlBQ0E7QUFBQSxZQUNBLEVBQUUsaUJBQWlCLFFBQVEsT0FBTztBQUFBLFlBQ2xDO0FBQUEsWUFDQTtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLG9CQUFjO0FBQUEsUUFDWixFQUFFO0FBQUEsVUFDQTtBQUFBLFVBQ0EsRUFBRSxZQUFZLFdBQVcsY0FBYztBQUFBLFVBQ3ZDLEVBQUUsaUJBQWlCLFFBQVEsY0FBYyxRQUFRO0FBQUEsVUFDakQ7QUFBQSxVQUNBLEVBQUUsb0JBQW9CLHlCQUF5QixDQUFDO0FBQUEsUUFDbEQ7QUFBQSxNQUNGO0FBRUEsWUFBTSxhQUFhLGNBQ2YsWUFBWSxhQUFhLEdBQUcsY0FBYyxJQUMxQyx5QkFBeUI7QUFFN0IsWUFBTSxPQUFPLEVBQUU7QUFBQSxRQUNiO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFBQSxTQUVLLGNBQWM7QUFFakIsWUFBTSxlQUFlLGFBQWEsR0FBRztBQUNyQyxVQUFJLENBQUM7QUFBYyxlQUFPLHlCQUF5QjtBQUNuRCxZQUFNLE9BQU8sWUFBWSxjQUFjLEdBQUcsY0FBYztBQUV4RCxZQUFNLGdCQUEyQixDQUFDO0FBRWxDLFdBQUssYUFBYSxDQUFDLFNBQVM7QUFDMUIsWUFBSSxDQUFDLENBQUMsV0FBVyxnQkFBZ0IsRUFBRSxTQUFTLEtBQUssSUFBSSxHQUFHO0FBQ3RELHdCQUFjLEtBQUssSUFBSTtBQUFBLFFBQ3pCO0FBQUEsTUFDRixDQUFDO0FBR0QsV0FBSyxRQUFRO0FBRWIsYUFBTztBQUFBLElBQ1Q7QUFBQTtBQUdGLFNBQU8sRUFBRSxzQkFBc0IsV0FBVyxVQUFVO0FBQ3REOzs7QURubEJBLHNCQUFxQjtBQUNyQixJQUFBRyxjQUE4QjtBQXlCdkIsSUFBTSxxQkFBcUIsT0FBTyxTQUFpQztBQTdCMUU7QUE4QkUsUUFBTSxrQkFBa0IsTUFBTSxxQkFBcUIsSUFBSTtBQUV2RCxRQUFNLGVBQWUsTUFBTSxLQUFLLGdCQUFnQixRQUFRLENBQUMsRUFBRTtBQUFBLElBQUssQ0FBQyxHQUFHLE1BQ2xFLEVBQUUsR0FBRyxNQUFNLGNBQWMsRUFBRSxHQUFHLEtBQUs7QUFBQSxFQUNyQztBQUNBLFFBQU0saUJBQWlCLGFBQWE7QUFBQSxJQUNsQyxDQUFDLENBQUNDLElBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssZ0JBQWdCLEtBQUssYUFBYSxLQUFLO0FBQUEsRUFDbkU7QUFHQSxRQUFNLFlBQXNCLENBQUM7QUFDN0IsYUFBVyxDQUFDQSxJQUFHLEVBQUUsT0FBTyxXQUFXLFlBQVksQ0FBQyxLQUFLLGdCQUFnQjtBQUNuRSxVQUFNLGVBQWMsZUFBVSxnQkFBVixZQUF5QixZQUFZO0FBQ3pELFVBQU0sWUFBWSxPQUFPO0FBQUEsTUFDdkIsVUFBVSxlQUFjLGNBQVMsVUFBVSxXQUFXLE1BQTlCLFlBQW1DLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFDbkU7QUFDQSxVQUFNLGlCQUFpQixVQUFVLE9BQU8sQ0FBQyxRQUFRLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUczRSxRQUFJLGNBQXNDLFVBQVU7QUFDcEQsV0FBTyxhQUFhO0FBQ2xCLFlBQU0sV0FBVyxZQUFZLFdBQVc7QUFDeEMsVUFBSSxhQUFhLGNBQWM7QUFDN0IsY0FBTSxRQUFRLGlCQUFpQixXQUFXO0FBQzFDLFlBQUksT0FBTztBQUNULHdCQUFjO0FBQ2Q7QUFBQSxRQUNGO0FBQUEsTUFDRixXQUFXLGFBQWEsZUFBZTtBQUNyQyxjQUFNLFFBQVEsYUFBYSxXQUFXO0FBQ3RDLFlBQUksT0FBTztBQUNULHdCQUFjO0FBQ2Q7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBO0FBQUEsSUFDRjtBQUVBLFFBQ0UsZUFDQSxVQUFVLGVBQ1YsT0FBUSxZQUFvQixTQUFTLFlBQ3JDO0FBQ0Esb0JBQWUsWUFBb0I7QUFBQSxRQUNqQyxPQUFPLFlBQVksZUFBZSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFBQSxNQUNqRTtBQUFBLElBQ0Y7QUFFQSxjQUFVO0FBQUEsTUFDUjtBQUFBLEdBQ0g7QUFBQSxZQUNTO0FBQUEsWUFDQSxVQUFVLFFBQVEsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUUsS0FBSyxLQUFLO0FBQUEsaUJBQzVDLGNBQWMsVUFBVSxRQUFRLFdBQVcsRUFBRSxJQUFJLElBQUk7QUFBQSxjQUVsRSxVQUFVLFdBQVcsVUFBVSxRQUFRLFVBQVUsUUFBUSxFQUFFLElBQUksSUFBSTtBQUFBLGtCQUduRSxVQUFVLGVBQ04sVUFBVSxRQUFRLFVBQVUsWUFBWSxFQUFFLElBQUksSUFDOUM7QUFBQSxjQUdKLFVBQVUsV0FBVyxVQUFVLFFBQVEsVUFBVSxRQUFRLEVBQUUsSUFBSSxJQUFJO0FBQUEsa0JBR25FLFVBQVUsZUFDTjtBQUFBLFFBQ0U7QUFBQSxVQUNFLFlBQVksZUFDVixVQUFVLHdCQUF3QixjQUFFLFlBQ2xDLFVBQVUsYUFBYSxPQUFPLEVBQUUsSUFBSSxjQUFFLFFBQVEsRUFBRSxDQUFDLElBQ2pELFVBQVU7QUFBQSxRQUNoQixFQUFFO0FBQUEsTUFDSixJQUNBO0FBQUEsaUJBRVMsb0NBQWU7QUFBQSxHQUM3QixLQUFLO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFDQSxRQUFNLGNBQWMsVUFBVSxLQUFLLEtBQUs7QUFDeEMsUUFBTSxTQUFTLE1BQU0sZ0JBQUFDLFFBQVM7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV0EsS0FBSztBQUFBLElBQ0gsRUFBRSxNQUFNLE9BQU8sUUFBUSxhQUFhO0FBQUEsRUFDdEM7QUFFQSxNQUFJLEtBQUssWUFBWTtBQUNuQixVQUFTLGNBQVUsS0FBSyxZQUFZLE1BQU07QUFBQSxFQUM1QztBQUVBLFNBQU87QUFDVDs7O0FFdElBO0FBQUEsSUFBQUMsTUFBb0I7QUFDcEIseUJBQW1CO0FBQ25CLElBQUFDLG9CQUFpQjtBQUNqQixzQkFBb0M7QUFDcEMsY0FBeUI7QUFzQmxCLElBQU0sb0JBQW9CLE9BQU8sU0FBaUM7QUExQnpFO0FBMkJFLFFBQU0sRUFBRSxZQUFZLFdBQVcscUJBQXFCLElBQUk7QUFDeEQsUUFBTSxlQUFlLGtCQUFBQyxRQUFLLE1BQU0sS0FBSyxZQUFZLFFBQVE7QUFFekQsUUFBTSxVQUFVLElBQUksd0JBQVEsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEtBQUssRUFBRSxDQUFDO0FBRXRFLFFBQU0sUUFBa0IsQ0FBQztBQUN6QixhQUFXLGNBQWMsUUFBUSxzQkFBc0IsWUFBWSxHQUFHO0FBQ3BFLFVBQU0sZ0JBQWdCLFdBQVc7QUFBQSxNQUMvQixDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWU7QUFBQSxJQUMzQjtBQUNBLFFBQUksQ0FBQyxlQUFlO0FBQ2xCO0FBQUEsSUFDRjtBQUVBLFVBQU0sMkJBQTJCLGNBQzlCLGNBQWMsRUFDZCxPQUFPLDJCQUFXLGNBQWM7QUFDbkMsUUFBSSxDQUFDLDBCQUEwQjtBQUM3QjtBQUFBLElBQ0Y7QUFDQSxVQUFNLG9CQUFvQix5QkFDdkIsY0FBYyxFQUNkLE9BQU8sMkJBQVcsY0FBYztBQUNuQyxRQUFJLENBQUMsbUJBQW1CO0FBQ3RCO0FBQUEsSUFDRjtBQUVBLFVBQU0sQ0FBQyxTQUFTLElBQUksa0JBQWtCLGFBQWE7QUFDbkQsUUFBSSxDQUFDLFdBQVc7QUFDZDtBQUFBLElBQ0Y7QUFFQSxlQUFXO0FBQUEsTUFDVCxxQ0FBcUMsVUFBVSxRQUFRO0FBQUEsSUFDekQ7QUFFQSxrQkFBYyxPQUFPO0FBSXJCLFFBQUk7QUFDSixPQUFHO0FBQ0Qsa0JBQVksV0FBVyxhQUFhO0FBRXBDLGlCQUFXLHFCQUFxQjtBQUFBLElBQ2xDLFNBQVMsY0FBYyxXQUFXLGFBQWE7QUFFL0MsVUFBTSxxQkFBcUIsa0JBQUFBLFFBQUssUUFBUSxVQUFVO0FBQ2xELFVBQU0sZUFBZSxrQkFBQUEsUUFBSztBQUFBLE1BQ3hCO0FBQUEsTUFDQSxXQUFXLFlBQVk7QUFBQSxJQUN6QjtBQUNBLFVBQU0sS0FBSyxZQUFZO0FBQUEsRUFDekI7QUFFQSxRQUFNLFdBQW1DLENBQUM7QUFDMUMsYUFBV0EsU0FBUSxPQUFPO0FBRXhCLGFBQVNBLFNBQ1AsU0FBUyxtQkFBQUMsUUFBTyxXQUFXLFFBQVEsRUFBRSxPQUFPRCxLQUFJLEVBQUUsT0FBTyxLQUFLO0FBQUEsRUFDbEU7QUFFQSxRQUFNLG9CQUFvQjtBQUFBLElBQ3hCLE1BQ0MsSUFBSSxDQUFDLE1BQU0saUNBQWlDLFNBQVMsZUFBZSxJQUFJLEVBQ3hFLEtBQUssSUFBSTtBQUFBO0FBQUE7QUFBQSxNQUdSLE1BQ0MsSUFBSSxDQUFDLE1BQU07QUFoR2xCLFFBQUFFO0FBaUdRLFVBQU0sY0FDSkEsTUFBQSxLQUFLLDJCQUFMLE9BQUFBLE1BQ0EsOEJBQThCLEtBQUssU0FBUyxHQUM1QyxDQUFDO0FBRUgsV0FBTyxJQUFJLGVBQWUsU0FBUztBQUFBLEVBQ3JDLENBQUMsRUFDQSxLQUFLLEtBQUs7QUFBQTtBQUFBO0FBS2YsTUFBSSxLQUFLLHVCQUF1QjtBQUM5QixZQUFRLHNCQUFzQixLQUFLLHFCQUFxQjtBQUFBLEVBQzFEO0FBR0EsUUFBTSxhQUFhLFFBQVE7QUFBQSxJQUN6QjtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTSxhQUFhLFdBQVcsY0FBYyxFQUFFLGtCQUFrQixLQUFLLENBQUM7QUFDdEUsTUFBSSxLQUFLLFlBQVk7QUFDbkIsVUFBTSxzQkFBc0Isa0JBQUFGLFFBQUs7QUFBQSxNQUMvQixrQkFBQUEsUUFBSyxRQUFRLEtBQUssVUFBVTtBQUFBLE1BQzVCLGtCQUFBQSxRQUFLLFNBQVMsS0FBSyxVQUFVLEVBQUUsUUFBUSxRQUFRLEVBQUUsRUFBRSxRQUFRLE9BQU8sRUFBRSxJQUNsRTtBQUFBLElBQ0o7QUFDQSxVQUFTO0FBQUEsTUFDUDtBQUFBLE1BQ0EsV0FBVyxlQUFlLEVBQUUsR0FBRyxRQUFRO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBR0EsUUFBTSxTQUFTLE1BQVM7QUFBQSxJQUN0QixrQkFBQUEsUUFBSyxLQUFLLFlBQVksY0FBYztBQUFBLElBQ3BDO0FBQUEsRUFDRjtBQUNBLFFBQU0sTUFBTSxLQUFLLE1BQU0sTUFBTTtBQUU3QixRQUFjLGNBQU07QUFBQSxJQUNsQixHQUFHLEtBQUs7QUFBQSxJQUNSLE9BQU87QUFBQSxNQUNMLFVBQVU7QUFBQSxNQUNWLFlBQVksa0JBQUFBLFFBQUssUUFBUSxVQUFVO0FBQUEsSUFDckM7QUFBQSxJQUNBLFNBQVMsS0FBSztBQUFBLElBQ2QsUUFBUTtBQUFBLElBQ1IsVUFBVTtBQUFBLElBQ1YsUUFBUTtBQUFBLElBQ1IsYUFBYTtBQUFBLElBQ2IsVUFBVTtBQUFBLE1BQ1IsR0FBRyxPQUFPLEtBQUssSUFBSSxZQUFZO0FBQUEsTUFDL0IsR0FBRyxPQUFPLEtBQUssSUFBSSxlQUFlO0FBQUEsTUFDbEMsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsYUFBckIsWUFBaUMsQ0FBQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFFUDtBQUFBLFFBQ0UsTUFBTTtBQUFBLFFBQ04sTUFBTUcsUUFBTztBQUNYLFVBQUFBLE9BQU0sT0FBTyxFQUFFLFFBQVEsS0FBSyxHQUFHLENBQUMsU0FBUztBQS9KbkQsZ0JBQUFEO0FBZ0tZLGtCQUFNLFlBQVdBLE1BQUEsUUFBUSxjQUFjLEtBQUssSUFBSSxNQUEvQixnQkFBQUEsSUFBa0M7QUFDbkQsZ0JBQUksQ0FBQyxVQUFVO0FBQ2IscUJBQU87QUFBQSxnQkFDTCxVQUFVO0FBQUEsZ0JBQ1YsUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBRUEsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQSxRQUFRO0FBQUEsY0FDUixZQUFZLGtCQUFBRixRQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDcEM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsWUFBckIsWUFBZ0MsQ0FBQztBQUFBLElBQ3ZDO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiLCAib3MiLCAidHR5IiwgInN0eWxlcyIsICJjaGFsayIsICJtb2R1bGUiLCAibWVyZ2UyIiwgIm9zIiwgInBhdGgiLCAicGF0dGVybiIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJzbGFzaCIsICJnbG9iYnkiLCAibm9kZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJwYXR0ZXJuIiwgIm1heCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInBhcnNlIiwgImluZGV4IiwgIm1vZHVsZSIsICJwYXJzZSIsICJwYXR0ZXJuIiwgInJlcXVpcmVfY29uc3RhbnRzIiwgIm1vZHVsZSIsICJwYXRoIiwgInJlcXVpcmVfdXRpbHMiLCAicGF0aCIsICJtb2R1bGUiLCAicmVxdWlyZV9wYXJzZSIsICJtb2R1bGUiLCAicGFyc2UiLCAib3B0cyIsICJ2YWx1ZSIsICJyZXN0IiwgInNvdXJjZSIsICJtb2R1bGUiLCAicGF0aCIsICJwYXJzZSIsICJzdGF0ZSIsICJyZWdleCIsICJwYXR0ZXJuIiwgInJlcXVpcmVfcGljb21hdGNoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicGF0dGVybiIsICJyZWdleCIsICJwYXRoIiwgInBhdHRlcm4iLCAiaXNEeW5hbWljUGF0dGVybiIsICJpc05lZ2F0aXZlUGF0dGVybiIsICJtZXJnZTIiLCAicmVxdWlyZV91dGlscyIsICJmcyIsICJwYXRoIiwgInBhdHRlcm4iLCAicGF0dGVybiIsICJwYXRoIiwgInBhdGgiLCAicmVxdWlyZV9mcyIsICJmcyIsICJmcyIsICJwYXRoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicXVldWVNaWNyb3Rhc2siLCAicmVxdWlyZV9jb25zdGFudHMiLCAicmVxdWlyZV9mcyIsICJyZXF1aXJlX3V0aWxzIiwgImZzIiwgInJlcXVpcmVfYXN5bmMiLCAicGF0aCIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9mcyIsICJmcyIsICJyZXF1aXJlX3NldHRpbmdzIiwgInBhdGgiLCAiZnMiLCAicmVxdWlyZV9vdXQiLCAicGF0aCIsICJtb2R1bGUiLCAibW9kdWxlIiwgInJlcXVpcmVfY29tbW9uIiwgInJlcXVpcmVfYXN5bmMiLCAicmVxdWlyZV9hc3luYyIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zeW5jIiwgInJlcXVpcmVfc2V0dGluZ3MiLCAicGF0aCIsICJyZXF1aXJlX291dCIsICJyZXF1aXJlX3JlYWRlciIsICJwYXRoIiwgInBhdHRlcm4iLCAicmVxdWlyZV9zdHJlYW0iLCAicGF0dGVybiIsICJyZXF1aXJlX2FzeW5jIiwgInBhdHRlcm4iLCAicGF0dGVybiIsICJyZXF1aXJlX2VudHJ5IiwgInBhdGgiLCAicmVxdWlyZV9hc3luYyIsICJyZXF1aXJlX3N0cmVhbSIsICJyZXF1aXJlX3N5bmMiLCAicGF0dGVybiIsICJyZXF1aXJlX3N5bmMiLCAicmVxdWlyZV9zZXR0aW5ncyIsICJmcyIsICJvcyIsICJyZXF1aXJlX291dCIsICJtb2R1bGUiLCAiYXNzZXJ0UGF0dGVybnNJbnB1dCIsICJGYXN0R2xvYiIsICJnZW5lcmF0ZVRhc2tzIiwgImlzRHluYW1pY1BhdHRlcm4iLCAicG9zaXgiLCAiZXNjYXBlUGF0aCIsICJjb252ZXJ0UGF0aFRvUGF0dGVybiIsICJ3aW4zMiIsICJmcyIsICJtb2R1bGUiLCAicGF0aCIsICJtb2R1bGUiLCAiXyIsICJwYXR0ZXJuIiwgInJlZ2V4IiwgInBhdGgiLCAicGF0aCIsICJpbml0X3V0aWxpdGllcyIsICJwYXR0ZXJuIiwgImltcG9ydF9ub2RlX3Byb2Nlc3MiLCAiaW5pdF91dGlsaXRpZXMiLCAicGF0dGVybiIsICJwYXRoIiwgImdpdElnbm9yZSIsICJwcm9jZXNzIiwgImZhc3RHbG9iIiwgImZzIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJub3JtYWxpemVPcHRpb25zIiwgImluaXRfdXRpbGl0aWVzIiwgInBhdHRlcm4iLCAiZnMiLCAicGF0aCIsICJub2RlUGF0aCIsICJtZXJnZTIiLCAicGF0dGVybnMiLCAib3B0aW9ucyIsICJkaXJHbG9iIiwgImZhc3RHbG9iIiwgImltcG9ydF96b2QiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJwYXRoIiwgImNoYWxrIiwgImdsb2JieSIsICJwYXRoIiwgImRlZGVudCIsICJfIiwgInBhdGgiLCAiaW1wb3J0X2RlZGVudCIsICJwYXRoIiwgImNoYWxrIiwgImRlZGVudCIsICJfYSIsICJmcyIsICJmcyIsICJpbXBvcnRfem9kIiwgImltcG9ydF9kZWRlbnQiLCAidHMiLCAicGFyc2VEZXNjcmlwdGlvbiIsICJkZWRlbnQiLCAiaW1wb3J0X3pvZCIsICJfIiwgInByZXR0aWVyIiwgImZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAicGF0aCIsICJjcnlwdG8iLCAiX2EiLCAiYnVpbGQiXQp9Cg==