@mnaoumov/obsidian-lib 4.2.1 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -485,4 +485,4 @@ export {
485
485
  unregisterFileCacheForNonExistingFile,
486
486
  unregisterFiles
487
487
  };
488
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIEN1c3RvbUFycmF5RGljdEltcGwsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGUsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyxcbiAgUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5cbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlIH0gZnJvbSAnLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNGaWxlLFxuICBpc1BhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyTGlua3MsXG4gIHBhcnNlTGlua3MsXG4gIHRvUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQgeyBmaW5kUGx1Z2luQXBpIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgeyBzb3J0UmVmZXJlbmNlcyB9IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua1JlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2luZyBmZWF0dXJlcyB0aGF0IHdlcmUgYXBwbGllZCB3aGVuIGNvbXB1dGluZyB0aGlzIGNhY2hlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW107XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHlcbiAgICogd2hlbiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHkgd2hlblxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgdGltZW91dCBub3RpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMgZXh0ZW5kcyBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2V0Q2FjaGVTYWZlfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0Q2FjaGVTYWZlT3B0aW9ucyA9IFBhcnNlQ2FjaGVPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldExpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRMaW5rc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FjaGVkIG1ldGFkYXRhIHRvIHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVtYmVkcyAoYGNhY2hlLmVtYmVkc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFbWJlZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWVzLiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGZyb250bWF0dGVyIGxpbmtzIChgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsXG4gICAqIGkuZS4gdGhlIG9mZnNldC1jYXJyeWluZyBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcyAobmFycm93ZWQgdmlhXG4gICAqIHtAbGluayBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHN9KS4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlIGxpbmtzIChgY2FjaGUubGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlUmVmZXJlbmNlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHBhcnNpbmcgcGVyZm9ybWVkIGJ5IHtAbGluayBnZXRDYWNoZVNhZmV9IGFuZCB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gYmV5b25kIE9ic2lkaWFuJ3NcbiAqIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nLiBFYWNoIG9wdGlvbiBpcyBvcHQtaW47IGVuYWJsaW5nIGl0IGFkZHMgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZX0gYW5kIHBvcHVsYXRlcyB0aGUgbWF0Y2hpbmcgbGlua3MgYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VDYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGludGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTWV0YWRhdGFPcHRpb25zID0gUGFyc2VDYWNoZU9wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGNhY2hlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBwdWJsaXNoZWQgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkLFxuICogYmVjYXVzZSB0aGF0IHBsdWdpbiBpcyBub3QgYSBkZXBlbmRlbmN5IChydWxlIEw5IGluIGBBR0VOVFMubWRgKS4gSXRzIGBhcGkuZC50c2AgZGVjbGFyZXMgdGhlIHdob2xlIG9mIGl0LlxuICovXG5pbnRlcmZhY2UgQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHtcbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MsIG9yIGBudWxsYCB3aGlsZSB0aGUgcGx1Z2luJ3MgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGU6IChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKSA9PiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUgb25jZSB0aGUgcGVuZGluZyBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYmFja2xpbmtzLCBvciB0byBgbnVsbGAgd2hpbGUgdGhlIHBsdWdpbidzIGBCYWNrbGlua3NgXG4gICAqICAgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiAocGF0aE9yRmlsZTogUGF0aE9yRmlsZSkgPT4gUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw+O1xufVxuXG4vKipcbiAqIEEgc2VsZWN0b3IgZm9yIGEgZmVhdHVyZS1nYXRlZCBsaW5rIGNhdGVnb3J5IGluIHtAbGluayBnZXRMaW5rc30uXG4gKi9cbmludGVyZmFjZSBGZWF0dXJlTGlua1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmsgY2F0ZWdvcnksIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZSB0aGF0IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2FjaGUgZm9yIHRoaXMgY2F0ZWdvcnkgdG8gYmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmU7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmtzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gdGhlIGNhY2hlLlxuICAgKi9cbiAgc2VsZWN0OiAoY2FjaGU6IENhY2hlZE1ldGFkYXRhRXgpID0+IFJlZmVyZW5jZVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBjYXRlZ29yeS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4fS5cbiAqL1xuaW50ZXJmYWNlIFRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGxhaW4gY2FjaGVkIG1ldGFkYXRhIHRvIHdyYXAuXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIGNvbnRlbnQgdGhlIG9mZnNldHMgaW5kZXggaW50bywgdXNlZCBmb3IgYm9keSBleHRlcm5hbC1saW5rIHBhcnNpbmcuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGxpbmtzIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUGFyc2VDYWNoZU9wdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsdWdpbiBpZCBvZiB0aGUgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwbHVnaW4sIHRoZSBzdWNjZXNzb3IgdG8gYEJhY2tsaW5rIENhY2hlYC5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBoYXNCYWNrbGlua0NhY2hlUGx1Z2lufSwgYW5kIGFzIHRoZSBwcm92aWRlciBpZCB1bmRlciB3aGljaCB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aH0gYW5kIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0gbG9vayB1cCB0aGUgcGx1Z2luJ3MgcHVibGlzaGVkIEFQSS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRCA9ICdhZHZhbmNlZC1tZXRhZGF0YS1jYWNoZSc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHZlcnNpb25zIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY29tcGlsZWQgYWdhaW5zdC4gYDEuMy4wYCBpcyB0aGUgZmlyc3QgdG8gY2FycnkgdGhlIHR3byBiYWNrbGluayBtZXRob2RzLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UgPSAnXjEuMy4wJztcblxuLyoqXG4gKiBUaGUgc2NoZW1hcyBvZiBhIGJhY2tsaW5rIG1ldGhvZCdzIHBheWxvYWRzOiB0aGUgb25lIHBhdGgtb3ItZmlsZSBhcmd1bWVudCwgYW5kIHRoZSBiYWNrbGlua3Mgb3IgYG51bGxgLlxuICpcbiAqIEEgY29weSBvZiB0aGUgYGdldEJhY2tsaW5rc0ZvckZpbGVgIGFuZCBgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmVgIGVudHJpZXMgb2YgYEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0FQSV9DT05UUkFDVGAsIHdoaWNoIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgc2hpcHMgYXNcbiAqIGl0cyByb290IGBhcGktY29udHJhY3QudHNgIGFuZCBwdWJsaXNoZXMuIEtlZXAgdGhlIGd1YXJkcyBpbiBhZ3JlZW1lbnQgd2l0aCB0aGF0IGZpbGUsIHNvIHRoZSBwcm92aWRlciBhbmQgdGhpcyBjb25zdW1lciBjaGVjayBvbmUgZGVmaW5pdGlvbi5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVCA9IHtcbiAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGF0aE9yRmlsZTogUGF0aE9yRmlsZV0+KFt7IGV4cGVjdGVkOiAnYSBwYXRoIG9yIGEgZmlsZScsIHR5cGVHdWFyZDogaXNQYXRoT3JGaWxlIH1dKSxcbiAgb3V0cHV0OiBjcmVhdGVUeXBlR3VhcmRTY2hlbWEoeyBleHBlY3RlZDogJ2EgYmFja2xpbmtzIGRpY3Rpb25hcnkgb3IgbnVsbCcsIHR5cGVHdWFyZDogaXNOdWxsYWJsZUJhY2tsaW5rc0RpY3QgfSlcbn07XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IG9mIHRoZSBtZW1iZXJzIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY2FsbHMsIHNvIGEgcmVjb3JkIHRoYXQgbGFja3MgZWl0aGVyIGlzIHBhc3NlZCBvdmVyLCBhbmQgYSBwYXlsb2FkIHRoYXQgYnJlYWtzIGl0cyBzaWduYXR1cmUgaXMgcmVwb3J0ZWQgd2hpbGUgdGhlIGBQbHVnaW5BcGlgIGRlYnVnZ2VyIGlzIG9uLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX0NPTlRSQUNUOiBBcGlDb250cmFjdDxBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGk+ID0ge1xuICBnZXRCYWNrbGlua3NGb3JGaWxlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNULFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVFxufTtcblxuLyoqXG4gKiBUaGUgcGx1Z2luIGlkIG9mIHRoZSByZXRpcmVkIGBCYWNrbGluayBDYWNoZWAgcGx1Z2luLCBzdXBlcnNlZGVkIGJ5IHtAbGluayBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUR9LlxuICpcbiAqIFN0aWxsIHJlY29nbml6ZWQgYnkge0BsaW5rIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW59LCBkZWxpYmVyYXRlbHkuIFJlbW92aW5nIGEgcGx1Z2luIGZyb20gdGhlIGNvbW11bml0eSByZWdpc3RyeSBibG9ja3MgbmV3IGluc3RhbGxzOyBpdCB1bmluc3RhbGxzIG5vdGhpbmcsIHNvIGV2ZXJ5IGV4aXN0aW5nIHVzZXIga2VlcHMgaXQgdW50aWwgdGhleSBtaWdyYXRlIGJ5IGhhbmQuXG4gKlxuICogSXQgbWF5IGJlIGRyb3BwZWQgd2hlbiBhbGwgdGhyZWUgb2YgdGhlIGZvbGxvd2luZyBob2xkLCBhbmQgbm90IGJlZm9yZTogYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBpcyBsaXN0ZWQgaW4gdGhlIGNvbW11bml0eSByZWdpc3RyeSwgc28gbWlncmF0aW5nIGlzIHBvc3NpYmxlIGF0IGFsbDsgdGhlIGZpbmFsIGBCYWNrbGluayBDYWNoZWAgaGFuZG92ZXIgcmVsZWFzZSBoYXMgYmVlbiBvdXQgZm9yIGF0IGxlYXN0IHR3ZWx2ZSBtb250aHM7IGFuZCB0aGlzIGxpYnJhcnkgaXMgY3V0dGluZyBhIG1ham9yIHJlbGVhc2UgYW55d2F5LCBiZWNhdXNlIGRyb3BwaW5nIHRoZSBpZCBzaWxlbnRseSB1bi1nYXRlcyBjYW52YXMgbGluayBoYW5kbGluZyBmb3IgYW55b25lIHdobyBoYXMgbm90IG1pZ3JhdGVkLiBUaGVyZSBpcyBubyBjb3N0IHByZXNzdXJlIHRvIGRyb3AgaXQgZWFybGllciAtIHJlY29nbml6aW5nIGEgZGVhZCBpZCBpcyBvbmUgc3RyaW5nIGNvbXBhcmlzb24gb24gYSBwYXRoIHRoYXQgYWxyZWFkeSByZWFkcyBhIHBsdWdpbiByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJBQ0tMSU5LX0NBQ0hFX1BMVUdJTl9JRCA9ICdiYWNrbGluay1jYWNoZSc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeSBmb3IgYWxsIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uQ2xlYW5DYWNoZShyZXNvbHZlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICogTk9URTogVGhlIGZpbGUgbWF5IGJlIG5vbi1leGlzdGVudC5cbiAqXG4gKiBXaGVuIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcHVibGlzaGVzIGl0cyBiYWNrbGlua3MgQVBJIGFuZCBpdHMgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9uLCBpdHMgY2FjaGUgYW5zd2Vycy5cbiAqIE90aGVyd2lzZSB0aGUgYW5zd2VyIGNvbWVzIGZyb20gYSBiYWNrbGluayBpbmRleCB3aG9zZSBjb3N0IGlzIHByb3BvcnRpb25hbCB0byB0aGUgY2FuZGlkYXRlIG5vdGVzIHJhdGhlciB0aGFuXG4gKiB0byBldmVyeSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0LCBhbmQgd2hpY2ggZ2l2ZXMgdGhlIHNhbWUgcmVmZXJlbmNlcyBPYnNpZGlhbidzIG93biBgZ2V0QmFja2xpbmtzRm9yRmlsZWAgZ2l2ZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW2ZpbGVdKTtcbiAgcmV0dXJuIGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKT8uZ2V0QmFja2xpbmtzRm9yRmlsZShmaWxlKSA/PyBnZXRJbmRleGVkQmFja2xpbmtzRm9yRmlsZShhcHAsIGZpbGUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICpcbiAqIFdoZW4gYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwdWJsaXNoZXMgaXRzIGJhY2tsaW5rcyBBUEkgYW5kIGl0cyBgQmFja2xpbmtzYCBtb2R1bGUgaXMgb24sIHRoYXQgQVBJIGFuc3dlcnMuXG4gKlxuICogT3RoZXJ3aXNlIHRoaXMgaXMgTk9UIGEgcHVyZSByZWFkLiBJdCB2ZXJpZmllc1xuICogZWFjaCBiYWNrbGluayBhZ2FpbnN0IHRoZSBub3RlJ3MgY3VycmVudCB0ZXh0LCBhbmQgdG8gZG8gdGhhdCBpdCBjYWxscyB7QGxpbmsgc2F2ZU5vdGV9IG9uIGV2ZXJ5XG4gKiBub3RlIHRoYXQgbGlua3MgdG8gdGhlIGZpbGUsIHdoaWNoIHNhdmVzIGFueSBvcGVuIGVkaXRvciB2aWV3IG9mIHRob3NlIG5vdGVzIHRoYXQgaGFzIHVuc2F2ZWRcbiAqIGNoYW5nZXMuIENhbGwgaXQgZnJvbSBhbiBleHBsaWNpdCB1c2VyIGFjdGlvbi4gRG8gbm90IGNhbGwgaXQgZnJvbSBhbiBhdXRvbWF0aWMgdHJpZ2dlciAoYSB2YXVsdCBvclxuICogbWV0YWRhdGEgZXZlbnQsIGEgc2F2ZSBvciByZW5kZXIgcGF0Y2gpIHRoYXQgb25seSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0LiBUaGVyZSwgYSBmb3JjZWQgc2F2ZSBjYW5cbiAqIHJhY2UgYW5vdGhlciBwbHVnaW4ncyBpbi1mbGlnaHQgZWRpdG9yIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgZGljdGlvbmFyeSBvZiBiYWNrbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShwYXJhbXM6IEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlUGFyYW1zKTogUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPj4ge1xuICBjb25zdCB7IGFwcCwgcGF0aE9yRmlsZSwgLi4ub3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBjYWNoZWRCYWNrbGlua3MgPSBhd2FpdCBmaW5kQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpKCk/LmdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHBhdGhPckZpbGUpO1xuICBpZiAoY2FjaGVkQmFja2xpbmtzKSB7XG4gICAgcmV0dXJuIGNhY2hlZEJhY2tsaW5rcztcbiAgfVxuXG4gIGxldCBiYWNrbGlua3M6IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+ID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuICBhd2FpdCByZXRyeVdpdGhUaW1lb3V0Tm90aWNlKHtcbiAgICBhc3luYyBvcGVyYXRpb25GdW5jdGlvbihhYm9ydFNpZ25hbCkge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgYmFja2xpbmtzID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHAsIGZpbGUpO1xuICAgICAgZm9yIChjb25zdCBub3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IG5vdGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBub3RlUGF0aCB9KTtcbiAgICAgICAgaWYgKCFub3RlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBjYW52YXMgaG9sZGVyIGNhbm5vdCBiZSBjaGVja2VkIGFnYWluc3QgaXRzIHRleHQuIEl0cyBmaWxlLW5vZGUgcmVmZXJlbmNlcyBjYXJyeSBubyBwb3NpdGlvbiwgYW5kXG4gICAgICAgIC8vIE9ic2lkaWFuIHJlcG9ydHMgYSB0ZXh0LW5vZGUgZW1iZWQgd2l0aCBhIHBvc2l0aW9uIGludG8gdGhhdCBub2RlJ3Mgb3duIHRleHQsIG5vdCBpbnRvIHRoZSBjYW52YXMgSlNPTixcbiAgICAgICAgLy8gc28gc2xpY2luZyB0aGUgZmlsZSBhdCBpdCBuZXZlciBnaXZlcyB0aGUgbGluayBiYWNrIGFuZCB0aGUgcmV0cnkgd291bGQgbmV2ZXIgZW5kLlxuICAgICAgICBpZiAoaXNDYW52YXNGaWxlKG5vdGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlua3MgPSBiYWNrbGlua3MuZ2V0KG5vdGVQYXRoKTtcbiAgICAgICAgaWYgKCFsaW5rcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlZCBvbmx5IHdoZW4gYSBmcm9udG1hdHRlciBsaW5rIG5lZWRzIGl0OiBhIG5vdGUgd2hvc2UgWUFNTCBkb2VzIG5vdCBwYXJzZSBzdGlsbCBob2xkcyBib2R5IGxpbmtzLFxuICAgICAgICAvLyBhbmQgYG51bGxgIG1hcmtzIGEgcGFyc2UgdGhhdCBmYWlsZWQsIHNvIGl0cyBmcm9udG1hdHRlciBsaW5rcyBhcmUgc2tpcHBlZCByYXRoZXIgdGhhbiByZXRyaWVkIGZvcmV2ZXIuXG4gICAgICAgIGxldCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGxldCBhY3R1YWxMaW5rOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUobGluaykpIHtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBjb250ZW50LnNsaWNlKGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSkge1xuICAgICAgICAgICAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyT3JOdWxsKGNvbnRlbnQsIG5vdGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9udG1hdHRlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBsaW5rLmtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlua1dpdGhPZmZzZXRzID0gdG9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspO1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IHByb3BlcnR5VmFsdWUuc2xpY2UobGlua1dpdGhPZmZzZXRzLnN0YXJ0T2Zmc2V0LCBsaW5rV2l0aE9mZnNldHMuZW5kT2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3R1YWxMaW5rICE9PSBsaW5rLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGgsIHsgZmlsZVBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmV0cnlPcHRpb25zOiBvcHRpb25zLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiBvcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlID8/IHRydWVcbiAgfSk7XG5cbiAgcmV0dXJuIGJhY2tsaW5rcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgYSBnaXZlbiBmaWxlIG9yIHBhdGguXG4gKlxuICogVGhpcyBpcyBOT1QgYSBwdXJlIHJlYWQ6IGJlZm9yZSBpdCByZWFkcyB0aGUgY2FjaGUsIGl0IGNhbGxzIHtAbGluayBzYXZlTm90ZX0sIHdoaWNoIHNhdmVzIGFueVxuICogb3BlbiBlZGl0b3IgdmlldyBvZiB0aGUgbm90ZSB0aGF0IGhhcyB1bnNhdmVkIGNoYW5nZXMuIFRoYXQgc2F2ZSBpcyB3aHkgdGhlIGNhY2hlIG1hdGNoZXMgd2hhdCB0aGVcbiAqIHVzZXIgc2VlcywgYW5kIHdoeSBhIGNvbW1hbmQgdGhhdCByZXdyaXRlcyB0aGUgbm90ZSBjYW4gdXNlIHRoaXMgc2FmZWx5IHdpdGhvdXQgaXRzIHJld3JpdGUgYmVpbmdcbiAqIGNsb2JiZXJlZC4gSXQgaXMgYWxzbyBhIHdyaXRlIG9uIHRoZSBub3RlLiBTbyBkbyBub3QgY2FsbCB0aGlzIGZyb20gYW4gYXV0b21hdGljIHRyaWdnZXIgKGEgdmF1bHRcbiAqIG9yIG1ldGFkYXRhIGV2ZW50LCBhIHNhdmUgb3IgcmVuZGVyIHBhdGNoLCBhIGxheW91dCBob29rKSB0aGF0IG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvIGFjdDogYVxuICogZm9yY2VkIHNhdmUgb25lIHRpY2sgYWZ0ZXIgYW5vdGhlciBwbHVnaW4gaGFzIGRpc3BhdGNoZWQgYSBjaGFuZ2UgaW50byB0aGUgZWRpdG9yIGNhbiBsZWF2ZVxuICogT2JzaWRpYW4ncyBlZGl0b3IgcmVuZGVyaW5nIHN0YWxlIHN0YXRlLiBBIHJlYWQtb25seSBwcm9iZSBvbiB0aGUgbm90ZSdzIGN1cnJlbnQgdGV4dCBzaG91bGQgdXNlXG4gKiB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gb24gdGhhdCB0ZXh0IGluc3RlYWQuIEl0IG5lZWRzIG5vIHZpZXcsIG5vIGNhY2hlIGFuZCBubyBzYXZlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVPclBhdGggLSBUaGUgZmlsZSBvciBwYXRoIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZVNhZmUoYXBwOiBBcHAsIGZpbGVPclBhdGg6IFBhdGhPckZpbGUsIG9wdGlvbnM6IEdldENhY2hlU2FmZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkTWV0YWRhdGFFeCB8IG51bGw+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGZpbGVPclBhdGggfSk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICAgIGlmIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIGZpbGUpO1xuXG4gICAgICBjb25zdCBmaWxlQ2FjaGVFbnRyeSA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAgICAgY29uc3QgaXNVcFRvRGF0ZSA9IGZpbGVDYWNoZUVudHJ5Py5tdGltZSA9PT0gZmlsZS5zdGF0Lm10aW1lXG4gICAgICAgICYmIGZpbGVDYWNoZUVudHJ5LnNpemUgPT09IGZpbGUuc3RhdC5zaXplXG4gICAgICAgICYmIE9iamVjdC5oYXNPd24oYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZSwgZmlsZUNhY2hlRW50cnkuaGFzaCk7XG4gICAgICBpZiAoIWlzVXBUb0RhdGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZUZpbGVNZXRhZGF0YUFzeW5jKGZpbGUpO1xuICAgICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIH1cbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH1cblxuICAgIGlmIChjYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gT25seSB0aGUgYm9keS1leHRlcm5hbCBwYXJzZSBuZWVkcyB0aGUgZmlsZSBjb250ZW50OyBmcm9udG1hdHRlciBwYXJzaW5nIHVzZXMgdGhlIGNhY2hlZFxuICAgIC8vIGZyb250bWF0dGVyLCBzbyBhdm9pZCByZWFkaW5nIHRoZSBjb250ZW50IHVubGVzcyBpdCBpcyBhY3R1YWxseSBuZWVkZWQuXG4gICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMuc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiAnJztcbiAgICByZXR1cm4gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZyb250IG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSBzYWZlbHkuXG4gKlxuICogSXQgcmVhZHMgdGhyb3VnaCB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSwgc28gaXQgc2F2ZXMgYW55IG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhlIG5vdGUgdGhhdCBoYXNcbiAqIHVuc2F2ZWQgY2hhbmdlcy4gU2VlIHtAbGluayBnZXRDYWNoZVNhZmV9IGZvciB3aGVuIHRoYXQgc2F2ZSBtYXR0ZXJzIGFuZCB3aGF0IHRvIHVzZSBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiBjdXN0b20gZnJvbnQgbWF0dGVyLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZyb250IG1hdHRlciBmcm9tLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGZyb250IG1hdHRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZyb250bWF0dGVyU2FmZTxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPj4ge1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICByZXR1cm4gKGNhY2hlPy5mcm9udG1hdHRlciA/PyB7fSkgYXMgQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzZWxlY3RlZCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlcyByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua3MocGFyYW1zOiBHZXRMaW5rc1BhcmFtcyk6IFJlZmVyZW5jZVtdIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIHNob3VsZEluY2x1ZGVFbWJlZHMgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID0gdHJ1ZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCBsaW5rczogUmVmZXJlbmNlW10gPSBbXG4gICAgLi4uKHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID8gY2FjaGUubGlua3MgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVFbWJlZHMgPyBjYWNoZS5lbWJlZHMgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID8gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/PyBbXSA6IFtdKVxuICBdO1xuXG4gIGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3JzOiBGZWF0dXJlTGlua1NlbGVjdG9yW10gPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdib2R5IGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnbXVsdGktdmFsdWUgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICAgIH1cbiAgXTtcblxuICBmb3IgKGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3Igb2YgZmVhdHVyZUxpbmtTZWxlY3RvcnMpIHtcbiAgICBpZiAoIWZlYXR1cmVMaW5rU2VsZWN0b3Iuc2hvdWxkSW5jbHVkZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGUpIHx8ICFjYWNoZS5mZWF0dXJlcy5pbmNsdWRlcyhmZWF0dXJlTGlua1NlbGVjdG9yLmZlYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmNsdWRlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5kZXNjcmlwdGlvbn06IHRoZSBjYWNoZSB3YXMgbm90IGNvbXB1dGVkIHdpdGggdGhlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlfSBmZWF0dXJlLmApO1xuICAgIH1cblxuICAgIGxpbmtzLnB1c2goLi4uZW5zdXJlTm9uTnVsbGFibGUoZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKSk7XG4gIH1cblxuICBzb3J0UmVmZXJlbmNlcyhsaW5rcyk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMaW5rID0gZW5zdXJlTm9uTnVsbGFibGUobGlua3NbaW5kZXggLSAxXSk7XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSAmJiBpc1JlZmVyZW5jZUNhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIHJldHVybiBsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAhPT0gcHJldmlvdXNMaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSA/IGxpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgY29uc3QgcHJldmlvdXNMaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKSA/IHByZXZpb3VzTGluay5zdGFydE9mZnNldCA6IDA7XG4gICAgICByZXR1cm4gbGluay5rZXkgIT09IHByZXZpb3VzTGluay5rZXkgfHwgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspICE9PSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKVxuICAgICAgICB8fCBsaW5rU3RhcnRPZmZzZXQgIT09IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgYmFja2xpbmsgY2FjaGUgcGx1Z2luIGlzIGN1cnJlbnRseSBsb2FkZWQgLSBlaXRoZXIgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCAoe0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0pIG9yIGl0cyByZXRpcmVkIHByZWRlY2Vzc29yIGBCYWNrbGluayBDYWNoZWAgKHtAbGluayBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUR9KS5cbiAqXG4gKiBTdWNoIGEgcGx1Z2luIGtlZXBzIGEgZHJhaW4tb24tcmVhZCBiYWNrbGluayBpbmRleCBhbmQgaW5kZXhlcyBjYW52YXMgbWV0YWRhdGEsIHNvIGEgY2FsbGVyIHRoYXQgY29tcGVuc2F0ZXMgZm9yIE9ic2lkaWFuJ3Mgb3duIGdhcHMgY2FuIHN0YW5kIGRvd24gd2hpbGUgb25lIGlzIHByZXNlbnQuIEJvdGggaWRzIGFyZSByZWNvZ25pemVkOyB7QGxpbmsgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEfSByZWNvcmRzIHdoZW4gdGhlIHJldGlyZWQgb25lIG1heSBiZSBkcm9wcGVkLlxuICpcbiAqIFRoaXMgcmVhZHMgdGhlIExPQURFRCBwbHVnaW4gaW5zdGFuY2UgcmF0aGVyIHRoYW4gYGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zYCwgZGVsaWJlcmF0ZWx5OiB0aGUgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgcGx1Z2luJ3MgcGF0Y2hlcyBhcmUgaW4gcGxhY2UgcmlnaHQgbm93LCBhbmQgdGhleSBhcmUgbm90IHVudGlsIGl0IGhhcyBsb2FkZWQuIFBsdWdpbnMgbG9hZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlciwgc28gY2FsbCB0aGlzIGZyb20gYSB1c2VyLWRyaXZlbiBwYXRoIHJhdGhlciB0aGFuIGZyb20gcGx1Z2luIGxvYWQgLSBzZWUgcnVsZSBMMjUgaW4gYEFHRU5UUy5tZGAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBiYWNrbGluayBjYWNoZSBwbHVnaW4gaXMgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4oYXBwOiBBcHApOiBib29sZWFuIHtcbiAgcmV0dXJuIGFwcC5wbHVnaW5zLmdldFBsdWdpbihBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsIHx8IGFwcC5wbHVnaW5zLmdldFBsdWdpbihCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9IChpLmUuIGl0IHdhcyBjb21wdXRlZCB3aXRoIGV4dGVybmFsLWxpbmtcbiAqIHBhcnNpbmcgZW5hYmxlZCkuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIGNhY2hlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjYWNoZSBpcyBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogY2FjaGUgaXMgQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIHJldHVybiAnZmVhdHVyZXMnIGluIGNhY2hlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShhcHA6IEFwcCwgJHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoJHN0cmluZykuYnVmZmVyO1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVNZXRhZGF0YUFzeW5jKGJ1ZmZlcikgPz8ge307XG4gIHJldHVybiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgoeyBjYWNoZSwgY29udGVudDogJHN0cmluZywgb3B0aW9ucyB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgZmlsZSBjYWNoZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShwYXJhbXM6IFJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF0gPSB7XG4gICAgaGFzaDogZmlsZS5wYXRoLFxuICAgIG10aW1lOiAwLFxuICAgIHNpemU6IDBcbiAgfTtcblxuICBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF0gPSBjYWNoZTtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwLCBmaWxlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZXMgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVzKGFwcDogQXBwLCBmaWxlczogVEFic3RyYWN0RmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHJlZ2lzdGVyZWRGaWxlc0NvdW50cyA9IGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpO1xuXG4gIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB3aGlsZSAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBsZXQgY291bnQgPSByZWdpc3RlcmVkRmlsZXNDb3VudHMuZ2V0KGZpbGUucGF0aCkgPz8gMDtcbiAgICAgIGNvdW50Kys7XG4gICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuc2V0KGZpbGUucGF0aCwgY291bnQpO1xuXG4gICAgICBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdID0gZmlsZTtcblxuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGZpbGUgPSBnZXRGb2xkZXIoe1xuICAgICAgICBhcHAsXG4gICAgICAgIHBhdGhPckZvbGRlcjogcGFyZW50Rm9sZGVyUGF0aChmaWxlLnBhdGgpLFxuICAgICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgdW5yZWdpc3RlckZpbGVzKGFwcCwgZmlsZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gdW5yZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIGV4aXN0aW5nJyk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbZmlsZS5wYXRoXTtcbn1cblxuLyoqXG4gKiBVbnJlZ2lzdGVycyBmaWxlcyBmcm9tIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdW5yZWdpc3Rlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IHZvaWQge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDE7XG4gICAgICBjb3VudC0tO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcbiAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuZGVsZXRlKGZpbGUucGF0aCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIGFwcC52YXVsdC5maWxlTWFwW2ZpbGUucGF0aF07XG5cbiAgICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAucmVtb3ZlKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpOiBBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkgfCBudWxsIHtcbiAgcmV0dXJuIGZpbmRQbHVnaW5BcGk8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPih7XG4gICAgYXBpVmVyc2lvblJhbmdlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UsXG4gICAgY29udHJhY3Q6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1QsXG4gICAgcGx1Z2luSWQ6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZWdpc3RlcmVkRmlsZXNDb3VudHMnLCBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsbHkgcmVjb2duaXplcyB0aGUgYmFja2xpbmtzIGRpY3Rpb25hcnkgYW5vdGhlciBwbHVnaW4ncyBjb3B5IGJ1aWx0LCBvciBgbnVsbGAuIFRoZSBjbGFzcyBpdCB3YXMgYnVpbHQgZnJvbSBsaXZlcyBpbiB0aGF0IGNvcHksIHNvIGBpbnN0YW5jZW9mYCBjYW5ub3QgYmUgdXNlZCAocnVsZSBMOSBpbiBgQUdFTlRTLm1kYCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIHJlYWRzIGFzIGEgYmFja2xpbmtzIGRpY3Rpb25hcnkuXG4gKi9cbmZ1bmN0aW9uIGlzTnVsbGFibGVCYWNrbGlua3NEaWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gfCBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsXG4gICAgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICYmIFJlZmxlY3QuZ2V0KHZhbHVlLCAnZGF0YScpIGluc3RhbmNlb2YgTWFwXG4gICAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdnZXQnKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAna2V5cycpID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHRlcm5hbEJvZHlMaW5rcyhjb250ZW50OiBzdHJpbmcsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IFBhcnNlTGlua1JlZmVyZW5jZVtdIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXJFbmRPZmZzZXQgPSBjYWNoZS5mcm9udG1hdHRlclBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDA7XG4gIHJldHVybiBwYXJzZUxpbmtzKGNvbnRlbnQpXG4gICAgLmZpbHRlcigocGFyc2VMaW5rUmVzdWx0KSA9PiBwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCAmJiBwYXJzZUxpbmtSZXN1bHQuc3RhcnRPZmZzZXQgPj0gZnJvbnRtYXR0ZXJFbmRPZmZzZXQpXG4gICAgLm1hcCgocGFyc2VMaW5rUmVzdWx0KSA9PiB0b1BhcnNlTGlua1JlZmVyZW5jZSh7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXJPck51bGwoY29udGVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZyb250bWF0dGVyIHBhcnNpbmcgZmFpbGVkIGluICR7cGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHBhcmFtczogVG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4UGFyYW1zKTogQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIGNvbnN0IHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW10gPSBbQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTmF0aXZlXTtcbiAgY29uc3QgcmVzdWx0OiBDYWNoZWRNZXRhZGF0YUV4ID0geyAuLi5jYWNoZSwgZmVhdHVyZXMgfTtcblxuICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZUV4dGVybmFsTGlua3MpIHtcbiAgICByZXN1bHQuZXh0ZXJuYWxMaW5rcyA9IHBhcnNlRXh0ZXJuYWxCb2R5TGlua3MoY29udGVudCwgY2FjaGUpO1xuICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRXh0ZXJuYWxMaW5rcyk7XG4gIH1cblxuICBpZiAoXG4gICAgb3B0aW9ucy5zaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIHx8IG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfHwgb3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzXG4gICkge1xuICAgIGNvbnN0IGZyb250bWF0dGVyTGlua3MgPSBwYXJzZUZyb250bWF0dGVyTGlua3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5mcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzKSB7XG4gICAgICByZXN1bHQubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFBQSxJQUNWLFVBQVU7QUFBQSxFQUNaLENBQUM7QUFDSDtBQUVBLFNBQVMsMkJBQWdEO0FBQ3ZELFNBQU8seUJBQXlCLHlCQUF5QixvQkFBSSxJQUFvQixDQUFDLEVBQUU7QUFDdEY7QUFRQSxTQUFTLHdCQUF3QixPQUE0RDtBQUMzRixTQUFPLFVBQVUsUUFDWCxPQUFPLFVBQVUsWUFDaEIsUUFBUSxJQUFJLE9BQU8sTUFBTSxhQUFhLE9BQ3RDLE9BQU8sUUFBUSxJQUFJLE9BQU8sS0FBSyxNQUFNLGNBQ3JDLE9BQU8sUUFBUSxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQy9DO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsT0FBNkM7QUFDNUYsUUFBTSx1QkFBdUIsTUFBTSxxQkFBcUIsSUFBSSxVQUFVO0FBQ3RFLFNBQU8sV0FBVyxPQUFPLEVBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsZ0JBQWdCLGNBQWMsZ0JBQWdCLGVBQWUsb0JBQW9CLEVBQzdHLElBQUksQ0FBQyxvQkFBb0IscUJBQXFCLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hGO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsTUFBbUQ7QUFDbEcsTUFBSTtBQUNGLFdBQU8saUJBQWlCLE9BQU87QUFBQSxFQUNqQyxTQUFTLE9BQU87QUFDZCxlQUFXLElBQUksTUFBTSxpQ0FBaUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUMvRSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyx5QkFBeUIsUUFBMEQ7QUFDMUYsUUFBTSxFQUFFLE9BQU8sU0FBUyxRQUFRLElBQUk7QUFDcEMsUUFBTSxXQUFzQyxDQUFDLHFCQUE4QjtBQUMzRSxRQUFNLFNBQTJCLEVBQUUsR0FBRyxPQUFPLFNBQVM7QUFFdEQsTUFBSSxRQUFRLDBCQUEwQjtBQUNwQyxXQUFPLGdCQUFnQix1QkFBdUIsU0FBUyxLQUFLO0FBQzVELGFBQVMsS0FBSyxtQ0FBcUM7QUFBQSxFQUNyRDtBQUVBLE1BQ0UsUUFBUSx1Q0FDTCxRQUFRLGlEQUNSLFFBQVEsdUNBQ1g7QUFDQSxVQUFNLG1CQUFtQixzQkFBc0IsTUFBTSxXQUFXO0FBRWhFLFFBQUksUUFBUSxxQ0FBcUM7QUFDL0MsYUFBTywyQkFBMkIsaUJBQWlCO0FBQ25ELGVBQVMsS0FBSyx5REFBZ0Q7QUFBQSxJQUNoRTtBQUVBLFFBQUksUUFBUSwrQ0FBK0M7QUFDekQsYUFBTyxxQ0FBcUMsaUJBQWlCO0FBQzdELGVBQVMsS0FBSyw2RUFBMEQ7QUFBQSxJQUMxRTtBQUVBLFFBQUksUUFBUSx1Q0FBdUM7QUFDakQsYUFBTyw2QkFBNkIsaUJBQWlCO0FBQ3JELGVBQVMsS0FBSyw2REFBa0Q7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwibmFtZXMiOlsiQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUiXX0=
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIEN1c3RvbUFycmF5RGljdEltcGwsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGUsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyxcbiAgUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5cbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlIH0gZnJvbSAnLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNGaWxlLFxuICBpc1BhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyTGlua3MsXG4gIHBhcnNlTGlua3MsXG4gIHRvUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQgeyBmaW5kUGx1Z2luQXBpIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgeyBzb3J0UmVmZXJlbmNlcyB9IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua1JlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2luZyBmZWF0dXJlcyB0aGF0IHdlcmUgYXBwbGllZCB3aGVuIGNvbXB1dGluZyB0aGlzIGNhY2hlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW107XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHlcbiAgICogd2hlbiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHkgd2hlblxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgdGltZW91dCBub3RpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMgZXh0ZW5kcyBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2V0Q2FjaGVTYWZlfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0Q2FjaGVTYWZlT3B0aW9ucyA9IFBhcnNlQ2FjaGVPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldExpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRMaW5rc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FjaGVkIG1ldGFkYXRhIHRvIHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVtYmVkcyAoYGNhY2hlLmVtYmVkc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFbWJlZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWVzLiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGZyb250bWF0dGVyIGxpbmtzIChgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsXG4gICAqIGkuZS4gdGhlIG9mZnNldC1jYXJyeWluZyBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcyAobmFycm93ZWQgdmlhXG4gICAqIHtAbGluayBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHN9KS4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlIGxpbmtzIChgY2FjaGUubGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlUmVmZXJlbmNlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHBhcnNpbmcgcGVyZm9ybWVkIGJ5IHtAbGluayBnZXRDYWNoZVNhZmV9IGFuZCB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gYmV5b25kIE9ic2lkaWFuJ3NcbiAqIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nLiBFYWNoIG9wdGlvbiBpcyBvcHQtaW47IGVuYWJsaW5nIGl0IGFkZHMgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZX0gYW5kIHBvcHVsYXRlcyB0aGUgbWF0Y2hpbmcgbGlua3MgYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VDYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGludGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTWV0YWRhdGFPcHRpb25zID0gUGFyc2VDYWNoZU9wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGNhY2hlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBwdWJsaXNoZWQgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkLFxuICogYmVjYXVzZSB0aGF0IHBsdWdpbiBpcyBub3QgYSBkZXBlbmRlbmN5IChydWxlIEw5IGluIGBBR0VOVFMubWRgKS4gSXRzIGBhcGkuZC50c2AgZGVjbGFyZXMgdGhlIHdob2xlIG9mIGl0LlxuICovXG5pbnRlcmZhY2UgQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHtcbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MsIG9yIGBudWxsYCB3aGlsZSB0aGUgcGx1Z2luJ3MgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGU6IChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKSA9PiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUgb25jZSB0aGUgcGVuZGluZyBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYmFja2xpbmtzLCBvciB0byBgbnVsbGAgd2hpbGUgdGhlIHBsdWdpbidzIGBCYWNrbGlua3NgXG4gICAqICAgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiAocGF0aE9yRmlsZTogUGF0aE9yRmlsZSkgPT4gUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw+O1xufVxuXG4vKipcbiAqIEEgc2VsZWN0b3IgZm9yIGEgZmVhdHVyZS1nYXRlZCBsaW5rIGNhdGVnb3J5IGluIHtAbGluayBnZXRMaW5rc30uXG4gKi9cbmludGVyZmFjZSBGZWF0dXJlTGlua1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmsgY2F0ZWdvcnksIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZSB0aGF0IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2FjaGUgZm9yIHRoaXMgY2F0ZWdvcnkgdG8gYmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmU7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmtzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gdGhlIGNhY2hlLlxuICAgKi9cbiAgc2VsZWN0OiAoY2FjaGU6IENhY2hlZE1ldGFkYXRhRXgpID0+IFJlZmVyZW5jZVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBjYXRlZ29yeS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4fS5cbiAqL1xuaW50ZXJmYWNlIFRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGxhaW4gY2FjaGVkIG1ldGFkYXRhIHRvIHdyYXAuXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIGNvbnRlbnQgdGhlIG9mZnNldHMgaW5kZXggaW50bywgdXNlZCBmb3IgYm9keSBleHRlcm5hbC1saW5rIHBhcnNpbmcuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGxpbmtzIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUGFyc2VDYWNoZU9wdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsdWdpbiBpZCBvZiB0aGUgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwbHVnaW4sIHRoZSBzdWNjZXNzb3IgdG8gYEJhY2tsaW5rIENhY2hlYC5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBoYXNCYWNrbGlua0NhY2hlUGx1Z2lufSwgYW5kIGFzIHRoZSBwcm92aWRlciBpZCB1bmRlciB3aGljaCB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aH0gYW5kIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0gbG9vayB1cCB0aGUgcGx1Z2luJ3MgcHVibGlzaGVkIEFQSS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRCA9ICdhZHZhbmNlZC1tZXRhZGF0YS1jYWNoZSc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHZlcnNpb25zIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY29tcGlsZWQgYWdhaW5zdC4gYDEuMy4wYCBpcyB0aGUgZmlyc3QgdG8gY2FycnkgdGhlIHR3byBiYWNrbGluayBtZXRob2RzLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UgPSAnXjEuMy4wJztcblxuLyoqXG4gKiBUaGUgc2NoZW1hcyBvZiBhIGJhY2tsaW5rIG1ldGhvZCdzIHBheWxvYWRzOiB0aGUgb25lIHBhdGgtb3ItZmlsZSBhcmd1bWVudCwgYW5kIHRoZSBiYWNrbGlua3Mgb3IgYG51bGxgLlxuICpcbiAqIEEgY29weSBvZiB0aGUgYGdldEJhY2tsaW5rc0ZvckZpbGVgIGFuZCBgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmVgIGVudHJpZXMgb2YgYEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0FQSV9DT05UUkFDVGAsIHdoaWNoIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgc2hpcHMgYXNcbiAqIGl0cyByb290IGBhcGktY29udHJhY3QudHNgIGFuZCBwdWJsaXNoZXMuIEtlZXAgdGhlIGd1YXJkcyBpbiBhZ3JlZW1lbnQgd2l0aCB0aGF0IGZpbGUsIHNvIHRoZSBwcm92aWRlciBhbmQgdGhpcyBjb25zdW1lciBjaGVjayBvbmUgZGVmaW5pdGlvbi5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVCA9IHtcbiAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGF0aE9yRmlsZTogUGF0aE9yRmlsZV0+KFt7IGV4cGVjdGVkOiAnYSBwYXRoIG9yIGEgZmlsZScsIHR5cGVHdWFyZDogaXNQYXRoT3JGaWxlIH1dKSxcbiAgb3V0cHV0OiBjcmVhdGVUeXBlR3VhcmRTY2hlbWEoeyBleHBlY3RlZDogJ2EgYmFja2xpbmtzIGRpY3Rpb25hcnkgb3IgbnVsbCcsIHR5cGVHdWFyZDogaXNOdWxsYWJsZUJhY2tsaW5rc0RpY3QgfSlcbn07XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IG9mIHRoZSBtZW1iZXJzIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY2FsbHMsIHNvIGEgcmVjb3JkIHRoYXQgbGFja3MgZWl0aGVyIGlzIHBhc3NlZCBvdmVyLCBhbmQgYSBwYXlsb2FkIHRoYXQgYnJlYWtzIGl0cyBzaWduYXR1cmUgaXMgcmVwb3J0ZWQgd2hpbGUgdGhlIGBvYnNpZGlhbi1saWI6dmFsaWRhdGUtcGx1Z2luLWFwaS1wYXlsb2Fkc2AgZGVidWcgc3dpdGNoIGlzIG9uLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX0NPTlRSQUNUOiBBcGlDb250cmFjdDxBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGk+ID0ge1xuICBnZXRCYWNrbGlua3NGb3JGaWxlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNULFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVFxufTtcblxuLyoqXG4gKiBUaGUgcGx1Z2luIGlkIG9mIHRoZSByZXRpcmVkIGBCYWNrbGluayBDYWNoZWAgcGx1Z2luLCBzdXBlcnNlZGVkIGJ5IHtAbGluayBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUR9LlxuICpcbiAqIFN0aWxsIHJlY29nbml6ZWQgYnkge0BsaW5rIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW59LCBkZWxpYmVyYXRlbHkuIFJlbW92aW5nIGEgcGx1Z2luIGZyb20gdGhlIGNvbW11bml0eSByZWdpc3RyeSBibG9ja3MgbmV3IGluc3RhbGxzOyBpdCB1bmluc3RhbGxzIG5vdGhpbmcsIHNvIGV2ZXJ5IGV4aXN0aW5nIHVzZXIga2VlcHMgaXQgdW50aWwgdGhleSBtaWdyYXRlIGJ5IGhhbmQuXG4gKlxuICogSXQgbWF5IGJlIGRyb3BwZWQgd2hlbiBhbGwgdGhyZWUgb2YgdGhlIGZvbGxvd2luZyBob2xkLCBhbmQgbm90IGJlZm9yZTogYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBpcyBsaXN0ZWQgaW4gdGhlIGNvbW11bml0eSByZWdpc3RyeSwgc28gbWlncmF0aW5nIGlzIHBvc3NpYmxlIGF0IGFsbDsgdGhlIGZpbmFsIGBCYWNrbGluayBDYWNoZWAgaGFuZG92ZXIgcmVsZWFzZSBoYXMgYmVlbiBvdXQgZm9yIGF0IGxlYXN0IHR3ZWx2ZSBtb250aHM7IGFuZCB0aGlzIGxpYnJhcnkgaXMgY3V0dGluZyBhIG1ham9yIHJlbGVhc2UgYW55d2F5LCBiZWNhdXNlIGRyb3BwaW5nIHRoZSBpZCBzaWxlbnRseSB1bi1nYXRlcyBjYW52YXMgbGluayBoYW5kbGluZyBmb3IgYW55b25lIHdobyBoYXMgbm90IG1pZ3JhdGVkLiBUaGVyZSBpcyBubyBjb3N0IHByZXNzdXJlIHRvIGRyb3AgaXQgZWFybGllciAtIHJlY29nbml6aW5nIGEgZGVhZCBpZCBpcyBvbmUgc3RyaW5nIGNvbXBhcmlzb24gb24gYSBwYXRoIHRoYXQgYWxyZWFkeSByZWFkcyBhIHBsdWdpbiByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJBQ0tMSU5LX0NBQ0hFX1BMVUdJTl9JRCA9ICdiYWNrbGluay1jYWNoZSc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeSBmb3IgYWxsIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uQ2xlYW5DYWNoZShyZXNvbHZlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICogTk9URTogVGhlIGZpbGUgbWF5IGJlIG5vbi1leGlzdGVudC5cbiAqXG4gKiBXaGVuIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcHVibGlzaGVzIGl0cyBiYWNrbGlua3MgQVBJIGFuZCBpdHMgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9uLCBpdHMgY2FjaGUgYW5zd2Vycy5cbiAqIE90aGVyd2lzZSB0aGUgYW5zd2VyIGNvbWVzIGZyb20gYSBiYWNrbGluayBpbmRleCB3aG9zZSBjb3N0IGlzIHByb3BvcnRpb25hbCB0byB0aGUgY2FuZGlkYXRlIG5vdGVzIHJhdGhlciB0aGFuXG4gKiB0byBldmVyeSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0LCBhbmQgd2hpY2ggZ2l2ZXMgdGhlIHNhbWUgcmVmZXJlbmNlcyBPYnNpZGlhbidzIG93biBgZ2V0QmFja2xpbmtzRm9yRmlsZWAgZ2l2ZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW2ZpbGVdKTtcbiAgcmV0dXJuIGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKT8uZ2V0QmFja2xpbmtzRm9yRmlsZShmaWxlKSA/PyBnZXRJbmRleGVkQmFja2xpbmtzRm9yRmlsZShhcHAsIGZpbGUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICpcbiAqIFdoZW4gYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwdWJsaXNoZXMgaXRzIGJhY2tsaW5rcyBBUEkgYW5kIGl0cyBgQmFja2xpbmtzYCBtb2R1bGUgaXMgb24sIHRoYXQgQVBJIGFuc3dlcnMuXG4gKlxuICogT3RoZXJ3aXNlIHRoaXMgaXMgTk9UIGEgcHVyZSByZWFkLiBJdCB2ZXJpZmllc1xuICogZWFjaCBiYWNrbGluayBhZ2FpbnN0IHRoZSBub3RlJ3MgY3VycmVudCB0ZXh0LCBhbmQgdG8gZG8gdGhhdCBpdCBjYWxscyB7QGxpbmsgc2F2ZU5vdGV9IG9uIGV2ZXJ5XG4gKiBub3RlIHRoYXQgbGlua3MgdG8gdGhlIGZpbGUsIHdoaWNoIHNhdmVzIGFueSBvcGVuIGVkaXRvciB2aWV3IG9mIHRob3NlIG5vdGVzIHRoYXQgaGFzIHVuc2F2ZWRcbiAqIGNoYW5nZXMuIENhbGwgaXQgZnJvbSBhbiBleHBsaWNpdCB1c2VyIGFjdGlvbi4gRG8gbm90IGNhbGwgaXQgZnJvbSBhbiBhdXRvbWF0aWMgdHJpZ2dlciAoYSB2YXVsdCBvclxuICogbWV0YWRhdGEgZXZlbnQsIGEgc2F2ZSBvciByZW5kZXIgcGF0Y2gpIHRoYXQgb25seSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0LiBUaGVyZSwgYSBmb3JjZWQgc2F2ZSBjYW5cbiAqIHJhY2UgYW5vdGhlciBwbHVnaW4ncyBpbi1mbGlnaHQgZWRpdG9yIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgZGljdGlvbmFyeSBvZiBiYWNrbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShwYXJhbXM6IEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlUGFyYW1zKTogUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPj4ge1xuICBjb25zdCB7IGFwcCwgcGF0aE9yRmlsZSwgLi4ub3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBjYWNoZWRCYWNrbGlua3MgPSBhd2FpdCBmaW5kQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpKCk/LmdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHBhdGhPckZpbGUpO1xuICBpZiAoY2FjaGVkQmFja2xpbmtzKSB7XG4gICAgcmV0dXJuIGNhY2hlZEJhY2tsaW5rcztcbiAgfVxuXG4gIGxldCBiYWNrbGlua3M6IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+ID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuICBhd2FpdCByZXRyeVdpdGhUaW1lb3V0Tm90aWNlKHtcbiAgICBhc3luYyBvcGVyYXRpb25GdW5jdGlvbihhYm9ydFNpZ25hbCkge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgYmFja2xpbmtzID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHAsIGZpbGUpO1xuICAgICAgZm9yIChjb25zdCBub3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IG5vdGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBub3RlUGF0aCB9KTtcbiAgICAgICAgaWYgKCFub3RlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBjYW52YXMgaG9sZGVyIGNhbm5vdCBiZSBjaGVja2VkIGFnYWluc3QgaXRzIHRleHQuIEl0cyBmaWxlLW5vZGUgcmVmZXJlbmNlcyBjYXJyeSBubyBwb3NpdGlvbiwgYW5kXG4gICAgICAgIC8vIE9ic2lkaWFuIHJlcG9ydHMgYSB0ZXh0LW5vZGUgZW1iZWQgd2l0aCBhIHBvc2l0aW9uIGludG8gdGhhdCBub2RlJ3Mgb3duIHRleHQsIG5vdCBpbnRvIHRoZSBjYW52YXMgSlNPTixcbiAgICAgICAgLy8gc28gc2xpY2luZyB0aGUgZmlsZSBhdCBpdCBuZXZlciBnaXZlcyB0aGUgbGluayBiYWNrIGFuZCB0aGUgcmV0cnkgd291bGQgbmV2ZXIgZW5kLlxuICAgICAgICBpZiAoaXNDYW52YXNGaWxlKG5vdGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlua3MgPSBiYWNrbGlua3MuZ2V0KG5vdGVQYXRoKTtcbiAgICAgICAgaWYgKCFsaW5rcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlZCBvbmx5IHdoZW4gYSBmcm9udG1hdHRlciBsaW5rIG5lZWRzIGl0OiBhIG5vdGUgd2hvc2UgWUFNTCBkb2VzIG5vdCBwYXJzZSBzdGlsbCBob2xkcyBib2R5IGxpbmtzLFxuICAgICAgICAvLyBhbmQgYG51bGxgIG1hcmtzIGEgcGFyc2UgdGhhdCBmYWlsZWQsIHNvIGl0cyBmcm9udG1hdHRlciBsaW5rcyBhcmUgc2tpcHBlZCByYXRoZXIgdGhhbiByZXRyaWVkIGZvcmV2ZXIuXG4gICAgICAgIGxldCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGxldCBhY3R1YWxMaW5rOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUobGluaykpIHtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBjb250ZW50LnNsaWNlKGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSkge1xuICAgICAgICAgICAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyT3JOdWxsKGNvbnRlbnQsIG5vdGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9udG1hdHRlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBsaW5rLmtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlua1dpdGhPZmZzZXRzID0gdG9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspO1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IHByb3BlcnR5VmFsdWUuc2xpY2UobGlua1dpdGhPZmZzZXRzLnN0YXJ0T2Zmc2V0LCBsaW5rV2l0aE9mZnNldHMuZW5kT2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3R1YWxMaW5rICE9PSBsaW5rLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGgsIHsgZmlsZVBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmV0cnlPcHRpb25zOiBvcHRpb25zLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiBvcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlID8/IHRydWVcbiAgfSk7XG5cbiAgcmV0dXJuIGJhY2tsaW5rcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgYSBnaXZlbiBmaWxlIG9yIHBhdGguXG4gKlxuICogVGhpcyBpcyBOT1QgYSBwdXJlIHJlYWQ6IGJlZm9yZSBpdCByZWFkcyB0aGUgY2FjaGUsIGl0IGNhbGxzIHtAbGluayBzYXZlTm90ZX0sIHdoaWNoIHNhdmVzIGFueVxuICogb3BlbiBlZGl0b3IgdmlldyBvZiB0aGUgbm90ZSB0aGF0IGhhcyB1bnNhdmVkIGNoYW5nZXMuIFRoYXQgc2F2ZSBpcyB3aHkgdGhlIGNhY2hlIG1hdGNoZXMgd2hhdCB0aGVcbiAqIHVzZXIgc2VlcywgYW5kIHdoeSBhIGNvbW1hbmQgdGhhdCByZXdyaXRlcyB0aGUgbm90ZSBjYW4gdXNlIHRoaXMgc2FmZWx5IHdpdGhvdXQgaXRzIHJld3JpdGUgYmVpbmdcbiAqIGNsb2JiZXJlZC4gSXQgaXMgYWxzbyBhIHdyaXRlIG9uIHRoZSBub3RlLiBTbyBkbyBub3QgY2FsbCB0aGlzIGZyb20gYW4gYXV0b21hdGljIHRyaWdnZXIgKGEgdmF1bHRcbiAqIG9yIG1ldGFkYXRhIGV2ZW50LCBhIHNhdmUgb3IgcmVuZGVyIHBhdGNoLCBhIGxheW91dCBob29rKSB0aGF0IG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvIGFjdDogYVxuICogZm9yY2VkIHNhdmUgb25lIHRpY2sgYWZ0ZXIgYW5vdGhlciBwbHVnaW4gaGFzIGRpc3BhdGNoZWQgYSBjaGFuZ2UgaW50byB0aGUgZWRpdG9yIGNhbiBsZWF2ZVxuICogT2JzaWRpYW4ncyBlZGl0b3IgcmVuZGVyaW5nIHN0YWxlIHN0YXRlLiBBIHJlYWQtb25seSBwcm9iZSBvbiB0aGUgbm90ZSdzIGN1cnJlbnQgdGV4dCBzaG91bGQgdXNlXG4gKiB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gb24gdGhhdCB0ZXh0IGluc3RlYWQuIEl0IG5lZWRzIG5vIHZpZXcsIG5vIGNhY2hlIGFuZCBubyBzYXZlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVPclBhdGggLSBUaGUgZmlsZSBvciBwYXRoIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZVNhZmUoYXBwOiBBcHAsIGZpbGVPclBhdGg6IFBhdGhPckZpbGUsIG9wdGlvbnM6IEdldENhY2hlU2FmZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkTWV0YWRhdGFFeCB8IG51bGw+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGZpbGVPclBhdGggfSk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICAgIGlmIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIGZpbGUpO1xuXG4gICAgICBjb25zdCBmaWxlQ2FjaGVFbnRyeSA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAgICAgY29uc3QgaXNVcFRvRGF0ZSA9IGZpbGVDYWNoZUVudHJ5Py5tdGltZSA9PT0gZmlsZS5zdGF0Lm10aW1lXG4gICAgICAgICYmIGZpbGVDYWNoZUVudHJ5LnNpemUgPT09IGZpbGUuc3RhdC5zaXplXG4gICAgICAgICYmIE9iamVjdC5oYXNPd24oYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZSwgZmlsZUNhY2hlRW50cnkuaGFzaCk7XG4gICAgICBpZiAoIWlzVXBUb0RhdGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZUZpbGVNZXRhZGF0YUFzeW5jKGZpbGUpO1xuICAgICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIH1cbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH1cblxuICAgIGlmIChjYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gT25seSB0aGUgYm9keS1leHRlcm5hbCBwYXJzZSBuZWVkcyB0aGUgZmlsZSBjb250ZW50OyBmcm9udG1hdHRlciBwYXJzaW5nIHVzZXMgdGhlIGNhY2hlZFxuICAgIC8vIGZyb250bWF0dGVyLCBzbyBhdm9pZCByZWFkaW5nIHRoZSBjb250ZW50IHVubGVzcyBpdCBpcyBhY3R1YWxseSBuZWVkZWQuXG4gICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMuc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiAnJztcbiAgICByZXR1cm4gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZyb250IG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSBzYWZlbHkuXG4gKlxuICogSXQgcmVhZHMgdGhyb3VnaCB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSwgc28gaXQgc2F2ZXMgYW55IG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhlIG5vdGUgdGhhdCBoYXNcbiAqIHVuc2F2ZWQgY2hhbmdlcy4gU2VlIHtAbGluayBnZXRDYWNoZVNhZmV9IGZvciB3aGVuIHRoYXQgc2F2ZSBtYXR0ZXJzIGFuZCB3aGF0IHRvIHVzZSBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiBjdXN0b20gZnJvbnQgbWF0dGVyLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZyb250IG1hdHRlciBmcm9tLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGZyb250IG1hdHRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZyb250bWF0dGVyU2FmZTxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPj4ge1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICByZXR1cm4gKGNhY2hlPy5mcm9udG1hdHRlciA/PyB7fSkgYXMgQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzZWxlY3RlZCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlcyByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua3MocGFyYW1zOiBHZXRMaW5rc1BhcmFtcyk6IFJlZmVyZW5jZVtdIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIHNob3VsZEluY2x1ZGVFbWJlZHMgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID0gdHJ1ZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCBsaW5rczogUmVmZXJlbmNlW10gPSBbXG4gICAgLi4uKHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID8gY2FjaGUubGlua3MgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVFbWJlZHMgPyBjYWNoZS5lbWJlZHMgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID8gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/PyBbXSA6IFtdKVxuICBdO1xuXG4gIGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3JzOiBGZWF0dXJlTGlua1NlbGVjdG9yW10gPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdib2R5IGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnbXVsdGktdmFsdWUgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICAgIH1cbiAgXTtcblxuICBmb3IgKGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3Igb2YgZmVhdHVyZUxpbmtTZWxlY3RvcnMpIHtcbiAgICBpZiAoIWZlYXR1cmVMaW5rU2VsZWN0b3Iuc2hvdWxkSW5jbHVkZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGUpIHx8ICFjYWNoZS5mZWF0dXJlcy5pbmNsdWRlcyhmZWF0dXJlTGlua1NlbGVjdG9yLmZlYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmNsdWRlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5kZXNjcmlwdGlvbn06IHRoZSBjYWNoZSB3YXMgbm90IGNvbXB1dGVkIHdpdGggdGhlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlfSBmZWF0dXJlLmApO1xuICAgIH1cblxuICAgIGxpbmtzLnB1c2goLi4uZW5zdXJlTm9uTnVsbGFibGUoZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKSk7XG4gIH1cblxuICBzb3J0UmVmZXJlbmNlcyhsaW5rcyk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMaW5rID0gZW5zdXJlTm9uTnVsbGFibGUobGlua3NbaW5kZXggLSAxXSk7XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSAmJiBpc1JlZmVyZW5jZUNhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIHJldHVybiBsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAhPT0gcHJldmlvdXNMaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSA/IGxpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgY29uc3QgcHJldmlvdXNMaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKSA/IHByZXZpb3VzTGluay5zdGFydE9mZnNldCA6IDA7XG4gICAgICByZXR1cm4gbGluay5rZXkgIT09IHByZXZpb3VzTGluay5rZXkgfHwgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspICE9PSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKVxuICAgICAgICB8fCBsaW5rU3RhcnRPZmZzZXQgIT09IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgYmFja2xpbmsgY2FjaGUgcGx1Z2luIGlzIGN1cnJlbnRseSBsb2FkZWQgLSBlaXRoZXIgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCAoe0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0pIG9yIGl0cyByZXRpcmVkIHByZWRlY2Vzc29yIGBCYWNrbGluayBDYWNoZWAgKHtAbGluayBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUR9KS5cbiAqXG4gKiBTdWNoIGEgcGx1Z2luIGtlZXBzIGEgZHJhaW4tb24tcmVhZCBiYWNrbGluayBpbmRleCBhbmQgaW5kZXhlcyBjYW52YXMgbWV0YWRhdGEsIHNvIGEgY2FsbGVyIHRoYXQgY29tcGVuc2F0ZXMgZm9yIE9ic2lkaWFuJ3Mgb3duIGdhcHMgY2FuIHN0YW5kIGRvd24gd2hpbGUgb25lIGlzIHByZXNlbnQuIEJvdGggaWRzIGFyZSByZWNvZ25pemVkOyB7QGxpbmsgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEfSByZWNvcmRzIHdoZW4gdGhlIHJldGlyZWQgb25lIG1heSBiZSBkcm9wcGVkLlxuICpcbiAqIFRoaXMgcmVhZHMgdGhlIExPQURFRCBwbHVnaW4gaW5zdGFuY2UgcmF0aGVyIHRoYW4gYGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zYCwgZGVsaWJlcmF0ZWx5OiB0aGUgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgcGx1Z2luJ3MgcGF0Y2hlcyBhcmUgaW4gcGxhY2UgcmlnaHQgbm93LCBhbmQgdGhleSBhcmUgbm90IHVudGlsIGl0IGhhcyBsb2FkZWQuIFBsdWdpbnMgbG9hZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlciwgc28gY2FsbCB0aGlzIGZyb20gYSB1c2VyLWRyaXZlbiBwYXRoIHJhdGhlciB0aGFuIGZyb20gcGx1Z2luIGxvYWQgLSBzZWUgcnVsZSBMMjUgaW4gYEFHRU5UUy5tZGAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBiYWNrbGluayBjYWNoZSBwbHVnaW4gaXMgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4oYXBwOiBBcHApOiBib29sZWFuIHtcbiAgcmV0dXJuIGFwcC5wbHVnaW5zLmdldFBsdWdpbihBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsIHx8IGFwcC5wbHVnaW5zLmdldFBsdWdpbihCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9IChpLmUuIGl0IHdhcyBjb21wdXRlZCB3aXRoIGV4dGVybmFsLWxpbmtcbiAqIHBhcnNpbmcgZW5hYmxlZCkuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIGNhY2hlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjYWNoZSBpcyBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogY2FjaGUgaXMgQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIHJldHVybiAnZmVhdHVyZXMnIGluIGNhY2hlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShhcHA6IEFwcCwgJHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoJHN0cmluZykuYnVmZmVyO1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVNZXRhZGF0YUFzeW5jKGJ1ZmZlcikgPz8ge307XG4gIHJldHVybiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgoeyBjYWNoZSwgY29udGVudDogJHN0cmluZywgb3B0aW9ucyB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgZmlsZSBjYWNoZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShwYXJhbXM6IFJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF0gPSB7XG4gICAgaGFzaDogZmlsZS5wYXRoLFxuICAgIG10aW1lOiAwLFxuICAgIHNpemU6IDBcbiAgfTtcblxuICBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF0gPSBjYWNoZTtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwLCBmaWxlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZXMgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVzKGFwcDogQXBwLCBmaWxlczogVEFic3RyYWN0RmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHJlZ2lzdGVyZWRGaWxlc0NvdW50cyA9IGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpO1xuXG4gIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB3aGlsZSAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBsZXQgY291bnQgPSByZWdpc3RlcmVkRmlsZXNDb3VudHMuZ2V0KGZpbGUucGF0aCkgPz8gMDtcbiAgICAgIGNvdW50Kys7XG4gICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuc2V0KGZpbGUucGF0aCwgY291bnQpO1xuXG4gICAgICBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdID0gZmlsZTtcblxuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGZpbGUgPSBnZXRGb2xkZXIoe1xuICAgICAgICBhcHAsXG4gICAgICAgIHBhdGhPckZvbGRlcjogcGFyZW50Rm9sZGVyUGF0aChmaWxlLnBhdGgpLFxuICAgICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgdW5yZWdpc3RlckZpbGVzKGFwcCwgZmlsZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gdW5yZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIGV4aXN0aW5nJyk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbZmlsZS5wYXRoXTtcbn1cblxuLyoqXG4gKiBVbnJlZ2lzdGVycyBmaWxlcyBmcm9tIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdW5yZWdpc3Rlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IHZvaWQge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDE7XG4gICAgICBjb3VudC0tO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcbiAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuZGVsZXRlKGZpbGUucGF0aCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIGFwcC52YXVsdC5maWxlTWFwW2ZpbGUucGF0aF07XG5cbiAgICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAucmVtb3ZlKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpOiBBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkgfCBudWxsIHtcbiAgcmV0dXJuIGZpbmRQbHVnaW5BcGk8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPih7XG4gICAgYXBpVmVyc2lvblJhbmdlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UsXG4gICAgY29udHJhY3Q6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1QsXG4gICAgcGx1Z2luSWQ6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZWdpc3RlcmVkRmlsZXNDb3VudHMnLCBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsbHkgcmVjb2duaXplcyB0aGUgYmFja2xpbmtzIGRpY3Rpb25hcnkgYW5vdGhlciBwbHVnaW4ncyBjb3B5IGJ1aWx0LCBvciBgbnVsbGAuIFRoZSBjbGFzcyBpdCB3YXMgYnVpbHQgZnJvbSBsaXZlcyBpbiB0aGF0IGNvcHksIHNvIGBpbnN0YW5jZW9mYCBjYW5ub3QgYmUgdXNlZCAocnVsZSBMOSBpbiBgQUdFTlRTLm1kYCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIHJlYWRzIGFzIGEgYmFja2xpbmtzIGRpY3Rpb25hcnkuXG4gKi9cbmZ1bmN0aW9uIGlzTnVsbGFibGVCYWNrbGlua3NEaWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gfCBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsXG4gICAgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICYmIFJlZmxlY3QuZ2V0KHZhbHVlLCAnZGF0YScpIGluc3RhbmNlb2YgTWFwXG4gICAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdnZXQnKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAna2V5cycpID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHRlcm5hbEJvZHlMaW5rcyhjb250ZW50OiBzdHJpbmcsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IFBhcnNlTGlua1JlZmVyZW5jZVtdIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXJFbmRPZmZzZXQgPSBjYWNoZS5mcm9udG1hdHRlclBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDA7XG4gIHJldHVybiBwYXJzZUxpbmtzKGNvbnRlbnQpXG4gICAgLmZpbHRlcigocGFyc2VMaW5rUmVzdWx0KSA9PiBwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCAmJiBwYXJzZUxpbmtSZXN1bHQuc3RhcnRPZmZzZXQgPj0gZnJvbnRtYXR0ZXJFbmRPZmZzZXQpXG4gICAgLm1hcCgocGFyc2VMaW5rUmVzdWx0KSA9PiB0b1BhcnNlTGlua1JlZmVyZW5jZSh7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXJPck51bGwoY29udGVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZyb250bWF0dGVyIHBhcnNpbmcgZmFpbGVkIGluICR7cGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHBhcmFtczogVG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4UGFyYW1zKTogQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIGNvbnN0IHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW10gPSBbQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTmF0aXZlXTtcbiAgY29uc3QgcmVzdWx0OiBDYWNoZWRNZXRhZGF0YUV4ID0geyAuLi5jYWNoZSwgZmVhdHVyZXMgfTtcblxuICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZUV4dGVybmFsTGlua3MpIHtcbiAgICByZXN1bHQuZXh0ZXJuYWxMaW5rcyA9IHBhcnNlRXh0ZXJuYWxCb2R5TGlua3MoY29udGVudCwgY2FjaGUpO1xuICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRXh0ZXJuYWxMaW5rcyk7XG4gIH1cblxuICBpZiAoXG4gICAgb3B0aW9ucy5zaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIHx8IG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfHwgb3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzXG4gICkge1xuICAgIGNvbnN0IGZyb250bWF0dGVyTGlua3MgPSBwYXJzZUZyb250bWF0dGVyTGlua3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5mcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzKSB7XG4gICAgICByZXN1bHQubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBVVAsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxrQ0FBa0M7QUFDM0M7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsc0JBQXNCO0FBQy9CO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS0EsSUFBSywwQkFBTCxrQkFBS0EsNkJBQUw7QUFJTCxFQUFBQSx5QkFBQSxtQkFBZ0I7QUFLaEIsRUFBQUEseUJBQUEsOEJBQTJCO0FBSzNCLEVBQUFBLHlCQUFBLHdDQUFxQztBQUtyQyxFQUFBQSx5QkFBQSxnQ0FBNkI7QUFLN0IsRUFBQUEseUJBQUEsWUFBUztBQXhCQyxTQUFBQTtBQUFBLEdBQUE7QUFvU0wsTUFBTSxvQ0FBb0M7QUFLakQsTUFBTSxzREFBc0Q7QUFRNUQsTUFBTSxvREFBb0Q7QUFBQSxFQUN4RCxPQUFPLHNCQUFnRCxDQUFDLEVBQUUsVUFBVSxvQkFBb0IsV0FBVyxhQUFhLENBQUMsQ0FBQztBQUFBLEVBQ2xILFFBQVEsc0JBQXNCLEVBQUUsVUFBVSxrQ0FBa0MsV0FBVyx3QkFBd0IsQ0FBQztBQUNsSDtBQUtBLE1BQU0saURBQWlHO0FBQUEsRUFDckcscUJBQXFCO0FBQUEsRUFDckIseUJBQXlCO0FBQzNCO0FBU08sTUFBTSwyQkFBMkI7QUFReEMsZUFBc0IseUJBQXlCLEtBQXlCO0FBQ3RFLFFBQU0sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM3QixRQUFJLGNBQWMsYUFBYSxPQUFPO0FBQUEsRUFDeEMsQ0FBQztBQUNIO0FBY08sU0FBUywwQkFBMEIsS0FBVSxZQUFvRDtBQUV0RztBQUFBO0FBREEsVUFBTSxPQUFPLFFBQVEsRUFBRSxLQUFLLFlBQVksMEJBQTBCLEtBQUssQ0FBQztBQUN4RSxVQUFNLGdCQUFnQiw4QkFBYyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQy9DLFdBQU8sc0NBQXNDLEdBQUcsb0JBQW9CLElBQUksS0FBSywyQkFBMkIsS0FBSyxJQUFJO0FBQUEsV0FEakg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVGO0FBaUJBLGVBQXNCLHdCQUF3QixRQUE0RTtBQUN4SCxRQUFNLEVBQUUsS0FBSyxZQUFZLEdBQUcsUUFBUSxJQUFJO0FBQ3hDLFFBQU0sa0JBQWtCLE1BQU0sc0NBQXNDLEdBQUcsd0JBQXdCLFVBQVU7QUFDekcsTUFBSSxpQkFBaUI7QUFDbkIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFlBQXdDLElBQUksb0JBQStCO0FBQy9FLFFBQU0sdUJBQXVCO0FBQUEsSUFDM0IsTUFBTSxrQkFBa0IsYUFBYTtBQUNuQyxrQkFBWSxlQUFlO0FBQzNCLFlBQU0sT0FBTyxRQUFRLEVBQUUsS0FBSyxXQUFXLENBQUM7QUFDeEMsWUFBTSx5QkFBeUIsR0FBRztBQUNsQyxrQkFBWSxlQUFlO0FBQzNCLGtCQUFZLDBCQUEwQixLQUFLLElBQUk7QUFDL0MsaUJBQVcsWUFBWSxVQUFVLEtBQUssR0FBRztBQUN2QyxvQkFBWSxlQUFlO0FBQzNCLGNBQU0sT0FBTyxjQUFjLEVBQUUsS0FBSyxZQUFZLFNBQVMsQ0FBQztBQUN4RCxZQUFJLENBQUMsTUFBTTtBQUNULGlCQUFPO0FBQUEsUUFDVDtBQUtBLFlBQUksYUFBYSxJQUFJLEdBQUc7QUFDdEI7QUFBQSxRQUNGO0FBRUEsY0FBTSxTQUFTLEtBQUssSUFBSTtBQUN4QixvQkFBWSxlQUFlO0FBRTNCLGNBQU0sVUFBVSxNQUFNLFNBQVMsS0FBSyxJQUFJO0FBQ3hDLG9CQUFZLGVBQWU7QUFDM0IsWUFBSSxDQUFDLFNBQVM7QUFDWixpQkFBTztBQUFBLFFBQ1Q7QUFDQSxjQUFNLFFBQVEsVUFBVSxJQUFJLFFBQVE7QUFDcEMsWUFBSSxDQUFDLE9BQU87QUFDVixpQkFBTztBQUFBLFFBQ1Q7QUFJQSxZQUFJO0FBQ0osbUJBQVcsUUFBUSxPQUFPO0FBQ3hCLGNBQUk7QUFDSixjQUFJLGlCQUFpQixJQUFJLEdBQUc7QUFDMUIseUJBQWEsUUFBUSxNQUFNLEtBQUssU0FBUyxNQUFNLFFBQVEsS0FBSyxTQUFTLElBQUksTUFBTTtBQUFBLFVBQ2pGLFdBQVcsdUJBQXVCLElBQUksR0FBRztBQUN2QyxnQkFBSSxnQkFBZ0IsUUFBVztBQUM3Qiw0QkFBYyx1QkFBdUIsU0FBUyxRQUFRO0FBQUEsWUFDeEQ7QUFDQSxnQkFBSSxnQkFBZ0IsTUFBTTtBQUN4QjtBQUFBLFlBQ0Y7QUFDQSxrQkFBTSxnQkFBZ0IsdUJBQXVCLGFBQWEsS0FBSyxHQUFHO0FBQ2xFLGdCQUFJLE9BQU8sa0JBQWtCLFVBQVU7QUFDckMscUJBQU87QUFBQSxZQUNUO0FBRUEsa0JBQU0sa0JBQWtCLGtDQUFrQyxJQUFJO0FBQzlELHlCQUFhLGNBQWMsTUFBTSxnQkFBZ0IsYUFBYSxnQkFBZ0IsU0FBUztBQUFBLFVBQ3pGLE9BQU87QUFDTDtBQUFBLFVBQ0Y7QUFDQSxjQUFJLGVBQWUsS0FBSyxVQUFVO0FBQ2hDLG1CQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsY0FBYyx5QkFBeUIsRUFBRSxVQUFVLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztBQUFBLElBQ3hILHVCQUF1QjtBQUFBLElBQ3ZCLGNBQWM7QUFBQSxJQUNkLHlCQUF5QixRQUFRLDJCQUEyQjtBQUFBLEVBQzlELENBQUM7QUFFRCxTQUFPO0FBQ1Q7QUFtQkEsZUFBc0IsYUFBYSxLQUFVLFlBQXdCLFVBQStCLENBQUMsR0FBcUM7QUFDeEksUUFBTSxPQUFPLGNBQWMsRUFBRSxLQUFLLFlBQVksV0FBVyxDQUFDO0FBRTFELE1BQUk7QUFDRixRQUFJLENBQUMsTUFBTTtBQUNULGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSTtBQUNKLFFBQUksS0FBSyxTQUFTO0FBQ2hCLGNBQVEsSUFBSSxjQUFjLGFBQWEsSUFBSTtBQUFBLElBQzdDLE9BQU87QUFDTCxZQUFNLFNBQVMsS0FBSyxJQUFJO0FBRXhCLFlBQU0saUJBQWlCLElBQUksY0FBYyxVQUFVLEtBQUssSUFBSTtBQUM1RCxZQUFNLGFBQWEsZ0JBQWdCLFVBQVUsS0FBSyxLQUFLLFNBQ2xELGVBQWUsU0FBUyxLQUFLLEtBQUssUUFDbEMsT0FBTyxPQUFPLElBQUksY0FBYyxlQUFlLGVBQWUsSUFBSTtBQUN2RSxVQUFJLENBQUMsWUFBWTtBQUNmLGNBQU0sSUFBSSxjQUFjLHlCQUF5QixJQUFJO0FBQ3JELGNBQU0seUJBQXlCLEdBQUc7QUFBQSxNQUNwQztBQUNBLGNBQVEsSUFBSSxjQUFjLGFBQWEsSUFBSTtBQUFBLElBQzdDO0FBRUEsUUFBSSxVQUFVLE1BQU07QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFJQSxVQUFNLFVBQVUsUUFBUSwyQkFBMkIsTUFBTSxJQUFJLE1BQU0sV0FBVyxJQUFJLElBQUk7QUFDdEYsV0FBTyx5QkFBeUIsRUFBRSxPQUFPLFNBQVMsUUFBUSxDQUFDO0FBQUEsRUFDN0QsU0FBUyxPQUFPO0FBQ2QsUUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTO0FBQ3pCLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTTtBQUFBLEVBQ1I7QUFDRjtBQWFBLGVBQXNCLG1CQUFnRCxLQUFVLFlBQXlFO0FBQ3ZKLFFBQU0sUUFBUSxNQUFNLGFBQWEsS0FBSyxVQUFVO0FBQ2hELFNBQVEsT0FBTyxlQUFlLENBQUM7QUFDakM7QUFRTyxTQUFTLFNBQVMsUUFBcUM7QUFDNUQsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBLHNCQUFzQjtBQUFBLElBQ3RCLDZCQUE2QjtBQUFBLElBQzdCLHdDQUF3QztBQUFBLElBQ3hDLGdDQUFnQztBQUFBLElBQ2hDLGtEQUFrRDtBQUFBLElBQ2xELDBDQUEwQztBQUFBLElBQzFDLDBCQUEwQjtBQUFBLEVBQzVCLElBQUk7QUFFSixNQUFJLFFBQXFCO0FBQUEsSUFDdkIsR0FBSSwwQkFBMEIsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFDbkQsR0FBSSxzQkFBc0IsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFDaEQsR0FBSSxnQ0FBZ0MsTUFBTSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUN0RTtBQUVBLFFBQU0sdUJBQThDO0FBQUEsSUFDbEQ7QUFBQSxNQUNFLGFBQWE7QUFBQSxNQUNiLFNBQVM7QUFBQSxNQUNULFFBQVEsQ0FBQyxZQUFZLFFBQVE7QUFBQSxNQUM3QixlQUFlO0FBQUEsSUFDakI7QUFBQSxJQUNBO0FBQUEsTUFDRSxhQUFhO0FBQUEsTUFDYixTQUFTO0FBQUEsTUFDVCxRQUFRLENBQUMsWUFBWSxRQUFRO0FBQUEsTUFDN0IsZUFBZTtBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsYUFBYTtBQUFBLE1BQ2IsU0FBUztBQUFBLE1BQ1QsUUFBUSxDQUFDLFlBQVksUUFBUTtBQUFBLE1BQzdCLGVBQWU7QUFBQSxJQUNqQjtBQUFBLElBQ0E7QUFBQSxNQUNFLGFBQWE7QUFBQSxNQUNiLFNBQVM7QUFBQSxNQUNULFFBQVEsQ0FBQyxZQUFZLFFBQVE7QUFBQSxNQUM3QixlQUFlO0FBQUEsSUFDakI7QUFBQSxFQUNGO0FBRUEsYUFBVyx1QkFBdUIsc0JBQXNCO0FBQ3RELFFBQUksQ0FBQyxvQkFBb0IsZUFBZTtBQUN0QztBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxDQUFDLE1BQU0sU0FBUyxTQUFTLG9CQUFvQixPQUFPLEdBQUc7QUFDdkYsWUFBTSxJQUFJLE1BQU0sa0JBQWtCLG9CQUFvQixXQUFXLHlDQUF5QyxvQkFBb0IsT0FBTyxXQUFXO0FBQUEsSUFDbEo7QUFFQSxVQUFNLEtBQUssR0FBRyxrQkFBa0Isb0JBQW9CLE9BQU8sS0FBSyxDQUFDLENBQUM7QUFBQSxFQUNwRTtBQUVBLGlCQUFlLEtBQUs7QUFHcEIsVUFBUSxNQUFNLE9BQU8sQ0FBQyxNQUFNLFVBQVU7QUFDcEMsUUFBSSxVQUFVLEdBQUc7QUFDZixhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sZUFBZSxrQkFBa0IsTUFBTSxRQUFRLENBQUMsQ0FBQztBQUV2RCxRQUFJLGlCQUFpQixJQUFJLEtBQUssaUJBQWlCLFlBQVksR0FBRztBQUM1RCxhQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsYUFBYSxTQUFTLE1BQU07QUFBQSxJQUNwRTtBQUVBLFFBQUksdUJBQXVCLElBQUksS0FBSyx1QkFBdUIsWUFBWSxHQUFHO0FBQ3hFLFlBQU0sa0JBQWtCLGtDQUFrQyxJQUFJLElBQUksS0FBSyxjQUFjO0FBQ3JGLFlBQU0sMEJBQTBCLGtDQUFrQyxZQUFZLElBQUksYUFBYSxjQUFjO0FBQzdHLGFBQU8sS0FBSyxRQUFRLGFBQWEsT0FBTyxrQ0FBa0MsSUFBSSxNQUFNLGtDQUFrQyxZQUFZLEtBQzdILG9CQUFvQjtBQUFBLElBQzNCO0FBRUEsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUVELFNBQU87QUFDVDtBQVlPLFNBQVMsdUJBQXVCLEtBQW1CO0FBQ3hELFNBQU8sSUFBSSxRQUFRLFVBQVUsaUNBQWlDLE1BQU0sUUFBUSxJQUFJLFFBQVEsVUFBVSx3QkFBd0IsTUFBTTtBQUNsSTtBQVNPLFNBQVMsbUJBQW1CLE9BQWtEO0FBQ25GLFNBQU8sY0FBYztBQUN2QjtBQVVBLGVBQXNCLGNBQWMsS0FBVSxTQUFpQixVQUFnQyxDQUFDLEdBQThCO0FBQzVILFFBQU0sVUFBVSxJQUFJLFlBQVk7QUFDaEMsUUFBTSxTQUFTLFFBQVEsT0FBTyxPQUFPLEVBQUU7QUFDdkMsUUFBTSxRQUFRLE1BQU0sSUFBSSxjQUFjLHFCQUFxQixNQUFNLEtBQUssQ0FBQztBQUN2RSxTQUFPLHlCQUF5QixFQUFFLE9BQU8sU0FBUyxTQUFTLFFBQVEsQ0FBQztBQUN0RTtBQVFPLFNBQVMsb0NBQW9DLFFBQStEO0FBQ2pILFFBQU0sRUFBRSxLQUFLLE9BQU8sV0FBVyxJQUFJO0FBQ25DLFFBQU0sT0FBTyxRQUFRLEVBQUUsS0FBSyxZQUFZLDBCQUEwQixLQUFLLENBQUM7QUFDeEUsTUFBSSxDQUFDLEtBQUssU0FBUztBQUNqQixVQUFNLElBQUksTUFBTSxrQkFBa0I7QUFBQSxFQUNwQztBQUVBLE1BQUksY0FBYyxVQUFVLEtBQUssSUFBSSxJQUFJO0FBQUEsSUFDdkMsTUFBTSxLQUFLO0FBQUEsSUFDWCxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsRUFDUjtBQUVBLE1BQUksY0FBYyxjQUFjLEtBQUssSUFBSSxJQUFJO0FBRTdDLFNBQU8sSUFBSSxtQkFBbUI7QUFBQSxJQUM1QixVQUFVLE1BQVk7QUFDcEIsNENBQXNDLEtBQUssSUFBSTtBQUFBLElBQ2pEO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFTTyxTQUFTLGNBQWMsS0FBVSxPQUFvQztBQUMxRSxRQUFNLHdCQUF3Qix5QkFBeUI7QUFFdkQsV0FBUyxRQUFRLE9BQU87QUFDdEIsV0FBTyxLQUFLLFNBQVM7QUFDbkIsVUFBSSxRQUFRLHNCQUFzQixJQUFJLEtBQUssSUFBSSxLQUFLO0FBQ3BEO0FBQ0EsNEJBQXNCLElBQUksS0FBSyxNQUFNLEtBQUs7QUFFMUMsVUFBSSxNQUFNLFFBQVEsS0FBSyxJQUFJLElBQUk7QUFFL0IsVUFBSSxPQUFPLElBQUksR0FBRztBQUNoQixZQUFJLGNBQWMsaUJBQWlCLElBQUksS0FBSyxLQUFLLFlBQVksR0FBRyxJQUFJO0FBQUEsTUFDdEU7QUFFQSxhQUFPLFVBQVU7QUFBQSxRQUNmO0FBQUEsUUFDQSxjQUFjLGlCQUFpQixLQUFLLElBQUk7QUFBQSxRQUN4QywwQkFBMEI7QUFBQSxNQUM1QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxTQUFPLElBQUksbUJBQW1CO0FBQUEsSUFDNUIsVUFBVSxNQUFZO0FBQ3BCLHNCQUFnQixLQUFLLEtBQUs7QUFBQSxJQUM1QjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBUU8sU0FBUyxzQ0FBc0MsS0FBVSxZQUE4QjtBQUM1RixRQUFNLE9BQU8sUUFBUSxFQUFFLEtBQUssWUFBWSwwQkFBMEIsS0FBSyxDQUFDO0FBQ3hFLE1BQUksQ0FBQyxLQUFLLFNBQVM7QUFDakIsVUFBTSxJQUFJLE1BQU0sa0JBQWtCO0FBQUEsRUFDcEM7QUFFQSxTQUFPLElBQUksY0FBYyxVQUFVLEtBQUssSUFBSTtBQUU1QyxTQUFPLElBQUksY0FBYyxjQUFjLEtBQUssSUFBSTtBQUNsRDtBQVFPLFNBQVMsZ0JBQWdCLEtBQVUsT0FBOEI7QUFDdEUsUUFBTSx3QkFBd0IseUJBQXlCO0FBRXZELFdBQVMsUUFBUSxPQUFPO0FBQ3RCLFdBQU8sS0FBSyxTQUFTO0FBQ25CLFVBQUksUUFBUSxzQkFBc0IsSUFBSSxLQUFLLElBQUksS0FBSztBQUNwRDtBQUNBLDRCQUFzQixJQUFJLEtBQUssTUFBTSxLQUFLO0FBQzFDLFVBQUksVUFBVSxHQUFHO0FBQ2YsOEJBQXNCLE9BQU8sS0FBSyxJQUFJO0FBRXRDLGVBQU8sSUFBSSxNQUFNLFFBQVEsS0FBSyxJQUFJO0FBRWxDLFlBQUksT0FBTyxJQUFJLEdBQUc7QUFDaEIsY0FBSSxjQUFjLGlCQUFpQixPQUFPLEtBQUssS0FBSyxZQUFZLEdBQUcsSUFBSTtBQUFBLFFBQ3pFO0FBQUEsTUFDRjtBQUVBLGFBQU8sVUFBVTtBQUFBLFFBQ2Y7QUFBQSxRQUNBLGNBQWMsaUJBQWlCLEtBQUssSUFBSTtBQUFBLFFBQ3hDLDBCQUEwQjtBQUFBLE1BQzVCLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyx3Q0FBa0Y7QUFDekYsU0FBTyxjQUFpRDtBQUFBLElBQ3RELGlCQUFpQjtBQUFBLElBQ2pCLFVBQVU7QUFBQSxJQUNWLFVBQVU7QUFBQSxFQUNaLENBQUM7QUFDSDtBQUVBLFNBQVMsMkJBQWdEO0FBQ3ZELFNBQU8seUJBQXlCLHlCQUF5QixvQkFBSSxJQUFvQixDQUFDLEVBQUU7QUFDdEY7QUFRQSxTQUFTLHdCQUF3QixPQUE0RDtBQUMzRixTQUFPLFVBQVUsUUFDWCxPQUFPLFVBQVUsWUFDaEIsUUFBUSxJQUFJLE9BQU8sTUFBTSxhQUFhLE9BQ3RDLE9BQU8sUUFBUSxJQUFJLE9BQU8sS0FBSyxNQUFNLGNBQ3JDLE9BQU8sUUFBUSxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQy9DO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsT0FBNkM7QUFDNUYsUUFBTSx1QkFBdUIsTUFBTSxxQkFBcUIsSUFBSSxVQUFVO0FBQ3RFLFNBQU8sV0FBVyxPQUFPLEVBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsZ0JBQWdCLGNBQWMsZ0JBQWdCLGVBQWUsb0JBQW9CLEVBQzdHLElBQUksQ0FBQyxvQkFBb0IscUJBQXFCLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hGO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsTUFBbUQ7QUFDbEcsTUFBSTtBQUNGLFdBQU8saUJBQWlCLE9BQU87QUFBQSxFQUNqQyxTQUFTLE9BQU87QUFDZCxlQUFXLElBQUksTUFBTSxpQ0FBaUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUMvRSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyx5QkFBeUIsUUFBMEQ7QUFDMUYsUUFBTSxFQUFFLE9BQU8sU0FBUyxRQUFRLElBQUk7QUFDcEMsUUFBTSxXQUFzQyxDQUFDLHFCQUE4QjtBQUMzRSxRQUFNLFNBQTJCLEVBQUUsR0FBRyxPQUFPLFNBQVM7QUFFdEQsTUFBSSxRQUFRLDBCQUEwQjtBQUNwQyxXQUFPLGdCQUFnQix1QkFBdUIsU0FBUyxLQUFLO0FBQzVELGFBQVMsS0FBSyxtQ0FBcUM7QUFBQSxFQUNyRDtBQUVBLE1BQ0UsUUFBUSx1Q0FDTCxRQUFRLGlEQUNSLFFBQVEsdUNBQ1g7QUFDQSxVQUFNLG1CQUFtQixzQkFBc0IsTUFBTSxXQUFXO0FBRWhFLFFBQUksUUFBUSxxQ0FBcUM7QUFDL0MsYUFBTywyQkFBMkIsaUJBQWlCO0FBQ25ELGVBQVMsS0FBSyx5REFBZ0Q7QUFBQSxJQUNoRTtBQUVBLFFBQUksUUFBUSwrQ0FBK0M7QUFDekQsYUFBTyxxQ0FBcUMsaUJBQWlCO0FBQzdELGVBQVMsS0FBSyw2RUFBMEQ7QUFBQSxJQUMxRTtBQUVBLFFBQUksUUFBUSx1Q0FBdUM7QUFDakQsYUFBTyw2QkFBNkIsaUJBQWlCO0FBQ3JELGVBQVMsS0FBSyw2REFBa0Q7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwibmFtZXMiOlsiQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUiXX0=
@@ -48,13 +48,15 @@
48
48
  *
