ember-scoped-css 0.22.0 → 0.23.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/README.md CHANGED
@@ -86,6 +86,8 @@ const app = new EmberApp(defaults, {
86
86
  'ember-scoped-css': {
87
87
  layerName: 'app-styles', // default: 'components', set to false to disable the layer
88
88
  additionalRoots: ['routes/'], // default: [], set this to use scoped-css in pods-using apps
89
+ passthrough: ['some-other-file.css'], // default: [] this is only used in a non-embroider app to pass files through the build pipeline
90
+ passthroughDestination: 'assets' // default: undefined this alters where the passthrough files are placed in the output tree
89
91
  }
90
92
  });
91
93
  ```
@@ -461,17 +461,24 @@ var ScopedCssPreprocessor = class {
461
461
  const appCss = new import_broccoli_funnel.Funnel(inputNode, {
462
462
  include: [this.appName + "/styles/app.css"]
463
463
  });
464
- let mergedStyles = new import_broccoli_merge_trees.default([
465
- appCss,
466
- mergedOtherTrees,
467
- componentStyles
468
- ]);
464
+ let mergedStyles = new import_broccoli_merge_trees.default(
465
+ [appCss, mergedOtherTrees, componentStyles],
466
+ { overwrite: true }
467
+ );
469
468
  let newOutput = new import_broccoli_concat.default(mergedStyles, {
470
469
  outputFile: options.outputPaths["app"],
471
470
  allowNone: true,
472
471
  sourceMapConfig: { enabled: true }
473
472
  });
474
- return newOutput;
473
+ if (this.userOptions?.passthrough) {
474
+ let passedThrough = new import_broccoli_funnel.Funnel(mergedStyles, {
475
+ include: this.userOptions.passthrough,
476
+ destDir: this.userOptions.passthroughDestination
477
+ });
478
+ return new import_broccoli_merge_trees.default([passedThrough, newOutput], { overwrite: true });
479
+ } else {
480
+ return newOutput;
481
+ }
475
482
  }
476
483
  };
477
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2VtYmVyLWNsYXNzaWMtc3VwcG9ydC5qcyIsICIuLi8uLi9zcmMvbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL2lzSW5zaWRlR2xvYmFsLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvaGFzaC1mcm9tLW1vZHVsZS1wYXRoLmpzIiwgIi4uLy4uL3NyYy9saWIvcmV3cml0ZUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVIYnMuanMiLCAiLi4vLi4vc3JjL2xpYi9yZW5hbWVDbGFzcy5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgQ29uY2F0IGZyb20gJ2Jyb2Njb2xpLWNvbmNhdCc7XG5pbXBvcnQgeyBGdW5uZWwgfSBmcm9tICdicm9jY29saS1mdW5uZWwnO1xuaW1wb3J0IE1lcmdlVHJlZXMgZnJvbSAnYnJvY2NvbGktbWVyZ2UtdHJlZXMnO1xuaW1wb3J0IEZpbHRlciBmcm9tICdicm9jY29saS1wZXJzaXN0ZW50LWZpbHRlcic7XG5pbXBvcnQgeyBQcmVwcm9jZXNzb3IgfSBmcm9tICdjb250ZW50LXRhZyc7XG5cbmltcG9ydCBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MgZnJvbSAnLi4vbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyc7XG5pbXBvcnQge1xuICBoYXNoRnJvbU1vZHVsZVBhdGgsXG4gIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoLFxufSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgcmV3cml0ZUNzcyBmcm9tICcuLi9saWIvcmV3cml0ZUNzcy5qcyc7XG5pbXBvcnQgcmV3cml0ZUhicyBmcm9tICcuLi9saWIvcmV3cml0ZUhicy5qcyc7XG5cbmNvbnN0IHAgPSBuZXcgUHJlcHJvY2Vzc29yKCk7XG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnaGJzJywgJ2pzJywgJ3RzJywgJ2dqcycsICdndHMnXTtcbmNvbnN0IFRFTVBMQVRFX0VYVEVOU0lPTlMgPSBbJ2hicycsICdnanMnLCAnZ3RzJ107XG5cbmNsYXNzIFNjb3BlZEZpbHRlciBleHRlbmRzIEZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudHNOb2RlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb21wb25lbnRzTm9kZSwgb3B0aW9ucyk7XG4gICAgdGhpcy53YXJuaW5nU3RyZWFtID0gcHJvY2Vzcy5zdGRlcnI7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGdldCBleHRlbnNpb25zKCkge1xuICAgIHJldHVybiBbJ2NzcyddO1xuICB9XG5cbiAgZ2V0IHRhcmdldEV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gJ2Nzcyc7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzU3RyaW5nKGNvbnRlbnQsIHJlbGF0aXZlUGF0aCkge1xuICAgIC8vIGlnbm9yZSBjc3MgZmlsZXMgZm9yIGVtYmVyLWNzcy1tb2R1bGVzXG4gICAgaWYgKHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGNvcnJlc3BvbmRpbmcganMgZmlsZSBleGlzdHNcbiAgICBsZXQgaGFzUmVsZXZhbnRGaWxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbnB1dFBhdGggb2YgdGhpcy5pbnB1dFBhdGhzKSB7XG4gICAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSBicmVhaztcblxuICAgICAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgICAgIGlmIChoYXNSZWxldmFudEZpbGUpIGJyZWFrO1xuXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MkLywgJy4nICsgZXh0KTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHJlbGF0aXZlQ29tcG9uZW50UGF0aCk7XG5cbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoY29tcG9uZW50UGF0aCkpIHtcbiAgICAgICAgICBoYXNSZWxldmFudEZpbGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUG9kcyBzdXBwb3J0XG4gICAgICAgKi9cbiAgICAgIGlmIChyZWxhdGl2ZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKGlucHV0UGF0aCwgZGlyZWN0b3J5KTtcblxuICAgICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgICAgaGFzUmVsZXZhbnRGaWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJld3JpdGUgY3NzIGZpbGVcbiAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSB7XG4gICAgICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGNvbnN0IGhhc2ggPSBoYXNoRnJvbU1vZHVsZVBhdGgobG9jYWxQYWNrYWdlclN0eWxlUGF0aCk7XG5cbiAgICAgIGNvbnRlbnQgPSByZXdyaXRlQ3NzKFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBoYXNoLFxuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHRoaXMub3B0aW9ucy5nZXRVc2VyT3B0aW9ucz8uKCk/LmxheWVyTmFtZSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcG9zdFByb2Nlc3MocmVzdWx0cywgcmVsYXRpdmVQYXRoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJIHx8IHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5wdXRQYXRoIG9mIHRoaXMuaW5wdXRQYXRocykge1xuICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0ge307XG5cbiAgICAgIGVhY2hFeHRlbnNpb246IGZvciAobGV0IGV4dCBvZiBURU1QTEFURV9FWFRFTlNJT05TKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MvLCAnLicgKyBleHQpO1xuICAgICAgICBsZXQgdGVtcGxhdGVGaWxlUGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHRlbXBsYXRlUGF0aCk7XG4gICAgICAgIGxldCBleGlzdHMgPSBleGlzdHNTeW5jKHRlbXBsYXRlRmlsZVBhdGgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQb2RzIHN1cHBvcnRcbiAgICAgICAgICovXG4gICAgICAgIGlmIChleHQgPT09ICdoYnMnICYmICFleGlzdHMgJiYgcmVsYXRpdmVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJykpIHtcbiAgICAgICAgICBsZXQgcG9kc05hbWUgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcblxuICAgICAgICAgIHRlbXBsYXRlRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCBwb2RzTmFtZSk7XG4gICAgICAgICAgZXhpc3RzID0gZXhpc3RzU3luYyh0ZW1wbGF0ZUZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICB0ZW1wbGF0ZUZpbGUucGF0aCA9IHRlbXBsYXRlRmlsZVBhdGg7XG4gICAgICAgICAgdGVtcGxhdGVGaWxlLmV4dCA9IGV4dDtcblxuICAgICAgICAgIGJyZWFrIGVhY2hFeHRlbnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHRlbXBsYXRlIGV4aXN0cyB3ZSBjaGVjayB0aGUgY3NzIGZvciBjaGFuZ2VzXG4gICAgICBpZiAodGVtcGxhdGVGaWxlLnBhdGgpIHtcbiAgICAgICAgY29uc3QgY3NzRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBjc3NDb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlKGNzc0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgeyBjbGFzc2VzLCB0YWdzIH0gPSBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MoY3NzQ29udGVudHMpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzZXMgPSB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLmdldChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgcHJldmlvdXMgY2xhc3NlcywgYW5kIHRoZXkgYXJlIGRpZmZlcmVudCwgYnVpbGQgdGVtcGxhdGVzIHRvIGNvbXBhcmVcbiAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NlcyAmJiBjbGFzc2VzICE9PSBwcmV2aW91c0NsYXNzZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID1cbiAgICAgICAgICAgIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgY29uc3QgcG9zdGZpeCA9IGhhc2hGcm9tTW9kdWxlUGF0aChsb2NhbFBhY2thZ2VyU3R5bGVQYXRoKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVJhdyA9IGF3YWl0IHJlYWRGaWxlKHRlbXBsYXRlRmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNvbXBhcmlzb24gPSBbXTtcbiAgICAgICAgICBsZXQgdGVtcGxhdGVDb250ZW50cyA9IHRlbXBsYXRlUmF3O1xuXG4gICAgICAgICAgaWYgKHRlbXBsYXRlRmlsZS5leHQgPT09ICdoYnMnKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZUNvbXBhcmlzb24ucHVzaChcbiAgICAgICAgICAgICAgZGlkVGVtcGxhdGVDaGFuZ2UoXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZW50cyxcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICB0YWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIGFsbCB0ZW1wbGF0ZSB0YWdzLCBhbmQgZXh0cmFjdCB0aGUgY29udGVudHMgdG8gY29tcGFyZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHAucGFyc2UodGVtcGxhdGVSYXcsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IHJlc3VsdHMubWFwKCh4KSA9PiB4LmNvbnRlbnRzKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGVtcGxhdGUgb2YgdGVtcGxhdGVzKSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlQ29tcGFyaXNvbi5wdXNoKFxuICAgICAgICAgICAgICAgIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNoYW5nZWQgPSB0ZW1wbGF0ZUNvbXBhcmlzb24uc29tZSgodikgPT4gdik7XG5cbiAgICAgICAgICAvLyBpZiB0aGUgcmV3cml0ZSBkb2Vzbid0IG1hdGNoIHRoZSBvcmlnaW5hbCBvdXRwdXQsIHdlIHdhbnQgdG8gcmVidWlsZCB0aGUgdGVtcGxhdGVcbiAgICAgICAgICBpZiAodGVtcGxhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGF3ZnVsIGhhY2sgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBpbnZhbGlkYXRlIGJyb2Njb2xpLXBlcnNpc3RlbnQtZmlsdGVyIGNhY2hlXG4gICAgICAgICAgICAvLyBpZGVhbGx5IHdlJ2QgaW52YWxpZGF0ZSB0aGUgYnJvY2NvbGktcGVyaXN0ZW50LWZpbHRlciBjYWNoZSBoZXJlXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcGxhdGVGaWxlLnBhdGgsIHRlbXBsYXRlQ29udGVudHMgKyAnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhc3NpZ24gZm9yIG5leHQgcnVuIGNvbXBhcmlzb25cblxuICAgICAgICB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLnNldChyZWxhdGl2ZVBhdGgsIGNsYXNzZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBjb250ZXh0IG9mIGRpZmZlcmVudCBzZXRzIG9mIGV4dHJhY2VkIGNzcyBjbGFzc2VzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzXG4gKiBAcGFyYW0ge1NldH0gcHJldmlvdXNDbGFzc2VzXG4gKiBAcGFyYW0ge1NldH0gY3VycmVudENsYXNzZXNcbiAqIEBwYXJhbSB7U2V0fSB0YWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zdGZpeFxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICBjb250ZW50cyxcbiAgcHJldmlvdXNDbGFzc2VzLFxuICBjdXJyZW50Q2xhc3NlcyxcbiAgdGFncyxcbiAgcG9zdGZpeCxcbikge1xuICBjb25zdCBvcmlnaW5hbCA9IHJld3JpdGVIYnMoY29udGVudHMsIHByZXZpb3VzQ2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG4gIGNvbnN0IGN1cnJlbnQgPSByZXdyaXRlSGJzKGNvbnRlbnRzLCBjdXJyZW50Q2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG5cbiAgcmV0dXJuIG9yaWdpbmFsICE9PSBjdXJyZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY29wZWRDc3NQcmVwcm9jZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5vd25lciA9IG9wdGlvbnMub3duZXI7XG4gICAgdGhpcy5hcHBOYW1lID0gb3B0aW9ucy5vd25lci5wYXJlbnQucGtnLm5hbWU7XG4gICAgdGhpcy5uYW1lID0gJ3Njb3BlZC1jc3MtcHJlcHJvY2Vzc29yJztcbiAgICB0aGlzLnByZXZpb3VzQ2xhc3NlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcHRpb25zIGZyb20gYHNldHVwUHJlcHJvY2Vzc29yUmVnaXN0cnlgLCB0aGUgdjEtQWRkb24gSG9va1xuICAgKiBAcGFyYW0ge3sgbGF5ZXJOYW1lPzogc3RyaW5nIH19IG9wdGlvbnNcbiAgICovXG4gIGNvbmZpZ3VyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMudXNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHsgWydub3QgY29uZmlndXJlZCddOiB0cnVlIH07XG4gIH1cblxuICB0b1RyZWUoaW5wdXROb2RlLCBpbnB1dFBhdGgsIG91dHB1dERpcmVjdG9yeSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG90aGVyUHJlcHJvY2Vzc29ycyA9IHRoaXMucHJlcHJvY2Vzc29ycy5maWx0ZXIoKHApID0+IHAgIT09IHRoaXMpO1xuICAgIGNvbnN0IG90aGVyVHJlZXMgPSBvdGhlclByZXByb2Nlc3NvcnMubWFwKChwKSA9PiBwLnRvVHJlZSguLi5hcmd1bWVudHMpKTtcbiAgICBsZXQgbWVyZ2VkT3RoZXJUcmVlcyA9IG5ldyBNZXJnZVRyZWVzKG90aGVyVHJlZXMpO1xuXG4gICAgbGV0IHJvb3RzID0gW1xuICAgICAgdGhpcy5hcHBOYW1lICsgJy9jb21wb25lbnRzLycsXG4gICAgICAuLi4odGhpcy51c2VyT3B0aW9ucy5hZGRpdGlvbmFsUm9vdHMgfHwgW10pLm1hcChcbiAgICAgICAgKHJvb3QpID0+IGAke3RoaXMuYXBwTmFtZX0vJHtyb290fWAsXG4gICAgICApLFxuICAgIF07XG4gICAgbGV0IGluY2x1ZGUgPSByb290c1xuICAgICAgLm1hcCgocm9vdCkgPT4ge1xuICAgICAgICBsZXQgd2l0aFNsYXNoID0gcm9vdC5lbmRzV2l0aCgnLycpID8gcm9vdCA6IGAke3Jvb3R9L2A7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHt3aXRoU2xhc2h9KiovKi5jc3NgLFxuICAgICAgICAgIC4uLkNPTVBPTkVOVF9FWFRFTlNJT05TLm1hcCgoZXh0KSA9PiBgJHt3aXRoU2xhc2h9KiovKi4ke2V4dH1gKSxcbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgICAuZmxhdCgpO1xuXG4gICAgbGV0IGNvbXBvbmVudHNOb2RlID0gbmV3IEZ1bm5lbChpbnB1dE5vZGUsIHsgaW5jbHVkZSB9KTtcblxuICAgIGNvbXBvbmVudHNOb2RlID0gbmV3IFNjb3BlZEZpbHRlcihjb21wb25lbnRzTm9kZSwge1xuICAgICAgaW5wdXRQYXRoLFxuICAgICAgZ2V0VXNlck9wdGlvbnM6ICgpID0+IHRoaXMudXNlck9wdGlvbnMsXG4gICAgICBvd25lcjogdGhpcy5vd25lcixcbiAgICAgIHByZXZpb3VzQ2xhc3NlczogdGhpcy5wcmV2aW91c0NsYXNzZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRTdHlsZXMgPSBuZXcgRnVubmVsKGNvbXBvbmVudHNOb2RlLCB7XG4gICAgICBpbmNsdWRlOiByb290cy5tYXAoKHJvb3QpID0+IHtcbiAgICAgICAgbGV0IHdpdGhTbGFzaCA9IHJvb3QuZW5kc1dpdGgoJy8nKSA/IHJvb3QgOiBgJHtyb290fS9gO1xuXG4gICAgICAgIHJldHVybiBgJHt3aXRoU2xhc2h9KiovKi5jc3NgO1xuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBhcHBDc3MgPSBuZXcgRnVubmVsKGlucHV0Tm9kZSwge1xuICAgICAgaW5jbHVkZTogW3RoaXMuYXBwTmFtZSArICcvc3R5bGVzL2FwcC5jc3MnXSxcbiAgICB9KTtcblxuICAgIGxldCBtZXJnZWRTdHlsZXMgPSBuZXcgTWVyZ2VUcmVlcyhbXG4gICAgICBhcHBDc3MsXG4gICAgICBtZXJnZWRPdGhlclRyZWVzLFxuICAgICAgY29tcG9uZW50U3R5bGVzLFxuICAgIF0pO1xuXG4gICAgbGV0IG5ld091dHB1dCA9IG5ldyBDb25jYXQobWVyZ2VkU3R5bGVzLCB7XG4gICAgICBvdXRwdXRGaWxlOiBvcHRpb25zLm91dHB1dFBhdGhzWydhcHAnXSxcbiAgICAgIGFsbG93Tm9uZTogdHJ1ZSxcbiAgICAgIHNvdXJjZU1hcENvbmZpZzogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3T3V0cHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgcGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyJztcblxuaW1wb3J0IGlzSW5zaWRlR2xvYmFsIGZyb20gJy4vaXNJbnNpZGVHbG9iYWwuanMnO1xuXG5mdW5jdGlvbiBnZXRDbGFzc2VzQW5kVGFncyhzZWwsIGNsYXNzZXMsIHRhZ3MpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNscykgPT4ge1xuICAgIHNscy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBjbGFzc2VzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgdGFncy5hZGQoc2VsZWN0b3IudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHBhcnNlcih0cmFuc2Zvcm0pLnByb2Nlc3NTeW5jKHNlbCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsYXNzZXNUYWdzRnJvbUNzcyhjc3MpIHtcbiAgY29uc3QgY2xhc3NlcyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgdGFncyA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBhc3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cbiAgYXN0LndhbGsoKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAncnVsZScpIHtcbiAgICAgIGdldENsYXNzZXNBbmRUYWdzKG5vZGUuc2VsZWN0b3IsIGNsYXNzZXMsIHRhZ3MpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgY2xhc3NlcywgdGFncyB9O1xufVxuXG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJbnNpZGVHbG9iYWwobm9kZSwgZnVuYykge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdwc2V1ZG8nICYmIHBhcmVudC52YWx1ZSA9PT0gJzpnbG9iYWwnKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gaXNJbnNpZGVHbG9iYWwocGFyZW50LCBmdW5jKTtcbn1cbiIsICJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmc1N5bmMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuaW1wb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5leHBvcnQgeyBoYXNoRnJvbUFic29sdXRlUGF0aCB9IGZyb20gJy4vaGFzaC1mcm9tLWFic29sdXRlLXBhdGguanMnO1xuZXhwb3J0IHsgaGFzaEZyb21Nb2R1bGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tbW9kdWxlLXBhdGguanMnO1xuXG5jb25zdCBFTUJST0lERVJfRElSID0gJ25vZGVfbW9kdWxlcy8uZW1icm9pZGVyJztcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSCA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1hcHBgO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMgPSBgJHtFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEh9L2Fzc2V0c2A7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fUEFDS0FHRVMgPSBgJHtFTUJST0lERVJfRElSfS9yZXdyaXR0ZW4tcGFja2FnZXNgO1xuY29uc3QgSVJSRUxFVkFOVF9QQVRIUyA9IFsnbm9kZV9tb2R1bGVzLy5wbnBtJ107XG5jb25zdCBVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUyA9IG5ldyBTZXQoWyd0ZXN0cyddKTtcblxuY29uc3QgQ1dEID0gcHJvY2Vzcy5jd2QoKTtcblxuLyoqXG4gKiBSZWdhcmRsZXNzIG9mIHdoYXQgdGhlIGZpbGVQYXRoIGZvcm1hdCBpcyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHBvc3RmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaEZyb20oZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBoYXNoRnJvbUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gIH1cblxuICByZXR1cm4gaGFzaEZyb21Nb2R1bGVQYXRoKGZpbGVQYXRoKTtcbn1cblxuLyoqXG4gKiBCYXNlZCBvbiBlbWJlcidzIGNvbXBvbmVudCBsb2NhdGlvbiBjb252ZW50aW9ucyxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIGEgcGF0aCBmb3Igd2hlcmUgd2VcbiAqIGV4cGVjdCB0aGUgQ1NTIHRvIGxpdmUuXG4gKlxuICogRm9yIGNvLWxvY2F0ZWQgc3RydWN0dXJlOlxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50Lmhic1xuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50LmNzc1xuICpcbiAqIEZvciBuZXN0ZWQgY28tbG9jYXRlZCBzdHJ1Y3R1cmVcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQvZm9vLmNzc1xuICpcbiAqIEZvciBQb2RzIHJvdXRlcyBzdHJ1Y3R1cmVcbiAqICAgLSByb3V0ZXMvbXktcm91dGUvdGVtcGxhdGUue2hicyxqc31cbiAqICAgLSByb3V0ZXMvbXktcm91dGUvc3R5bGVzLmNzc1xuICpcbiAqIERlbGliZXJhdGVseSBub3Qgc3VwcG9ydGVkOlxuICogICAtIGNvbXBvbmVudHMgdy8gcG9kcyAtLSB0aGlzIGlzIGRlcHJlY2F0ZWQgaW4gNS4xMFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZSAtIHRoZSBoYnMsIGpzLCBnanMsIGd0cyBvciB3aGF0ZXZlciBjby1sb2NhdGVkIHBhdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGV4cGVjdGVkIGNzcyBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NQYXRoRm9yKGZpbGVOYW1lKSB7XG4gIGxldCB3aXRob3V0RXh0ID0gd2l0aG91dEV4dGVuc2lvbihmaWxlTmFtZSk7XG4gIGxldCBjc3NQYXRoID0gd2l0aG91dEV4dCArICcuY3NzJztcblxuICBpZiAoaXNQb2QoZmlsZU5hbWUpKSB7XG4gICAgY3NzUGF0aCA9IGZpbGVOYW1lXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5qcyQvLCAnc3R5bGVzLmNzcycpXG4gICAgICAucmVwbGFjZSgvdGVtcGxhdGVcXC5oYnMvLCAnc3R5bGVzLmNzcycpO1xuICB9XG5cbiAgcmV0dXJuIGNzc1BhdGg7XG59XG5cbi8qKlxuICogTm90ZSB0aGF0IGNvbXBvbmVudHMgaW4gdGhlIFwicG9kc1wiIGNvbnZlbnRpb24gd2lsbFxuICogbmV2ZXIgYmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguaW5jbHVkZXMoJy9jb21wb25lbnRzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5qcycpIHx8IGZpbGVQYXRoLmVuZHNXaXRoKCd0ZW1wbGF0ZS5oYnMnKTtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBlbmRzIHdpdGhcbiAqIC0gdGVtcGxhdGUuanNcbiAqIC0gdGVtcGxhdGUuaGJzXG4gKiAtIHN0eWxlcy5jc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9kKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNQb2RUZW1wbGF0ZShmaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aCgnc3R5bGVzLmNzcycpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zIHRoZSBzYW1lIHBhdGgsIGJ1dCB3aXRob3V0IHRoZSBleHRlbnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRFeHRlbnNpb24oZmlsZVBhdGgpIHtcbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UoZmlsZVBhdGgpO1xuXG4gIHJldHVybiBwYXRoLmpvaW4ocGFyc2VkLmRpciwgcGFyc2VkLm5hbWUpO1xufVxuXG4vKipcbiAqIEV4YW1wbGVzIGZvciBmaWxlTmFtZVxuICogLSBhYnNvbHV0ZSBvbi1kaXNrIHBhdGhcbiAqIC0gaW4gd2VicGFja1xuICogICAtIFVSTC1hYnNvbHV0ZSBwYXRoLCBzdGFydGluZyB3aXRoIC9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWVcbiAqIEBwYXJhbSB7eyBhZGRpdGlvbmFsUm9vdHM/OiBzdHJpbmdbXTsgY3dkOiBzdHJpbmcgfX0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsZXZhbnRGaWxlKGZpbGVOYW1lLCB7IGFkZGl0aW9uYWxSb290cywgY3dkIH0pIHtcbiAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJy9AZW1icm9pZGVyJykpIHJldHVybiBmYWxzZTtcbiAgaWYgKElSUkVMRVZBTlRfUEFUSFMuc29tZSgoaSkgPT4gZmlsZU5hbWUuaW5jbHVkZXMoaSkpKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpKSB7XG4gICAgLy8gaWYgYSBmaWxlIGlzIG5vdCB0aGUgZW1icm9pZGVyIGNhY2hlIGRpcmVjdG9yeVxuICAgIC8vIGFuZCBpcyBpbiBub2RlX21vZHVsZXMsIHNraXAgaXQuXG4gICAgaWYgKCFmaWxlTmFtZS5pbmNsdWRlcyhFTUJST0lERVJfRElSKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHJld3JpdHRlbiBwYWNrYWdlcyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGF0IHRoZWlyIG93blxuICAgIC8vIHB1Ymxpc2ggdGltZVxuICAgIGlmIChmaWxlTmFtZS5pbmNsdWRlcyhFTUJST0lERVJfM19SRVdSSVRURU5fUEFDS0FHRVMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgYXJlIGFscmVhZHkgdGhlIGJ1bmRsZWQgZmlsZXMuXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfQVNTRVRTKSkge1xuICAgICAgLy8gbm90IHN1cHBvcnRlZCwgbmV2ZXIgd2lsbCBiZVxuICAgICAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfQVNTRVRTfS90ZXN0cy5qc2ApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWRlYWxseSwgd2UgbmV2ZXIgZ2V0IGhlcmUgLS0gaW5kaWNhdGVzIHdlJ3JlIG5vdCBmaWx0ZXJpbmcgZWZmZWN0aXZlbHkgaW4gYmFiZWxcbiAgICAgIC8vIE5PVEU6IGlmIHdlIGdldCBoZXJlLCB3ZSdyZSB0cnlpbmcgdG8gb3BlcmF0ZSBvbiBhIGZpbGUgdG9vIGxhdGUuXG4gICAgICAvLyAgICAgICB3ZSBuZWVkIFNjb3BlZENTUyB0byBvcGVyYXRlIGFzIGNsb3NlIHRvIG9yaWdpbmFsIHNvdXJjZSBhcyBwb3NzaWJsZSAtLSBub3Qgb3V0cHV0IGZpbGVzLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGxldCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChmaWxlTmFtZSk7XG5cbiAgYXNzZXJ0KGN3ZCwgYGN3ZCB3YXMgbm90IHBhc3NlZCB0byBpc1JlbGV2YW50RmlsZWApO1xuXG4gIGxldCBvdXJXb3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChjd2QpO1xuXG4gIGlmICh3b3Jrc3BhY2UgIT09IG91cldvcmtzcGFjZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBsb2NhbCA9IGZpbGVOYW1lLnJlcGxhY2Uod29ya3NwYWNlLCAnJyk7XG4gIGxldCBbLCAuLi5wYXJ0c10gPSBsb2NhbC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcblxuICBpZiAoVU5TVVBQT1JURURfRElSRUNUT1JJRVMuaGFzKHBhcnRzWzBdKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgcG9kcyBzdXBwb3J0LlxuICAgKiBmb2xrcyBuZWVkIHRvIG9wdCBpbiB0byBwb2RzIChyb3V0ZXMpLCBiZWNhdXNlIGV2ZXJ5IHBvZHMgYXBwIGNhbiBiZSBjb25maWd1cmVkIGRpZmZlcmVudGx5XG4gICAqL1xuICBsZXQgcm9vdHMgPSBbJy9jb21wb25lbnRzLycsICcvdGVtcGxhdGVzLycsIC4uLihhZGRpdGlvbmFsUm9vdHMgfHwgW10pXTtcblxuICBpZiAoIXJvb3RzLnNvbWUoKHJvb3QpID0+IGZpbGVOYW1lLmluY2x1ZGVzKHJvb3QpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVNjb3BlZFBhdGgpIHtcbiAgLyoqXG4gICAqICpCeSBjb252ZW50aW9uKiwgYHNyY2AgaXMgb21pdHRlZCBmcm9tIGNvbXBvbmVudCBwYXRocy5cbiAgICogV2UgY2FuIHJlZmxlY3QgdGhlIHNhbWUgYmVoYXZpb3IgYnkgcmVwbGFjaW5nIHNyYy9cbiAgICogd2l0aCBhbiBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIENTUyBpc24ndCBlbWl0dGVkIGFzIGEgY28tbG9jYXRlZCBtb2R1bGUsIGJ1dFxuICAgKiB0byBrZWVwIGNvbnZlbnRpb25zIGNvbnNpc3RlbnQgYWNyb3NzIGxhbmd1YWdlcyxcbiAgICogd2UgY2FuIHByZXRlbmQgaXQgaXMuXG4gICAqXG4gICAqIEFueSBjdXN0b21pemF0aW9uIGJleW9uZCByZW1vdmluZyBgc3JjYCBhbmQgYGFwcGAgaXMgcG90ZW50aWFsbHkgY29uZnVzaW5nLlxuICAgKiBJZiB3ZSBuZWVkIGZ1cnRoZXIgY3VzdG9taXphdGlvbnMsIHdlJ2xsIHdhbnQgdG8gbWF0Y2ggb24gYGV4cG9ydHNgIGluIHRoZVxuICAgKiBjb3JyZXNwb25kaW5nIHBhY2thZ2UuanNvblxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VTY29wZWRQYXRoLnJlcGxhY2UoL15cXC9zcmNcXC8vLCAnLycpO1xuXG4gIGxldCBwYXJzZWQgPSBwYXRoLnBhcnNlKHBhY2thZ2VSZWxhdGl2ZSk7XG5cbiAgaWYgKGlzUG9kKHBhY2thZ2VSZWxhdGl2ZSkpIHtcbiAgICAvKipcbiAgICAgKiBGb3IgcG9kcywgd2UgY2hvcCBvZmYgdGhlIHdob2xlIGZpbGUsIGFuZCB1c2UgdGhlIGRpciBuYW1lIGFzIHRoZSBcIm1vZHVsZVBhdGhcIlxuICAgICAqL1xuICAgIHJldHVybiBwYXJzZWQuZGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGFuIGV4dGVuc2lvbiBpcyBwYXNzZWQsIHJlbW92ZSBpdC5cbiAgICogV2hlbiB1c2luZyBwYWNrYWdlcnMsIGZvbGtzIGFyZSB1c2VkIHRvIG5vdCBoYXZpbmcgdG8gc3BlY2lmeSBleHRlbnNpb25zIGZvciBmaWxlcy5cbiAgICogU2luY2Ugd2UgZG9uJ3QgZXZlbiBlbWl0IGNzcyBmaWxlcyBjby1sb2NhdGVkIHRvIGVhY2ggbW9kdWxlLFxuICAgKiB0aGlzIGhlbHBzIHVzIG5vdCBjb252ZXkgYSBsaWUgdGhhdCBhIGZpbGUgbWF5IGV4aXN0IGluIGF0IHJ1bnRpbWUuXG4gICAqXG4gICAqIEZvciBleGFtcGxlIGA8bW9kdWxlLW5hbWU+L2NvbXBvbmVudHMvYnV0dG9uYC5cbiAgICogSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgZXh0ZW5zaW9uIGlzLCBiZWNhdXNlIHlvdSBjYW4gb25seSBoYXZlIG9uZSBjc3MgZmlsZVxuICAgKiBmb3IgdGhlIGJ1dHRvbiBtb2R1bGUgYW55d2F5LlxuICAgKi9cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYXRoLmpvaW4ocGFyc2VkLmRpciwgcGFyc2VkLm5hbWUpO1xuXG4gIHJldHVybiBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoO1xufVxuXG4vKipcbiAqIHJldHVybnMgdGhlIGFwcC1tb2R1bGUgcGF0aCBvZiB0aGUgc291cmNlIGZpbGVcbiAqXG4gKiBUaGlzIGFzc3VtZXMgbm9ybWFsIGVtYmVyIGFwcCBjb252ZW50aW9uc1xuICpcbiAqIHdoaWNoIGlzIGA8cGFja2FnZS5qc29uI25hbWU+L3BhdGgtdG8tZmlsZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcFBhdGgoc291cmNlUGF0aCkge1xuICBsZXQgd29ya3NwYWNlUGF0aCA9IGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgpO1xuICBsZXQgbmFtZSA9IG1vZHVsZU5hbWUoc291cmNlUGF0aCk7XG5cbiAgLyoqXG4gICAqICBVbmRlciBlbWJyb2lkZXIgYnVpbGRzLCB0aGUgc3BlYy1jb21wbGlhbnQgdmVyc2lvbiBvZiB0aGUgYXBwXG4gICAqIGhhcyBhbGwgdGhlIGZpbGVzIHVuZGVyIGEgZm9sZGVyIHdoaWNoIHJlcHJlc2VudHMgdGhlIHBhY2thZ2UgbmFtZSxcbiAgICogcmF0aGVyIHRoYW4gXCJhcHBcIi5cbiAgICovXG4gIGxldCBwYWNrYWdlUmVsYXRpdmUgPSBzb3VyY2VQYXRoLnJlcGxhY2Uod29ya3NwYWNlUGF0aCwgJycpO1xuXG4gIC8qKlxuICAgKiBCdXQgd2UgYWxzbyBkb24ndCB3YW50ICdhcHAnIC0tIHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIHYxIGFkZG9uIHBpcGVsaW5lXG4gICAqL1xuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZShgL2FwcC9gLCBgL2ApO1xuXG4gIC8qKlxuICAgKiBhbHNvIGFsc28sIHdlIGtub3cgdGhhdCB0aGUgcmUtd3JpdHRlbiBhcHAgc3RydWN0dXJlIGluIGVtYnJvaWRlckB2M1xuICAgKiBpcyBleHRyYW5lb3VzLCBhbmQgd2UgY2FuIGNvbGxhcHNlIGl0XG4gICAqL1xuICBwYWNrYWdlUmVsYXRpdmUgPSBwYWNrYWdlUmVsYXRpdmUucmVwbGFjZShcbiAgICBgJHtFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEh9L2AsXG4gICAgJy8nLFxuICApO1xuXG4gIGxldCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID0gcGFja2FnZVNjb3BlZFBhdGhUb01vZHVsZVBhdGgocGFja2FnZVJlbGF0aXZlKTtcblxuICByZXR1cm4gYCR7bmFtZX0ke2xvY2FsUGFja2FnZXJTdHlsZVBhdGh9YDtcbn1cblxuLyoqXG4gKiBUbyBhdm9pZCBoaXR0aW5nIHRoZSBmaWxlc3lzZXRtLCB3ZSdsbCBzdG9yZSBhbGwgZm91bmRcbiAqIHByb2plY3QgcGF0aHMgYmVyZSwgc28gd2UgY2FuLCBpbiBtZW1vcnksXG4gKiBnZXQgdGhlIGZvbGRlciB3aGVyZSBhIHBhY2thZ2UuanNvbiBleGlzdHMsIHJhdGhlciB0aGFuXG4gKiBoaXQgdGhlIGZpbGUgc3lzdGVtIGV2ZXJ5IHRpbWUuXG4gKi9cbmNvbnN0IFNFRU4gPSBuZXcgU2V0KCk7XG5cbmZ1bmN0aW9uIGdldFNlZW4oc291cmNlUGF0aCkge1xuICBpZiAoU0VFTi5oYXMoc291cmNlUGF0aCkpIHJldHVybiBzb3VyY2VQYXRoO1xuXG4gIGxldCBwYXJ0cyA9IHNvdXJjZVBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHNlZW4gPSBTRUVOLmhhcyh0b0NoZWNrKTtcblxuICAgIGlmIChzZWVuKSB7XG4gICAgICByZXR1cm4gdG9DaGVjaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYXRoKHNvdXJjZVBhdGgsIG9wdGlvbnMpIHtcbiAgbGV0IGN3ZCA9IG9wdGlvbnM/LmN3ZCA/PyBDV0Q7XG5cbiAgaWYgKHNvdXJjZVBhdGguaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIKSkge1xuICAgIHNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnNwbGl0KEVNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSClbMF07XG4gIH1cblxuICBpZiAoc291cmNlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgfVxuXG4gIGxldCBzZWVuID0gZ2V0U2Vlbihzb3VyY2VQYXRoKTtcblxuICBpZiAoc2Vlbikge1xuICAgIHJldHVybiBzZWVuO1xuICB9XG5cbiAgbGV0IGNhbmRpZGF0ZVBhdGggPSBwYXRoLmpvaW4oc291cmNlUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGNvbnN0IGlzV29ya3NwYWNlID0gZnNTeW5jLmV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCk7XG5cbiAgaWYgKGlzV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZVBhdGg7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBmaW5kUGFja2FnZUpzb25VcChzb3VyY2VQYXRoLCB7IGN3ZCB9KTtcblxuICBpZiAoIXBhY2thZ2VKc29uUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwcm9qZWN0IGZvciAke3NvdXJjZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYXRoID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCk7XG5cbiAgU0VFTi5hZGQod29ya3NwYWNlUGF0aCk7XG5cbiAgcmV0dXJuIHdvcmtzcGFjZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblVwKHN0YXJ0UGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcbiAgbGV0IHBhcnRzID0gc3RhcnRQYXRoLnNwbGl0KCcvJyk7XG5cbiAgZm9yIChsZXQgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPiAxOyBpLS0pIHtcbiAgICBsZXQgdG9DaGVjayA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTtcblxuICAgIGxldCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbih0b0NoZWNrLCAncGFja2FnZS5qc29uJyk7XG4gICAgbGV0IGV4aXN0cyA9IGZzU3luYy5leGlzdHNTeW5jKHBhY2thZ2VKc29uKTtcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIHJldHVybiBwYWNrYWdlSnNvbjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB0cmF2ZXJzZSBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCBvZiB0aGUgZmlsZSBzeXN0ZW0uXG4gICAgaWYgKHRvQ2hlY2sgPT09IGN3ZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IE1BTklGRVNUX0NBQ0hFID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIFdpbGwgcmV0dXJuIHRoZSBwYWNrYWdlLmpzb24jbmFtZSwgb3IgY29uZmlnL2Vudmlyb25tZW50I21vdWRsZVByZWZpeCAoaWYgdjEgYXBwKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2R1bGVOYW1lKHNvdXJjZVBhdGgpIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKTtcblxuICBpZiAobWFuaWZlc3RbJ2VtYmVyLWFkZG9uJ10pIHtcbiAgICAvKipcbiAgICAgKiBMaWJyYXJpZXMgYXJlIG5vdCBhbGxvd2VkIHRvIGN1c3RvbWl6ZSB0aGVpciBtb2R1bGUgbmFtZVxuICAgICAqIHRvIGJlIGRpZmZlcmVudCBmcm9tIHRoZWlyIHBhY2thZ2UgbmFtZS5cbiAgICAgKlxuICAgICAqIChJdCdzIGFsc28gYm9ua2VycyB0aGF0IHRoaXMgaXMgYWxsb3dlZCBmb3IgdjEgYXBwcylcbiAgICAgKi9cbiAgICByZXR1cm4gbWFuaWZlc3QubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgdjEgYXBwcywgd2UgbmVlZCB0byByZWZlcmVuY2UgdGhlIGNvbmZpZy9lbnZpcm9ubWVudC5qcyBmaWxlXG4gICAqIHRvIHNlZSBpZiB0aGUgbW9kdWxlUHJlZml4IHNldHRpbmcgZGlmZmVycyBmcm9tIG1hbmlmZXN0Lm5hbWU7XG4gICAqL1xuICBsZXQgZW52aXJvbm1lbnRKUyA9IHBhdGguam9pbih3b3Jrc3BhY2UsICdjb25maWcvZW52aXJvbm1lbnQuanMnKTtcblxuICAvKipcbiAgICogTk9URTogdGhlIGVudmlyb25tZW50LmpzIGlzIGEgY29tbW9uSlMgZmlsZSwgc28gd2UgY2FuIHN5bmNocm9ub3VzbHkgcmVxdWlyZSBpdFxuICAgKlxuICAgKiBUT0RPOiBpZiB3ZSBoYXZlIGlzc3VlcyB3aXRoIGxvYWRpbmcgdGhpcyBmaWxlIGxhdGVyIHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IHJ1biBqc2NvZGVzaGlmdCBvbiBpdFxuICAgKiAgICAgICBidXQgdGhhdCBjb3VsZCBhbGxvdyB1cyB0byBiZSBicml0dGxlIGluIGRpZmZlcmVudCB3YXlzLCBsaWtlIGlmIGZvbGtzIHN0cmF5IGZyb20gdGhlIHdheSB0aGVcbiAgICogICAgICAgZmlsZSBpcyBsYWlkIG91dCBmcm9tIHRoZSBibHVlcHJpbnQgZGVmYXVsdHMuXG4gICAqL1xuICBpZiAoZnNTeW5jLmV4aXN0c1N5bmMoZW52aXJvbm1lbnRKUykpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYgLS0gdGhpcyBleGlzdHNcbiAgICBjb25zdCBlbnZGbiA9IHJlcXVpcmUoZW52aXJvbm1lbnRKUyk7XG4gICAgY29uc3QgZW52ID0gZW52Rm4oJ2VtYmVyLXNjb3BlZC1jc3MnKTtcblxuICAgIHJldHVybiBlbnYubW9kdWxlUHJlZml4IHx8IG1hbmlmZXN0Lm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgdG8gdGhlIHRydWVcdTIxMjIgbW9kdWxlXHUyMTIyIG5hbWUuXG4gICAqL1xuICByZXR1cm4gbWFuaWZlc3QubmFtZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd29ya3NwYWNlXG4gKi9cbmZ1bmN0aW9uIGdldE1hbmlmZXN0KHdvcmtzcGFjZSkge1xuICBsZXQgZXhpc3RpbmcgPSBNQU5JRkVTVF9DQUNIRS5nZXQod29ya3NwYWNlKTtcblxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBsZXQgYnVmZmVyID0gZnNTeW5jLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya3NwYWNlLCAncGFja2FnZS5qc29uJykpO1xuICBsZXQgY29udGVudCA9IGJ1ZmZlci50b1N0cmluZygpO1xuICBsZXQganNvbiA9IEpTT04ucGFyc2UoY29udGVudCk7XG5cbiAgTUFOSUZFU1RfQ0FDSEUuc2V0KHdvcmtzcGFjZSwganNvbik7XG5cbiAgcmV0dXJuIGpzb247XG59XG4iLCAiaW1wb3J0IG1kNSBmcm9tICdibHVlaW1wLW1kNSc7XG5cbi8qKlxuICogVGhlIGludGVudCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGdlbmVyYXRlIHRoZSBzdWZmaXgvcG9zdGZpeCBmb3IgdGhlXG4gKiBjc3MgY2xhc3NlcywgYmFzZWQgb24gdGhlIG1vZHVsZS1zY29wZWQgcGF0aCBuYW1lLlxuICpcbiAqIGZvciBleGFtcGxlLFxuICogICAgaGFzaCgnbXktYXBwL2NvbXBvbmVudHMvZm9vJylcbiAqICBpbnN0ZWFkIG9mXG4gKiAgICBoYXNoKCdhcHAvY29tcG9uZW50cy9mb28nKVxuICpcbiAqICAodW5sZXNzIHlvdXIgYXBwIG5hbWUgaXMgJ2FwcCcpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZVBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKG1vZHVsZVBhdGgpIHtcbiAgcmV0dXJuICdlJyArIG1kNShtb2R1bGVQYXRoKS5zdWJzdHJpbmcoMCwgOCk7XG59XG5cblxuZXhwb3J0IGNvbnN0IGhhc2hGcm9tTW9kdWxlUGF0aCA9IGhhc2g7XG4iLCAiaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgcGFyc2VyIGZyb20gJ3Bvc3Rjc3Mtc2VsZWN0b3ItcGFyc2VyJztcblxuaW1wb3J0IGlzSW5zaWRlR2xvYmFsIGZyb20gJy4vaXNJbnNpZGVHbG9iYWwuanMnO1xuXG5mdW5jdGlvbiByZXdyaXRlU2VsZWN0b3Ioc2VsLCBwb3N0Zml4KSB7XG4gIGNvbnN0IHRyYW5zZm9ybSA9IChzZWxlY3RvcnMpID0+IHtcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAnY2xhc3MnICYmICFpc0luc2lkZUdsb2JhbChzZWxlY3RvcikpIHtcbiAgICAgICAgc2VsZWN0b3IudmFsdWUgKz0gJ18nICsgcG9zdGZpeDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci5yZXBsYWNlV2l0aChcbiAgICAgICAgICBwYXJzZXIudGFnKHsgdmFsdWU6IHNlbGVjdG9yLnZhbHVlIH0pLFxuICAgICAgICAgIHBhcnNlci5jbGFzc05hbWUoeyB2YWx1ZTogcG9zdGZpeCB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHJlbW92ZSA6Z2xvYmFsXG4gICAgc2VsZWN0b3JzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3BzZXVkbycgJiYgc2VsZWN0b3IudmFsdWUgPT09ICc6Z2xvYmFsJykge1xuICAgICAgICBzZWxlY3Rvci5yZXBsYWNlV2l0aCguLi5zZWxlY3Rvci5ub2Rlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHRyYW5zZm9ybWVkID0gcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcblxuICByZXR1cm4gdHJhbnNmb3JtZWQ7XG59XG5cbmZ1bmN0aW9uIGlzSW5zaWRlS2V5ZnJhbWVzKG5vZGUpIHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBhcmVudC50eXBlID09PSAnYXRydWxlJyAmJiBwYXJlbnQubmFtZSA9PT0gJ2tleWZyYW1lcycpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUtleWZyYW1lcyhwYXJlbnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXdyaXRlQ3NzKGNzcywgcG9zdGZpeCwgZmlsZU5hbWUsIGxheWVyTmFtZSkge1xuICBjb25zdCBsYXllck5hbWVXaXRoRGVmYXVsdCA9IGxheWVyTmFtZSA/PyAnY29tcG9uZW50cyc7XG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJyAmJiAhaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkpIHtcbiAgICAgIG5vZGUuc2VsZWN0b3IgPSByZXdyaXRlU2VsZWN0b3Iobm9kZS5zZWxlY3RvciwgcG9zdGZpeCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCByZXdyaXR0ZW5Dc3MgPSBhc3QudG9TdHJpbmcoKTtcblxuICBpZiAoIWxheWVyTmFtZVdpdGhEZWZhdWx0KSB7XG4gICAgcmV0dXJuIGAvKiAke2ZpbGVOYW1lfSAqL1xcbiR7cmV3cml0dGVuQ3NzfVxcbmA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGAvKiAke2ZpbGVOYW1lfSAqL1xcbkBsYXllciAke2xheWVyTmFtZVdpdGhEZWZhdWx0fSB7XFxuXFxuYCArXG4gICAgcmV3cml0dGVuQ3NzICtcbiAgICAnXFxufVxcbidcbiAgKTtcbn1cblxuIiwgImltcG9ydCByZWNhc3QgZnJvbSAnZW1iZXItdGVtcGxhdGUtcmVjYXN0JztcblxuaW1wb3J0IHsgcmVuYW1lQ2xhc3MgfSBmcm9tICcuL3JlbmFtZUNsYXNzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlUGx1Z2luKHsgY2xhc3NlcywgdGFncywgcG9zdGZpeCB9KSB7XG4gIGxldCBzdGFjayA9IFtdO1xuICAvLyBzY29wZWQtY2xhc3MgaXMgYSBnbG9iYWwgd2UgYWxsb3cgaW4gaGJzXG4gIC8vIHNjb3BlZENsYXNzIGlzIGltcG9ydGFibGUsIGFuZCB3ZSdsbCBlcnJvciBpZiBzb21lb25lIHRyaWVzIHRvIHJlbmFtZSBpdFxuICBsZXQgc2NvcGVkQ2xhc3NDYW5kaWRhdGVzID0gWydzY29wZWQtY2xhc3MnLCAnc2NvcGVkQ2xhc3MnXTtcblxuICBmdW5jdGlvbiBpc1Njb3BlZENsYXNzKHN0cikge1xuICAgIGlmICghc3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gc2NvcGVkQ2xhc3NDYW5kaWRhdGVzLnNvbWUoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBzdHIpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBBdHRyTm9kZShub2RlKSB7XG4gICAgICBpZiAobm9kZS5uYW1lID09PSAnY2xhc3MnKSB7XG4gICAgICAgIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgbm9kZS52YWx1ZS5jaGFycykge1xuICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKG5vZGUudmFsdWUuY2hhcnMsIHBvc3RmaXgsIGNsYXNzZXMpO1xuXG4gICAgICAgICAgbm9kZS52YWx1ZS5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlLnR5cGUgPT09ICdDb25jYXRTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgZm9yIChsZXQgcGFydCBvZiBub2RlLnZhbHVlLnBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnVGV4dE5vZGUnICYmIHBhcnQuY2hhcnMpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3MocGFydC5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICAgICAgcGFydC5jaGFycyA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnTXVzdGFjaGVTdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgICAgIHJlY2FzdC50cmF2ZXJzZShwYXJ0LCB7XG4gICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbChub2RlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9zdGZpeCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSByZW5hbWVkQ2xhc3M7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIEVsZW1lbnROb2RlKG5vZGUpIHtcbiAgICAgIGlmICh0YWdzLmhhcyhub2RlLnRhZykpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgY2xhc3MgYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGNsYXNzQXR0ciA9IG5vZGUuYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLm5hbWUgPT09ICdjbGFzcycpO1xuXG4gICAgICAgIGlmIChjbGFzc0F0dHIpIHtcbiAgICAgICAgICBjbGFzc0F0dHIudmFsdWUuY2hhcnMgKz0gJyAnICsgcG9zdGZpeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwdXNoIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICAgIG5vZGUuYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgcmVjYXN0LmJ1aWxkZXJzLmF0dHIoJ2NsYXNzJywgcmVjYXN0LmJ1aWxkZXJzLnRleHQocG9zdGZpeCkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgQWxsOiB7XG4gICAgICBlbnRlcihub2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2gobm9kZSk7XG4gICAgICB9LFxuICAgICAgZXhpdCgpIHtcbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBNdXN0YWNoZVN0YXRlbWVudChub2RlKSB7XG4gICAgICBsZXQgY3NzQ2xhc3M7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXJhbXNbMF0udmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXNTY29wZWRDbGFzcyhnZXRWYWx1ZShub2RlLnBhdGg/LnBhdGgpKSAmJlxuICAgICAgICBub2RlLnBhdGg/LnBhcmFtcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zWzBdLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIGNzc0NsYXNzID0gbm9kZS5wYXRoLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc0NsYXNzKSB7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gcmVjYXN0LmJ1aWxkZXJzLnRleHQocmVuYW1lQ2xhc3MoY3NzQ2xhc3MsIHBvc3RmaXgpKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSAnQXR0ck5vZGUnKSB7XG4gICAgICAgICAgcGFyZW50LnF1b3RlVHlwZSA9ICdcIic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dE5vZGU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIFN1YkV4cHJlc3Npb24obm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMubGl0ZXJhbChcbiAgICAgICAgICAnU3RyaW5nTGl0ZXJhbCcsXG4gICAgICAgICAgcmVuYW1lQ2xhc3MoY3NzQ2xhc3MsIHBvc3RmaXgpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZShwYXRoKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gIGlmICgndmFsdWUnIGluIHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIGluIGVtYmVyIDUuOStcbiAgICogKHNvIHdlIHVzZSB0aGUgYWJvdmUgZm9yIG5ld2VyIGVtYmVycylcbiAgICovXG4gIHJldHVybiBwYXRoLm9yaWdpbmFsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXdyaXRlSGJzKGhicywgY2xhc3NlcywgdGFncywgcG9zdGZpeCkge1xuICBsZXQgYXN0ID0gcmVjYXN0LnBhcnNlKGhicyk7XG5cbiAgcmVjYXN0LnRyYXZlcnNlKGFzdCwgdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pKTtcblxuICBsZXQgcmVzdWx0ID0gcmVjYXN0LnByaW50KGFzdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICIvKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zdGZpeFxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW2NsYXNzZXNJbkNzc11cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5hbWVDbGFzcyhjbGFzc05hbWUsIHBvc3RmaXgsIGNsYXNzZXNJbkNzcykge1xuICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHJlbmFtZWRDbGFzc2VzID0gY2xhc3Nlc1xuICAgIC5maWx0ZXIoKGMpID0+IGMpXG4gICAgLm1hcCgoYykgPT4gYy50cmltKCkpXG4gICAgLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKCFjbGFzc2VzSW5Dc3MgfHwgY2xhc3Nlc0luQ3NzLmhhcyhjKSkge1xuICAgICAgICBpZiAoYy5lbmRzV2l0aChwb3N0Zml4KSkgcmV0dXJuIGM7XG5cbiAgICAgICAgcmV0dXJuIGMgKyAnXycgKyBwb3N0Zml4O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYztcbiAgICB9KVxuICAgIC5qb2luKCcgJyk7XG5cbiAgY29uc3QgcmVuYW1lZFdpdGhQcmVzZXJ2ZWRTcGFjZXMgPSBjbGFzc05hbWUucmVwbGFjZShcbiAgICBjbGFzc05hbWUudHJpbVN0YXJ0KCkudHJpbUVuZCgpLFxuICAgIHJlbmFtZWRDbGFzc2VzLFxuICApO1xuXG4gIHJldHVybiByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQSxxQkFBMkI7QUFDM0Isc0JBQW9DO0FBQ3BDLElBQUFBLG9CQUFpQjtBQUVqQiw2QkFBbUI7QUFDbkIsNkJBQXVCO0FBQ3ZCLGtDQUF1QjtBQUN2Qix3Q0FBbUI7QUFDbkIseUJBQTZCOzs7QUNWN0IscUJBQW9CO0FBQ3BCLHFDQUFtQjs7O0FDREosU0FBUixlQUFnQyxNQUFNLE1BQU07QUFDakQsUUFBTSxTQUFTLEtBQUs7QUFFcEIsTUFBSSxDQUFDLE9BQVEsUUFBTztBQUNwQixNQUFJLE9BQU8sU0FBUyxZQUFZLE9BQU8sVUFBVSxVQUFXLFFBQU87QUFFbkUsU0FBTyxlQUFlLFFBQVEsSUFBSTtBQUNwQzs7O0FERkEsU0FBUyxrQkFBa0IsS0FBSyxTQUFTLE1BQU07QUFDN0MsUUFBTSxZQUFZLENBQUMsUUFBUTtBQUN6QixRQUFJLEtB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TUFDbkMsU0FBUyxDQUFDLEtBQUssVUFBVSxpQkFBaUI7QUFBQSxJQUM1QyxDQUFDO0FBRUQsUUFBSSxlQUFlLElBQUksNEJBQUFBLFFBQVc7QUFBQSxNQUNoQztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBRUQsUUFBSSxZQUFZLElBQUksdUJBQUFDLFFBQU8sY0FBYztBQUFBLE1BQ3ZDLFlBQVksUUFBUSxZQUFZLEtBQUs7QUFBQSxNQUNyQyxXQUFXO0FBQUEsTUFDWCxpQkFBaUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxJQUNuQyxDQUFDO0FBRUQsV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFsiaW1wb3J0X25vZGVfcGF0aCIsICJwYXJzZXIiLCAicG9zdGNzcyIsICJtZDUiLCAicGF0aCIsICJpbXBvcnRfcG9zdGNzcyIsICJpbXBvcnRfcG9zdGNzc19zZWxlY3Rvcl9wYXJzZXIiLCAicGFyc2VyIiwgInBvc3Rjc3MiLCAicmVjYXN0IiwgIm5vZGUiLCAicGF0aCIsICJGaWx0ZXIiLCAicGF0aCIsICJoYXNoIiwgInJlc3VsdHMiLCAicCIsICJNZXJnZVRyZWVzIiwgIkNvbmNhdCJdCn0K
484
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2J1aWxkL2VtYmVyLWNsYXNzaWMtc3VwcG9ydC5qcyIsICIuLi8uLi9zcmMvbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL2lzSW5zaWRlR2xvYmFsLmpzIiwgIi4uLy4uL3NyYy9saWIvcGF0aC91dGlscy5qcyIsICIuLi8uLi9zcmMvbGliL3BhdGgvaGFzaC1mcm9tLW1vZHVsZS1wYXRoLmpzIiwgIi4uLy4uL3NyYy9saWIvcmV3cml0ZUNzcy5qcyIsICIuLi8uLi9zcmMvbGliL3Jld3JpdGVIYnMuanMiLCAiLi4vLi4vc3JjL2xpYi9yZW5hbWVDbGFzcy5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgQ29uY2F0IGZyb20gJ2Jyb2Njb2xpLWNvbmNhdCc7XG5pbXBvcnQgeyBGdW5uZWwgfSBmcm9tICdicm9jY29saS1mdW5uZWwnO1xuaW1wb3J0IE1lcmdlVHJlZXMgZnJvbSAnYnJvY2NvbGktbWVyZ2UtdHJlZXMnO1xuaW1wb3J0IEZpbHRlciBmcm9tICdicm9jY29saS1wZXJzaXN0ZW50LWZpbHRlcic7XG5pbXBvcnQgeyBQcmVwcm9jZXNzb3IgfSBmcm9tICdjb250ZW50LXRhZyc7XG5cbmltcG9ydCBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MgZnJvbSAnLi4vbGliL2dldENsYXNzZXNUYWdzRnJvbUNzcy5qcyc7XG5pbXBvcnQge1xuICBoYXNoRnJvbU1vZHVsZVBhdGgsXG4gIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoLFxufSBmcm9tICcuLi9saWIvcGF0aC91dGlscy5qcyc7XG5pbXBvcnQgcmV3cml0ZUNzcyBmcm9tICcuLi9saWIvcmV3cml0ZUNzcy5qcyc7XG5pbXBvcnQgcmV3cml0ZUhicyBmcm9tICcuLi9saWIvcmV3cml0ZUhicy5qcyc7XG5cbmNvbnN0IHAgPSBuZXcgUHJlcHJvY2Vzc29yKCk7XG5jb25zdCBDT01QT05FTlRfRVhURU5TSU9OUyA9IFsnaGJzJywgJ2pzJywgJ3RzJywgJ2dqcycsICdndHMnXTtcbmNvbnN0IFRFTVBMQVRFX0VYVEVOU0lPTlMgPSBbJ2hicycsICdnanMnLCAnZ3RzJ107XG5cbmNsYXNzIFNjb3BlZEZpbHRlciBleHRlbmRzIEZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudHNOb2RlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihjb21wb25lbnRzTm9kZSwgb3B0aW9ucyk7XG4gICAgdGhpcy53YXJuaW5nU3RyZWFtID0gcHJvY2Vzcy5zdGRlcnI7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGdldCBleHRlbnNpb25zKCkge1xuICAgIHJldHVybiBbJ2NzcyddO1xuICB9XG5cbiAgZ2V0IHRhcmdldEV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gJ2Nzcyc7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzU3RyaW5nKGNvbnRlbnQsIHJlbGF0aXZlUGF0aCkge1xuICAgIC8vIGlnbm9yZSBjc3MgZmlsZXMgZm9yIGVtYmVyLWNzcy1tb2R1bGVzXG4gICAgaWYgKHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGNvcnJlc3BvbmRpbmcganMgZmlsZSBleGlzdHNcbiAgICBsZXQgaGFzUmVsZXZhbnRGaWxlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbnB1dFBhdGggb2YgdGhpcy5pbnB1dFBhdGhzKSB7XG4gICAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSBicmVhaztcblxuICAgICAgZm9yIChsZXQgZXh0IG9mIENPTVBPTkVOVF9FWFRFTlNJT05TKSB7XG4gICAgICAgIGlmIChoYXNSZWxldmFudEZpbGUpIGJyZWFrO1xuXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MkLywgJy4nICsgZXh0KTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHJlbGF0aXZlQ29tcG9uZW50UGF0aCk7XG5cbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoY29tcG9uZW50UGF0aCkpIHtcbiAgICAgICAgICBoYXNSZWxldmFudEZpbGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUG9kcyBzdXBwb3J0XG4gICAgICAgKi9cbiAgICAgIGlmIChyZWxhdGl2ZVBhdGguZW5kc1dpdGgoJ3N0eWxlcy5jc3MnKSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKGlucHV0UGF0aCwgZGlyZWN0b3J5KTtcblxuICAgICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgICAgaGFzUmVsZXZhbnRGaWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJld3JpdGUgY3NzIGZpbGVcbiAgICBpZiAoaGFzUmVsZXZhbnRGaWxlKSB7XG4gICAgICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGNvbnN0IGhhc2ggPSBoYXNoRnJvbU1vZHVsZVBhdGgobG9jYWxQYWNrYWdlclN0eWxlUGF0aCk7XG5cbiAgICAgIGNvbnRlbnQgPSByZXdyaXRlQ3NzKFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBoYXNoLFxuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHRoaXMub3B0aW9ucy5nZXRVc2VyT3B0aW9ucz8uKCk/LmxheWVyTmFtZSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcG9zdFByb2Nlc3MocmVzdWx0cywgcmVsYXRpdmVQYXRoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJIHx8IHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLm1vZHVsZS5jc3MnKSkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5wdXRQYXRoIG9mIHRoaXMuaW5wdXRQYXRocykge1xuICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0ge307XG5cbiAgICAgIGVhY2hFeHRlbnNpb246IGZvciAobGV0IGV4dCBvZiBURU1QTEFURV9FWFRFTlNJT05TKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC5jc3MvLCAnLicgKyBleHQpO1xuICAgICAgICBsZXQgdGVtcGxhdGVGaWxlUGF0aCA9IHBhdGguam9pbihpbnB1dFBhdGgsIHRlbXBsYXRlUGF0aCk7XG4gICAgICAgIGxldCBleGlzdHMgPSBleGlzdHNTeW5jKHRlbXBsYXRlRmlsZVBhdGgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQb2RzIHN1cHBvcnRcbiAgICAgICAgICovXG4gICAgICAgIGlmIChleHQgPT09ICdoYnMnICYmICFleGlzdHMgJiYgcmVsYXRpdmVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJykpIHtcbiAgICAgICAgICBsZXQgcG9kc05hbWUgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvc3R5bGVzXFwuY3NzJC8sICd0ZW1wbGF0ZS5oYnMnKTtcblxuICAgICAgICAgIHRlbXBsYXRlRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCBwb2RzTmFtZSk7XG4gICAgICAgICAgZXhpc3RzID0gZXhpc3RzU3luYyh0ZW1wbGF0ZUZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICB0ZW1wbGF0ZUZpbGUucGF0aCA9IHRlbXBsYXRlRmlsZVBhdGg7XG4gICAgICAgICAgdGVtcGxhdGVGaWxlLmV4dCA9IGV4dDtcblxuICAgICAgICAgIGJyZWFrIGVhY2hFeHRlbnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHRlbXBsYXRlIGV4aXN0cyB3ZSBjaGVjayB0aGUgY3NzIGZvciBjaGFuZ2VzXG4gICAgICBpZiAodGVtcGxhdGVGaWxlLnBhdGgpIHtcbiAgICAgICAgY29uc3QgY3NzRmlsZVBhdGggPSBwYXRoLmpvaW4oaW5wdXRQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBjc3NDb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlKGNzc0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgeyBjbGFzc2VzLCB0YWdzIH0gPSBnZXRDbGFzc2VzVGFnc0Zyb21Dc3MoY3NzQ29udGVudHMpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NsYXNzZXMgPSB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLmdldChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgcHJldmlvdXMgY2xhc3NlcywgYW5kIHRoZXkgYXJlIGRpZmZlcmVudCwgYnVpbGQgdGVtcGxhdGVzIHRvIGNvbXBhcmVcbiAgICAgICAgaWYgKHByZXZpb3VzQ2xhc3NlcyAmJiBjbGFzc2VzICE9PSBwcmV2aW91c0NsYXNzZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2NhbFBhY2thZ2VyU3R5bGVQYXRoID1cbiAgICAgICAgICAgIHBhY2thZ2VTY29wZWRQYXRoVG9Nb2R1bGVQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgY29uc3QgcG9zdGZpeCA9IGhhc2hGcm9tTW9kdWxlUGF0aChsb2NhbFBhY2thZ2VyU3R5bGVQYXRoKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVJhdyA9IGF3YWl0IHJlYWRGaWxlKHRlbXBsYXRlRmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNvbXBhcmlzb24gPSBbXTtcbiAgICAgICAgICBsZXQgdGVtcGxhdGVDb250ZW50cyA9IHRlbXBsYXRlUmF3O1xuXG4gICAgICAgICAgaWYgKHRlbXBsYXRlRmlsZS5leHQgPT09ICdoYnMnKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZUNvbXBhcmlzb24ucHVzaChcbiAgICAgICAgICAgICAgZGlkVGVtcGxhdGVDaGFuZ2UoXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZW50cyxcbiAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgICAgICB0YWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIGFsbCB0ZW1wbGF0ZSB0YWdzLCBhbmQgZXh0cmFjdCB0aGUgY29udGVudHMgdG8gY29tcGFyZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHAucGFyc2UodGVtcGxhdGVSYXcsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IHJlc3VsdHMubWFwKCh4KSA9PiB4LmNvbnRlbnRzKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGVtcGxhdGUgb2YgdGVtcGxhdGVzKSB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlQ29tcGFyaXNvbi5wdXNoKFxuICAgICAgICAgICAgICAgIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICBwcmV2aW91c0NsYXNzZXMsXG4gICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgICAgICAgIHBvc3RmaXgsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUNoYW5nZWQgPSB0ZW1wbGF0ZUNvbXBhcmlzb24uc29tZSgodikgPT4gdik7XG5cbiAgICAgICAgICAvLyBpZiB0aGUgcmV3cml0ZSBkb2Vzbid0IG1hdGNoIHRoZSBvcmlnaW5hbCBvdXRwdXQsIHdlIHdhbnQgdG8gcmVidWlsZCB0aGUgdGVtcGxhdGVcbiAgICAgICAgICBpZiAodGVtcGxhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGF3ZnVsIGhhY2sgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0byBpbnZhbGlkYXRlIGJyb2Njb2xpLXBlcnNpc3RlbnQtZmlsdGVyIGNhY2hlXG4gICAgICAgICAgICAvLyBpZGVhbGx5IHdlJ2QgaW52YWxpZGF0ZSB0aGUgYnJvY2NvbGktcGVyaXN0ZW50LWZpbHRlciBjYWNoZSBoZXJlXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcGxhdGVGaWxlLnBhdGgsIHRlbXBsYXRlQ29udGVudHMgKyAnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhc3NpZ24gZm9yIG5leHQgcnVuIGNvbXBhcmlzb25cblxuICAgICAgICB0aGlzLm9wdGlvbnMucHJldmlvdXNDbGFzc2VzLnNldChyZWxhdGl2ZVBhdGgsIGNsYXNzZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBjb250ZXh0IG9mIGRpZmZlcmVudCBzZXRzIG9mIGV4dHJhY2VkIGNzcyBjbGFzc2VzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRzXG4gKiBAcGFyYW0ge1NldH0gcHJldmlvdXNDbGFzc2VzXG4gKiBAcGFyYW0ge1NldH0gY3VycmVudENsYXNzZXNcbiAqIEBwYXJhbSB7U2V0fSB0YWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gcG9zdGZpeFxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGRpZFRlbXBsYXRlQ2hhbmdlKFxuICBjb250ZW50cyxcbiAgcHJldmlvdXNDbGFzc2VzLFxuICBjdXJyZW50Q2xhc3NlcyxcbiAgdGFncyxcbiAgcG9zdGZpeCxcbikge1xuICBjb25zdCBvcmlnaW5hbCA9IHJld3JpdGVIYnMoY29udGVudHMsIHByZXZpb3VzQ2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG4gIGNvbnN0IGN1cnJlbnQgPSByZXdyaXRlSGJzKGNvbnRlbnRzLCBjdXJyZW50Q2xhc3NlcywgdGFncywgcG9zdGZpeCk7XG5cbiAgcmV0dXJuIG9yaWdpbmFsICE9PSBjdXJyZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY29wZWRDc3NQcmVwcm9jZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5vd25lciA9IG9wdGlvbnMub3duZXI7XG4gICAgdGhpcy5hcHBOYW1lID0gb3B0aW9ucy5vd25lci5wYXJlbnQucGtnLm5hbWU7XG4gICAgdGhpcy5uYW1lID0gJ3Njb3BlZC1jc3MtcHJlcHJvY2Vzc29yJztcbiAgICB0aGlzLnByZXZpb3VzQ2xhc3NlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcHRpb25zIGZyb20gYHNldHVwUHJlcHJvY2Vzc29yUmVnaXN0cnlgLCB0aGUgdjEtQWRkb24gSG9va1xuICAgKiBAcGFyYW0ge3sgbGF5ZXJOYW1lPzogc3RyaW5nIH19IG9wdGlvbnNcbiAgICovXG4gIGNvbmZpZ3VyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMudXNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHsgWydub3QgY29uZmlndXJlZCddOiB0cnVlIH07XG4gIH1cblxuICB0b1RyZWUoaW5wdXROb2RlLCBpbnB1dFBhdGgsIG91dHB1dERpcmVjdG9yeSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG90aGVyUHJlcHJvY2Vzc29ycyA9IHRoaXMucHJlcHJvY2Vzc29ycy5maWx0ZXIoKHApID0+IHAgIT09IHRoaXMpO1xuICAgIGNvbnN0IG90aGVyVHJlZXMgPSBvdGhlclByZXByb2Nlc3NvcnMubWFwKChwKSA9PiBwLnRvVHJlZSguLi5hcmd1bWVudHMpKTtcbiAgICBsZXQgbWVyZ2VkT3RoZXJUcmVlcyA9IG5ldyBNZXJnZVRyZWVzKG90aGVyVHJlZXMpO1xuXG4gICAgbGV0IHJvb3RzID0gW1xuICAgICAgdGhpcy5hcHBOYW1lICsgJy9jb21wb25lbnRzLycsXG4gICAgICAuLi4odGhpcy51c2VyT3B0aW9ucy5hZGRpdGlvbmFsUm9vdHMgfHwgW10pLm1hcChcbiAgICAgICAgKHJvb3QpID0+IGAke3RoaXMuYXBwTmFtZX0vJHtyb290fWAsXG4gICAgICApLFxuICAgIF07XG4gICAgbGV0IGluY2x1ZGUgPSByb290c1xuICAgICAgLm1hcCgocm9vdCkgPT4ge1xuICAgICAgICBsZXQgd2l0aFNsYXNoID0gcm9vdC5lbmRzV2l0aCgnLycpID8gcm9vdCA6IGAke3Jvb3R9L2A7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHt3aXRoU2xhc2h9KiovKi5jc3NgLFxuICAgICAgICAgIC4uLkNPTVBPTkVOVF9FWFRFTlNJT05TLm1hcCgoZXh0KSA9PiBgJHt3aXRoU2xhc2h9KiovKi4ke2V4dH1gKSxcbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgICAuZmxhdCgpO1xuXG4gICAgbGV0IGNvbXBvbmVudHNOb2RlID0gbmV3IEZ1bm5lbChpbnB1dE5vZGUsIHsgaW5jbHVkZSB9KTtcblxuICAgIGNvbXBvbmVudHNOb2RlID0gbmV3IFNjb3BlZEZpbHRlcihjb21wb25lbnRzTm9kZSwge1xuICAgICAgaW5wdXRQYXRoLFxuICAgICAgZ2V0VXNlck9wdGlvbnM6ICgpID0+IHRoaXMudXNlck9wdGlvbnMsXG4gICAgICBvd25lcjogdGhpcy5vd25lcixcbiAgICAgIHByZXZpb3VzQ2xhc3NlczogdGhpcy5wcmV2aW91c0NsYXNzZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRTdHlsZXMgPSBuZXcgRnVubmVsKGNvbXBvbmVudHNOb2RlLCB7XG4gICAgICBpbmNsdWRlOiByb290cy5tYXAoKHJvb3QpID0+IHtcbiAgICAgICAgbGV0IHdpdGhTbGFzaCA9IHJvb3QuZW5kc1dpdGgoJy8nKSA/IHJvb3QgOiBgJHtyb290fS9gO1xuXG4gICAgICAgIHJldHVybiBgJHt3aXRoU2xhc2h9KiovKi5jc3NgO1xuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBhcHBDc3MgPSBuZXcgRnVubmVsKGlucHV0Tm9kZSwge1xuICAgICAgaW5jbHVkZTogW3RoaXMuYXBwTmFtZSArICcvc3R5bGVzL2FwcC5jc3MnXSxcbiAgICB9KTtcblxuICAgIGxldCBtZXJnZWRTdHlsZXMgPSBuZXcgTWVyZ2VUcmVlcyhcbiAgICAgIFthcHBDc3MsIG1lcmdlZE90aGVyVHJlZXMsIGNvbXBvbmVudFN0eWxlc10sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBsZXQgbmV3T3V0cHV0ID0gbmV3IENvbmNhdChtZXJnZWRTdHlsZXMsIHtcbiAgICAgIG91dHB1dEZpbGU6IG9wdGlvbnMub3V0cHV0UGF0aHNbJ2FwcCddLFxuICAgICAgYWxsb3dOb25lOiB0cnVlLFxuICAgICAgc291cmNlTWFwQ29uZmlnOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnVzZXJPcHRpb25zPy5wYXNzdGhyb3VnaCkge1xuICAgICAgbGV0IHBhc3NlZFRocm91Z2ggPSBuZXcgRnVubmVsKG1lcmdlZFN0eWxlcywge1xuICAgICAgICBpbmNsdWRlOiB0aGlzLnVzZXJPcHRpb25zLnBhc3N0aHJvdWdoLFxuICAgICAgICBkZXN0RGlyOiB0aGlzLnVzZXJPcHRpb25zLnBhc3N0aHJvdWdoRGVzdGluYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBNZXJnZVRyZWVzKFtwYXNzZWRUaHJvdWdoLCBuZXdPdXRwdXRdLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ld091dHB1dDtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIGdldENsYXNzZXNBbmRUYWdzKHNlbCwgY2xhc3NlcywgdGFncykge1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoc2xzKSA9PiB7XG4gICAgc2xzLndhbGsoKHNlbGVjdG9yKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIGNsYXNzZXMuYWRkKHNlbGVjdG9yLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ3RhZycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICB0YWdzLmFkZChzZWxlY3Rvci52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcGFyc2VyKHRyYW5zZm9ybSkucHJvY2Vzc1N5bmMoc2VsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xhc3Nlc1RhZ3NGcm9tQ3NzKGNzcykge1xuICBjb25zdCBjbGFzc2VzID0gbmV3IFNldCgpO1xuICBjb25zdCB0YWdzID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGFzdCA9IHBvc3Rjc3MucGFyc2UoY3NzKTtcblxuICBhc3Qud2Fsaygobm9kZSkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdydWxlJykge1xuICAgICAgZ2V0Q2xhc3Nlc0FuZFRhZ3Mobm9kZS5zZWxlY3RvciwgY2xhc3NlcywgdGFncyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBjbGFzc2VzLCB0YWdzIH07XG59XG5cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0luc2lkZUdsb2JhbChub2RlLCBmdW5jKSB7XG4gIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gIGlmICghcGFyZW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ3BzZXVkbycgJiYgcGFyZW50LnZhbHVlID09PSAnOmdsb2JhbCcpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBpc0luc2lkZUdsb2JhbChwYXJlbnQsIGZ1bmMpO1xufVxuIiwgImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzU3luYyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5pbXBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmV4cG9ydCB7IGhhc2hGcm9tQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi9oYXNoLWZyb20tYWJzb2x1dGUtcGF0aC5qcyc7XG5leHBvcnQgeyBoYXNoRnJvbU1vZHVsZVBhdGggfSBmcm9tICcuL2hhc2gtZnJvbS1tb2R1bGUtcGF0aC5qcyc7XG5cbmNvbnN0IEVNQlJPSURFUl9ESVIgPSAnbm9kZV9tb2R1bGVzLy5lbWJyb2lkZXInO1xuY29uc3QgRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIID0gYCR7RU1CUk9JREVSX0RJUn0vcmV3cml0dGVuLWFwcGA7XG5jb25zdCBFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX0FTU0VUUyA9IGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYXNzZXRzYDtcbmNvbnN0IEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUyA9IGAke0VNQlJPSURFUl9ESVJ9L3Jld3JpdHRlbi1wYWNrYWdlc2A7XG5jb25zdCBJUlJFTEVWQU5UX1BBVEhTID0gWydub2RlX21vZHVsZXMvLnBucG0nXTtcbmNvbnN0IFVOU1VQUE9SVEVEX0RJUkVDVE9SSUVTID0gbmV3IFNldChbJ3Rlc3RzJ10pO1xuXG5jb25zdCBDV0QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4vKipcbiAqIFJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgZmlsZVBhdGggZm9ybWF0IGlzLFxuICogdGhpcyB3aWxsIHRyeSB0byByZXR1cm4gdGhlIGNvcnJlY3QgcG9zdGZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRnJvbShmaWxlUGF0aCkge1xuICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGhhc2hGcm9tQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoRnJvbU1vZHVsZVBhdGgoZmlsZVBhdGgpO1xufVxuXG4vKipcbiAqIEJhc2VkIG9uIGVtYmVyJ3MgY29tcG9uZW50IGxvY2F0aW9uIGNvbnZlbnRpb25zLFxuICogdGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgYSBwYXRoIGZvciB3aGVyZSB3ZVxuICogZXhwZWN0IHRoZSBDU1MgdG8gbGl2ZS5cbiAqXG4gKiBGb3IgY28tbG9jYXRlZCBzdHJ1Y3R1cmU6XG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuaGJzXG4gKiAgIC0gY29tcG9uZW50cy9teS1jb21wb25lbnQuY3NzXG4gKlxuICogRm9yIG5lc3RlZCBjby1sb2NhdGVkIHN0cnVjdHVyZVxuICogICAtIGNvbXBvbmVudHMvbXktY29tcG9uZW50L2Zvby5oYnNcbiAqICAgLSBjb21wb25lbnRzL215LWNvbXBvbmVudC9mb28uY3NzXG4gKlxuICogRm9yIFBvZHMgcm91dGVzIHN0cnVjdHVyZVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS90ZW1wbGF0ZS57aGJzLGpzfVxuICogICAtIHJvdXRlcy9teS1yb3V0ZS9zdHlsZXMuY3NzXG4gKlxuICogRGVsaWJlcmF0ZWx5IG5vdCBzdXBwb3J0ZWQ6XG4gKiAgIC0gY29tcG9uZW50cyB3LyBwb2RzIC0tIHRoaXMgaXMgZGVwcmVjYXRlZCBpbiA1LjEwXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lIC0gdGhlIGhicywganMsIGdqcywgZ3RzIG9yIHdoYXRldmVyIGNvLWxvY2F0ZWQgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gZXhwZWN0ZWQgY3NzIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc1BhdGhGb3IoZmlsZU5hbWUpIHtcbiAgbGV0IHdpdGhvdXRFeHQgPSB3aXRob3V0RXh0ZW5zaW9uKGZpbGVOYW1lKTtcbiAgbGV0IGNzc1BhdGggPSB3aXRob3V0RXh0ICsgJy5jc3MnO1xuXG4gIGlmIChpc1BvZChmaWxlTmFtZSkpIHtcbiAgICBjc3NQYXRoID0gZmlsZU5hbWVcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmpzJC8sICdzdHlsZXMuY3NzJylcbiAgICAgIC5yZXBsYWNlKC90ZW1wbGF0ZVxcLmhicy8sICdzdHlsZXMuY3NzJyk7XG4gIH1cblxuICByZXR1cm4gY3NzUGF0aDtcbn1cblxuLyoqXG4gKiBOb3RlIHRoYXQgY29tcG9uZW50cyBpbiB0aGUgXCJwb2RzXCIgY29udmVudGlvbiB3aWxsXG4gKiBuZXZlciBiZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnL2NvbXBvbmVudHMvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmpzJykgfHwgZmlsZVBhdGguZW5kc1dpdGgoJ3RlbXBsYXRlLmhicycpO1xufVxuXG4vKipcbiAqIE5vdGUgdGhhdCBjb21wb25lbnRzIGluIHRoZSBcInBvZHNcIiBjb252ZW50aW9uIHdpbGxcbiAqIG5ldmVyIGJlIHN1cHBvcnRlZC5cbiAqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGVuZHMgd2l0aFxuICogLSB0ZW1wbGF0ZS5qc1xuICogLSB0ZW1wbGF0ZS5oYnNcbiAqIC0gc3R5bGVzLmNzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2QoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoLmluY2x1ZGVzKCcvY29tcG9uZW50cy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1BvZFRlbXBsYXRlKGZpbGVQYXRoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLmVuZHNXaXRoKCdzdHlsZXMuY3NzJyk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnMgdGhlIHNhbWUgcGF0aCwgYnV0IHdpdGhvdXQgdGhlIGV4dGVuc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEV4dGVuc2lvbihmaWxlUGF0aCkge1xuICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShmaWxlUGF0aCk7XG5cbiAgcmV0dXJuIHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG59XG5cbi8qKlxuICogRXhhbXBsZXMgZm9yIGZpbGVOYW1lXG4gKiAtIGFic29sdXRlIG9uLWRpc2sgcGF0aFxuICogLSBpbiB3ZWJwYWNrXG4gKiAgIC0gVVJMLWFic29sdXRlIHBhdGgsIHN0YXJ0aW5nIHdpdGggL1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZVxuICogQHBhcmFtIHt7IGFkZGl0aW9uYWxSb290cz86IHN0cmluZ1tdOyBjd2Q6IHN0cmluZyB9fSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxldmFudEZpbGUoZmlsZU5hbWUsIHsgYWRkaXRpb25hbFJvb3RzLCBjd2QgfSkge1xuICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnL0BlbWJyb2lkZXInKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoSVJSRUxFVkFOVF9QQVRIUy5zb21lKChpKSA9PiBmaWxlTmFtZS5pbmNsdWRlcyhpKSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykpIHtcbiAgICAvLyBpZiBhIGZpbGUgaXMgbm90IHRoZSBlbWJyb2lkZXIgY2FjaGUgZGlyZWN0b3J5XG4gICAgLy8gYW5kIGlzIGluIG5vZGVfbW9kdWxlcywgc2tpcCBpdC5cbiAgICBpZiAoIWZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl9ESVIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmV3cml0dGVuIHBhY2thZ2VzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYXQgdGhlaXIgb3duXG4gICAgLy8gcHVibGlzaCB0aW1lXG4gICAgaWYgKGZpbGVOYW1lLmluY2x1ZGVzKEVNQlJPSURFUl8zX1JFV1JJVFRFTl9QQUNLQUdFUykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgYWxyZWFkeSB0aGUgYnVuZGxlZCBmaWxlcy5cbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFMpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkLCBuZXZlciB3aWxsIGJlXG4gICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoYCR7RU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9BU1NFVFN9L3Rlc3RzLmpzYCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZGVhbGx5LCB3ZSBuZXZlciBnZXQgaGVyZSAtLSBpbmRpY2F0ZXMgd2UncmUgbm90IGZpbHRlcmluZyBlZmZlY3RpdmVseSBpbiBiYWJlbFxuICAgICAgLy8gTk9URTogaWYgd2UgZ2V0IGhlcmUsIHdlJ3JlIHRyeWluZyB0byBvcGVyYXRlIG9uIGEgZmlsZSB0b28gbGF0ZS5cbiAgICAgIC8vICAgICAgIHdlIG5lZWQgU2NvcGVkQ1NTIHRvIG9wZXJhdGUgYXMgY2xvc2UgdG8gb3JpZ2luYWwgc291cmNlIGFzIHBvc3NpYmxlIC0tIG5vdCBvdXRwdXQgZmlsZXMuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IHdvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGZpbGVOYW1lKTtcblxuICBhc3NlcnQoY3dkLCBgY3dkIHdhcyBub3QgcGFzc2VkIHRvIGlzUmVsZXZhbnRGaWxlYCk7XG5cbiAgbGV0IG91cldvcmtzcGFjZSA9IGZpbmRXb3Jrc3BhY2VQYXRoKGN3ZCk7XG5cbiAgaWYgKHdvcmtzcGFjZSAhPT0gb3VyV29ya3NwYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGxvY2FsID0gZmlsZU5hbWUucmVwbGFjZSh3b3Jrc3BhY2UsICcnKTtcbiAgbGV0IFssIC4uLnBhcnRzXSA9IGxvY2FsLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGlmIChVTlNVUFBPUlRFRF9ESVJFQ1RPUklFUy5oYXMocGFydHNbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBwb2RzIHN1cHBvcnQuXG4gICAqIGZvbGtzIG5lZWQgdG8gb3B0IGluIHRvIHBvZHMgKHJvdXRlcyksIGJlY2F1c2UgZXZlcnkgcG9kcyBhcHAgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHlcbiAgICovXG4gIGxldCByb290cyA9IFsnL2NvbXBvbmVudHMvJywgJy90ZW1wbGF0ZXMvJywgLi4uKGFkZGl0aW9uYWxSb290cyB8fCBbXSldO1xuXG4gIGlmICghcm9vdHMuc29tZSgocm9vdCkgPT4gZmlsZU5hbWUuaW5jbHVkZXMocm9vdCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlU2NvcGVkUGF0aCkge1xuICAvKipcbiAgICogKkJ5IGNvbnZlbnRpb24qLCBgc3JjYCBpcyBvbWl0dGVkIGZyb20gY29tcG9uZW50IHBhdGhzLlxuICAgKiBXZSBjYW4gcmVmbGVjdCB0aGUgc2FtZSBiZWhhdmlvciBieSByZXBsYWNpbmcgc3JjL1xuICAgKiB3aXRoIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQ1NTIGlzbid0IGVtaXR0ZWQgYXMgYSBjby1sb2NhdGVkIG1vZHVsZSwgYnV0XG4gICAqIHRvIGtlZXAgY29udmVudGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgbGFuZ3VhZ2VzLFxuICAgKiB3ZSBjYW4gcHJldGVuZCBpdCBpcy5cbiAgICpcbiAgICogQW55IGN1c3RvbWl6YXRpb24gYmV5b25kIHJlbW92aW5nIGBzcmNgIGFuZCBgYXBwYCBpcyBwb3RlbnRpYWxseSBjb25mdXNpbmcuXG4gICAqIElmIHdlIG5lZWQgZnVydGhlciBjdXN0b21pemF0aW9ucywgd2UnbGwgd2FudCB0byBtYXRjaCBvbiBgZXhwb3J0c2AgaW4gdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgcGFja2FnZS5qc29uXG4gICAqL1xuICBsZXQgcGFja2FnZVJlbGF0aXZlID0gcGFja2FnZVNjb3BlZFBhdGgucmVwbGFjZSgvXlxcL3NyY1xcLy8sICcvJyk7XG5cbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UocGFja2FnZVJlbGF0aXZlKTtcblxuICBpZiAoaXNQb2QocGFja2FnZVJlbGF0aXZlKSkge1xuICAgIC8qKlxuICAgICAqIEZvciBwb2RzLCB3ZSBjaG9wIG9mZiB0aGUgd2hvbGUgZmlsZSwgYW5kIHVzZSB0aGUgZGlyIG5hbWUgYXMgdGhlIFwibW9kdWxlUGF0aFwiXG4gICAgICovXG4gICAgcmV0dXJuIHBhcnNlZC5kaXI7XG4gIH1cblxuICAvKipcbiAgICogSWYgYW4gZXh0ZW5zaW9uIGlzIHBhc3NlZCwgcmVtb3ZlIGl0LlxuICAgKiBXaGVuIHVzaW5nIHBhY2thZ2VycywgZm9sa3MgYXJlIHVzZWQgdG8gbm90IGhhdmluZyB0byBzcGVjaWZ5IGV4dGVuc2lvbnMgZm9yIGZpbGVzLlxuICAgKiBTaW5jZSB3ZSBkb24ndCBldmVuIGVtaXQgY3NzIGZpbGVzIGNvLWxvY2F0ZWQgdG8gZWFjaCBtb2R1bGUsXG4gICAqIHRoaXMgaGVscHMgdXMgbm90IGNvbnZleSBhIGxpZSB0aGF0IGEgZmlsZSBtYXkgZXhpc3QgaW4gYXQgcnVudGltZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgYDxtb2R1bGUtbmFtZT4vY29tcG9uZW50cy9idXR0b25gLlxuICAgKiBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBleHRlbnNpb24gaXMsIGJlY2F1c2UgeW91IGNhbiBvbmx5IGhhdmUgb25lIGNzcyBmaWxlXG4gICAqIGZvciB0aGUgYnV0dG9uIG1vZHVsZSBhbnl3YXkuXG4gICAqL1xuICBsZXQgbG9jYWxQYWNrYWdlclN0eWxlUGF0aCA9IHBhdGguam9pbihwYXJzZWQuZGlyLCBwYXJzZWQubmFtZSk7XG5cbiAgcmV0dXJuIGxvY2FsUGFja2FnZXJTdHlsZVBhdGg7XG59XG5cbi8qKlxuICogcmV0dXJucyB0aGUgYXBwLW1vZHVsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZVxuICpcbiAqIFRoaXMgYXNzdW1lcyBub3JtYWwgZW1iZXIgYXBwIGNvbnZlbnRpb25zXG4gKlxuICogd2hpY2ggaXMgYDxwYWNrYWdlLmpzb24jbmFtZT4vcGF0aC10by1maWxlYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwUGF0aChzb3VyY2VQYXRoKSB7XG4gIGxldCB3b3Jrc3BhY2VQYXRoID0gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCk7XG4gIGxldCBuYW1lID0gbW9kdWxlTmFtZShzb3VyY2VQYXRoKTtcblxuICAvKipcbiAgICogIFVuZGVyIGVtYnJvaWRlciBidWlsZHMsIHRoZSBzcGVjLWNvbXBsaWFudCB2ZXJzaW9uIG9mIHRoZSBhcHBcbiAgICogaGFzIGFsbCB0aGUgZmlsZXMgdW5kZXIgYSBmb2xkZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgcGFja2FnZSBuYW1lLFxuICAgKiByYXRoZXIgdGhhbiBcImFwcFwiLlxuICAgKi9cbiAgbGV0IHBhY2thZ2VSZWxhdGl2ZSA9IHNvdXJjZVBhdGgucmVwbGFjZSh3b3Jrc3BhY2VQYXRoLCAnJyk7XG5cbiAgLyoqXG4gICAqIEJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgJ2FwcCcgLS0gd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgdjEgYWRkb24gcGlwZWxpbmVcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKGAvYXBwL2AsIGAvYCk7XG5cbiAgLyoqXG4gICAqIGFsc28gYWxzbywgd2Uga25vdyB0aGF0IHRoZSByZS13cml0dGVuIGFwcCBzdHJ1Y3R1cmUgaW4gZW1icm9pZGVyQHYzXG4gICAqIGlzIGV4dHJhbmVvdXMsIGFuZCB3ZSBjYW4gY29sbGFwc2UgaXRcbiAgICovXG4gIHBhY2thZ2VSZWxhdGl2ZSA9IHBhY2thZ2VSZWxhdGl2ZS5yZXBsYWNlKFxuICAgIGAke0VNQlJPSURFUl8zX1JFV1JJVFRFTl9BUFBfUEFUSH0vYCxcbiAgICAnLycsXG4gICk7XG5cbiAgbGV0IGxvY2FsUGFja2FnZXJTdHlsZVBhdGggPSBwYWNrYWdlU2NvcGVkUGF0aFRvTW9kdWxlUGF0aChwYWNrYWdlUmVsYXRpdmUpO1xuXG4gIHJldHVybiBgJHtuYW1lfSR7bG9jYWxQYWNrYWdlclN0eWxlUGF0aH1gO1xufVxuXG4vKipcbiAqIFRvIGF2b2lkIGhpdHRpbmcgdGhlIGZpbGVzeXNldG0sIHdlJ2xsIHN0b3JlIGFsbCBmb3VuZFxuICogcHJvamVjdCBwYXRocyBiZXJlLCBzbyB3ZSBjYW4sIGluIG1lbW9yeSxcbiAqIGdldCB0aGUgZm9sZGVyIHdoZXJlIGEgcGFja2FnZS5qc29uIGV4aXN0cywgcmF0aGVyIHRoYW5cbiAqIGhpdCB0aGUgZmlsZSBzeXN0ZW0gZXZlcnkgdGltZS5cbiAqL1xuY29uc3QgU0VFTiA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gZ2V0U2Vlbihzb3VyY2VQYXRoKSB7XG4gIGlmIChTRUVOLmhhcyhzb3VyY2VQYXRoKSkgcmV0dXJuIHNvdXJjZVBhdGg7XG5cbiAgbGV0IHBhcnRzID0gc291cmNlUGF0aC5zcGxpdCgnLycpO1xuXG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID4gMTsgaS0tKSB7XG4gICAgbGV0IHRvQ2hlY2sgPSBwYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7XG5cbiAgICBsZXQgc2VlbiA9IFNFRU4uaGFzKHRvQ2hlY2spO1xuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhdGgoc291cmNlUGF0aCwgb3B0aW9ucykge1xuICBsZXQgY3dkID0gb3B0aW9ucz8uY3dkID8/IENXRDtcblxuICBpZiAoc291cmNlUGF0aC5pbmNsdWRlcyhFTUJST0lERVJfM19SRVdSSVRURU5fQVBQX1BBVEgpKSB7XG4gICAgc291cmNlUGF0aCA9IHNvdXJjZVBhdGguc3BsaXQoRU1CUk9JREVSXzNfUkVXUklUVEVOX0FQUF9QQVRIKVswXTtcbiAgfVxuXG4gIGlmIChzb3VyY2VQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICBzb3VyY2VQYXRoID0gc291cmNlUGF0aC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICB9XG5cbiAgbGV0IHNlZW4gPSBnZXRTZWVuKHNvdXJjZVBhdGgpO1xuXG4gIGlmIChzZWVuKSB7XG4gICAgcmV0dXJuIHNlZW47XG4gIH1cblxuICBsZXQgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbihzb3VyY2VQYXRoLCAncGFja2FnZS5qc29uJyk7XG5cbiAgY29uc3QgaXNXb3Jrc3BhY2UgPSBmc1N5bmMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKTtcblxuICBpZiAoaXNXb3Jrc3BhY2UpIHtcbiAgICByZXR1cm4gc291cmNlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGZpbmRQYWNrYWdlSnNvblVwKHNvdXJjZVBhdGgsIHsgY3dkIH0pO1xuXG4gIGlmICghcGFja2FnZUpzb25QYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHByb2plY3QgZm9yICR7c291cmNlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKTtcblxuICBTRUVOLmFkZCh3b3Jrc3BhY2VQYXRoKTtcblxuICByZXR1cm4gd29ya3NwYWNlUGF0aDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uVXAoc3RhcnRQYXRoLCBvcHRpb25zKSB7XG4gIGxldCBjd2QgPSBvcHRpb25zPy5jd2QgPz8gQ1dEO1xuICBsZXQgcGFydHMgPSBzdGFydFBhdGguc3BsaXQoJy8nKTtcblxuICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+IDE7IGktLSkge1xuICAgIGxldCB0b0NoZWNrID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpO1xuXG4gICAgbGV0IHBhY2thZ2VKc29uID0gcGF0aC5qb2luKHRvQ2hlY2ssICdwYWNrYWdlLmpzb24nKTtcbiAgICBsZXQgZXhpc3RzID0gZnNTeW5jLmV4aXN0c1N5bmMocGFja2FnZUpzb24pO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIC8vIERvbid0IHRyYXZlcnNlIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS5cbiAgICBpZiAodG9DaGVjayA9PT0gY3dkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgTUFOSUZFU1RfQ0FDSEUgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogV2lsbCByZXR1cm4gdGhlIHBhY2thZ2UuanNvbiNuYW1lLCBvciBjb25maWcvZW52aXJvbm1lbnQjbW91ZGxlUHJlZml4IChpZiB2MSBhcHApXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZU5hbWUoc291cmNlUGF0aCkge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBmaW5kV29ya3NwYWNlUGF0aChzb3VyY2VQYXRoKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChtYW5pZmVzdFsnZW1iZXItYWRkb24nXSkge1xuICAgIC8qKlxuICAgICAqIExpYnJhcmllcyBhcmUgbm90IGFsbG93ZWQgdG8gY3VzdG9taXplIHRoZWlyIG1vZHVsZSBuYW1lXG4gICAgICogdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlaXIgcGFja2FnZSBuYW1lLlxuICAgICAqXG4gICAgICogKEl0J3MgYWxzbyBib25rZXJzIHRoYXQgdGhpcyBpcyBhbGxvd2VkIGZvciB2MSBhcHBzKVxuICAgICAqL1xuICAgIHJldHVybiBtYW5pZmVzdC5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciB2MSBhcHBzLCB3ZSBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgY29uZmlnL2Vudmlyb25tZW50LmpzIGZpbGVcbiAgICogdG8gc2VlIGlmIHRoZSBtb2R1bGVQcmVmaXggc2V0dGluZyBkaWZmZXJzIGZyb20gbWFuaWZlc3QubmFtZTtcbiAgICovXG4gIGxldCBlbnZpcm9ubWVudEpTID0gcGF0aC5qb2luKHdvcmtzcGFjZSwgJ2NvbmZpZy9lbnZpcm9ubWVudC5qcycpO1xuXG4gIC8qKlxuICAgKiBOT1RFOiB0aGUgZW52aXJvbm1lbnQuanMgaXMgYSBjb21tb25KUyBmaWxlLCBzbyB3ZSBjYW4gc3luY2hyb25vdXNseSByZXF1aXJlIGl0XG4gICAqXG4gICAqIFRPRE86IGlmIHdlIGhhdmUgaXNzdWVzIHdpdGggbG9hZGluZyB0aGlzIGZpbGUgbGF0ZXIgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgcnVuIGpzY29kZXNoaWZ0IG9uIGl0XG4gICAqICAgICAgIGJ1dCB0aGF0IGNvdWxkIGFsbG93IHVzIHRvIGJlIGJyaXR0bGUgaW4gZGlmZmVyZW50IHdheXMsIGxpa2UgaWYgZm9sa3Mgc3RyYXkgZnJvbSB0aGUgd2F5IHRoZVxuICAgKiAgICAgICBmaWxlIGlzIGxhaWQgb3V0IGZyb20gdGhlIGJsdWVwcmludCBkZWZhdWx0cy5cbiAgICovXG4gIGlmIChmc1N5bmMuZXhpc3RzU3luYyhlbnZpcm9ubWVudEpTKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZiAtLSB0aGlzIGV4aXN0c1xuICAgIGNvbnN0IGVudkZuID0gcmVxdWlyZShlbnZpcm9ubWVudEpTKTtcbiAgICBjb25zdCBlbnYgPSBlbnZGbignZW1iZXItc2NvcGVkLWNzcycpO1xuXG4gICAgcmV0dXJuIGVudi5tb2R1bGVQcmVmaXggfHwgbWFuaWZlc3QubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjayB0byB0aGUgdHJ1ZVx1MjEyMiBtb2R1bGVcdTIxMjIgbmFtZS5cbiAgICovXG4gIHJldHVybiBtYW5pZmVzdC5uYW1lO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3Jrc3BhY2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWFuaWZlc3Qod29ya3NwYWNlKSB7XG4gIGxldCBleGlzdGluZyA9IE1BTklGRVNUX0NBQ0hFLmdldCh3b3Jrc3BhY2UpO1xuXG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGxldCBidWZmZXIgPSBmc1N5bmMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3Jrc3BhY2UsICdwYWNrYWdlLmpzb24nKSk7XG4gIGxldCBjb250ZW50ID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gIGxldCBqc29uID0gSlNPTi5wYXJzZShjb250ZW50KTtcblxuICBNQU5JRkVTVF9DQUNIRS5zZXQod29ya3NwYWNlLCBqc29uKTtcblxuICByZXR1cm4ganNvbjtcbn1cbiIsICJpbXBvcnQgbWQ1IGZyb20gJ2JsdWVpbXAtbWQ1JztcblxuLyoqXG4gKiBUaGUgaW50ZW50IG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZ2VuZXJhdGUgdGhlIHN1ZmZpeC9wb3N0Zml4IGZvciB0aGVcbiAqIGNzcyBjbGFzc2VzLCBiYXNlZCBvbiB0aGUgbW9kdWxlLXNjb3BlZCBwYXRoIG5hbWUuXG4gKlxuICogZm9yIGV4YW1wbGUsXG4gKiAgICBoYXNoKCdteS1hcHAvY29tcG9uZW50cy9mb28nKVxuICogIGluc3RlYWQgb2ZcbiAqICAgIGhhc2goJ2FwcC9jb21wb25lbnRzL2ZvbycpXG4gKlxuICogICh1bmxlc3MgeW91ciBhcHAgbmFtZSBpcyAnYXBwJylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlUGF0aFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2gobW9kdWxlUGF0aCkge1xuICByZXR1cm4gJ2UnICsgbWQ1KG1vZHVsZVBhdGgpLnN1YnN0cmluZygwLCA4KTtcbn1cblxuXG5leHBvcnQgY29uc3QgaGFzaEZyb21Nb2R1bGVQYXRoID0gaGFzaDtcbiIsICJpbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBwYXJzZXIgZnJvbSAncG9zdGNzcy1zZWxlY3Rvci1wYXJzZXInO1xuXG5pbXBvcnQgaXNJbnNpZGVHbG9iYWwgZnJvbSAnLi9pc0luc2lkZUdsb2JhbC5qcyc7XG5cbmZ1bmN0aW9uIHJld3JpdGVTZWxlY3RvcihzZWwsIHBvc3RmaXgpIHtcbiAgY29uc3QgdHJhbnNmb3JtID0gKHNlbGVjdG9ycykgPT4ge1xuICAgIHNlbGVjdG9ycy53YWxrKChzZWxlY3RvcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdjbGFzcycgJiYgIWlzSW5zaWRlR2xvYmFsKHNlbGVjdG9yKSkge1xuICAgICAgICBzZWxlY3Rvci52YWx1ZSArPSAnXycgKyBwb3N0Zml4O1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci50eXBlID09PSAndGFnJyAmJiAhaXNJbnNpZGVHbG9iYWwoc2VsZWN0b3IpKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIHBhcnNlci50YWcoeyB2YWx1ZTogc2VsZWN0b3IudmFsdWUgfSksXG4gICAgICAgICAgcGFyc2VyLmNsYXNzTmFtZSh7IHZhbHVlOiBwb3N0Zml4IH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIDpnbG9iYWxcbiAgICBzZWxlY3RvcnMud2Fsaygoc2VsZWN0b3IpID0+IHtcbiAgICAgIGlmIChzZWxlY3Rvci50eXBlID09PSAncHNldWRvJyAmJiBzZWxlY3Rvci52YWx1ZSA9PT0gJzpnbG9iYWwnKSB7XG4gICAgICAgIHNlbGVjdG9yLnJlcGxhY2VXaXRoKC4uLnNlbGVjdG9yLm5vZGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXJzZXIodHJhbnNmb3JtKS5wcm9jZXNzU3luYyhzZWwpO1xuXG4gIHJldHVybiB0cmFuc2Zvcm1lZDtcbn1cblxuZnVuY3Rpb24gaXNJbnNpZGVLZXlmcmFtZXMobm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICBpZiAoIXBhcmVudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnICYmIHBhcmVudC5uYW1lID09PSAna2V5ZnJhbWVzJykgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIGlzSW5zaWRlS2V5ZnJhbWVzKHBhcmVudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVDc3MoY3NzLCBwb3N0Zml4LCBmaWxlTmFtZSwgbGF5ZXJOYW1lKSB7XG4gIGNvbnN0IGxheWVyTmFtZVdpdGhEZWZhdWx0ID0gbGF5ZXJOYW1lID8/ICdjb21wb25lbnRzJztcbiAgY29uc3QgYXN0ID0gcG9zdGNzcy5wYXJzZShjc3MpO1xuXG4gIGFzdC53YWxrKChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ3J1bGUnICYmICFpc0luc2lkZUtleWZyYW1lcyhub2RlKSkge1xuICAgICAgbm9kZS5zZWxlY3RvciA9IHJld3JpdGVTZWxlY3Rvcihub2RlLnNlbGVjdG9yLCBwb3N0Zml4KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHJld3JpdHRlbkNzcyA9IGFzdC50b1N0cmluZygpO1xuXG4gIGlmICghbGF5ZXJOYW1lV2l0aERlZmF1bHQpIHtcbiAgICByZXR1cm4gYC8qICR7ZmlsZU5hbWV9ICovXFxuJHtyZXdyaXR0ZW5Dc3N9XFxuYDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgYC8qICR7ZmlsZU5hbWV9ICovXFxuQGxheWVyICR7bGF5ZXJOYW1lV2l0aERlZmF1bHR9IHtcXG5cXG5gICtcbiAgICByZXdyaXR0ZW5Dc3MgK1xuICAgICdcXG59XFxuJ1xuICApO1xufVxuXG4iLCAiaW1wb3J0IHJlY2FzdCBmcm9tICdlbWJlci10ZW1wbGF0ZS1yZWNhc3QnO1xuXG5pbXBvcnQgeyByZW5hbWVDbGFzcyB9IGZyb20gJy4vcmVuYW1lQ2xhc3MuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVQbHVnaW4oeyBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4IH0pIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIC8vIHNjb3BlZC1jbGFzcyBpcyBhIGdsb2JhbCB3ZSBhbGxvdyBpbiBoYnNcbiAgLy8gc2NvcGVkQ2xhc3MgaXMgaW1wb3J0YWJsZSwgYW5kIHdlJ2xsIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgdG8gcmVuYW1lIGl0XG4gIGxldCBzY29wZWRDbGFzc0NhbmRpZGF0ZXMgPSBbJ3Njb3BlZC1jbGFzcycsICdzY29wZWRDbGFzcyddO1xuXG4gIGZ1bmN0aW9uIGlzU2NvcGVkQ2xhc3Moc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzY29wZWRDbGFzc0NhbmRpZGF0ZXMuc29tZSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IHN0cik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIEF0dHJOb2RlKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ1RleHROb2RlJyAmJiBub2RlLnZhbHVlLmNoYXJzKSB7XG4gICAgICAgICAgY29uc3QgcmVuYW1lZENsYXNzID0gcmVuYW1lQ2xhc3Mobm9kZS52YWx1ZS5jaGFycywgcG9zdGZpeCwgY2xhc3Nlcyk7XG5cbiAgICAgICAgICBub2RlLnZhbHVlLmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUudHlwZSA9PT0gJ0NvbmNhdFN0YXRlbWVudCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIG5vZGUudmFsdWUucGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdUZXh0Tm9kZScgJiYgcGFydC5jaGFycykge1xuICAgICAgICAgICAgICBjb25zdCByZW5hbWVkQ2xhc3MgPSByZW5hbWVDbGFzcyhwYXJ0LmNoYXJzLCBwb3N0Zml4LCBjbGFzc2VzKTtcblxuICAgICAgICAgICAgICBwYXJ0LmNoYXJzID0gcmVuYW1lZENsYXNzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdNdXN0YWNoZVN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgcmVjYXN0LnRyYXZlcnNlKHBhcnQsIHtcbiAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmFtZWRDbGFzcyA9IHJlbmFtZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICBub2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwb3N0Zml4LFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHJlbmFtZWRDbGFzcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGUobm9kZSkge1xuICAgICAgaWYgKHRhZ3MuaGFzKG5vZGUudGFnKSkge1xuICAgICAgICAvLyBjaGVjayBpZiBjbGFzcyBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgY2xhc3NBdHRyID0gbm9kZS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIubmFtZSA9PT0gJ2NsYXNzJyk7XG5cbiAgICAgICAgaWYgKGNsYXNzQXR0cikge1xuICAgICAgICAgIGNsYXNzQXR0ci52YWx1ZS5jaGFycyArPSAnICcgKyBwb3N0Zml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHB1c2ggY2xhc3MgYXR0cmlidXRlXG4gICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgICByZWNhc3QuYnVpbGRlcnMuYXR0cignY2xhc3MnLCByZWNhc3QuYnVpbGRlcnMudGV4dChwb3N0Zml4KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBbGw6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgIH0sXG4gICAgICBleGl0KCkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIE11c3RhY2hlU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgIGxldCBjc3NDbGFzcztcblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhcmFtc1swXS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1Njb3BlZENsYXNzKGdldFZhbHVlKG5vZGUucGF0aD8ucGF0aCkpICYmXG4gICAgICAgIG5vZGUucGF0aD8ucGFyYW1zPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgbm9kZS5wYXRoPy5wYXJhbXNbMF0udHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnXG4gICAgICApIHtcbiAgICAgICAgY3NzQ2xhc3MgPSBub2RlLnBhdGgucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzQ2xhc3MpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSByZWNhc3QuYnVpbGRlcnMudGV4dChyZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCkpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdBdHRyTm9kZScpIHtcbiAgICAgICAgICBwYXJlbnQucXVvdGVUeXBlID0gJ1wiJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgU3ViRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzU2NvcGVkQ2xhc3MoZ2V0VmFsdWUobm9kZS5wYXRoKSkgJiZcbiAgICAgICAgbm9kZS5wYXJhbXM/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBub2RlLnBhcmFtc1swXS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjc3NDbGFzcyA9IG5vZGUucGFyYW1zWzBdLnZhbHVlO1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHJlY2FzdC5idWlsZGVycy5saXRlcmFsKFxuICAgICAgICAgICdTdHJpbmdMaXRlcmFsJyxcbiAgICAgICAgICByZW5hbWVDbGFzcyhjc3NDbGFzcywgcG9zdGZpeCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRleHROb2RlO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHBhdGgpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgaWYgKCd2YWx1ZScgaW4gcGF0aCkge1xuICAgIHJldHVybiBwYXRoLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZW1iZXIgNS45K1xuICAgKiAoc28gd2UgdXNlIHRoZSBhYm92ZSBmb3IgbmV3ZXIgZW1iZXJzKVxuICAgKi9cbiAgcmV0dXJuIHBhdGgub3JpZ2luYWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJld3JpdGVIYnMoaGJzLCBjbGFzc2VzLCB0YWdzLCBwb3N0Zml4KSB7XG4gIGxldCBhc3QgPSByZWNhc3QucGFyc2UoaGJzKTtcblxuICByZWNhc3QudHJhdmVyc2UoYXN0LCB0ZW1wbGF0ZVBsdWdpbih7IGNsYXNzZXMsIHRhZ3MsIHBvc3RmaXggfSkpO1xuXG4gIGxldCByZXN1bHQgPSByZWNhc3QucHJpbnQoYXN0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3N0Zml4XG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbY2xhc3Nlc0luQ3NzXVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZUNsYXNzKGNsYXNzTmFtZSwgcG9zdGZpeCwgY2xhc3Nlc0luQ3NzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWUuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcmVuYW1lZENsYXNzZXMgPSBjbGFzc2VzXG4gICAgLmZpbHRlcigoYykgPT4gYylcbiAgICAubWFwKChjKSA9PiBjLnRyaW0oKSlcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBpZiAoIWNsYXNzZXNJbkNzcyB8fCBjbGFzc2VzSW5Dc3MuaGFzKGMpKSB7XG4gICAgICAgIGlmIChjLmVuZHNXaXRoKHBvc3RmaXgpKSByZXR1cm4gYztcblxuICAgICAgICByZXR1cm4gYyArICdfJyArIHBvc3RmaXg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjO1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcblxuICBjb25zdCByZW5hbWVkV2l0aFByZXNlcnZlZFNwYWNlcyA9IGNsYXNzTmFtZS5yZXBsYWNlKFxuICAgIGNsYXNzTmFtZS50cmltU3RhcnQoKS50cmltRW5kKCksXG4gICAgcmVuYW1lZENsYXNzZXMsXG4gICk7XG5cbiAgcmV0dXJuIHJlbmFtZWRXaXRoUHJlc2VydmVkU3BhY2VzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBLHFCQUEyQjtBQUMzQixzQkFBb0M7QUFDcEMs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LHFCQUFpQixJQUFJLGFBQWEsZ0JBQWdCO0FBQUEsTUFDaEQ7QUFBQSxNQUNBLGdCQUFnQixNQUFNLEtBQUs7QUFBQSxNQUMzQixPQUFPLEtBQUs7QUFBQSxNQUNaLGlCQUFpQixLQUFLO0FBQUEsSUFDeEIsQ0FBQztBQUVELFVBQU0sa0JBQWtCLElBQUksOEJBQU8sZ0JBQWdCO0FBQUEsTUFDakQsU0FBUyxNQUFNLElBQUksQ0FBQyxTQUFTO0FBQzNCLFlBQUksWUFBWSxLQUFLLFNBQVMsR0FBRyxJQUFJLE9BQU8sR0FBRyxJQUFJO0FBRW5ELGVBQU8sR0FBRyxTQUFTO0FBQUEsTUFDckIsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFVBQU0sU0FBUyxJQUFJLDhCQUFPLFdBQVc7QUFBQSxNQUNuQyxTQUFTLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtBQUFBLElBQzVDLENBQUM7QUFFRCxRQUFJLGVBQWUsSUFBSSw0QkFBQUE7QUFBQSxNQUNyQixDQUFDLFFBQVEsa0JBQWtCLGVBQWU7QUFBQSxNQUMxQyxFQUFFLFdBQVcsS0FBSztBQUFBLElBQ3BCO0FBRUEsUUFBSSxZQUFZLElBQUksdUJBQUFDLFFBQU8sY0FBYztBQUFBLE1BQ3ZDLFlBQVksUUFBUSxZQUFZLEtBQUs7QUFBQSxNQUNyQyxXQUFXO0FBQUEsTUFDWCxpQkFBaUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxJQUNuQyxDQUFDO0FBRUQsUUFBSSxLQUFLLGFBQWEsYUFBYTtBQUNqQyxVQUFJLGdCQUFnQixJQUFJLDhCQUFPLGNBQWM7QUFBQSxRQUMzQyxTQUFTLEtBQUssWUFBWTtBQUFBLFFBQzFCLFNBQVMsS0FBSyxZQUFZO0FBQUEsTUFDNUIsQ0FBQztBQUVELGFBQU8sSUFBSSw0QkFBQUQsUUFBVyxDQUFDLGVBQWUsU0FBUyxHQUFHLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxJQUN2RSxPQUFPO0FBQ0wsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbImltcG9ydF9ub2RlX3BhdGgiLCAicGFyc2VyIiwgInBvc3Rjc3MiLCAibWQ1IiwgInBhdGgiLCAiaW1wb3J0X3Bvc3Rjc3MiLCAiaW1wb3J0X3Bvc3Rjc3Nfc2VsZWN0b3JfcGFyc2VyIiwgInBhcnNlciIsICJwb3N0Y3NzIiwgInJlY2FzdCIsICJub2RlIiwgInBhdGgiLCAiRmlsdGVyIiwgInBhdGgiLCAiaGFzaCIsICJyZXN1bHRzIiwgInAiLCAiTWVyZ2VUcmVlcyIsICJDb25jYXQiXQp9Cg==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-scoped-css",
3
- "version": "0.22.0",
3
+ "version": "0.23.1",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -78,7 +78,6 @@
78
78
  "broccoli-stew": "^3.0.0",
79
79
  "content-tag": "^3.1.1",
80
80
  "ember-cli-babel": "^8.2.0",
81
- "ember-source": "^5.9.0",
82
81
  "ember-template-recast": "^6.1.5",
83
82
  "glob": "^8.1.0",
84
83
  "postcss": "^8.5.3",
@@ -268,11 +268,10 @@ export default class ScopedCssPreprocessor {
268
268
  include: [this.appName + '/styles/app.css'],
269
269
  });
270
270
 
271
- let mergedStyles = new MergeTrees([
272
- appCss,
273
- mergedOtherTrees,
274
- componentStyles,
275
- ]);
271
+ let mergedStyles = new MergeTrees(
272
+ [appCss, mergedOtherTrees, componentStyles],
273
+ { overwrite: true },
274
+ );
276
275
 
277
276
  let newOutput = new Concat(mergedStyles, {
278
277
  outputFile: options.outputPaths['app'],
@@ -280,6 +279,15 @@ export default class ScopedCssPreprocessor {
280
279
  sourceMapConfig: { enabled: true },
281
280
  });
282
281
 
283
- return newOutput;
282
+ if (this.userOptions?.passthrough) {
283
+ let passedThrough = new Funnel(mergedStyles, {
284
+ include: this.userOptions.passthrough,
285
+ destDir: this.userOptions.passthroughDestination,
286
+ });
287
+
288
+ return new MergeTrees([passedThrough, newOutput], { overwrite: true });
289
+ } else {
290
+ return newOutput;
291
+ }
284
292
  }
285
293
  }