clientnode 4.0.1493 → 4.0.1494

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/object.js CHANGED
@@ -577,8 +577,8 @@ export const evaluateAsyncDynamicData = async (data, givenOptions = {}) => {
577
577
  const options = {
578
578
  scope: {},
579
579
  selfReferenceName: 'self',
580
- expressionIndicatorKey: '__await_evaluate__',
581
- executionIndicatorKey: '__await_execute__',
580
+ expressionIndicatorKey: '__async_evaluate__',
581
+ executionIndicatorKey: '__async_execute__',
582
582
  ...givenOptions
583
583
  };
584
584
  if (!isObject(data)) return data;
@@ -988,4 +988,4 @@ export const unwrapProxy = (object, seenObjects = new Set()) => {
988
988
  }
989
989
  return object;
990
990
  };
991
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL29iamVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAjIS91c3IvYmluL2VudiBiYWJlbC1ub2RlXG4vLyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbi8qKiBAbW9kdWxlIG9iamVjdCAqL1xuJ3VzZSBzdHJpY3QnXG4vKiAhXG4gICAgcmVnaW9uIGhlYWRlclxuICAgIFtQcm9qZWN0IHBhZ2VdKGh0dHBzOi8vdG9yYmVuLndlYnNpdGUvY2xpZW50bm9kZSlcblxuICAgIENvcHlyaWdodCBUb3JiZW4gU2lja2VydCAoaW5mb1tcIn5hdH5cIl10b3JiZW4ud2Vic2l0ZSkgMTYuMTIuMjAxMlxuXG4gICAgTGljZW5zZVxuICAgIC0tLS0tLS1cblxuICAgIFRoaXMgbGlicmFyeSB3cml0dGVuIGJ5IFRvcmJlbiBTaWNrZXJ0IHN0YW5kcyB1bmRlciBhIGNyZWF0aXZlIGNvbW1vbnNcbiAgICBuYW1pbmcgMy4wIHVucG9ydGVkIGxpY2Vuc2UuXG4gICAgU2VlIGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvZGVlZC5kZVxuICAgIGVuZHJlZ2lvblxuKi9cbmltcG9ydCB0eXBlIHtcbiAgICBBbnlGdW5jdGlvbixcbiAgICBDb21wYXJlT3B0aW9ucyxcbiAgICBFdmFsdWF0ZUR5bmFtaWNEYXRhT3B0aW9ucyxcbiAgICBHZXR0ZXJGdW5jdGlvbixcbiAgICBNYXBwaW5nLFxuICAgIE5vcm1hbGl6ZWRPYmplY3RNYXNrLFxuICAgIE9iamVjdE1hc2tDb25maWd1cmF0aW9uLFxuICAgIFBsYWluT2JqZWN0LFxuICAgIFByb3h5SGFuZGxlcixcbiAgICBQcm94eVR5cGUsXG4gICAgUmVjdXJzaXZlQXN5bmNFdmFsdWF0ZWFibGUsXG4gICAgUmVjdXJzaXZlRXZhbHVhdGVhYmxlLFxuICAgIFJlY3Vyc2l2ZVBhcnRpYWwsXG4gICAgU2V0dGVyRnVuY3Rpb24sXG4gICAgVW5rbm93bkZ1bmN0aW9uLFxuICAgIFZhbHVlT2Zcbn0gZnJvbSAnLi90eXBlJ1xuXG5pbXBvcnQge1xuICAgIENMQVNTX1RPX1RZUEVfTUFQUElORywgSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wsIFZBTFVFX0NPUFlfU1lNQk9MXG59IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHtcbiAgICBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNQbGFpbk9iamVjdCwgaXNNYXAsIGlzUHJveHksIGlzU2V0LCBpc051bWVyaWNcbn0gZnJvbSAnLi9pbmRpY2F0b3JzJ1xuaW1wb3J0IHtpc05vdEFOdW1iZXJ9IGZyb20gJy4vbnVtYmVyJ1xuaW1wb3J0IHtlc2NhcGVSZWd1bGFyRXhwcmVzc2lvbnMsIGV2YWx1YXRlT3JUaHJvd0Vycm9yfSBmcm9tICcuL3N0cmluZydcblxuLyoqXG4gKiBBZGRzIGR5bmFtaWMgZ2V0dGVyIGFuZCBzZXR0ZXIgdG8gYW55IGdpdmVuIGRhdGEgc3RydWN0dXJlIHN1Y2ggYXMgbWFwcy5cbiAqIEBwYXJhbSBvYmplY3QgLSBPYmplY3QgdG8gcHJveHkuXG4gKiBAcGFyYW0gZ2V0dGVyV3JhcHBlciAtIEZ1bmN0aW9uIHRvIHdyYXAgZWFjaCBwcm9wZXJ0eSBnZXQuXG4gKiBAcGFyYW0gc2V0dGVyV3JhcHBlciAtIEZ1bmN0aW9uIHRvIHdyYXAgZWFjaCBwcm9wZXJ0eSBzZXQuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZXMgLSBNZXRob2QgbmFtZXMgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoZSBnaXZlblxuICogb2JqZWN0LlxuICogQHBhcmFtIGRlZXAgLSBJbmRpY2F0ZXMgdG8gcGVyZm9ybSBhIGRlZXAgd3JhcHBpbmcgb2Ygc3BlY2lmaWVkIHR5cGVzLlxuICogQHBhcmFtIHR5cGVzVG9FeHRlbmQgLSBUeXBlcyB3aGljaCBzaG91bGQgYmUgZXh0ZW5kZWQgKENoZWNrcyBhcmVcbiAqIHBlcmZvcm1lZCB2aWEgXCJ2YWx1ZSBpbnN0YW5jZW9mIHR5cGVcIi4pLlxuICogQHJldHVybnMgUmV0dXJucyBnaXZlbiBvYmplY3Qgd3JhcHBlZCB3aXRoIGEgZHluYW1pYyBnZXR0ZXIgcHJveHkuXG4gKi9cbmV4cG9ydCBjb25zdCBhZGREeW5hbWljR2V0dGVyQW5kU2V0dGVyID0gPFQgPSB1bmtub3duPihcbiAgICBvYmplY3Q6IFQsXG4gICAgZ2V0dGVyV3JhcHBlcjogR2V0dGVyRnVuY3Rpb24gfCBudWxsID0gbnVsbCxcbiAgICBzZXR0ZXJXcmFwcGVyOiBudWxsIHwgU2V0dGVyRnVuY3Rpb24gPSBudWxsLFxuICAgIG1ldGhvZE5hbWVzOiBNYXBwaW5nID0ge30sXG4gICAgZGVlcCA9IHRydWUsXG4gICAgdHlwZXNUb0V4dGVuZDogQXJyYXk8dW5rbm93bj4gPSBbT2JqZWN0XVxuKTogUHJveHlUeXBlPFQ+IHwgVCA9PiB7XG4gICAgaWYgKGRlZXAgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2luZGV4XSA9IGFkZER5bmFtaWNHZXR0ZXJBbmRTZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLCBnZXR0ZXJXcmFwcGVyLCBzZXR0ZXJXcmFwcGVyLCBtZXRob2ROYW1lcywgZGVlcFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqZWN0KVxuICAgICAgICAgICAgICAgIG9iamVjdC5zZXQoa2V5LCBhZGREeW5hbWljR2V0dGVyQW5kU2V0dGVyKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZ2V0dGVyV3JhcHBlciwgc2V0dGVyV3JhcHBlciwgbWV0aG9kTmFtZXMsIGRlZXApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICBlbHNlIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZTogQXJyYXk8dW5rbm93bj4gPSBbXVxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBvYmplY3QuZGVsZXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNhY2hlLnB1c2goYWRkRHluYW1pY0dldHRlckFuZFNldHRlcihcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGdldHRlcldyYXBwZXIsIHNldHRlcldyYXBwZXIsIG1ldGhvZE5hbWVzLCBkZWVwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZSlcbiAgICAgICAgICAgICAgICBvYmplY3QuYWRkKHZhbHVlKVxuICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCAhPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iamVjdCkpXG4gICAgICAgICAgICAgICAgKG9iamVjdCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICBhZGREeW5hbWljR2V0dGVyQW5kU2V0dGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgVFtFeHRyYWN0PGtleW9mIFQsIHN0cmluZz5dLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGVyV3JhcHBlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcldyYXBwZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBcbiAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgaWYgKGdldHRlcldyYXBwZXIgfHwgc2V0dGVyV3JhcHBlcilcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHR5cGVzVG9FeHRlbmQpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXNPYmplY3Qob2JqZWN0KSAmJiBvYmplY3QgaW5zdGFuY2VvZiAodHlwZSBhcyBBbnlGdW5jdGlvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyOiBQcm94eUhhbmRsZXI8VD4gPVxuICAgICAgICAgICAgICAgICAgICBnZXRQcm94eUhhbmRsZXI8VD4ob2JqZWN0LCBtZXRob2ROYW1lcylcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8VD4gPVxuICAgICAgICAgICAgICAgICAgICBnZXRQcm94eUhhbmRsZXI8VD4ob2JqZWN0LCBtZXRob2ROYW1lcylcblxuICAgICAgICAgICAgICAgIGlmIChnZXR0ZXJXcmFwcGVyKVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmdldCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIF90YXJnZXQ6IFQsIG5hbWU6IHN0cmluZyB8IHN5bWJvbFxuICAgICAgICAgICAgICAgICAgICApOiB1bmtub3duID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnX190YXJnZXRfXycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ19fcmV2b2tlX18nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldm9rZSgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbbmFtZSBhcyBrZXlvZiBUXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W25hbWUgYXMga2V5b2YgVF1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlcldyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXIuZ2V0KHByb3h5IGFzIFQsIG5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXJXcmFwcGVyKVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIF90YXJnZXQ6IFQsIG5hbWU6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IHVua25vd25cbiAgICAgICAgICAgICAgICAgICAgKTogYm9vbGVhbiA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXIuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5IGFzIFQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXJXcmFwcGVyKG5hbWUsIHZhbHVlLCBvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3Qge3Byb3h5LCByZXZva2V9ID1cbiAgICAgICAgICAgICAgICAgICAgUHJveHkucmV2b2NhYmxlKHt9LCBoYW5kbGVyIGFzIFByb3h5SGFuZGxlcjxvYmplY3Q+KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5IGFzIFByb3h5VHlwZTxUPlxuICAgICAgICAgICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBvYmplY3QgaW50byBpdHMgc2VyaWFsaXplZCBKU09OIHJlcHJlc2VudGF0aW9uIGJ5XG4gKiByZXBsYWNpbmcgY2lyY3VsYXIgcmVmZXJlbmNlcyB3aXRoIGEgZ2l2ZW4gcHJvdmlkZWQgdmFsdWUuXG4gKlxuICogVGhpcyBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIG9iamVjdCByZWN1cnNpdmVseSBhbmQgdHJhY2tzIG9mIHNlZW4gYW5kXG4gKiBhbHJlYWR5IHNlcmlhbGl6ZWQgc3RydWN0dXJlcyB0byByZXVzZSBnZW5lcmF0ZWQgc3RyaW5ncyBvciBtYXJrIGFcbiAqIGNpcmN1bGFyIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSBvYmplY3QgLSBPYmplY3QgdG8gc2VyaWFsaXplLlxuICogQHBhcmFtIGRldGVybWluZUNpcmN1bGFyUmVmZXJlbmNlVmFsdWUgLSBDYWxsYmFjayB0byBjcmVhdGUgYSBmYWxsYmFja1xuICogdmFsdWUgZGVwZW5kaW5nIG9uIGdpdmVuIHJlZHVuZGFudCB2YWx1ZS5cbiAqIEBwYXJhbSBudW1iZXJPZlNwYWNlcyAtIE51bWJlciBvZiBzcGFjZXMgdG8gdXNlIGZvciBzdHJpbmcgZm9ybWF0dGluZy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgSlNPTiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0Q2lyY3VsYXJPYmplY3RUb0pTT04gPSAoXG4gICAgb2JqZWN0OiB1bmtub3duLFxuICAgIGRldGVybWluZUNpcmN1bGFyUmVmZXJlbmNlVmFsdWU6ICgoXG4gICAgICAgIHNlcmlhbGl6ZWRWYWx1ZTogdW5rbm93bixcbiAgICAgICAga2V5OiBudWxsIHwgc3RyaW5nLFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgc2Vlbk9iamVjdHM6IE1hcDx1bmtub3duLCB1bmtub3duPlxuICAgICkgPT4gdW5rbm93bikgPSAoc2VyaWFsaXplZFZhbHVlOiB1bmtub3duKTogdW5rbm93biA9PlxuICAgICAgICBzZXJpYWxpemVkVmFsdWUgPz8gJ19fY2lyY3VsYXJSZWZlcmVuY2VfXycsXG4gICAgbnVtYmVyT2ZTcGFjZXMgPSAwXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnN0cmluZ2lmeT4gfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHNlZW5PYmplY3RzOiBNYXA8dW5rbm93biwgdW5rbm93bj4gPSBuZXcgTWFwPHVua25vd24sIHVua25vd24+KClcblxuICAgIGNvbnN0IHN0cmluZ2lmaWVyID0gKG9iamVjdDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VyID0gKGtleTogbnVsbCB8IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbk9iamVjdHMuaGFzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZUNpcmN1bGFyUmVmZXJlbmNlVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWVuT2JqZWN0cy5nZXQodmFsdWUpID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5PYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFNldCBiZWZvcmUgdHJhdmVyc2luZyBkZWVwZXIgdG8gZGV0ZWN0IGN5Y2xlcy5cbiAgICAgICAgICAgICAgICBzZWVuT2JqZWN0cy5zZXQodmFsdWUsIG51bGwpXG5cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OiBBcnJheTx1bmtub3duPiB8IE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW11cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocmVwbGFjZXIobnVsbCwgaXRlbSkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge31cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgc3ViVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHJlcGxhY2VyKG5hbWUsIHN1YlZhbHVlKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNlZW5PYmplY3RzLnNldCh2YWx1ZSwgcmVzdWx0KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmplY3QsIHJlcGxhY2VyLCBudW1iZXJPZlNwYWNlcylcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5naWZpZXIob2JqZWN0KVxufVxuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBtYXAgYW5kIGFsbCBuZXN0ZWQgZm91bmQgbWFwcyBvYmplY3RzIHRvIGNvcnJlc3BvbmRpbmdcbiAqIG9iamVjdC5cbiAqIEBwYXJhbSBvYmplY3QgLSBNYXAgdG8gY29udmVydCB0by5cbiAqIEBwYXJhbSBkZWVwIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIHJlY3Vyc2l2ZSBjb252ZXJzaW9uLlxuICogQHJldHVybnMgR2l2ZW4gbWFwIGFzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRNYXBUb1BsYWluT2JqZWN0ID0gKFxuICAgIG9iamVjdDogdW5rbm93biwgZGVlcCA9IHRydWVcbik6IHVua25vd24gPT4ge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNNYXAob2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0OiBNYXBwaW5nPHVua25vd24+ID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVlcClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0TWFwVG9QbGFpbk9iamVjdCh2YWx1ZSwgZGVlcClcblxuICAgICAgICAgICAgICAgIGlmIChbJ251bWJlcicsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlb2Yga2V5KSlcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0W1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdPYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwKVxuICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3Qob2JqZWN0KSlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmplY3QpKVxuICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydE1hcFRvUGxhaW5PYmplY3QodmFsdWUsIGRlZXApXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCBhcyBBcnJheTx1bmtub3duPikge1xuICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGFzIEFycmF5PHVua25vd24+KVtpbmRleF0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydE1hcFRvUGxhaW5PYmplY3QodmFsdWUsIGRlZXApXG5cbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTZXQob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlOiBBcnJheTx1bmtub3duPiA9IFtdXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGVsZXRlKHZhbHVlKVxuXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlLnB1c2goY29udmVydE1hcFRvUGxhaW5PYmplY3QodmFsdWUsIGRlZXApKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgY2FjaGUpXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5hZGQodmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBwbGFpbiBvYmplY3QgYW5kIGFsbCBuZXN0ZWQgZm91bmQgb2JqZWN0cyB0b1xuICogY29ycmVzcG9uZGluZyBtYXAuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHRvIGNvbnZlcnQgdG8uXG4gKiBAcGFyYW0gZGVlcCAtIEluZGljYXRlcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSByZWN1cnNpdmUgY29udmVyc2lvbi5cbiAqIEByZXR1cm5zIEdpdmVuIG9iamVjdCBhcyBtYXAuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0UGxhaW5PYmplY3RUb01hcCA9IChcbiAgICBvYmplY3Q6IHVua25vd24sIGRlZXAgPSB0cnVlXG4pOiB1bmtub3duID0+IHtcbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3IE1hcDxudW1iZXIgfCBzdHJpbmcsIHVua25vd24+KClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVlcClcbiAgICAgICAgICAgICAgICAgICAgKG9iamVjdCBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQbGFpbk9iamVjdFRvTWFwKHZhbHVlLCBkZWVwKVxuXG4gICAgICAgICAgICAgICAgbmV3T2JqZWN0LnNldChrZXksIChvYmplY3QgYXMgTWFwcGluZzx1bmtub3duPilba2V5XSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXApXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0IGFzIEFycmF5PHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgICAgIChvYmplY3QgYXMgQXJyYXk8dW5rbm93bj4pW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0UGxhaW5PYmplY3RUb01hcCh2YWx1ZSwgZGVlcClcblxuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldChrZXksIGNvbnZlcnRQbGFpbk9iamVjdFRvTWFwKHZhbHVlLCBkZWVwKSlcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzU2V0KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZTogQXJyYXk8dW5rbm93bj4gPSBbXVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmRlbGV0ZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgY2FjaGUucHVzaChjb252ZXJ0UGxhaW5PYmplY3RUb01hcCh2YWx1ZSwgZGVlcCkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZSlcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmFkZCh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4vKipcbiAqIFJlcGxhY2VzIGdpdmVuIHBhdHRlcm4gaW4gZWFjaCB2YWx1ZSBpbiBnaXZlbiBvYmplY3QgcmVjdXJzaXZlbHkgd2l0aFxuICogZ2l2ZW4gc3RyaW5nIHJlcGxhY2VtZW50LlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBjb252ZXJ0IHN1YnN0cmluZ3MgaW4uXG4gKiBAcGFyYW0gcGF0dGVybiAtIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byByZXBsYWNlLlxuICogQHBhcmFtIHJlcGxhY2VtZW50IC0gU3RyaW5nIHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgZm91bmQgcGF0dGVybnMuXG4gKiBAcmV0dXJucyBDb252ZXJ0ZWQgb2JqZWN0IHdpdGggcmVwbGFjZWQgcGF0dGVybnMuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0U3Vic3RyaW5nSW5QbGFpbk9iamVjdCA9IDxcbiAgICBUeXBlIGV4dGVuZHMgTWFwcGluZzx1bmtub3duPiA9IFBsYWluT2JqZWN0XG4+KG9iamVjdDogVHlwZSwgcGF0dGVybjogUmVnRXhwIHwgc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKTogVHlwZSA9PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqZWN0KSlcbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgICAgICAgb2JqZWN0W2tleSBhcyBrZXlvZiBUeXBlXSA9XG4gICAgICAgICAgICAgICAgY29udmVydFN1YnN0cmluZ0luUGxhaW5PYmplY3QodmFsdWUsIHBhdHRlcm4sIHJlcGxhY2VtZW50KSBhc1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duIGFzIFZhbHVlT2Y8VHlwZT5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIChvYmplY3QgYXMgdW5rbm93biBhcyBNYXBwaW5nKVtrZXldID1cbiAgICAgICAgICAgICAgICB2YWx1ZS5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1kZXNjcmlwdGlvbi1jb21wbGV0ZS1zZW50ZW5jZSAqL1xuLyoqXG4gKiBDb3BpZXMgZ2l2ZW4gb2JqZWN0IChvZiBhbnkgdHlwZSkgaW50byBvcHRpb25hbGx5IGdpdmVuIGRlc3RpbmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZSAtIE9iamVjdCB0byBjb3B5LlxuICogQHBhcmFtIGNvcHlCbG9icyAtIERldGVybWluZXMgd2hldGhlciB0byBjb3B5IGJsb2JzIGFzIHdlbGwuXG4gKiBAcGFyYW0gcmVjdXJzaW9uTGltaXQgLSBTcGVjaWZpZXMgaG93IGRlZXAgd2Ugc2hvdWxkIHRyYXZlcnNlIGludG8gZ2l2ZW5cbiAqIG9iamVjdCByZWN1cnNpdmVseS5cbiAqIEBwYXJhbSByZWN1cnNpb25FbmRWYWx1ZSAtIEluZGljYXRlcyB3aGljaCB2YWx1ZSB0byB1c2UgZm9yIHJlY3Vyc2lvbiBlbmRzLlxuICogVXN1YWxseSBhIHJlZmVyZW5jZSB0byBjb3JyZXNwb25kaW5nIHNvdXJjZSB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gKiBAcGFyYW0gZGVzdGluYXRpb24gLSBUYXJnZXQgdG8gY29weSBzb3VyY2UgdG8uXG4gKiBAcGFyYW0gY3ljbGljIC0gSW5kaWNhdGVzIHdoZXRoZXIga25vd24gc3ViIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGNvcGllZCBvclxuICogcmVmZXJlbmNlZCAoaWYgXCJ0cnVlXCIgZW5kbGVzcyBsb29wcyBjYW4gb2NjdXIgaWYgc291cmNlIGhhcyBjeWNsaWNcbiAqIHN0cnVjdHVyZXMpLlxuICogQHBhcmFtIGtub3duUmVmZXJlbmNlcyAtIFVzZWQgdG8gYXZvaWQgdHJhdmVyc2luZyBsb29wcyBhbmQgbm90IHRvIGNvcHlcbiAqIHJlZmVyZW5jZXMgZS5nLiB0byBvYmplY3RzIG5vdCB0byBjb3B5IChlLmcuIHN5bWJvbCBwb2x5ZmlsbHMpLlxuICogQHBhcmFtIHJlY3Vyc2lvbkxldmVsIC0gSW50ZXJuYWxseSB1c2VkIHRvIHRyYWNrIGN1cnJlbnQgcmVjdXJzaW9uIGxldmVsIGluXG4gKiBnaXZlbiBzb3VyY2UgZGF0YSBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJucyBWYWx1ZSBcInRydWVcIiBpZiBib3RoIG9iamVjdHMgYXJlIGVxdWFsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgY29weSA9IDxUeXBlID0gdW5rbm93bj4oXG4gICAgc291cmNlOiBUeXBlLFxuICAgIGNvcHlCbG9icyA9IGZhbHNlLFxuICAgIHJlY3Vyc2lvbkxpbWl0ID0gLTEsXG4gICAgcmVjdXJzaW9uRW5kVmFsdWU6IHVua25vd24gPSBWQUxVRV9DT1BZX1NZTUJPTCxcbiAgICBkZXN0aW5hdGlvbjogbnVsbCB8IFR5cGUgPSBudWxsLFxuICAgIGN5Y2xpYyA9IGZhbHNlLFxuICAgIGtub3duUmVmZXJlbmNlczogQXJyYXk8dW5rbm93bj4gPSBbXSxcbiAgICByZWN1cnNpb25MZXZlbCA9IDBcbik6IFR5cGUgPT4ge1xuICAgIC8qIGVzbGludC1lbmFibGUganNkb2MvcmVxdWlyZS1kZXNjcmlwdGlvbi1jb21wbGV0ZS1zZW50ZW5jZSAqL1xuICAgIGlmIChpc09iamVjdChzb3VyY2UpKVxuICAgICAgICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IGRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENhbid0IGNvcHkgYmVjYXVzZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBgICtcbiAgICAgICAgICAgICAgICAgICAgJ2lkZW50aWNhbC4nXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWN5Y2xpYyAmJlxuICAgICAgICAgICAgICAgICFbdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyhzb3VyY2UgYXMgdW5rbm93biBhcyBudWxsKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGtub3duUmVmZXJlbmNlcy5pbmRleE9mKHNvdXJjZSlcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga25vd25SZWZlcmVuY2VzW2luZGV4XSBhcyBUeXBlXG5cbiAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMucHVzaChzb3VyY2UpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvcHlWYWx1ZSA9IDxWPih2YWx1ZTogVik6IG51bGwgfCBWID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0ICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MaW1pdCA8IHJlY3Vyc2lvbkxldmVsICsgMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2lvbkVuZFZhbHVlID09PSBWQUxVRV9DT1BZX1NZTUJPTCA/XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25FbmRWYWx1ZSBhcyBudWxsIHwgVlxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBudWxsIHwgViA9IGNvcHkoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBjb3B5QmxvYnMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0LFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25FbmRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY3ljbGljLFxuICAgICAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxldmVsICsgMVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWN5Y2xpYyAmJlxuICAgICAgICAgICAgICAgICAgICAhW3VuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyB1bmtub3duIGFzIG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMucHVzaCh2YWx1ZSlcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKVxuICAgICAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24gYXMgdW5rbm93biBhcyBBcnJheTx1bmtub3duPilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wdXNoKGNvcHlWYWx1ZShpdGVtKSlcbiAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE1hcClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiBhcyB1bmtub3duIGFzIE1hcDx1bmtub3duLCB1bmtub3duPilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoa2V5LCBjb3B5VmFsdWUodmFsdWUpKVxuICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKVxuICAgICAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24gYXMgdW5rbm93biBhcyBTZXQ8dW5rbm93bj4pXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGNvcHlWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSlcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiBhcyBNYXBwaW5nPFZhbHVlT2Y8VHlwZT4+KVtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5VmFsdWUodmFsdWUgYXMgVmFsdWVPZjxUeXBlPikgYXMgVmFsdWVPZjxUeXBlPlxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gY29weSBwcm9wZXJ0eSB2YWx1ZSBvYmplY3QgXCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtrZXl9XCI6ICR7cmVwcmVzZW50KGVycm9yKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjYXVzZTogZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHkoXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29weUJsb2JzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRW5kVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIChbXSBhcyB1bmtub3duIGFzIFR5cGUpLFxuICAgICAgICAgICAgICAgICAgICBjeWNsaWMsXG4gICAgICAgICAgICAgICAgICAgIGtub3duUmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGV2ZWxcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHkoXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29weUJsb2JzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRW5kVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIChuZXcgTWFwKCkgYXMgdW5rbm93biBhcyBUeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgY3ljbGljLFxuICAgICAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxldmVsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3B5KFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGNvcHlCbG9icyxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGltaXQsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkVuZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAobmV3IFNldCgpIGFzIHVua25vd24gYXMgVHlwZSksXG4gICAgICAgICAgICAgICAgICAgIGN5Y2xpYyxcbiAgICAgICAgICAgICAgICAgICAga25vd25SZWZlcmVuY2VzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MZXZlbFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpIGFzIHVua25vd24gYXMgVHlwZVxuXG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXIgPSAvW14vXSokLy5leGVjKHNvdXJjZS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIgPyBtb2RpZmllclswXSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBUeXBlXG4gICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uIGFzIHVua25vd24gYXMgUmVnRXhwKS5sYXN0SW5kZXggPVxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UubGFzdEluZGV4XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBzb3VyY2UgaW5zdGFuY2VvZiBCbG9iKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3B5QmxvYnMgP1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uuc2xpY2UoMCwgc291cmNlLnNpemUsIHNvdXJjZS50eXBlKSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA6XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVxuXG4gICAgICAgICAgICByZXR1cm4gY29weShcbiAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgY29weUJsb2JzLFxuICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0LFxuICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkVuZFZhbHVlLFxuICAgICAgICAgICAgICAgICh7fSBhcyB1bmtub3duIGFzIFR5cGUpLFxuICAgICAgICAgICAgICAgIGN5Y2xpYyxcbiAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgcmVjdXJzaW9uTGV2ZWxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uIHx8IHNvdXJjZVxufVxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIGludGVybmFsIEphdmFTY3JpcHQgW1tDbGFzc11dIG9mIGFuIG9iamVjdC5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGFuYWx5emUuXG4gKiBAcmV0dXJucyBOYW1lIG9mIGRldGVybWluZWQgdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVybWluZVR5cGUgPSAodmFsdWU/OiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgICBpZiAoW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXModmFsdWUgYXMgbnVsbCkpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG5cbiAgICBjb25zdCB0eXBlOiBzdHJpbmcgPSB0eXBlb2YgdmFsdWVcblxuICAgIGlmIChcbiAgICAgICAgWydmdW5jdGlvbicsICdvYmplY3QnXS5pbmNsdWRlcyh0eXBlKSAmJlxuICAgICAgICAndG9TdHJpbmcnIGluICh2YWx1ZSBhcyBvYmplY3QpXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ1JlcHJlc2VudGF0aW9uID1cbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSlcblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgQ0xBU1NfVE9fVFlQRV9NQVBQSU5HLCBzdHJpbmdSZXByZXNlbnRhdGlvblxuICAgICAgICApKVxuICAgICAgICAgICAgcmV0dXJuIENMQVNTX1RPX1RZUEVfTUFQUElOR1tcbiAgICAgICAgICAgICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbiBhc1xuICAgICAgICAgICAgICAgICAgICBrZXlvZiB0eXBlb2YgQ0xBU1NfVE9fVFlQRV9NQVBQSU5HXG4gICAgICAgICAgICBdXG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGdpdmVuIGl0ZW1zIGFyZSBlcXVhbCBmb3IgZ2l2ZW4gcHJvcGVydHkgbGlzdC4gSWZcbiAqIHByb3BlcnR5IGxpc3QgaXNuJ3Qgc2V0IGFsbCBwcm9wZXJ0aWVzIHdpbGwgYmUgY2hlY2tlZC4gQWxsIGtleXMgd2hpY2hcbiAqIHN0YXJ0cyB3aXRoIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHByZWZpeGVzIHdpbGwgYmUgb21pdHRlZC5cbiAqIEBwYXJhbSBmaXJzdFZhbHVlIC0gRmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gc2Vjb25kVmFsdWUgLSBTZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zIC0gT3B0aW9ucyB0byBkZWZpbmUgaG93IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLnByb3BlcnRpZXMgLSBQcm9wZXJ0eSBuYW1lcyB0byBjaGVjay4gQ2hlY2sgYWxsIGlmXG4gKiBcIm51bGxcIiBpcyBzZWxlY3RlZCAoZGVmYXVsdCkuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmRlZXAgLSBSZWN1cnNpb24gZGVwdGggbmVnYXRpdmUgdmFsdWVzIG1lYW5zXG4gKiBpbmZpbml0ZWx5IGRlZXAgKGRlZmF1bHQpLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5leGNlcHRpb25QcmVmaXhlcyAtIFByb3BlcnR5IHByZWZpeGVzIHdoaWNoXG4gKiBpbmRpY2F0ZXMgcHJvcGVydGllcyB0byBpZ25vcmUuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmlnbm9yZUZ1bmN0aW9ucyAtIEluZGljYXRlcyB3aGV0aGVyIGZ1bmN0aW9ucyBoYXZlXG4gKiB0byBiZSBpZGVudGljYWwgdG8gaW50ZXJwcmV0IGlzIGFzIGVxdWFsLiBJZiBzZXQgdG8gXCJ0cnVlXCIgdHdvIGZ1bmN0aW9uc1xuICogd2lsbCBiZSBhc3N1bWVkIHRvIGJlIGVxdWFsIChkZWZhdWx0KS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuY29tcGFyZUJsb2JzIC0gSW5kaWNhdGVzIHdoZXRoZXIgYmluYXJ5IGRhdGEgc2hvdWxkXG4gKiBiZSBjb252ZXJ0ZWQgdG8gYSBiYXNlNjQgc3RyaW5nIHRvIGNvbXBhcmUgdGhlaXIgY29udGVudC4gTWFrZXMgdGhpc1xuICogZnVuY3Rpb24gYXN5bmNocm9ub3VzIGluIGJyb3dzZXJzIGFuZCBwb3RlbnRpYWxseSB0YWtlcyBhIGxvdCBvZlxuICogcmVzb3VyY2VzLlxuICogQHJldHVybnMgVmFsdWUgXCJ0cnVlXCIgaWYgYm90aCBvYmplY3RzIGFyZSBlcXVhbCBhbmQgXCJmYWxzZVwiIG90aGVyd2lzZS5cbiAqIElmIFwiY29tcGFyZUJsb2JzXCIgaXMgYWN0aXZhdGVkLCBhbmQgd2UncmUgcnVubmluZyBpbiBhIGJyb3dzZXIgbGlrZVxuICogZW52aXJvbm1lbnQgYW5kIGJpbmFyeSBkYXRhIGlzIGdpdmVuLCB0aGVuIGEgcHJvbWlzZSB3cmFwcGluZyB0aGVcbiAqIGRldGVybWluZWQgYm9vbGVhbiB2YWx1ZXMgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBlcXVhbHMgPSAoXG4gICAgZmlyc3RWYWx1ZTogdW5rbm93bixcbiAgICBzZWNvbmRWYWx1ZTogdW5rbm93bixcbiAgICBnaXZlbk9wdGlvbnM6IFBhcnRpYWw8Q29tcGFyZU9wdGlvbnM+ID0ge31cbik6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+IHwgc3RyaW5nID0+IHtcbiAgICBjb25zdCBvcHRpb25zOiBDb21wYXJlT3B0aW9ucyA9IHtcbiAgICAgICAgY29tcGFyZUJsb2JzOiBmYWxzZSxcbiAgICAgICAgZGVlcDogLTEsXG4gICAgICAgIGV4Y2VwdGlvblByZWZpeGVzOiBbXSxcbiAgICAgICAgaWdub3JlRnVuY3Rpb25zOiB0cnVlLFxuICAgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgICByZXR1cm5SZWFzb25JZk5vdEVxdWFsOiBmYWxzZSxcbiAgICAgICAgLi4uZ2l2ZW5PcHRpb25zXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBvcHRpb25zLmlnbm9yZUZ1bmN0aW9ucyAmJlxuICAgICAgICBpc0Z1bmN0aW9uKGZpcnN0VmFsdWUpICYmIGlzRnVuY3Rpb24oc2Vjb25kVmFsdWUpIHx8XG4gICAgICAgIGZpcnN0VmFsdWUgPT09IHNlY29uZFZhbHVlIHx8XG4gICAgICAgIGlzTm90QU51bWJlcihmaXJzdFZhbHVlKSAmJiBpc05vdEFOdW1iZXIoc2Vjb25kVmFsdWUpIHx8XG4gICAgICAgIGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgJiYgc2Vjb25kVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgZmlyc3RWYWx1ZS50b1N0cmluZygpID09PSBzZWNvbmRWYWx1ZS50b1N0cmluZygpICYmXG4gICAgICAgIGZpcnN0VmFsdWUuZmxhZ3Muc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSA9PT1cbiAgICAgICAgc2Vjb25kVmFsdWUuZmxhZ3Muc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICBmaXJzdFZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiBzZWNvbmRWYWx1ZSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgKFxuICAgICAgICAgICAgaXNOYU4oZmlyc3RWYWx1ZS5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICBpc05hTihzZWNvbmRWYWx1ZS5nZXRUaW1lKCkpIHx8XG4gICAgICAgICAgICAhaXNOYU4oZmlyc3RWYWx1ZS5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAhaXNOYU4oc2Vjb25kVmFsdWUuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICAgZmlyc3RWYWx1ZS5nZXRUaW1lKCkgPT09IHNlY29uZFZhbHVlLmdldFRpbWUoKVxuICAgICAgICApIHx8XG4gICAgICAgIG9wdGlvbnMuY29tcGFyZUJsb2JzICYmXG4gICAgICAgIGV2YWwoJ3R5cGVvZiBCdWZmZXInKSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgKGV2YWwoJ0J1ZmZlcicpIGFzIHR5cGVvZiBCdWZmZXIpLCAnaXNCdWZmZXInXG4gICAgICAgICkgJiZcbiAgICAgICAgZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIGV2YWwoJ0J1ZmZlcicpICYmXG4gICAgICAgIHNlY29uZFZhbHVlIGluc3RhbmNlb2YgZXZhbCgnQnVmZmVyJykgJiZcbiAgICAgICAgKGZpcnN0VmFsdWUgYXMgQnVmZmVyKS50b1N0cmluZygnYmFzZTY0JykgPT09XG4gICAgICAgIChzZWNvbmRWYWx1ZSBhcyBCdWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIClcbiAgICAgICAgcmV0dXJuIHRydWVcblxuICAgIGlmIChcbiAgICAgICAgb3B0aW9ucy5jb21wYXJlQmxvYnMgJiZcbiAgICAgICAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBCbG9iICYmXG4gICAgICAgIHNlY29uZFZhbHVlIGluc3RhbmNlb2YgQmxvYlxuICAgIClcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+KChcbiAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykgPT4gdm9pZFxuICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlczogQXJyYXk8QXJyYXlCdWZmZXIgfCBudWxsIHwgc3RyaW5nPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIFtmaXJzdFZhbHVlLCBzZWNvbmRWYWx1ZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gobnVsbClcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goKGV2ZW50LnRhcmdldCBhcyBGaWxlUmVhZGVyKS5yZXN1bHQpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzWzBdID09PSB2YWx1ZXNbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYD4+PiBCbG9iKCR7cmVwcmVzZW50KHZhbHVlc1swXSl9KSAgIT09IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmxvYigke3JlcHJlc2VudCh2YWx1ZXNbMV0pfSlgIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgaWYgKFxuICAgICAgICBpc1BsYWluT2JqZWN0KGZpcnN0VmFsdWUpICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3Qoc2Vjb25kVmFsdWUpICYmXG4gICAgICAgICEoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBzZWNvbmRWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShmaXJzdFZhbHVlKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNlY29uZFZhbHVlKSAmJlxuICAgICAgICBmaXJzdFZhbHVlLmxlbmd0aCA9PT0gc2Vjb25kVmFsdWUubGVuZ3RoIHx8XG4gICAgICAgIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBkZXRlcm1pbmVUeXBlKGZpcnN0VmFsdWUpID09PSBkZXRlcm1pbmVUeXBlKHNlY29uZFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIFsnbWFwJywgJ3NldCddLmluY2x1ZGVzKGRldGVybWluZVR5cGUoZmlyc3RWYWx1ZSkpXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICAoZmlyc3RWYWx1ZSBhcyBTZXQ8dW5rbm93bj4pLnNpemUgPT09XG4gICAgICAgICAgICAoc2Vjb25kVmFsdWUgYXMgU2V0PHVua25vd24+KS5zaXplXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4+ID0gW11cbiAgICAgICAgZm9yIChjb25zdCBbZmlyc3QsIHNlY29uZF0gb2YgW1xuICAgICAgICAgICAgW2ZpcnN0VmFsdWUsIHNlY29uZFZhbHVlXSxcbiAgICAgICAgICAgIFtzZWNvbmRWYWx1ZSwgZmlyc3RWYWx1ZV1cbiAgICAgICAgXSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJc0FycmF5OiBib29sZWFuID0gQXJyYXkuaXNBcnJheShmaXJzdClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmaXJzdElzQXJyYXkgJiZcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHNlY29uZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGZpcnN0IGFzIEFycmF5PHVua25vd24+KS5sZW5ndGggIT09XG4gICAgICAgICAgICAgICAgICAgIChzZWNvbmQgYXMgQXJyYXk8dW5rbm93bj4pLmxlbmd0aFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID8gJy5sZW5ndGgnIDogZmFsc2VcblxuICAgICAgICAgICAgY29uc3QgZmlyc3RJc01hcCA9IGlzTWFwKGZpcnN0KVxuICAgICAgICAgICAgaWYgKGZpcnN0SXNNYXAgJiYgKCFpc01hcChzZWNvbmQpIHx8IGZpcnN0LnNpemUgIT09IHNlY29uZC5zaXplKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID8gJy5zaXplJyA6IGZhbHNlXG5cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SXNTZXQgPSBpc1NldChmaXJzdClcbiAgICAgICAgICAgIGlmIChmaXJzdElzU2V0ICYmICghaXNTZXQoc2Vjb25kKSB8fCBmaXJzdC5zaXplICE9PSBzZWNvbmQuc2l6ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmV0dXJuUmVhc29uSWZOb3RFcXVhbCA/ICcuc2l6ZScgOiBmYWxzZVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZmlyc3QgYXMgQXJyYXk8dW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPSBlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBhcyBBcnJheTx1bmtub3duPilbaW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zLCBkZWVwOiBvcHRpb25zLmRlZXAgLSAxfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4OiBudW1iZXIgPSBpbmRleFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRlcm1pbmVSZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBib29sZWFuIHwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApOiBib29sZWFuIHwgc3RyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWyR7U3RyaW5nKGN1cnJlbnRJbmRleCl9XWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeydbJzogJycsICc+JzogJyAnfVtyZXN1bHRbMF1dID8/ICcuJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsICd0aGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGFzIFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oZGV0ZXJtaW5lUmVzdWx0KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRlcm1pbmVSZXN1bHQocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RJc01hcCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWVwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPiB8IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA9IGVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vjb25kIGFzIE1hcDx1bmtub3duLCB1bmtub3duPikuZ2V0KGtleSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgey4uLm9wdGlvbnMsIGRlZXA6IG9wdGlvbnMuZGVlcCAtIDF9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRlcm1pbmVSZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBib29sZWFuIHwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApOiBib29sZWFuIHwgc3RyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZ2V0KCR7cmVwcmVzZW50KGtleSl9KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeydbJzogJycsICc+JzogJyAnfVtyZXN1bHRbMF1dID8/ICcuJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsICd0aGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGFzIFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oZGV0ZXJtaW5lUmVzdWx0KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRlcm1pbmVSZXN1bHQocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0SXNTZXQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWVwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXF1YWwgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViUHJvbWlzZXM6IEFycmF5PFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBDaGVjayBpZiB0aGVpciBleGlzdHMgYXQgbGVhc3Qgb25lIGJlaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlY29uZFZhbHVlIG9mIHNlY29uZCBhcyBTZXQ8dW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0gZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zLCBkZWVwOiBvcHRpb25zLmRlZXAgLSAxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgYXMgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGVybWluZVJlc3VsdCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbDogYm9vbGVhblxuICAgICAgICAgICAgICAgICAgICAgICAgKTogYm9vbGVhbiB8IHN0cmluZyA9PiBlcXVhbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYD4+PiB7LT4gJHtyZXByZXNlbnQodmFsdWUpfSBub3QgZm91bmR9YCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBXZSBkbyBub3QgaGF2ZSB0byB3YWl0IGZvciBwcm9taXNlcyB0byBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZCB3aGVuIG9uZSBtYXRjaCBjb3VsZCBiZSBmb3VuZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJQcm9taXNlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPigoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykgPT4gdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbDxib29sZWFuIHwgc3RyaW5nPihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHRzOiBBcnJheTxib29sZWFuIHwgc3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGV0ZXJtaW5lUmVzdWx0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4gcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZVJlc3VsdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0IGFzIE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvcGVydGllcyAmJiAhb3B0aW9ucy5wcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9CcmVhayA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXhjZXB0aW9uUHJlZml4IG9mIG9wdGlvbnMuZXhjZXB0aW9uUHJlZml4ZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZXhjZXB0aW9uUHJlZml4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvQnJlYWsgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9CcmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPSBlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zLCBkZWVwOiBvcHRpb25zLmRlZXAgLSAxfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0ZXJtaW5lUmVzdWx0ID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogYm9vbGVhbiB8IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTogYm9vbGVhbiB8IHN0cmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7J1snOiAnJywgJz4nOiAnICd9W3Jlc3VsdFswXV0gPz8gJy4nKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgJ3RoZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgYXMgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihkZXRlcm1pbmVSZXN1bHQpKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZVJlc3VsdChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+KChcbiAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpID0+IHZvaWRcbiAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0czogQXJyYXk8Ym9vbGVhbiB8IHN0cmluZz4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID9cbiAgICAgICAgYD4+PiAke3JlcHJlc2VudChmaXJzdFZhbHVlKX0gIT09ICR7cmVwcmVzZW50KHNlY29uZFZhbHVlKX1gIDpcbiAgICAgICAgZmFsc2Vcbn1cbi8qKlxuICogV3JhcHMgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgaW50byBwcm94aWVzIHJlY3Vyc2l2ZWx5IHRvIGV2YWx1YXRlIGFuZCByZXNvbHZlXG4gKiBlYWNoIGdldCByZXF1ZXN0IHRvIGRhdGEgaGF2aW5nIGFuIG9iamVjdCB3aXRoIGluZGljYXRpbmcga2V5cyBhbmQgcmVwbGFjZXNcbiAqIHRoYXQgb2JqZWN0IHdpdGggY29ycmVzcG9uZGluZyBldmFsdWF0ZWQgdmFsdWVzLiBBbGwgbmVzdGVkIG9iamVjdHMgYXJlXG4gKiB3cmFwcGVkIHdpdGggYSBwcm94eSB0byByZXNvbHZlIGNoYWlucyBvZiByZWZlcmVuY2luZyBleHByZXNzaW9ucyBhcyB3ZWxsLlxuICogQHBhcmFtIG9iamVjdCAtIEdpdmVuIG1hcHBpbmcgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBldmFsdWF0aW9uLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5zY29wZSAtIFNjb3BlIHRvIHVzZSBldmFsdWF0ZSBhZ2Fpbi5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWUgLSBOYW1lIHRvIHVzZSBmb3IgcmVmZXJlbmNlIHRvIGdpdmVuXG4gKiBvYmplY3QuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHJldHVybnMgRXZhbHVhdGVkIGdpdmVuIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUR5bmFtaWNEYXRhID0gPFR5cGUgPSB1bmtub3duPihcbiAgICBvYmplY3Q6IG51bGwgfCBSZWN1cnNpdmVFdmFsdWF0ZWFibGU8VHlwZT4sXG4gICAgZ2l2ZW5PcHRpb25zOiBQYXJ0aWFsPEV2YWx1YXRlRHluYW1pY0RhdGFPcHRpb25zPiA9IHt9XG4pOiBUeXBlID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBzY29wZToge30sXG4gICAgICAgIHNlbGZSZWZlcmVuY2VOYW1lOiAnc2VsZicsXG4gICAgICAgIGV4cHJlc3Npb25JbmRpY2F0b3JLZXk6ICdfX2V2YWx1YXRlX18nLFxuICAgICAgICBleGVjdXRpb25JbmRpY2F0b3JLZXk6ICdfX2V4ZWN1dGVfXycsXG4gICAgICAgIC4uLmdpdmVuT3B0aW9uc1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JyB8fCBvYmplY3QgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBvYmplY3QgYXMgdW5rbm93biBhcyBUeXBlXG5cbiAgICBpZiAoIShvcHRpb25zLnNlbGZSZWZlcmVuY2VOYW1lIGluIG9wdGlvbnMuc2NvcGUpKVxuICAgICAgICBvcHRpb25zLnNjb3BlW29wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWVdID0gb2JqZWN0XG5cbiAgICBjb25zdCBpbnRlcm5hbEV2YWx1YXRlQW5kVGhyb3dFcnJvciA9IChcbiAgICAgICAgY29kZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcgPSBvcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXlcbiAgICApOiBUeXBlID0+XG4gICAgICAgIGV2YWx1YXRlT3JUaHJvd0Vycm9yPFR5cGU+KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzY29wZTogb3B0aW9ucy5zY29wZSxcbiAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogdHlwZSA9PT0gb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuXG4gICAgY29uc3QgYWRkUHJveHlSZWN1cnNpdmVseSA9IChkYXRhOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAgICAgZGF0YSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJ1xuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZ2l2ZW5WYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnX190YXJnZXRfXycgJiYgaXNPYmplY3QoZ2l2ZW5WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IGdpdmVuVmFsdWVcblxuICAgICAgICAgICAgICAgIGFkZFByb3h5UmVjdXJzaXZlbHkodmFsdWUpXG4gICAgICAgICAgICAgICAgLy8gTk9URTogV2Ugb25seSB3cmFwIG5lZWRlZCBvYmplY3RzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2t1cDogTWFwcGluZzx1bmtub3duPiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgIChkYXRhIGFzIE1hcHBpbmc8UHJveHlUeXBlPilba2V5XSA9IG5ldyBQcm94eShcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyB8IHN5bWJvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6IHVua25vd24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAnX190YXJnZXRfXycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2hhc093blByb3BlcnR5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNsaW50LWRpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNsaW50LWVuYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogVmVyeSBjb21wbGljYXRlZCBzZWN0aW9uLCBkbyBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHdoaWxlIGhhdmluZyBnb29kIHRlc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0sIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFRhcmdldDogdW5rbm93biA9IHJlc29sdmUodGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAndG9TdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IE1hcHBpbmc8VW5rbm93bkZ1bmN0aW9uPiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxFdmFsdWF0ZUFuZFRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVGFyZ2V0IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgTWFwcGluZzxVbmtub3duRnVuY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRba2V5XS5iaW5kKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEV2YWx1YXRlQW5kVGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUYXJnZXQgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldIGFzIG51bGwgfCBVbmtub3duRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk/LmJpbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gYXMgVW5rbm93bkZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHJlc3VsdClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtrZXldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwodGFyZ2V0LCB0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBNYXBwaW5nPHVua25vd24+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFt0eXBlXSBhcyBzdHJpbmcsIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBNYXBwaW5nPHVua25vd24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCB8IFVua25vd25GdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk/LmJpbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSBhcyBVbmtub3duRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHJlc3VsdClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFRhcmdldCBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmQgb2YgY29tcGxpY2F0ZWQgc3R1ZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25LZXlzOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogTWFwcGluZzx1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6IEFycmF5PHN0cmluZz4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwodGFyZ2V0LCB0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFt0eXBlXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApIGFzIFByb3h5VHlwZVxuXG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBLbm93biBwcm94eSBwb2x5ZmlsbHMgZG9lcyBub3QgcHJvdmlkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiX190YXJnZXRfX1wiIGFwaS5cbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGF0YSBhcyBNYXBwaW5nPFByb3h5VHlwZT4pW2tleV0uX190YXJnZXRfXylcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIGFzIE1hcHBpbmc8UHJveHlUeXBlPilba2V5XS5fX3RhcmdldF9fID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlID0gKGRhdGE6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgICBpZiAoaXNQcm94eShkYXRhKSkge1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIGhhdmUgdG8gc2tpcCBcIm93bktleXNcIiBwcm94eSB0cmFwIGhlcmUuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIFtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgdHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGEgYXMgTWFwcGluZzx1bmtub3duPilbdHlwZV1cblxuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLl9fdGFyZ2V0X19cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICAgICAgZGF0YSBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgaWYgKFtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKHZhbHVlIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAoZGF0YSBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldID0gcmVzb2x2ZSh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgb3B0aW9ucy5zY29wZS5yZXNvbHZlID0gcmVzb2x2ZVxuICAgIGNvbnN0IHJlbW92ZVByb3h5UmVjdXJzaXZlbHkgPSAoZGF0YTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICAgICAgICBpZiAoaXNPYmplY3QoZGF0YSkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSlcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGtleSAhPT0gJ19fdGFyZ2V0X18nICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIFsnZnVuY3Rpb24nLCAndW5kZWZpbmVkJ10uaW5jbHVkZXModHlwZW9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IHVua25vd24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGFzIHtfX3RhcmdldF9fOiB1bmtub3dufSkuX190YXJnZXRfX1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJveHlSZWN1cnNpdmVseSh2YWx1ZSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBvYmplY3QsIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleVxuICAgICkpXG4gICAgICAgIHJldHVybiBpbnRlcm5hbEV2YWx1YXRlQW5kVGhyb3dFcnJvcihvYmplY3RbXG4gICAgICAgICAgICBvcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXkgYXMga2V5b2YgUmVjdXJzaXZlRXZhbHVhdGVhYmxlPFR5cGU+XG4gICAgICAgIF0pXG4gICAgZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBvYmplY3QsIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgKSlcbiAgICAgICAgcmV0dXJuIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgb2JqZWN0W29wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5IGFzXG4gICAgICAgICAgICAgICAga2V5b2YgUmVjdXJzaXZlRXZhbHVhdGVhYmxlPFR5cGU+XSxcbiAgICAgICAgICAgIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgICAgIClcblxuICAgIHJldHVybiByZW1vdmVQcm94eVJlY3Vyc2l2ZWx5KHJlc29sdmUoYWRkUHJveHlSZWN1cnNpdmVseShvYmplY3QpKSkgYXMgVHlwZVxufVxuLyoqXG4gKiBTZWFyY2hlcyBmb3IgaW5kaWNhdGluZyBrZXlzIGFuZCByZXBsYWNlcyB0aGF0IGRhdGEgd2l0aCBjb3JyZXNwb25kaW5nXG4gKiBldmFsdWF0ZWQgYW5kIHByb21pc2UgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAcGFyYW0gZGF0YSAtIEdpdmVuIG1hcHBpbmcgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBldmFsdWF0aW9uLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5zY29wZSAtIFNjb3BlIHRvIHVzZSBldmFsdWF0ZSBhZ2Fpbi5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWUgLSBOYW1lIHRvIHVzZSBmb3IgcmVmZXJlbmNlIHRvIGdpdmVuXG4gKiBvYmplY3QuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHJldHVybnMgRXZhbHVhdGVkIGdpdmVuIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUFzeW5jRHluYW1pY0RhdGEgPSBhc3luYyA8VHlwZSA9IHVua25vd24+KFxuICAgIGRhdGE6IG51bGwgfCBSZWN1cnNpdmVBc3luY0V2YWx1YXRlYWJsZTxUeXBlPixcbiAgICBnaXZlbk9wdGlvbnM6IFBhcnRpYWw8RXZhbHVhdGVEeW5hbWljRGF0YU9wdGlvbnM+ID0ge31cbik6IFByb21pc2U8VHlwZT4gPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHNjb3BlOiB7fSxcbiAgICAgICAgc2VsZlJlZmVyZW5jZU5hbWU6ICdzZWxmJyxcbiAgICAgICAgZXhwcmVzc2lvbkluZGljYXRvcktleTogJ19fYXdhaXRfZXZhbHVhdGVfXycsXG4gICAgICAgIGV4ZWN1dGlvbkluZGljYXRvcktleTogJ19fYXdhaXRfZXhlY3V0ZV9fJyxcbiAgICAgICAgLi4uZ2l2ZW5PcHRpb25zXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChkYXRhKSlcbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgdW5rbm93biBhcyBUeXBlXG5cbiAgICBpZiAoIShvcHRpb25zLnNlbGZSZWZlcmVuY2VOYW1lIGluIG9wdGlvbnMuc2NvcGUpKVxuICAgICAgICBvcHRpb25zLnNjb3BlW29wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWVdID0gZGF0YVxuXG4gICAgY29uc3QgcmVzdWx0OiBUeXBlID0gZGF0YSBhcyBUeXBlXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgICAgICAocmVzdWx0IGFzIEFycmF5PHVua25vd24+KVtpbmRleF0gPSBhd2FpdCBldmFsdWF0ZUFzeW5jRHluYW1pY0RhdGEoXG4gICAgICAgICAgICAgICAgaXRlbSBhcyBudWxsIHwgUmVjdXJzaXZlQXN5bmNFdmFsdWF0ZWFibGU8VHlwZT4sIG9wdGlvbnNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICBpZiAoW1xuICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LCBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICBdLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXZhbHVhdGVPclRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgdmFsdWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IG9wdGlvbnMuc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlOiBrZXkgPT09IG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuXG4gICAgICAgIDsocmVzdWx0IGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPSBhd2FpdCBldmFsdWF0ZUFzeW5jRHluYW1pY0RhdGEoXG4gICAgICAgICAgICB2YWx1ZSBhcyBudWxsIHwgUmVjdXJzaXZlQXN5bmNFdmFsdWF0ZWFibGU8VHlwZT4sIG9wdGlvbnNcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogUmVtb3ZlcyBwcm9wZXJ0aWVzIGluIG9iamVjdHMgd2hlcmUgYSBkeW5hbWljIGluZGljYXRvciBsaXZlcy5cbiAqIEBwYXJhbSBkYXRhIC0gT2JqZWN0IHRvIHRyYXZlcnNlIHJlY3Vyc2l2ZWx5LlxuICogQHBhcmFtIGV4cHJlc3Npb25JbmRpY2F0b3JzIC0gUHJvcGVydHkga2V5IHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIEdpdmVuIG9iamVjdCB3aXRoIHJlbW92ZWQgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUtleXNJbkV2YWx1YXRpb24gPSA8XG4gICAgVCBleHRlbmRzIE1hcHBpbmc8dW5rbm93bj4gPSBNYXBwaW5nPHVua25vd24+XG4+KFxuICAgICAgICBkYXRhOiBULFxuICAgICAgICBleHByZXNzaW9uSW5kaWNhdG9yczogQXJyYXk8c3RyaW5nPiA9IFsnX19ldmFsdWF0ZV9fJywgJ19fZXhlY3V0ZV9fJ11cbiAgICApOiBUID0+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSlcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWV4cHJlc3Npb25JbmRpY2F0b3JzLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgIGV4cHJlc3Npb25JbmRpY2F0b3JzLnNvbWUoKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgbmFtZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgZGVsZXRlIChkYXRhIGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPilba2V5XVxuICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgICAgIHJlbW92ZUtleXNJbkV2YWx1YXRpb24odmFsdWUsIGV4cHJlc3Npb25JbmRpY2F0b3JzKVxuXG4gICAgcmV0dXJuIGRhdGFcbn1cbi8qKlxuICogRXh0ZW5kcyBnaXZlbiB0YXJnZXQgb2JqZWN0IHdpdGggZ2l2ZW4gc291cmNlcyBvYmplY3QuIEFzIHRhcmdldCBhbmRcbiAqIHNvdXJjZXMgbWFueSBleHBhbmRhYmxlIHR5cGVzIGFyZSBhbGxvd2VkIGJ1dCB0YXJnZXQgYW5kIHNvdXJjZXMgaGF2ZSB0b1xuICogY29tZSBmcm9tIHRoZSBzYW1lIHR5cGUuXG4gKiBAcGFyYW0gdGFyZ2V0T3JEZWVwSW5kaWNhdG9yIC0gTWF5YmUgdGhlIHRhcmdldCBvciBkZWVwIGluZGljYXRvci5cbiAqIEBwYXJhbSB0YXJnZXRPclNvdXJjZSAtIFRhcmdldCBvciBzb3VyY2Ugb2JqZWN0OyBkZXBlbmRpbmcgb24gZmlyc3RcbiAqIGFyZ3VtZW50LlxuICogQHBhcmFtIGFkZGl0aW9uYWxTb3VyY2VzIC0gU291cmNlIG9iamVjdHMgdG8gZXh0ZW5kIGludG8gdGFyZ2V0LlxuICogQHJldHVybnMgUmV0dXJucyBnaXZlbiB0YXJnZXQgZXh0ZW5kZWQgd2l0aCBhbGwgZ2l2ZW4gc291cmNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dGVuZCA9IDxUID0gTWFwcGluZzx1bmtub3duPj4oXG4gICAgdGFyZ2V0T3JEZWVwSW5kaWNhdG9yOiAoXG4gICAgICAgIGJvb2xlYW4gfCB0eXBlb2YgSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wgfCBSZWN1cnNpdmVQYXJ0aWFsPFQ+XG4gICAgKSxcbiAgICB0YXJnZXRPclNvdXJjZT86IG51bGwgfCBSZWN1cnNpdmVQYXJ0aWFsPFQ+LFxuICAgIC4uLmFkZGl0aW9uYWxTb3VyY2VzOiBBcnJheTxSZWN1cnNpdmVQYXJ0aWFsPFQ+PlxuKTogVCA9PiB7XG4gICAgbGV0IGRlZXA6IGJvb2xlYW4gfCB0eXBlb2YgSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wgPSBmYWxzZVxuICAgIGxldCBzb3VyY2VzOiBBcnJheTxSZWN1cnNpdmVQYXJ0aWFsPFQ+IHwgbnVsbD4gPSBhZGRpdGlvbmFsU291cmNlc1xuICAgIGxldCB0YXJnZXQ6IG51bGwgfCBSZWN1cnNpdmVQYXJ0aWFsPFQ+IHwgdW5kZWZpbmVkXG5cbiAgICBpZiAoXG4gICAgICAgIHRhcmdldE9yRGVlcEluZGljYXRvciA9PT0gSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wgfHxcbiAgICAgICAgdHlwZW9mIHRhcmdldE9yRGVlcEluZGljYXRvciA9PT0gJ2Jvb2xlYW4nXG4gICAgKSB7XG4gICAgICAgIC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24gYW5kIHNraXAgZGVlcCBpbmRpY2F0b3IgYW5kIHRhcmdldC5cbiAgICAgICAgZGVlcCA9IHRhcmdldE9yRGVlcEluZGljYXRvciBhc1xuICAgICAgICAgICAgYm9vbGVhbiB8IHR5cGVvZiBJR05PUkVfTlVMTF9BTkRfVU5ERUZJTkVEX1NZTUJPTFxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRPclNvdXJjZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldE9yRGVlcEluZGljYXRvclxuICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0T3JTb3VyY2UpKVxuICAgICAgICAgICAgc291cmNlcyA9IFt0YXJnZXRPclNvdXJjZSwgLi4uc291cmNlc11cbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0T3JTb3VyY2UgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldE9yU291cmNlXG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VWYWx1ZSA9IChcbiAgICAgICAgdGFyZ2V0VmFsdWU6IFZhbHVlT2Y8VD4sIHZhbHVlOiBWYWx1ZU9mPFQ+XG4gICAgKTogVmFsdWVPZjxUPiA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdGFyZ2V0VmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0VmFsdWVcblxuICAgICAgICAvLyBUcmF2ZXJzZSByZWN1cnNpdmVseSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgbWFwcy5cbiAgICAgICAgaWYgKGRlZXAgJiYgdmFsdWUgJiYgKGlzUGxhaW5PYmplY3QodmFsdWUpIHx8IGlzTWFwKHZhbHVlKSkpIHtcbiAgICAgICAgICAgIGxldCBjbG9uZTogVmFsdWVPZjxUPlxuICAgICAgICAgICAgaWYgKGlzTWFwKHZhbHVlKSlcbiAgICAgICAgICAgICAgICBjbG9uZSA9ICh0YXJnZXRWYWx1ZSAmJiBpc01hcCh0YXJnZXRWYWx1ZSkpID9cbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUgOlxuICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKCkgYXMgdW5rbm93biBhcyBWYWx1ZU9mPFQ+XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY2xvbmUgPSAodGFyZ2V0VmFsdWUgJiYgaXNQbGFpbk9iamVjdCh0YXJnZXRWYWx1ZSkpID9cbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUgOlxuICAgICAgICAgICAgICAgICAgICB7fSBhcyB1bmtub3duIGFzIFZhbHVlT2Y8VD5cblxuICAgICAgICAgICAgcmV0dXJuIGV4dGVuZChkZWVwLCBjbG9uZSBhcyBSZWN1cnNpdmVQYXJ0aWFsPFQ+LCB2YWx1ZSkgYXNcbiAgICAgICAgICAgICAgICBWYWx1ZU9mPFQ+XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgIGxldCB0YXJnZXRUeXBlOiBzdHJpbmcgPSB0eXBlb2YgdGFyZ2V0XG4gICAgICAgIGxldCBzb3VyY2VUeXBlOiBzdHJpbmcgPSB0eXBlb2Ygc291cmNlXG5cbiAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpXG4gICAgICAgICAgICB0YXJnZXRUeXBlICs9ICcgTWFwJ1xuICAgICAgICBpZiAoaXNNYXAoc291cmNlKSlcbiAgICAgICAgICAgIHNvdXJjZVR5cGUgKz0gJyBNYXAnXG5cbiAgICAgICAgaWYgKHRhcmdldFR5cGUgPT09IHNvdXJjZVR5cGUgJiYgdGFyZ2V0ICE9PSBzb3VyY2UpXG4gICAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSAmJiBpc01hcChzb3VyY2UpKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZSlcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldChrZXkpIGFzIFZhbHVlT2Y8VD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgVmFsdWVPZjxUPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBpc09iamVjdCh0YXJnZXQpICYmICFBcnJheS5pc0FycmF5KHRhcmdldCkgJiZcbiAgICAgICAgICAgICAgICAhKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiB0YXJnZXQgaW5zdGFuY2VvZiBCbG9iKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHNvdXJjZSkgJiYgIUFycmF5LmlzQXJyYXkoc291cmNlKSAmJlxuICAgICAgICAgICAgICAgICEodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIHNvdXJjZSBpbnN0YW5jZW9mIEJsb2IpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIShcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZXAgPT09IElHTk9SRV9OVUxMX0FORF9VTkRFRklORURfU1lNQk9MICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyh2YWx1ZSBhcyBudWxsKVxuICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXSA9IG1lcmdlVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXSBhcyBWYWx1ZU9mPFQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIFZhbHVlT2Y8VD5cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHNvdXJjZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YXJnZXQgPSBzb3VyY2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0IGFzIFRcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcHJveHkgaGFuZGxlciB3aGljaCBmb3J3YXJkcyBhbGwgb3BlcmF0aW9ucyB0byBnaXZlbiBvYmplY3RcbiAqIGFzIHRoZXJlIHdvdWxkbid0IGJlIGEgcHJveHkuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gT2JqZWN0IHRvIHByb3h5LlxuICogQHBhcmFtIG1ldGhvZE5hbWVzIC0gTWFwcGluZyBvZiBvcGVyYW5kIG5hbWUgdG8gb2JqZWN0IHNwZWNpZmljIG1ldGhvZFxuICogbmFtZS5cbiAqIEByZXR1cm5zIERldGVybWluZWQgcHJveHkgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByb3h5SGFuZGxlciA9IDxUID0gdW5rbm93bj4oXG4gICAgdGFyZ2V0OiBULCBtZXRob2ROYW1lczogTWFwcGluZyA9IHt9XG4pOiBQcm94eUhhbmRsZXI8VD4gPT4ge1xuICAgIG1ldGhvZE5hbWVzID0ge1xuICAgICAgICBkZWxldGU6ICdbXScsXG4gICAgICAgIGdldDogJ1tdJyxcbiAgICAgICAgaGFzOiAnW10nLFxuICAgICAgICBzZXQ6ICdbXScsXG4gICAgICAgIC4uLm1ldGhvZE5hbWVzXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVsZXRlUHJvcGVydHk6IChfdGFyZ2V0T2JqZWN0OiBULCBrZXk6IHN0cmluZyB8IHN5bWJvbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzLmRlbGV0ZSA9PT0gJ1tdJyAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2ROYW1lcy5kZWxldGUgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4gYm9vbGVhblxuICAgICAgICAgICAgICAgICkoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBnZXQ6IChfdGFyZ2V0T2JqZWN0OiBULCBrZXk6IHN0cmluZyB8IHN5bWJvbCk6IHVua25vd24gPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzLmdldCA9PT0gJ1tdJyAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleSBhcyBrZXlvZiBUXVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2ROYW1lcy5nZXQgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcgfCBzeW1ib2wpID0+IHVua25vd25cbiAgICAgICAgICAgICkoa2V5KVxuICAgICAgICB9LFxuICAgICAgICBoYXM6IChfdGFyZ2V0T2JqZWN0OiBULCBrZXk6IHN0cmluZyB8IHN5bWJvbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzLmhhcyA9PT0gJ1tdJylcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5IGluICh0YXJnZXQgYXMgb2JqZWN0KVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2ROYW1lcy5oYXMgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcgfCBzeW1ib2wpID0+IGJvb2xlYW5cbiAgICAgICAgICAgICkoa2V5KVxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChcbiAgICAgICAgICAgIF90YXJnZXRPYmplY3Q6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93blxuICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGlmIChtZXRob2ROYW1lcy5zZXQgPT09ICdbXScgJiYgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXSA9IHZhbHVlIGFzIFRba2V5b2YgVF1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRhcmdldFttZXRob2ROYW1lcy5zZXQgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pID0+IGJvb2xlYW5cbiAgICAgICAgICAgICAgICApKGtleSwgdmFsdWUpXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFNsaWNlcyBhbGwgcHJvcGVydGllcyBmcm9tIGdpdmVuIG9iamVjdCB3aGljaCBkb2VzIG5vdCBtYXRjaCBwcm92aWRlZFxuICogb2JqZWN0IG1hc2suIEl0ZW1zIGNhbiBiZSBleHBsaWNpdGx5IHdoaXRlbGlzdGVkIHZpYSBcImluY2x1ZGVcIiBtYXNrXG4gKiBjb25maWd1cmF0aW9uIG9yIGJsYWNrIGxpc3RlZCB2aWEgXCJleGNsdWRlXCIgbWFzayBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBzbGljZS5cbiAqIEBwYXJhbSBtYXNrQ29uZmlndXJhdGlvbiAtIE1hc2sgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIEdpdmVuIGJ1dCBzbGljZWQgb2JqZWN0LiBJZiAobmVzdGVkKSBvYmplY3Qgd2lsbCBiZSBtb2RpZmllZCBhXG4gKiBmbGF0IGNvcHkgb2YgdGhhdCBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1hc2sgPSA8VHlwZSBleHRlbmRzIE1hcHBpbmc8dW5rbm93bj4gPSBNYXBwaW5nPHVua25vd24+PihcbiAgICBvYmplY3Q6IFR5cGUsIG1hc2tDb25maWd1cmF0aW9uOiBPYmplY3RNYXNrQ29uZmlndXJhdGlvblxuKTogUmVjdXJzaXZlUGFydGlhbDxUeXBlPiA9PiB7XG4gICAgbWFza0NvbmZpZ3VyYXRpb24gPSB7ZXhjbHVkZTogZmFsc2UsIGluY2x1ZGU6IHRydWUsIC4uLm1hc2tDb25maWd1cmF0aW9ufVxuXG4gICAgaWYgKFxuICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5leGNsdWRlID09PSB0cnVlIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkobWFza0NvbmZpZ3VyYXRpb24uZXhjbHVkZSkgJiZcbiAgICAgICAgbWFza0NvbmZpZ3VyYXRpb24uZXhjbHVkZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgbWFza0NvbmZpZ3VyYXRpb24uaW5jbHVkZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCdcbiAgICApXG4gICAgICAgIHJldHVybiB7fVxuXG4gICAgY29uc3QgZXhjbHVkZTogTm9ybWFsaXplZE9iamVjdE1hc2sgPVxuICAgICAgICBBcnJheS5pc0FycmF5KG1hc2tDb25maWd1cmF0aW9uLmV4Y2x1ZGUpID9cbiAgICAgICAgICAgIG1hc2tDb25maWd1cmF0aW9uLmV4Y2x1ZGUucmVkdWNlKFxuICAgICAgICAgICAgICAgIChtYXNrLCBrZXkpID0+ICh7Li4ubWFzaywgW2tleV06IHRydWV9KSxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5leGNsdWRlIGFzIE5vcm1hbGl6ZWRPYmplY3RNYXNrXG4gICAgY29uc3QgaW5jbHVkZTogTm9ybWFsaXplZE9iamVjdE1hc2sgPVxuICAgICAgICBBcnJheS5pc0FycmF5KG1hc2tDb25maWd1cmF0aW9uLmluY2x1ZGUpID9cbiAgICAgICAgICAgIG1hc2tDb25maWd1cmF0aW9uLmluY2x1ZGUucmVkdWNlKFxuICAgICAgICAgICAgICAgIChtYXNrLCBrZXkpID0+ICh7Li4ubWFzaywgW2tleV06IHRydWV9KSxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5pbmNsdWRlIGFzIE5vcm1hbGl6ZWRPYmplY3RNYXNrXG5cbiAgICBsZXQgcmVzdWx0OiBQYXJ0aWFsPFR5cGU+ID0ge31cbiAgICBpZiAoaXNQbGFpbk9iamVjdChpbmNsdWRlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbmNsdWRlKSlcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBUeXBlXSA9IG9iamVjdFtrZXkgYXMga2V5b2YgVHlwZV1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBvYmplY3Rba2V5IGFzIGtleW9mIFR5cGVdID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdCBhcyBNYXBwaW5nPE1hcHBpbmc8dW5rbm93bj4+KVtrZXldID0gbWFzayhcbiAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3QgYXMgTWFwcGluZzxNYXBwaW5nPHVua25vd24+Pilba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpbmNsdWRlOiB2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgIH0gZWxzZVxuICAgICAgICAvLyBJbiB0aGlzIGJyYW5jaCBcIm1hc2suaW5jbHVkZSA9PT0gdHJ1ZVwiIGhvbGRzLlxuICAgICAgICByZXN1bHQgPSBvYmplY3RcblxuICAgIGlmIChpc1BsYWluT2JqZWN0KGV4Y2x1ZGUpKSB7XG4gICAgICAgIGxldCB1c2VDb3B5ID0gZmFsc2VcbiAgICAgICAgY29uc3QgY29weTogUmVjdXJzaXZlUGFydGlhbDxUeXBlPiA9IHsuLi5yZXN1bHR9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhjbHVkZSkpXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGtleSkpXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZUNvcHkgPSB0cnVlXG5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvcHlba2V5IGFzIGtleW9mIFR5cGVdXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjb3B5W2tleSBhcyBrZXlvZiBUeXBlXSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudDogVmFsdWVPZjxUeXBlPiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2tleSBhcyBrZXlvZiBUeXBlXSBhcyBWYWx1ZU9mPFR5cGU+XG5cbiAgICAgICAgICAgICAgICAgICAgOyhjb3B5IGFzIE1hcHBpbmc8TWFwcGluZzx1bmtub3duPj4pW2tleV0gPSBtYXNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvcHkgYXMgTWFwcGluZzxNYXBwaW5nPHVua25vd24+Pilba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtleGNsdWRlOiB2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlba2V5IGFzIGtleW9mIFR5cGVdIGFzIFZhbHVlT2Y8VHlwZT4gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNvcHkgPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VDb3B5KVxuICAgICAgICAgICAgcmVzdWx0ID0gY29weVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogTW9kaWZpZXMgZ2l2ZW4gdGFyZ2V0IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gc291cmNlIGFuZCByZW1vdmVzIHNvdXJjZVxuICogbW9kaWZpY2F0aW9uIGluZm9zLlxuICogQHBhcmFtIHRhcmdldCAtIE9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gc291cmNlIC0gU291cmNlIG9iamVjdCB0byBsb2FkIG1vZGlmaWNhdGlvbnMgZnJvbS5cbiAqIEBwYXJhbSByZW1vdmVJbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSBvciB2YWx1ZSB0byBtYXJrIGFcbiAqIHZhbHVlIHRvIHJlbW92ZSBmcm9tIG9iamVjdCBvciBsaXN0LlxuICogQHBhcmFtIHByZXBlbmRJbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrIGEgdmFsdWUgdG9cbiAqIHByZXBlbmQgdG8gdGFyZ2V0IGxpc3QuXG4gKiBAcGFyYW0gYXBwZW5kSW5kaWNhdG9yS2V5IC0gSW5kaWNhdG9yIHByb3BlcnR5IG5hbWUgdG8gbWFyayBhIHZhbHVlIHRvXG4gKiBhcHBlbmQgdG8gdGFyZ2V0IGxpc3QuXG4gKiBAcGFyYW0gcG9zaXRpb25QcmVmaXggLSBJbmRpY2F0ZXMgYSBwcmVmaXggdG8gdXNlIGEgdmFsdWUgb24gZ2l2ZW5cbiAqIHBvc2l0aW9uIHRvIGFkZCBvciByZW1vdmUuXG4gKiBAcGFyYW0gcG9zaXRpb25TdWZmaXggLSBJbmRpY2F0ZXMgYSBzdWZmaXggdG8gdXNlIGEgdmFsdWUgb24gZ2l2ZW5cbiAqIHBvc2l0aW9uIHRvIGFkZCBvciByZW1vdmUuXG4gKiBAcGFyYW0gcGFyZW50U291cmNlIC0gU291cmNlIGNvbnRleHQgdG8gcmVtb3ZlIG1vZGlmaWNhdGlvbiBpbmZvIGZyb21cbiAqICh1c3VhbGx5IG9ubHkgbmVlZGVkIGludGVybmFsbHkpLlxuICogQHBhcmFtIHBhcmVudEtleSAtIFNvdXJjZSBrZXkgaW4gZ2l2ZW4gc291cmNlIGNvbnRleHQgdG8gcmVtb3ZlXG4gKiBtb2RpZmljYXRpb24gaW5mbyBmcm9tICh1c3VhbGx5IG9ubHkgbmVlZGVkIGludGVybmFsbHkpLlxuICogQHJldHVybnMgR2l2ZW4gdGFyZ2V0IG1vZGlmaWVkIHdpdGggZ2l2ZW4gc291cmNlLlxuICovXG5leHBvcnQgY29uc3QgbW9kaWZ5T2JqZWN0ID0gPFQgPSB1bmtub3duPihcbiAgICB0YXJnZXQ6IFQsXG4gICAgc291cmNlOiB1bmtub3duLFxuICAgIHJlbW92ZUluZGljYXRvcktleSA9ICdfX3JlbW92ZV9fJyxcbiAgICBwcmVwZW5kSW5kaWNhdG9yS2V5ID0gJ19fcHJlcGVuZF9fJyxcbiAgICBhcHBlbmRJbmRpY2F0b3JLZXkgPSAnX19hcHBlbmRfXycsXG4gICAgcG9zaXRpb25QcmVmaXggPSAnX18nLFxuICAgIHBvc2l0aW9uU3VmZml4ID0gJ19fJyxcbiAgICBwYXJlbnRTb3VyY2U6IHVua25vd24gPSBudWxsLFxuICAgIHBhcmVudEtleTogdW5rbm93biA9IG51bGxcbik6IFQgPT4ge1xuICAgIGlmIChpc01hcChzb3VyY2UpICYmIGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc291cmNlKVxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICBtb2RpZnlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXQoa2V5KSBhcyBWYWx1ZU9mPFQ+LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBNYXA8dW5rbm93biwgdW5rbm93bj4gfCBNYXBwaW5nPHVua25vd24+IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBwcmVwZW5kSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJlZml4LFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblN1ZmZpeCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICApXG4gICAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpICYmIGlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgc291cmNlVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IE5hTlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgIGtleS5zdGFydHNXaXRoKHBvc2l0aW9uUHJlZml4KSAmJlxuICAgICAgICAgICAgICAgIGtleS5lbmRzV2l0aChwb3NpdGlvblN1ZmZpeClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gcGFyc2VJbnQoXG4gICAgICAgICAgICAgICAgICAgIGtleS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblByZWZpeC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU3VmZml4Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gTmFOXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBbcmVtb3ZlSW5kaWNhdG9yS2V5LCBwcmVwZW5kSW5kaWNhdG9yS2V5LCBhcHBlbmRJbmRpY2F0b3JLZXldXG4gICAgICAgICAgICAgICAgICAgIC5pbmNsdWRlcyhrZXkpIHx8XG4gICAgICAgICAgICAgICAgIWlzTmFOKGluZGV4KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcmVtb3ZlSW5kaWNhdG9yS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXM6IEFycmF5PHVua25vd24+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoW10gYXMgQXJyYXk8dW5rbm93bj4pLmNvbmNhdChzb3VyY2VWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdGFydHNXaXRoKHBvc2l0aW9uUHJlZml4KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5lbmRzV2l0aChwb3NpdGlvblN1ZmZpeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zcGxpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJlZml4Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25TdWZmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldC5pbmNsdWRlcyh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zcGxpY2UodGFyZ2V0LmluZGV4T2YodmFsdWUpLCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDwgdGFyZ2V0Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNwbGljZSh2YWx1ZSwgMSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IGFwcGVuZEluZGljYXRvcktleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5jb25jYXQoc291cmNlVmFsdWUpIGFzIHVua25vd24gYXMgVFxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IHByZXBlbmRJbmRpY2F0b3JLZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAoW10gYXMgQXJyYXk8dW5rbm93bj4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChzb3VyY2VWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHRhcmdldCkgYXMgdW5rbm93biBhcyBUXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KHRhcmdldFtpbmRleF0pICYmIGlzT2JqZWN0KHNvdXJjZVZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2luZGV4XSBhcyBSZWN1cnNpdmVQYXJ0aWFsPFZhbHVlT2Y8VD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VWYWx1ZSBhcyBSZWN1cnNpdmVQYXJ0aWFsPFZhbHVlT2Y8VD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmRJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25QcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU3VmZml4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdIGFzIFJlY3Vyc2l2ZVBhcnRpYWw8VmFsdWVPZjxUPj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVmFsdWUgYXMgUmVjdXJzaXZlUGFydGlhbDxWYWx1ZU9mPFQ+PlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdID0gc291cmNlVmFsdWUgYXMgVmFsdWVPZjxUPlxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gcmVtb3ZlSW5kaWNhdG9yS2V5KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIChbXSBhcyBBcnJheTx1bmtub3duPikuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApW3ZhbHVlXVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2Vba2V5XVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFNvdXJjZSAmJiB0eXBlb2YgcGFyZW50S2V5ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNvdXJjZSBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgIClbcGFyZW50S2V5XVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKHRhcmdldCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICBtb2RpZnlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0IGFzIHVua25vd24gYXMgTWFwcGluZzxWYWx1ZU9mPFQ+Pilba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJlZml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25TdWZmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0XG59XG4vKipcbiAqIFJlbW92ZXMgZ2l2ZW4ga2V5IGZyb20gZ2l2ZW4gb2JqZWN0IHJlY3Vyc2l2ZWx5LlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBwcm9jZXNzLlxuICogQHBhcmFtIGtleXMgLSBMaXN0IG9mIGtleXMgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgUHJvY2Vzc2VkIGdpdmVuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUtleVByZWZpeGVzID0gPFQ+KFxuICAgIG9iamVjdDogVCwga2V5czogQXJyYXk8c3RyaW5nPiB8IHN0cmluZyA9ICcjJ1xuKTogVCA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRLZXlzOiBBcnJheTxzdHJpbmc+ID0gKFtdIGFzIEFycmF5PHN0cmluZz4pLmNvbmNhdChrZXlzKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgIGZvciAoY29uc3Qgc3ViT2JqZWN0IG9mIG9iamVjdC5zbGljZSgpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1Yk9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZEtleXMpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJPYmplY3Quc3RhcnRzV2l0aChgJHtrZXl9OmApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGFzIEFycmF5PHN0cmluZz4pLnNwbGljZShpbmRleCwgMSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChza2lwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAob2JqZWN0IGFzIEFycmF5PHVua25vd24+KVtpbmRleF0gPVxuICAgICAgICAgICAgICAgIHJlbW92ZUtleVByZWZpeGVzKHN1Yk9iamVjdCwgcmVzb2x2ZWRLZXlzKVxuXG4gICAgICAgICAgICBpbmRleCArPSAxXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU2V0KG9iamVjdCkpXG4gICAgICAgIGZvciAoY29uc3Qgc3ViT2JqZWN0IG9mIG5ldyBTZXQob2JqZWN0KSkge1xuICAgICAgICAgICAgbGV0IHNraXAgPSBmYWxzZVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1Yk9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZEtleXMpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJPYmplY3Quc3RhcnRzV2l0aChgJHtrZXl9OmApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGVsZXRlKHN1Yk9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2tpcClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVtb3ZlS2V5UHJlZml4ZXMoc3ViT2JqZWN0LCByZXNvbHZlZEtleXMpXG4gICAgICAgIH1cbiAgICBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHN1Yk9iamVjdF0gb2YgbmV3IE1hcChvYmplY3QpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZWRLZXkgb2YgcmVzb2x2ZWRLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWRLZXkgPSBlc2NhcGVSZWd1bGFyRXhwcmVzc2lvbnMocmVzb2x2ZWRLZXkpXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXcgUmVnRXhwKGBeJHtlc2NhcGVkS2V5fVswLTldKiRgKS50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUoa2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2tpcClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2JqZWN0LnNldChrZXksIHJlbW92ZUtleVByZWZpeGVzKHN1Yk9iamVjdCwgcmVzb2x2ZWRLZXlzKSlcbiAgICAgICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSwgb2JqZWN0XG4gICAgICAgICkpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZWRLZXkgb2YgcmVzb2x2ZWRLZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZEtleTogc3RyaW5nID0gZXNjYXBlUmVndWxhckV4cHJlc3Npb25zKHJlc29sdmVkS2V5KVxuXG4gICAgICAgICAgICAgICAgaWYgKG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRLZXl9WzAtOV0qJGApLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKG9iamVjdCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV1cbiAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChza2lwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIDsob2JqZWN0IGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPilba2V5XSA9XG4gICAgICAgICAgICAgICAgcmVtb3ZlS2V5UHJlZml4ZXModmFsdWUsIHJlc29sdmVkS2V5cylcbiAgICAgICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyoqXG4gKiBSZXByZXNlbnRzIGdpdmVuIG9iamVjdCBhcyBmb3JtYXR0ZWQgc3RyaW5nLlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byByZXByZXNlbnQuXG4gKiBAcGFyYW0gbWF4aW11bUxlbmd0aE9mTGlzdHMgLSBNYXhpbXVtIG51bWJlciBvZiBhcnJheSBpdGVtIHRvIHJlbmRlci5cbiAqIEBwYXJhbSBpbmRlbnRpb24gLSBTdHJpbmcgKHVzdWFsbHkgd2hpdGVzcGFjZXMpIHRvIHVzZSBhcyBpbmRlbnRpb24uXG4gKiBAcGFyYW0gaW5pdGlhbEluZGVudGlvbiAtIFN0cmluZyAodXN1YWxseSB3aGl0ZXNwYWNlcykgdG8gdXNlIGFzXG4gKiBhZGRpdGlvbmFsIGluZGVudGlvbiBmb3IgdGhlIGZpcnN0IG9iamVjdCB0cmF2ZXJzaW5nIGxldmVsLlxuICogQHBhcmFtIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyIC0gUmVwbGFjZW1lbnQgZm9yIG9iamVjdHNcbiAqIHdoaWNoIGFyZSBvdXQgb2Ygc3BlY2lmaWVkIGJvdW5kcyB0byB0cmF2ZXJzZS5cbiAqIEBwYXJhbSBudW1iZXJPZkxldmVscyAtIFNwZWNpZmllcyBudW1iZXIgb2YgbGV2ZWxzIHRvIHRyYXZlcnNlIGdpdmVuXG4gKiBkYXRhIHN0cnVjdHVyZS5cbiAqIEByZXR1cm5zIFJlcHJlc2VudGF0aW9uIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcHJlc2VudCA9IChcbiAgICBvYmplY3Q6IHVua25vd24sXG4gICAgbWF4aW11bUxlbmd0aE9mTGlzdHMgPSAzMCxcbiAgICBpbmRlbnRpb24gPSAnICAgICcsXG4gICAgaW5pdGlhbEluZGVudGlvbiA9ICcnLFxuICAgIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcgPVxuICAgICdfX21heGltdW1fbnVtYmVyX29mX2xldmVsc19yZWFjaGVkX18nLFxuICAgIG51bWJlck9mTGV2ZWxzID0gOFxuKTogc3RyaW5nID0+IHtcbiAgICBpZiAobnVtYmVyT2ZMZXZlbHMgPT09IDApXG4gICAgICAgIHJldHVybiBTdHJpbmcobWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIpXG5cbiAgICBpZiAob2JqZWN0ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJ251bGwnXG5cbiAgICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJ1xuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gYFwiJHtvYmplY3QucmVwbGFjZSgvXFxuL2csIGBcXG4ke2luaXRpYWxJbmRlbnRpb259YCl9XCJgXG5cbiAgICBpZiAoaXNOdW1lcmljKG9iamVjdCkgfHwgdHlwZW9mIG9iamVjdCA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICByZXR1cm4gU3RyaW5nKG9iamVjdClcblxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKClcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICdbJ1xuXG4gICAgICAgIGxldCBmaXJzdFNlZW4gPSBmYWxzZVxuICAgICAgICBsZXQgY291bnRlciA9IDFcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIgPiBtYXhpbXVtTGVuZ3RoT2ZMaXN0cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbml0aWFsSW5kZW50aW9ufS4uLmBcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RTZWVuKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCdcblxuICAgICAgICAgICAgcmVzdWx0ICs9XG4gICAgICAgICAgICAgICAgYFxcbiR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gICtcbiAgICAgICAgICAgICAgICByZXByZXNlbnQoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1MZW5ndGhPZkxpc3RzLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRpb24sXG4gICAgICAgICAgICAgICAgICAgIGAke2luaXRpYWxJbmRlbnRpb259JHtpbmRlbnRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlck9mTGV2ZWxzIC0gMVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgZmlyc3RTZWVuID0gdHJ1ZVxuXG4gICAgICAgICAgICBjb3VudGVyICs9IDFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICByZXN1bHQgKz0gYFxcbiR7aW5pdGlhbEluZGVudGlvbn1gXG5cbiAgICAgICAgcmVzdWx0ICs9ICddJ1xuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBpZiAoaXNNYXAob2JqZWN0KSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gJydcblxuICAgICAgICBsZXQgZmlyc3RTZWVuID0gZmFsc2VcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAxXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoY291bnRlciA+IG1heGltdW1MZW5ndGhPZkxpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGAsXFxuJHtpbml0aWFsSW5kZW50aW9ufS4uLmBcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RTZWVuKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgLFxcbiR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gXG5cbiAgICAgICAgICAgIHJlc3VsdCArPVxuICAgICAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTGVuZ3RoT2ZMaXN0cyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50aW9uLFxuICAgICAgICAgICAgICAgICAgICBgJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkxldmVscyAtIDFcbiAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAnIC0+ICcgK1xuICAgICAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bUxlbmd0aE9mTGlzdHMsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudGlvbixcbiAgICAgICAgICAgICAgICAgICAgYCR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZMZXZlbHNSZWFjaGVkSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZMZXZlbHMgLSAxXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmaXJzdFNlZW4gPSB0cnVlXG5cbiAgICAgICAgICAgIGNvdW50ZXIgKz0gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaXJzdFNlZW4pXG4gICAgICAgICAgICByZXN1bHQgPSAnRW1wdHlNYXAnXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSAneydcblxuICAgICAgICBsZXQgZmlyc3RTZWVuID0gZmFsc2VcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAxXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyID4gbWF4aW11bUxlbmd0aE9mTGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYCxcXG4ke2luaXRpYWxJbmRlbnRpb259Li4uYFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJ1xuXG4gICAgICAgICAgICByZXN1bHQgKz1cbiAgICAgICAgICAgICAgICBgXFxuJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAgK1xuICAgICAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bUxlbmd0aE9mTGlzdHMsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudGlvbixcbiAgICAgICAgICAgICAgICAgICAgYCR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZMZXZlbHNSZWFjaGVkSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZMZXZlbHMgLSAxXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmaXJzdFNlZW4gPSB0cnVlXG5cbiAgICAgICAgICAgIGNvdW50ZXIgKz0gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpcnN0U2VlbilcbiAgICAgICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbml0aWFsSW5kZW50aW9ufX1gXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdCA9ICdFbXB0eVNldCdcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqZWN0KSlcbiAgICAgICAgcmV0dXJuICdfX2Z1bmN0aW9uX18nXG5cbiAgICBsZXQgcmVzdWx0ID0gJ3snXG4gICAgY29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkuc29ydCgpXG4gICAgbGV0IGZpcnN0U2VlbiA9IGZhbHNlXG4gICAgbGV0IGNvdW50ZXIgPSAxXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAoY291bnRlciA+IG1heGltdW1MZW5ndGhPZkxpc3RzKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYCxcXG4ke2luaXRpYWxJbmRlbnRpb259Li4uYFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICByZXN1bHQgKz0gJywnXG5cbiAgICAgICAgcmVzdWx0ICs9XG4gICAgICAgICAgICBgXFxuJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufSR7a2V5fTogYCArXG4gICAgICAgICAgICByZXByZXNlbnQoXG4gICAgICAgICAgICAgICAgKG9iamVjdCBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldLFxuICAgICAgICAgICAgICAgIG1heGltdW1MZW5ndGhPZkxpc3RzLFxuICAgICAgICAgICAgICAgIGluZGVudGlvbixcbiAgICAgICAgICAgICAgICBgJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAsXG4gICAgICAgICAgICAgICAgbWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZMZXZlbHMgLSAxXG4gICAgICAgICAgICApXG5cbiAgICAgICAgZmlyc3RTZWVuID0gdHJ1ZVxuXG4gICAgICAgIGNvdW50ZXIgKz0gMVxuICAgIH1cblxuICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbml0aWFsSW5kZW50aW9ufWBcblxuICAgIHJlc3VsdCArPSAnfSdcblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogU29ydCBnaXZlbiBvYmplY3RzIGtleXMuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHdoaWNoIGtleXMgc2hvdWxkIGJlIHNvcnRlZC5cbiAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIGdpdmVuIGtleXMuXG4gKi9cbmV4cG9ydCBjb25zdCBzb3J0ID0gKG9iamVjdDogdW5rbm93bik6IEFycmF5PHVua25vd24+ID0+IHtcbiAgICBjb25zdCBrZXlzOiBBcnJheTx1bmtub3duPiA9IFtdXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqZWN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICAgICAgICAgIGtleXMucHVzaChpbmRleClcbiAgICBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JylcbiAgICAgICAgaWYgKGlzTWFwKG9iamVjdCkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleVZhbHVlUGFpciBvZiBvYmplY3QpXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleVZhbHVlUGFpclswXSlcbiAgICAgICAgZWxzZSBpZiAob2JqZWN0ICE9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqZWN0KSlcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KVxuXG4gICAgcmV0dXJuIGtleXMuc29ydCgpXG59XG4vKipcbiAqIFJlbW92ZXMgYSBwcm94eSBmcm9tIGdpdmVuIGRhdGEgc3RydWN0dXJlIHJlY3Vyc2l2ZWx5LlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBwcm94eS5cbiAqIEBwYXJhbSBzZWVuT2JqZWN0cyAtIFRyYWNrcyBhbGwgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0cyB0byBhdm9pZFxuICogZW5kbGVzcyBsb29wcyAodXN1YWxseSBvbmx5IG5lZWRlZCBmb3IgaW50ZXJuYWwgcHVycG9zZSkuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGdpdmVuIG9iamVjdCB1bndyYXBwZWQgZnJvbSBhIGR5bmFtaWMgcHJveHkuXG4gKi9cbmV4cG9ydCBjb25zdCB1bndyYXBQcm94eSA9IDxUID0gdW5rbm93bj4oXG4gICAgb2JqZWN0OiBQcm94eVR5cGU8VD4gfCBULCBzZWVuT2JqZWN0czogU2V0PHVua25vd24+ID0gbmV3IFNldDx1bmtub3duPigpXG4pOiBUID0+IHtcbiAgICBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICBpZiAoc2Vlbk9iamVjdHMuaGFzKG9iamVjdCkpXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKG9iamVjdC5fX3Jldm9rZV9fKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb3h5KG9iamVjdCkpXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5fX3RhcmdldF9fXG5cbiAgICAgICAgICAgICAgICA7KG9iamVjdCBhcyB1bmtub3duIGFzIHtfX3Jldm9rZV9fOiAoKSA9PiB2b2lkfSkuX19yZXZva2VfXygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdFxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2Vlbk9iamVjdHMuYWRkKG9iamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2luZGV4XSA9IHVud3JhcFByb3h5KHZhbHVlLCBzZWVuT2JqZWN0cylcblxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqZWN0KVxuICAgICAgICAgICAgICAgIG9iamVjdC5zZXQoa2V5LCB1bndyYXBQcm94eSh2YWx1ZSwgc2Vlbk9iamVjdHMpKVxuICAgICAgICBlbHNlIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZTogQXJyYXk8dW5rbm93bj4gPSBbXVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUodmFsdWUpXG4gICAgICAgICAgICAgICAgY2FjaGUucHVzaCh1bndyYXBQcm94eSh2YWx1ZSwgc2Vlbk9iamVjdHMpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlKVxuICAgICAgICAgICAgICAgIG9iamVjdC5hZGQodmFsdWUpXG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICAgICAgb2JqZWN0IGFzIHVua25vd24gYXMgb2JqZWN0XG4gICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgIG9iamVjdFtrZXkgYXMga2V5b2YgVF0gPVxuICAgICAgICAgICAgICAgICAgICB1bndyYXBQcm94eSh2YWx1ZSwgc2Vlbk9iamVjdHMpIGFzIFZhbHVlT2Y8VD5cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUNBLFNBQ0kscUJBQXFCLEVBQUUsZ0NBQWdDLEVBQUUsaUJBQWlCO0FBRTlFLFNBQ0ksVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUztBQUV6RSxTQUFRLFlBQVk7QUFDcEIsU0FBUSx3QkFBd0IsRUFBRSxvQkFBb0I7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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
991
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL29iamVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAjIS91c3IvYmluL2VudiBiYWJlbC1ub2RlXG4vLyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbi8qKiBAbW9kdWxlIG9iamVjdCAqL1xuJ3VzZSBzdHJpY3QnXG4vKiAhXG4gICAgcmVnaW9uIGhlYWRlclxuICAgIFtQcm9qZWN0IHBhZ2VdKGh0dHBzOi8vdG9yYmVuLndlYnNpdGUvY2xpZW50bm9kZSlcblxuICAgIENvcHlyaWdodCBUb3JiZW4gU2lja2VydCAoaW5mb1tcIn5hdH5cIl10b3JiZW4ud2Vic2l0ZSkgMTYuMTIuMjAxMlxuXG4gICAgTGljZW5zZVxuICAgIC0tLS0tLS1cblxuICAgIFRoaXMgbGlicmFyeSB3cml0dGVuIGJ5IFRvcmJlbiBTaWNrZXJ0IHN0YW5kcyB1bmRlciBhIGNyZWF0aXZlIGNvbW1vbnNcbiAgICBuYW1pbmcgMy4wIHVucG9ydGVkIGxpY2Vuc2UuXG4gICAgU2VlIGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvZGVlZC5kZVxuICAgIGVuZHJlZ2lvblxuKi9cbmltcG9ydCB0eXBlIHtcbiAgICBBbnlGdW5jdGlvbixcbiAgICBDb21wYXJlT3B0aW9ucyxcbiAgICBFdmFsdWF0ZUR5bmFtaWNEYXRhT3B0aW9ucyxcbiAgICBHZXR0ZXJGdW5jdGlvbixcbiAgICBNYXBwaW5nLFxuICAgIE5vcm1hbGl6ZWRPYmplY3RNYXNrLFxuICAgIE9iamVjdE1hc2tDb25maWd1cmF0aW9uLFxuICAgIFBsYWluT2JqZWN0LFxuICAgIFByb3h5SGFuZGxlcixcbiAgICBQcm94eVR5cGUsXG4gICAgUmVjdXJzaXZlQXN5bmNFdmFsdWF0ZWFibGUsXG4gICAgUmVjdXJzaXZlRXZhbHVhdGVhYmxlLFxuICAgIFJlY3Vyc2l2ZVBhcnRpYWwsXG4gICAgU2V0dGVyRnVuY3Rpb24sXG4gICAgVW5rbm93bkZ1bmN0aW9uLFxuICAgIFZhbHVlT2Zcbn0gZnJvbSAnLi90eXBlJ1xuXG5pbXBvcnQge1xuICAgIENMQVNTX1RPX1RZUEVfTUFQUElORywgSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wsIFZBTFVFX0NPUFlfU1lNQk9MXG59IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHtcbiAgICBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNQbGFpbk9iamVjdCwgaXNNYXAsIGlzUHJveHksIGlzU2V0LCBpc051bWVyaWNcbn0gZnJvbSAnLi9pbmRpY2F0b3JzJ1xuaW1wb3J0IHtpc05vdEFOdW1iZXJ9IGZyb20gJy4vbnVtYmVyJ1xuaW1wb3J0IHtlc2NhcGVSZWd1bGFyRXhwcmVzc2lvbnMsIGV2YWx1YXRlT3JUaHJvd0Vycm9yfSBmcm9tICcuL3N0cmluZydcblxuLyoqXG4gKiBBZGRzIGR5bmFtaWMgZ2V0dGVyIGFuZCBzZXR0ZXIgdG8gYW55IGdpdmVuIGRhdGEgc3RydWN0dXJlIHN1Y2ggYXMgbWFwcy5cbiAqIEBwYXJhbSBvYmplY3QgLSBPYmplY3QgdG8gcHJveHkuXG4gKiBAcGFyYW0gZ2V0dGVyV3JhcHBlciAtIEZ1bmN0aW9uIHRvIHdyYXAgZWFjaCBwcm9wZXJ0eSBnZXQuXG4gKiBAcGFyYW0gc2V0dGVyV3JhcHBlciAtIEZ1bmN0aW9uIHRvIHdyYXAgZWFjaCBwcm9wZXJ0eSBzZXQuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZXMgLSBNZXRob2QgbmFtZXMgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoZSBnaXZlblxuICogb2JqZWN0LlxuICogQHBhcmFtIGRlZXAgLSBJbmRpY2F0ZXMgdG8gcGVyZm9ybSBhIGRlZXAgd3JhcHBpbmcgb2Ygc3BlY2lmaWVkIHR5cGVzLlxuICogQHBhcmFtIHR5cGVzVG9FeHRlbmQgLSBUeXBlcyB3aGljaCBzaG91bGQgYmUgZXh0ZW5kZWQgKENoZWNrcyBhcmVcbiAqIHBlcmZvcm1lZCB2aWEgXCJ2YWx1ZSBpbnN0YW5jZW9mIHR5cGVcIi4pLlxuICogQHJldHVybnMgUmV0dXJucyBnaXZlbiBvYmplY3Qgd3JhcHBlZCB3aXRoIGEgZHluYW1pYyBnZXR0ZXIgcHJveHkuXG4gKi9cbmV4cG9ydCBjb25zdCBhZGREeW5hbWljR2V0dGVyQW5kU2V0dGVyID0gPFQgPSB1bmtub3duPihcbiAgICBvYmplY3Q6IFQsXG4gICAgZ2V0dGVyV3JhcHBlcjogR2V0dGVyRnVuY3Rpb24gfCBudWxsID0gbnVsbCxcbiAgICBzZXR0ZXJXcmFwcGVyOiBudWxsIHwgU2V0dGVyRnVuY3Rpb24gPSBudWxsLFxuICAgIG1ldGhvZE5hbWVzOiBNYXBwaW5nID0ge30sXG4gICAgZGVlcCA9IHRydWUsXG4gICAgdHlwZXNUb0V4dGVuZDogQXJyYXk8dW5rbm93bj4gPSBbT2JqZWN0XVxuKTogUHJveHlUeXBlPFQ+IHwgVCA9PiB7XG4gICAgaWYgKGRlZXAgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2luZGV4XSA9IGFkZER5bmFtaWNHZXR0ZXJBbmRTZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLCBnZXR0ZXJXcmFwcGVyLCBzZXR0ZXJXcmFwcGVyLCBtZXRob2ROYW1lcywgZGVlcFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqZWN0KVxuICAgICAgICAgICAgICAgIG9iamVjdC5zZXQoa2V5LCBhZGREeW5hbWljR2V0dGVyQW5kU2V0dGVyKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZ2V0dGVyV3JhcHBlciwgc2V0dGVyV3JhcHBlciwgbWV0aG9kTmFtZXMsIGRlZXApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICBlbHNlIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZTogQXJyYXk8dW5rbm93bj4gPSBbXVxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBvYmplY3QuZGVsZXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNhY2hlLnB1c2goYWRkRHluYW1pY0dldHRlckFuZFNldHRlcihcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGdldHRlcldyYXBwZXIsIHNldHRlcldyYXBwZXIsIG1ldGhvZE5hbWVzLCBkZWVwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZSlcbiAgICAgICAgICAgICAgICBvYmplY3QuYWRkKHZhbHVlKVxuICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCAhPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iamVjdCkpXG4gICAgICAgICAgICAgICAgKG9iamVjdCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICBhZGREeW5hbWljR2V0dGVyQW5kU2V0dGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgVFtFeHRyYWN0PGtleW9mIFQsIHN0cmluZz5dLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGVyV3JhcHBlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcldyYXBwZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBcbiAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgaWYgKGdldHRlcldyYXBwZXIgfHwgc2V0dGVyV3JhcHBlcilcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHR5cGVzVG9FeHRlbmQpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXNPYmplY3Qob2JqZWN0KSAmJiBvYmplY3QgaW5zdGFuY2VvZiAodHlwZSBhcyBBbnlGdW5jdGlvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyOiBQcm94eUhhbmRsZXI8VD4gPVxuICAgICAgICAgICAgICAgICAgICBnZXRQcm94eUhhbmRsZXI8VD4ob2JqZWN0LCBtZXRob2ROYW1lcylcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8VD4gPVxuICAgICAgICAgICAgICAgICAgICBnZXRQcm94eUhhbmRsZXI8VD4ob2JqZWN0LCBtZXRob2ROYW1lcylcblxuICAgICAgICAgICAgICAgIGlmIChnZXR0ZXJXcmFwcGVyKVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmdldCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIF90YXJnZXQ6IFQsIG5hbWU6IHN0cmluZyB8IHN5bWJvbFxuICAgICAgICAgICAgICAgICAgICApOiB1bmtub3duID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnX190YXJnZXRfXycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ19fcmV2b2tlX18nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldm9rZSgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbbmFtZSBhcyBrZXlvZiBUXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W25hbWUgYXMga2V5b2YgVF1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlcldyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXIuZ2V0KHByb3h5IGFzIFQsIG5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXJXcmFwcGVyKVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIF90YXJnZXQ6IFQsIG5hbWU6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IHVua25vd25cbiAgICAgICAgICAgICAgICAgICAgKTogYm9vbGVhbiA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhhbmRsZXIuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5IGFzIFQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXJXcmFwcGVyKG5hbWUsIHZhbHVlLCBvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3Qge3Byb3h5LCByZXZva2V9ID1cbiAgICAgICAgICAgICAgICAgICAgUHJveHkucmV2b2NhYmxlKHt9LCBoYW5kbGVyIGFzIFByb3h5SGFuZGxlcjxvYmplY3Q+KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5IGFzIFByb3h5VHlwZTxUPlxuICAgICAgICAgICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBvYmplY3QgaW50byBpdHMgc2VyaWFsaXplZCBKU09OIHJlcHJlc2VudGF0aW9uIGJ5XG4gKiByZXBsYWNpbmcgY2lyY3VsYXIgcmVmZXJlbmNlcyB3aXRoIGEgZ2l2ZW4gcHJvdmlkZWQgdmFsdWUuXG4gKlxuICogVGhpcyBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIG9iamVjdCByZWN1cnNpdmVseSBhbmQgdHJhY2tzIG9mIHNlZW4gYW5kXG4gKiBhbHJlYWR5IHNlcmlhbGl6ZWQgc3RydWN0dXJlcyB0byByZXVzZSBnZW5lcmF0ZWQgc3RyaW5ncyBvciBtYXJrIGFcbiAqIGNpcmN1bGFyIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSBvYmplY3QgLSBPYmplY3QgdG8gc2VyaWFsaXplLlxuICogQHBhcmFtIGRldGVybWluZUNpcmN1bGFyUmVmZXJlbmNlVmFsdWUgLSBDYWxsYmFjayB0byBjcmVhdGUgYSBmYWxsYmFja1xuICogdmFsdWUgZGVwZW5kaW5nIG9uIGdpdmVuIHJlZHVuZGFudCB2YWx1ZS5cbiAqIEBwYXJhbSBudW1iZXJPZlNwYWNlcyAtIE51bWJlciBvZiBzcGFjZXMgdG8gdXNlIGZvciBzdHJpbmcgZm9ybWF0dGluZy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgSlNPTiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0Q2lyY3VsYXJPYmplY3RUb0pTT04gPSAoXG4gICAgb2JqZWN0OiB1bmtub3duLFxuICAgIGRldGVybWluZUNpcmN1bGFyUmVmZXJlbmNlVmFsdWU6ICgoXG4gICAgICAgIHNlcmlhbGl6ZWRWYWx1ZTogdW5rbm93bixcbiAgICAgICAga2V5OiBudWxsIHwgc3RyaW5nLFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgc2Vlbk9iamVjdHM6IE1hcDx1bmtub3duLCB1bmtub3duPlxuICAgICkgPT4gdW5rbm93bikgPSAoc2VyaWFsaXplZFZhbHVlOiB1bmtub3duKTogdW5rbm93biA9PlxuICAgICAgICBzZXJpYWxpemVkVmFsdWUgPz8gJ19fY2lyY3VsYXJSZWZlcmVuY2VfXycsXG4gICAgbnVtYmVyT2ZTcGFjZXMgPSAwXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnN0cmluZ2lmeT4gfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IHNlZW5PYmplY3RzOiBNYXA8dW5rbm93biwgdW5rbm93bj4gPSBuZXcgTWFwPHVua25vd24sIHVua25vd24+KClcblxuICAgIGNvbnN0IHN0cmluZ2lmaWVyID0gKG9iamVjdDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VyID0gKGtleTogbnVsbCB8IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbk9iamVjdHMuaGFzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZUNpcmN1bGFyUmVmZXJlbmNlVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWVuT2JqZWN0cy5nZXQodmFsdWUpID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5PYmplY3RzXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFNldCBiZWZvcmUgdHJhdmVyc2luZyBkZWVwZXIgdG8gZGV0ZWN0IGN5Y2xlcy5cbiAgICAgICAgICAgICAgICBzZWVuT2JqZWN0cy5zZXQodmFsdWUsIG51bGwpXG5cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OiBBcnJheTx1bmtub3duPiB8IE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW11cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocmVwbGFjZXIobnVsbCwgaXRlbSkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge31cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgc3ViVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHJlcGxhY2VyKG5hbWUsIHN1YlZhbHVlKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNlZW5PYmplY3RzLnNldCh2YWx1ZSwgcmVzdWx0KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmplY3QsIHJlcGxhY2VyLCBudW1iZXJPZlNwYWNlcylcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5naWZpZXIob2JqZWN0KVxufVxuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBtYXAgYW5kIGFsbCBuZXN0ZWQgZm91bmQgbWFwcyBvYmplY3RzIHRvIGNvcnJlc3BvbmRpbmdcbiAqIG9iamVjdC5cbiAqIEBwYXJhbSBvYmplY3QgLSBNYXAgdG8gY29udmVydCB0by5cbiAqIEBwYXJhbSBkZWVwIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIHJlY3Vyc2l2ZSBjb252ZXJzaW9uLlxuICogQHJldHVybnMgR2l2ZW4gbWFwIGFzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRNYXBUb1BsYWluT2JqZWN0ID0gKFxuICAgIG9iamVjdDogdW5rbm93biwgZGVlcCA9IHRydWVcbik6IHVua25vd24gPT4ge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNNYXAob2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0OiBNYXBwaW5nPHVua25vd24+ID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVlcClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0TWFwVG9QbGFpbk9iamVjdCh2YWx1ZSwgZGVlcClcblxuICAgICAgICAgICAgICAgIGlmIChbJ251bWJlcicsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlb2Yga2V5KSlcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqZWN0W1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdPYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwKVxuICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3Qob2JqZWN0KSlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmplY3QpKVxuICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydE1hcFRvUGxhaW5PYmplY3QodmFsdWUsIGRlZXApXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCBhcyBBcnJheTx1bmtub3duPikge1xuICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGFzIEFycmF5PHVua25vd24+KVtpbmRleF0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydE1hcFRvUGxhaW5PYmplY3QodmFsdWUsIGRlZXApXG5cbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTZXQob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlOiBBcnJheTx1bmtub3duPiA9IFtdXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGVsZXRlKHZhbHVlKVxuXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlLnB1c2goY29udmVydE1hcFRvUGxhaW5PYmplY3QodmFsdWUsIGRlZXApKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgY2FjaGUpXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5hZGQodmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyoqXG4gKiBDb252ZXJ0cyBnaXZlbiBwbGFpbiBvYmplY3QgYW5kIGFsbCBuZXN0ZWQgZm91bmQgb2JqZWN0cyB0b1xuICogY29ycmVzcG9uZGluZyBtYXAuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHRvIGNvbnZlcnQgdG8uXG4gKiBAcGFyYW0gZGVlcCAtIEluZGljYXRlcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSByZWN1cnNpdmUgY29udmVyc2lvbi5cbiAqIEByZXR1cm5zIEdpdmVuIG9iamVjdCBhcyBtYXAuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0UGxhaW5PYmplY3RUb01hcCA9IChcbiAgICBvYmplY3Q6IHVua25vd24sIGRlZXAgPSB0cnVlXG4pOiB1bmtub3duID0+IHtcbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3IE1hcDxudW1iZXIgfCBzdHJpbmcsIHVua25vd24+KClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVlcClcbiAgICAgICAgICAgICAgICAgICAgKG9iamVjdCBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQbGFpbk9iamVjdFRvTWFwKHZhbHVlLCBkZWVwKVxuXG4gICAgICAgICAgICAgICAgbmV3T2JqZWN0LnNldChrZXksIChvYmplY3QgYXMgTWFwcGluZzx1bmtub3duPilba2V5XSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXApXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0IGFzIEFycmF5PHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgICAgIChvYmplY3QgYXMgQXJyYXk8dW5rbm93bj4pW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0UGxhaW5PYmplY3RUb01hcCh2YWx1ZSwgZGVlcClcblxuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldChrZXksIGNvbnZlcnRQbGFpbk9iamVjdFRvTWFwKHZhbHVlLCBkZWVwKSlcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzU2V0KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZTogQXJyYXk8dW5rbm93bj4gPSBbXVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmRlbGV0ZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgY2FjaGUucHVzaChjb252ZXJ0UGxhaW5PYmplY3RUb01hcCh2YWx1ZSwgZGVlcCkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZSlcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmFkZCh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4vKipcbiAqIFJlcGxhY2VzIGdpdmVuIHBhdHRlcm4gaW4gZWFjaCB2YWx1ZSBpbiBnaXZlbiBvYmplY3QgcmVjdXJzaXZlbHkgd2l0aFxuICogZ2l2ZW4gc3RyaW5nIHJlcGxhY2VtZW50LlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBjb252ZXJ0IHN1YnN0cmluZ3MgaW4uXG4gKiBAcGFyYW0gcGF0dGVybiAtIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byByZXBsYWNlLlxuICogQHBhcmFtIHJlcGxhY2VtZW50IC0gU3RyaW5nIHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgZm91bmQgcGF0dGVybnMuXG4gKiBAcmV0dXJucyBDb252ZXJ0ZWQgb2JqZWN0IHdpdGggcmVwbGFjZWQgcGF0dGVybnMuXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0U3Vic3RyaW5nSW5QbGFpbk9iamVjdCA9IDxcbiAgICBUeXBlIGV4dGVuZHMgTWFwcGluZzx1bmtub3duPiA9IFBsYWluT2JqZWN0XG4+KG9iamVjdDogVHlwZSwgcGF0dGVybjogUmVnRXhwIHwgc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKTogVHlwZSA9PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqZWN0KSlcbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgICAgICAgb2JqZWN0W2tleSBhcyBrZXlvZiBUeXBlXSA9XG4gICAgICAgICAgICAgICAgY29udmVydFN1YnN0cmluZ0luUGxhaW5PYmplY3QodmFsdWUsIHBhdHRlcm4sIHJlcGxhY2VtZW50KSBhc1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duIGFzIFZhbHVlT2Y8VHlwZT5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIChvYmplY3QgYXMgdW5rbm93biBhcyBNYXBwaW5nKVtrZXldID1cbiAgICAgICAgICAgICAgICB2YWx1ZS5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1kZXNjcmlwdGlvbi1jb21wbGV0ZS1zZW50ZW5jZSAqL1xuLyoqXG4gKiBDb3BpZXMgZ2l2ZW4gb2JqZWN0IChvZiBhbnkgdHlwZSkgaW50byBvcHRpb25hbGx5IGdpdmVuIGRlc3RpbmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZSAtIE9iamVjdCB0byBjb3B5LlxuICogQHBhcmFtIGNvcHlCbG9icyAtIERldGVybWluZXMgd2hldGhlciB0byBjb3B5IGJsb2JzIGFzIHdlbGwuXG4gKiBAcGFyYW0gcmVjdXJzaW9uTGltaXQgLSBTcGVjaWZpZXMgaG93IGRlZXAgd2Ugc2hvdWxkIHRyYXZlcnNlIGludG8gZ2l2ZW5cbiAqIG9iamVjdCByZWN1cnNpdmVseS5cbiAqIEBwYXJhbSByZWN1cnNpb25FbmRWYWx1ZSAtIEluZGljYXRlcyB3aGljaCB2YWx1ZSB0byB1c2UgZm9yIHJlY3Vyc2lvbiBlbmRzLlxuICogVXN1YWxseSBhIHJlZmVyZW5jZSB0byBjb3JyZXNwb25kaW5nIHNvdXJjZSB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gKiBAcGFyYW0gZGVzdGluYXRpb24gLSBUYXJnZXQgdG8gY29weSBzb3VyY2UgdG8uXG4gKiBAcGFyYW0gY3ljbGljIC0gSW5kaWNhdGVzIHdoZXRoZXIga25vd24gc3ViIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGNvcGllZCBvclxuICogcmVmZXJlbmNlZCAoaWYgXCJ0cnVlXCIgZW5kbGVzcyBsb29wcyBjYW4gb2NjdXIgaWYgc291cmNlIGhhcyBjeWNsaWNcbiAqIHN0cnVjdHVyZXMpLlxuICogQHBhcmFtIGtub3duUmVmZXJlbmNlcyAtIFVzZWQgdG8gYXZvaWQgdHJhdmVyc2luZyBsb29wcyBhbmQgbm90IHRvIGNvcHlcbiAqIHJlZmVyZW5jZXMgZS5nLiB0byBvYmplY3RzIG5vdCB0byBjb3B5IChlLmcuIHN5bWJvbCBwb2x5ZmlsbHMpLlxuICogQHBhcmFtIHJlY3Vyc2lvbkxldmVsIC0gSW50ZXJuYWxseSB1c2VkIHRvIHRyYWNrIGN1cnJlbnQgcmVjdXJzaW9uIGxldmVsIGluXG4gKiBnaXZlbiBzb3VyY2UgZGF0YSBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJucyBWYWx1ZSBcInRydWVcIiBpZiBib3RoIG9iamVjdHMgYXJlIGVxdWFsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgY29weSA9IDxUeXBlID0gdW5rbm93bj4oXG4gICAgc291cmNlOiBUeXBlLFxuICAgIGNvcHlCbG9icyA9IGZhbHNlLFxuICAgIHJlY3Vyc2lvbkxpbWl0ID0gLTEsXG4gICAgcmVjdXJzaW9uRW5kVmFsdWU6IHVua25vd24gPSBWQUxVRV9DT1BZX1NZTUJPTCxcbiAgICBkZXN0aW5hdGlvbjogbnVsbCB8IFR5cGUgPSBudWxsLFxuICAgIGN5Y2xpYyA9IGZhbHNlLFxuICAgIGtub3duUmVmZXJlbmNlczogQXJyYXk8dW5rbm93bj4gPSBbXSxcbiAgICByZWN1cnNpb25MZXZlbCA9IDBcbik6IFR5cGUgPT4ge1xuICAgIC8qIGVzbGludC1lbmFibGUganNkb2MvcmVxdWlyZS1kZXNjcmlwdGlvbi1jb21wbGV0ZS1zZW50ZW5jZSAqL1xuICAgIGlmIChpc09iamVjdChzb3VyY2UpKVxuICAgICAgICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IGRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENhbid0IGNvcHkgYmVjYXVzZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBgICtcbiAgICAgICAgICAgICAgICAgICAgJ2lkZW50aWNhbC4nXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWN5Y2xpYyAmJlxuICAgICAgICAgICAgICAgICFbdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyhzb3VyY2UgYXMgdW5rbm93biBhcyBudWxsKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IGtub3duUmVmZXJlbmNlcy5pbmRleE9mKHNvdXJjZSlcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga25vd25SZWZlcmVuY2VzW2luZGV4XSBhcyBUeXBlXG5cbiAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMucHVzaChzb3VyY2UpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvcHlWYWx1ZSA9IDxWPih2YWx1ZTogVik6IG51bGwgfCBWID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0ICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MaW1pdCA8IHJlY3Vyc2lvbkxldmVsICsgMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2lvbkVuZFZhbHVlID09PSBWQUxVRV9DT1BZX1NZTUJPTCA/XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25FbmRWYWx1ZSBhcyBudWxsIHwgVlxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBudWxsIHwgViA9IGNvcHkoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBjb3B5QmxvYnMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0LFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25FbmRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY3ljbGljLFxuICAgICAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxldmVsICsgMVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWN5Y2xpYyAmJlxuICAgICAgICAgICAgICAgICAgICAhW3VuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyB1bmtub3duIGFzIG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMucHVzaCh2YWx1ZSlcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc291cmNlKVxuICAgICAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24gYXMgdW5rbm93biBhcyBBcnJheTx1bmtub3duPilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wdXNoKGNvcHlWYWx1ZShpdGVtKSlcbiAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE1hcClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiBhcyB1bmtub3duIGFzIE1hcDx1bmtub3duLCB1bmtub3duPilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoa2V5LCBjb3B5VmFsdWUodmFsdWUpKVxuICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKVxuICAgICAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24gYXMgdW5rbm93biBhcyBTZXQ8dW5rbm93bj4pXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGNvcHlWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSlcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiBhcyBNYXBwaW5nPFZhbHVlT2Y8VHlwZT4+KVtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5VmFsdWUodmFsdWUgYXMgVmFsdWVPZjxUeXBlPikgYXMgVmFsdWVPZjxUeXBlPlxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gY29weSBwcm9wZXJ0eSB2YWx1ZSBvYmplY3QgXCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtrZXl9XCI6ICR7cmVwcmVzZW50KGVycm9yKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjYXVzZTogZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHkoXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29weUJsb2JzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRW5kVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIChbXSBhcyB1bmtub3duIGFzIFR5cGUpLFxuICAgICAgICAgICAgICAgICAgICBjeWNsaWMsXG4gICAgICAgICAgICAgICAgICAgIGtub3duUmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGV2ZWxcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHkoXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29weUJsb2JzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRW5kVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIChuZXcgTWFwKCkgYXMgdW5rbm93biBhcyBUeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgY3ljbGljLFxuICAgICAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxldmVsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3B5KFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGNvcHlCbG9icyxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGltaXQsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkVuZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAobmV3IFNldCgpIGFzIHVua25vd24gYXMgVHlwZSksXG4gICAgICAgICAgICAgICAgICAgIGN5Y2xpYyxcbiAgICAgICAgICAgICAgICAgICAga25vd25SZWZlcmVuY2VzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MZXZlbFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpIGFzIHVua25vd24gYXMgVHlwZVxuXG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXIgPSAvW14vXSokLy5leGVjKHNvdXJjZS50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIgPyBtb2RpZmllclswXSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBUeXBlXG4gICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uIGFzIHVua25vd24gYXMgUmVnRXhwKS5sYXN0SW5kZXggPVxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UubGFzdEluZGV4XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBzb3VyY2UgaW5zdGFuY2VvZiBCbG9iKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3B5QmxvYnMgP1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uuc2xpY2UoMCwgc291cmNlLnNpemUsIHNvdXJjZS50eXBlKSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA6XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVxuXG4gICAgICAgICAgICByZXR1cm4gY29weShcbiAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgY29weUJsb2JzLFxuICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0LFxuICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkVuZFZhbHVlLFxuICAgICAgICAgICAgICAgICh7fSBhcyB1bmtub3duIGFzIFR5cGUpLFxuICAgICAgICAgICAgICAgIGN5Y2xpYyxcbiAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgcmVjdXJzaW9uTGV2ZWxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uIHx8IHNvdXJjZVxufVxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIGludGVybmFsIEphdmFTY3JpcHQgW1tDbGFzc11dIG9mIGFuIG9iamVjdC5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGFuYWx5emUuXG4gKiBAcmV0dXJucyBOYW1lIG9mIGRldGVybWluZWQgdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVybWluZVR5cGUgPSAodmFsdWU/OiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgICBpZiAoW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXModmFsdWUgYXMgbnVsbCkpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG5cbiAgICBjb25zdCB0eXBlOiBzdHJpbmcgPSB0eXBlb2YgdmFsdWVcblxuICAgIGlmIChcbiAgICAgICAgWydmdW5jdGlvbicsICdvYmplY3QnXS5pbmNsdWRlcyh0eXBlKSAmJlxuICAgICAgICAndG9TdHJpbmcnIGluICh2YWx1ZSBhcyBvYmplY3QpXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ1JlcHJlc2VudGF0aW9uID1cbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSlcblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgQ0xBU1NfVE9fVFlQRV9NQVBQSU5HLCBzdHJpbmdSZXByZXNlbnRhdGlvblxuICAgICAgICApKVxuICAgICAgICAgICAgcmV0dXJuIENMQVNTX1RPX1RZUEVfTUFQUElOR1tcbiAgICAgICAgICAgICAgICBzdHJpbmdSZXByZXNlbnRhdGlvbiBhc1xuICAgICAgICAgICAgICAgICAgICBrZXlvZiB0eXBlb2YgQ0xBU1NfVE9fVFlQRV9NQVBQSU5HXG4gICAgICAgICAgICBdXG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGdpdmVuIGl0ZW1zIGFyZSBlcXVhbCBmb3IgZ2l2ZW4gcHJvcGVydHkgbGlzdC4gSWZcbiAqIHByb3BlcnR5IGxpc3QgaXNuJ3Qgc2V0IGFsbCBwcm9wZXJ0aWVzIHdpbGwgYmUgY2hlY2tlZC4gQWxsIGtleXMgd2hpY2hcbiAqIHN0YXJ0cyB3aXRoIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHByZWZpeGVzIHdpbGwgYmUgb21pdHRlZC5cbiAqIEBwYXJhbSBmaXJzdFZhbHVlIC0gRmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gc2Vjb25kVmFsdWUgLSBTZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zIC0gT3B0aW9ucyB0byBkZWZpbmUgaG93IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLnByb3BlcnRpZXMgLSBQcm9wZXJ0eSBuYW1lcyB0byBjaGVjay4gQ2hlY2sgYWxsIGlmXG4gKiBcIm51bGxcIiBpcyBzZWxlY3RlZCAoZGVmYXVsdCkuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmRlZXAgLSBSZWN1cnNpb24gZGVwdGggbmVnYXRpdmUgdmFsdWVzIG1lYW5zXG4gKiBpbmZpbml0ZWx5IGRlZXAgKGRlZmF1bHQpLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5leGNlcHRpb25QcmVmaXhlcyAtIFByb3BlcnR5IHByZWZpeGVzIHdoaWNoXG4gKiBpbmRpY2F0ZXMgcHJvcGVydGllcyB0byBpZ25vcmUuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmlnbm9yZUZ1bmN0aW9ucyAtIEluZGljYXRlcyB3aGV0aGVyIGZ1bmN0aW9ucyBoYXZlXG4gKiB0byBiZSBpZGVudGljYWwgdG8gaW50ZXJwcmV0IGlzIGFzIGVxdWFsLiBJZiBzZXQgdG8gXCJ0cnVlXCIgdHdvIGZ1bmN0aW9uc1xuICogd2lsbCBiZSBhc3N1bWVkIHRvIGJlIGVxdWFsIChkZWZhdWx0KS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuY29tcGFyZUJsb2JzIC0gSW5kaWNhdGVzIHdoZXRoZXIgYmluYXJ5IGRhdGEgc2hvdWxkXG4gKiBiZSBjb252ZXJ0ZWQgdG8gYSBiYXNlNjQgc3RyaW5nIHRvIGNvbXBhcmUgdGhlaXIgY29udGVudC4gTWFrZXMgdGhpc1xuICogZnVuY3Rpb24gYXN5bmNocm9ub3VzIGluIGJyb3dzZXJzIGFuZCBwb3RlbnRpYWxseSB0YWtlcyBhIGxvdCBvZlxuICogcmVzb3VyY2VzLlxuICogQHJldHVybnMgVmFsdWUgXCJ0cnVlXCIgaWYgYm90aCBvYmplY3RzIGFyZSBlcXVhbCBhbmQgXCJmYWxzZVwiIG90aGVyd2lzZS5cbiAqIElmIFwiY29tcGFyZUJsb2JzXCIgaXMgYWN0aXZhdGVkLCBhbmQgd2UncmUgcnVubmluZyBpbiBhIGJyb3dzZXIgbGlrZVxuICogZW52aXJvbm1lbnQgYW5kIGJpbmFyeSBkYXRhIGlzIGdpdmVuLCB0aGVuIGEgcHJvbWlzZSB3cmFwcGluZyB0aGVcbiAqIGRldGVybWluZWQgYm9vbGVhbiB2YWx1ZXMgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBlcXVhbHMgPSAoXG4gICAgZmlyc3RWYWx1ZTogdW5rbm93bixcbiAgICBzZWNvbmRWYWx1ZTogdW5rbm93bixcbiAgICBnaXZlbk9wdGlvbnM6IFBhcnRpYWw8Q29tcGFyZU9wdGlvbnM+ID0ge31cbik6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+IHwgc3RyaW5nID0+IHtcbiAgICBjb25zdCBvcHRpb25zOiBDb21wYXJlT3B0aW9ucyA9IHtcbiAgICAgICAgY29tcGFyZUJsb2JzOiBmYWxzZSxcbiAgICAgICAgZGVlcDogLTEsXG4gICAgICAgIGV4Y2VwdGlvblByZWZpeGVzOiBbXSxcbiAgICAgICAgaWdub3JlRnVuY3Rpb25zOiB0cnVlLFxuICAgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgICByZXR1cm5SZWFzb25JZk5vdEVxdWFsOiBmYWxzZSxcbiAgICAgICAgLi4uZ2l2ZW5PcHRpb25zXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBvcHRpb25zLmlnbm9yZUZ1bmN0aW9ucyAmJlxuICAgICAgICBpc0Z1bmN0aW9uKGZpcnN0VmFsdWUpICYmIGlzRnVuY3Rpb24oc2Vjb25kVmFsdWUpIHx8XG4gICAgICAgIGZpcnN0VmFsdWUgPT09IHNlY29uZFZhbHVlIHx8XG4gICAgICAgIGlzTm90QU51bWJlcihmaXJzdFZhbHVlKSAmJiBpc05vdEFOdW1iZXIoc2Vjb25kVmFsdWUpIHx8XG4gICAgICAgIGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgJiYgc2Vjb25kVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgZmlyc3RWYWx1ZS50b1N0cmluZygpID09PSBzZWNvbmRWYWx1ZS50b1N0cmluZygpICYmXG4gICAgICAgIGZpcnN0VmFsdWUuZmxhZ3Muc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSA9PT1cbiAgICAgICAgc2Vjb25kVmFsdWUuZmxhZ3Muc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICBmaXJzdFZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiBzZWNvbmRWYWx1ZSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgKFxuICAgICAgICAgICAgaXNOYU4oZmlyc3RWYWx1ZS5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICBpc05hTihzZWNvbmRWYWx1ZS5nZXRUaW1lKCkpIHx8XG4gICAgICAgICAgICAhaXNOYU4oZmlyc3RWYWx1ZS5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAhaXNOYU4oc2Vjb25kVmFsdWUuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICAgZmlyc3RWYWx1ZS5nZXRUaW1lKCkgPT09IHNlY29uZFZhbHVlLmdldFRpbWUoKVxuICAgICAgICApIHx8XG4gICAgICAgIG9wdGlvbnMuY29tcGFyZUJsb2JzICYmXG4gICAgICAgIGV2YWwoJ3R5cGVvZiBCdWZmZXInKSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgKGV2YWwoJ0J1ZmZlcicpIGFzIHR5cGVvZiBCdWZmZXIpLCAnaXNCdWZmZXInXG4gICAgICAgICkgJiZcbiAgICAgICAgZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIGV2YWwoJ0J1ZmZlcicpICYmXG4gICAgICAgIHNlY29uZFZhbHVlIGluc3RhbmNlb2YgZXZhbCgnQnVmZmVyJykgJiZcbiAgICAgICAgKGZpcnN0VmFsdWUgYXMgQnVmZmVyKS50b1N0cmluZygnYmFzZTY0JykgPT09XG4gICAgICAgIChzZWNvbmRWYWx1ZSBhcyBCdWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIClcbiAgICAgICAgcmV0dXJuIHRydWVcblxuICAgIGlmIChcbiAgICAgICAgb3B0aW9ucy5jb21wYXJlQmxvYnMgJiZcbiAgICAgICAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBCbG9iICYmXG4gICAgICAgIHNlY29uZFZhbHVlIGluc3RhbmNlb2YgQmxvYlxuICAgIClcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+KChcbiAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykgPT4gdm9pZFxuICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlczogQXJyYXk8QXJyYXlCdWZmZXIgfCBudWxsIHwgc3RyaW5nPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIFtmaXJzdFZhbHVlLCBzZWNvbmRWYWx1ZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gobnVsbClcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goKGV2ZW50LnRhcmdldCBhcyBGaWxlUmVhZGVyKS5yZXN1bHQpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzWzBdID09PSB2YWx1ZXNbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYD4+PiBCbG9iKCR7cmVwcmVzZW50KHZhbHVlc1swXSl9KSAgIT09IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmxvYigke3JlcHJlc2VudCh2YWx1ZXNbMV0pfSlgIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgaWYgKFxuICAgICAgICBpc1BsYWluT2JqZWN0KGZpcnN0VmFsdWUpICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3Qoc2Vjb25kVmFsdWUpICYmXG4gICAgICAgICEoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBzZWNvbmRWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShmaXJzdFZhbHVlKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNlY29uZFZhbHVlKSAmJlxuICAgICAgICBmaXJzdFZhbHVlLmxlbmd0aCA9PT0gc2Vjb25kVmFsdWUubGVuZ3RoIHx8XG4gICAgICAgIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBkZXRlcm1pbmVUeXBlKGZpcnN0VmFsdWUpID09PSBkZXRlcm1pbmVUeXBlKHNlY29uZFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIFsnbWFwJywgJ3NldCddLmluY2x1ZGVzKGRldGVybWluZVR5cGUoZmlyc3RWYWx1ZSkpXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICAoZmlyc3RWYWx1ZSBhcyBTZXQ8dW5rbm93bj4pLnNpemUgPT09XG4gICAgICAgICAgICAoc2Vjb25kVmFsdWUgYXMgU2V0PHVua25vd24+KS5zaXplXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4+ID0gW11cbiAgICAgICAgZm9yIChjb25zdCBbZmlyc3QsIHNlY29uZF0gb2YgW1xuICAgICAgICAgICAgW2ZpcnN0VmFsdWUsIHNlY29uZFZhbHVlXSxcbiAgICAgICAgICAgIFtzZWNvbmRWYWx1ZSwgZmlyc3RWYWx1ZV1cbiAgICAgICAgXSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJc0FycmF5OiBib29sZWFuID0gQXJyYXkuaXNBcnJheShmaXJzdClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmaXJzdElzQXJyYXkgJiZcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHNlY29uZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGZpcnN0IGFzIEFycmF5PHVua25vd24+KS5sZW5ndGggIT09XG4gICAgICAgICAgICAgICAgICAgIChzZWNvbmQgYXMgQXJyYXk8dW5rbm93bj4pLmxlbmd0aFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID8gJy5sZW5ndGgnIDogZmFsc2VcblxuICAgICAgICAgICAgY29uc3QgZmlyc3RJc01hcCA9IGlzTWFwKGZpcnN0KVxuICAgICAgICAgICAgaWYgKGZpcnN0SXNNYXAgJiYgKCFpc01hcChzZWNvbmQpIHx8IGZpcnN0LnNpemUgIT09IHNlY29uZC5zaXplKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID8gJy5zaXplJyA6IGZhbHNlXG5cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SXNTZXQgPSBpc1NldChmaXJzdClcbiAgICAgICAgICAgIGlmIChmaXJzdElzU2V0ICYmICghaXNTZXQoc2Vjb25kKSB8fCBmaXJzdC5zaXplICE9PSBzZWNvbmQuc2l6ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmV0dXJuUmVhc29uSWZOb3RFcXVhbCA/ICcuc2l6ZScgOiBmYWxzZVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZmlyc3QgYXMgQXJyYXk8dW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPSBlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBhcyBBcnJheTx1bmtub3duPilbaW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zLCBkZWVwOiBvcHRpb25zLmRlZXAgLSAxfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4OiBudW1iZXIgPSBpbmRleFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRlcm1pbmVSZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBib29sZWFuIHwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApOiBib29sZWFuIHwgc3RyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWyR7U3RyaW5nKGN1cnJlbnRJbmRleCl9XWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeydbJzogJycsICc+JzogJyAnfVtyZXN1bHRbMF1dID8/ICcuJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsICd0aGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGFzIFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oZGV0ZXJtaW5lUmVzdWx0KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRlcm1pbmVSZXN1bHQocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RJc01hcCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWVwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPiB8IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA9IGVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vjb25kIGFzIE1hcDx1bmtub3duLCB1bmtub3duPikuZ2V0KGtleSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgey4uLm9wdGlvbnMsIGRlZXA6IG9wdGlvbnMuZGVlcCAtIDF9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRlcm1pbmVSZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBib29sZWFuIHwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApOiBib29sZWFuIHwgc3RyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZ2V0KCR7cmVwcmVzZW50KGtleSl9KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeydbJzogJycsICc+JzogJyAnfVtyZXN1bHRbMF1dID8/ICcuJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsICd0aGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGFzIFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oZGV0ZXJtaW5lUmVzdWx0KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRlcm1pbmVSZXN1bHQocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0SXNTZXQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWVwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXF1YWwgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViUHJvbWlzZXM6IEFycmF5PFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBDaGVjayBpZiB0aGVpciBleGlzdHMgYXQgbGVhc3Qgb25lIGJlaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlY29uZFZhbHVlIG9mIHNlY29uZCBhcyBTZXQ8dW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0gZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zLCBkZWVwOiBvcHRpb25zLmRlZXAgLSAxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgYXMgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGVybWluZVJlc3VsdCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbDogYm9vbGVhblxuICAgICAgICAgICAgICAgICAgICAgICAgKTogYm9vbGVhbiB8IHN0cmluZyA9PiBlcXVhbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYD4+PiB7LT4gJHtyZXByZXNlbnQodmFsdWUpfSBub3QgZm91bmR9YCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcXVhbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBXZSBkbyBub3QgaGF2ZSB0byB3YWl0IGZvciBwcm9taXNlcyB0byBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZCB3aGVuIG9uZSBtYXRjaCBjb3VsZCBiZSBmb3VuZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJQcm9taXNlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPigoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykgPT4gdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbDxib29sZWFuIHwgc3RyaW5nPihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHRzOiBBcnJheTxib29sZWFuIHwgc3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGV0ZXJtaW5lUmVzdWx0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4gcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZVJlc3VsdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0IGFzIE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvcGVydGllcyAmJiAhb3B0aW9ucy5wcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9CcmVhayA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXhjZXB0aW9uUHJlZml4IG9mIG9wdGlvbnMuZXhjZXB0aW9uUHJlZml4ZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZXhjZXB0aW9uUHJlZml4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvQnJlYWsgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9CcmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVlcCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPSBlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zLCBkZWVwOiBvcHRpb25zLmRlZXAgLSAxfVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0ZXJtaW5lUmVzdWx0ID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogYm9vbGVhbiB8IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTogYm9vbGVhbiB8IHN0cmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7J1snOiAnJywgJz4nOiAnICd9W3Jlc3VsdFswXV0gPz8gJy4nKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgJ3RoZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgYXMgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihkZXRlcm1pbmVSZXN1bHQpKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZVJlc3VsdChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+KChcbiAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpID0+IHZvaWRcbiAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0czogQXJyYXk8Ym9vbGVhbiB8IHN0cmluZz4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID9cbiAgICAgICAgYD4+PiAke3JlcHJlc2VudChmaXJzdFZhbHVlKX0gIT09ICR7cmVwcmVzZW50KHNlY29uZFZhbHVlKX1gIDpcbiAgICAgICAgZmFsc2Vcbn1cbi8qKlxuICogV3JhcHMgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgaW50byBwcm94aWVzIHJlY3Vyc2l2ZWx5IHRvIGV2YWx1YXRlIGFuZCByZXNvbHZlXG4gKiBlYWNoIGdldCByZXF1ZXN0IHRvIGRhdGEgaGF2aW5nIGFuIG9iamVjdCB3aXRoIGluZGljYXRpbmcga2V5cyBhbmQgcmVwbGFjZXNcbiAqIHRoYXQgb2JqZWN0IHdpdGggY29ycmVzcG9uZGluZyBldmFsdWF0ZWQgdmFsdWVzLiBBbGwgbmVzdGVkIG9iamVjdHMgYXJlXG4gKiB3cmFwcGVkIHdpdGggYSBwcm94eSB0byByZXNvbHZlIGNoYWlucyBvZiByZWZlcmVuY2luZyBleHByZXNzaW9ucyBhcyB3ZWxsLlxuICogQHBhcmFtIG9iamVjdCAtIEdpdmVuIG1hcHBpbmcgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBldmFsdWF0aW9uLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5zY29wZSAtIFNjb3BlIHRvIHVzZSBldmFsdWF0ZSBhZ2Fpbi5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWUgLSBOYW1lIHRvIHVzZSBmb3IgcmVmZXJlbmNlIHRvIGdpdmVuXG4gKiBvYmplY3QuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHJldHVybnMgRXZhbHVhdGVkIGdpdmVuIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUR5bmFtaWNEYXRhID0gPFR5cGUgPSB1bmtub3duPihcbiAgICBvYmplY3Q6IG51bGwgfCBSZWN1cnNpdmVFdmFsdWF0ZWFibGU8VHlwZT4sXG4gICAgZ2l2ZW5PcHRpb25zOiBQYXJ0aWFsPEV2YWx1YXRlRHluYW1pY0RhdGFPcHRpb25zPiA9IHt9XG4pOiBUeXBlID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBzY29wZToge30sXG4gICAgICAgIHNlbGZSZWZlcmVuY2VOYW1lOiAnc2VsZicsXG4gICAgICAgIGV4cHJlc3Npb25JbmRpY2F0b3JLZXk6ICdfX2V2YWx1YXRlX18nLFxuICAgICAgICBleGVjdXRpb25JbmRpY2F0b3JLZXk6ICdfX2V4ZWN1dGVfXycsXG4gICAgICAgIC4uLmdpdmVuT3B0aW9uc1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JyB8fCBvYmplY3QgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBvYmplY3QgYXMgdW5rbm93biBhcyBUeXBlXG5cbiAgICBpZiAoIShvcHRpb25zLnNlbGZSZWZlcmVuY2VOYW1lIGluIG9wdGlvbnMuc2NvcGUpKVxuICAgICAgICBvcHRpb25zLnNjb3BlW29wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWVdID0gb2JqZWN0XG5cbiAgICBjb25zdCBpbnRlcm5hbEV2YWx1YXRlQW5kVGhyb3dFcnJvciA9IChcbiAgICAgICAgY29kZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcgPSBvcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXlcbiAgICApOiBUeXBlID0+XG4gICAgICAgIGV2YWx1YXRlT3JUaHJvd0Vycm9yPFR5cGU+KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzY29wZTogb3B0aW9ucy5zY29wZSxcbiAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogdHlwZSA9PT0gb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuXG4gICAgY29uc3QgYWRkUHJveHlSZWN1cnNpdmVseSA9IChkYXRhOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAgICAgZGF0YSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJ1xuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZ2l2ZW5WYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnX190YXJnZXRfXycgJiYgaXNPYmplY3QoZ2l2ZW5WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IGdpdmVuVmFsdWVcblxuICAgICAgICAgICAgICAgIGFkZFByb3h5UmVjdXJzaXZlbHkodmFsdWUpXG4gICAgICAgICAgICAgICAgLy8gTk9URTogV2Ugb25seSB3cmFwIG5lZWRlZCBvYmplY3RzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2t1cDogTWFwcGluZzx1bmtub3duPiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgIChkYXRhIGFzIE1hcHBpbmc8UHJveHlUeXBlPilba2V5XSA9IG5ldyBQcm94eShcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHN0cmluZyB8IHN5bWJvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6IHVua25vd24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAnX190YXJnZXRfXycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2hhc093blByb3BlcnR5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNsaW50LWRpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNsaW50LWVuYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogVmVyeSBjb21wbGljYXRlZCBzZWN0aW9uLCBkbyBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHdoaWxlIGhhdmluZyBnb29kIHRlc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0sIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFRhcmdldDogdW5rbm93biA9IHJlc29sdmUodGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAndG9TdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IE1hcHBpbmc8VW5rbm93bkZ1bmN0aW9uPiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxFdmFsdWF0ZUFuZFRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVGFyZ2V0IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgTWFwcGluZzxVbmtub3duRnVuY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRba2V5XS5iaW5kKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEV2YWx1YXRlQW5kVGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUYXJnZXQgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldIGFzIG51bGwgfCBVbmtub3duRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk/LmJpbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gYXMgVW5rbm93bkZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHJlc3VsdClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtrZXldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwodGFyZ2V0LCB0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBNYXBwaW5nPHVua25vd24+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFt0eXBlXSBhcyBzdHJpbmcsIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBNYXBwaW5nPHVua25vd24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCB8IFVua25vd25GdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk/LmJpbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSBhcyBVbmtub3duRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHJlc3VsdClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFRhcmdldCBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmQgb2YgY29tcGxpY2F0ZWQgc3R1ZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25LZXlzOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogTWFwcGluZzx1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6IEFycmF5PHN0cmluZz4gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwodGFyZ2V0LCB0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFt0eXBlXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApIGFzIFByb3h5VHlwZVxuXG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBLbm93biBwcm94eSBwb2x5ZmlsbHMgZG9lcyBub3QgcHJvdmlkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiX190YXJnZXRfX1wiIGFwaS5cbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGF0YSBhcyBNYXBwaW5nPFByb3h5VHlwZT4pW2tleV0uX190YXJnZXRfXylcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIGFzIE1hcHBpbmc8UHJveHlUeXBlPilba2V5XS5fX3RhcmdldF9fID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlID0gKGRhdGE6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgICBpZiAoaXNQcm94eShkYXRhKSkge1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIGhhdmUgdG8gc2tpcCBcIm93bktleXNcIiBwcm94eSB0cmFwIGhlcmUuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIFtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgdHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRhdGEgYXMgTWFwcGluZzx1bmtub3duPilbdHlwZV1cblxuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLl9fdGFyZ2V0X19cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICAgICAgZGF0YSBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgaWYgKFtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKHZhbHVlIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAoZGF0YSBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldID0gcmVzb2x2ZSh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgb3B0aW9ucy5zY29wZS5yZXNvbHZlID0gcmVzb2x2ZVxuICAgIGNvbnN0IHJlbW92ZVByb3h5UmVjdXJzaXZlbHkgPSAoZGF0YTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICAgICAgICBpZiAoaXNPYmplY3QoZGF0YSkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSlcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGtleSAhPT0gJ19fdGFyZ2V0X18nICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIFsnZnVuY3Rpb24nLCAndW5kZWZpbmVkJ10uaW5jbHVkZXModHlwZW9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IHVua25vd24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGFzIHtfX3RhcmdldF9fOiB1bmtub3dufSkuX190YXJnZXRfX1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJveHlSZWN1cnNpdmVseSh2YWx1ZSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBvYmplY3QsIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleVxuICAgICkpXG4gICAgICAgIHJldHVybiBpbnRlcm5hbEV2YWx1YXRlQW5kVGhyb3dFcnJvcihvYmplY3RbXG4gICAgICAgICAgICBvcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXkgYXMga2V5b2YgUmVjdXJzaXZlRXZhbHVhdGVhYmxlPFR5cGU+XG4gICAgICAgIF0pXG4gICAgZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBvYmplY3QsIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgKSlcbiAgICAgICAgcmV0dXJuIGludGVybmFsRXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgb2JqZWN0W29wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5IGFzXG4gICAgICAgICAgICAgICAga2V5b2YgUmVjdXJzaXZlRXZhbHVhdGVhYmxlPFR5cGU+XSxcbiAgICAgICAgICAgIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgICAgIClcblxuICAgIHJldHVybiByZW1vdmVQcm94eVJlY3Vyc2l2ZWx5KHJlc29sdmUoYWRkUHJveHlSZWN1cnNpdmVseShvYmplY3QpKSkgYXMgVHlwZVxufVxuLyoqXG4gKiBTZWFyY2hlcyBmb3IgaW5kaWNhdGluZyBrZXlzIGFuZCByZXBsYWNlcyB0aGF0IGRhdGEgd2l0aCBjb3JyZXNwb25kaW5nXG4gKiBldmFsdWF0ZWQgYW5kIHByb21pc2UgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAcGFyYW0gZGF0YSAtIEdpdmVuIG1hcHBpbmcgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBldmFsdWF0aW9uLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5zY29wZSAtIFNjb3BlIHRvIHVzZSBldmFsdWF0ZSBhZ2Fpbi5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWUgLSBOYW1lIHRvIHVzZSBmb3IgcmVmZXJlbmNlIHRvIGdpdmVuXG4gKiBvYmplY3QuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrXG4gKiBhIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHJldHVybnMgRXZhbHVhdGVkIGdpdmVuIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUFzeW5jRHluYW1pY0RhdGEgPSBhc3luYyA8VHlwZSA9IHVua25vd24+KFxuICAgIGRhdGE6IG51bGwgfCBSZWN1cnNpdmVBc3luY0V2YWx1YXRlYWJsZTxUeXBlPixcbiAgICBnaXZlbk9wdGlvbnM6IFBhcnRpYWw8RXZhbHVhdGVEeW5hbWljRGF0YU9wdGlvbnM+ID0ge31cbik6IFByb21pc2U8VHlwZT4gPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHNjb3BlOiB7fSxcbiAgICAgICAgc2VsZlJlZmVyZW5jZU5hbWU6ICdzZWxmJyxcbiAgICAgICAgZXhwcmVzc2lvbkluZGljYXRvcktleTogJ19fYXN5bmNfZXZhbHVhdGVfXycsXG4gICAgICAgIGV4ZWN1dGlvbkluZGljYXRvcktleTogJ19fYXN5bmNfZXhlY3V0ZV9fJyxcbiAgICAgICAgLi4uZ2l2ZW5PcHRpb25zXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChkYXRhKSlcbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgdW5rbm93biBhcyBUeXBlXG5cbiAgICBpZiAoIShvcHRpb25zLnNlbGZSZWZlcmVuY2VOYW1lIGluIG9wdGlvbnMuc2NvcGUpKVxuICAgICAgICBvcHRpb25zLnNjb3BlW29wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWVdID0gZGF0YVxuXG4gICAgY29uc3QgcmVzdWx0OiBUeXBlID0gZGF0YSBhcyBUeXBlXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgICAgICAocmVzdWx0IGFzIEFycmF5PHVua25vd24+KVtpbmRleF0gPSBhd2FpdCBldmFsdWF0ZUFzeW5jRHluYW1pY0RhdGEoXG4gICAgICAgICAgICAgICAgaXRlbSBhcyBudWxsIHwgUmVjdXJzaXZlQXN5bmNFdmFsdWF0ZWFibGU8VHlwZT4sIG9wdGlvbnNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICBpZiAoW1xuICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LCBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICBdLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXZhbHVhdGVPclRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgdmFsdWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IG9wdGlvbnMuc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlOiBrZXkgPT09IG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuXG4gICAgICAgIDsocmVzdWx0IGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPSBhd2FpdCBldmFsdWF0ZUFzeW5jRHluYW1pY0RhdGEoXG4gICAgICAgICAgICB2YWx1ZSBhcyBudWxsIHwgUmVjdXJzaXZlQXN5bmNFdmFsdWF0ZWFibGU8VHlwZT4sIG9wdGlvbnNcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogUmVtb3ZlcyBwcm9wZXJ0aWVzIGluIG9iamVjdHMgd2hlcmUgYSBkeW5hbWljIGluZGljYXRvciBsaXZlcy5cbiAqIEBwYXJhbSBkYXRhIC0gT2JqZWN0IHRvIHRyYXZlcnNlIHJlY3Vyc2l2ZWx5LlxuICogQHBhcmFtIGV4cHJlc3Npb25JbmRpY2F0b3JzIC0gUHJvcGVydHkga2V5IHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIEdpdmVuIG9iamVjdCB3aXRoIHJlbW92ZWQgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUtleXNJbkV2YWx1YXRpb24gPSA8XG4gICAgVCBleHRlbmRzIE1hcHBpbmc8dW5rbm93bj4gPSBNYXBwaW5nPHVua25vd24+XG4+KFxuICAgICAgICBkYXRhOiBULFxuICAgICAgICBleHByZXNzaW9uSW5kaWNhdG9yczogQXJyYXk8c3RyaW5nPiA9IFsnX19ldmFsdWF0ZV9fJywgJ19fZXhlY3V0ZV9fJ11cbiAgICApOiBUID0+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSlcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWV4cHJlc3Npb25JbmRpY2F0b3JzLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgIGV4cHJlc3Npb25JbmRpY2F0b3JzLnNvbWUoKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgbmFtZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgZGVsZXRlIChkYXRhIGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPilba2V5XVxuICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgICAgIHJlbW92ZUtleXNJbkV2YWx1YXRpb24odmFsdWUsIGV4cHJlc3Npb25JbmRpY2F0b3JzKVxuXG4gICAgcmV0dXJuIGRhdGFcbn1cbi8qKlxuICogRXh0ZW5kcyBnaXZlbiB0YXJnZXQgb2JqZWN0IHdpdGggZ2l2ZW4gc291cmNlcyBvYmplY3QuIEFzIHRhcmdldCBhbmRcbiAqIHNvdXJjZXMgbWFueSBleHBhbmRhYmxlIHR5cGVzIGFyZSBhbGxvd2VkIGJ1dCB0YXJnZXQgYW5kIHNvdXJjZXMgaGF2ZSB0b1xuICogY29tZSBmcm9tIHRoZSBzYW1lIHR5cGUuXG4gKiBAcGFyYW0gdGFyZ2V0T3JEZWVwSW5kaWNhdG9yIC0gTWF5YmUgdGhlIHRhcmdldCBvciBkZWVwIGluZGljYXRvci5cbiAqIEBwYXJhbSB0YXJnZXRPclNvdXJjZSAtIFRhcmdldCBvciBzb3VyY2Ugb2JqZWN0OyBkZXBlbmRpbmcgb24gZmlyc3RcbiAqIGFyZ3VtZW50LlxuICogQHBhcmFtIGFkZGl0aW9uYWxTb3VyY2VzIC0gU291cmNlIG9iamVjdHMgdG8gZXh0ZW5kIGludG8gdGFyZ2V0LlxuICogQHJldHVybnMgUmV0dXJucyBnaXZlbiB0YXJnZXQgZXh0ZW5kZWQgd2l0aCBhbGwgZ2l2ZW4gc291cmNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dGVuZCA9IDxUID0gTWFwcGluZzx1bmtub3duPj4oXG4gICAgdGFyZ2V0T3JEZWVwSW5kaWNhdG9yOiAoXG4gICAgICAgIGJvb2xlYW4gfCB0eXBlb2YgSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wgfCBSZWN1cnNpdmVQYXJ0aWFsPFQ+XG4gICAgKSxcbiAgICB0YXJnZXRPclNvdXJjZT86IG51bGwgfCBSZWN1cnNpdmVQYXJ0aWFsPFQ+LFxuICAgIC4uLmFkZGl0aW9uYWxTb3VyY2VzOiBBcnJheTxSZWN1cnNpdmVQYXJ0aWFsPFQ+PlxuKTogVCA9PiB7XG4gICAgbGV0IGRlZXA6IGJvb2xlYW4gfCB0eXBlb2YgSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wgPSBmYWxzZVxuICAgIGxldCBzb3VyY2VzOiBBcnJheTxSZWN1cnNpdmVQYXJ0aWFsPFQ+IHwgbnVsbD4gPSBhZGRpdGlvbmFsU291cmNlc1xuICAgIGxldCB0YXJnZXQ6IG51bGwgfCBSZWN1cnNpdmVQYXJ0aWFsPFQ+IHwgdW5kZWZpbmVkXG5cbiAgICBpZiAoXG4gICAgICAgIHRhcmdldE9yRGVlcEluZGljYXRvciA9PT0gSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wgfHxcbiAgICAgICAgdHlwZW9mIHRhcmdldE9yRGVlcEluZGljYXRvciA9PT0gJ2Jvb2xlYW4nXG4gICAgKSB7XG4gICAgICAgIC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24gYW5kIHNraXAgZGVlcCBpbmRpY2F0b3IgYW5kIHRhcmdldC5cbiAgICAgICAgZGVlcCA9IHRhcmdldE9yRGVlcEluZGljYXRvciBhc1xuICAgICAgICAgICAgYm9vbGVhbiB8IHR5cGVvZiBJR05PUkVfTlVMTF9BTkRfVU5ERUZJTkVEX1NZTUJPTFxuICAgICAgICB0YXJnZXQgPSB0YXJnZXRPclNvdXJjZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldE9yRGVlcEluZGljYXRvclxuICAgICAgICBpZiAoaXNPYmplY3QodGFyZ2V0T3JTb3VyY2UpKVxuICAgICAgICAgICAgc291cmNlcyA9IFt0YXJnZXRPclNvdXJjZSwgLi4uc291cmNlc11cbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0T3JTb3VyY2UgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldE9yU291cmNlXG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VWYWx1ZSA9IChcbiAgICAgICAgdGFyZ2V0VmFsdWU6IFZhbHVlT2Y8VD4sIHZhbHVlOiBWYWx1ZU9mPFQ+XG4gICAgKTogVmFsdWVPZjxUPiA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdGFyZ2V0VmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0VmFsdWVcblxuICAgICAgICAvLyBUcmF2ZXJzZSByZWN1cnNpdmVseSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgbWFwcy5cbiAgICAgICAgaWYgKGRlZXAgJiYgdmFsdWUgJiYgKGlzUGxhaW5PYmplY3QodmFsdWUpIHx8IGlzTWFwKHZhbHVlKSkpIHtcbiAgICAgICAgICAgIGxldCBjbG9uZTogVmFsdWVPZjxUPlxuICAgICAgICAgICAgaWYgKGlzTWFwKHZhbHVlKSlcbiAgICAgICAgICAgICAgICBjbG9uZSA9ICh0YXJnZXRWYWx1ZSAmJiBpc01hcCh0YXJnZXRWYWx1ZSkpID9cbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUgOlxuICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKCkgYXMgdW5rbm93biBhcyBWYWx1ZU9mPFQ+XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY2xvbmUgPSAodGFyZ2V0VmFsdWUgJiYgaXNQbGFpbk9iamVjdCh0YXJnZXRWYWx1ZSkpID9cbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUgOlxuICAgICAgICAgICAgICAgICAgICB7fSBhcyB1bmtub3duIGFzIFZhbHVlT2Y8VD5cblxuICAgICAgICAgICAgcmV0dXJuIGV4dGVuZChkZWVwLCBjbG9uZSBhcyBSZWN1cnNpdmVQYXJ0aWFsPFQ+LCB2YWx1ZSkgYXNcbiAgICAgICAgICAgICAgICBWYWx1ZU9mPFQ+XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgIGxldCB0YXJnZXRUeXBlOiBzdHJpbmcgPSB0eXBlb2YgdGFyZ2V0XG4gICAgICAgIGxldCBzb3VyY2VUeXBlOiBzdHJpbmcgPSB0eXBlb2Ygc291cmNlXG5cbiAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpXG4gICAgICAgICAgICB0YXJnZXRUeXBlICs9ICcgTWFwJ1xuICAgICAgICBpZiAoaXNNYXAoc291cmNlKSlcbiAgICAgICAgICAgIHNvdXJjZVR5cGUgKz0gJyBNYXAnXG5cbiAgICAgICAgaWYgKHRhcmdldFR5cGUgPT09IHNvdXJjZVR5cGUgJiYgdGFyZ2V0ICE9PSBzb3VyY2UpXG4gICAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSAmJiBpc01hcChzb3VyY2UpKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZSlcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldChrZXkpIGFzIFZhbHVlT2Y8VD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgVmFsdWVPZjxUPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBpc09iamVjdCh0YXJnZXQpICYmICFBcnJheS5pc0FycmF5KHRhcmdldCkgJiZcbiAgICAgICAgICAgICAgICAhKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiB0YXJnZXQgaW5zdGFuY2VvZiBCbG9iKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHNvdXJjZSkgJiYgIUFycmF5LmlzQXJyYXkoc291cmNlKSAmJlxuICAgICAgICAgICAgICAgICEodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIHNvdXJjZSBpbnN0YW5jZW9mIEJsb2IpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIShcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZXAgPT09IElHTk9SRV9OVUxMX0FORF9VTkRFRklORURfU1lNQk9MICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyh2YWx1ZSBhcyBudWxsKVxuICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXSA9IG1lcmdlVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXSBhcyBWYWx1ZU9mPFQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIFZhbHVlT2Y8VD5cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHNvdXJjZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YXJnZXQgPSBzb3VyY2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0IGFzIFRcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcHJveHkgaGFuZGxlciB3aGljaCBmb3J3YXJkcyBhbGwgb3BlcmF0aW9ucyB0byBnaXZlbiBvYmplY3RcbiAqIGFzIHRoZXJlIHdvdWxkbid0IGJlIGEgcHJveHkuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gT2JqZWN0IHRvIHByb3h5LlxuICogQHBhcmFtIG1ldGhvZE5hbWVzIC0gTWFwcGluZyBvZiBvcGVyYW5kIG5hbWUgdG8gb2JqZWN0IHNwZWNpZmljIG1ldGhvZFxuICogbmFtZS5cbiAqIEByZXR1cm5zIERldGVybWluZWQgcHJveHkgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByb3h5SGFuZGxlciA9IDxUID0gdW5rbm93bj4oXG4gICAgdGFyZ2V0OiBULCBtZXRob2ROYW1lczogTWFwcGluZyA9IHt9XG4pOiBQcm94eUhhbmRsZXI8VD4gPT4ge1xuICAgIG1ldGhvZE5hbWVzID0ge1xuICAgICAgICBkZWxldGU6ICdbXScsXG4gICAgICAgIGdldDogJ1tdJyxcbiAgICAgICAgaGFzOiAnW10nLFxuICAgICAgICBzZXQ6ICdbXScsXG4gICAgICAgIC4uLm1ldGhvZE5hbWVzXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVsZXRlUHJvcGVydHk6IChfdGFyZ2V0T2JqZWN0OiBULCBrZXk6IHN0cmluZyB8IHN5bWJvbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzLmRlbGV0ZSA9PT0gJ1tdJyAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2ROYW1lcy5kZWxldGUgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4gYm9vbGVhblxuICAgICAgICAgICAgICAgICkoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBnZXQ6IChfdGFyZ2V0T2JqZWN0OiBULCBrZXk6IHN0cmluZyB8IHN5bWJvbCk6IHVua25vd24gPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzLmdldCA9PT0gJ1tdJyAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleSBhcyBrZXlvZiBUXVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2ROYW1lcy5nZXQgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcgfCBzeW1ib2wpID0+IHVua25vd25cbiAgICAgICAgICAgICkoa2V5KVxuICAgICAgICB9LFxuICAgICAgICBoYXM6IChfdGFyZ2V0T2JqZWN0OiBULCBrZXk6IHN0cmluZyB8IHN5bWJvbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzLmhhcyA9PT0gJ1tdJylcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5IGluICh0YXJnZXQgYXMgb2JqZWN0KVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2ROYW1lcy5oYXMgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAoa2V5OiBzdHJpbmcgfCBzeW1ib2wpID0+IGJvb2xlYW5cbiAgICAgICAgICAgICkoa2V5KVxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChcbiAgICAgICAgICAgIF90YXJnZXRPYmplY3Q6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93blxuICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGlmIChtZXRob2ROYW1lcy5zZXQgPT09ICdbXScgJiYgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleSBhcyBrZXlvZiBUXSA9IHZhbHVlIGFzIFRba2V5b2YgVF1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRhcmdldFttZXRob2ROYW1lcy5zZXQgYXMga2V5b2YgVF0gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pID0+IGJvb2xlYW5cbiAgICAgICAgICAgICAgICApKGtleSwgdmFsdWUpXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFNsaWNlcyBhbGwgcHJvcGVydGllcyBmcm9tIGdpdmVuIG9iamVjdCB3aGljaCBkb2VzIG5vdCBtYXRjaCBwcm92aWRlZFxuICogb2JqZWN0IG1hc2suIEl0ZW1zIGNhbiBiZSBleHBsaWNpdGx5IHdoaXRlbGlzdGVkIHZpYSBcImluY2x1ZGVcIiBtYXNrXG4gKiBjb25maWd1cmF0aW9uIG9yIGJsYWNrIGxpc3RlZCB2aWEgXCJleGNsdWRlXCIgbWFzayBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBzbGljZS5cbiAqIEBwYXJhbSBtYXNrQ29uZmlndXJhdGlvbiAtIE1hc2sgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIEdpdmVuIGJ1dCBzbGljZWQgb2JqZWN0LiBJZiAobmVzdGVkKSBvYmplY3Qgd2lsbCBiZSBtb2RpZmllZCBhXG4gKiBmbGF0IGNvcHkgb2YgdGhhdCBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1hc2sgPSA8VHlwZSBleHRlbmRzIE1hcHBpbmc8dW5rbm93bj4gPSBNYXBwaW5nPHVua25vd24+PihcbiAgICBvYmplY3Q6IFR5cGUsIG1hc2tDb25maWd1cmF0aW9uOiBPYmplY3RNYXNrQ29uZmlndXJhdGlvblxuKTogUmVjdXJzaXZlUGFydGlhbDxUeXBlPiA9PiB7XG4gICAgbWFza0NvbmZpZ3VyYXRpb24gPSB7ZXhjbHVkZTogZmFsc2UsIGluY2x1ZGU6IHRydWUsIC4uLm1hc2tDb25maWd1cmF0aW9ufVxuXG4gICAgaWYgKFxuICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5leGNsdWRlID09PSB0cnVlIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkobWFza0NvbmZpZ3VyYXRpb24uZXhjbHVkZSkgJiZcbiAgICAgICAgbWFza0NvbmZpZ3VyYXRpb24uZXhjbHVkZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgbWFza0NvbmZpZ3VyYXRpb24uaW5jbHVkZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCdcbiAgICApXG4gICAgICAgIHJldHVybiB7fVxuXG4gICAgY29uc3QgZXhjbHVkZTogTm9ybWFsaXplZE9iamVjdE1hc2sgPVxuICAgICAgICBBcnJheS5pc0FycmF5KG1hc2tDb25maWd1cmF0aW9uLmV4Y2x1ZGUpID9cbiAgICAgICAgICAgIG1hc2tDb25maWd1cmF0aW9uLmV4Y2x1ZGUucmVkdWNlKFxuICAgICAgICAgICAgICAgIChtYXNrLCBrZXkpID0+ICh7Li4ubWFzaywgW2tleV06IHRydWV9KSxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5leGNsdWRlIGFzIE5vcm1hbGl6ZWRPYmplY3RNYXNrXG4gICAgY29uc3QgaW5jbHVkZTogTm9ybWFsaXplZE9iamVjdE1hc2sgPVxuICAgICAgICBBcnJheS5pc0FycmF5KG1hc2tDb25maWd1cmF0aW9uLmluY2x1ZGUpID9cbiAgICAgICAgICAgIG1hc2tDb25maWd1cmF0aW9uLmluY2x1ZGUucmVkdWNlKFxuICAgICAgICAgICAgICAgIChtYXNrLCBrZXkpID0+ICh7Li4ubWFzaywgW2tleV06IHRydWV9KSxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5pbmNsdWRlIGFzIE5vcm1hbGl6ZWRPYmplY3RNYXNrXG5cbiAgICBsZXQgcmVzdWx0OiBQYXJ0aWFsPFR5cGU+ID0ge31cbiAgICBpZiAoaXNQbGFpbk9iamVjdChpbmNsdWRlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbmNsdWRlKSlcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBUeXBlXSA9IG9iamVjdFtrZXkgYXMga2V5b2YgVHlwZV1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBvYmplY3Rba2V5IGFzIGtleW9mIFR5cGVdID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdCBhcyBNYXBwaW5nPE1hcHBpbmc8dW5rbm93bj4+KVtrZXldID0gbWFzayhcbiAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3QgYXMgTWFwcGluZzxNYXBwaW5nPHVua25vd24+Pilba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpbmNsdWRlOiB2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgIH0gZWxzZVxuICAgICAgICAvLyBJbiB0aGlzIGJyYW5jaCBcIm1hc2suaW5jbHVkZSA9PT0gdHJ1ZVwiIGhvbGRzLlxuICAgICAgICByZXN1bHQgPSBvYmplY3RcblxuICAgIGlmIChpc1BsYWluT2JqZWN0KGV4Y2x1ZGUpKSB7XG4gICAgICAgIGxldCB1c2VDb3B5ID0gZmFsc2VcbiAgICAgICAgY29uc3QgY29weTogUmVjdXJzaXZlUGFydGlhbDxUeXBlPiA9IHsuLi5yZXN1bHR9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhjbHVkZSkpXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGtleSkpXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZUNvcHkgPSB0cnVlXG5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvcHlba2V5IGFzIGtleW9mIFR5cGVdXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjb3B5W2tleSBhcyBrZXlvZiBUeXBlXSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudDogVmFsdWVPZjxUeXBlPiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2tleSBhcyBrZXlvZiBUeXBlXSBhcyBWYWx1ZU9mPFR5cGU+XG5cbiAgICAgICAgICAgICAgICAgICAgOyhjb3B5IGFzIE1hcHBpbmc8TWFwcGluZzx1bmtub3duPj4pW2tleV0gPSBtYXNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvcHkgYXMgTWFwcGluZzxNYXBwaW5nPHVua25vd24+Pilba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtleGNsdWRlOiB2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlba2V5IGFzIGtleW9mIFR5cGVdIGFzIFZhbHVlT2Y8VHlwZT4gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNvcHkgPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VDb3B5KVxuICAgICAgICAgICAgcmVzdWx0ID0gY29weVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogTW9kaWZpZXMgZ2l2ZW4gdGFyZ2V0IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gc291cmNlIGFuZCByZW1vdmVzIHNvdXJjZVxuICogbW9kaWZpY2F0aW9uIGluZm9zLlxuICogQHBhcmFtIHRhcmdldCAtIE9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gc291cmNlIC0gU291cmNlIG9iamVjdCB0byBsb2FkIG1vZGlmaWNhdGlvbnMgZnJvbS5cbiAqIEBwYXJhbSByZW1vdmVJbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSBvciB2YWx1ZSB0byBtYXJrIGFcbiAqIHZhbHVlIHRvIHJlbW92ZSBmcm9tIG9iamVjdCBvciBsaXN0LlxuICogQHBhcmFtIHByZXBlbmRJbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrIGEgdmFsdWUgdG9cbiAqIHByZXBlbmQgdG8gdGFyZ2V0IGxpc3QuXG4gKiBAcGFyYW0gYXBwZW5kSW5kaWNhdG9yS2V5IC0gSW5kaWNhdG9yIHByb3BlcnR5IG5hbWUgdG8gbWFyayBhIHZhbHVlIHRvXG4gKiBhcHBlbmQgdG8gdGFyZ2V0IGxpc3QuXG4gKiBAcGFyYW0gcG9zaXRpb25QcmVmaXggLSBJbmRpY2F0ZXMgYSBwcmVmaXggdG8gdXNlIGEgdmFsdWUgb24gZ2l2ZW5cbiAqIHBvc2l0aW9uIHRvIGFkZCBvciByZW1vdmUuXG4gKiBAcGFyYW0gcG9zaXRpb25TdWZmaXggLSBJbmRpY2F0ZXMgYSBzdWZmaXggdG8gdXNlIGEgdmFsdWUgb24gZ2l2ZW5cbiAqIHBvc2l0aW9uIHRvIGFkZCBvciByZW1vdmUuXG4gKiBAcGFyYW0gcGFyZW50U291cmNlIC0gU291cmNlIGNvbnRleHQgdG8gcmVtb3ZlIG1vZGlmaWNhdGlvbiBpbmZvIGZyb21cbiAqICh1c3VhbGx5IG9ubHkgbmVlZGVkIGludGVybmFsbHkpLlxuICogQHBhcmFtIHBhcmVudEtleSAtIFNvdXJjZSBrZXkgaW4gZ2l2ZW4gc291cmNlIGNvbnRleHQgdG8gcmVtb3ZlXG4gKiBtb2RpZmljYXRpb24gaW5mbyBmcm9tICh1c3VhbGx5IG9ubHkgbmVlZGVkIGludGVybmFsbHkpLlxuICogQHJldHVybnMgR2l2ZW4gdGFyZ2V0IG1vZGlmaWVkIHdpdGggZ2l2ZW4gc291cmNlLlxuICovXG5leHBvcnQgY29uc3QgbW9kaWZ5T2JqZWN0ID0gPFQgPSB1bmtub3duPihcbiAgICB0YXJnZXQ6IFQsXG4gICAgc291cmNlOiB1bmtub3duLFxuICAgIHJlbW92ZUluZGljYXRvcktleSA9ICdfX3JlbW92ZV9fJyxcbiAgICBwcmVwZW5kSW5kaWNhdG9yS2V5ID0gJ19fcHJlcGVuZF9fJyxcbiAgICBhcHBlbmRJbmRpY2F0b3JLZXkgPSAnX19hcHBlbmRfXycsXG4gICAgcG9zaXRpb25QcmVmaXggPSAnX18nLFxuICAgIHBvc2l0aW9uU3VmZml4ID0gJ19fJyxcbiAgICBwYXJlbnRTb3VyY2U6IHVua25vd24gPSBudWxsLFxuICAgIHBhcmVudEtleTogdW5rbm93biA9IG51bGxcbik6IFQgPT4ge1xuICAgIGlmIChpc01hcChzb3VyY2UpICYmIGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc291cmNlKVxuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICBtb2RpZnlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXQoa2V5KSBhcyBWYWx1ZU9mPFQ+LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBNYXA8dW5rbm93biwgdW5rbm93bj4gfCBNYXBwaW5nPHVua25vd24+IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBwcmVwZW5kSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJlZml4LFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblN1ZmZpeCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICApXG4gICAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpICYmIGlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgc291cmNlVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IE5hTlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgIGtleS5zdGFydHNXaXRoKHBvc2l0aW9uUHJlZml4KSAmJlxuICAgICAgICAgICAgICAgIGtleS5lbmRzV2l0aChwb3NpdGlvblN1ZmZpeClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gcGFyc2VJbnQoXG4gICAgICAgICAgICAgICAgICAgIGtleS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblByZWZpeC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU3VmZml4Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gTmFOXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBbcmVtb3ZlSW5kaWNhdG9yS2V5LCBwcmVwZW5kSW5kaWNhdG9yS2V5LCBhcHBlbmRJbmRpY2F0b3JLZXldXG4gICAgICAgICAgICAgICAgICAgIC5pbmNsdWRlcyhrZXkpIHx8XG4gICAgICAgICAgICAgICAgIWlzTmFOKGluZGV4KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcmVtb3ZlSW5kaWNhdG9yS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXM6IEFycmF5PHVua25vd24+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoW10gYXMgQXJyYXk8dW5rbm93bj4pLmNvbmNhdChzb3VyY2VWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdGFydHNXaXRoKHBvc2l0aW9uUHJlZml4KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5lbmRzV2l0aChwb3NpdGlvblN1ZmZpeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zcGxpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJlZml4Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25TdWZmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldC5pbmNsdWRlcyh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zcGxpY2UodGFyZ2V0LmluZGV4T2YodmFsdWUpLCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDwgdGFyZ2V0Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNwbGljZSh2YWx1ZSwgMSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IGFwcGVuZEluZGljYXRvcktleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5jb25jYXQoc291cmNlVmFsdWUpIGFzIHVua25vd24gYXMgVFxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IHByZXBlbmRJbmRpY2F0b3JLZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAoW10gYXMgQXJyYXk8dW5rbm93bj4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChzb3VyY2VWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHRhcmdldCkgYXMgdW5rbm93biBhcyBUXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KHRhcmdldFtpbmRleF0pICYmIGlzT2JqZWN0KHNvdXJjZVZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2luZGV4XSBhcyBSZWN1cnNpdmVQYXJ0aWFsPFZhbHVlT2Y8VD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VWYWx1ZSBhcyBSZWN1cnNpdmVQYXJ0aWFsPFZhbHVlT2Y8VD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmRJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25QcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU3VmZml4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdIGFzIFJlY3Vyc2l2ZVBhcnRpYWw8VmFsdWVPZjxUPj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVmFsdWUgYXMgUmVjdXJzaXZlUGFydGlhbDxWYWx1ZU9mPFQ+PlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdID0gc291cmNlVmFsdWUgYXMgVmFsdWVPZjxUPlxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gcmVtb3ZlSW5kaWNhdG9yS2V5KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIChbXSBhcyBBcnJheTx1bmtub3duPikuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApW3ZhbHVlXVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2Vba2V5XVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFNvdXJjZSAmJiB0eXBlb2YgcGFyZW50S2V5ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNvdXJjZSBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgIClbcGFyZW50S2V5XVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKHRhcmdldCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICBtb2RpZnlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0IGFzIHVua25vd24gYXMgTWFwcGluZzxWYWx1ZU9mPFQ+Pilba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJlZml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25TdWZmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0XG59XG4vKipcbiAqIFJlbW92ZXMgZ2l2ZW4ga2V5IGZyb20gZ2l2ZW4gb2JqZWN0IHJlY3Vyc2l2ZWx5LlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBwcm9jZXNzLlxuICogQHBhcmFtIGtleXMgLSBMaXN0IG9mIGtleXMgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgUHJvY2Vzc2VkIGdpdmVuIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUtleVByZWZpeGVzID0gPFQ+KFxuICAgIG9iamVjdDogVCwga2V5czogQXJyYXk8c3RyaW5nPiB8IHN0cmluZyA9ICcjJ1xuKTogVCA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRLZXlzOiBBcnJheTxzdHJpbmc+ID0gKFtdIGFzIEFycmF5PHN0cmluZz4pLmNvbmNhdChrZXlzKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgIGZvciAoY29uc3Qgc3ViT2JqZWN0IG9mIG9iamVjdC5zbGljZSgpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1Yk9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZEtleXMpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJPYmplY3Quc3RhcnRzV2l0aChgJHtrZXl9OmApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGFzIEFycmF5PHN0cmluZz4pLnNwbGljZShpbmRleCwgMSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChza2lwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAob2JqZWN0IGFzIEFycmF5PHVua25vd24+KVtpbmRleF0gPVxuICAgICAgICAgICAgICAgIHJlbW92ZUtleVByZWZpeGVzKHN1Yk9iamVjdCwgcmVzb2x2ZWRLZXlzKVxuXG4gICAgICAgICAgICBpbmRleCArPSAxXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU2V0KG9iamVjdCkpXG4gICAgICAgIGZvciAoY29uc3Qgc3ViT2JqZWN0IG9mIG5ldyBTZXQob2JqZWN0KSkge1xuICAgICAgICAgICAgbGV0IHNraXAgPSBmYWxzZVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1Yk9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZEtleXMpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJPYmplY3Quc3RhcnRzV2l0aChgJHtrZXl9OmApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGVsZXRlKHN1Yk9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2tpcClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVtb3ZlS2V5UHJlZml4ZXMoc3ViT2JqZWN0LCByZXNvbHZlZEtleXMpXG4gICAgICAgIH1cbiAgICBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHN1Yk9iamVjdF0gb2YgbmV3IE1hcChvYmplY3QpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZWRLZXkgb2YgcmVzb2x2ZWRLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWRLZXkgPSBlc2NhcGVSZWd1bGFyRXhwcmVzc2lvbnMocmVzb2x2ZWRLZXkpXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXcgUmVnRXhwKGBeJHtlc2NhcGVkS2V5fVswLTldKiRgKS50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUoa2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2tpcClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2JqZWN0LnNldChrZXksIHJlbW92ZUtleVByZWZpeGVzKHN1Yk9iamVjdCwgcmVzb2x2ZWRLZXlzKSlcbiAgICAgICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSwgb2JqZWN0XG4gICAgICAgICkpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZWRLZXkgb2YgcmVzb2x2ZWRLZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZEtleTogc3RyaW5nID0gZXNjYXBlUmVndWxhckV4cHJlc3Npb25zKHJlc29sdmVkS2V5KVxuXG4gICAgICAgICAgICAgICAgaWYgKG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRLZXl9WzAtOV0qJGApLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKG9iamVjdCBhcyB1bmtub3duIGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV1cbiAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChza2lwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIDsob2JqZWN0IGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPilba2V5XSA9XG4gICAgICAgICAgICAgICAgcmVtb3ZlS2V5UHJlZml4ZXModmFsdWUsIHJlc29sdmVkS2V5cylcbiAgICAgICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdFxufVxuLyoqXG4gKiBSZXByZXNlbnRzIGdpdmVuIG9iamVjdCBhcyBmb3JtYXR0ZWQgc3RyaW5nLlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byByZXByZXNlbnQuXG4gKiBAcGFyYW0gbWF4aW11bUxlbmd0aE9mTGlzdHMgLSBNYXhpbXVtIG51bWJlciBvZiBhcnJheSBpdGVtIHRvIHJlbmRlci5cbiAqIEBwYXJhbSBpbmRlbnRpb24gLSBTdHJpbmcgKHVzdWFsbHkgd2hpdGVzcGFjZXMpIHRvIHVzZSBhcyBpbmRlbnRpb24uXG4gKiBAcGFyYW0gaW5pdGlhbEluZGVudGlvbiAtIFN0cmluZyAodXN1YWxseSB3aGl0ZXNwYWNlcykgdG8gdXNlIGFzXG4gKiBhZGRpdGlvbmFsIGluZGVudGlvbiBmb3IgdGhlIGZpcnN0IG9iamVjdCB0cmF2ZXJzaW5nIGxldmVsLlxuICogQHBhcmFtIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyIC0gUmVwbGFjZW1lbnQgZm9yIG9iamVjdHNcbiAqIHdoaWNoIGFyZSBvdXQgb2Ygc3BlY2lmaWVkIGJvdW5kcyB0byB0cmF2ZXJzZS5cbiAqIEBwYXJhbSBudW1iZXJPZkxldmVscyAtIFNwZWNpZmllcyBudW1iZXIgb2YgbGV2ZWxzIHRvIHRyYXZlcnNlIGdpdmVuXG4gKiBkYXRhIHN0cnVjdHVyZS5cbiAqIEByZXR1cm5zIFJlcHJlc2VudGF0aW9uIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcHJlc2VudCA9IChcbiAgICBvYmplY3Q6IHVua25vd24sXG4gICAgbWF4aW11bUxlbmd0aE9mTGlzdHMgPSAzMCxcbiAgICBpbmRlbnRpb24gPSAnICAgICcsXG4gICAgaW5pdGlhbEluZGVudGlvbiA9ICcnLFxuICAgIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcgPVxuICAgICdfX21heGltdW1fbnVtYmVyX29mX2xldmVsc19yZWFjaGVkX18nLFxuICAgIG51bWJlck9mTGV2ZWxzID0gOFxuKTogc3RyaW5nID0+IHtcbiAgICBpZiAobnVtYmVyT2ZMZXZlbHMgPT09IDApXG4gICAgICAgIHJldHVybiBTdHJpbmcobWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIpXG5cbiAgICBpZiAob2JqZWN0ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gJ251bGwnXG5cbiAgICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJ1xuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gYFwiJHtvYmplY3QucmVwbGFjZSgvXFxuL2csIGBcXG4ke2luaXRpYWxJbmRlbnRpb259YCl9XCJgXG5cbiAgICBpZiAoaXNOdW1lcmljKG9iamVjdCkgfHwgdHlwZW9mIG9iamVjdCA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICByZXR1cm4gU3RyaW5nKG9iamVjdClcblxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKClcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICdbJ1xuXG4gICAgICAgIGxldCBmaXJzdFNlZW4gPSBmYWxzZVxuICAgICAgICBsZXQgY291bnRlciA9IDFcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIgPiBtYXhpbXVtTGVuZ3RoT2ZMaXN0cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbml0aWFsSW5kZW50aW9ufS4uLmBcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RTZWVuKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCdcblxuICAgICAgICAgICAgcmVzdWx0ICs9XG4gICAgICAgICAgICAgICAgYFxcbiR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gICtcbiAgICAgICAgICAgICAgICByZXByZXNlbnQoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1MZW5ndGhPZkxpc3RzLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRpb24sXG4gICAgICAgICAgICAgICAgICAgIGAke2luaXRpYWxJbmRlbnRpb259JHtpbmRlbnRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlck9mTGV2ZWxzIC0gMVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgZmlyc3RTZWVuID0gdHJ1ZVxuXG4gICAgICAgICAgICBjb3VudGVyICs9IDFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICByZXN1bHQgKz0gYFxcbiR7aW5pdGlhbEluZGVudGlvbn1gXG5cbiAgICAgICAgcmVzdWx0ICs9ICddJ1xuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBpZiAoaXNNYXAob2JqZWN0KSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gJydcblxuICAgICAgICBsZXQgZmlyc3RTZWVuID0gZmFsc2VcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAxXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoY291bnRlciA+IG1heGltdW1MZW5ndGhPZkxpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGAsXFxuJHtpbml0aWFsSW5kZW50aW9ufS4uLmBcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RTZWVuKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgLFxcbiR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gXG5cbiAgICAgICAgICAgIHJlc3VsdCArPVxuICAgICAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTGVuZ3RoT2ZMaXN0cyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50aW9uLFxuICAgICAgICAgICAgICAgICAgICBgJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkxldmVscyAtIDFcbiAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAnIC0+ICcgK1xuICAgICAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bUxlbmd0aE9mTGlzdHMsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudGlvbixcbiAgICAgICAgICAgICAgICAgICAgYCR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZMZXZlbHNSZWFjaGVkSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZMZXZlbHMgLSAxXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmaXJzdFNlZW4gPSB0cnVlXG5cbiAgICAgICAgICAgIGNvdW50ZXIgKz0gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaXJzdFNlZW4pXG4gICAgICAgICAgICByZXN1bHQgPSAnRW1wdHlNYXAnXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSAneydcblxuICAgICAgICBsZXQgZmlyc3RTZWVuID0gZmFsc2VcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAxXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyID4gbWF4aW11bUxlbmd0aE9mTGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYCxcXG4ke2luaXRpYWxJbmRlbnRpb259Li4uYFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJ1xuXG4gICAgICAgICAgICByZXN1bHQgKz1cbiAgICAgICAgICAgICAgICBgXFxuJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAgK1xuICAgICAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bUxlbmd0aE9mTGlzdHMsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudGlvbixcbiAgICAgICAgICAgICAgICAgICAgYCR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZMZXZlbHNSZWFjaGVkSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZMZXZlbHMgLSAxXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmaXJzdFNlZW4gPSB0cnVlXG5cbiAgICAgICAgICAgIGNvdW50ZXIgKz0gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpcnN0U2VlbilcbiAgICAgICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbml0aWFsSW5kZW50aW9ufX1gXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdCA9ICdFbXB0eVNldCdcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqZWN0KSlcbiAgICAgICAgcmV0dXJuICdfX2Z1bmN0aW9uX18nXG5cbiAgICBsZXQgcmVzdWx0ID0gJ3snXG4gICAgY29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkuc29ydCgpXG4gICAgbGV0IGZpcnN0U2VlbiA9IGZhbHNlXG4gICAgbGV0IGNvdW50ZXIgPSAxXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAoY291bnRlciA+IG1heGltdW1MZW5ndGhPZkxpc3RzKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYCxcXG4ke2luaXRpYWxJbmRlbnRpb259Li4uYFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICByZXN1bHQgKz0gJywnXG5cbiAgICAgICAgcmVzdWx0ICs9XG4gICAgICAgICAgICBgXFxuJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufSR7a2V5fTogYCArXG4gICAgICAgICAgICByZXByZXNlbnQoXG4gICAgICAgICAgICAgICAgKG9iamVjdCBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldLFxuICAgICAgICAgICAgICAgIG1heGltdW1MZW5ndGhPZkxpc3RzLFxuICAgICAgICAgICAgICAgIGluZGVudGlvbixcbiAgICAgICAgICAgICAgICBgJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAsXG4gICAgICAgICAgICAgICAgbWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZMZXZlbHMgLSAxXG4gICAgICAgICAgICApXG5cbiAgICAgICAgZmlyc3RTZWVuID0gdHJ1ZVxuXG4gICAgICAgIGNvdW50ZXIgKz0gMVxuICAgIH1cblxuICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbml0aWFsSW5kZW50aW9ufWBcblxuICAgIHJlc3VsdCArPSAnfSdcblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogU29ydCBnaXZlbiBvYmplY3RzIGtleXMuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHdoaWNoIGtleXMgc2hvdWxkIGJlIHNvcnRlZC5cbiAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIGdpdmVuIGtleXMuXG4gKi9cbmV4cG9ydCBjb25zdCBzb3J0ID0gKG9iamVjdDogdW5rbm93bik6IEFycmF5PHVua25vd24+ID0+IHtcbiAgICBjb25zdCBrZXlzOiBBcnJheTx1bmtub3duPiA9IFtdXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqZWN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICAgICAgICAgIGtleXMucHVzaChpbmRleClcbiAgICBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JylcbiAgICAgICAgaWYgKGlzTWFwKG9iamVjdCkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleVZhbHVlUGFpciBvZiBvYmplY3QpXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleVZhbHVlUGFpclswXSlcbiAgICAgICAgZWxzZSBpZiAob2JqZWN0ICE9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqZWN0KSlcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KVxuXG4gICAgcmV0dXJuIGtleXMuc29ydCgpXG59XG4vKipcbiAqIFJlbW92ZXMgYSBwcm94eSBmcm9tIGdpdmVuIGRhdGEgc3RydWN0dXJlIHJlY3Vyc2l2ZWx5LlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBwcm94eS5cbiAqIEBwYXJhbSBzZWVuT2JqZWN0cyAtIFRyYWNrcyBhbGwgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0cyB0byBhdm9pZFxuICogZW5kbGVzcyBsb29wcyAodXN1YWxseSBvbmx5IG5lZWRlZCBmb3IgaW50ZXJuYWwgcHVycG9zZSkuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGdpdmVuIG9iamVjdCB1bndyYXBwZWQgZnJvbSBhIGR5bmFtaWMgcHJveHkuXG4gKi9cbmV4cG9ydCBjb25zdCB1bndyYXBQcm94eSA9IDxUID0gdW5rbm93bj4oXG4gICAgb2JqZWN0OiBQcm94eVR5cGU8VD4gfCBULCBzZWVuT2JqZWN0czogU2V0PHVua25vd24+ID0gbmV3IFNldDx1bmtub3duPigpXG4pOiBUID0+IHtcbiAgICBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICBpZiAoc2Vlbk9iamVjdHMuaGFzKG9iamVjdCkpXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKG9iamVjdC5fX3Jldm9rZV9fKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb3h5KG9iamVjdCkpXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5fX3RhcmdldF9fXG5cbiAgICAgICAgICAgICAgICA7KG9iamVjdCBhcyB1bmtub3duIGFzIHtfX3Jldm9rZV9fOiAoKSA9PiB2b2lkfSkuX19yZXZva2VfXygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdFxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2Vlbk9iamVjdHMuYWRkKG9iamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2luZGV4XSA9IHVud3JhcFByb3h5KHZhbHVlLCBzZWVuT2JqZWN0cylcblxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc01hcChvYmplY3QpKVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqZWN0KVxuICAgICAgICAgICAgICAgIG9iamVjdC5zZXQoa2V5LCB1bndyYXBQcm94eSh2YWx1ZSwgc2Vlbk9iamVjdHMpKVxuICAgICAgICBlbHNlIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZTogQXJyYXk8dW5rbm93bj4gPSBbXVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUodmFsdWUpXG4gICAgICAgICAgICAgICAgY2FjaGUucHVzaCh1bndyYXBQcm94eSh2YWx1ZSwgc2Vlbk9iamVjdHMpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlKVxuICAgICAgICAgICAgICAgIG9iamVjdC5hZGQodmFsdWUpXG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICAgICAgb2JqZWN0IGFzIHVua25vd24gYXMgb2JqZWN0XG4gICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgIG9iamVjdFtrZXkgYXMga2V5b2YgVF0gPVxuICAgICAgICAgICAgICAgICAgICB1bndyYXBQcm94eSh2YWx1ZSwgc2Vlbk9iamVjdHMpIGFzIFZhbHVlT2Y8VD5cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUNBLFNBQ0kscUJBQXFCLEVBQUUsZ0NBQWdDLEVBQUUsaUJBQWlCO0FBRTlFLFNBQ0ksVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUztBQUV6RSxTQUFRLFlBQVk7QUFDcEIsU0FBUSx3QkFBd0IsRUFBRSxvQkFBb0I7O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSx5QkFBeUIsR0FBRyxDQUNyQyxNQUFTLEVBQ1QsYUFBb0MsR0FBRyxJQUFJLEVBQzNDLGFBQW9DLEdBQUcsSUFBSSxFQUMzQyxXQUFvQixHQUFHLENBQUMsQ0FBQyxFQUN6QixJQUFJLEdBQUcsSUFBSSxFQUNYLGFBQTZCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FDckI7RUFDbkIsSUFBSSxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUNsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQztJQUNiLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO01BQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyx5QkFBeUIsQ0FDckMsS0FBSyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLElBQ3RELENBQUM7TUFFRCxLQUFLLElBQUksQ0FBQztJQUNkO0VBQ0osQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUNwQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FDckMsS0FBSyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FDMUQsQ0FBQyxNQUNKLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0lBQ3BCLE1BQU0sS0FBcUIsR0FBRyxFQUFFO0lBQ2hDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO01BQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO01BQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQ2hDLEtBQUssRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQzFELENBQUM7SUFDTDtJQUVBLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztFQUN6QixDQUFDLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxFQUN0QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDNUMsTUFBTSxDQUFpQyxHQUFHLENBQUMsR0FDeEMseUJBQXlCLENBQ3JCLEtBQUssRUFDTCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFdBQVcsRUFDWCxJQUNKLENBQUM7RUFFakIsSUFBSSxhQUFhLElBQUksYUFBYSxFQUM5QixLQUFLLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFDNUIsSUFDSSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxZQUFhLElBQW9CLEVBQzdEO0lBQ0UsTUFBTSxjQUErQixHQUNqQyxlQUFlLENBQUksTUFBTSxFQUFFLFdBQVcsQ0FBQztJQUMzQyxNQUFNLE9BQXdCLEdBQzFCLGVBQWUsQ0FBSSxNQUFNLEVBQUUsV0FBVyxDQUFDO0lBRTNDLElBQUksYUFBYSxFQUNiLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FDVixPQUFVLEVBQUUsSUFBcUIsS0FDdkI7TUFDVixJQUFJLElBQUksS0FBSyxZQUFZLEVBQ3JCLE9BQU8sTUFBTTtNQUVqQixJQUFJLElBQUksS0FBSyxZQUFZLEVBQ3JCLE9BQU8sTUFBZTtRQUNsQixNQUFNLENBQUMsQ0FBQztRQUVSLE9BQU8sTUFBTTtNQUNqQixDQUFDO01BRUwsSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQVksS0FBSyxVQUFVLEVBQzdDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBWTtNQUVsQyxPQUFPLGFBQWEsQ0FDaEIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQU8sSUFBSSxDQUFDLEVBQ3BDLElBQUksRUFDSixNQUNKLENBQUM7SUFDTCxDQUFDO0lBRUwsSUFBSSxhQUFhLEVBQ2IsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUNWLE9BQVUsRUFBRSxJQUFxQixFQUFFLEtBQWMsS0FFakQsY0FBYyxDQUFDLEdBQUcsQ0FDZCxLQUFLLEVBQ0wsSUFBSSxFQUNKLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FDckMsQ0FBQztJQUNULE1BQU07TUFBQyxLQUFLO01BQUU7SUFBTSxDQUFDLEdBQ2pCLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBK0IsQ0FBQztJQUV4RCxPQUFPLEtBQUs7RUFDaEI7RUFFUixPQUFPLE1BQU07QUFDakIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLDJCQUEyQixHQUFHLENBQ3ZDLE1BQWUsRUFDZiwrQkFLYSxHQUFJLGVBQXdCLElBQ3JDLGVBQWUsSUFBSSx1QkFBdUIsRUFDOUMsY0FBYyxHQUFHLENBQUMsS0FDOEI7RUFDaEQsTUFBTSxXQUFrQyxHQUFHLElBQUksR0FBRyxDQUFtQixDQUFDO0VBRXRFLE1BQU0sV0FBVyxHQUFJLE1BQWUsSUFBYTtJQUM3QyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWtCLEVBQUUsS0FBYyxLQUFjO01BQzlELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDdEIsT0FBTywrQkFBK0IsQ0FDbEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQzlCLEdBQUcsRUFDSCxLQUFLLEVBQ0wsV0FDSixDQUFDOztRQUVMO1FBQ0EsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1FBRTVCLElBQUksTUFBeUM7UUFDN0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ3RCLE1BQU0sR0FBRyxFQUFFO1VBQ1gsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxDQUFDLE1BQU07VUFDSCxNQUFNLEdBQUcsQ0FBQyxDQUFDO1VBQ1gsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztRQUMvQztRQUVBLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUU5QixPQUFPLE1BQU07TUFDakI7TUFFQSxPQUFPLEtBQUs7SUFDaEIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQztFQUMzRCxDQUFDO0VBRUQsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQzlCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSx1QkFBdUIsR0FBRyxDQUNuQyxNQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksS0FDbEI7RUFDVixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtJQUM1QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtNQUNmLE1BQU0sU0FBMkIsR0FBRyxDQUFDLENBQUM7TUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFBRTtRQUM3QixJQUFJLElBQUksRUFDSixLQUFLLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztRQUVoRCxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUN6QyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSztNQUN0QztNQUVBLE9BQU8sU0FBUztJQUNwQjtJQUVBLElBQUksSUFBSSxFQUNKLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUNyQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDNUMsTUFBTSxDQUFzQixHQUFHLENBQUMsR0FDN0IsdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDNUIsSUFBSSxLQUFLLEdBQUcsQ0FBQztNQUViLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFvQjtRQUN6QyxNQUFNLENBQW9CLEtBQUssQ0FBQyxHQUM3Qix1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1FBRXhDLEtBQUssSUFBSSxDQUFDO01BQ2Q7SUFDSixDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDdEIsTUFBTSxLQUFxQixHQUFHLEVBQUU7TUFFaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFFcEIsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7TUFDcEQ7TUFFQSxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDekI7RUFDUjtFQUVBLE9BQU8sTUFBTTtBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0sdUJBQXVCLEdBQUcsQ0FDbkMsTUFBZSxFQUFFLElBQUksR0FBRyxJQUFJLEtBQ2xCO0VBQ1YsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7SUFDNUIsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQTJCLENBQUM7TUFDckQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDL0MsSUFBSSxJQUFJLEVBQ0gsTUFBTSxDQUFzQixHQUFHLENBQUMsR0FDN0IsdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztRQUU1QyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRyxNQUFNLENBQXNCLEdBQUcsQ0FBQyxDQUFDO01BQ3pEO01BRUEsT0FBTyxTQUFTO0lBQ3BCO0lBRUEsSUFBSSxJQUFJLEVBQ0osSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO01BQ3ZCLElBQUksS0FBSyxHQUFHLENBQUM7TUFDYixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBb0I7UUFDekMsTUFBTSxDQUFvQixLQUFLLENBQUMsR0FDN0IsdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztRQUV4QyxLQUFLLElBQUksQ0FBQztNQUNkO0lBQ0osQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUNwQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFDeEQsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDcEIsTUFBTSxLQUFxQixHQUFHLEVBQUU7TUFFaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7TUFDcEQ7TUFFQSxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDekI7RUFDUjtFQUVBLE9BQU8sTUFBTTtBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSw2QkFBNkIsR0FBRyxDQUUzQyxNQUFZLEVBQUUsT0FBd0IsRUFBRSxXQUFtQixLQUFXO0VBQ3BFLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUM3QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBZSxHQUNyQiw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FDN0IsTUFDL0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQzdCLE1BQU0sQ0FBd0IsR0FBRyxDQUFDLEdBQy9CLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztFQUUvQyxPQUFPLE1BQU07QUFDakIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLElBQUksR0FBRyxDQUNoQixNQUFZLEVBQ1osU0FBUyxHQUFHLEtBQUssRUFDakIsY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUNuQixpQkFBMEIsR0FBRyxpQkFBaUIsRUFDOUMsV0FBd0IsR0FBRyxJQUFJLEVBQy9CLE1BQU0sR0FBRyxLQUFLLEVBQ2QsZUFBK0IsR0FBRyxFQUFFLEVBQ3BDLGNBQWMsR0FBRyxDQUFDLEtBQ1g7RUFDUDtFQUNBLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUNoQixJQUFJLFdBQVcsRUFBRTtJQUNiLElBQUksTUFBTSxLQUFLLFdBQVcsRUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDWCxnREFBZ0QsR0FDaEQsWUFDSixDQUFDO0lBRUwsSUFDSSxDQUFDLE1BQU0sSUFDUCxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUF5QixDQUFDLEVBQ3hEO01BQ0UsTUFBTSxLQUFhLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7TUFDckQsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQ1osT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDO01BRWpDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ2hDO0lBRUEsTUFBTSxTQUFTLEdBQU8sS0FBUSxJQUFlO01BQ3pDLElBQ0ksY0FBYyxLQUFLLENBQUMsQ0FBQyxJQUNyQixjQUFjLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFFbkMsT0FBTyxpQkFBaUIsS0FBSyxpQkFBaUIsR0FDMUMsS0FBSyxHQUNMLGlCQUE2QjtNQUVyQyxNQUFNLE1BQWdCLEdBQUcsSUFBSSxDQUN6QixLQUFLLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsSUFBSSxFQUNKLE1BQU0sRUFDTixlQUFlLEVBQ2YsY0FBYyxHQUFHLENBQ3JCLENBQUM7TUFFRCxJQUNJLENBQUMsTUFBTSxJQUNQLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUN2QixLQUNKLENBQUMsSUFDRCxPQUFPLEtBQUssS0FBSyxRQUFRLEVBRXpCLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO01BRS9CLE9BQU8sTUFBTTtJQUNqQixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUNyQixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFDcEIsV0FBVyxDQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsTUFDN0IsSUFBSSxNQUFNLFlBQVksR0FBRyxFQUMxQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUM1QixXQUFXLENBQ1AsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFDbEMsSUFBSSxNQUFNLFlBQVksR0FBRyxFQUMxQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFDckIsV0FBVyxDQUNQLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFFOUIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQzdDLElBQUk7TUFDQyxXQUFXLENBQTRCLEdBQUcsQ0FBQyxHQUN4QyxTQUFTLENBQUMsS0FBc0IsQ0FBa0I7SUFDMUQsQ0FBQyxDQUFDLE9BQU8sS0FBSyxFQUFFO01BQ1osTUFBTSxJQUFJLEtBQUssQ0FDWCx3Q0FBd0MsR0FDeEMsR0FBRyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQzlCO1FBQUMsS0FBSyxFQUFFO01BQUssQ0FDakIsQ0FBQztJQUNMO0VBQ1osQ0FBQyxNQUFNO0lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUNyQixPQUFPLElBQUksQ0FDUCxNQUFNLEVBQ04sU0FBUyxFQUNULGNBQWMsRUFDZCxpQkFBaUIsRUFDaEIsRUFBRSxFQUNILE1BQU0sRUFDTixlQUFlLEVBQ2YsY0FDSixDQUFDO0lBRUwsSUFBSSxNQUFNLFlBQVksR0FBRyxFQUNyQixPQUFPLElBQUksQ0FDUCxNQUFNLEVBQ04sU0FBUyxFQUNULGNBQWMsRUFDZCxpQkFBaUIsRUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUNWLE1BQU0sRUFDTixlQUFlLEVBQ2YsY0FDSixDQUFDO0lBRUwsSUFBSSxNQUFNLFlBQVksR0FBRyxFQUNyQixPQUFPLElBQUksQ0FDUCxNQUFNLEVBQ04sU0FBUyxFQUNULGNBQWMsRUFDZCxpQkFBaUIsRUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUNWLE1BQU0sRUFDTixlQUFlLEVBQ2YsY0FDSixDQUFDO0lBRUwsSUFBSSxNQUFNLFlBQVksSUFBSSxFQUN0QixPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXJDLElBQUksTUFBTSxZQUFZLE1BQU0sRUFBRTtNQUMxQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO01BQ2pELFdBQVcsR0FBRyxJQUFJLE1BQU0sQ0FDcEIsTUFBTSxDQUFDLE1BQU0sRUFDYixRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQzdCLENBQW9CO01BQ25CLFdBQVcsQ0FBdUIsU0FBUyxHQUN4QyxNQUFNLENBQUMsU0FBUztNQUVwQixPQUFPLFdBQVc7SUFDdEI7SUFFQSxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxNQUFNLFlBQVksSUFBSSxFQUNyRCxPQUFPLFNBQVMsR0FDWixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FHekMsTUFBTTtJQUVkLE9BQU8sSUFBSSxDQUNQLE1BQU0sRUFDTixTQUFTLEVBQ1QsY0FBYyxFQUNkLGlCQUFpQixFQUNoQixDQUFDLENBQUMsRUFDSCxNQUFNLEVBQ04sZUFBZSxFQUNmLGNBQ0osQ0FBQztFQUNMO0VBRUosT0FBTyxXQUFXLElBQUksTUFBTTtBQUNoQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSxhQUFhLEdBQUksS0FBZSxJQUFhO0VBQ3RELElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQWEsQ0FBQyxFQUN6QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFFeEIsTUFBTSxJQUFZLEdBQUcsT0FBTyxLQUFLO0VBRWpDLElBQ0ksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUNyQyxVQUFVLElBQUssS0FBZ0IsRUFDakM7SUFDRSxNQUFNLG9CQUFvQixHQUN0QixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBRXpDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNwQyxxQkFBcUIsRUFBRSxvQkFDM0IsQ0FBQyxFQUNHLE9BQU8scUJBQXFCLENBQ3hCLG9CQUFvQixDQUV2QjtFQUNUO0VBRUEsT0FBTyxJQUFJO0FBQ2YsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLE1BQU0sR0FBRyxDQUNsQixVQUFtQixFQUNuQixXQUFvQixFQUNwQixZQUFxQyxHQUFHLENBQUMsQ0FBQyxLQUNLO0VBQy9DLE1BQU0sT0FBdUIsR0FBRztJQUM1QixZQUFZLEVBQUUsS0FBSztJQUNuQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ1IsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQixlQUFlLEVBQUUsSUFBSTtJQUNyQixVQUFVLEVBQUUsSUFBSTtJQUNoQixzQkFBc0IsRUFBRSxLQUFLO0lBQzdCLEdBQUc7RUFDUCxDQUFDO0VBRUQsSUFDSSxPQUFPLENBQUMsZUFBZSxJQUN2QixVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUNqRCxVQUFVLEtBQUssV0FBVyxJQUMxQixZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUNyRCxVQUFVLFlBQVksTUFBTSxJQUFJLFdBQVcsWUFBWSxNQUFNLElBQzdELFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUNoRCxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FDMUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQzNDLFVBQVUsWUFBWSxJQUFJLElBQUksV0FBVyxZQUFZLElBQUksS0FFckQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQzNCLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUM1QixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUM1QixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUM3QixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FDakQsSUFDRCxPQUFPLENBQUMsWUFBWSxJQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssV0FBVyxJQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBb0IsVUFDdkMsQ0FBQyxJQUNELFVBQVUsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQ3BDLFdBQVcsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQ3BDLFVBQVUsQ0FBWSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQ3hDLFdBQVcsQ0FBWSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBRTFDLE9BQU8sSUFBSTtFQUVmLElBQ0ksT0FBTyxDQUFDLFlBQVksSUFDcEIsT0FBTyxJQUFJLEtBQUssV0FBVyxJQUMzQixVQUFVLFlBQVksSUFBSSxJQUMxQixXQUFXLFlBQVksSUFBSSxFQUUzQixPQUFPLElBQUksT0FBTyxDQUNkLE9BQTBDLElBQ25DO0lBQ1AsTUFBTSxNQUEwQyxHQUFHLEVBQUU7SUFDckQsS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRTtNQUMzQyxNQUFNLFVBQXNCLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQztNQUMvQyxVQUFVLENBQUMsTUFBTSxHQUFJLEtBQVksSUFBVztRQUN4QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUVqQixNQUFNLENBQUMsSUFBSSxDQUFFLEtBQUssQ0FBQyxNQUFNLENBQWdCLE1BQU0sQ0FBQztRQUVwRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUNuQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFFYixPQUFPLENBQUMsT0FBTyxDQUFDLHNCQUFzQixHQUNsQyxZQUFZLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUN6QyxRQUFRLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUMvQixLQUNKLENBQUM7TUFDYixDQUFDO01BRUQsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDbkM7RUFDSixDQUFDLENBQUM7RUFFTixJQUNJLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFDekIsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUMxQixFQUFFLFVBQVUsWUFBWSxNQUFNLElBQUksV0FBVyxZQUFZLE1BQU0sQ0FBQyxJQUNoRSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUMxQixVQUFVLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLElBR2hDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQ3hELENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsSUFFckQsVUFBVSxDQUFrQixJQUFJLEtBQ2hDLFdBQVcsQ0FBa0IsSUFDakMsRUFDSDtJQUNFLE1BQU0sUUFBMEMsR0FBRyxFQUFFO0lBQ3JELEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUMxQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFDekIsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQzVCLEVBQUU7TUFDQyxNQUFNLFlBQXFCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7TUFDbEQsSUFDSSxZQUFZLEtBRVIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUNyQixLQUFLLENBQW9CLE1BQU0sS0FDL0IsTUFBTSxDQUFvQixNQUFNLENBQ3BDLEVBRUQsT0FBTyxPQUFPLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxHQUFHLEtBQUs7TUFFN0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztNQUMvQixJQUFJLFVBQVUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDNUQsT0FBTyxPQUFPLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxHQUFHLEtBQUs7TUFFM0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztNQUMvQixJQUFJLFVBQVUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDNUQsT0FBTyxPQUFPLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxHQUFHLEtBQUs7TUFFM0QsSUFBSSxZQUFZLEVBQUU7UUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQ2IsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQW9CO1VBQ3pDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDcEIsTUFBTSxNQUVMLEdBQUcsTUFBTSxDQUNOLEtBQUssRUFDSixNQUFNLENBQW9CLEtBQUssQ0FBQyxFQUNqQztjQUFDLEdBQUcsT0FBTztjQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxHQUFHO1lBQUMsQ0FDdkMsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLEVBQ1AsT0FBTyxLQUFLO1lBRWhCLE1BQU0sWUFBb0IsR0FBRyxLQUFLO1lBRWxDLE1BQU0sZUFBZSxHQUNqQixNQUF3QixJQUV4QixPQUFPLE1BQU0sS0FBSyxRQUFRLEdBQ3RCLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQzFCO2NBQUMsR0FBRyxFQUFFLEVBQUU7Y0FBRSxHQUFHLEVBQUU7WUFBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQ3ZDLE1BQU0sR0FDTixNQUFNO1lBRWQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3BDLE1BQU0sRUFBRSxNQUNaLENBQUMsRUFDRyxRQUFRLENBQUMsSUFBSSxDQUNULE1BQU0sQ0FDUixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFNUIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQzFCLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQztVQUN0QztVQUVBLEtBQUssSUFBSSxDQUFDO1FBQ2Q7TUFDSixDQUFDLE1BQU0sSUFBSSxVQUFVLEVBQUU7UUFDbkIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssRUFDNUIsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtVQUNwQixNQUFNLE1BRUwsR0FBRyxNQUFNLENBQ04sS0FBSyxFQUNKLE1BQU0sQ0FBMkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUMxQztZQUFDLEdBQUcsT0FBTztZQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxHQUFHO1VBQUMsQ0FDdkMsQ0FBQztVQUVELElBQUksQ0FBQyxNQUFNLEVBQ1AsT0FBTyxLQUFLO1VBRWhCLE1BQU0sZUFBZSxHQUNqQixNQUF3QixJQUV4QixPQUFPLE1BQU0sS0FBSyxRQUFRLEdBQ3RCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQ3ZCO1lBQUMsR0FBRyxFQUFFLEVBQUU7WUFBRSxHQUFHLEVBQUU7VUFBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQ3ZDLE1BQU0sR0FDTixNQUFNO1VBRWQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3BDLE1BQU0sRUFBRSxNQUNaLENBQUMsRUFDRyxRQUFRLENBQUMsSUFBSSxDQUNULE1BQU0sQ0FDUixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7VUFFNUIsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQzFCLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUN0QztNQUNSLENBQUMsTUFBTSxJQUFJLFVBQVUsRUFBRTtRQUNuQixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFDckIsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtVQUNwQixJQUFJLEtBQUssR0FBRyxLQUFLO1VBQ2pCLE1BQU0sV0FBNkMsR0FDL0MsRUFBRTtVQUNOO0FBQ3hCO0FBQ0E7QUFDQTtVQUN3QixLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sRUFBa0I7WUFDOUMsTUFBTSxNQUVMLEdBQUcsTUFBTSxDQUNOLEtBQUssRUFDTCxXQUFXLEVBQ1g7Y0FBQyxHQUFHLE9BQU87Y0FBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksR0FBRztZQUFDLENBQ3ZDLENBQUM7WUFFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFNBQVMsRUFBRTtjQUM3QixJQUFJLE1BQU0sRUFBRTtnQkFDUixLQUFLLEdBQUcsSUFBSTtnQkFDWjtjQUNKO1lBQ0osQ0FBQyxNQUNHLFdBQVcsQ0FBQyxJQUFJLENBQ1osTUFDSixDQUFDO1VBQ1Q7VUFFQSxNQUFNLGVBQWUsR0FDakIsS0FBYyxJQUNLLEtBQUssR0FDeEIsSUFBSSxHQUNKLE9BQU8sQ0FBQyxzQkFBc0IsR0FDMUIsV0FBVyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FDeEMsS0FBSztVQUViLElBQUksS0FBSztZQUNMO0FBQzVCO0FBQ0E7QUFDQTtZQUM0QjtVQUVKLElBQUksV0FBVyxDQUFDLE1BQU0sRUFDbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FDckIsT0FBMEMsSUFDekM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUNQLFdBQ0osQ0FBQyxDQUFDLElBQUksQ0FDRCxPQUFnQyxJQUFLO2NBQ2xDLE9BQU8sQ0FBQyxlQUFlLENBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUUsTUFBTSxJQUFLLE1BQU0sQ0FDbkMsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxFQUNELE1BQU07Y0FDRjtZQUFBLENBRVIsQ0FBQztVQUNMLENBQUMsQ0FBQyxDQUFDO1VBRVAsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQ2pDO01BQ1IsQ0FBQyxNQUNHLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUNyQyxLQUNKLENBQUMsRUFBRTtRQUNDLElBQ0ksT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUV2RDtRQUVKLElBQUksT0FBTyxHQUFHLEtBQUs7UUFDbkIsS0FBSyxNQUFNLGVBQWUsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQ25ELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRTtVQUNqQyxPQUFPLEdBQUcsSUFBSTtVQUNkO1FBQ0o7UUFFSixJQUFJLE9BQU8sRUFDUDtRQUVKLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7VUFDcEIsTUFBTSxNQUVMLEdBQUcsTUFBTSxDQUNOLEtBQUssRUFDSixNQUFNLENBQXNCLEdBQUcsQ0FBQyxFQUNqQztZQUFDLEdBQUcsT0FBTztZQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxHQUFHO1VBQUMsQ0FDdkMsQ0FBQztVQUVELElBQUksQ0FBQyxNQUFNLEVBQ1AsT0FBTyxLQUFLO1VBRWhCLE1BQU0sZUFBZSxHQUNqQixNQUF3QixJQUV4QixPQUFPLE1BQU0sS0FBSyxRQUFRLEdBRWxCLEdBQUcsSUFDRjtZQUFDLEdBQUcsRUFBRSxFQUFFO1lBQUUsR0FBRyxFQUFFO1VBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUN2QyxNQUFNLEdBRVYsTUFBTTtVQUVkLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNwQyxNQUFNLEVBQUUsTUFDWixDQUFDLEVBQ0csUUFBUSxDQUFDLElBQUksQ0FDVCxNQUFNLENBQ1IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1VBRTVCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUMxQixPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDdEM7TUFDSjtJQUNSO0lBRUEsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUNmLE9BQU8sSUFBSSxPQUFPLENBQ2QsT0FBMEMsSUFDbkM7TUFDUCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDckIsT0FBZ0MsSUFBVztRQUN4QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFDeEIsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7VUFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQztVQUVmO1FBQ0o7UUFFSixPQUFPLENBQUMsSUFBSSxDQUFDO01BQ2pCLENBQUMsRUFDRCxNQUFNO1FBQ0Y7TUFBQSxDQUVSLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFTixPQUFPLElBQUk7RUFDZjtFQUVBLE9BQU8sT0FBTyxDQUFDLHNCQUFzQixHQUNqQyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FDNUQsS0FBSztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSxtQkFBbUIsR0FBRyxDQUMvQixNQUEwQyxFQUMxQyxZQUFpRCxHQUFHLENBQUMsQ0FBQyxLQUMvQztFQUNQLE1BQU0sT0FBTyxHQUFHO0lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNULGlCQUFpQixFQUFFLE1BQU07SUFDekIsc0JBQXNCLEVBQUUsY0FBYztJQUN0QyxxQkFBcUIsRUFBRSxhQUFhO0lBQ3BDLEdBQUc7RUFDUCxDQUFDO0VBRUQsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksRUFDN0MsT0FBTyxNQUFNO0VBRWpCLElBQUksRUFBRSxPQUFPLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUM3QyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLE1BQU07RUFFckQsTUFBTSw2QkFBNkIsR0FBRyxDQUNsQyxJQUFZLEVBQUUsSUFBWSxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsS0FFM0Qsb0JBQW9CLENBQ2hCLElBQUksRUFDSjtJQUNJLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztJQUNwQixLQUFLLEVBQUUsS0FBSztJQUNaLE9BQU8sRUFBRSxJQUFJLEtBQUssT0FBTyxDQUFDO0VBQzlCLENBQ0osQ0FBQztFQUVMLE1BQU0sbUJBQW1CLEdBQUksSUFBYSxJQUFjO0lBQ3BELElBQ0ksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUN4QixJQUFJLEtBQUssSUFBSSxJQUNiLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFFNUIsT0FBTyxJQUFJO0lBRWYsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQ2hELElBQUksR0FBRyxLQUFLLFlBQVksSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7TUFDOUMsTUFBTSxLQUFjLEdBQUcsVUFBVTtNQUVqQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7TUFDMUI7TUFDQSxJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDaEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxzQkFDbkIsQ0FBQyxJQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDaEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxxQkFDbkIsQ0FBQyxFQUNIO1FBQ0UsTUFBTSxNQUF3QixHQUMxQixLQUF5QjtRQUM1QixJQUFJLENBQXdCLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUN6QyxLQUFLLEVBQ0w7VUFDSSxHQUFHLEVBQUUsQ0FDRCxNQUF3QyxFQUN4QyxHQUFvQixLQUNWO1lBQ1YsSUFBSSxHQUFHLEtBQUssWUFBWSxFQUNwQixPQUFPLE1BQU07WUFFakIsSUFBSSxHQUFHLEtBQUssZ0JBQWdCO2NBQ3hCO0FBQ3BDO0FBQ0E7QUFDQTtjQUNvQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDbEI7QUFDcEM7QUFDQTtBQUNBOztZQUVnQztBQUNoQztBQUNBO0FBQ0E7WUFDZ0MsS0FBSyxNQUFNLElBQUksSUFBSSxDQUNmLE9BQU8sQ0FBQyxzQkFBc0IsRUFDOUIsT0FBTyxDQUFDLHFCQUFxQixDQUNoQyxFQUNHLElBQ0ksR0FBRyxLQUFLLElBQUksSUFDWixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBRS9CLE9BQU8sT0FBTyxDQUNWLDZCQUE2QixDQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFDakIsQ0FDSixDQUFDO1lBRVQsTUFBTSxjQUF1QixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDL0MsSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFO2NBQ3BCLE1BQU0sTUFBZ0MsR0FDbEMsNkJBQTZCLENBQ3pCLGNBQ0osQ0FBNkI7Y0FFakMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNuQztZQUVBLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO2NBQ3pCLE1BQU0sTUFBTSxHQUNSLDZCQUE2QixDQUN6QixjQUNKLENBQTRCO2NBRWhDLElBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUNaLElBQUksRUFDSCxPQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FDYixJQUFJLENBQUMsTUFBTSxDQUFDO2NBRWxCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUN0QjtZQUVBLEtBQUssTUFBTSxJQUFJLElBQUksQ0FDZixPQUFPLENBQUMsc0JBQXNCLEVBQzlCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FDaEMsRUFDRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUM5QixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUNyQjtjQUNFLE1BQU0sTUFBd0IsR0FDMUIsT0FBTyxDQUNILDZCQUE2QixDQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQVksSUFDNUIsQ0FDSixDQUFxQjtjQUV6QixJQUNJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFFWixJQUFJLEVBQ0gsT0FDSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQztjQUVsQixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDdEI7WUFFSixPQUNJLGNBQWMsQ0FDaEIsR0FBRyxDQUFDO1lBQ047VUFDSixDQUFDO1VBQ0QsT0FBTyxFQUNILE1BQXdCLElBQ1I7WUFDaEIsS0FBSyxNQUFNLElBQUksSUFBSSxDQUNmLE9BQU8sQ0FBQyxzQkFBc0IsRUFDOUIsT0FBTyxDQUFDLHFCQUFxQixDQUNoQyxFQUNHLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQzlCLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBRW5CLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUM3QixPQUFPLENBQ0gsNkJBQTZCLENBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDWixJQUNKLENBQ0osQ0FDSixDQUFDO1lBRVQsT0FBTyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1VBQzdDO1FBQ0osQ0FDSixDQUFjOztRQUVkO0FBQ3BCO0FBQ0E7QUFDQTtRQUNvQixJQUFJLENBQUUsSUFBSSxDQUF3QixHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQzVDLElBQUksQ0FBd0IsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUN4QyxNQUFNO01BQ2xCO0lBQ0o7SUFFSixPQUFPLElBQUk7RUFDZixDQUFDO0VBRUQsTUFBTSxPQUFPLEdBQUksSUFBYSxJQUFjO0lBQ3hDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO01BQ2hCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2Y7UUFDQSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQ2YsT0FBTyxDQUFDLHNCQUFzQixFQUM5QixPQUFPLENBQUMscUJBQXFCLENBQ2hDLEVBQ0csSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUNoRCxPQUFRLElBQUksQ0FBc0IsSUFBSSxDQUFDO1FBRS9DLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVTtNQUMxQjtNQUVBLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUNyQyxJQUNKLENBQUMsRUFBRTtRQUNDLElBQUksQ0FDQSxPQUFPLENBQUMsc0JBQXNCLEVBQzlCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FDaEMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7VUFDYixJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFDNUIsT0FBTyxPQUFPLENBQ1YsNkJBQTZCLENBQUMsS0FBZSxDQUNqRCxDQUFDO1VBRUwsT0FBTyxLQUFLO1FBQ2hCO1FBRUMsSUFBSSxDQUFzQixHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO01BQ3BEO0lBQ0o7SUFFQSxPQUFPLElBQUk7RUFDZixDQUFDO0VBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTztFQUMvQixNQUFNLHNCQUFzQixHQUFJLElBQWEsSUFBYztJQUN2RCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDZCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDM0MsSUFDSSxHQUFHLEtBQUssWUFBWSxJQUNwQixLQUFLLEtBQUssSUFBSSxJQUNkLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUNsRDtNQUNFLE1BQU0sTUFBZSxHQUNoQixLQUFLLENBQTJCLFVBQVU7TUFDL0MsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNO01BQ3RCLHNCQUFzQixDQUFDLEtBQUssQ0FBQztJQUNqQztJQUVSLE9BQU8sSUFBSTtFQUNmLENBQUM7RUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDcEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxzQkFDcEIsQ0FBQyxFQUNHLE9BQU8sNkJBQTZCLENBQUMsTUFBTSxDQUN2QyxPQUFPLENBQUMsc0JBQXNCLENBQ2pDLENBQUMsTUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDekMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxxQkFDcEIsQ0FBQyxFQUNHLE9BQU8sNkJBQTZCLENBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQ0UsRUFDdEMsT0FBTyxDQUFDLHFCQUNaLENBQUM7RUFFTCxPQUFPLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLHdCQUF3QixHQUFHLE9BQ3BDLElBQTZDLEVBQzdDLFlBQWlELEdBQUcsQ0FBQyxDQUFDLEtBQ3RDO0VBQ2hCLE1BQU0sT0FBTyxHQUFHO0lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNULGlCQUFpQixFQUFFLE1BQU07SUFDekIsc0JBQXNCLEVBQUUsb0JBQW9CO0lBQzVDLHFCQUFxQixFQUFFLG1CQUFtQjtJQUMxQyxHQUFHO0VBQ1AsQ0FBQztFQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQ2YsT0FBTyxJQUFJO0VBRWYsSUFBSSxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQzdDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSTtFQUVuRCxNQUFNLE1BQVksR0FBRyxJQUFZO0VBRWpDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDO0lBQ2IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7TUFDcEIsTUFBTSxDQUFvQixLQUFLLENBQUMsR0FBRyxNQUFNLHdCQUF3QixDQUM5RCxJQUFJLEVBQTZDLE9BQ3JELENBQUM7TUFDRCxLQUFLLElBQUksQ0FBQztJQUNkO0lBRUEsT0FBTyxNQUFNO0VBQ2pCO0VBRUEsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDN0MsSUFBSSxDQUNBLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQ2hFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUNYLE9BQU8sTUFBTSxvQkFBb0IsQ0FDN0IsS0FBSyxFQUNMO01BQ0ksS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO01BQ3BCLEtBQUssRUFBRSxJQUFJO01BQ1gsT0FBTyxFQUFFLEdBQUcsS0FBSyxPQUFPLENBQUM7SUFDN0IsQ0FDSixDQUFDO0lBRUgsTUFBTSxDQUFzQixHQUFHLENBQUMsR0FBRyxNQUFNLHdCQUF3QixDQUMvRCxLQUFLLEVBQTZDLE9BQ3RELENBQUM7RUFDTDtFQUVBLE9BQU8sTUFBTTtBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLHNCQUFzQixHQUFHLENBRzlCLElBQU8sRUFDUCxvQkFBbUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsS0FDakU7RUFDUixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDM0MsSUFDSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFDbkMsb0JBQW9CLENBQUMsSUFBSSxDQUFFLElBQVksSUFDbkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQ25ELENBQUMsRUFFRCxPQUFRLElBQUksQ0FBaUMsR0FBRyxDQUFDLE1BQ2hELElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUN6QixzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUM7RUFFM0QsT0FBTyxJQUFJO0FBQ2YsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLE1BQU0sR0FBRyxDQUNsQixxQkFFQyxFQUNELGNBQTJDLEVBQzNDLEdBQUcsaUJBQTZDLEtBQzVDO0VBQ0osSUFBSSxJQUF1RCxHQUFHLEtBQUs7RUFDbkUsSUFBSSxPQUEwQyxHQUFHLGlCQUFpQjtFQUNsRSxJQUFJLE1BQThDO0VBRWxELElBQ0kscUJBQXFCLEtBQUssZ0NBQWdDLElBQzFELE9BQU8scUJBQXFCLEtBQUssU0FBUyxFQUM1QztJQUNFO0lBQ0EsSUFBSSxHQUFHLHFCQUM4QztJQUNyRCxNQUFNLEdBQUcsY0FBYztFQUMzQixDQUFDLE1BQU07SUFDSCxNQUFNLEdBQUcscUJBQXFCO0lBQzlCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUN4QixPQUFPLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFDckMsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUNqQyxNQUFNLEdBQUcsY0FBYztFQUMvQjtFQUVBLE1BQU0sVUFBVSxHQUFHLENBQ2YsV0FBdUIsRUFBRSxLQUFpQixLQUM3QjtJQUNiLElBQUksS0FBSyxLQUFLLFdBQVcsRUFDckIsT0FBTyxXQUFXOztJQUV0QjtJQUNBLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDekQsSUFBSSxLQUFpQjtNQUNyQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDWixLQUFLLEdBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FDdEMsV0FBVyxHQUNYLElBQUksR0FBRyxDQUFDLENBQTBCLE1BRXRDLEtBQUssR0FBSSxXQUFXLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUM5QyxXQUFXLEdBQ1gsQ0FBQyxDQUEwQjtNQUVuQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUF5QixLQUFLLENBQUM7SUFFNUQ7SUFFQSxPQUFPLEtBQUs7RUFDaEIsQ0FBQztFQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO0lBQzFCLElBQUksVUFBa0IsR0FBRyxPQUFPLE1BQU07SUFDdEMsSUFBSSxVQUFrQixHQUFHLE9BQU8sTUFBTTtJQUV0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFDYixVQUFVLElBQUksTUFBTTtJQUN4QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFDYixVQUFVLElBQUksTUFBTTtJQUV4QixJQUFJLFVBQVUsS0FBSyxVQUFVLElBQUksTUFBTSxLQUFLLE1BQU07TUFDOUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUM5QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUM3QixNQUFNLENBQUMsR0FBRyxDQUNOLEdBQUcsRUFDSCxVQUFVLENBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFDZixLQUNKLENBQ0osQ0FBQyxNQUNKLElBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFDMUMsRUFBRSxPQUFPLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxZQUFZLElBQUksQ0FBQyxJQUN4RCxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUMxQyxFQUFFLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxNQUFNLFlBQVksSUFBSSxDQUFDLEVBQzFEO1FBQ0UsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQzdDLElBQUksRUFDQSxJQUFJLEtBQUssZ0NBQWdDLElBQ3pDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFhLENBQUMsQ0FDNUMsRUFDRyxNQUFNLENBQUMsR0FBRyxDQUFZLEdBQUcsVUFBVSxDQUMvQixNQUFNLENBQUMsR0FBRyxDQUFZLEVBQ3RCLEtBQ0osQ0FBQztNQUNiLENBQUMsTUFDRyxNQUFNLEdBQUcsTUFBTTtJQUFBLE9BRW5CLE1BQU0sR0FBRyxNQUFNO0VBQ3ZCO0VBRUEsT0FBTyxNQUFNO0FBQ2pCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLGVBQWUsR0FBRyxDQUMzQixNQUFTLEVBQUUsV0FBb0IsR0FBRyxDQUFDLENBQUMsS0FDbEI7RUFDbEIsV0FBVyxHQUFHO0lBQ1YsTUFBTSxFQUFFLElBQUk7SUFDWixHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHO0VBQ1AsQ0FBQztFQUVELE9BQU87SUFDSCxjQUFjLEVBQUUsQ0FBQyxhQUFnQixFQUFFLEdBQW9CLEtBQWM7TUFDakUsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQ3RELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBWSxNQUU3QixPQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFZLENBR3ZDLEdBQUcsQ0FBQztNQUVWLE9BQU8sSUFBSTtJQUNmLENBQUM7SUFDRCxHQUFHLEVBQUUsQ0FBQyxhQUFnQixFQUFFLEdBQW9CLEtBQWM7TUFDdEQsSUFBSSxXQUFXLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQ25ELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBWTtNQUVqQyxPQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFZLENBR3BDLEdBQUcsQ0FBQztJQUNWLENBQUM7SUFDRCxHQUFHLEVBQUUsQ0FBQyxhQUFnQixFQUFFLEdBQW9CLEtBQWM7TUFDdEQsSUFBSSxXQUFXLENBQUMsR0FBRyxLQUFLLElBQUksRUFDeEIsT0FBTyxHQUFHLElBQUssTUFBaUI7TUFFcEMsT0FDSSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBWSxDQUdwQyxHQUFHLENBQUM7SUFDVixDQUFDO0lBQ0QsR0FBRyxFQUFFLENBQ0QsYUFBZ0IsRUFBRSxHQUFvQixFQUFFLEtBQWMsS0FDNUM7TUFDVixJQUFJLFdBQVcsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBWSxHQUFHLEtBQW1CLE1BRTVDLE9BQVEsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQVksQ0FHeEMsR0FBRyxFQUFFLEtBQUssQ0FBQztNQUVqQixPQUFPLElBQUk7SUFDZjtFQUNKLENBQUM7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLElBQUksR0FBRyxDQUNoQixNQUFZLEVBQUUsaUJBQTBDLEtBQy9CO0VBQ3pCLGlCQUFpQixHQUFHO0lBQUMsT0FBTyxFQUFFLEtBQUs7SUFBRSxPQUFPLEVBQUUsSUFBSTtJQUFFLEdBQUc7RUFBaUIsQ0FBQztFQUV6RSxJQUNJLGlCQUFpQixDQUFDLE9BQU8sS0FBSyxJQUFJLElBQ2xDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQ3hDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUN0QyxpQkFBaUIsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUNuQyxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBRTFCLE9BQU8sQ0FBQyxDQUFDO0VBRWIsTUFBTSxPQUE2QixHQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUNwQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUM1QixDQUFDLElBQUksRUFBRSxHQUFHLE1BQU07SUFBQyxHQUFHLElBQUk7SUFBRSxDQUFDLEdBQUcsR0FBRztFQUFJLENBQUMsQ0FBQyxFQUN2QyxDQUFDLENBQ0wsQ0FBQyxHQUNELGlCQUFpQixDQUFDLE9BQStCO0VBQ3pELE1BQU0sT0FBNkIsR0FDL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FDcEMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNO0lBQUMsR0FBRyxJQUFJO0lBQUUsQ0FBQyxHQUFHLEdBQUc7RUFBSSxDQUFDLENBQUMsRUFDdkMsQ0FBQyxDQUNMLENBQUMsR0FDRCxpQkFBaUIsQ0FBQyxPQUErQjtFQUV6RCxJQUFJLE1BQXFCLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQ3hCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUM5QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQ2pELElBQUksS0FBSyxLQUFLLElBQUksRUFDZCxNQUFNLENBQUMsR0FBRyxDQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBZSxNQUNwRCxJQUNELENBQ0ksYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUNwQixLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBRXhDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBZSxLQUFLLFFBQVEsRUFFNUMsTUFBTSxDQUErQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQzVDLE1BQU0sQ0FBK0IsR0FBRyxDQUFDLEVBQzFDO01BQUMsT0FBTyxFQUFFO0lBQUssQ0FDbkIsQ0FBQztFQUNqQixDQUFDO0lBQ0c7SUFDQSxNQUFNLEdBQUcsTUFBTTtFQUVuQixJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRTtJQUN4QixJQUFJLE9BQU8sR0FBRyxLQUFLO0lBQ25CLE1BQU0sSUFBNEIsR0FBRztNQUFDLEdBQUc7SUFBTSxDQUFDO0lBRWhELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUM5QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQy9DLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtNQUNoQixPQUFPLEdBQUcsSUFBSTtNQUVkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBZTtJQUNsQyxDQUFDLE1BQU0sSUFDSCxDQUNJLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUV4QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQWUsS0FBSyxRQUFRLEVBQzdDO01BQ0UsTUFBTSxPQUFzQixHQUN4QixJQUFJLENBQUMsR0FBRyxDQUFnQztNQUUxQyxJQUFJLENBQStCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FDM0MsSUFBSSxDQUErQixHQUFHLENBQUMsRUFDeEM7UUFBQyxPQUFPLEVBQUU7TUFBSyxDQUNuQixDQUFDO01BRUQsSUFDSSxJQUFJLENBQUMsR0FBRyxDQUFlLEtBQ3ZCLE9BQU8sRUFFUCxPQUFPLEdBQUcsSUFBSTtJQUN0QjtJQUVSLElBQUksT0FBTyxFQUNQLE1BQU0sR0FBRyxJQUFJO0VBQ3JCO0VBRUEsT0FBTyxNQUFNO0FBQ2pCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0sWUFBWSxHQUFHLENBQ3hCLE1BQVMsRUFDVCxNQUFlLEVBQ2Ysa0JBQWtCLEdBQUcsWUFBWSxFQUNqQyxtQkFBbUIsR0FBRyxhQUFhLEVBQ25DLGtCQUFrQixHQUFHLFlBQVksRUFDakMsY0FBYyxHQUFHLElBQUksRUFDckIsY0FBYyxHQUFHLElBQUksRUFDckIsWUFBcUIsR0FBRyxJQUFJLEVBQzVCLFNBQWtCLEdBQUcsSUFBSSxLQUNyQjtFQUNKLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtJQUNoQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUM3QixJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQ2YsWUFBWSxDQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQ2YsS0FBSyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsTUFBTSxFQUNOLEdBQ0osQ0FBQztFQUNiLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQzNDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0lBQ3JELElBQUksS0FBSyxHQUFHLEdBQUc7SUFDZixJQUNJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQ3JCLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQzlCLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQzlCO01BQ0UsS0FBSyxHQUFHLFFBQVEsQ0FDWixHQUFHLENBQUMsU0FBUyxDQUNULGNBQWMsQ0FBQyxNQUFNLEVBQ3JCLEdBQUcsQ0FBQyxNQUFNLEdBQ1YsY0FBYyxDQUFDLE1BQ25CLENBQUMsRUFDRCxFQUNKLENBQUM7TUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQ25DLEtBQUssR0FBRyxHQUFHO0lBQ25CO0lBRUEsSUFDSSxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLENBQ3hELFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFDbEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQ2Y7TUFDRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3JCLElBQUksR0FBRyxLQUFLLGtCQUFrQixFQUFFO1VBQzVCLE1BQU0sTUFBc0IsR0FDdkIsRUFBRSxDQUFvQixNQUFNLENBQUMsV0FBVyxDQUFDO1VBQzlDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUN0QixJQUNJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFDekIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFDaEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFFOUIsTUFBTSxDQUFDLE1BQU0sQ0FDVCxRQUFRLENBQ0osS0FBSyxDQUFDLFNBQVMsQ0FDWCxjQUFjLENBQUMsTUFBTSxFQUNyQixLQUFLLENBQUMsTUFBTSxHQUNaLGNBQWMsQ0FBQyxNQUNuQixDQUFDLEVBQ0QsRUFDSixDQUFDLEVBQ0QsQ0FDSixDQUFDLE1BQ0EsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQ3RDLElBQ0QsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUN6QixLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFFckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxrQkFBa0IsRUFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFpQixNQUNsRCxJQUFJLEdBQUcsS0FBSyxtQkFBbUIsRUFDaEMsTUFBTSxHQUFJLEVBQUUsQ0FDUCxNQUFNLENBQUMsV0FBVyxDQUFDLENBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQWlCLE1BQ2xDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFDckQsTUFBTSxDQUNGLElBQUksRUFDSixZQUFZLENBQ1IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNiLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsY0FDSixDQUFDLEVBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNiLFdBQ0osQ0FBQyxNQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxXQUF5QjtNQUFBLE9BQzVDLElBQUksR0FBRyxLQUFLLGtCQUFrQixFQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFLLEVBQUUsQ0FBb0IsTUFBTSxDQUM3QyxXQUNKLENBQUMsRUFDRyxJQUNJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFDekIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNoQyxNQUFNLEVBQUUsS0FDWixDQUFDLEVBRUQsT0FDSSxNQUFNLENBQ1IsS0FBSyxDQUFDO01BQ3BCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztNQUVsQixJQUFJLFlBQVksSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQzdDLE9BQ0ksWUFBWSxDQUNkLFNBQVMsQ0FBQztJQUNwQixDQUFDLE1BQU0sSUFDSCxNQUFNLEtBQUssSUFBSSxJQUNmLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBRWhELE1BQU0sQ0FBaUMsR0FBRyxDQUFDLEdBQ3hDLFlBQVksQ0FDUCxNQUFNLENBQW9DLEdBQUcsQ0FBQyxFQUMvQyxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGNBQWMsRUFDZCxNQUFNLEVBQ04sR0FDSixDQUFDO0VBQ2I7RUFFSixPQUFPLE1BQU07QUFDakIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSxpQkFBaUIsR0FBRyxDQUM3QixNQUFTLEVBQUUsSUFBNEIsR0FBRyxHQUFHLEtBQ3pDO0VBQ0osTUFBTSxZQUEyQixHQUFJLEVBQUUsQ0FBbUIsTUFBTSxDQUFDLElBQUksQ0FBQztFQUV0RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQztJQUNiLEtBQUssTUFBTSxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDcEMsSUFBSSxJQUFJLEdBQUcsS0FBSztNQUNoQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtRQUMvQixLQUFLLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFDMUIsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtVQUNoQyxNQUFNLENBQW1CLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1VBRTFDLElBQUksR0FBRyxJQUFJO1VBQ1g7UUFDSjtRQUVKLElBQUksSUFBSSxFQUNKO01BQ1I7TUFFQyxNQUFNLENBQW9CLEtBQUssQ0FBQyxHQUM3QixpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO01BRTlDLEtBQUssSUFBSSxDQUFDO0lBQ2Q7RUFDSixDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQ3BCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDckMsSUFBSSxJQUFJLEdBQUcsS0FBSztJQUVoQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtNQUMvQixLQUFLLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFDMUIsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtRQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUN4QixJQUFJLEdBQUcsSUFBSTtRQUNYO01BQ0o7TUFFSixJQUFJLElBQUksRUFDSjtJQUNSO0lBRUEsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQztFQUM5QyxDQUFDLE1BQ0EsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQ2xCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtJQUM1QyxJQUFJLElBQUksR0FBRyxLQUFLO0lBRWhCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO01BQ3pCLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQztRQUN4RCxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksVUFBVSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7VUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7VUFDbEIsSUFBSSxHQUFHLElBQUk7VUFDWDtRQUNKO01BQ0o7TUFFQSxJQUFJLElBQUksRUFDSjtJQUNSO0lBRUEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0VBQy9ELENBQUMsTUFDQSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDckIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDbkQsQ0FBQyxDQUFDLEVBQUUsTUFDUixDQUFDLENBQUMsRUFBRTtJQUNBLElBQUksSUFBSSxHQUFHLEtBQUs7SUFFaEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUU7TUFDcEMsTUFBTSxVQUFrQixHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQztNQUVoRSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksVUFBVSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDL0MsT0FBUSxNQUFNLENBQWlDLEdBQUcsQ0FBQztRQUNuRCxJQUFJLEdBQUcsSUFBSTtRQUNYO01BQ0o7SUFDSjtJQUVBLElBQUksSUFBSSxFQUNKO0lBRUYsTUFBTSxDQUFpQyxHQUFHLENBQUMsR0FDekMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQztFQUM5QztFQUVKLE9BQU8sTUFBTTtBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0sU0FBUyxHQUFHLENBQ3JCLE1BQWUsRUFDZixvQkFBb0IsR0FBRyxFQUFFLEVBQ3pCLFNBQVMsR0FBRyxNQUFNLEVBQ2xCLGdCQUFnQixHQUFHLEVBQUUsRUFDckIsc0NBQXVELEdBQ3ZELHNDQUFzQyxFQUN0QyxjQUFjLEdBQUcsQ0FBQyxLQUNUO0VBQ1QsSUFBSSxjQUFjLEtBQUssQ0FBQyxFQUNwQixPQUFPLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQztFQUV6RCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQ2YsT0FBTyxNQUFNO0VBRWpCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFDcEIsT0FBTyxXQUFXO0VBRXRCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUMxQixPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUc7RUFFaEUsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssU0FBUyxFQUNoRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7RUFFekIsSUFBSSxNQUFNLFlBQVksSUFBSSxFQUN0QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztFQUUvQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDdkIsSUFBSSxNQUFNLEdBQUcsR0FBRztJQUVoQixJQUFJLFNBQVMsR0FBRyxLQUFLO0lBQ3JCLElBQUksT0FBTyxHQUFHLENBQUM7SUFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRTtNQUN2QixJQUFJLE9BQU8sR0FBRyxvQkFBb0IsRUFBRTtRQUNoQyxNQUFNLElBQUksS0FBSyxnQkFBZ0IsS0FBSztRQUNwQztNQUNKO01BRUEsSUFBSSxTQUFTLEVBQ1QsTUFBTSxJQUFJLEdBQUc7TUFFakIsTUFBTSxJQUNGLEtBQUssZ0JBQWdCLEdBQUcsU0FBUyxFQUFFLEdBQ25DLFNBQVMsQ0FDTCxJQUFJLEVBQ0osb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxHQUFHLGdCQUFnQixHQUFHLFNBQVMsRUFBRSxFQUNqQyxzQ0FBc0MsRUFDdEMsY0FBYyxHQUFHLENBQ3JCLENBQUM7TUFFTCxTQUFTLEdBQUcsSUFBSTtNQUVoQixPQUFPLElBQUksQ0FBQztJQUNoQjtJQUVBLElBQUksU0FBUyxFQUNULE1BQU0sSUFBSSxLQUFLLGdCQUFnQixFQUFFO0lBRXJDLE1BQU0sSUFBSSxHQUFHO0lBRWIsT0FBTyxNQUFNO0VBQ2pCO0VBRUEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDZixJQUFJLE1BQU0sR0FBRyxFQUFFO0lBRWYsSUFBSSxTQUFTLEdBQUcsS0FBSztJQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRTtNQUM5QixJQUFJLE9BQU8sR0FBRyxvQkFBb0IsRUFBRTtRQUNoQyxNQUFNLElBQUksTUFBTSxnQkFBZ0IsS0FBSztRQUNyQztNQUNKO01BRUEsSUFBSSxTQUFTLEVBQ1QsTUFBTSxJQUFJLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxFQUFFO01BRWxELE1BQU0sSUFDRixTQUFTLENBQ0wsR0FBRyxFQUNILG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsR0FBRyxnQkFBZ0IsR0FBRyxTQUFTLEVBQUUsRUFDakMsc0NBQXNDLEVBQ3RDLGNBQWMsR0FBRyxDQUNyQixDQUFDLEdBQ0QsTUFBTSxHQUNOLFNBQVMsQ0FDTCxJQUFJLEVBQ0osb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxHQUFHLGdCQUFnQixHQUFHLFNBQVMsRUFBRSxFQUNqQyxzQ0FBc0MsRUFDdEMsY0FBYyxHQUFHLENBQ3JCLENBQUM7TUFFTCxTQUFTLEdBQUcsSUFBSTtNQUVoQixPQUFPLElBQUksQ0FBQztJQUNoQjtJQUVBLElBQUksQ0FBQyxTQUFTLEVBQ1YsTUFBTSxHQUFHLFVBQVU7SUFFdkIsT0FBTyxNQUFNO0VBQ2pCO0VBRUEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDZixJQUFJLE1BQU0sR0FBRyxHQUFHO0lBRWhCLElBQUksU0FBUyxHQUFHLEtBQUs7SUFDckIsSUFBSSxPQUFPLEdBQUcsQ0FBQztJQUNmLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO01BQ3ZCLElBQUksT0FBTyxHQUFHLG9CQUFvQixFQUFFO1FBQ2hDLE1BQU0sSUFBSSxNQUFNLGdCQUFnQixLQUFLO1FBQ3JDO01BQ0o7TUFFQSxJQUFJLFNBQVMsRUFDVCxNQUFNLElBQUksR0FBRztNQUVqQixNQUFNLElBQ0YsS0FBSyxnQkFBZ0IsR0FBRyxTQUFTLEVBQUUsR0FDbkMsU0FBUyxDQUNMLElBQUksRUFDSixvQkFBb0IsRUFDcEIsU0FBUyxFQUNULEdBQUcsZ0JBQWdCLEdBQUcsU0FBUyxFQUFFLEVBQ2pDLHNDQUFzQyxFQUN0QyxjQUFjLEdBQUcsQ0FDckIsQ0FBQztNQUVMLFNBQVMsR0FBRyxJQUFJO01BRWhCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCO0lBRUEsSUFBSSxTQUFTLEVBQ1QsTUFBTSxJQUFJLEtBQUssZ0JBQWdCLEdBQUcsTUFFbEMsTUFBTSxHQUFHLFVBQVU7SUFFdkIsT0FBTyxNQUFNO0VBQ2pCO0VBRUEsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQ2xCLE9BQU8sY0FBYztFQUV6QixJQUFJLE1BQU0sR0FBRyxHQUFHO0VBQ2hCLE1BQU0sSUFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDckUsSUFBSSxTQUFTLEdBQUcsS0FBSztFQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDO0VBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDcEIsSUFBSSxPQUFPLEdBQUcsb0JBQW9CLEVBQUU7TUFDaEMsTUFBTSxJQUFJLE1BQU0sZ0JBQWdCLEtBQUs7TUFDckM7SUFDSjtJQUVBLElBQUksU0FBUyxFQUNULE1BQU0sSUFBSSxHQUFHO0lBRWpCLE1BQU0sSUFDRixLQUFLLGdCQUFnQixHQUFHLFNBQVMsR0FBRyxHQUFHLElBQUksR0FDM0MsU0FBUyxDQUNKLE1BQU0sQ0FBc0IsR0FBRyxDQUFDLEVBQ2pDLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsR0FBRyxnQkFBZ0IsR0FBRyxTQUFTLEVBQUUsRUFDakMsc0NBQXNDLEVBQ3RDLGNBQWMsR0FBRyxDQUNyQixDQUFDO0lBRUwsU0FBUyxHQUFHLElBQUk7SUFFaEIsT0FBTyxJQUFJLENBQUM7RUFDaEI7RUFFQSxJQUFJLFNBQVMsRUFDVCxNQUFNLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtFQUVyQyxNQUFNLElBQUksR0FBRztFQUViLE9BQU8sTUFBTTtBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSxJQUFJLEdBQUksTUFBZSxJQUFxQjtFQUNyRCxNQUFNLElBQW9CLEdBQUcsRUFBRTtFQUUvQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQ3JCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUNuQixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFDL0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQ2IsS0FBSyxNQUFNLFlBQVksSUFBSSxNQUFNLEVBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQzdCLElBQUksTUFBTSxLQUFLLElBQUksRUFDcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztFQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0sV0FBVyxHQUFHLENBQ3ZCLE1BQXdCLEVBQUUsV0FBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBVSxDQUFDLEtBQ3BFO0VBQ0osSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDbEIsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUN2QixPQUFPLE1BQU07SUFFakIsSUFBSTtNQUNBLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDZixNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVU7UUFFNUIsTUFBTSxDQUF5QyxVQUFVLENBQUMsQ0FBQztNQUNqRTtJQUNKLENBQUMsQ0FBQyxNQUFNO01BQ0osT0FBTyxNQUFNO0lBQ2pCLENBQUMsU0FBUztNQUNOLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzNCO0lBRUEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO01BQ3ZCLElBQUksS0FBSyxHQUFHLENBQUM7TUFDYixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtRQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7UUFFL0MsS0FBSyxJQUFJLENBQUM7TUFDZDtJQUNKLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFDcEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxNQUNuRCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtNQUNwQixNQUFNLEtBQXFCLEdBQUcsRUFBRTtNQUVoQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtRQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7TUFDL0M7TUFFQSxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQyxNQUNHLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUNyQyxNQUNKLENBQUMsRUFDRyxNQUFNLENBQUMsR0FBRyxDQUFZLEdBQ2xCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFlO0VBQzdEO0VBRUEsT0FBTyxNQUFNO0FBQ2pCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=