49
49
  * Payload validation is opt-in per method through {@link https://standardschema.dev | Standard Schema}, so
50
50
  * zod / valibot / arktype / a hand-written validator all plug in and none of them is a dependency here. It
51
- * runs only while the `obsidian-dev-utils:PluginApi` debugger is enabled, so production pays nothing.
51
+ * runs only while the `obsidian-lib:validate-plugin-api-payloads` debug switch is on (off by default, see
52
+ * {@link getValidatePluginApiPayloadsDebugSwitch}), so production pays nothing. The `obsidian-dev-utils:PluginApi`
53
+ * debugger controls logging only: turning it on changes no behavior.
52
54
  *
53
55
  * The contract itself — its types and the schema builders — is not Obsidian-specific and lives in
54
56
  * `@mnaoumov/typescript-lib/api-contract` (`ApiContract`, `createArgumentsSchema`, `createTypeGuardSchema`,
55
57
  * `defineApiContract`). This module owns what is: the registry keyed by plugin id, the revocable handles, the
56
- * debug gate and the validation errors. A contract's KEYS drive the shape check that decides whether a published
57
- * record is usable at all; its schemas are only ever consulted while debugging.
58
+ * debug switch and the validation errors. A contract's KEYS drive the shape check that decides whether a published
59
+ * record is usable at all; its schemas are only ever consulted while the switch is on.
58
60
  *
59
61
  * Why the shape check is a `typeof` rather than a schema over the whole API object. In zod 4 `z.function()`
60
62
  * returns a function FACTORY, not a schema, so it cannot be a `z.object()` member directly. There is a known
@@ -62,7 +64,7 @@
62
64
  * `z.infer` types for a function member. It does not buy runtime validation here, though: `z.custom` is a
63
65
  * boolean predicate that returns its input unchanged, so the validating wrapper `implement` builds is
64
66
  * discarded and the check collapses back to "is it callable". Keeping that wrapper would need a further
65
- * `.transform()`, and would then move validation onto every call instead of behind the debug gate, and bind
67
+ * `.transform()`, and would then move validation onto every call instead of behind the debug switch, and bind
66
68
  * the contract to zod specifically — which is exactly what reaching through Standard Schema avoids. So the
67
69
  * declared method names are checked with `typeof`, and the payloads are validated per method instead.
68
70
  *
@@ -81,6 +83,7 @@
81
83
  */
82
84
  import type { ApiContract, ApiMethodContract, ApiMethodName, ApiMethods, TypedApiContract } from '@mnaoumov/typescript-lib/api-contract';
83
85
  import type { AsyncEventSource } from '@mnaoumov/typescript-lib/async-events';
86
+ import type { DebugSwitch } from '@mnaoumov/typescript-lib/debug-switches';
84
87
  import type { StandardSchemaV1 } from '@standard-schema/spec';
85
88
  import type { App, Component, Plugin } from 'obsidian';
86
89
  /**
@@ -413,8 +416,8 @@ export declare class PluginApiRevokedError extends PluginApiUnavailableError {
413
416
  /**
414
417
  * Thrown when a published API's payload fails the schema its contract declares.
415
418
  *
416
- * Only ever thrown while the `obsidian-dev-utils:PluginApi` debugger is enabled — in production the methods
417
- * are not wrapped at all.
419
+ * Only ever thrown while the `obsidian-lib:validate-plugin-api-payloads` debug switch is on (see
420
+ * {@link getValidatePluginApiPayloadsDebugSwitch}) — otherwise no payload is validated at all.
418
421
  */
419
422
  export declare class PluginApiValidationError extends Error {
420
423
  /**
@@ -451,6 +454,20 @@ export declare class PluginApiValidationError extends Error {
451
454
  * @returns The API, or `null` when no live record satisfies the range and the contract.
452
455
  */
453
456
  export declare function findPluginApi<TApi extends object>(params: FindPluginApiParams<NoInfer<TApi>>): null | TApi;
457
+ /**
458
+ * Gets the debug switch that decides whether a plugin-API call's payloads are validated against the contract.
459
+ *
460
+ * Its id is `obsidian-lib:validate-plugin-api-payloads` and it is off by default. While it is on, every call
461
+ * through a handle from {@link watchPluginApi} or {@link findPluginApi} checks its arguments and its return value
462
+ * against the method's declared schemas and throws a {@link PluginApiValidationError} on a mismatch. The
463
+ * `obsidian-dev-utils:PluginApi` debugger does not affect it: that only logs.
464
+ *
465
+ * The switch is registered on every read, which is idempotent, and whenever an API is published, watched or looked
466
+ * up, so a debug-settings UI lists it as soon as any plugin API is in play.
467
+ *
468
+ * @returns The debug switch.
469
+ */
470
+ export declare function getValidatePluginApiPayloadsDebugSwitch(): DebugSwitch;
454
471
  /**
455
472
  * Publishes a plugin's API so other plugins can consume it, keyed by the plugin's `manifest.id` and revoked
456
473
  * automatically when the plugin unloads.