@fgv/ts-json 1.0.1 → 1.8.1

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.
package/jsonConverter.js CHANGED
@@ -140,7 +140,7 @@ class JsonEditorConverter extends ts_utils_1.BaseConverter {
140
140
  * @param editor
141
141
  */
142
142
  static createWithEditor(editor) {
143
- return ts_utils_1.captureResult(() => new JsonEditorConverter(editor));
143
+ return (0, ts_utils_1.captureResult)(() => new JsonEditorConverter(editor));
144
144
  }
145
145
  /**
146
146
  * Gets a derived converter which fails if the resulting converted
@@ -148,10 +148,10 @@ class JsonEditorConverter extends ts_utils_1.BaseConverter {
148
148
  */
149
149
  object() {
150
150
  return this.map((jv) => {
151
- if (!common_1.isJsonObject(jv)) {
152
- return ts_utils_1.fail(`Cannot convert "${JSON.stringify(jv)}" to JSON object.`);
151
+ if (!(0, common_1.isJsonObject)(jv)) {
152
+ return (0, ts_utils_1.fail)(`Cannot convert "${JSON.stringify(jv)}" to JSON object.`);
153
153
  }
154
- return ts_utils_1.succeed(jv);
154
+ return (0, ts_utils_1.succeed)(jv);
155
155
  });
156
156
  }
157
157
  /**
@@ -161,9 +161,9 @@ class JsonEditorConverter extends ts_utils_1.BaseConverter {
161
161
  array() {
162
162
  return this.map((jv) => {
163
163
  if ((!Array.isArray(jv)) || (typeof jv !== 'object')) {
164
- return ts_utils_1.fail(`Cannot convert "${JSON.stringify(jv)}" to JSON array.`);
164
+ return (0, ts_utils_1.fail)(`Cannot convert "${JSON.stringify(jv)}" to JSON array.`);
165
165
  }
166
- return ts_utils_1.succeed(jv);
166
+ return (0, ts_utils_1.succeed)(jv);
167
167
  });
168
168
  }
169
169
  _convert(from, context) {
@@ -181,17 +181,17 @@ class JsonConverter extends JsonEditorConverter {
181
181
  * @param options Optional options to configure the converter
182
182
  */
183
183
  constructor(options) {
184
- const editor = converterOptionsToEditor(options).getValueOrThrow();
184
+ const editor = converterOptionsToEditor(options).orThrow();
185
185
  super(editor);
186
186
  }
187
187
  /**
188
188
  * Creates a new converter.
189
- * @param options Optional options to conifgure the converter
189
+ * @param options Optional options to configure the converter
190
190
  * @returns Success with a new JsonConverter on success, or Failure with an
191
191
  * informative message if an error occurs.
192
192
  */
193
193
  static create(options) {
194
- return ts_utils_1.captureResult(() => new JsonConverter(options));
194
+ return (0, ts_utils_1.captureResult)(() => new JsonConverter(options));
195
195
  }
196
196
  }
197
197
  exports.JsonConverter = JsonConverter;
@@ -208,7 +208,7 @@ class TemplatedJsonConverter extends JsonEditorConverter {
208
208
  */
209
209
  constructor(options) {
210
210
  options = { ...options, ...TemplatedJsonConverter.templateOptions };
211
- const editor = converterOptionsToEditor(options).getValueOrThrow();
211
+ const editor = converterOptionsToEditor(options).orThrow();
212
212
  super(editor);
213
213
  }
214
214
  /**
@@ -217,7 +217,7 @@ class TemplatedJsonConverter extends JsonEditorConverter {
217
217
  * @param options Optional configuration or context for the converter
218
218
  */
219
219
  static create(options) {
220
- return ts_utils_1.captureResult(() => new TemplatedJsonConverter(options));
220
+ return (0, ts_utils_1.captureResult)(() => new TemplatedJsonConverter(options));
221
221
  }
222
222
  }
223
223
  exports.TemplatedJsonConverter = TemplatedJsonConverter;
@@ -241,7 +241,7 @@ class ConditionalJsonConverter extends JsonEditorConverter {
241
241
  */
242
242
  constructor(options) {
243
243
  options = { ...options, ...ConditionalJsonConverter.conditionalOptions };
244
- const editor = converterOptionsToEditor(options).getValueOrThrow();
244
+ const editor = converterOptionsToEditor(options).orThrow();
245
245
  super(editor);
246
246
  }
247
247
  /**
@@ -250,7 +250,7 @@ class ConditionalJsonConverter extends JsonEditorConverter {
250
250
  * @param options Optional configuration or context for the converter
251
251
  */
252
252
  static create(options) {
253
- return ts_utils_1.captureResult(() => new ConditionalJsonConverter(options));
253
+ return (0, ts_utils_1.captureResult)(() => new ConditionalJsonConverter(options));
254
254
  }
255
255
  }
256
256
  exports.ConditionalJsonConverter = ConditionalJsonConverter;
@@ -272,7 +272,7 @@ class RichJsonConverter extends JsonEditorConverter {
272
272
  */
273
273
  constructor(options) {
274
274
  options = { ...options, ...RichJsonConverter.richOptions };
275
- const editor = converterOptionsToEditor(options).getValueOrThrow();
275
+ const editor = converterOptionsToEditor(options).orThrow();
276
276
  super(editor);
277
277
  }
278
278
  /**
@@ -281,7 +281,7 @@ class RichJsonConverter extends JsonEditorConverter {
281
281
  * @param options Optional configuration or context for the converter
282
282
  */
283
283
  static create(options) {
284
- return ts_utils_1.captureResult(() => new RichJsonConverter(options));
284
+ return (0, ts_utils_1.captureResult)(() => new RichJsonConverter(options));
285
285
  }
286
286
  }
287
287
  exports.RichJsonConverter = RichJsonConverter;
@@ -289,4 +289,4 @@ RichJsonConverter.richOptions = {
289
289
  ...ConditionalJsonConverter.conditionalOptions,
290
290
  useReferences: true,
291
291
  };
292
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9qc29uQ29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7OztBQUVILDRDQU91QjtBQUN2Qiw4Q0FLNEI7QUFDNUIscUNBQTBFO0FBQzFFLCtDQU11QjtBQUV2Qix3REFBcUQ7QUErR3JEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGdDQUFnQyxDQUFDLE9BQXVDOztJQUNwRixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLElBQUksTUFBSyxTQUFTLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLElBQUksTUFBSyxTQUFTLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLCtCQUFpQixDQUFDO0lBQ2hHLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsZ0JBQWdCLG1DQUFJLFFBQVEsQ0FBQyxDQUFDO0lBQzdELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxtQkFBbUIsbUNBQUksWUFBWSxDQUFDLENBQUM7SUFFekUsTUFBTSxPQUFPLEdBQXlCO1FBQ2xDLGlCQUFpQixFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGlCQUFpQixtQ0FBSSxRQUFRO1FBQ3pE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dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIEJhc2VDb252ZXJ0ZXIsXG4gICAgQ29udmVydGVyLFxuICAgIFJlc3VsdCxcbiAgICBjYXB0dXJlUmVzdWx0LFxuICAgIGZhaWwsXG4gICAgc3VjY2VlZCxcbn0gZnJvbSAnQGZndi90cy11dGlscyc7XG5pbXBvcnQge1xuICAgIENvbmRpdGlvbmFsSnNvbkVkaXRvclJ1bGUsXG4gICAgTXVsdGlWYWx1ZUpzb25FZGl0b3JSdWxlLFxuICAgIFJlZmVyZW5jZUpzb25FZGl0b3JSdWxlLFxuICAgIFRlbXBsYXRlZEpzb25FZGl0b3JSdWxlLFxufSBmcm9tICcuL2pzb25FZGl0b3IvcnVsZXMnO1xuaW1wb3J0IHsgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uVmFsdWUsIGlzSnNvbk9iamVjdCB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7XG4gICAgSnNvbkNvbnRleHQsXG4gICAgSnNvblJlZmVyZW5jZU1hcCxcbiAgICBUZW1wbGF0ZVZhcnMsXG4gICAgVGVtcGxhdGVWYXJzRXh0ZW5kRnVuY3Rpb24sXG4gICAgZGVmYXVsdEV4dGVuZFZhcnMsXG59IGZyb20gJy4vanNvbkNvbnRleHQnO1xuXG5pbXBvcnQgeyBKc29uRWRpdG9yIH0gZnJvbSAnLi9qc29uRWRpdG9yL2pzb25FZGl0b3InO1xuaW1wb3J0IHsgSnNvbkVkaXRvck9wdGlvbnMgfSBmcm9tICcuL2pzb25FZGl0b3IvanNvbkVkaXRvclN0YXRlJztcbmltcG9ydCB7IEpzb25FZGl0b3JSdWxlIH0gZnJvbSAnLi9qc29uRWRpdG9yL2pzb25FZGl0b3JSdWxlJztcblxuLyoqXG4gKiBDb252ZXJzaW9uIG9wdGlvbnMgZm9yIEpzb25Db252ZXJ0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uQ29udmVydGVyT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSBhbmQgaWYgdGVtcGxhdGUgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUsXG4gICAgICogdGhlbiBzdHJpbmcgcHJvcGVydHkgdmFsdWVzIHdpbGwgYmUgcmVuZGVyZWQgdXNpbmdcbiAgICAgKiBtdXN0YWNoZSBhbmQgdGhvc2UgdmFyaWFibGVzLiBPdGhlcndpc2Ugc3RyaW5nIHByb3BlcnRpZXNcbiAgICAgKiBhcmUgY29waWVkIHdpdGhvdXQgbW9kaWZpY2F0aW9uLlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gdHJ1ZSBpZiB2YXJzIGFyZSBzdXBwbGllZCB3aXRoIG9wdGlvbnMsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHVzZVZhbHVlVGVtcGxhdGVzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSBhbmQgaWYgdGVtcGxhdGUgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUsXG4gICAgICogdGhlbiBzdHJpbmcgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSByZW5kZXJlZCB1c2luZ1xuICAgICAqIG11c3RhY2hlIGFuZCB0aG9zZSB2YXJpYWJsZXMuIE90aGVyd2lzZSBzdHJpbmcgcHJvcGVydGllc1xuICAgICAqIGFyZSBjb3BpZWQgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0cyB0byB0cnVlIGlmIHZhcnMgYXJlIHN1cHBsaWVkIHdpdGggb3B0aW9ucyxcbiAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlTmFtZVRlbXBsYXRlczogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIElmIHRydWUgYW5kIGlmIHRlbXBsYXRlIHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlLFxuICAgICAqIHRoZW4gc3RyaW5nIHByb3BlcnR5IG5hbWVzIHdpbGwgYmUgY29uc2lkZXJlZCBmb3JcbiAgICAgKiBjb25kaXRpb25hbHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IGlzIHRvIG1hdGNoIHVzZU5hbWVUZW1wbGF0ZXNcbiAgICAgKi9cbiAgICB1c2VDb25kaXRpb25hbE5hbWVzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlbiBwcm9wZXJ0aWVzIHdpdGggdW5jb25kaXRpb25hbCBuYW1lc1xuICAgICAqICh3aGljaCBzdGFydCB3aXRoICEpIGFyZSBmbGF0dGVuZWQuXG4gICAgICovXG4gICAgZmxhdHRlblVuY29uZGl0aW9uYWxWYWx1ZXM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlIGFuZCBpZiBib3RoIHRlbXBsYXRlIHZhcmlhYmxlcyBhbmQgYVxuICAgICAqIGNvbnRleHQgZGVyaXZhdGlvbiBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRoZW4gcHJvcGVydGllc1xuICAgICAqIHdoaWNoIG1hdGNoIHRoZSBtdWx0aS12YWx1ZSBuYW1lIHBhdHRlcm4gd2lsbCBiZSBleHBhbmRlZC5cbiAgICAgKiBEZWZhdWx0IG1hdGNoZXMgdXNlTmFtZVRlbXBsYXRlcy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgaXMgdHJ1ZSB1bmxlc3MgZXh0ZW5kVmFycyBpcyBleHBsaWNpdGx5IHNldCB0b1xuICAgICAqIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICB1c2VNdWx0aVZhbHVlVGVtcGxhdGVOYW1lczogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YXJpYWJsZXMgKG11c3RhY2hlIHZpZXcpIHVzZWQgdG8gcmVuZGVyIHRlbXBsYXRlZCBzdHJpbmcgbmFtZXNcbiAgICAgKiBhbmQgcHJvcGVydGllcy4gIFNlZSB0aGUgbXVzdGFjaGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvZiBtdXN0YWNoZVxuICAgICAqIHN5bnRheCBhbmQgdGhlIHRlbXBsYXRlIHZpZXcuXG4gICAgICovXG4gICAgdmFycz86IFRlbXBsYXRlVmFycztcblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCB1c2VkIHRvIGV4dGVuZCB2YXJpYWJsZXMgZm9yIGNoaWxkcmVuIG9mIGFuIGFycmF5IG5vZGUgZHVyaW5nXG4gICAgICogZXhwYW5zaW9uLiBEZWZhdWx0IGlzIHRvIHVzZSBhIGJ1aWx0LWluIGV4dGVuc2lvbiBmdW5jdGlvbiB1bmxlc3NcbiAgICAgKiBleHRlbmRWYXJzIGlzIGV4cGxpY2l0bHkgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBleHRlbmRWYXJzPzogVGVtcGxhdGVWYXJzRXh0ZW5kRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlIGFuZCBpZiBhIHJlZmVyZW5jZXMgbWFwIGlzIHN1cHBsaWVkLCB0aGVuXG4gICAgICogcmVmZXJlbmNlcyBpbiB0aGUgc291cmNlIG9iamVjdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGhcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IGlzIHRydWUgaWYgcmVmcyBhcmUgcHJlc2VudCBpbiBvcHRpb25zLCBmYWxzZVxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB1c2VSZWZlcmVuY2VzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgb2JqZWN0IG1hcCB1c2VkIHRvIGluc2VydCBhbnkgcmVmZXJlbmNlcyBpbiB0aGVcbiAgICAgKiBjb252ZXJ0ZWQgSlNPTi5cbiAgICAgKi9cbiAgICByZWZzPzogSnNvblJlZmVyZW5jZU1hcDtcblxuICAgIC8qKlxuICAgICAqIElmIG9uSW52YWxpZFByb3BlcnR5TmFtZSBpcyAnZXJyb3InIChkZWZhdWx0KSB0aGVuIGFueSBwcm9wZXJ0eSBuYW1lXG4gICAgICogdGhhdCBpcyBpbnZhbGlkIGFmdGVyIHRlbXBsYXRlIHJlbmRlcmluZyBjYXVzZXMgYW4gZXJyb3IgYW5kIHN0b3BzXG4gICAgICogY29udmVyc2lvbi4gIElmIG9uSW52YWxpZFByb3BlcnR5TmFtZSBpcyAnaWdub3JlJywgdGhlbiBuYW1lcyB3aGljaFxuICAgICAqIGFyZSBpbnZhbGlkIGFmdGVyIHRlbXBsYXRlIHJlbmRlcmluZyBhcmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uSW52YWxpZFByb3BlcnR5TmFtZTogJ2Vycm9yJ3wnaWdub3JlJztcblxuICAgIC8qKlxuICAgICAqIElmIG9uSW52YWxpZFByb3BlcnR5VmF1bGUgaXMgJ2Vycm9yJyAoZGVmYXVsdCkgdGhlbiBhbnkgaWxsZWdhbFxuICAgICAqIHByb3BlcnR5IHZhbHVlIGNhdXNlcyBhbiBlcnJvciBhbmQgc3RvcHMgY29udmVyc2lvbi4gIElmXG4gICAgICogb25JbnZhbGlkUHJvcGVydHlWYWx1ZSBpcyAnaWdub3JlJyB0aGVuIGFueSBpbnZhbGlkIHByb3BlcnR5XG4gICAgICogdmFsdWVzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICAgICAqL1xuICAgIG9uSW52YWxpZFByb3BlcnR5VmFsdWU6ICdlcnJvcid8J2lnbm9yZSc7XG5cbiAgICAvKipcbiAgICAgKiBJZiBvblVua25vd25Qcm9wZXJ0eVZhbHVlIGlzIGVycm9yLCB0aGVuIGFueSBwcm9wZXJ0eSB3aXRoXG4gICAgICogdmFsdWUgdW5kZWZpbmVkIHdpbGwgY2F1c2UgYW4gZXJyb3IgYW5kIHN0b3AgY29udmVyc2lvbi4gIElmXG4gICAgICogb25VbmRlZmluZWRQcm9wZXJ0eVZhbHVlIGlzICdpZ25vcmUnIChkZWZhdWx0KSB0aGVuIGFueVxuICAgICAqIHByb3BlcnR5IHdpdGggdmFsdWUgdW5kZWZpbmVkIGlzIHNpbGVudGx5IGlnbm9yZWQuXG4gICAgICovXG4gICAgb25VbmRlZmluZWRQcm9wZXJ0eVZhbHVlOiAnZXJyb3InfCdpZ25vcmUnO1xufVxuXG4vKipcbiAqIE1lcmdlcyBhbiBvcHRpb25hbGx5IHN1cHBsaWVkIHBhcnRpYWwgc2V0IG9mIG9wdGlvbnMgd2l0aCB0aGUgZGVmYXVsdFxuICogY29udmVydGVyIG9wdGlvbnMsIHByb2R1Y2luZyBhIGZ1bGx5LXJlc29sdmVkIHNldCBvZiBDb252ZXJ0ZXJPcHRpb25zXG4gKiBhbmQgdGFraW5nIGFsbCBkeW5hbWljIHJ1bGVzIGludG8gYWNjb3VudCAoZS5nLiB0ZW1wbGF0ZSB1c2FnZSBlbmFibGVkXG4gKiBpZiB2YXJpYWJsZXMgYXJlIHN1cHBsaWVkIGFuZCBkaXNhYmxlZCBpZiBub3QpXG4gKiBAcGFyYW0gcGFydGlhbCBBbiBvcHRpb25hbCBwYXJ0aWFsIEBzZWUgSnNvbkNvbnZlcnRlck9wdGlvbnMgdG8gYmUgbWVyZ2VkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZmF1bHRKc29uQ29udmVydGVyT3B0aW9ucyhwYXJ0aWFsPzogUGFydGlhbDxKc29uQ29udmVydGVyT3B0aW9ucz4pOiBKc29uQ29udmVydGVyT3B0aW9ucyB7XG4gICAgY29uc3QgaGF2ZVZhcnMgPSAocGFydGlhbD8udmFycyAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBoYXZlUmVmcyA9IChwYXJ0aWFsPy5yZWZzICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGV4dGVuZGVyID0gcGFydGlhbD8uaGFzT3duUHJvcGVydHkoJ2V4dGVuZFZhcnMnKSA/IHBhcnRpYWwuZXh0ZW5kVmFycyA6IGRlZmF1bHRFeHRlbmRWYXJzO1xuICAgIGNvbnN0IGhhdmVFeHRlbmRlciA9IChleHRlbmRlciAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBuYW1lc0RlZmF1bHQgPSAocGFydGlhbD8udXNlTmFtZVRlbXBsYXRlcyA/PyBoYXZlVmFycyk7XG4gICAgY29uc3QgY29uZGl0aW9uc0RlZmF1bHQgPSAocGFydGlhbD8udXNlQ29uZGl0aW9uYWxOYW1lcyA/PyBuYW1lc0RlZmF1bHQpO1xuXG4gICAgY29uc3Qgb3B0aW9uczogSnNvbkNvbnZlcnRlck9wdGlvbnMgPSB7XG4gICAgICAgIHVzZVZhbHVlVGVtcGxhdGVzOiBwYXJ0aWFsPy51c2VWYWx1ZVRlbXBsYXRlcyA/PyBoYXZlVmFycyxcbiAgICAgICAgdXNlTmFtZVRlbXBsYXRlczogbmFtZXNEZWZhdWx0LFxuICAgICAgICB1c2VDb25kaXRpb25hbE5hbWVzOiBjb25kaXRpb25zRGVmYXVsdCxcbiAgICAgICAgZmxhdHRlblVuY29uZGl0aW9uYWxWYWx1ZXM6IHBhcnRpYWw/LmZsYXR0ZW5VbmNvbmRpdGlvbmFsVmFsdWVzID8/IGNvbmRpdGlvbnNEZWZhdWx0LFxuICAgICAgICB1c2VNdWx0aVZhbHVlVGVtcGxhdGVOYW1lczogcGFydGlhbD8udXNlTXVsdGlWYWx1ZVRlbXBsYXRlTmFtZXMgPz8gKGhhdmVFeHRlbmRlciAmJiBuYW1lc0RlZmF1bHQpLFxuICAgICAgICB1c2VSZWZlcmVuY2VzOiBwYXJ0aWFsPy51c2VSZWZlcmVuY2VzID8/IGhhdmVSZWZzLFxuICAgICAgICBvbkludmFsaWRQcm9wZXJ0eU5hbWU6IHBhcnRpYWw/Lm9uSW52YWxpZFByb3BlcnR5TmFtZSA/PyAnZXJyb3InLFxuICAgICAgICBvbkludmFsaWRQcm9wZXJ0eVZhbHVlOiBwYXJ0aWFsPy5vbkludmFsaWRQcm9wZXJ0eVZhbHVlID8/ICdlcnJvcicsXG4gICAgICAgIG9uVW5kZWZpbmVkUHJvcGVydHlWYWx1ZTogcGFydGlhbD8ub25VbmRlZmluZWRQcm9wZXJ0eVZhbHVlID8/ICdpZ25vcmUnLFxuICAgICAgICBleHRlbmRWYXJzOiBleHRlbmRlcixcbiAgICB9O1xuICAgIGlmIChwYXJ0aWFsPy52YXJzKSB7XG4gICAgICAgIG9wdGlvbnMudmFycyA9IHBhcnRpYWwudmFycztcbiAgICB9XG4gICAgaWYgKHBhcnRpYWw/LnJlZnMpIHtcbiAgICAgICAgb3B0aW9ucy5yZWZzID0gcGFydGlhbC5yZWZzO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEBzZWUgSnNvbkNvbnRleHQgdXNpbmcgdmFsdWVzIHN1cHBsaWVkIGluIGFuIG9wdGlvbmFsIHBhcnRpYWxcbiAqIEBzZWUgSnNvbkNvbnZlcnRlck9wdGlvbnNcbiAqIEBwYXJhbSBwYXJ0aWFsIE9wdGlvbmFsIHBhcnRpYWwgQHNlZSBKc29uQ29udmVydGVyT3B0aW9ucyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250ZXh0RnJvbUNvbnZlcnRlck9wdGlvbnMocGFydGlhbD86IFBhcnRpYWw8SnNvbkNvbnZlcnRlck9wdGlvbnM+KTogSnNvbkNvbnRleHR8dW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250ZXh0OiBKc29uQ29udGV4dCA9IHt9O1xuICAgIGlmIChwYXJ0aWFsPy52YXJzKSB7XG4gICAgICAgIGNvbnRleHQudmFycyA9IHBhcnRpYWwudmFycztcbiAgICB9XG4gICAgaWYgKHBhcnRpYWw/LnJlZnMpIHtcbiAgICAgICAgY29udGV4dC5yZWZzID0gcGFydGlhbC5yZWZzO1xuICAgIH1cbiAgICBpZiAocGFydGlhbD8uaGFzT3duUHJvcGVydHkoJ2V4dGVuZFZhcnMnKSkge1xuICAgICAgICBjb250ZXh0LmV4dGVuZFZhcnMgPSBwYXJ0aWFsLmV4dGVuZFZhcnM7XG4gICAgfVxuICAgIHJldHVybiAoY29udGV4dC52YXJzIHx8IGNvbnRleHQucmVmcyB8fCBjb250ZXh0LmV4dGVuZFZhcnMpID8gY29udGV4dCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEBzZWUgSnNvbkVkaXRvciBmcm9tIGFuIG9wdGlvbmFsbHkgc3VwcGxpZWQgcGFydGlhbCBAc2VlIEpzb25Db252ZXJ0ZXJPcHRpb25zLlxuICogRXhwYW5kcyBzdXBwbGllZCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kIGNvbnN0cnVjdHMgYW4gZWRpdG9yIHdpdGhcbiAqIG1hdGNoaW5nIGNvbmZpZ3VyYXRpb24gYW5kIGRlZmluZWQgcnVsZXMuXG4gKiBAcGFyYW0gcGFydGlhbCBPcHRpb25hbCBwYXJ0aWFsIEBzZWUgSnNvbkNvbnZlcnRlck9wdGlvbnMgdXNlZCB0byBjcmVhdGUgdGhlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydGVyT3B0aW9uc1RvRWRpdG9yKHBhcnRpYWw/OiBQYXJ0aWFsPEpzb25Db252ZXJ0ZXJPcHRpb25zPik6IFJlc3VsdDxKc29uRWRpdG9yPiB7XG4gICAgY29uc3QgY29udmVydGVyT3B0aW9ucyA9IG1lcmdlRGVmYXVsdEpzb25Db252ZXJ0ZXJPcHRpb25zKHBhcnRpYWwpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjb250ZXh0RnJvbUNvbnZlcnRlck9wdGlvbnMocGFydGlhbCk7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHtcbiAgICAgICAgb25JbnZhbGlkUHJvcGVydHlOYW1lOiBjb252ZXJ0ZXJPcHRpb25zLm9uSW52YWxpZFByb3BlcnR5TmFtZSxcbiAgICAgICAgb25JbnZhbGlkUHJvcGVydHlWYWx1ZTogY29udmVydGVyT3B0aW9ucy5vbkludmFsaWRQcm9wZXJ0eVZhbHVlLFxuICAgICAgICBvblVuZGVmaW5lZFByb3BlcnR5VmFsdWU6IGNvbnZlcnRlck9wdGlvbnMub25VbmRlZmluZWRQcm9wZXJ0eVZhbHVlLFxuICAgIH07XG4gICAgY29uc3QgZWRpdG9yT3B0aW9uczogSnNvbkVkaXRvck9wdGlvbnMgPSB7IGNvbnRleHQsIHZhbGlkYXRpb24gfTtcblxuICAgIGNvbnN0IHJ1bGVzOiBKc29uRWRpdG9yUnVsZVtdID0gW107XG4gICAgaWYgKGNvbnZlcnRlck9wdGlvbnMudXNlTmFtZVRlbXBsYXRlcyB8fCBjb252ZXJ0ZXJPcHRpb25zLnVzZVZhbHVlVGVtcGxhdGVzKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLmVkaXRvck9wdGlvbnMsXG4gICAgICAgICAgICB1c2VOYW1lVGVtcGxhdGVzOiBjb252ZXJ0ZXJPcHRpb25zLnVzZU5hbWVUZW1wbGF0ZXMsXG4gICAgICAgICAgICB1c2VWYWx1ZVRlbXBsYXRlczogY29udmVydGVyT3B0aW9ucy51c2VWYWx1ZVRlbXBsYXRlcyxcbiAgICAgICAgfTtcbiAgICAgICAgcnVsZXMucHVzaChuZXcgVGVtcGxhdGVkSnNvbkVkaXRvclJ1bGUodGVtcGxhdGVPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChjb252ZXJ0ZXJPcHRpb25zLnVzZUNvbmRpdGlvbmFsTmFtZXMgfHwgY29udmVydGVyT3B0aW9ucy5mbGF0dGVuVW5jb25kaXRpb25hbFZhbHVlcykge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5lZGl0b3JPcHRpb25zLFxuICAgICAgICAgICAgZmxhdHRlblVuY29uZGl0aW9uYWxWYWx1ZXM6IGNvbnZlcnRlck9wdGlvbnMuZmxhdHRlblVuY29uZGl0aW9uYWxWYWx1ZXMsXG4gICAgICAgIH07XG4gICAgICAgIHJ1bGVzLnB1c2gobmV3IENvbmRpdGlvbmFsSnNvbkVkaXRvclJ1bGUoY29uZGl0aW9uYWxPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChjb252ZXJ0ZXJPcHRpb25zLnVzZU11bHRpVmFsdWVUZW1wbGF0ZU5hbWVzKSB7XG4gICAgICAgIHJ1bGVzLnB1c2gobmV3IE11bHRpVmFsdWVKc29uRWRpdG9yUnVsZShlZGl0b3JPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChjb252ZXJ0ZXJPcHRpb25zLnVzZVJlZmVyZW5jZXMpIHtcbiAgICAgICAgcnVsZXMucHVzaChuZXcgUmVmZXJlbmNlSnNvbkVkaXRvclJ1bGUoZWRpdG9yT3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBKc29uRWRpdG9yLmNyZWF0ZShlZGl0b3JPcHRpb25zLCBydWxlcyk7XG59XG5cbi8qKlxuICogQSB0aGluIHdyYXBwZXIgdG8gYWxsb3cgYW4gYXJiaXRyYXJ5IEBzZWUgSnNvbkVkaXRvciB0byBiZSB1c2VkIHZpYSB0aGVcbiAqIHRzLXV0aWxzIEBzZWUgQ29udmVydGVyIHBhdHRlcm4uXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uRWRpdG9yQ29udmVydGVyIGV4dGVuZHMgQmFzZUNvbnZlcnRlcjxKc29uVmFsdWUsIEpzb25Db250ZXh0PiB7XG4gICAgcHVibGljIGVkaXRvcjogSnNvbkVkaXRvcjtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQHNlZSBKc29uRWRpdG9yQ29udmVydGVyIHdoaWNoIHVzZXMgdGhlIHN1cHBsaWVkIGVkaXRvclxuICAgICAqIEBwYXJhbSBlZGl0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZWRpdG9yOiBKc29uRWRpdG9yKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgKGZyb20sIF9zZWxmLCBjb250ZXh0KSA9PiB0aGlzLl9jb252ZXJ0KGZyb20sIGNvbnRleHQpLFxuICAgICAgICAgICAgZWRpdG9yLm9wdGlvbnMuY29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIEpzb25FZGl0b3JDb252ZXJ0ZXIgd2hpY2ggdXNlcyB0aGUgc3VwcGxpZWQgZWRpdG9yXG4gICAgICogQHBhcmFtIGVkaXRvclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlV2l0aEVkaXRvcihlZGl0b3I6IEpzb25FZGl0b3IpOiBSZXN1bHQ8SnNvbkVkaXRvckNvbnZlcnRlcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgSnNvbkVkaXRvckNvbnZlcnRlcihlZGl0b3IpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZGVyaXZlZCBjb252ZXJ0ZXIgd2hpY2ggZmFpbHMgaWYgdGhlIHJlc3VsdGluZyBjb252ZXJ0ZWRcbiAgICAgKiBAc2VlIEpzb25WYWx1ZSBpcyBub3QgYSBAc2VlIEpzb25PYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgb2JqZWN0KCk6IENvbnZlcnRlcjxKc29uT2JqZWN0LCBKc29uQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAoKGp2KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzSnNvbk9iamVjdChqdikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgXCIke0pTT04uc3RyaW5naWZ5KGp2KX1cIiB0byBKU09OIG9iamVjdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGp2KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGRlcml2ZWQgY29udmVydGVyIHdoaWNoIGZhaWxzIGlmIHRoZSByZXN1bHRpbmcgY29udmVydGVkXG4gICAgICogQHNlZSBKc29uVmFsdWUgaXMgbm90IGEgQHNlZSBKc29uQXJyYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXJyYXkoKTogQ29udmVydGVyPEpzb25BcnJheSwgSnNvbkNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwKChqdikgPT4ge1xuICAgICAgICAgICAgaWYgKCghQXJyYXkuaXNBcnJheShqdikpIHx8ICh0eXBlb2YganYgIT09ICdvYmplY3QnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBcIiR7SlNPTi5zdHJpbmdpZnkoanYpfVwiIHRvIEpTT04gYXJyYXkuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChqdik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY29udmVydChmcm9tOiB1bmtub3duLCBjb250ZXh0PzogSnNvbkNvbnRleHQpOiBSZXN1bHQ8SnNvblZhbHVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvci5jbG9uZShmcm9tIGFzIEpzb25WYWx1ZSwgY29udGV4dCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgdHMtdXRpbHMgQHNlZSBDb252ZXJ0ZXIgZnJvbSB1bmtub3duIHRvIHR5cGUtc2FmZSBKU09OLCBvcHRpb25hbGx5IHJlbmRlcmluZ1xuICogYW55IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyBvciB2YWx1ZXMgdXNpbmcgbXVzdGFjaGUgd2l0aCBhIHN1cHBsaWVkIHZpZXcuXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uQ29udmVydGVyIGV4dGVuZHMgSnNvbkVkaXRvckNvbnZlcnRlciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBKc29uQ29udmVydGVyIHdpdGggc3VwcGxpZWQgb3IgZGVmYXVsdCBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgb3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGNvbnZlcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxKc29uQ29udmVydGVyT3B0aW9ucz4pIHtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gY29udmVydGVyT3B0aW9uc1RvRWRpdG9yKG9wdGlvbnMpLmdldFZhbHVlT3JUaHJvdygpO1xuICAgICAgICBzdXBlcihlZGl0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29udmVydGVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIG9wdGlvbnMgdG8gY29uaWZndXJlIHRoZSBjb252ZXJ0ZXJcbiAgICAgKiBAcmV0dXJucyBTdWNjZXNzIHdpdGggYSBuZXcgSnNvbkNvbnZlcnRlciBvbiBzdWNjZXNzLCBvciBGYWlsdXJlIHdpdGggYW5cbiAgICAgKiBpbmZvcm1hdGl2ZSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zPzogUGFydGlhbDxKc29uQ29udmVydGVyT3B0aW9ucz4pOiBSZXN1bHQ8SnNvbkNvbnZlcnRlcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgSnNvbkNvbnZlcnRlcihvcHRpb25zKSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZWRKc29uQ29udmVydGVyT3B0aW9ucyA9IE9taXQ8SnNvbkNvbnZlcnRlck9wdGlvbnMsICd1c2VOYW1lVGVtcGxhdGVzJ3wndXNlVmFsdWVUZW1wbGF0ZXMnfCd1c2VNdWx0aXZhbHVlVGVtcGxhdGVObWVzJz47XG5cbi8qKlxuICogQSB0cy11dGlscyBAc2VlIENvbnZlcnRlciBmcm9tIHVua25vd24gdG8gdHlwZS1zYWZlIEpTT04gd2l0aCBtdXN0YWNoZVxuICogdGVtcGxhdGUgcmVuZGVyaW5nIGFuZCBtdWx0aS12YWx1ZSBwcm9wZXJ0eSBuYW1lIHJ1bGVzIGVuYWJsZWQgcmVnYXJkbGVzc1xuICogb2YgaW5pdGlhbCBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVkSnNvbkNvbnZlcnRlciBleHRlbmRzIEpzb25FZGl0b3JDb252ZXJ0ZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGVtcGxhdGVPcHRpb25zOiBQYXJ0aWFsPEpzb25Db252ZXJ0ZXJPcHRpb25zPiA9IHtcbiAgICAgICAgdXNlTmFtZVRlbXBsYXRlczogdHJ1ZSxcbiAgICAgICAgdXNlVmFsdWVUZW1wbGF0ZXM6IHRydWUsXG4gICAgICAgIHVzZU11bHRpVmFsdWVUZW1wbGF0ZU5hbWVzOiB0cnVlLFxuICAgICAgICB1c2VDb25kaXRpb25hbE5hbWVzOiBmYWxzZSxcbiAgICAgICAgZmxhdHRlblVuY29uZGl0aW9uYWxWYWx1ZXM6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEBzZWUgVGVtcGxhdGVkSnNvbkNvbnZlcnRlciB3aXRoIHN1cHBsaWVkIG9yXG4gICAgICogZGVmYXVsdCBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvciBjb250ZXh0IGZvciB0aGUgY29udmVydGVyXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPFRlbXBsYXRlZEpzb25Db252ZXJ0ZXJPcHRpb25zPikge1xuICAgICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCAuLi5UZW1wbGF0ZWRKc29uQ29udmVydGVyLnRlbXBsYXRlT3B0aW9ucyB9O1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBjb252ZXJ0ZXJPcHRpb25zVG9FZGl0b3Iob3B0aW9ucykuZ2V0VmFsdWVPclRocm93KCk7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIFRlbXBsYXRlZEpzb25Db252ZXJ0ZXIgd2l0aCBzdXBwbGllZCBvclxuICAgICAqIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3IgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9wdGlvbnM/OiBQYXJ0aWFsPFRlbXBsYXRlZEpzb25Db252ZXJ0ZXJPcHRpb25zPik6IFJlc3VsdDxKc29uQ29udmVydGVyPiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBUZW1wbGF0ZWRKc29uQ29udmVydGVyKG9wdGlvbnMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvbmFsSnNvbkNvbnZlcnRlck9wdGlvbnMgPSBPbWl0PFRlbXBsYXRlZEpzb25Db252ZXJ0ZXJPcHRpb25zLCAndXNlQ29uZGl0aW9uYWxOYW1lcyc+O1xuXG4vKipcbiAqIEEgdHMtdXRpbHMgQHNlZSBDb252ZXJ0ZXIgZnJvbSB1bmtub3duIHRvIHR5cGUtc2FmZSBKU09OIHdpdGggbXVzdGFjaGVcbiAqIHRlbXBsYXRlIHJlbmRlcmluZywgbXVsdGktdmFsdWUgcHJvcGVydHkgbmFtZSBhbmQgY29uZGl0aW9uYWwgcHJvcGVydHlcbiAqIG5hbWUgcnVsZXMgZW5hYmxlZCByZWdhcmRsZXNzIG9mIGluaXRpYWwgY29udGV4dC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsSnNvbkNvbnZlcnRlciBleHRlbmRzIEpzb25FZGl0b3JDb252ZXJ0ZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY29uZGl0aW9uYWxPcHRpb25zOiBQYXJ0aWFsPEpzb25Db252ZXJ0ZXJPcHRpb25zPiA9IHtcbiAgICAgICAgLi4uVGVtcGxhdGVkSnNvbkNvbnZlcnRlci50ZW1wbGF0ZU9wdGlvbnMsXG4gICAgICAgIHVzZUNvbmRpdGlvbmFsTmFtZXM6IHRydWUsXG4gICAgICAgIGZsYXR0ZW5VbmNvbmRpdGlvbmFsVmFsdWVzOiB0cnVlLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEBzZWUgQ29uZGl0aW9uYWxKc29uQ29udmVydGVyIHdpdGggc3VwcGxpZWQgb3JcbiAgICAgKiBkZWZhdWx0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9yIGNvbnRleHQgZm9yIHRoZSBjb252ZXJ0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9ucz86IFBhcnRpYWw8Q29uZGl0aW9uYWxKc29uQ29udmVydGVyT3B0aW9ucz4pIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4uQ29uZGl0aW9uYWxKc29uQ29udmVydGVyLmNvbmRpdGlvbmFsT3B0aW9ucyB9O1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBjb252ZXJ0ZXJPcHRpb25zVG9FZGl0b3Iob3B0aW9ucykuZ2V0VmFsdWVPclRocm93KCk7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIENvbmRpdGlvbmFsSnNvbkNvbnZlcnRlciB3aXRoIHN1cHBsaWVkIG9yXG4gICAgICogZGVmYXVsdCBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvciBjb250ZXh0IGZvciB0aGUgY29udmVydGVyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9ucz86IFBhcnRpYWw8Q29uZGl0aW9uYWxKc29uQ29udmVydGVyT3B0aW9ucz4pOiBSZXN1bHQ8SnNvbkNvbnZlcnRlcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgQ29uZGl0aW9uYWxKc29uQ29udmVydGVyKG9wdGlvbnMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJpY2hKc29uQ29udmVydGVyT3B0aW9ucyA9IE9taXQ8Q29uZGl0aW9uYWxKc29uQ29udmVydGVyT3B0aW9ucywgJ3VzZVJlZmVyZW5jZXMnPjtcblxuLyoqXG4gKiBBIHRzLXV0aWxzIEBzZWUgQ29udmVydGVyIGZyb20gdW5rbm93biB0byB0eXBlLXNhZmUgSlNPTiB3aXRoIG11c3RhY2hlXG4gKiB0ZW1wbGF0ZSByZW5kZXJpbmcsIG11bHRpLXZhbHVlIHByb3BlcnR5IG5hbWUsIGNvbmRpdGlvbmFsIHByb3BlcnR5XG4gKiBuYW1lLCBhbmQgZXh0ZXJuYWwgcmVmZXJlbmNlIHJ1bGVzIGVuYWJsZWQgcmVnYXJkbGVzcyBvZiBpbml0aWFsIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSaWNoSnNvbkNvbnZlcnRlciBleHRlbmRzIEpzb25FZGl0b3JDb252ZXJ0ZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcmljaE9wdGlvbnM6IFBhcnRpYWw8SnNvbkNvbnZlcnRlck9wdGlvbnM+ID0ge1xuICAgICAgICAuLi5Db25kaXRpb25hbEpzb25Db252ZXJ0ZXIuY29uZGl0aW9uYWxPcHRpb25zLFxuICAgICAgICB1c2VSZWZlcmVuY2VzOiB0cnVlLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEBzZWUgUmljaEpzb25Db252ZXJ0ZXIgd2l0aCBzdXBwbGllZCBvclxuICAgICAqIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3IgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxSaWNoSnNvbkNvbnZlcnRlck9wdGlvbnM+KSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLlJpY2hKc29uQ29udmVydGVyLnJpY2hPcHRpb25zIH07XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGNvbnZlcnRlck9wdGlvbnNUb0VkaXRvcihvcHRpb25zKS5nZXRWYWx1ZU9yVGhyb3coKTtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEBzZWUgUmljaEpzb25Db252ZXJ0ZXIgd2l0aCBzdXBwbGllZCBvclxuICAgICAqIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3IgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9wdGlvbnM/OiBQYXJ0aWFsPFJpY2hKc29uQ29udmVydGVyT3B0aW9ucz4pOiBSZXN1bHQ8SnNvbkNvbnZlcnRlcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgUmljaEpzb25Db252ZXJ0ZXIob3B0aW9ucykpO1xuICAgIH1cbn1cbiJdfQ==
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9qc29uQ29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7OztBQUVILDRDQU91QjtBQUN2Qiw4Q0FLNEI7QUFDNUIscUNBQTBFO0FBQzFFLCtDQU11QjtBQUV2Qix3REFBcUQ7QUErR3JEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGdDQUFnQyxDQUFDLE9BQXVDOztJQUNwRixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLElBQUksTUFBSyxTQUFTLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLElBQUksTUFBSyxTQUFTLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLCtCQUFpQixDQUFDO0lBQ2hHLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsZ0JBQWdCLG1DQUFJLFFBQVEsQ0FBQyxDQUFDO0lBQzdELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxtQkFBbUIsbUNBQUksWUFBWSxDQUFDLENBQUM7SUFFekUsTUFBTSxPQUFPLEdBQXlCO1FBQ2xDLGlCQUFpQixFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGlCQUFpQixtQ0FBSSxRQUFRO1FBQ3pE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cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7XG4gICAgQmFzZUNvbnZlcnRlcixcbiAgICBDb252ZXJ0ZXIsXG4gICAgUmVzdWx0LFxuICAgIGNhcHR1cmVSZXN1bHQsXG4gICAgZmFpbCxcbiAgICBzdWNjZWVkLFxufSBmcm9tICdAZmd2L3RzLXV0aWxzJztcbmltcG9ydCB7XG4gICAgQ29uZGl0aW9uYWxKc29uRWRpdG9yUnVsZSxcbiAgICBNdWx0aVZhbHVlSnNvbkVkaXRvclJ1bGUsXG4gICAgUmVmZXJlbmNlSnNvbkVkaXRvclJ1bGUsXG4gICAgVGVtcGxhdGVkSnNvbkVkaXRvclJ1bGUsXG59IGZyb20gJy4vanNvbkVkaXRvci9ydWxlcyc7XG5pbXBvcnQgeyBKc29uQXJyYXksIEpzb25PYmplY3QsIEpzb25WYWx1ZSwgaXNKc29uT2JqZWN0IH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBKc29uQ29udGV4dCxcbiAgICBKc29uUmVmZXJlbmNlTWFwLFxuICAgIFRlbXBsYXRlVmFycyxcbiAgICBUZW1wbGF0ZVZhcnNFeHRlbmRGdW5jdGlvbixcbiAgICBkZWZhdWx0RXh0ZW5kVmFycyxcbn0gZnJvbSAnLi9qc29uQ29udGV4dCc7XG5cbmltcG9ydCB7IEpzb25FZGl0b3IgfSBmcm9tICcuL2pzb25FZGl0b3IvanNvbkVkaXRvcic7XG5pbXBvcnQgeyBKc29uRWRpdG9yT3B0aW9ucyB9IGZyb20gJy4vanNvbkVkaXRvci9qc29uRWRpdG9yU3RhdGUnO1xuaW1wb3J0IHsgSnNvbkVkaXRvclJ1bGUgfSBmcm9tICcuL2pzb25FZGl0b3IvanNvbkVkaXRvclJ1bGUnO1xuXG4vKipcbiAqIENvbnZlcnNpb24gb3B0aW9ucyBmb3IgSnNvbkNvbnZlcnRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Db252ZXJ0ZXJPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiB0cnVlIGFuZCBpZiB0ZW1wbGF0ZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSxcbiAgICAgKiB0aGVuIHN0cmluZyBwcm9wZXJ0eSB2YWx1ZXMgd2lsbCBiZSByZW5kZXJlZCB1c2luZ1xuICAgICAqIG11c3RhY2hlIGFuZCB0aG9zZSB2YXJpYWJsZXMuIE90aGVyd2lzZSBzdHJpbmcgcHJvcGVydGllc1xuICAgICAqIGFyZSBjb3BpZWQgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0cyB0byB0cnVlIGlmIHZhcnMgYXJlIHN1cHBsaWVkIHdpdGggb3B0aW9ucyxcbiAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlVmFsdWVUZW1wbGF0ZXM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlIGFuZCBpZiB0ZW1wbGF0ZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSxcbiAgICAgKiB0aGVuIHN0cmluZyBwcm9wZXJ0eSBuYW1lcyB3aWxsIGJlIHJlbmRlcmVkIHVzaW5nXG4gICAgICogbXVzdGFjaGUgYW5kIHRob3NlIHZhcmlhYmxlcy4gT3RoZXJ3aXNlIHN0cmluZyBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGNvcGllZCB3aXRob3V0IG1vZGlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIHRydWUgaWYgdmFycyBhcmUgc3VwcGxpZWQgd2l0aCBvcHRpb25zLFxuICAgICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB1c2VOYW1lVGVtcGxhdGVzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSBhbmQgaWYgdGVtcGxhdGUgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUsXG4gICAgICogdGhlbiBzdHJpbmcgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBjb25zaWRlcmVkIGZvclxuICAgICAqIGNvbmRpdGlvbmFscy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgaXMgdG8gbWF0Y2ggdXNlTmFtZVRlbXBsYXRlc1xuICAgICAqL1xuICAgIHVzZUNvbmRpdGlvbmFsTmFtZXM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlIChkZWZhdWx0KSB0aGVuIHByb3BlcnRpZXMgd2l0aCB1bmNvbmRpdGlvbmFsIG5hbWVzXG4gICAgICogKHdoaWNoIHN0YXJ0IHdpdGggISkgYXJlIGZsYXR0ZW5lZC5cbiAgICAgKi9cbiAgICBmbGF0dGVuVW5jb25kaXRpb25hbFZhbHVlczogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIElmIHRydWUgYW5kIGlmIGJvdGggdGVtcGxhdGUgdmFyaWFibGVzIGFuZCBhXG4gICAgICogY29udGV4dCBkZXJpdmF0aW9uIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhlbiBwcm9wZXJ0aWVzXG4gICAgICogd2hpY2ggbWF0Y2ggdGhlIG11bHRpLXZhbHVlIG5hbWUgcGF0dGVybiB3aWxsIGJlIGV4cGFuZGVkLlxuICAgICAqIERlZmF1bHQgbWF0Y2hlcyB1c2VOYW1lVGVtcGxhdGVzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCBpcyB0cnVlIHVubGVzcyBleHRlbmRWYXJzIGlzIGV4cGxpY2l0bHkgc2V0IHRvXG4gICAgICogdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIHVzZU11bHRpVmFsdWVUZW1wbGF0ZU5hbWVzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhcmlhYmxlcyAobXVzdGFjaGUgdmlldykgdXNlZCB0byByZW5kZXIgdGVtcGxhdGVkIHN0cmluZyBuYW1lc1xuICAgICAqIGFuZCBwcm9wZXJ0aWVzLiAgU2VlIHRoZSBtdXN0YWNoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9mIG11c3RhY2hlXG4gICAgICogc3ludGF4IGFuZCB0aGUgdGVtcGxhdGUgdmlldy5cbiAgICAgKi9cbiAgICB2YXJzPzogVGVtcGxhdGVWYXJzO1xuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIHVzZWQgdG8gZXh0ZW5kIHZhcmlhYmxlcyBmb3IgY2hpbGRyZW4gb2YgYW4gYXJyYXkgbm9kZSBkdXJpbmdcbiAgICAgKiBleHBhbnNpb24uIERlZmF1bHQgaXMgdG8gdXNlIGEgYnVpbHQtaW4gZXh0ZW5zaW9uIGZ1bmN0aW9uIHVubGVzc1xuICAgICAqIGV4dGVuZFZhcnMgaXMgZXhwbGljaXRseSBzZXQgdG8gdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIGV4dGVuZFZhcnM/OiBUZW1wbGF0ZVZhcnNFeHRlbmRGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIElmIHRydWUgYW5kIGlmIGEgcmVmZXJlbmNlcyBtYXAgaXMgc3VwcGxpZWQsIHRoZW5cbiAgICAgKiByZWZlcmVuY2VzIGluIHRoZSBzb3VyY2Ugb2JqZWN0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aFxuICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgaXMgdHJ1ZSBpZiByZWZzIGFyZSBwcmVzZW50IGluIG9wdGlvbnMsIGZhbHNlXG4gICAgICogb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHVzZVJlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBvYmplY3QgbWFwIHVzZWQgdG8gaW5zZXJ0IGFueSByZWZlcmVuY2VzIGluIHRoZVxuICAgICAqIGNvbnZlcnRlZCBKU09OLlxuICAgICAqL1xuICAgIHJlZnM/OiBKc29uUmVmZXJlbmNlTWFwO1xuXG4gICAgLyoqXG4gICAgICogSWYgb25JbnZhbGlkUHJvcGVydHlOYW1lIGlzICdlcnJvcicgKGRlZmF1bHQpIHRoZW4gYW55IHByb3BlcnR5IG5hbWVcbiAgICAgKiB0aGF0IGlzIGludmFsaWQgYWZ0ZXIgdGVtcGxhdGUgcmVuZGVyaW5nIGNhdXNlcyBhbiBlcnJvciBhbmQgc3RvcHNcbiAgICAgKiBjb252ZXJzaW9uLiAgSWYgb25JbnZhbGlkUHJvcGVydHlOYW1lIGlzICdpZ25vcmUnLCB0aGVuIG5hbWVzIHdoaWNoXG4gICAgICogYXJlIGludmFsaWQgYWZ0ZXIgdGVtcGxhdGUgcmVuZGVyaW5nIGFyZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQuXG4gICAgICovXG4gICAgb25JbnZhbGlkUHJvcGVydHlOYW1lOiAnZXJyb3InfCdpZ25vcmUnO1xuXG4gICAgLyoqXG4gICAgICogSWYgb25JbnZhbGlkUHJvcGVydHlWYWx1ZSBpcyAnZXJyb3InIChkZWZhdWx0KSB0aGVuIGFueSBpbGxlZ2FsXG4gICAgICogcHJvcGVydHkgdmFsdWUgY2F1c2VzIGFuIGVycm9yIGFuZCBzdG9wcyBjb252ZXJzaW9uLiAgSWZcbiAgICAgKiBvbkludmFsaWRQcm9wZXJ0eVZhbHVlIGlzICdpZ25vcmUnIHRoZW4gYW55IGludmFsaWQgcHJvcGVydHlcbiAgICAgKiB2YWx1ZXMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gICAgICovXG4gICAgb25JbnZhbGlkUHJvcGVydHlWYWx1ZTogJ2Vycm9yJ3wnaWdub3JlJztcblxuICAgIC8qKlxuICAgICAqIElmIG9uVW5rbm93blByb3BlcnR5VmFsdWUgaXMgZXJyb3IsIHRoZW4gYW55IHByb3BlcnR5IHdpdGhcbiAgICAgKiB2YWx1ZSB1bmRlZmluZWQgd2lsbCBjYXVzZSBhbiBlcnJvciBhbmQgc3RvcCBjb252ZXJzaW9uLiAgSWZcbiAgICAgKiBvblVuZGVmaW5lZFByb3BlcnR5VmFsdWUgaXMgJ2lnbm9yZScgKGRlZmF1bHQpIHRoZW4gYW55XG4gICAgICogcHJvcGVydHkgd2l0aCB2YWx1ZSB1bmRlZmluZWQgaXMgc2lsZW50bHkgaWdub3JlZC5cbiAgICAgKi9cbiAgICBvblVuZGVmaW5lZFByb3BlcnR5VmFsdWU6ICdlcnJvcid8J2lnbm9yZSc7XG59XG5cbi8qKlxuICogTWVyZ2VzIGFuIG9wdGlvbmFsbHkgc3VwcGxpZWQgcGFydGlhbCBzZXQgb2Ygb3B0aW9ucyB3aXRoIHRoZSBkZWZhdWx0XG4gKiBjb252ZXJ0ZXIgb3B0aW9ucywgcHJvZHVjaW5nIGEgZnVsbHktcmVzb2x2ZWQgc2V0IG9mIENvbnZlcnRlck9wdGlvbnNcbiAqIGFuZCB0YWtpbmcgYWxsIGR5bmFtaWMgcnVsZXMgaW50byBhY2NvdW50IChlLmcuIHRlbXBsYXRlIHVzYWdlIGVuYWJsZWRcbiAqIGlmIHZhcmlhYmxlcyBhcmUgc3VwcGxpZWQgYW5kIGRpc2FibGVkIGlmIG5vdClcbiAqIEBwYXJhbSBwYXJ0aWFsIEFuIG9wdGlvbmFsIHBhcnRpYWwgQHNlZSBKc29uQ29udmVydGVyT3B0aW9ucyB0byBiZSBtZXJnZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVmYXVsdEpzb25Db252ZXJ0ZXJPcHRpb25zKHBhcnRpYWw/OiBQYXJ0aWFsPEpzb25Db252ZXJ0ZXJPcHRpb25zPik6IEpzb25Db252ZXJ0ZXJPcHRpb25zIHtcbiAgICBjb25zdCBoYXZlVmFycyA9IChwYXJ0aWFsPy52YXJzICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGhhdmVSZWZzID0gKHBhcnRpYWw/LnJlZnMgIT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgZXh0ZW5kZXIgPSBwYXJ0aWFsPy5oYXNPd25Qcm9wZXJ0eSgnZXh0ZW5kVmFycycpID8gcGFydGlhbC5leHRlbmRWYXJzIDogZGVmYXVsdEV4dGVuZFZhcnM7XG4gICAgY29uc3QgaGF2ZUV4dGVuZGVyID0gKGV4dGVuZGVyICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IG5hbWVzRGVmYXVsdCA9IChwYXJ0aWFsPy51c2VOYW1lVGVtcGxhdGVzID8/IGhhdmVWYXJzKTtcbiAgICBjb25zdCBjb25kaXRpb25zRGVmYXVsdCA9IChwYXJ0aWFsPy51c2VDb25kaXRpb25hbE5hbWVzID8/IG5hbWVzRGVmYXVsdCk7XG5cbiAgICBjb25zdCBvcHRpb25zOiBKc29uQ29udmVydGVyT3B0aW9ucyA9IHtcbiAgICAgICAgdXNlVmFsdWVUZW1wbGF0ZXM6IHBhcnRpYWw/LnVzZVZhbHVlVGVtcGxhdGVzID8/IGhhdmVWYXJzLFxuICAgICAgICB1c2VOYW1lVGVtcGxhdGVzOiBuYW1lc0RlZmF1bHQsXG4gICAgICAgIHVzZUNvbmRpdGlvbmFsTmFtZXM6IGNvbmRpdGlvbnNEZWZhdWx0LFxuICAgICAgICBmbGF0dGVuVW5jb25kaXRpb25hbFZhbHVlczogcGFydGlhbD8uZmxhdHRlblVuY29uZGl0aW9uYWxWYWx1ZXMgPz8gY29uZGl0aW9uc0RlZmF1bHQsXG4gICAgICAgIHVzZU11bHRpVmFsdWVUZW1wbGF0ZU5hbWVzOiBwYXJ0aWFsPy51c2VNdWx0aVZhbHVlVGVtcGxhdGVOYW1lcyA/PyAoaGF2ZUV4dGVuZGVyICYmIG5hbWVzRGVmYXVsdCksXG4gICAgICAgIHVzZVJlZmVyZW5jZXM6IHBhcnRpYWw/LnVzZVJlZmVyZW5jZXMgPz8gaGF2ZVJlZnMsXG4gICAgICAgIG9uSW52YWxpZFByb3BlcnR5TmFtZTogcGFydGlhbD8ub25JbnZhbGlkUHJvcGVydHlOYW1lID8/ICdlcnJvcicsXG4gICAgICAgIG9uSW52YWxpZFByb3BlcnR5VmFsdWU6IHBhcnRpYWw/Lm9uSW52YWxpZFByb3BlcnR5VmFsdWUgPz8gJ2Vycm9yJyxcbiAgICAgICAgb25VbmRlZmluZWRQcm9wZXJ0eVZhbHVlOiBwYXJ0aWFsPy5vblVuZGVmaW5lZFByb3BlcnR5VmFsdWUgPz8gJ2lnbm9yZScsXG4gICAgICAgIGV4dGVuZFZhcnM6IGV4dGVuZGVyLFxuICAgIH07XG4gICAgaWYgKHBhcnRpYWw/LnZhcnMpIHtcbiAgICAgICAgb3B0aW9ucy52YXJzID0gcGFydGlhbC52YXJzO1xuICAgIH1cbiAgICBpZiAocGFydGlhbD8ucmVmcykge1xuICAgICAgICBvcHRpb25zLnJlZnMgPSBwYXJ0aWFsLnJlZnM7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQHNlZSBKc29uQ29udGV4dCB1c2luZyB2YWx1ZXMgc3VwcGxpZWQgaW4gYW4gb3B0aW9uYWwgcGFydGlhbFxuICogQHNlZSBKc29uQ29udmVydGVyT3B0aW9uc1xuICogQHBhcmFtIHBhcnRpYWwgT3B0aW9uYWwgcGFydGlhbCBAc2VlIEpzb25Db252ZXJ0ZXJPcHRpb25zIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRleHRGcm9tQ29udmVydGVyT3B0aW9ucyhwYXJ0aWFsPzogUGFydGlhbDxKc29uQ29udmVydGVyT3B0aW9ucz4pOiBKc29uQ29udGV4dHx1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbnRleHQ6IEpzb25Db250ZXh0ID0ge307XG4gICAgaWYgKHBhcnRpYWw/LnZhcnMpIHtcbiAgICAgICAgY29udGV4dC52YXJzID0gcGFydGlhbC52YXJzO1xuICAgIH1cbiAgICBpZiAocGFydGlhbD8ucmVmcykge1xuICAgICAgICBjb250ZXh0LnJlZnMgPSBwYXJ0aWFsLnJlZnM7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFsPy5oYXNPd25Qcm9wZXJ0eSgnZXh0ZW5kVmFycycpKSB7XG4gICAgICAgIGNvbnRleHQuZXh0ZW5kVmFycyA9IHBhcnRpYWwuZXh0ZW5kVmFycztcbiAgICB9XG4gICAgcmV0dXJuIChjb250ZXh0LnZhcnMgfHwgY29udGV4dC5yZWZzIHx8IGNvbnRleHQuZXh0ZW5kVmFycykgPyBjb250ZXh0IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQHNlZSBKc29uRWRpdG9yIGZyb20gYW4gb3B0aW9uYWxseSBzdXBwbGllZCBwYXJ0aWFsIEBzZWUgSnNvbkNvbnZlcnRlck9wdGlvbnMuXG4gKiBFeHBhbmRzIHN1cHBsaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgY29uc3RydWN0cyBhbiBlZGl0b3Igd2l0aFxuICogbWF0Y2hpbmcgY29uZmlndXJhdGlvbiBhbmQgZGVmaW5lZCBydWxlcy5cbiAqIEBwYXJhbSBwYXJ0aWFsIE9wdGlvbmFsIHBhcnRpYWwgQHNlZSBKc29uQ29udmVydGVyT3B0aW9ucyB1c2VkIHRvIGNyZWF0ZSB0aGUgZWRpdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0ZXJPcHRpb25zVG9FZGl0b3IocGFydGlhbD86IFBhcnRpYWw8SnNvbkNvbnZlcnRlck9wdGlvbnM+KTogUmVzdWx0PEpzb25FZGl0b3I+IHtcbiAgICBjb25zdCBjb252ZXJ0ZXJPcHRpb25zID0gbWVyZ2VEZWZhdWx0SnNvbkNvbnZlcnRlck9wdGlvbnMocGFydGlhbCk7XG4gICAgY29uc3QgY29udGV4dCA9IGNvbnRleHRGcm9tQ29udmVydGVyT3B0aW9ucyhwYXJ0aWFsKTtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0ge1xuICAgICAgICBvbkludmFsaWRQcm9wZXJ0eU5hbWU6IGNvbnZlcnRlck9wdGlvbnMub25JbnZhbGlkUHJvcGVydHlOYW1lLFxuICAgICAgICBvbkludmFsaWRQcm9wZXJ0eVZhbHVlOiBjb252ZXJ0ZXJPcHRpb25zLm9uSW52YWxpZFByb3BlcnR5VmFsdWUsXG4gICAgICAgIG9uVW5kZWZpbmVkUHJvcGVydHlWYWx1ZTogY29udmVydGVyT3B0aW9ucy5vblVuZGVmaW5lZFByb3BlcnR5VmFsdWUsXG4gICAgfTtcbiAgICBjb25zdCBlZGl0b3JPcHRpb25zOiBKc29uRWRpdG9yT3B0aW9ucyA9IHsgY29udGV4dCwgdmFsaWRhdGlvbiB9O1xuXG4gICAgY29uc3QgcnVsZXM6IEpzb25FZGl0b3JSdWxlW10gPSBbXTtcbiAgICBpZiAoY29udmVydGVyT3B0aW9ucy51c2VOYW1lVGVtcGxhdGVzIHx8IGNvbnZlcnRlck9wdGlvbnMudXNlVmFsdWVUZW1wbGF0ZXMpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVPcHRpb25zID0ge1xuICAgICAgICAgICAgLi4uZWRpdG9yT3B0aW9ucyxcbiAgICAgICAgICAgIHVzZU5hbWVUZW1wbGF0ZXM6IGNvbnZlcnRlck9wdGlvbnMudXNlTmFtZVRlbXBsYXRlcyxcbiAgICAgICAgICAgIHVzZVZhbHVlVGVtcGxhdGVzOiBjb252ZXJ0ZXJPcHRpb25zLnVzZVZhbHVlVGVtcGxhdGVzLFxuICAgICAgICB9O1xuICAgICAgICBydWxlcy5wdXNoKG5ldyBUZW1wbGF0ZWRKc29uRWRpdG9yUnVsZSh0ZW1wbGF0ZU9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKGNvbnZlcnRlck9wdGlvbnMudXNlQ29uZGl0aW9uYWxOYW1lcyB8fCBjb252ZXJ0ZXJPcHRpb25zLmZsYXR0ZW5VbmNvbmRpdGlvbmFsVmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLmVkaXRvck9wdGlvbnMsXG4gICAgICAgICAgICBmbGF0dGVuVW5jb25kaXRpb25hbFZhbHVlczogY29udmVydGVyT3B0aW9ucy5mbGF0dGVuVW5jb25kaXRpb25hbFZhbHVlcyxcbiAgICAgICAgfTtcbiAgICAgICAgcnVsZXMucHVzaChuZXcgQ29uZGl0aW9uYWxKc29uRWRpdG9yUnVsZShjb25kaXRpb25hbE9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKGNvbnZlcnRlck9wdGlvbnMudXNlTXVsdGlWYWx1ZVRlbXBsYXRlTmFtZXMpIHtcbiAgICAgICAgcnVsZXMucHVzaChuZXcgTXVsdGlWYWx1ZUpzb25FZGl0b3JSdWxlKGVkaXRvck9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKGNvbnZlcnRlck9wdGlvbnMudXNlUmVmZXJlbmNlcykge1xuICAgICAgICBydWxlcy5wdXNoKG5ldyBSZWZlcmVuY2VKc29uRWRpdG9yUnVsZShlZGl0b3JPcHRpb25zKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEpzb25FZGl0b3IuY3JlYXRlKGVkaXRvck9wdGlvbnMsIHJ1bGVzKTtcbn1cblxuLyoqXG4gKiBBIHRoaW4gd3JhcHBlciB0byBhbGxvdyBhbiBhcmJpdHJhcnkgQHNlZSBKc29uRWRpdG9yIHRvIGJlIHVzZWQgdmlhIHRoZVxuICogdHMtdXRpbHMgQHNlZSBDb252ZXJ0ZXIgcGF0dGVybi5cbiAqL1xuZXhwb3J0IGNsYXNzIEpzb25FZGl0b3JDb252ZXJ0ZXIgZXh0ZW5kcyBCYXNlQ29udmVydGVyPEpzb25WYWx1ZSwgSnNvbkNvbnRleHQ+IHtcbiAgICBwdWJsaWMgZWRpdG9yOiBKc29uRWRpdG9yO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIEpzb25FZGl0b3JDb252ZXJ0ZXIgd2hpY2ggdXNlcyB0aGUgc3VwcGxpZWQgZWRpdG9yXG4gICAgICogQHBhcmFtIGVkaXRvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihlZGl0b3I6IEpzb25FZGl0b3IpIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICAoZnJvbSwgX3NlbGYsIGNvbnRleHQpID0+IHRoaXMuX2NvbnZlcnQoZnJvbSwgY29udGV4dCksXG4gICAgICAgICAgICBlZGl0b3Iub3B0aW9ucy5jb250ZXh0LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEBzZWUgSnNvbkVkaXRvckNvbnZlcnRlciB3aGljaCB1c2VzIHRoZSBzdXBwbGllZCBlZGl0b3JcbiAgICAgKiBAcGFyYW0gZWRpdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVXaXRoRWRpdG9yKGVkaXRvcjogSnNvbkVkaXRvcik6IFJlc3VsdDxKc29uRWRpdG9yQ29udmVydGVyPiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBKc29uRWRpdG9yQ29udmVydGVyKGVkaXRvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBkZXJpdmVkIGNvbnZlcnRlciB3aGljaCBmYWlscyBpZiB0aGUgcmVzdWx0aW5nIGNvbnZlcnRlZFxuICAgICAqIEBzZWUgSnNvblZhbHVlIGlzIG5vdCBhIEBzZWUgSnNvbk9iamVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBvYmplY3QoKTogQ29udmVydGVyPEpzb25PYmplY3QsIEpzb25Db250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcCgoanYpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNKc29uT2JqZWN0KGp2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBcIiR7SlNPTi5zdHJpbmdpZnkoanYpfVwiIHRvIEpTT04gb2JqZWN0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoanYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZGVyaXZlZCBjb252ZXJ0ZXIgd2hpY2ggZmFpbHMgaWYgdGhlIHJlc3VsdGluZyBjb252ZXJ0ZWRcbiAgICAgKiBAc2VlIEpzb25WYWx1ZSBpcyBub3QgYSBAc2VlIEpzb25BcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBhcnJheSgpOiBDb252ZXJ0ZXI8SnNvbkFycmF5LCBKc29uQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAoKGp2KSA9PiB7XG4gICAgICAgICAgICBpZiAoKCFBcnJheS5pc0FycmF5KGp2KSkgfHwgKHR5cGVvZiBqdiAhPT0gJ29iamVjdCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYENhbm5vdCBjb252ZXJ0IFwiJHtKU09OLnN0cmluZ2lmeShqdil9XCIgdG8gSlNPTiBhcnJheS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGp2KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jb252ZXJ0KGZyb206IHVua25vd24sIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IFJlc3VsdDxKc29uVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNsb25lKGZyb20gYXMgSnNvblZhbHVlLCBjb250ZXh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQSB0cy11dGlscyBAc2VlIENvbnZlcnRlciBmcm9tIHVua25vd24gdG8gdHlwZS1zYWZlIEpTT04sIG9wdGlvbmFsbHkgcmVuZGVyaW5nXG4gKiBhbnkgc3RyaW5nIHByb3BlcnR5IG5hbWVzIG9yIHZhbHVlcyB1c2luZyBtdXN0YWNoZSB3aXRoIGEgc3VwcGxpZWQgdmlldy5cbiAqL1xuZXhwb3J0IGNsYXNzIEpzb25Db252ZXJ0ZXIgZXh0ZW5kcyBKc29uRWRpdG9yQ29udmVydGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEpzb25Db252ZXJ0ZXIgd2l0aCBzdXBwbGllZCBvciBkZWZhdWx0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29udmVydGVyXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPEpzb25Db252ZXJ0ZXJPcHRpb25zPikge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBjb252ZXJ0ZXJPcHRpb25zVG9FZGl0b3Iob3B0aW9ucykub3JUaHJvdygpO1xuICAgICAgICBzdXBlcihlZGl0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29udmVydGVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBjb252ZXJ0ZXJcbiAgICAgKiBAcmV0dXJucyBTdWNjZXNzIHdpdGggYSBuZXcgSnNvbkNvbnZlcnRlciBvbiBzdWNjZXNzLCBvciBGYWlsdXJlIHdpdGggYW5cbiAgICAgKiBpbmZvcm1hdGl2ZSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zPzogUGFydGlhbDxKc29uQ29udmVydGVyT3B0aW9ucz4pOiBSZXN1bHQ8SnNvbkNvbnZlcnRlcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgSnNvbkNvbnZlcnRlcihvcHRpb25zKSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZWRKc29uQ29udmVydGVyT3B0aW9ucyA9IE9taXQ8SnNvbkNvbnZlcnRlck9wdGlvbnMsICd1c2VOYW1lVGVtcGxhdGVzJ3wndXNlVmFsdWVUZW1wbGF0ZXMnfCd1c2VNdWx0aVZhbHVlVGVtcGxhdGVOYW1lcyc+O1xuXG4vKipcbiAqIEEgdHMtdXRpbHMgQHNlZSBDb252ZXJ0ZXIgZnJvbSB1bmtub3duIHRvIHR5cGUtc2FmZSBKU09OIHdpdGggbXVzdGFjaGVcbiAqIHRlbXBsYXRlIHJlbmRlcmluZyBhbmQgbXVsdGktdmFsdWUgcHJvcGVydHkgbmFtZSBydWxlcyBlbmFibGVkIHJlZ2FyZGxlc3NcbiAqIG9mIGluaXRpYWwgY29udGV4dC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlZEpzb25Db252ZXJ0ZXIgZXh0ZW5kcyBKc29uRWRpdG9yQ29udmVydGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRlbXBsYXRlT3B0aW9uczogUGFydGlhbDxKc29uQ29udmVydGVyT3B0aW9ucz4gPSB7XG4gICAgICAgIHVzZU5hbWVUZW1wbGF0ZXM6IHRydWUsXG4gICAgICAgIHVzZVZhbHVlVGVtcGxhdGVzOiB0cnVlLFxuICAgICAgICB1c2VNdWx0aVZhbHVlVGVtcGxhdGVOYW1lczogdHJ1ZSxcbiAgICAgICAgdXNlQ29uZGl0aW9uYWxOYW1lczogZmFsc2UsXG4gICAgICAgIGZsYXR0ZW5VbmNvbmRpdGlvbmFsVmFsdWVzOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIFRlbXBsYXRlZEpzb25Db252ZXJ0ZXIgd2l0aCBzdXBwbGllZCBvclxuICAgICAqIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3IgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxUZW1wbGF0ZWRKc29uQ29udmVydGVyT3B0aW9ucz4pIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4uVGVtcGxhdGVkSnNvbkNvbnZlcnRlci50ZW1wbGF0ZU9wdGlvbnMgfTtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gY29udmVydGVyT3B0aW9uc1RvRWRpdG9yKG9wdGlvbnMpLm9yVGhyb3coKTtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEBzZWUgVGVtcGxhdGVkSnNvbkNvbnZlcnRlciB3aXRoIHN1cHBsaWVkIG9yXG4gICAgICogZGVmYXVsdCBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvciBjb250ZXh0IGZvciB0aGUgY29udmVydGVyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9ucz86IFBhcnRpYWw8VGVtcGxhdGVkSnNvbkNvbnZlcnRlck9wdGlvbnM+KTogUmVzdWx0PEpzb25Db252ZXJ0ZXI+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IFRlbXBsYXRlZEpzb25Db252ZXJ0ZXIob3B0aW9ucykpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uYWxKc29uQ29udmVydGVyT3B0aW9ucyA9IE9taXQ8VGVtcGxhdGVkSnNvbkNvbnZlcnRlck9wdGlvbnMsICd1c2VDb25kaXRpb25hbE5hbWVzJz47XG5cbi8qKlxuICogQSB0cy11dGlscyBAc2VlIENvbnZlcnRlciBmcm9tIHVua25vd24gdG8gdHlwZS1zYWZlIEpTT04gd2l0aCBtdXN0YWNoZVxuICogdGVtcGxhdGUgcmVuZGVyaW5nLCBtdWx0aS12YWx1ZSBwcm9wZXJ0eSBuYW1lIGFuZCBjb25kaXRpb25hbCBwcm9wZXJ0eVxuICogbmFtZSBydWxlcyBlbmFibGVkIHJlZ2FyZGxlc3Mgb2YgaW5pdGlhbCBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxKc29uQ29udmVydGVyIGV4dGVuZHMgSnNvbkVkaXRvckNvbnZlcnRlciB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBjb25kaXRpb25hbE9wdGlvbnM6IFBhcnRpYWw8SnNvbkNvbnZlcnRlck9wdGlvbnM+ID0ge1xuICAgICAgICAuLi5UZW1wbGF0ZWRKc29uQ29udmVydGVyLnRlbXBsYXRlT3B0aW9ucyxcbiAgICAgICAgdXNlQ29uZGl0aW9uYWxOYW1lczogdHJ1ZSxcbiAgICAgICAgZmxhdHRlblVuY29uZGl0aW9uYWxWYWx1ZXM6IHRydWUsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQHNlZSBDb25kaXRpb25hbEpzb25Db252ZXJ0ZXIgd2l0aCBzdXBwbGllZCBvclxuICAgICAqIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3IgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxDb25kaXRpb25hbEpzb25Db252ZXJ0ZXJPcHRpb25zPikge1xuICAgICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCAuLi5Db25kaXRpb25hbEpzb25Db252ZXJ0ZXIuY29uZGl0aW9uYWxPcHRpb25zIH07XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGNvbnZlcnRlck9wdGlvbnNUb0VkaXRvcihvcHRpb25zKS5vclRocm93KCk7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIENvbmRpdGlvbmFsSnNvbkNvbnZlcnRlciB3aXRoIHN1cHBsaWVkIG9yXG4gICAgICogZGVmYXVsdCBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvciBjb250ZXh0IGZvciB0aGUgY29udmVydGVyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9ucz86IFBhcnRpYWw8Q29uZGl0aW9uYWxKc29uQ29udmVydGVyT3B0aW9ucz4pOiBSZXN1bHQ8SnNvbkNvbnZlcnRlcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgQ29uZGl0aW9uYWxKc29uQ29udmVydGVyKG9wdGlvbnMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJpY2hKc29uQ29udmVydGVyT3B0aW9ucyA9IE9taXQ8Q29uZGl0aW9uYWxKc29uQ29udmVydGVyT3B0aW9ucywgJ3VzZVJlZmVyZW5jZXMnPjtcblxuLyoqXG4gKiBBIHRzLXV0aWxzIEBzZWUgQ29udmVydGVyIGZyb20gdW5rbm93biB0byB0eXBlLXNhZmUgSlNPTiB3aXRoIG11c3RhY2hlXG4gKiB0ZW1wbGF0ZSByZW5kZXJpbmcsIG11bHRpLXZhbHVlIHByb3BlcnR5IG5hbWUsIGNvbmRpdGlvbmFsIHByb3BlcnR5XG4gKiBuYW1lLCBhbmQgZXh0ZXJuYWwgcmVmZXJlbmNlIHJ1bGVzIGVuYWJsZWQgcmVnYXJkbGVzcyBvZiBpbml0aWFsIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSaWNoSnNvbkNvbnZlcnRlciBleHRlbmRzIEpzb25FZGl0b3JDb252ZXJ0ZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcmljaE9wdGlvbnM6IFBhcnRpYWw8SnNvbkNvbnZlcnRlck9wdGlvbnM+ID0ge1xuICAgICAgICAuLi5Db25kaXRpb25hbEpzb25Db252ZXJ0ZXIuY29uZGl0aW9uYWxPcHRpb25zLFxuICAgICAgICB1c2VSZWZlcmVuY2VzOiB0cnVlLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEBzZWUgUmljaEpzb25Db252ZXJ0ZXIgd2l0aCBzdXBwbGllZCBvclxuICAgICAqIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3IgY29udGV4dCBmb3IgdGhlIGNvbnZlcnRlclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxSaWNoSnNvbkNvbnZlcnRlck9wdGlvbnM+KSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIC4uLlJpY2hKc29uQ29udmVydGVyLnJpY2hPcHRpb25zIH07XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGNvbnZlcnRlck9wdGlvbnNUb0VkaXRvcihvcHRpb25zKS5vclRocm93KCk7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIFJpY2hKc29uQ29udmVydGVyIHdpdGggc3VwcGxpZWQgb3JcbiAgICAgKiBkZWZhdWx0IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9yIGNvbnRleHQgZm9yIHRoZSBjb252ZXJ0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zPzogUGFydGlhbDxSaWNoSnNvbkNvbnZlcnRlck9wdGlvbnM+KTogUmVzdWx0PEpzb25Db252ZXJ0ZXI+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IFJpY2hKc29uQ29udmVydGVyKG9wdGlvbnMpKTtcbiAgICB9XG59XG4iXX0=
File without changes
@@ -22,7 +22,11 @@
22
22
  */
23
23
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
24
  if (k2 === undefined) k2 = k;
25
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
26
30
  }) : (function(o, m, k, k2) {
27
31
  if (k2 === undefined) k2 = k;
28
32
  o[k2] = m[k];
@@ -48,4 +52,4 @@ __exportStar(require("./jsonEditorRule"), exports);
48
52
  __exportStar(require("./jsonEditor"), exports);
49
53
  __exportStar(require("./jsonEditorState"), exports);
50
54
  exports.Rules = __importStar(require("./rules"));
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvanNvbkVkaXRvci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsbURBQWlDO0FBQ2pDLCtDQUE2QjtBQUM3QixvREFBa0M7QUFDbEMsaURBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vanNvbkVkaXRvclJ1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9qc29uRWRpdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vanNvbkVkaXRvclN0YXRlJztcbmV4cG9ydCAqIGFzIFJ1bGVzIGZyb20gJy4vcnVsZXMnO1xuIl19
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvanNvbkVkaXRvci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG1EQUFpQztBQUNqQywrQ0FBNkI7QUFDN0Isb0RBQWtDO0FBQ2xDLGlEQUFpQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2pzb25FZGl0b3JSdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vanNvbkVkaXRvcic7XG5leHBvcnQgKiBmcm9tICcuL2pzb25FZGl0b3JTdGF0ZSc7XG5leHBvcnQgKiBhcyBSdWxlcyBmcm9tICcuL3J1bGVzJztcbiJdfQ==
@@ -16,6 +16,11 @@ export declare class JsonEditor {
16
16
  options: JsonEditorOptions;
17
17
  protected _rules: JsonEditorRule[];
18
18
  protected constructor(options?: Partial<JsonEditorOptions>, rules?: JsonEditorRule[]);
19
+ /**
20
+ * Default singleton @see JsonEditor for simple use. Applies all rules
21
+ * but with no default context.
22
+ */
23
+ static get default(): JsonEditor;
19
24
  /**
20
25
  * Constructs a new @see JsonEditor
21
26
  * @param options Optional configuration an context for this editor
@@ -29,11 +34,6 @@ export declare class JsonEditor {
29
34
  * @param options The options used to initialize all rules
30
35
  */
31
36
  static getDefaultRules(options?: JsonEditorOptions): Result<JsonEditorRule[]>;
32
- /**
33
- * Default singleton @see JsonEditor for simple use. Applies all rules
34
- * but with no default context.
35
- */
36
- static get default(): JsonEditor;
37
37
  protected static _getDefaultOptions(options?: Partial<JsonEditorOptions>): Result<JsonEditorOptions>;
38
38
  /**
39
39
  * Merges a supplied source object into a supplied target, updating the target object.
@@ -33,8 +33,19 @@ const jsonEditorState_1 = require("./jsonEditorState");
33
33
  */
34
34
  class JsonEditor {
35
35
  constructor(options, rules) {
36
- this.options = JsonEditor._getDefaultOptions(options).getValueOrThrow();
37
- this._rules = rules || JsonEditor.getDefaultRules(this.options).getValueOrThrow();
36
+ this.options = JsonEditor._getDefaultOptions(options).orThrow();
37
+ this._rules = rules || JsonEditor.getDefaultRules(this.options).orThrow();
38
+ }
39
+ /**
40
+ * Default singleton @see JsonEditor for simple use. Applies all rules
41
+ * but with no default context.
42
+ */
43
+ static get default() {
44
+ if (!JsonEditor._default) {
45
+ const rules = this.getDefaultRules().orDefault();
46
+ JsonEditor._default = new JsonEditor(undefined, rules);
47
+ }
48
+ return JsonEditor._default;
38
49
  }
39
50
  /**
40
51
  * Constructs a new @see JsonEditor
@@ -42,7 +53,7 @@ class JsonEditor {
42
53
  * @param rules Optional set of rules used by this editor
43
54
  */
44
55
  static create(options, rules) {
45
- return ts_utils_1.captureResult(() => new JsonEditor(options, rules));
56
+ return (0, ts_utils_1.captureResult)(() => new JsonEditor(options, rules));
46
57
  }
47
58
  /**
48
59
  * Gets the default set of rules to be applied for a given set of options.
@@ -51,24 +62,13 @@ class JsonEditor {
51
62
  * @param options The options used to initialize all rules
52
63
  */
53
64
  static getDefaultRules(options) {
54
- return ts_utils_1.mapResults([
65
+ return (0, ts_utils_1.mapResults)([
55
66
  rules_1.TemplatedJsonEditorRule.create(options),
56
67
  rules_1.ConditionalJsonEditorRule.create(options),
57
68
  rules_1.MultiValueJsonEditorRule.create(options),
58
69
  rules_1.ReferenceJsonEditorRule.create(options),
59
70
  ]);
60
71
  }
61
- /**
62
- * Default singleton @see JsonEditor for simple use. Applies all rules
63
- * but with no default context.
64
- */
65
- static get default() {
66
- if (!JsonEditor._default) {
67
- const rules = this.getDefaultRules().getValueOrDefault();
68
- JsonEditor._default = new JsonEditor(undefined, rules);
69
- }
70
- return JsonEditor._default;
71
- }
72
72
  static _getDefaultOptions(options) {
73
73
  const context = options === null || options === void 0 ? void 0 : options.context;
74
74
  let validation = options === null || options === void 0 ? void 0 : options.validation;
@@ -79,7 +79,7 @@ class JsonEditor {
79
79
  onUndefinedPropertyValue: 'ignore',
80
80
  };
81
81
  }
82
- return ts_utils_1.succeed({ context, validation });
82
+ return (0, ts_utils_1.succeed)({ context, validation });
83
83
  }
84
84
  /**
85
85
  * Merges a supplied source object into a supplied target, updating the target object.
@@ -116,7 +116,7 @@ class JsonEditor {
116
116
  return mergeResult.withFailureDetail('error');
117
117
  }
118
118
  }
119
- return ts_utils_1.succeedWithDetail(base);
119
+ return (0, ts_utils_1.succeedWithDetail)(base);
120
120
  }
121
121
  /**
122
122
  * Deep clones a supplied JSON value, applying all editor rules and a default
@@ -135,13 +135,13 @@ class JsonEditor {
135
135
  if ((valueResult.detail === 'error') || (valueResult.detail === 'ignore')) {
136
136
  return valueResult;
137
137
  }
138
- if (common_1.isJsonPrimitive(value) || (value === null)) {
139
- return ts_utils_1.succeedWithDetail(value, 'edited');
138
+ if ((0, common_1.isJsonPrimitive)(value) || (value === null)) {
139
+ return (0, ts_utils_1.succeedWithDetail)(value, 'edited');
140
140
  }
141
- else if (common_1.isJsonObject(value)) {
141
+ else if ((0, common_1.isJsonObject)(value)) {
142
142
  return this.mergeObjectInPlace({}, value, state.context).withFailureDetail('error');
143
143
  }
144
- else if (common_1.isJsonArray(value)) {
144
+ else if ((0, common_1.isJsonArray)(value)) {
145
145
  return this._cloneArray(value, state.context);
146
146
  }
147
147
  else if (value === undefined) {
@@ -169,25 +169,25 @@ class JsonEditor {
169
169
  return this._mergeClonedProperty(target, key, cloned, state);
170
170
  });
171
171
  if (valueResult.isFailure() && (valueResult.detail === 'error')) {
172
- return ts_utils_1.fail(`${key}: ${valueResult.message}`);
172
+ return (0, ts_utils_1.fail)(`${key}: ${valueResult.message}`);
173
173
  }
174
174
  }
175
175
  else if (propResult.detail !== 'ignore') {
176
- return ts_utils_1.fail(`${key}: ${propResult.message}`);
176
+ return (0, ts_utils_1.fail)(`${key}: ${propResult.message}`);
177
177
  }
178
178
  }
179
179
  else {
180
- return ts_utils_1.fail(`${key}: Cannot merge inherited properties`);
180
+ return (0, ts_utils_1.fail)(`${key}: Cannot merge inherited properties`);
181
181
  }
182
182
  }
183
- return ts_utils_1.succeed(target);
183
+ return (0, ts_utils_1.succeed)(target);
184
184
  }
185
185
  _cloneArray(src, context) {
186
186
  const results = src.map((v) => {
187
187
  return this.clone(v, context);
188
188
  });
189
- return ts_utils_1.mapDetailedResults(results, ['ignore']).onSuccess((converted) => {
190
- return ts_utils_1.succeed(converted);
189
+ return (0, ts_utils_1.mapDetailedResults)(results, ['ignore']).onSuccess((converted) => {
190
+ return (0, ts_utils_1.succeed)(converted);
191
191
  }).withFailureDetail('error');
192
192
  }
193
193
  _mergeClonedProperty(target, key, newValue, state) {
@@ -195,27 +195,27 @@ class JsonEditor {
195
195
  // merge is called right after clone so this should never happen
196
196
  // since clone itself will have failed
197
197
  // istanbul ignore else
198
- if (common_1.isJsonPrimitive(newValue)) {
198
+ if ((0, common_1.isJsonPrimitive)(newValue)) {
199
199
  target[key] = newValue;
200
- return ts_utils_1.succeedWithDetail(newValue, 'edited');
200
+ return (0, ts_utils_1.succeedWithDetail)(newValue, 'edited');
201
201
  }
202
- else if (common_1.isJsonObject(newValue)) {
203
- if (common_1.isJsonObject(existing)) {
202
+ else if ((0, common_1.isJsonObject)(newValue)) {
203
+ if ((0, common_1.isJsonObject)(existing)) {
204
204
  return this.mergeObjectInPlace(existing, newValue, state.context).withFailureDetail('error');
205
205
  }
206
206
  target[key] = newValue;
207
- return ts_utils_1.succeedWithDetail(newValue, 'edited');
207
+ return (0, ts_utils_1.succeedWithDetail)(newValue, 'edited');
208
208
  }
209
- else if (common_1.isJsonArray(newValue)) {
210
- if (common_1.isJsonArray(existing)) {
209
+ else if ((0, common_1.isJsonArray)(newValue)) {
210
+ if ((0, common_1.isJsonArray)(existing)) {
211
211
  target[key] = existing.concat(...newValue);
212
- return ts_utils_1.succeedWithDetail(target[key], 'edited');
212
+ return (0, ts_utils_1.succeedWithDetail)(target[key], 'edited');
213
213
  }
214
214
  target[key] = newValue;
215
- return ts_utils_1.succeedWithDetail(newValue, 'edited');
215
+ return (0, ts_utils_1.succeedWithDetail)(newValue, 'edited');
216
216
  }
217
217
  else {
218
- return ts_utils_1.failWithDetail(`Invalid JSON: ${JSON.stringify(newValue)}`, 'error');
218
+ return (0, ts_utils_1.failWithDetail)(`Invalid JSON: ${JSON.stringify(newValue)}`, 'error');
219
219
  }
220
220
  }
221
221
  _editProperty(key, value, state) {
@@ -225,7 +225,7 @@ class JsonEditor {
225
225
  return ruleResult;
226
226
  }
227
227
  }
228
- return ts_utils_1.failWithDetail('inapplicable', 'inapplicable');
228
+ return (0, ts_utils_1.failWithDetail)('inapplicable', 'inapplicable');
229
229
  }
230
230
  _editValue(value, state) {
231
231
  for (const rule of this._rules) {
@@ -234,7 +234,7 @@ class JsonEditor {
234
234
  return ruleResult;
235
235
  }
236
236
  }
237
- return ts_utils_1.failWithDetail('inapplicable', 'inapplicable');
237
+ return (0, ts_utils_1.failWithDetail)('inapplicable', 'inapplicable');
238
238
  }
239
239
  _finalizeAndMerge(target, state) {
240
240
  const deferred = state.deferred;
@@ -245,15 +245,15 @@ class JsonEditor {
245
245
  return this.mergeObjectsInPlaceWithContext(state.context, target, ruleResult.value).withFailureDetail('error');
246
246
  }
247
247
  else if (ruleResult.detail === 'ignore') {
248
- ts_utils_1.succeedWithDetail(target, 'edited');
248
+ (0, ts_utils_1.succeedWithDetail)(target, 'edited');
249
249
  }
250
250
  else if (ruleResult.detail !== 'inapplicable') {
251
- return ts_utils_1.failWithDetail(ruleResult.message, ruleResult.detail);
251
+ return (0, ts_utils_1.failWithDetail)(ruleResult.message, ruleResult.detail);
252
252
  }
253
253
  }
254
254
  }
255
- return ts_utils_1.succeedWithDetail(target, 'edited');
255
+ return (0, ts_utils_1.succeedWithDetail)(target, 'edited');
256
256
  }
257
257
  }
258
258
  exports.JsonEditor = JsonEditor;
259
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uRWRpdG9yL2pzb25FZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsbUNBS2lCO0FBQ2pCLDRDQVV1QjtBQUV2QixzQ0FBeUc7QUFFekcsdURBQW9HO0FBSXBHOzs7O0dBSUc7QUFDSCxNQUFhLFVBQVU7SUFTbkIsWUFBc0IsT0FBb0MsRUFBRSxLQUF3QjtRQUNoRixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4RSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0RixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBb0MsRUFBRSxLQUF3QjtRQUMvRSxPQUFPLHdCQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUEyQjtRQUNyRCxPQUFPLHFCQUFVLENBQWlCO1lBQzlCLCtCQUF1QixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDdkMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUN6QyxnQ0FBd0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3hDLCtCQUF1QixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sS0FBSyxPQUFPO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENB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VSxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsRUFBRTtnQkFDbEUsT0FBTyxVQUFVLENBQUM7YUFDckI7U0FDSjtRQUNELE9BQU8seUJBQWMsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVTLGlCQUFpQixDQUFDLE1BQWtCLEVBQUUsS0FBc0I7UUFDbEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3hCLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEg7cUJBQ0ksSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTtvQkFDckMsNEJBQWlCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUN2QztxQkFDSSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssY0FBYyxFQUFFO29CQUMzQyxPQUFPLHlCQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ2hFO2FBQ0o7U0FDSjtRQUNELE9BQU8sNEJBQWlCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDSjtBQTNQRCxnQ0EyUEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDb25kaXRpb25hbEpzb25FZGl0b3JSdWxlLFxuICAgIE11bHRpVmFsdWVKc29uRWRpdG9yUnVsZSxcbiAgICBSZWZlcmVuY2VKc29uRWRpdG9yUnVsZSxcbiAgICBUZW1wbGF0ZWRKc29uRWRpdG9yUnVsZSxcbn0gZnJvbSAnLi9ydWxlcyc7XG5pbXBvcnQge1xuICAgIERldGFpbGVkUmVzdWx0LFxuICAgIFJlc3VsdCxcbiAgICBjYXB0dXJlUmVzdWx0LFxuICAgIGZhaWwsXG4gICAgZmFpbFdpdGhEZXRhaWwsXG4gICAgbWFwRGV0YWlsZWRSZXN1bHRzLFxuICAgIG1hcFJlc3VsdHMsXG4gICAgc3VjY2VlZCxcbiAgICBzdWNjZWVkV2l0aERldGFpbCxcbn0gZnJvbSAnQGZndi90cy11dGlscyc7XG5cbmltcG9ydCB7IEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblZhbHVlLCBpc0pzb25BcnJheSwgaXNKc29uT2JqZWN0LCBpc0pzb25QcmltaXRpdmUgfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHsgSnNvbkVkaXRGYWlsdXJlUmVhc29uLCBKc29uRWRpdG9yUnVsZSwgSnNvblByb3BlcnR5RWRpdEZhaWx1cmVSZWFzb24gfSBmcm9tICcuL2pzb25FZGl0b3JSdWxlJztcbmltcG9ydCB7IEpzb25FZGl0b3JPcHRpb25zLCBKc29uRWRpdG9yU3RhdGUsIEpzb25FZGl0b3JWYWxpZGF0aW9uT3B0aW9ucyB9IGZyb20gJy4vanNvbkVkaXRvclN0YXRlJztcblxuaW1wb3J0IHsgSnNvbkNvbnRleHQgfSBmcm9tICcuLi9qc29uQ29udGV4dCc7XG5cbi8qKlxuICogVGhlIEpzb25FZGl0b3IgY2FuIGJlIHVzZWQgdG8gZWRpdCBKU09OIG9iamVjdHMgaW4gcGxhY2Ugb3IgdG8gY2xvbmUgYW55IEpTT04gdmFsdWUsXG4gKiBhcHBseWluZyBhIGRlZmF1bHQgY29udGV4dCBhbmQgb3B0aW9uYWwgc2V0IG9mIGVkaXRvciBydWxlcyB0aGF0IHdlcmUgc3VwcGxpZWQgYXRcbiAqIGluaXRpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgSnNvbkVkaXRvciB7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZGVmYXVsdD86IEpzb25FZGl0b3I7XG5cbiAgICAvKipcbiAgICAgKiBGdWxsIHNldCBvZiBAc2VlIEpzb25FZGl0b3JPcHRpb25zIGluIGVmZmVjdCBmb3IgdGhpcyBydWxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcHRpb25zOiBKc29uRWRpdG9yT3B0aW9ucztcbiAgICBwcm90ZWN0ZWQgX3J1bGVzOiBKc29uRWRpdG9yUnVsZVtdO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPEpzb25FZGl0b3JPcHRpb25zPiwgcnVsZXM/OiBKc29uRWRpdG9yUnVsZVtdKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IEpzb25FZGl0b3IuX2dldERlZmF1bHRPcHRpb25zKG9wdGlvbnMpLmdldFZhbHVlT3JUaHJvdygpO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzIHx8IEpzb25FZGl0b3IuZ2V0RGVmYXVsdFJ1bGVzKHRoaXMub3B0aW9ucykuZ2V0VmFsdWVPclRocm93KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIEpzb25FZGl0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGFuIGNvbnRleHQgZm9yIHRoaXMgZWRpdG9yXG4gICAgICogQHBhcmFtIHJ1bGVzIE9wdGlvbmFsIHNldCBvZiBydWxlcyB1c2VkIGJ5IHRoaXMgZWRpdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9ucz86IFBhcnRpYWw8SnNvbkVkaXRvck9wdGlvbnM+LCBydWxlcz86IEpzb25FZGl0b3JSdWxlW10pOiBSZXN1bHQ8SnNvbkVkaXRvcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgSnNvbkVkaXRvcihvcHRpb25zLCBydWxlcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlZmF1bHQgc2V0IG9mIHJ1bGVzIHRvIGJlIGFwcGxpZWQgZm9yIGEgZ2l2ZW4gc2V0IG9mIG9wdGlvbnMuXG4gICAgICogQnkgZGVmYXVsdCwgYWxsIGF2YWlsYWJsZSBydWxlcyAodGVtcGxhdGVzLCBjb25kaXRpb25hbHMsIG11bHRpLXZhbHVlIGFuZCByZWZlcmVuY2VzKVxuICAgICAqIGFyZSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbGwgcnVsZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlZmF1bHRSdWxlcyhvcHRpb25zPzogSnNvbkVkaXRvck9wdGlvbnMpOiBSZXN1bHQ8SnNvbkVkaXRvclJ1bGVbXT4ge1xuICAgICAgICByZXR1cm4gbWFwUmVzdWx0czxKc29uRWRpdG9yUnVsZT4oW1xuICAgICAgICAgICAgVGVtcGxhdGVkSnNvbkVkaXRvclJ1bGUuY3JlYXRlKG9wdGlvbnMpLFxuICAgICAgICAgICAgQ29uZGl0aW9uYWxKc29uRWRpdG9yUnVsZS5jcmVhdGUob3B0aW9ucyksXG4gICAgICAgICAgICBNdWx0aVZhbHVlSnNvbkVkaXRvclJ1bGUuY3JlYXRlKG9wdGlvbnMpLFxuICAgICAgICAgICAgUmVmZXJlbmNlSnNvbkVkaXRvclJ1bGUuY3JlYXRlKG9wdGlvbnMpLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHNpbmdsZXRvbiBAc2VlIEpzb25FZGl0b3IgZm9yIHNpbXBsZSB1c2UuIEFwcGxpZXMgYWxsIHJ1bGVzXG4gICAgICogYnV0IHdpdGggbm8gZGVmYXVsdCBjb250ZXh0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGRlZmF1bHQoKTogSnNvbkVkaXRvciB7XG4gICAgICAgIGlmICghSnNvbkVkaXRvci5fZGVmYXVsdCkge1xuICAgICAgICAgICAgY29uc3QgcnVsZXMgPSB0aGlzLmdldERlZmF1bHRSdWxlcygpLmdldFZhbHVlT3JEZWZhdWx0KCk7XG4gICAgICAgICAgICBKc29uRWRpdG9yLl9kZWZhdWx0ID0gbmV3IEpzb25FZGl0b3IodW5kZWZpbmVkLCBydWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpzb25FZGl0b3IuX2RlZmF1bHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZ2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucz86IFBhcnRpYWw8SnNvbkVkaXRvck9wdGlvbnM+KTogUmVzdWx0PEpzb25FZGl0b3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IEpzb25Db250ZXh0fHVuZGVmaW5lZCA9IG9wdGlvbnM/LmNvbnRleHQ7XG4gICAgICAgIGxldCB2YWxpZGF0aW9uOiBKc29uRWRpdG9yVmFsaWRhdGlvbk9wdGlvbnN8dW5kZWZpbmVkID0gb3B0aW9ucz8udmFsaWRhdGlvbjtcbiAgICAgICAgaWYgKHZhbGlkYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBvbkludmFsaWRQcm9wZXJ0eU5hbWU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgb25JbnZhbGlkUHJvcGVydHlWYWx1ZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBvblVuZGVmaW5lZFByb3BlcnR5VmFsdWU6ICdpZ25vcmUnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh7IGNvbnRleHQsIHZhbGlkYXRpb24gfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIGEgc3VwcGxpZWQgc291cmNlIG9iamVjdCBpbnRvIGEgc3VwcGxpZWQgdGFyZ2V0LCB1cGRhdGluZyB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGJlIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gc3JjIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGJlIG1lcmdlZFxuICAgICAqIEBwYXJhbSBydW50aW1lQ29udGV4dCBBbiBvcHRpb25hbCBAc2VlIEpzb25Db250ZXh0IHN1cHBseWluZyB2YXJpYWJsZXMgYW5kIHJlZmVyZW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgbWVyZ2VPYmplY3RJblBsYWNlKHRhcmdldDogSnNvbk9iamVjdCwgc3JjOiBKc29uT2JqZWN0LCBydW50aW1lQ29udGV4dD86IEpzb25Db250ZXh0KTogUmVzdWx0PEpzb25PYmplY3Q+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgSnNvbkVkaXRvclN0YXRlKHRoaXMsIHRoaXMub3B0aW9ucywgcnVudGltZUNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVyZ2VPYmplY3RJblBsYWNlKHRhcmdldCwgc3JjLCBzdGF0ZSkub25TdWNjZXNzKChtZXJnZWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maW5hbGl6ZUFuZE1lcmdlKG1lcmdlZCwgc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgbXVsdGlwbGUgc3VwcGxpZWQgc291cmNlIG9iamVjdHMgaW50byBhIHN1cHBsaWVkIHRhcmdldCwgdXBkYXRpbmcgdGhlIHRhcmdldFxuICAgICAqIG9iamVjdCBhbmQgdXNpbmcgdGhlIGRlZmF1bHQgY29udGV4dCBzdXBwbGllZCBhdCBjcmVhdGlvbiB0aW1lLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gYmUgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBzcmNPYmplY3RzIE9iamVjdHMgdG8gYmUgbWVyZ2VkIGludG8gdGhlIHRhcmdldCBvYmplY3QsIGluIHRoZSBvcmRlciBzdXBwbGllZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbWVyZ2VPYmplY3RzSW5QbGFjZSh0YXJnZXQ6IEpzb25PYmplY3QsIHNyY09iamVjdHM6IEpzb25PYmplY3RbXSk6IFJlc3VsdDxKc29uT2JqZWN0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmdlT2JqZWN0c0luUGxhY2VXaXRoQ29udGV4dCh0aGlzLm9wdGlvbnMuY29udGV4dCwgdGFyZ2V0LCBzcmNPYmplY3RzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgbXVsdGlwbGUgc3VwcGxpZWQgc291cmNlIG9iamVjdHMgaW50byBhIHN1cHBsaWVkIHRhcmdldCwgdXBkYXRpbmcgdGhlIHRhcmdldFxuICAgICAqIG9iamVjdCBhbmQgdXNpbmcgYW4gb3B0aW9uYWwgY29udGV4dCBzdXBwbGllZCBpbiB0aGUgY2FsbC5cbiAgICAgKiBAcGFyYW0gY29udGV4dCBBbiBvcHRpb25hbCBAc2VlIEpzb25Db250ZXh0IHN1cHBseWluZyB2YXJpYWJsZXMgYW5kIHJlZmVyZW5jZXNcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGJlIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gc3JjT2JqZWN0cyBPYmplY3RzIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0LCBpbiB0aGUgb3JkZXIgc3VwcGxpZWQuXG4gICAgICovXG4gICAgcHVibGljIG1lcmdlT2JqZWN0c0luUGxhY2VXaXRoQ29udGV4dChjb250ZXh0OiBKc29uQ29udGV4dHx1bmRlZmluZWQsIGJhc2U6IEpzb25PYmplY3QsIHNyY09iamVjdHM6IEpzb25PYmplY3RbXSk6IFJlc3VsdDxKc29uT2JqZWN0PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc3JjIG9mIHNyY09iamVjdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlUmVzdWx0ID0gdGhpcy5tZXJnZU9iamVjdEluUGxhY2UoYmFzZSwgc3JjLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChtZXJnZVJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZVJlc3VsdC53aXRoRmFpbHVyZURldGFpbCgnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwoYmFzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVlcCBjbG9uZXMgYSBzdXBwbGllZCBKU09OIHZhbHVlLCBhcHBseWluZyBhbGwgZWRpdG9yIHJ1bGVzIGFuZCBhIGRlZmF1bHRcbiAgICAgKiBvciBvcHRpb25hbGx5IHN1cHBsaWVkIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gc3JjIFRoZSBAc2VlIEpzb25WYWx1ZSB0byBiZSBjbG9uZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBbiBvcHRpb25hbCBAc2VlIEpzb25Db250ZXh0IHN1cHBseWluZyB2YXJpYWJsZXMgYW5kIHJlZmVyZW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvbmUoc3JjOiBKc29uVmFsdWUsIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IERldGFpbGVkUmVzdWx0PEpzb25WYWx1ZSwgSnNvbkVkaXRGYWlsdXJlUmVhc29uPiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IEpzb25FZGl0b3JTdGF0ZSh0aGlzLCB0aGlzLm9wdGlvbnMsIGNvbnRleHQpO1xuICAgICAgICBsZXQgdmFsdWUgPSBzcmM7XG4gICAgICAgIGxldCB2YWx1ZVJlc3VsdCA9IHRoaXMuX2VkaXRWYWx1ZShzcmMsIHN0YXRlKTtcblxuICAgICAgICB3aGlsZSAodmFsdWVSZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVSZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB2YWx1ZVJlc3VsdCA9IHRoaXMuX2VkaXRWYWx1ZSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh2YWx1ZVJlc3VsdC5kZXRhaWwgPT09ICdlcnJvcicpIHx8ICh2YWx1ZVJlc3VsdC5kZXRhaWwgPT09ICdpZ25vcmUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlUmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvblByaW1pdGl2ZSh2YWx1ZSkgfHwgKHZhbHVlID09PSBudWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKHZhbHVlLCAnZWRpdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNKc29uT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RJblBsYWNlKHt9LCB2YWx1ZSwgc3RhdGUuY29udGV4dCkud2l0aEZhaWx1cmVEZXRhaWwoJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNKc29uQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xvbmVBcnJheSh2YWx1ZSwgc3RhdGUuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmZhaWxWYWxpZGF0aW9uKCd1bmRlZmluZWRQcm9wZXJ0eVZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlLmZhaWxWYWxpZGF0aW9uKCdpbnZhbGlkUHJvcGVydHlWYWx1ZScsIGBDYW5ub3QgY29udmVydCBpbnZhbGlkIEpTT046IFwiJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9XCJgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21lcmdlT2JqZWN0SW5QbGFjZSh0YXJnZXQ6IEpzb25PYmplY3QsIHNyYzogSnNvbk9iamVjdCwgc3RhdGU6IEpzb25FZGl0b3JTdGF0ZSk6IFJlc3VsdDxKc29uT2JqZWN0PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNyYykge1xuICAgICAgICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcFJlc3VsdCA9IHRoaXMuX2VkaXRQcm9wZXJ0eShrZXksIHNyY1trZXldLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BSZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BSZXN1bHQuZGV0YWlsID09PSAnZGVmZXJyZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5kZWZlcihwcm9wUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlUmVzdWx0ID0gdGhpcy5fbWVyZ2VPYmplY3RJblBsYWNlKHRhcmdldCwgcHJvcFJlc3VsdC52YWx1ZSwgc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlUmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BSZXN1bHQuZGV0YWlsID09PSAnaW5hcHBsaWNhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVJlc3VsdCA9IHRoaXMuY2xvbmUoc3JjW2tleV0sIHN0YXRlLmNvbnRleHQpLm9uU3VjY2VzcygoY2xvbmVkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVyZ2VDbG9uZWRQcm9wZXJ0eSh0YXJnZXQsIGtleSwgY2xvbmVkLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlc3VsdC5pc0ZhaWx1cmUoKSAmJiAodmFsdWVSZXN1bHQuZGV0YWlsID09PSAnZXJyb3InKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7a2V5fTogJHt2YWx1ZVJlc3VsdC5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BSZXN1bHQuZGV0YWlsICE9PSAnaWdub3JlJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrZXl9OiAke3Byb3BSZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrZXl9OiBDYW5ub3QgbWVyZ2UgaW5oZXJpdGVkIHByb3BlcnRpZXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0YXJnZXQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2xvbmVBcnJheShzcmM6IEpzb25BcnJheSwgY29udGV4dD86IEpzb25Db250ZXh0KTogRGV0YWlsZWRSZXN1bHQ8SnNvbkFycmF5LCBKc29uRWRpdEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHNyYy5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKHYsIGNvbnRleHQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbWFwRGV0YWlsZWRSZXN1bHRzPEpzb25WYWx1ZSwgSnNvbkVkaXRGYWlsdXJlUmVhc29uPihyZXN1bHRzLCBbJ2lnbm9yZSddKS5vblN1Y2Nlc3MoKGNvbnZlcnRlZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoY29udmVydGVkKTtcbiAgICAgICAgfSkud2l0aEZhaWx1cmVEZXRhaWwoJ2Vycm9yJyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tZXJnZUNsb25lZFByb3BlcnR5KHRhcmdldDogSnNvbk9iamVjdCwga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBKc29uVmFsdWUsIHN0YXRlOiBKc29uRWRpdG9yU3RhdGUpOiBEZXRhaWxlZFJlc3VsdDxKc29uVmFsdWUsIEpzb25FZGl0RmFpbHVyZVJlYXNvbj4ge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRhcmdldFtrZXldO1xuXG4gICAgICAgIC8vIG1lcmdlIGlzIGNhbGxlZCByaWdodCBhZnRlciBjbG9uZSBzbyB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW5cbiAgICAgICAgLy8gc2luY2UgY2xvbmUgaXRzZWxmIHdpbGwgaGF2ZSBmYWlsZWRcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgICAgaWYgKGlzSnNvblByaW1pdGl2ZShuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwobmV3VmFsdWUsICdlZGl0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0pzb25PYmplY3QobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoaXNKc29uT2JqZWN0KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1lcmdlT2JqZWN0SW5QbGFjZShleGlzdGluZywgbmV3VmFsdWUsIHN0YXRlLmNvbnRleHQpLndpdGhGYWlsdXJlRGV0YWlsKCdlcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbChuZXdWYWx1ZSwgJ2VkaXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzSnNvbkFycmF5KG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKGlzSnNvbkFycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gZXhpc3RpbmcuY29uY2F0KC4uLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodGFyZ2V0W2tleV0sICdlZGl0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwobmV3VmFsdWUsICdlZGl0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbChgSW52YWxpZCBKU09OOiAke0pTT04uc3RyaW5naWZ5KG5ld1ZhbHVlKX1gLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZWRpdFByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogSnNvblZhbHVlLCBzdGF0ZTogSnNvbkVkaXRvclN0YXRlKTogRGV0YWlsZWRSZXN1bHQ8SnNvbk9iamVjdCwgSnNvblByb3BlcnR5RWRpdEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHRoaXMuX3J1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlUmVzdWx0ID0gcnVsZS5lZGl0UHJvcGVydHkoa2V5LCB2YWx1ZSwgc3RhdGUpO1xuICAgICAgICAgICAgaWYgKHJ1bGVSZXN1bHQuaXNTdWNjZXNzKCkgfHwgKHJ1bGVSZXN1bHQuZGV0YWlsICE9PSAnaW5hcHBsaWNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZVJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwoJ2luYXBwbGljYWJsZScsICdpbmFwcGxpY2FibGUnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2VkaXRWYWx1ZSh2YWx1ZTogSnNvblZhbHVlLCBzdGF0ZTogSnNvbkVkaXRvclN0YXRlKTogRGV0YWlsZWRSZXN1bHQ8SnNvblZhbHVlLCBKc29uRWRpdEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHRoaXMuX3J1bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlUmVzdWx0ID0gcnVsZS5lZGl0VmFsdWUodmFsdWUsIHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChydWxlUmVzdWx0LmlzU3VjY2VzcygpIHx8IChydWxlUmVzdWx0LmRldGFpbCAhPT0gJ2luYXBwbGljYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWxXaXRoRGV0YWlsKCdpbmFwcGxpY2FibGUnLCAnaW5hcHBsaWNhYmxlJyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5hbGl6ZUFuZE1lcmdlKHRhcmdldDogSnNvbk9iamVjdCwgc3RhdGU6IEpzb25FZGl0b3JTdGF0ZSk6IERldGFpbGVkUmVzdWx0PEpzb25PYmplY3QsIEpzb25FZGl0RmFpbHVyZVJlYXNvbj4ge1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IHN0YXRlLmRlZmVycmVkO1xuICAgICAgICBpZiAoZGVmZXJyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHRoaXMuX3J1bGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcnVsZVJlc3VsdCA9IHJ1bGUuZmluYWxpemVQcm9wZXJ0aWVzKGRlZmVycmVkLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVSZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RzSW5QbGFjZVdpdGhDb250ZXh0KHN0YXRlLmNvbnRleHQsIHRhcmdldCwgcnVsZVJlc3VsdC52YWx1ZSkud2l0aEZhaWx1cmVEZXRhaWwoJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGVSZXN1bHQuZGV0YWlsID09PSAnaWdub3JlJykge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkV2l0aERldGFpbCh0YXJnZXQsICdlZGl0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZVJlc3VsdC5kZXRhaWwgIT09ICdpbmFwcGxpY2FibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbChydWxlUmVzdWx0Lm1lc3NhZ2UsIHJ1bGVSZXN1bHQuZGV0YWlsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKHRhcmdldCwgJ2VkaXRlZCcpO1xuICAgIH1cbn1cblxuIl19
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uRWRpdG9yL2pzb25FZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsbUNBS2lCO0FBQ2pCLDRDQVV1QjtBQUV2QixzQ0FBeUc7QUFFekcsdURBQW9HO0FBSXBHOzs7O0dBSUc7QUFDSCxNQUFhLFVBQVU7SUFVbkIsWUFBc0IsT0FBb0MsRUFBRSxLQUF3QjtRQUNoRixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxLQUFLLE9BQU87UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pELFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFvQyxFQUFFLEtBQXdCO1FBQy9FLE9BQU8sSUFBQSx3QkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBMkI7UUFDckQsT0FB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LEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNKO0FBNVBELGdDQTRQQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIENvbmRpdGlvbmFsSnNvbkVkaXRvclJ1bGUsXG4gICAgTXVsdGlWYWx1ZUpzb25FZGl0b3JSdWxlLFxuICAgIFJlZmVyZW5jZUpzb25FZGl0b3JSdWxlLFxuICAgIFRlbXBsYXRlZEpzb25FZGl0b3JSdWxlLFxufSBmcm9tICcuL3J1bGVzJztcbmltcG9ydCB7XG4gICAgRGV0YWlsZWRSZXN1bHQsXG4gICAgUmVzdWx0LFxuICAgIGNhcHR1cmVSZXN1bHQsXG4gICAgZmFpbCxcbiAgICBmYWlsV2l0aERldGFpbCxcbiAgICBtYXBEZXRhaWxlZFJlc3VsdHMsXG4gICAgbWFwUmVzdWx0cyxcbiAgICBzdWNjZWVkLFxuICAgIHN1Y2NlZWRXaXRoRGV0YWlsLFxufSBmcm9tICdAZmd2L3RzLXV0aWxzJztcblxuaW1wb3J0IHsgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uVmFsdWUsIGlzSnNvbkFycmF5LCBpc0pzb25PYmplY3QsIGlzSnNvblByaW1pdGl2ZSB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBKc29uRWRpdEZhaWx1cmVSZWFzb24sIEpzb25FZGl0b3JSdWxlLCBKc29uUHJvcGVydHlFZGl0RmFpbHVyZVJlYXNvbiB9IGZyb20gJy4vanNvbkVkaXRvclJ1bGUnO1xuaW1wb3J0IHsgSnNvbkVkaXRvck9wdGlvbnMsIEpzb25FZGl0b3JTdGF0ZSwgSnNvbkVkaXRvclZhbGlkYXRpb25PcHRpb25zIH0gZnJvbSAnLi9qc29uRWRpdG9yU3RhdGUnO1xuXG5pbXBvcnQgeyBKc29uQ29udGV4dCB9IGZyb20gJy4uL2pzb25Db250ZXh0JztcblxuLyoqXG4gKiBUaGUgSnNvbkVkaXRvciBjYW4gYmUgdXNlZCB0byBlZGl0IEpTT04gb2JqZWN0cyBpbiBwbGFjZSBvciB0byBjbG9uZSBhbnkgSlNPTiB2YWx1ZSxcbiAqIGFwcGx5aW5nIGEgZGVmYXVsdCBjb250ZXh0IGFuZCBvcHRpb25hbCBzZXQgb2YgZWRpdG9yIHJ1bGVzIHRoYXQgd2VyZSBzdXBwbGllZCBhdFxuICogaW5pdGlhbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uRWRpdG9yIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9kZWZhdWx0PzogSnNvbkVkaXRvcjtcblxuICAgIC8qKlxuICAgICAqIEZ1bGwgc2V0IG9mIEBzZWUgSnNvbkVkaXRvck9wdGlvbnMgaW4gZWZmZWN0IGZvciB0aGlzIHJ1bGUuXG4gICAgICovXG4gICAgcHVibGljIG9wdGlvbnM6IEpzb25FZGl0b3JPcHRpb25zO1xuICAgIHByb3RlY3RlZCBfcnVsZXM6IEpzb25FZGl0b3JSdWxlW107XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3Iob3B0aW9ucz86IFBhcnRpYWw8SnNvbkVkaXRvck9wdGlvbnM+LCBydWxlcz86IEpzb25FZGl0b3JSdWxlW10pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gSnNvbkVkaXRvci5fZ2V0RGVmYXVsdE9wdGlvbnMob3B0aW9ucykub3JUaHJvdygpO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHJ1bGVzIHx8IEpzb25FZGl0b3IuZ2V0RGVmYXVsdFJ1bGVzKHRoaXMub3B0aW9ucykub3JUaHJvdygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgc2luZ2xldG9uIEBzZWUgSnNvbkVkaXRvciBmb3Igc2ltcGxlIHVzZS4gQXBwbGllcyBhbGwgcnVsZXNcbiAgICAgKiBidXQgd2l0aCBubyBkZWZhdWx0IGNvbnRleHQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXQgZGVmYXVsdCgpOiBKc29uRWRpdG9yIHtcbiAgICAgICAgaWYgKCFKc29uRWRpdG9yLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0RGVmYXVsdFJ1bGVzKCkub3JEZWZhdWx0KCk7XG4gICAgICAgICAgICBKc29uRWRpdG9yLl9kZWZhdWx0ID0gbmV3IEpzb25FZGl0b3IodW5kZWZpbmVkLCBydWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpzb25FZGl0b3IuX2RlZmF1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBAc2VlIEpzb25FZGl0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGFuIGNvbnRleHQgZm9yIHRoaXMgZWRpdG9yXG4gICAgICogQHBhcmFtIHJ1bGVzIE9wdGlvbmFsIHNldCBvZiBydWxlcyB1c2VkIGJ5IHRoaXMgZWRpdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9ucz86IFBhcnRpYWw8SnNvbkVkaXRvck9wdGlvbnM+LCBydWxlcz86IEpzb25FZGl0b3JSdWxlW10pOiBSZXN1bHQ8SnNvbkVkaXRvcj4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgSnNvbkVkaXRvcihvcHRpb25zLCBydWxlcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlZmF1bHQgc2V0IG9mIHJ1bGVzIHRvIGJlIGFwcGxpZWQgZm9yIGEgZ2l2ZW4gc2V0IG9mIG9wdGlvbnMuXG4gICAgICogQnkgZGVmYXVsdCwgYWxsIGF2YWlsYWJsZSBydWxlcyAodGVtcGxhdGVzLCBjb25kaXRpb25hbHMsIG11bHRpLXZhbHVlIGFuZCByZWZlcmVuY2VzKVxuICAgICAqIGFyZSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbGwgcnVsZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlZmF1bHRSdWxlcyhvcHRpb25zPzogSnNvbkVkaXRvck9wdGlvbnMpOiBSZXN1bHQ8SnNvbkVkaXRvclJ1bGVbXT4ge1xuICAgICAgICByZXR1cm4gbWFwUmVzdWx0czxKc29uRWRpdG9yUnVsZT4oW1xuICAgICAgICAgICAgVGVtcGxhdGVkSnNvbkVkaXRvclJ1bGUuY3JlYXRlKG9wdGlvbnMpLFxuICAgICAgICAgICAgQ29uZGl0aW9uYWxKc29uRWRpdG9yUnVsZS5jcmVhdGUob3B0aW9ucyksXG4gICAgICAgICAgICBNdWx0aVZhbHVlSnNvbkVkaXRvclJ1bGUuY3JlYXRlKG9wdGlvbnMpLFxuICAgICAgICAgICAgUmVmZXJlbmNlSnNvbkVkaXRvclJ1bGUuY3JlYXRlKG9wdGlvbnMpLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9nZXREZWZhdWx0T3B0aW9ucyhvcHRpb25zPzogUGFydGlhbDxKc29uRWRpdG9yT3B0aW9ucz4pOiBSZXN1bHQ8SnNvbkVkaXRvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgY29udGV4dDogSnNvbkNvbnRleHR8dW5kZWZpbmVkID0gb3B0aW9ucz8uY29udGV4dDtcbiAgICAgICAgbGV0IHZhbGlkYXRpb246IEpzb25FZGl0b3JWYWxpZGF0aW9uT3B0aW9uc3x1bmRlZmluZWQgPSBvcHRpb25zPy52YWxpZGF0aW9uO1xuICAgICAgICBpZiAodmFsaWRhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG9uSW52YWxpZFByb3BlcnR5TmFtZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBvbkludmFsaWRQcm9wZXJ0eVZhbHVlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIG9uVW5kZWZpbmVkUHJvcGVydHlWYWx1ZTogJ2lnbm9yZScsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHsgY29udGV4dCwgdmFsaWRhdGlvbiB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgYSBzdXBwbGllZCBzb3VyY2Ugb2JqZWN0IGludG8gYSBzdXBwbGllZCB0YXJnZXQsIHVwZGF0aW5nIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gYmUgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBzcmMgVGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgbWVyZ2VkXG4gICAgICogQHBhcmFtIHJ1bnRpbWVDb250ZXh0IEFuIG9wdGlvbmFsIEBzZWUgSnNvbkNvbnRleHQgc3VwcGx5aW5nIHZhcmlhYmxlcyBhbmQgcmVmZXJlbmNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBtZXJnZU9iamVjdEluUGxhY2UodGFyZ2V0OiBKc29uT2JqZWN0LCBzcmM6IEpzb25PYmplY3QsIHJ1bnRpbWVDb250ZXh0PzogSnNvbkNvbnRleHQpOiBSZXN1bHQ8SnNvbk9iamVjdD4ge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IG5ldyBKc29uRWRpdG9yU3RhdGUodGhpcywgdGhpcy5vcHRpb25zLCBydW50aW1lQ29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXJnZU9iamVjdEluUGxhY2UodGFyZ2V0LCBzcmMsIHN0YXRlKS5vblN1Y2Nlc3MoKG1lcmdlZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplQW5kTWVyZ2UobWVyZ2VkLCBzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBtdWx0aXBsZSBzdXBwbGllZCBzb3VyY2Ugb2JqZWN0cyBpbnRvIGEgc3VwcGxpZWQgdGFyZ2V0LCB1cGRhdGluZyB0aGUgdGFyZ2V0XG4gICAgICogb2JqZWN0IGFuZCB1c2luZyB0aGUgZGVmYXVsdCBjb250ZXh0IHN1cHBsaWVkIGF0IGNyZWF0aW9uIHRpbWUuXG4gICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCB0byBiZSB1cGRhdGVkXG4gICAgICogQHBhcmFtIHNyY09iamVjdHMgT2JqZWN0cyB0byBiZSBtZXJnZWQgaW50byB0aGUgdGFyZ2V0IG9iamVjdCwgaW4gdGhlIG9yZGVyIHN1cHBsaWVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBtZXJnZU9iamVjdHNJblBsYWNlKHRhcmdldDogSnNvbk9iamVjdCwgc3JjT2JqZWN0czogSnNvbk9iamVjdFtdKTogUmVzdWx0PEpzb25PYmplY3Q+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RzSW5QbGFjZVdpdGhDb250ZXh0KHRoaXMub3B0aW9ucy5jb250ZXh0LCB0YXJnZXQsIHNyY09iamVjdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBtdWx0aXBsZSBzdXBwbGllZCBzb3VyY2Ugb2JqZWN0cyBpbnRvIGEgc3VwcGxpZWQgdGFyZ2V0LCB1cGRhdGluZyB0aGUgdGFyZ2V0XG4gICAgICogb2JqZWN0IGFuZCB1c2luZyBhbiBvcHRpb25hbCBjb250ZXh0IHN1cHBsaWVkIGluIHRoZSBjYWxsLlxuICAgICAqIEBwYXJhbSBjb250ZXh0IEFuIG9wdGlvbmFsIEBzZWUgSnNvbkNvbnRleHQgc3VwcGx5aW5nIHZhcmlhYmxlcyBhbmQgcmVmZXJlbmNlc1xuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gYmUgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBzcmNPYmplY3RzIE9iamVjdHMgdG8gYmUgbWVyZ2VkIGludG8gdGhlIHRhcmdldCBvYmplY3QsIGluIHRoZSBvcmRlciBzdXBwbGllZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbWVyZ2VPYmplY3RzSW5QbGFjZVdpdGhDb250ZXh0KGNvbnRleHQ6IEpzb25Db250ZXh0fHVuZGVmaW5lZCwgYmFzZTogSnNvbk9iamVjdCwgc3JjT2JqZWN0czogSnNvbk9iamVjdFtdKTogUmVzdWx0PEpzb25PYmplY3Q+IHtcbiAgICAgICAgZm9yIChjb25zdCBzcmMgb2Ygc3JjT2JqZWN0cykge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VSZXN1bHQgPSB0aGlzLm1lcmdlT2JqZWN0SW5QbGFjZShiYXNlLCBzcmMsIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKG1lcmdlUmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlUmVzdWx0LndpdGhGYWlsdXJlRGV0YWlsKCdlcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbChiYXNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWVwIGNsb25lcyBhIHN1cHBsaWVkIEpTT04gdmFsdWUsIGFwcGx5aW5nIGFsbCBlZGl0b3IgcnVsZXMgYW5kIGEgZGVmYXVsdFxuICAgICAqIG9yIG9wdGlvbmFsbHkgc3VwcGxpZWQgY29udGV4dFxuICAgICAqIEBwYXJhbSBzcmMgVGhlIEBzZWUgSnNvblZhbHVlIHRvIGJlIGNsb25lZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IEFuIG9wdGlvbmFsIEBzZWUgSnNvbkNvbnRleHQgc3VwcGx5aW5nIHZhcmlhYmxlcyBhbmQgcmVmZXJlbmNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBjbG9uZShzcmM6IEpzb25WYWx1ZSwgY29udGV4dD86IEpzb25Db250ZXh0KTogRGV0YWlsZWRSZXN1bHQ8SnNvblZhbHVlLCBKc29uRWRpdEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgSnNvbkVkaXRvclN0YXRlKHRoaXMsIHRoaXMub3B0aW9ucywgY29udGV4dCk7XG4gICAgICAgIGxldCB2YWx1ZSA9IHNyYztcbiAgICAgICAgbGV0IHZhbHVlUmVzdWx0ID0gdGhpcy5fZWRpdFZhbHVlKHNyYywgc3RhdGUpO1xuXG4gICAgICAgIHdoaWxlICh2YWx1ZVJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlUmVzdWx0ID0gdGhpcy5fZWRpdFZhbHVlKHZhbHVlLCBzdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHZhbHVlUmVzdWx0LmRldGFpbCA9PT0gJ2Vycm9yJykgfHwgKHZhbHVlUmVzdWx0LmRldGFpbCA9PT0gJ2lnbm9yZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNKc29uUHJpbWl0aXZlKHZhbHVlKSB8fCAodmFsdWUgPT09IG51bGwpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodmFsdWUsICdlZGl0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0pzb25PYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXJnZU9iamVjdEluUGxhY2Uoe30sIHZhbHVlLCBzdGF0ZS5jb250ZXh0KS53aXRoRmFpbHVyZURldGFpbCgnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0pzb25BcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbG9uZUFycmF5KHZhbHVlLCBzdGF0ZS5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuZmFpbFZhbGlkYXRpb24oJ3VuZGVmaW5lZFByb3BlcnR5VmFsdWUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGUuZmFpbFZhbGlkYXRpb24oJ2ludmFsaWRQcm9wZXJ0eVZhbHVlJywgYENhbm5vdCBjb252ZXJ0IGludmFsaWQgSlNPTjogXCIke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1cImApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbWVyZ2VPYmplY3RJblBsYWNlKHRhcmdldDogSnNvbk9iamVjdCwgc3JjOiBKc29uT2JqZWN0LCBzdGF0ZTogSnNvbkVkaXRvclN0YXRlKTogUmVzdWx0PEpzb25PYmplY3Q+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3JjKSB7XG4gICAgICAgICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wUmVzdWx0ID0gdGhpcy5fZWRpdFByb3BlcnR5KGtleSwgc3JjW2tleV0sIHN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcFJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFJlc3VsdC5kZXRhaWwgPT09ICdkZWZlcnJlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmRlZmVyKHByb3BSZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VSZXN1bHQgPSB0aGlzLl9tZXJnZU9iamVjdEluUGxhY2UodGFyZ2V0LCBwcm9wUmVzdWx0LnZhbHVlLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VSZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcFJlc3VsdC5kZXRhaWwgPT09ICdpbmFwcGxpY2FibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlUmVzdWx0ID0gdGhpcy5jbG9uZShzcmNba2V5XSwgc3RhdGUuY29udGV4dCkub25TdWNjZXNzKChjbG9uZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZXJnZUNsb25lZFByb3BlcnR5KHRhcmdldCwga2V5LCBjbG9uZWQsIHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUmVzdWx0LmlzRmFpbHVyZSgpICYmICh2YWx1ZVJlc3VsdC5kZXRhaWwgPT09ICdlcnJvcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrZXl9OiAke3ZhbHVlUmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcFJlc3VsdC5kZXRhaWwgIT09ICdpZ25vcmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2tleX06ICR7cHJvcFJlc3VsdC5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2tleX06IENhbm5vdCBtZXJnZSBpbmhlcml0ZWQgcHJvcGVydGllc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jbG9uZUFycmF5KHNyYzogSnNvbkFycmF5LCBjb250ZXh0PzogSnNvbkNvbnRleHQpOiBEZXRhaWxlZFJlc3VsdDxKc29uQXJyYXksIEpzb25FZGl0RmFpbHVyZVJlYXNvbj4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gc3JjLm1hcCgodikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUodiwgY29udGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtYXBEZXRhaWxlZFJlc3VsdHM8SnNvblZhbHVlLCBKc29uRWRpdEZhaWx1cmVSZWFzb24+KHJlc3VsdHMsIFsnaWdub3JlJ10pLm9uU3VjY2VzcygoY29udmVydGVkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChjb252ZXJ0ZWQpO1xuICAgICAgICB9KS53aXRoRmFpbHVyZURldGFpbCgnZXJyb3InKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21lcmdlQ2xvbmVkUHJvcGVydHkodGFyZ2V0OiBKc29uT2JqZWN0LCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IEpzb25WYWx1ZSwgc3RhdGU6IEpzb25FZGl0b3JTdGF0ZSk6IERldGFpbGVkUmVzdWx0PEpzb25WYWx1ZSwgSnNvbkVkaXRGYWlsdXJlUmVhc29uPiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGFyZ2V0W2tleV07XG5cbiAgICAgICAgLy8gbWVyZ2UgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIGNsb25lIHNvIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlblxuICAgICAgICAvLyBzaW5jZSBjbG9uZSBpdHNlbGYgd2lsbCBoYXZlIGZhaWxlZFxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgICAgICBpZiAoaXNKc29uUHJpbWl0aXZlKG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbChuZXdWYWx1ZSwgJ2VkaXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzSnNvbk9iamVjdChuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChpc0pzb25PYmplY3QoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RJblBsYWNlKGV4aXN0aW5nLCBuZXdWYWx1ZSwgc3RhdGUuY29udGV4dCkud2l0aEZhaWx1cmVEZXRhaWwoJ2Vycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKG5ld1ZhbHVlLCAnZWRpdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNKc29uQXJyYXkobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoaXNKc29uQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBleGlzdGluZy5jb25jYXQoLi4ubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbCh0YXJnZXRba2V5XSwgJ2VkaXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbChuZXdWYWx1ZSwgJ2VkaXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWxXaXRoRGV0YWlsKGBJbnZhbGlkIEpTT046ICR7SlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpfWAsICdlcnJvcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9lZGl0UHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBKc29uVmFsdWUsIHN0YXRlOiBKc29uRWRpdG9yU3RhdGUpOiBEZXRhaWxlZFJlc3VsdDxKc29uT2JqZWN0LCBKc29uUHJvcGVydHlFZGl0RmFpbHVyZVJlYXNvbj4ge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgdGhpcy5fcnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZXN1bHQgPSBydWxlLmVkaXRQcm9wZXJ0eShrZXksIHZhbHVlLCBzdGF0ZSk7XG4gICAgICAgICAgICBpZiAocnVsZVJlc3VsdC5pc1N1Y2Nlc3MoKSB8fCAocnVsZVJlc3VsdC5kZXRhaWwgIT09ICdpbmFwcGxpY2FibGUnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbCgnaW5hcHBsaWNhYmxlJywgJ2luYXBwbGljYWJsZScpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZWRpdFZhbHVlKHZhbHVlOiBKc29uVmFsdWUsIHN0YXRlOiBKc29uRWRpdG9yU3RhdGUpOiBEZXRhaWxlZFJlc3VsdDxKc29uVmFsdWUsIEpzb25FZGl0RmFpbHVyZVJlYXNvbj4ge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgdGhpcy5fcnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZXN1bHQgPSBydWxlLmVkaXRWYWx1ZSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgICAgICAgaWYgKHJ1bGVSZXN1bHQuaXNTdWNjZXNzKCkgfHwgKHJ1bGVSZXN1bHQuZGV0YWlsICE9PSAnaW5hcHBsaWNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZVJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwoJ2luYXBwbGljYWJsZScsICdpbmFwcGxpY2FibGUnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmFsaXplQW5kTWVyZ2UodGFyZ2V0OiBKc29uT2JqZWN0LCBzdGF0ZTogSnNvbkVkaXRvclN0YXRlKTogRGV0YWlsZWRSZXN1bHQ8SnNvbk9iamVjdCwgSnNvbkVkaXRGYWlsdXJlUmVhc29uPiB7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gc3RhdGUuZGVmZXJyZWQ7XG4gICAgICAgIGlmIChkZWZlcnJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgdGhpcy5fcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBydWxlUmVzdWx0ID0gcnVsZS5maW5hbGl6ZVByb3BlcnRpZXMoZGVmZXJyZWQsIHN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAocnVsZVJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXJnZU9iamVjdHNJblBsYWNlV2l0aENvbnRleHQoc3RhdGUuY29udGV4dCwgdGFyZ2V0LCBydWxlUmVzdWx0LnZhbHVlKS53aXRoRmFpbHVyZURldGFpbCgnZXJyb3InKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocnVsZVJlc3VsdC5kZXRhaWwgPT09ICdpZ25vcmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRXaXRoRGV0YWlsKHRhcmdldCwgJ2VkaXRlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChydWxlUmVzdWx0LmRldGFpbCAhPT0gJ2luYXBwbGljYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWxXaXRoRGV0YWlsKHJ1bGVSZXN1bHQubWVzc2FnZSwgcnVsZVJlc3VsdC5kZXRhaWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodGFyZ2V0LCAnZWRpdGVkJyk7XG4gICAgfVxufVxuXG4iXX0=