@sumaris-net/ngx-components 18.5.0-rc2 → 18.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/esm2022/src/app/core/account/account.module.mjs +7 -3
  2. package/esm2022/src/app/core/account/account.page.mjs +9 -6
  3. package/esm2022/src/app/core/account/password/change-password.page.mjs +2 -2
  4. package/esm2022/src/app/core/form/properties/properties.form.mjs +33 -14
  5. package/esm2022/src/app/core/graphql/graphql.service.mjs +3 -3
  6. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +26 -8
  7. package/esm2022/src/app/core/services/config/core.config.mjs +6 -1
  8. package/esm2022/src/app/core/services/network.service.mjs +7 -4
  9. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +5 -10
  10. package/esm2022/src/app/core/settings/settings.page.mjs +15 -4
  11. package/esm2022/src/environments/environment.class.mjs +2 -1
  12. package/esm2022/src/environments/environment.mjs +3 -2
  13. package/fesm2022/sumaris-net.ngx-components.mjs +100 -43
  14. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  15. package/package.json +1 -1
  16. package/src/app/core/account/account.module.d.ts +2 -1
  17. package/src/app/core/form/properties/properties.form.d.ts +7 -2
  18. package/src/app/core/install/install-upgrade-card.component.d.ts +2 -2
  19. package/src/app/core/services/config/core.config.d.ts +1 -0
  20. package/src/app/core/services/network.service.d.ts +1 -0
  21. package/src/app/core/settings/settings.page.d.ts +3 -1
  22. package/src/assets/i18n/en-US.json +1 -0
  23. package/src/assets/i18n/en.json +1 -0
  24. package/src/assets/i18n/fr.json +1 -0
  25. package/src/assets/manifest.json +1 -1
  26. package/src/environments/environment.class.d.ts +1 -0
@@ -74,7 +74,7 @@ export class AppChangePasswordPage extends AppFormContainer {
74
74
  }
75
75
  else {
76
76
  const primaryColor = config.getProperty(CORE_CONFIG_OPTIONS.COLOR_PRIMARY) || 'var(--ion-color-primary)';
77
- this.contentStyle = { 'background-color': primaryColor };
77
+ this.contentStyle = { '--ion-background-color': primaryColor + ' !important' };
78
78
  }
79
79
  const tokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE);
80
80
  if (tokenType === 'token') {
@@ -141,4 +141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
141
141
  type: ViewChild,
142
142
  args: ['form', { static: true }]
143
143
  }] } });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLnBhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC9wYXNzd29yZC9jaGFuZ2UtcGFzc3dvcmQucGFnZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Bhc3N3b3JkL2NoYW5nZS1wYXNzd29yZC5wYWdlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUlwSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuRSxPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7OztBQVN4RSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZ0JBQWdCO0lBYTdDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbEJGLEtBQUssQ0FBUztJQUNkLFFBQVEsQ0FBUztJQUNqQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixtQkFBbUIsQ0FBUztJQUM1QixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBRVksSUFBSSxDQUFxQjtJQUV0RSxZQUNZLGFBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGVBQWdDLEVBQ2hD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QUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQTlIVSxxQkFBcUI7NEZBQXJCLHFCQUFxQixtTUN0QmxDLG02QkE2QkE7OzRGRFBhLHFCQUFxQjtrQkFOakMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU07cVFBWUYsSUFBSTtzQkFBaEQsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlLCBBdXRoRGF0YSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFuZ2VQYXNzd29yZEZvcm0gfSBmcm9tICcuL2NoYW5nZS1wYXNzd29yZC5mb3JtJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdCB9IGZyb20gJy4uLy4uL2hvbWUvaG9tZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2Q29udHJvbGxlciwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuaywgbnVsbElmTmlsT3JCbGFuayB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBBcHBGb3JtQ29udGFpbmVyIH0gZnJvbSAnLi4vLi4vZm9ybS9mb3JtLWNvbnRhaW5lci5jbGFzcyc7XG5pbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBBdXRoVG9rZW5UeXBlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0d29yay50eXBlcyc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoYW5nZS1wYXNzd29yZC1wYWdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYW5nZS1wYXNzd29yZC5wYWdlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFuZ2UtcGFzc3dvcmQucGFnZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBDaGFuZ2VQYXNzd29yZFBhZ2UgZXh0ZW5kcyBBcHBGb3JtQ29udGFpbmVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgdG9rZW46IHN0cmluZztcbiAgcHJvdGVjdGVkIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBjb250ZW50U3R5bGUgPSB7fTtcbiAgcHJvdGVjdGVkIHNlbmRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzTG9naW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgdXNlcm5hbWVQbGFjZWhvbGRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZW1haWxWYWxpZGF0b3IgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdmb3JtJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBmb3JtOiBDaGFuZ2VQYXNzd29yZEZvcm07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG5cbiAgICAvLyBHZXQgdXNlcm5hbWUgICsgdG9rZW4gKGZyb20gdGhlIHJvdXRlKVxuICAgIHRoaXMudXNlcm5hbWUgPVxuICAgICAgbnVsbElmTmlsT3JCbGFuayh0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1snZW1haWwnXSkgfHwgbnVsbElmTmlsT3JCbGFuayh0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1sndXNlcm5hbWUnXSk7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLnVzZXJuYW1lKSkge1xuICAgICAgdGhpcy50b2tlbiA9XG4gICAgICAgIG51bGxJZk5pbE9yQmxhbmsodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ3Rva2VuJ10pIHx8IG51bGxJZk5pbE9yQmxhbmsodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1sndG9rZW4nXSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZGVidWcoYFtwYXNzd29yZF0gdXNlcm5hbWU6ICR7dGhpcy51c2VybmFtZX0sIHRva2VuOiAke3RoaXMudG9rZW59YCk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gV2FpdCBhY2NvdW50IHNlcnZpY2UgdG8gYmUgcmVhZHlcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCk7XG5cbiAgICB0aGlzLmlzTG9naW4gPSB0aGlzLmFjY291bnRTZXJ2aWNlLmlzTG9naW4oKTtcbiAgICBpZiAodGhpcy5pc0xvZ2luKSB7XG4gICAgICB0aGlzLnVzZXJuYW1lID0gdGhpcy51c2VybmFtZSB8fCB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQuZW1haWw7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB0aGlzLmZvcm0udXNlcm5hbWUgPSB0aGlzLnVzZXJuYW1lO1xuXG4gICAgdGhpcy5hZGRGb3JtcyhbdGhpcy5mb3JtXSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHRoaXMub25Db25maWdSZWFkeShjb25maWcpKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgb25Db25maWdSZWFkeShjb25maWc6IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbcGFzc3dvcmRdIENvbmZpZyBsb2FkZWQnLCBjb25maWcpO1xuICAgIGlmIChpc05vdEVtcHR5QXJyYXkoY29uZmlnPy5iYWNrZ3JvdW5kSW1hZ2VzKSkge1xuICAgICAgY29uc3QgeyBpbWFnZSB9ID0gZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0KGNvbmZpZy5iYWNrZ3JvdW5kSW1hZ2VzKTtcbiAgICAgIHRoaXMuY29udGVudFN0eWxlID0geyAnYmFja2dyb3VuZC1pbWFnZSc6IGB1cmwoJHtpbWFnZX0pYCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmltYXJ5Q29sb3IgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5DT0xPUl9QUklNQVJZKSB8fCAndmFyKC0taW9uLWNvbG9yLXByaW1hcnkpJztcbiAgICAgIHRoaXMuY29udGVudFN0eWxlID0geyAnYmFja2dyb3VuZC1jb2xvcic6IHByaW1hcnlDb2xvciB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuVHlwZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfVE9LRU5fVFlQRSkgYXMgQXV0aFRva2VuVHlwZTtcbiAgICBpZiAodG9rZW5UeXBlID09PSAndG9rZW4nKSB7XG4gICAgICB0aGlzLnVzZXJuYW1lUGxhY2Vob2xkZXIgPSAnVVNFUi5FTUFJTCc7XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VybmFtZVBsYWNlaG9sZGVyID0gJ1VTRVIuVVNFUk5BTUUnO1xuICAgICAgdGhpcy5lbWFpbFZhbGlkYXRvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhpcy5lbmFibGUoKTtcbiAgfVxuXG4gIGFzeW5jIGRvU3VibWl0KGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmZvcm0uZGlzYWJsZWQgfHwgdGhpcy5zZW5kaW5nKSByZXR1cm47IC8vIFNraXBcblxuICAgIHRoaXMuc2VuZGluZyA9IHRydWU7XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQgfSA9IHRoaXMuZm9ybS52YWx1ZTtcblxuICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXV0aERhdGE6IEF1dGhEYXRhID0geyB1c2VybmFtZSwgcGFzc3dvcmQgfTtcblxuICAgICAgLy8gVG9rZW4gZXhpc3RzIDogc2VuZCBjb25maXJtYXRpb25cbiAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsodGhpcy50b2tlbikpIHtcbiAgICAgICAgLy8gVXBkYXRlIHB1YmtleSwgdXNpbmcgdGhlIHRva2VuXG4gICAgICAgIGNvbnN0IGRvbmUgPSBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnJlc2V0UHVia2V5KGF1dGhEYXRhLCB0aGlzLnRva2VuKTtcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KCcvJyk7XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2U6ICdBVVRILkNPTkZJUk0uUEFTU1dPUkRfQ0hBTkdFRCcsIHR5cGU6ICdpbmZvJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIHB1YmtleSBvbiB0aGUgY3VycmVudCBhY2NvdW50XG4gICAgICAgIGNvbnN0IGRvbmUgPSBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnVwZGF0ZVB1YmtleShhdXRoRGF0YSk7XG5cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KCcvYWNjb3VudCcpO1xuXG4gICAgICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3QoeyBtZXNzYWdlOiAnQVVUSC5DT05GSVJNLlBBU1NXT1JEX0NIQU5HRUQnLCB0eXBlOiAnaW5mbycgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZm9ybS5lcnJvciA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycjtcbiAgICAgIHRoaXMuZm9ybS5lbmFibGUoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucykge1xuICAgIGF3YWl0IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxhcHAtdG9vbGJhclxuICBbdGl0bGVdPVwiJ0FVVEguUkVTRVRfUEFTU1dPUkQuVElUTEUnIHwgdHJhbnNsYXRlXCJcbiAgY29sb3I9XCJwcmltYXJ5XCJcbiAgW2NhbkdvQmFja109XCJpc0xvZ2luXCJcbiAgZGVmYXVsdEJhY2tIcmVmPVwiL2FjY291bnRcIlxuPjwvYXBwLXRvb2xiYXI+XG48aW9uLWNvbnRlbnQgY2xhc3M9XCJiZy1pbWFnZS1jb3ZlciBjZW50ZXIgaW9uLXBhZGRpbmdcIiBbbmdTdHlsZV09XCJjb250ZW50U3R5bGVcIj5cbiAgPGlvbi1jYXJkIGNsYXNzPVwiaW9uLW1hcmdpbi10b3BcIj5cbiAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgIDxhcHAtY2hhbmdlLXBhc3N3b3JkLWZvcm1cbiAgICAgICAgI2Zvcm1cbiAgICAgICAgW3VzZXJuYW1lUGxhY2Vob2xkZXJdPVwidXNlcm5hbWVQbGFjZWhvbGRlclwiXG4gICAgICAgIFtlbWFpbFZhbGlkYXRvcl09XCJlbWFpbFZhbGlkYXRvclwiXG4gICAgICAgIChvblN1Ym1pdCk9XCJkb1N1Ym1pdCgpXCJcbiAgICAgICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICAgID48L2FwcC1jaGFuZ2UtcGFzc3dvcmQtZm9ybT5cbiAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG5cbiAgICBAaWYgKGxvYWRpbmdTdWJqZWN0IHwgcHVzaCkge1xuICAgICAgPGlvbi1zcGlubmVyPjwvaW9uLXNwaW5uZXI+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8aW9uLWZvb3Rlcj5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiZnVsbFwiIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiZG9TdWJtaXQoKVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgJ0NPTU1PTi5CVE5fVkFMSURBVEUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWZvb3Rlcj5cbiAgICB9XG4gIDwvaW9uLWNhcmQ+XG48L2lvbi1jb250ZW50PlxuIl19
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLnBhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC9wYXNzd29yZC9jaGFuZ2UtcGFzc3dvcmQucGFnZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Bhc3N3b3JkL2NoYW5nZS1wYXNzd29yZC5wYWdlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUlwSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuRSxPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7OztBQVN4RSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZ0JBQWdCO0lBYTdDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbEJGLEtBQUssQ0FBUztJQUNkLFFBQVEsQ0FBUztJQUNqQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixtQkFBbUIsQ0FBUztJQUM1QixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBRVksSUFBSSxDQUFxQjtJQUV0RSxZQUNZLGFBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGVBQWdDLEVBQ2hD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QU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzt3R0E5SFUscUJBQXFCOzRGQUFyQixxQkFBcUIsbU1DdEJsQyxtNkJBNkJBOzs0RkRQYSxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0UsMEJBQTBCLG1CQUduQix1QkFBdUIsQ0FBQyxNQUFNO3FRQVlGLElBQUk7c0JBQWhELFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSwgQXV0aERhdGEgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbmdlUGFzc3dvcmRGb3JtIH0gZnJvbSAnLi9jaGFuZ2UtcGFzc3dvcmQuZm9ybSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBnZXRSYW5kb21JbWFnZVdpdGhDcmVkaXQgfSBmcm9tICcuLi8uLi9ob21lL2hvbWUnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdkNvbnRyb2xsZXIsIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbE9yQmxhbmssIG51bGxJZk5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IENPUkVfQ09ORklHX09QVElPTlMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHsgQXBwRm9ybUNvbnRhaW5lciB9IGZyb20gJy4uLy4uL2Zvcm0vZm9ybS1jb250YWluZXIuY2xhc3MnO1xuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQXV0aFRva2VuVHlwZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jaGFuZ2UtcGFzc3dvcmQtcGFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFuZ2UtcGFzc3dvcmQucGFnZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhbmdlLXBhc3N3b3JkLnBhZ2Uuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwQ2hhbmdlUGFzc3dvcmRQYWdlIGV4dGVuZHMgQXBwRm9ybUNvbnRhaW5lciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIHRva2VuOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB1c2VybmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgY29udGVudFN0eWxlID0ge307XG4gIHByb3RlY3RlZCBzZW5kaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0xvZ2luID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHVzZXJuYW1lUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIGVtYWlsVmFsaWRhdG9yID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZm9ybScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgZm9ybTogQ2hhbmdlUGFzc3dvcmRGb3JtO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG5hdkNvbnRyb2xsZXI6IE5hdkNvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuXG4gICAgLy8gR2V0IHVzZXJuYW1lICArIHRva2VuIChmcm9tIHRoZSByb3V0ZSlcbiAgICB0aGlzLnVzZXJuYW1lID1cbiAgICAgIG51bGxJZk5pbE9yQmxhbmsodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2VtYWlsJ10pIHx8IG51bGxJZk5pbE9yQmxhbmsodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ3VzZXJuYW1lJ10pO1xuICAgIGlmIChpc05vdE5pbE9yQmxhbmsodGhpcy51c2VybmFtZSkpIHtcbiAgICAgIHRoaXMudG9rZW4gPVxuICAgICAgICBudWxsSWZOaWxPckJsYW5rKHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1zWyd0b2tlbiddKSB8fCBudWxsSWZOaWxPckJsYW5rKHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ3Rva2VuJ10pO1xuICAgIH1cbiAgICBjb25zb2xlLmRlYnVnKGBbcGFzc3dvcmRdIHVzZXJuYW1lOiAke3RoaXMudXNlcm5hbWV9LCB0b2tlbjogJHt0aGlzLnRva2VufWApO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIFdhaXQgYWNjb3VudCBzZXJ2aWNlIHRvIGJlIHJlYWR5XG4gICAgYXdhaXQgdGhpcy5hY2NvdW50U2VydmljZS5yZWFkeSgpO1xuXG4gICAgdGhpcy5pc0xvZ2luID0gdGhpcy5hY2NvdW50U2VydmljZS5pc0xvZ2luKCk7XG4gICAgaWYgKHRoaXMuaXNMb2dpbikge1xuICAgICAgdGhpcy51c2VybmFtZSA9IHRoaXMudXNlcm5hbWUgfHwgdGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50LmVtYWlsO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtLnVzZXJuYW1lID0gdGhpcy51c2VybmFtZTtcblxuICAgIHRoaXMuYWRkRm9ybXMoW3RoaXMuZm9ybV0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YnNjcmliZSgoY29uZmlnKSA9PiB0aGlzLm9uQ29uZmlnUmVhZHkoY29uZmlnKSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgfVxuXG4gIGFzeW5jIG9uQ29uZmlnUmVhZHkoY29uZmlnOiBDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW3Bhc3N3b3JkXSBDb25maWcgbG9hZGVkJywgY29uZmlnKTtcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KGNvbmZpZz8uYmFja2dyb3VuZEltYWdlcykpIHtcbiAgICAgIGNvbnN0IHsgaW1hZ2UgfSA9IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdChjb25maWcuYmFja2dyb3VuZEltYWdlcyk7XG4gICAgICB0aGlzLmNvbnRlbnRTdHlsZSA9IHsgJ2JhY2tncm91bmQtaW1hZ2UnOiBgdXJsKCR7aW1hZ2V9KWAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJpbWFyeUNvbG9yID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQ09MT1JfUFJJTUFSWSkgfHwgJ3ZhcigtLWlvbi1jb2xvci1wcmltYXJ5KSc7XG4gICAgICB0aGlzLmNvbnRlbnRTdHlsZSA9IHsgJy0taW9uLWJhY2tncm91bmQtY29sb3InOiBwcmltYXJ5Q29sb3IgKyAnICFpbXBvcnRhbnQnIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5UeXBlID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlO1xuICAgIGlmICh0b2tlblR5cGUgPT09ICd0b2tlbicpIHtcbiAgICAgIHRoaXMudXNlcm5hbWVQbGFjZWhvbGRlciA9ICdVU0VSLkVNQUlMJztcbiAgICAgIHRoaXMuZW1haWxWYWxpZGF0b3IgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZXJuYW1lUGxhY2Vob2xkZXIgPSAnVVNFUi5VU0VSTkFNRSc7XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB0aGlzLmVuYWJsZSgpO1xuICB9XG5cbiAgYXN5bmMgZG9TdWJtaXQoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZm9ybS5kaXNhYmxlZCB8fCB0aGlzLnNlbmRpbmcpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgdGhpcy5zZW5kaW5nID0gdHJ1ZTtcbiAgICBjb25zdCB7IHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gdGhpcy5mb3JtLnZhbHVlO1xuXG4gICAgdGhpcy5mb3JtLmRpc2FibGUoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhdXRoRGF0YTogQXV0aERhdGEgPSB7IHVzZXJuYW1lLCBwYXNzd29yZCB9O1xuXG4gICAgICAvLyBUb2tlbiBleGlzdHMgOiBzZW5kIGNvbmZpcm1hdGlvblxuICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLnRva2VuKSkge1xuICAgICAgICAvLyBVcGRhdGUgcHVia2V5LCB1c2luZyB0aGUgdG9rZW5cbiAgICAgICAgY29uc3QgZG9uZSA9IGF3YWl0IHRoaXMuYWNjb3VudFNlcnZpY2UucmVzZXRQdWJrZXkoYXV0aERhdGEsIHRoaXMudG9rZW4pO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubmF2Q29udHJvbGxlci5uYXZpZ2F0ZVJvb3QoJy8nKTtcblxuICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHsgbWVzc2FnZTogJ0FVVEguQ09ORklSTS5QQVNTV09SRF9DSEFOR0VEJywgdHlwZTogJ2luZm8nIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgcHVia2V5IG9uIHRoZSBjdXJyZW50IGFjY291bnRcbiAgICAgICAgY29uc3QgZG9uZSA9IGF3YWl0IHRoaXMuYWNjb3VudFNlcnZpY2UudXBkYXRlUHVia2V5KGF1dGhEYXRhKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubmF2Q29udHJvbGxlci5uYXZpZ2F0ZVJvb3QoJy9hY2NvdW50Jyk7XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2U6ICdBVVRILkNPTkZJUk0uUEFTU1dPUkRfQ0hBTkdFRCcsIHR5cGU6ICdpbmZvJyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5mb3JtLmVycm9yID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyO1xuICAgICAgdGhpcy5mb3JtLmVuYWJsZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNlbmRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKSB7XG4gICAgYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFwcC10b29sYmFyXG4gIFt0aXRsZV09XCInQVVUSC5SRVNFVF9QQVNTV09SRC5USVRMRScgfCB0cmFuc2xhdGVcIlxuICBjb2xvcj1cInByaW1hcnlcIlxuICBbY2FuR29CYWNrXT1cImlzTG9naW5cIlxuICBkZWZhdWx0QmFja0hyZWY9XCIvYWNjb3VudFwiXG4+PC9hcHAtdG9vbGJhcj5cbjxpb24tY29udGVudCBjbGFzcz1cImJnLWltYWdlLWNvdmVyIGNlbnRlciBpb24tcGFkZGluZ1wiIFtuZ1N0eWxlXT1cImNvbnRlbnRTdHlsZVwiPlxuICA8aW9uLWNhcmQgY2xhc3M9XCJpb24tbWFyZ2luLXRvcFwiPlxuICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgPGFwcC1jaGFuZ2UtcGFzc3dvcmQtZm9ybVxuICAgICAgICAjZm9ybVxuICAgICAgICBbdXNlcm5hbWVQbGFjZWhvbGRlcl09XCJ1c2VybmFtZVBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2VtYWlsVmFsaWRhdG9yXT1cImVtYWlsVmFsaWRhdG9yXCJcbiAgICAgICAgKG9uU3VibWl0KT1cImRvU3VibWl0KClcIlxuICAgICAgICBbZGVidWddPVwiZGVidWdcIlxuICAgICAgPjwvYXBwLWNoYW5nZS1wYXNzd29yZC1mb3JtPlxuICAgIDwvaW9uLWNhcmQtY29udGVudD5cblxuICAgIEBpZiAobG9hZGluZ1N1YmplY3QgfCBwdXNoKSB7XG4gICAgICA8aW9uLXNwaW5uZXI+PC9pb24tc3Bpbm5lcj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxpb24tZm9vdGVyPlxuICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJmdWxsXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJkb1N1Ym1pdCgpXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyAnQ09NTU9OLkJUTl9WQUxJREFURScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tZm9vdGVyPlxuICAgIH1cbiAgPC9pb24tY2FyZD5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
@@ -9,6 +9,7 @@ import { suggestFromArray } from '../../../shared/services';
9
9
  import { AppPropertiesUtils, AppPropertyUtils } from './properties.utils';
10
10
  import { RxState } from '@rx-angular/state';
11
11
  import { firstNotNilPromise } from '../../../shared/observables';
12
+ import { RegExpUtils } from '../../../shared/regexps';
12
13
  import * as i0 from "@angular/core";
13
14
  import * as i1 from "@angular/forms";
14
15
  import * as i2 from "@angular/material/core";
@@ -120,8 +121,11 @@ export class AppPropertiesForm extends AppForm {
120
121
  this.mobile = this.mobile ?? isMobile(window);
121
122
  // Combo key
122
123
  this._autocompleteConfig = {
123
- suggestFn: (value, filter) => this.suggestDefinition(value, filter),
124
+ suggestFn: (value, filter, sortBy, sortDirection, opts) => this.suggestDefinitionKeys(value, filter, 'value', sortDirection, opts),
125
+ equals: (v1, v2) => (v1?.key || v1) === (v2?.key || v2),
124
126
  displayWith: (value) => {
127
+ // DEBUG
128
+ //console.debug('[app-properties-form] Displaying value', value);
125
129
  // Value is an object (a Property)
126
130
  if (value && typeof value === 'object') {
127
131
  return value.value;
@@ -136,7 +140,7 @@ export class AppPropertiesForm extends AppForm {
136
140
  columnNames: [this.translate.instant('SETTINGS.PROPERTY_KEY')],
137
141
  splitSearchText: false,
138
142
  showAllOnFocus: true,
139
- selectInputContentOnFocus: true,
143
+ selectInputContentOnFocus: !this.mobile,
140
144
  };
141
145
  this._state.hold(this._state.select('definitions'), (definitions) => {
142
146
  if (this.loaded)
@@ -145,8 +149,10 @@ export class AppPropertiesForm extends AppForm {
145
149
  this.processDefinitions(this.definitions);
146
150
  }
147
151
  processDefinitions(definitions) {
152
+ if (!definitions)
153
+ return [];
148
154
  // DEBUG
149
- //console.debug('[app-properties-form] Received definitions:', definitions);
155
+ //console.debug('[app-properties-form] Processing definitions...', definitions);
150
156
  // Prepare definition (e.g. resolve tokens if any)
151
157
  definitions = FormFieldDefinitionUtils.prepareDefinitions(this.injector, definitions || []);
152
158
  // Fill options map
@@ -160,7 +166,6 @@ export class AppPropertiesForm extends AppForm {
160
166
  })
161
167
  .filter(isNotNil);
162
168
  this._definitionByKey = definitionsByKey;
163
- return definitions;
164
169
  }
165
170
  getDefinitionAt(index) {
166
171
  let definition = this._definitionsByIndex[index];
@@ -187,9 +192,18 @@ export class AppPropertiesForm extends AppForm {
187
192
  async setValue(data) {
188
193
  if (!data)
189
194
  return; // Skip
190
- const definitions = await firstNotNilPromise(this._definitions$, { stop: this.destroySubject });
195
+ const [definitions, definitionKeys] = await Promise.all([
196
+ firstNotNilPromise(this._definitions$, { stop: this.destroySubject }),
197
+ firstNotNilPromise(this._definitionKeys$, { stop: this.destroySubject }),
198
+ ]);
191
199
  // Transform properties map into array
192
200
  const values = await AppPropertiesUtils.arrayFromObject(data, definitions);
201
+ // Workaround because when autocomplete use mat-select (when mobile), it needs to display the value - fix issue ngx-sumaris-components#16
202
+ if (this.mobile) {
203
+ values.forEach((property) => {
204
+ property.key = (definitionKeys.find((defKey) => defKey.key === property.key) || { key: property.key, value: property.key });
205
+ });
206
+ }
193
207
  this._helper.resize(values.length);
194
208
  this._helper.formArray.patchValue(values, { emitEvent: false });
195
209
  this.markAsPristine();
@@ -204,18 +218,19 @@ export class AppPropertiesForm extends AppForm {
204
218
  return json;
205
219
  }
206
220
  /* -- protected methods -- */
207
- async suggestDefinition(value, filter) {
208
- value = value ?? '*';
221
+ async suggestDefinitionKeys(value, filter, sortBy, sortDirection, opts) {
209
222
  let items = await firstNotNilPromise(this._definitionKeys$, { stop: this.destroySubject });
223
+ // DEBUG
224
+ //console.debug('[app-properties-form] Suggesting definition keys', value, items);
210
225
  // Get as key
211
- if (typeof value === 'string') {
226
+ if (typeof value === 'string' && !RegExpUtils.hasWildcardCharacter(value)) {
212
227
  const obj = items.find((o) => o.key === value);
213
228
  if (obj)
214
229
  return { data: [obj] };
215
230
  }
216
231
  // Get as object
217
- if (typeof value === 'object') {
218
- return { data: value };
232
+ if (value && typeof value === 'object') {
233
+ return { data: [value] };
219
234
  }
220
235
  // Remove already used keys
221
236
  if (this.options?.allowDuplicatedValues !== true) {
@@ -224,7 +239,11 @@ export class AppPropertiesForm extends AppForm {
224
239
  .map(AppPropertyUtils.getPropertyKey);
225
240
  items = items.filter((item) => !existingKeys.includes(item.key));
226
241
  }
227
- return suggestFromArray(items, value, { searchAttribute: 'value', ...filter });
242
+ value = value ?? '*';
243
+ // Any match
244
+ if (!value.startsWith('*'))
245
+ value = '*' + value;
246
+ return suggestFromArray(items, value, filter, sortBy, sortDirection, opts);
228
247
  }
229
248
  markForCheck() {
230
249
  this.cd.markForCheck();
@@ -233,11 +252,11 @@ export class AppPropertiesForm extends AppForm {
233
252
  return isNil(obj?.key) || isNil(obj.value);
234
253
  }
235
254
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppPropertiesForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.DateAdapter }, { token: i0.ChangeDetectorRef }, { token: i3.PropertyValidator }, { token: i1.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
236
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppPropertiesForm, selector: "app-properties-form", inputs: { formArrayName: "formArrayName", formArray: "formArray", options: "options", chipColor: "chipColor", mobile: ["mobile", "mobile", booleanAttribute], appearance: "appearance", subscriptSizing: "subscriptSizing", showHintKey: ["showHintKey", "showHintKey", booleanAttribute], hintKeyPrefix: "hintKeyPrefix", showMoreButton: ["showMoreButton", "showMoreButton", booleanAttribute], addButtonText: "addButtonText", addButtonTitle: "addButtonTitle", showAddButton: ["showAddButton", "showAddButton", booleanAttribute], showMoreButtonTitle: "showMoreButtonTitle", definitions: "definitions" }, providers: [{ provide: PropertyValidator, useClass: PropertyValidator }, RxState], usesInheritance: true, ngImport: i0, template: "<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n @if (loadingSubject | async) {\n <ion-list [inset]=\"mobile\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-list>\n } @else {\n <ion-list formArrayName=\"properties\" [inset]=\"mobile\">\n <!-- Show more options -->\n @if ((_definitionKeys$ | async | isNotEmptyArray) && formArray?.length === 0) {\n <ion-item lines=\"none\">\n <ion-button color=\"light\" [title]=\"addButtonTitle | translate\" (click)=\"_helper.add()\">\n <ion-label>{{ addButtonText | translate }}</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-item>\n }\n\n @for (fieldForm of fieldForms; track i; let i = $index) {\n <ion-item lines=\"none\" [class.outline]=\"appearance === 'outline'\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row [formGroupName]=\"i\" class=\"ion-no-padding\">\n @let definition = getDefinitionAt(i);\n <!-- property key -->\n @if (fieldForm | formGetControl: 'key'; as control) {\n <ion-col\n size=\"12\"\n size-sm=\"6\"\n [title]=\"(definition | propertyGet: 'label' | translate) || ''\"\n class=\"ion-no-padding\"\n >\n <mat-autocomplete-field\n floatLabel=\"auto\"\n [formControl]=\"control\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"showHintKey ? 'fixed' : subscriptSizing\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"tabindex + i * 2\"\n [config]=\"_autocompleteConfig\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY' | translate\"\n [required]=\"true\"\n (focus)=\"_focusedControlIndex = i\"\n [readonly]=\"definition?.disabled\"\n >\n <mat-hint [class.cdk-visually-hidden]=\"!showHintKey\">\n @let keyValue = control.value;\n {{ hintKeyPrefix || '' }}{{ keyValue?.key || keyValue || '' }}\n </mat-hint>\n </mat-autocomplete-field>\n </ion-col>\n }\n\n <!-- property value -->\n <ion-col size=\"\" size-sm=\"\" class=\"ion-no-padding ion-padding-start-xs\">\n @if (definition) {\n <app-form-field\n floatLabel=\"auto\"\n [label]=\"mobile ? ('SETTINGS.PROPERTY_VALUE' | translate) : ' '\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [hideRequiredMarker]=\"true\"\n [tabindex]=\"tabindex + i * 2 + 1\"\n [readonly]=\"definition?.disabled\"\n ></app-form-field>\n } @else {\n <!-- unknown definition -->\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"subscriptSizing\">\n @if (mobile) {\n <mat-label>{{ 'SETTINGS.PROPERTY_VALUE' | translate }}</mat-label>\n }\n <input\n type=\"text\"\n matInput\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"mobile ? '' : ('SETTINGS.PROPERTY_VALUE' | translate)\"\n [required]=\"true\"\n [tabindex]=\"20 + i * 2 + 1\"\n />\n </mat-form-field>\n }\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n @if (_helper.isLast(i)) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"\n disabled || (fieldForm.value | asBoolean: isEmptyProperty) || (_definitionKeys | isEmptyArray)\n \"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY' | translate\"\n (click)=\"_helper.add()\"\n [tabindex]=\"20 + i * 2 + 2\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"definition?.disabled || disabled\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"removeAt(i)\"\n [tabindex]=\"-1\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n }\n </ion-list>\n }\n</form>\n\n<ng-template #propertyRowSkeleton>\n <ion-item lines=\"none\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button color=\"light\" disabled>\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n</ng-template>\n", styles: [":host ion-item ion-row ion-col{--ion-padding-start: 0;min-width:48px}:host ion-item.outline{overflow:visible}:host ion-item.outline ion-grid,:host ion-item.outline ion-row,:host ion-item.outline ion-col{overflow:visible}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i5.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i5.IonRow, selector: "ion-row" }, { kind: "component", type: i5.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "label", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "hideRequiredMarker", "mobile", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "reloadItemsOnFocus", "clearInvalidValueOnBlur", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "splitSearchText", "selectInputContentOnFocus", "selectInputContentOnFocusDelay", "previewImplicitValue", "class", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keydown.backspace", "keyup.enter", "selectionChange"] }, { kind: "component", type: i11.AppFormField, selector: "app-form-field", inputs: ["definition", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "required", "hideRequiredMarker", "floatLabel", "label", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i14.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i14.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i15.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i16.AsBooleanPipe, name: "asBoolean" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
255
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppPropertiesForm, selector: "app-properties-form", inputs: { formArrayName: "formArrayName", formArray: "formArray", options: "options", chipColor: "chipColor", mobile: ["mobile", "mobile", booleanAttribute], appearance: "appearance", subscriptSizing: "subscriptSizing", showHintKey: ["showHintKey", "showHintKey", booleanAttribute], hintKeyPrefix: "hintKeyPrefix", showMoreButton: ["showMoreButton", "showMoreButton", booleanAttribute], addButtonText: "addButtonText", addButtonTitle: "addButtonTitle", showAddButton: ["showAddButton", "showAddButton", booleanAttribute], showMoreButtonTitle: "showMoreButtonTitle", definitions: "definitions" }, providers: [{ provide: PropertyValidator, useClass: PropertyValidator }, RxState], usesInheritance: true, ngImport: i0, template: "<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n @if (loadingSubject | async) {\n <ion-list [inset]=\"mobile\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-list>\n } @else {\n <ion-list formArrayName=\"properties\" [inset]=\"mobile\">\n <!-- Show more options -->\n @if ((_definitionKeys$ | async | isNotEmptyArray) && formArray?.length === 0) {\n <ion-item lines=\"none\">\n <ion-button color=\"light\" [title]=\"addButtonTitle | translate\" (click)=\"_helper.add()\">\n <ion-label>{{ addButtonText | translate }}</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-item>\n }\n\n @for (fieldForm of fieldForms; track i; let i = $index) {\n <ion-item lines=\"none\" [class.outline]=\"appearance === 'outline'\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row [formGroupName]=\"i\" class=\"ion-no-padding\">\n @let definition = getDefinitionAt(i);\n <!-- property key -->\n @if (fieldForm | formGetControl: 'key'; as control) {\n <ion-col\n size=\"12\"\n size-sm=\"6\"\n [title]=\"(definition | propertyGet: 'label' | translate) || ''\"\n class=\"ion-no-padding\"\n >\n <mat-autocomplete-field\n floatLabel=\"auto\"\n [formControl]=\"control\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"showHintKey ? 'fixed' : subscriptSizing\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"tabindex + i * 2\"\n [config]=\"_autocompleteConfig\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY' | translate\"\n [required]=\"true\"\n (focus)=\"_focusedControlIndex = i\"\n [readonly]=\"definition?.disabled\"\n [mobile]=\"mobile\"\n >\n <mat-hint [class.cdk-visually-hidden]=\"!showHintKey\">\n @let keyValue = control.value;\n {{ hintKeyPrefix || '' }}{{ keyValue?.key || keyValue || '' }}\n </mat-hint>\n </mat-autocomplete-field>\n </ion-col>\n }\n\n <!-- property value -->\n <ion-col size=\"\" size-sm=\"\" class=\"ion-no-padding ion-padding-start-xs\">\n @if (definition) {\n <app-form-field\n floatLabel=\"auto\"\n [label]=\"mobile ? ('SETTINGS.PROPERTY_VALUE' | translate) : ' '\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [hideRequiredMarker]=\"true\"\n [tabindex]=\"tabindex + i * 2 + 1\"\n [readonly]=\"definition?.disabled\"\n ></app-form-field>\n } @else {\n <!-- unknown definition -->\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"subscriptSizing\">\n @if (mobile) {\n <mat-label>{{ 'SETTINGS.PROPERTY_VALUE' | translate }}</mat-label>\n }\n <input\n type=\"text\"\n matInput\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"mobile ? '' : ('SETTINGS.PROPERTY_VALUE' | translate)\"\n [required]=\"true\"\n [tabindex]=\"20 + i * 2 + 1\"\n />\n </mat-form-field>\n }\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n @if (_helper.isLast(i)) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"\n disabled || (fieldForm.value | asBoolean: isEmptyProperty) || (_definitionKeys | isEmptyArray)\n \"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY' | translate\"\n (click)=\"_helper.add()\"\n [tabindex]=\"20 + i * 2 + 2\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"definition?.disabled || disabled\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"removeAt(i)\"\n [tabindex]=\"-1\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n }\n </ion-list>\n }\n</form>\n\n<ng-template #propertyRowSkeleton>\n <ion-item lines=\"none\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button color=\"light\" disabled>\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n</ng-template>\n", styles: [":host ion-item ion-row ion-col{--ion-padding-start: 0;min-width:48px}:host ion-item.outline{overflow:visible}:host ion-item.outline ion-grid,:host ion-item.outline ion-row,:host ion-item.outline ion-col{overflow:visible}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i5.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i5.IonRow, selector: "ion-row" }, { kind: "component", type: i5.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "label", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "hideRequiredMarker", "mobile", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "reloadItemsOnFocus", "clearInvalidValueOnBlur", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "splitSearchText", "selectInputContentOnFocus", "selectInputContentOnFocusDelay", "previewImplicitValue", "class", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keydown.backspace", "keyup.enter", "selectionChange"] }, { kind: "component", type: i11.AppFormField, selector: "app-form-field", inputs: ["definition", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "required", "hideRequiredMarker", "floatLabel", "label", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i14.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i14.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i15.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i16.AsBooleanPipe, name: "asBoolean" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
237
256
  }
238
257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppPropertiesForm, decorators: [{
239
258
  type: Component,
240
- args: [{ selector: 'app-properties-form', providers: [{ provide: PropertyValidator, useClass: PropertyValidator }, RxState], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n @if (loadingSubject | async) {\n <ion-list [inset]=\"mobile\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-list>\n } @else {\n <ion-list formArrayName=\"properties\" [inset]=\"mobile\">\n <!-- Show more options -->\n @if ((_definitionKeys$ | async | isNotEmptyArray) && formArray?.length === 0) {\n <ion-item lines=\"none\">\n <ion-button color=\"light\" [title]=\"addButtonTitle | translate\" (click)=\"_helper.add()\">\n <ion-label>{{ addButtonText | translate }}</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-item>\n }\n\n @for (fieldForm of fieldForms; track i; let i = $index) {\n <ion-item lines=\"none\" [class.outline]=\"appearance === 'outline'\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row [formGroupName]=\"i\" class=\"ion-no-padding\">\n @let definition = getDefinitionAt(i);\n <!-- property key -->\n @if (fieldForm | formGetControl: 'key'; as control) {\n <ion-col\n size=\"12\"\n size-sm=\"6\"\n [title]=\"(definition | propertyGet: 'label' | translate) || ''\"\n class=\"ion-no-padding\"\n >\n <mat-autocomplete-field\n floatLabel=\"auto\"\n [formControl]=\"control\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"showHintKey ? 'fixed' : subscriptSizing\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"tabindex + i * 2\"\n [config]=\"_autocompleteConfig\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY' | translate\"\n [required]=\"true\"\n (focus)=\"_focusedControlIndex = i\"\n [readonly]=\"definition?.disabled\"\n >\n <mat-hint [class.cdk-visually-hidden]=\"!showHintKey\">\n @let keyValue = control.value;\n {{ hintKeyPrefix || '' }}{{ keyValue?.key || keyValue || '' }}\n </mat-hint>\n </mat-autocomplete-field>\n </ion-col>\n }\n\n <!-- property value -->\n <ion-col size=\"\" size-sm=\"\" class=\"ion-no-padding ion-padding-start-xs\">\n @if (definition) {\n <app-form-field\n floatLabel=\"auto\"\n [label]=\"mobile ? ('SETTINGS.PROPERTY_VALUE' | translate) : ' '\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [hideRequiredMarker]=\"true\"\n [tabindex]=\"tabindex + i * 2 + 1\"\n [readonly]=\"definition?.disabled\"\n ></app-form-field>\n } @else {\n <!-- unknown definition -->\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"subscriptSizing\">\n @if (mobile) {\n <mat-label>{{ 'SETTINGS.PROPERTY_VALUE' | translate }}</mat-label>\n }\n <input\n type=\"text\"\n matInput\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"mobile ? '' : ('SETTINGS.PROPERTY_VALUE' | translate)\"\n [required]=\"true\"\n [tabindex]=\"20 + i * 2 + 1\"\n />\n </mat-form-field>\n }\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n @if (_helper.isLast(i)) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"\n disabled || (fieldForm.value | asBoolean: isEmptyProperty) || (_definitionKeys | isEmptyArray)\n \"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY' | translate\"\n (click)=\"_helper.add()\"\n [tabindex]=\"20 + i * 2 + 2\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"definition?.disabled || disabled\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"removeAt(i)\"\n [tabindex]=\"-1\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n }\n </ion-list>\n }\n</form>\n\n<ng-template #propertyRowSkeleton>\n <ion-item lines=\"none\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button color=\"light\" disabled>\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n</ng-template>\n", styles: [":host ion-item ion-row ion-col{--ion-padding-start: 0;min-width:48px}:host ion-item.outline{overflow:visible}:host ion-item.outline ion-grid,:host ion-item.outline ion-row,:host ion-item.outline ion-col{overflow:visible}\n"] }]
259
+ args: [{ selector: 'app-properties-form', providers: [{ provide: PropertyValidator, useClass: PropertyValidator }, RxState], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n @if (loadingSubject | async) {\n <ion-list [inset]=\"mobile\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-list>\n } @else {\n <ion-list formArrayName=\"properties\" [inset]=\"mobile\">\n <!-- Show more options -->\n @if ((_definitionKeys$ | async | isNotEmptyArray) && formArray?.length === 0) {\n <ion-item lines=\"none\">\n <ion-button color=\"light\" [title]=\"addButtonTitle | translate\" (click)=\"_helper.add()\">\n <ion-label>{{ addButtonText | translate }}</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-item>\n }\n\n @for (fieldForm of fieldForms; track i; let i = $index) {\n <ion-item lines=\"none\" [class.outline]=\"appearance === 'outline'\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row [formGroupName]=\"i\" class=\"ion-no-padding\">\n @let definition = getDefinitionAt(i);\n <!-- property key -->\n @if (fieldForm | formGetControl: 'key'; as control) {\n <ion-col\n size=\"12\"\n size-sm=\"6\"\n [title]=\"(definition | propertyGet: 'label' | translate) || ''\"\n class=\"ion-no-padding\"\n >\n <mat-autocomplete-field\n floatLabel=\"auto\"\n [formControl]=\"control\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"showHintKey ? 'fixed' : subscriptSizing\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"tabindex + i * 2\"\n [config]=\"_autocompleteConfig\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY' | translate\"\n [required]=\"true\"\n (focus)=\"_focusedControlIndex = i\"\n [readonly]=\"definition?.disabled\"\n [mobile]=\"mobile\"\n >\n <mat-hint [class.cdk-visually-hidden]=\"!showHintKey\">\n @let keyValue = control.value;\n {{ hintKeyPrefix || '' }}{{ keyValue?.key || keyValue || '' }}\n </mat-hint>\n </mat-autocomplete-field>\n </ion-col>\n }\n\n <!-- property value -->\n <ion-col size=\"\" size-sm=\"\" class=\"ion-no-padding ion-padding-start-xs\">\n @if (definition) {\n <app-form-field\n floatLabel=\"auto\"\n [label]=\"mobile ? ('SETTINGS.PROPERTY_VALUE' | translate) : ' '\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [hideRequiredMarker]=\"true\"\n [tabindex]=\"tabindex + i * 2 + 1\"\n [readonly]=\"definition?.disabled\"\n ></app-form-field>\n } @else {\n <!-- unknown definition -->\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"subscriptSizing\">\n @if (mobile) {\n <mat-label>{{ 'SETTINGS.PROPERTY_VALUE' | translate }}</mat-label>\n }\n <input\n type=\"text\"\n matInput\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"mobile ? '' : ('SETTINGS.PROPERTY_VALUE' | translate)\"\n [required]=\"true\"\n [tabindex]=\"20 + i * 2 + 1\"\n />\n </mat-form-field>\n }\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n @if (_helper.isLast(i)) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"\n disabled || (fieldForm.value | asBoolean: isEmptyProperty) || (_definitionKeys | isEmptyArray)\n \"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY' | translate\"\n (click)=\"_helper.add()\"\n [tabindex]=\"20 + i * 2 + 2\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"definition?.disabled || disabled\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"removeAt(i)\"\n [tabindex]=\"-1\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n }\n </ion-list>\n }\n</form>\n\n<ng-template #propertyRowSkeleton>\n <ion-item lines=\"none\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button color=\"light\" disabled>\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n</ng-template>\n", styles: [":host ion-item ion-row ion-col{--ion-padding-start: 0;min-width:48px}:host ion-item.outline{overflow:visible}:host ion-item.outline ion-grid,:host ion-item.outline ion-row,:host ion-item.outline ion-col{overflow:visible}\n"] }]
241
260
  }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.DateAdapter }, { type: i0.ChangeDetectorRef }, { type: i3.PropertyValidator }, { type: i1.FormGroupDirective, decorators: [{
242
261
  type: Optional
243
262
  }] }], propDecorators: { formArrayName: [{
@@ -275,4 +294,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
275
294
  }], definitions: [{
276
295
  type: Input
277
296
  }] } });
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0aWVzLmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBWSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5KLE9BQU8sRUFBK0Msd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6SCxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUcxRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQTBCLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY2pFLE1BQU0sT0FBTyxpQkFDWCxTQUFRLE9BQVk7SUF1RVI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNVO0lBekVILE1BQU0sR0FBZSxN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QkFDN0IsYUFBYTtzQkFBckIsS0FBSztnQkFDa0MsY0FBYztzQkFBckQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNrQyxhQUFhO3NCQUFwRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU16QixtQkFBbUI7c0JBQS9CLEtBQUs7Z0JBT08sV0FBVztzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJvb2xlYW5BdHRyaWJ1dGUsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwRGlyZWN0aXZlLCBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRmllbGREZWZpbml0aW9uLCBGb3JtRmllbGREZWZpbml0aW9uTWFwLCBGb3JtRmllbGREZWZpbml0aW9uVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTmlsLCBpc05vdE5pbCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEFwcEZvcm0gfSBmcm9tICcuLi9mb3JtLmNsYXNzJztcbmltcG9ydCB7IFByb3BlcnR5LCBQcm9wZXJ0eU1hcCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBQcm9wZXJ0eVZhbGlkYXRvciB9IGZyb20gJy4vcHJvcGVydHkudmFsaWRhdG9yJztcbmltcG9ydCB7IFByZWRlZmluZWRDb2xvcnMgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXlIZWxwZXIsIEZvcm1BcnJheUhlbHBlck9wdGlvbnMgfSBmcm9tICcuLi9hcnJheS9mb3JtLWFycmF5JztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IHN1Z2dlc3RGcm9tQXJyYXkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMnO1xuaW1wb3J0IHsgTG9hZFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBBcHBQcm9wZXJ0aWVzVXRpbHMsIEFwcFByb3BlcnR5VXRpbHMgfSBmcm9tICcuL3Byb3BlcnRpZXMudXRpbHMnO1xuaW1wb3J0IHsgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IGZpcnN0Tm90TmlsUHJvbWlzZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwUHJvcGVydGllc0Zvcm1TdGF0ZSB7XG4gIGRlZmluaXRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIGRlZmluaXRpb25LZXlzOiBQcm9wZXJ0eVtdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvcGVydGllcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdwcm9wZXJ0aWVzLmZvcm0uaHRtbCcsXG4gIHN0eWxlVXJsczogWydwcm9wZXJ0aWVzLmZvcm0uc2NzcyddLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFByb3BlcnR5VmFsaWRhdG9yLCB1c2VDbGFzczogUHJvcGVydHlWYWxpZGF0b3IgfSwgUnhTdGF0ZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBQcm9wZXJ0aWVzRm9ybTxPID0gYW55LCBUIGV4dGVuZHMgUHJvcGVydHk8Tz4gPSBQcm9wZXJ0eTxPPiwgUyBleHRlbmRzIEFwcFByb3BlcnRpZXNGb3JtU3RhdGUgPSBBcHBQcm9wZXJ0aWVzRm9ybVN0YXRlPlxuICBleHRlbmRzIEFwcEZvcm08VFtdPlxuICBpbXBsZW1lbnRzIE9uSW5pdFxue1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRlOiBSeFN0YXRlPFM+ID0gaW5qZWN0KFJ4U3RhdGUpO1xuXG4gIHByb3RlY3RlZCBfZGVmaW5pdGlvbnMkID0gdGhpcy5fc3RhdGUuc2VsZWN0KCdkZWZpbml0aW9ucycpO1xuICBwcm90ZWN0ZWQgX2RlZmluaXRpb25LZXlzJCA9IHRoaXMuX3N0YXRlLnNlbGVjdCgnZGVmaW5pdGlvbktleXMnKTtcblxuICBwcm90ZWN0ZWQgc2V0IF9kZWZpbml0aW9uS2V5cyh2YWx1ZTogUHJvcGVydHlbXSkge1xuICAgIHRoaXMuX3N0YXRlLnNldCgnZGVmaW5pdGlvbktleXMnLCAoKSA9PiB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBfZGVmaW5pdGlvbktleXMoKTogUHJvcGVydHlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldCgnZGVmaW5pdGlvbktleXMnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVmaW5pdGlvbkJ5S2V5OiBGb3JtRmllbGREZWZpbml0aW9uTWFwID0ge307XG4gIHByb3RlY3RlZCBfZGVmaW5pdGlvbnNCeUluZGV4OiB7IFtpbmRleDogbnVtYmVyXTogRm9ybUZpZWxkRGVmaW5pdGlvbiB9ID0ge307XG4gIHByb3RlY3RlZCBfaGVscGVyOiBGb3JtQXJyYXlIZWxwZXI8UHJvcGVydHk+O1xuXG4gIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlQ29uZmlnOiBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZztcbiAgcHJvdGVjdGVkIF9mb2N1c2VkQ29udHJvbEluZGV4OiBudW1iZXI7XG5cbiAgQElucHV0KCkgZm9ybUFycmF5TmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtQXJyYXk6IFVudHlwZWRGb3JtQXJyYXk7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IEZvcm1BcnJheUhlbHBlck9wdGlvbnM7XG4gIEBJbnB1dCgpIGNoaXBDb2xvcjogVGhlbWVQYWxldHRlIHwgUHJlZGVmaW5lZENvbG9ycyA9ICdhY2NlbnQnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlO1xuICBASW5wdXQoKSBzdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dIaW50S2V5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGhpbnRLZXlQcmVmaXggPSAnJztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dNb3JlQnV0dG9uID0gdHJ1ZTtcbiAgQElucHV0KCkgYWRkQnV0dG9uVGV4dCA9ICdDT01NT04uQlROX0FERCc7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvblRpdGxlID0gJyc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QWRkQnV0dG9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGFkZEJ1dHRvblRpdGxlIGluc3RlYWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2hvd01vcmVCdXR0b25UaXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGRCdXR0b25UaXRsZSA9IHZhbHVlO1xuICB9XG4gIGdldCBzaG93TW9yZUJ1dHRvblRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQnV0dG9uVGl0bGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGVmaW5pdGlvbnModmFsdWU6IEZvcm1GaWVsZERlZmluaXRpb25bXSkge1xuICAgIHRoaXMuX3N0YXRlLnNldCgnZGVmaW5pdGlvbnMnLCAoKSA9PiB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGRlZmluaXRpb25zKCk6IEZvcm1GaWVsZERlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldCgnZGVmaW5pdGlvbnMnKTtcbiAgfVxuXG4gIHNldCB2YWx1ZShkYXRhOiBUW10pIHtcbiAgICB0aGlzLnNldFZhbHVlKGRhdGEpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5LnZhbHVlIGFzIFRbXTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQXJyYXk/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgZ2V0IGZpZWxkRm9ybXMoKTogVW50eXBlZEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQXJyYXkuY29udHJvbHMgYXMgVW50eXBlZEZvcm1Hcm91cFtdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPE1vbWVudD4sXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yOiBQcm9wZXJ0eVZhbGlkYXRvcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yLCBudWxsKTtcblxuICAgIHRoaXMudGFiaW5kZXggPSAyMDsgLy8gRm9yIGNvbXBhdGliaWxpdHkgLSBUT0RPIHJlbW92ZSBsYXRlclxuICAgIC8vdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYWxsb3dFbXB0eUFycmF5ID09PSBmYWxzZSAmJiBpc0VtcHR5QXJyYXkodGhpcy5kZWZpbml0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3IgaW52YWxpZCBhdHRyaWJ1dGUgJ2RlZmluaXRpb25zJ1wiKTtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSB0aGUgZm9ybVxuICAgIGNvbnN0IGZvcm0gPVxuICAgICAgKHRoaXMuZm9ybUFycmF5ICYmICh0aGlzLmZvcm1BcnJheS5wYXJlbnQgYXMgVW50eXBlZEZvcm1Hcm91cCkpIHx8ICh0aGlzLmZvcm1Hcm91cERpciAmJiB0aGlzLmZvcm1Hcm91cERpci5mb3JtKSB8fCB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHt9KTtcbiAgICB0aGlzLnNldEZvcm0oZm9ybSk7XG5cbiAgICB0aGlzLmZvcm1BcnJheSA9IHRoaXMuZm9ybUFycmF5IHx8ICh0aGlzLmZvcm1BcnJheU5hbWUgJiYgKGZvcm0uZ2V0KHRoaXMuZm9ybUFycmF5TmFtZSkgYXMgVW50eXBlZEZvcm1BcnJheSkpO1xuICAgIHRoaXMuZm9ybUFycmF5TmFtZSA9XG4gICAgICB0aGlzLmZvcm1BcnJheU5hbWUgfHwgKHRoaXMuZm9ybUFycmF5ICYmIE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZpbmQoKGtleSkgPT4gZm9ybS5nZXQoa2V5KSA9PT0gdGhpcy5mb3JtQXJyYXkpKSB8fCAncHJvcGVydGllcyc7XG4gICAgaWYgKCF0aGlzLmZvcm1BcnJheSkge1xuICAgICAgY29uc29sZS53YXJuKGBNaXNzaW5nIGFycmF5IGNvbnRyb2wgJyR7dGhpcy5mb3JtQXJyYXlOYW1lfScuIFdpbGwgY3JlYXRlIGl0IWApO1xuICAgICAgdGhpcy5mb3JtQXJyYXkgPSB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKTtcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKHRoaXMuZm9ybUFycmF5TmFtZSwgdGhpcy5mb3JtQXJyYXkpO1xuICAgIH1cblxuICAgIHRoaXMuX2hlbHBlciA9IG5ldyBGb3JtQXJyYXlIZWxwZXI8UHJvcGVydHk+KFxuICAgICAgdGhpcy5mb3JtQXJyYXksXG4gICAgICAodmFsdWUpID0+IHRoaXMudmFsaWRhdG9yLmdldEZvcm1Hcm91cCh2YWx1ZSksXG4gICAgICAodjEsIHYyKSA9PiAoIXYxICYmICF2MikgfHwgdjEua2V5ID09PSB2Mi5rZXksXG4gICAgICAodmFsdWUpID0+IHRoaXMuaXNFbXB0eVByb3BlcnR5KHZhbHVlKSxcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG5cbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMubW9iaWxlID8/IGlzTW9iaWxlKHdpbmRvdyk7XG5cbiAgICAvLyBDb21ibyBrZXlcbiAgICB0aGlzLl9hdXRvY29tcGxldGVDb25maWcgPSB7XG4gICAgICBzdWdnZXN0Rm46ICh2YWx1ZSwgZmlsdGVyKSA9PiB0aGlzLnN1Z2dlc3REZWZpbml0aW9uKHZhbHVlLCBmaWx0ZXIpLFxuICAgICAgZGlzcGxheVdpdGg6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIGlzIGFuIG9iamVjdCAoYSBQcm9wZXJ0eSlcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gKHZhbHVlIGFzIFByb3BlcnR5KS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbHVlIGlzIGEga2V5XG4gICAgICAgIGNvbnN0IGRlZiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5fZGVmaW5pdGlvbkJ5S2V5W3ZhbHVlXTtcbiAgICAgICAgaWYgKCFkZWYpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZGVmLmxhYmVsKTtcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiBbJ3ZhbHVlJ10sXG4gICAgICBjb2x1bW5OYW1lczogW3RoaXMudHJhbnNsYXRlLmluc3RhbnQoJ1NFVFRJTkdTLlBST1BFUlRZX0tFWScpXSxcbiAgICAgIHNwbGl0U2VhcmNoVGV4dDogZmFsc2UsXG4gICAgICBzaG93QWxsT25Gb2N1czogdHJ1ZSxcbiAgICAgIHNlbGVjdElucHV0Q29udGVudE9uRm9jdXM6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuX3N0YXRlLmhvbGQodGhpcy5fc3RhdGUuc2VsZWN0KCdkZWZpbml0aW9ucycpLCAoZGVmaW5pdGlvbnMpID0+IHtcbiAgICAgIGlmICh0aGlzLmxvYWRlZCkgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbnMoZGVmaW5pdGlvbnMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbnModGhpcy5kZWZpbml0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0RlZmluaXRpb25zKGRlZmluaXRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uW10pOiBGb3JtRmllbGREZWZpbml0aW9uW10ge1xuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbYXBwLXByb3BlcnRpZXMtZm9ybV0gUmVjZWl2ZWQgZGVmaW5pdGlvbnM6JywgZGVmaW5pdGlvbnMpO1xuXG4gICAgLy8gUHJlcGFyZSBkZWZpbml0aW9uIChlLmcuIHJlc29sdmUgdG9rZW5zIGlmIGFueSlcbiAgICBkZWZpbml0aW9ucyA9IEZvcm1GaWVsZERlZmluaXRpb25VdGlscy5wcmVwYXJlRGVmaW5pdGlvbnModGhpcy5pbmplY3RvciwgZGVmaW5pdGlvbnMgfHwgW10pO1xuXG4gICAgLy8gRmlsbCBvcHRpb25zIG1hcFxuICAgIGNvbnN0IGRlZmluaXRpb25zQnlLZXkgPSA8Rm9ybUZpZWxkRGVmaW5pdGlvbk1hcD57fTtcbiAgICB0aGlzLl9kZWZpbml0aW9uS2V5cyA9IGRlZmluaXRpb25zXG4gICAgICAubWFwKChkZWYpID0+IHtcbiAgICAgICAgZGVmaW5pdGlvbnNCeUtleVtkZWYua2V5XSA9IGRlZjtcbiAgICAgICAgaWYgKGRlZi5kaXNhYmxlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB7IGtleTogZGVmLmtleSwgdmFsdWU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZGVmLmxhYmVsKSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoaXNOb3ROaWwpO1xuICAgIHRoaXMuX2RlZmluaXRpb25CeUtleSA9IGRlZmluaXRpb25zQnlLZXk7XG4gICAgcmV0dXJuIGRlZmluaXRpb25zO1xuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbkF0KGluZGV4OiBudW1iZXIpOiBGb3JtRmllbGREZWZpbml0aW9uIHtcbiAgICBsZXQgZGVmaW5pdGlvbiA9IHRoaXMuX2RlZmluaXRpb25zQnlJbmRleFtpbmRleF07XG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICBkZWZpbml0aW9uID0gdGhpcy51cGRhdGVEZWZpbml0aW9uQXQoaW5kZXgsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICB1cGRhdGVEZWZpbml0aW9uQXQoaW5kZXg6IG51bWJlciwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogRm9ybUZpZWxkRGVmaW5pdGlvbiB7XG4gICAgbGV0IHZhbHVlID0gKHRoaXMuZm9ybUFycmF5LmF0KGluZGV4KSBhcyBVbnR5cGVkRm9ybUdyb3VwKS5jb250cm9scy5rZXkudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gdmFsdWU/LmtleSB8fCB2YWx1ZTtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gKGtleSAmJiB0aGlzLl9kZWZpbml0aW9uQnlLZXlba2V5XSkgfHwgbnVsbDtcbiAgICB0aGlzLl9kZWZpbml0aW9uc0J5SW5kZXhbaW5kZXhdID0gZGVmaW5pdGlvbjsgLy8gdXBkYXRlIG1hcCBieSBpbmRleFxuICAgIGlmIChvcHRzPy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9oZWxwZXIucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuX2RlZmluaXRpb25zQnlJbmRleCA9IHt9OyAvLyBjbGVhciBtYXAgYnkgaW5kZXhcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYXN5bmMgc2V0VmFsdWUoZGF0YTogUHJvcGVydHlNYXAgfCBUW10pIHtcbiAgICBpZiAoIWRhdGEpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fZGVmaW5pdGlvbnMkLCB7IHN0b3A6IHRoaXMuZGVzdHJveVN1YmplY3QgfSk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcHJvcGVydGllcyBtYXAgaW50byBhcnJheVxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IEFwcFByb3BlcnRpZXNVdGlscy5hcnJheUZyb21PYmplY3QoZGF0YSwgZGVmaW5pdGlvbnMpO1xuICAgIHRoaXMuX2hlbHBlci5yZXNpemUodmFsdWVzLmxlbmd0aCk7XG4gICAgdGhpcy5faGVscGVyLmZvcm1BcnJheS5wYXRjaFZhbHVlKHZhbHVlcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gIH1cblxuICBnZXRWYWx1ZUFzSnNvbigpOiBQcm9wZXJ0eU1hcCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMudmFsdWU7XG4gICAgY29uc3QganNvbiA9IEFwcFByb3BlcnRpZXNVdGlscy5hcnJheUFzT2JqZWN0KGRhdGEsIHRoaXMuZGVmaW5pdGlvbnMsIHtcbiAgICAgIG9taXROaWxPckJsYW5rOiB0aGlzLm9wdGlvbnM/LmFsbG93RHVwbGljYXRlZFZhbHVlcyAhPT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zb2xlLmRlYnVnKCdbYXBwLXByb3BlcnRpZXMtZm9ybV0gQ29udmVydGluZyBkYXRhIGFzIG9iamVjdCcsIGRhdGEsIGpzb24pO1xuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgc3VnZ2VzdERlZmluaXRpb24odmFsdWU6IGFueSwgZmlsdGVyPzogYW55KTogUHJvbWlzZTxMb2FkUmVzdWx0PFByb3BlcnR5Pj4ge1xuICAgIHZhbHVlID0gdmFsdWUgPz8gJyonO1xuXG4gICAgbGV0IGl0ZW1zID0gYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuX2RlZmluaXRpb25LZXlzJCwgeyBzdG9wOiB0aGlzLmRlc3Ryb3lTdWJqZWN0IH0pO1xuXG4gICAgLy8gR2V0IGFzIGtleVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBvYmogPSBpdGVtcy5maW5kKChvKSA9PiBvLmtleSA9PT0gdmFsdWUpO1xuICAgICAgaWYgKG9iaikgcmV0dXJuIHsgZGF0YTogW29ial0gfSBhcyBMb2FkUmVzdWx0PFByb3BlcnR5PjtcbiAgICB9XG5cbiAgICAvLyBHZXQgYXMgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFscmVhZHkgdXNlZCBrZXlzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYWxsb3dEdXBsaWNhdGVkVmFsdWVzICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0tleXMgPSAodGhpcy5mb3JtQXJyYXkudmFsdWUgfHwgW10pXG4gICAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAhPT0gdGhpcy5fZm9jdXNlZENvbnRyb2xJbmRleClcbiAgICAgICAgLm1hcChBcHBQcm9wZXJ0eVV0aWxzLmdldFByb3BlcnR5S2V5KTtcbiAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiAhZXhpc3RpbmdLZXlzLmluY2x1ZGVzKGl0ZW0ua2V5KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Z2dlc3RGcm9tQXJyYXkoaXRlbXMsIHZhbHVlLCB7IHNlYXJjaEF0dHJpYnV0ZTogJ3ZhbHVlJywgLi4uZmlsdGVyIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRW1wdHlQcm9wZXJ0eShvYmo6IFByb3BlcnR5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmlsKG9iaj8ua2V5KSB8fCBpc05pbChvYmoudmFsdWUpO1xuICB9XG59XG4iLCI8IS0tIFByb3BlcnRpZXMgLS0+XG48Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gIEBpZiAobG9hZGluZ1N1YmplY3QgfCBhc3luYykge1xuICAgIDxpb24tbGlzdCBbaW5zZXRdPVwibW9iaWxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlSb3dTa2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5Um93U2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eVJvd1NrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9pb24tbGlzdD5cbiAgfSBAZWxzZSB7XG4gICAgPGlvbi1saXN0IGZvcm1BcnJheU5hbWU9XCJwcm9wZXJ0aWVzXCIgW2luc2V0XT1cIm1vYmlsZVwiPlxuICAgICAgPCEtLSBTaG93IG1vcmUgb3B0aW9ucyAtLT5cbiAgICAgIEBpZiAoKF9kZWZpbml0aW9uS2V5cyQgfCBhc3luYyB8IGlzTm90RW1wdHlBcnJheSkgJiYgZm9ybUFycmF5Py5sZW5ndGggPT09IDApIHtcbiAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIiBbdGl0bGVdPVwiYWRkQnV0dG9uVGl0bGUgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiX2hlbHBlci5hZGQoKVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD57eyBhZGRCdXR0b25UZXh0IHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8bWF0LWljb24gc2xvdD1cImVuZFwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgfVxuXG4gICAgICBAZm9yIChmaWVsZEZvcm0gb2YgZmllbGRGb3JtczsgdHJhY2sgaTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiIFtjbGFzcy5vdXRsaW5lXT1cImFwcGVhcmFuY2UgPT09ICdvdXRsaW5lJ1wiPlxuICAgICAgICAgIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICA8aW9uLXJvdyBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICBAbGV0IGRlZmluaXRpb24gPSBnZXREZWZpbml0aW9uQXQoaSk7XG4gICAgICAgICAgICAgIDwhLS0gcHJvcGVydHkga2V5IC0tPlxuICAgICAgICAgICAgICBAaWYgKGZpZWxkRm9ybSB8IGZvcm1HZXRDb250cm9sOiAna2V5JzsgYXMgY29udHJvbCkge1xuICAgICAgICAgICAgICAgIDxpb24tY29sXG4gICAgICAgICAgICAgICAgICBzaXplPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgc2l6ZS1zbT1cIjZcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihkZWZpbml0aW9uIHwgcHJvcGVydHlHZXQ6ICdsYWJlbCcgfCB0cmFuc2xhdGUpIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCJzaG93SGludEtleSA/ICdmaXhlZCcgOiBzdWJzY3JpcHRTaXppbmdcIlxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInVwZGF0ZURlZmluaXRpb25BdChpKVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleCArIGkgKiAyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJfYXV0b2NvbXBsZXRlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTRVRUSU5HUy5QUk9QRVJUWV9LRVknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiX2ZvY3VzZWRDb250cm9sSW5kZXggPSBpXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImRlZmluaXRpb24/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50IFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFzaG93SGludEtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBsZXQga2V5VmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIHt7IGhpbnRLZXlQcmVmaXggfHwgJycgfX17eyBrZXlWYWx1ZT8ua2V5IHx8IGtleVZhbHVlIHx8ICcnIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGUtZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgPCEtLSBwcm9wZXJ0eSB2YWx1ZSAtLT5cbiAgICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIlwiIHNpemUtc209XCJcIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGlvbi1wYWRkaW5nLXN0YXJ0LXhzXCI+XG4gICAgICAgICAgICAgICAgQGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICA8YXBwLWZvcm0tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibW9iaWxlID8gKCdTRVRUSU5HUy5QUk9QRVJUWV9WQUxVRScgfCB0cmFuc2xhdGUpIDogJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiZGVmaW5pdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmaWVsZEZvcm0gfCBmb3JtR2V0Q29udHJvbDogJ3ZhbHVlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU0VUVElOR1MuUFJPUEVSVFlfVkFMVUUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NoaXBDb2xvcl09XCJjaGlwQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleCArIGkgKiAyICsgMVwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJkZWZpbml0aW9uPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICA+PC9hcHAtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDwhLS0gdW5rbm93biBkZWZpbml0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIiBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ1NFVFRJTkdTLlBST1BFUlRZX1ZBTFVFJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmaWVsZEZvcm0gfCBmb3JtR2V0Q29udHJvbDogJ3ZhbHVlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1vYmlsZSA/ICcnIDogKCdTRVRUSU5HUy5QUk9QRVJUWV9WQUxVRScgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjIwICsgaSAqIDIgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgQGlmIChfaGVscGVyLmlzTGFzdChpKSkge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgfHwgKGZpZWxkRm9ybS52YWx1ZSB8IGFzQm9vbGVhbjogaXNFbXB0eVByb3BlcnR5KSB8fCAoX2RlZmluaXRpb25LZXlzIHwgaXNFbXB0eUFycmF5KVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1NFVFRJTkdTLkJUTl9BRERfUFJPUEVSVFknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9oZWxwZXIuYWRkKClcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiMjAgKyBpICogMiArIDJcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGVmaW5pdGlvbj8uZGlzYWJsZWQgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUF0KGkpXCJcbiAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgIDwvaW9uLWdyaWQ+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICB9XG4gICAgPC9pb24tbGlzdD5cbiAgfVxuPC9mb3JtPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5Um93U2tlbGV0b24+XG4gIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIj5cbiAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICA8IS0tIHByb3BlcnR5IGtleSAtLT5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjZcIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCI+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIGRpc2FibGVkIC8+XG4gICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQgc3R5bGU9XCJ3aWR0aDogNjAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYXJyb3ctZHJvcGRvd25cIiBtYXRTdWZmaXg+PC9pb24taWNvbj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwhLS0gdmFsdWUgLS0+XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gZGlzYWJsZWQgLz5cbiAgICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBhbmltYXRlZCBzdHlsZT1cIndpZHRoOiA2MCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPCEtLSBidXR0b25zIC0tPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgPC9pb24tZ3JpZD5cbiAgPC9pb24taXRlbT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0aWVzLmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBWSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5KLE9BQU8sRUFBK0Msd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6SCxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUcxRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQTBCLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWN0RCxNQUFNLE9BQU8saUJBQ1gsU0FBUSxPQUFZO0lBdUVS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QyxXQUFXO3NCQUFsRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUM3QixhQUFhO3NCQUFyQixLQUFLO2dCQUNrQyxjQUFjO3NCQUFyRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUM3QixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ2tDLGFBQWE7c0JBQXBELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTXpCLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFPTyxXQUFXO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYm9vbGVhbkF0dHJpYnV0ZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXBEaXJlY3RpdmUsIFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1GaWVsZERlZmluaXRpb24sIEZvcm1GaWVsZERlZmluaXRpb25NYXAsIEZvcm1GaWVsZERlZmluaXRpb25VdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90TmlsIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciwgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgQXBwRm9ybSB9IGZyb20gJy4uL2Zvcm0uY2xhc3MnO1xuaW1wb3J0IHsgUHJvcGVydHksIFByb3BlcnR5TWFwIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7IFByb3BlcnR5VmFsaWRhdG9yIH0gZnJvbSAnLi9wcm9wZXJ0eS52YWxpZGF0b3InO1xuaW1wb3J0IHsgUHJlZGVmaW5lZENvbG9ycyB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheUhlbHBlciwgRm9ybUFycmF5SGVscGVyT3B0aW9ucyB9IGZyb20gJy4uL2FycmF5L2Zvcm0tYXJyYXknO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcGxhdGZvcm1zJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIFN1YnNjcmlwdFNpemluZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWcgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5jb25maWcnO1xuaW1wb3J0IHsgc3VnZ2VzdEZyb21BcnJheSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBMb2FkUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IEFwcFByb3BlcnRpZXNVdGlscywgQXBwUHJvcGVydHlVdGlscyB9IGZyb20gJy4vcHJvcGVydGllcy51dGlscyc7XG5pbXBvcnQgeyBSeFN0YXRlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgZmlyc3ROb3ROaWxQcm9taXNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7IFNvcnREaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IFJlZ0V4cFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3JlZ2V4cHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcFByb3BlcnRpZXNGb3JtU3RhdGUge1xuICBkZWZpbml0aW9uczogRm9ybUZpZWxkRGVmaW5pdGlvbltdO1xuICBkZWZpbml0aW9uS2V5czogUHJvcGVydHlbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb3BlcnRpZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAncHJvcGVydGllcy5mb3JtLmh0bWwnLFxuICBzdHlsZVVybHM6IFsncHJvcGVydGllcy5mb3JtLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBQcm9wZXJ0eVZhbGlkYXRvciwgdXNlQ2xhc3M6IFByb3BlcnR5VmFsaWRhdG9yIH0sIFJ4U3RhdGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwUHJvcGVydGllc0Zvcm08TyA9IGFueSwgVCBleHRlbmRzIFByb3BlcnR5PE8+ID0gUHJvcGVydHk8Tz4sIFMgZXh0ZW5kcyBBcHBQcm9wZXJ0aWVzRm9ybVN0YXRlID0gQXBwUHJvcGVydGllc0Zvcm1TdGF0ZT5cbiAgZXh0ZW5kcyBBcHBGb3JtPFRbXT5cbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0ZTogUnhTdGF0ZTxTPiA9IGluamVjdChSeFN0YXRlKTtcblxuICBwcm90ZWN0ZWQgX2RlZmluaXRpb25zJCA9IHRoaXMuX3N0YXRlLnNlbGVjdCgnZGVmaW5pdGlvbnMnKTtcbiAgcHJvdGVjdGVkIF9kZWZpbml0aW9uS2V5cyQgPSB0aGlzLl9zdGF0ZS5zZWxlY3QoJ2RlZmluaXRpb25LZXlzJyk7XG5cbiAgcHJvdGVjdGVkIHNldCBfZGVmaW5pdGlvbktleXModmFsdWU6IFByb3BlcnR5W10pIHtcbiAgICB0aGlzLl9zdGF0ZS5zZXQoJ2RlZmluaXRpb25LZXlzJywgKCkgPT4gdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgX2RlZmluaXRpb25LZXlzKCk6IFByb3BlcnR5W10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZS5nZXQoJ2RlZmluaXRpb25LZXlzJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2RlZmluaXRpb25CeUtleTogRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCA9IHt9O1xuICBwcm90ZWN0ZWQgX2RlZmluaXRpb25zQnlJbmRleDogeyBbaW5kZXg6IG51bWJlcl06IEZvcm1GaWVsZERlZmluaXRpb24gfSA9IHt9O1xuICBwcm90ZWN0ZWQgX2hlbHBlcjogRm9ybUFycmF5SGVscGVyPFByb3BlcnR5PjtcblxuICBwcm90ZWN0ZWQgX2F1dG9jb21wbGV0ZUNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIHByb3RlY3RlZCBfZm9jdXNlZENvbnRyb2xJbmRleDogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIGZvcm1BcnJheU5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybUFycmF5OiBVbnR5cGVkRm9ybUFycmF5O1xuICBASW5wdXQoKSBvcHRpb25zOiBGb3JtQXJyYXlIZWxwZXJPcHRpb25zO1xuICBASW5wdXQoKSBjaGlwQ29sb3I6IFRoZW1lUGFsZXR0ZSB8IFByZWRlZmluZWRDb2xvcnMgPSAnYWNjZW50JztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgQElucHV0KCkgc3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93SGludEtleSA9IGZhbHNlO1xuICBASW5wdXQoKSBoaW50S2V5UHJlZml4ID0gJyc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TW9yZUJ1dHRvbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvblRleHQgPSAnQ09NTU9OLkJUTl9BREQnO1xuICBASW5wdXQoKSBhZGRCdXR0b25UaXRsZSA9ICcnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkZEJ1dHRvbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBhZGRCdXR0b25UaXRsZSBpbnN0ZWFkXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNob3dNb3JlQnV0dG9uVGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuYWRkQnV0dG9uVGl0bGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc2hvd01vcmVCdXR0b25UaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFkZEJ1dHRvblRpdGxlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRlZmluaXRpb25zKHZhbHVlOiBGb3JtRmllbGREZWZpbml0aW9uW10pIHtcbiAgICB0aGlzLl9zdGF0ZS5zZXQoJ2RlZmluaXRpb25zJywgKCkgPT4gdmFsdWUpO1xuICB9XG4gIGdldCBkZWZpbml0aW9ucygpOiBGb3JtRmllbGREZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZS5nZXQoJ2RlZmluaXRpb25zJyk7XG4gIH1cblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1BcnJheS52YWx1ZSBhcyBUW107XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5Py5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIGdldCBmaWVsZEZvcm1zKCk6IFVudHlwZWRGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5LmNvbnRyb2xzIGFzIFVudHlwZWRGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxNb21lbnQ+LFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRvcjogUHJvcGVydHlWYWxpZGF0b3IsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZVxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgbnVsbCk7XG5cbiAgICB0aGlzLnRhYmluZGV4ID0gMjA7IC8vIEZvciBjb21wYXRpYmlsaXR5IC0gVE9ETyByZW1vdmUgbGF0ZXJcbiAgICAvL3RoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFsbG93RW1wdHlBcnJheSA9PT0gZmFsc2UgJiYgaXNFbXB0eUFycmF5KHRoaXMuZGVmaW5pdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG9yIGludmFsaWQgYXR0cmlidXRlICdkZWZpbml0aW9ucydcIik7XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgdGhlIGZvcm1cbiAgICBjb25zdCBmb3JtID1cbiAgICAgICh0aGlzLmZvcm1BcnJheSAmJiAodGhpcy5mb3JtQXJyYXkucGFyZW50IGFzIFVudHlwZWRGb3JtR3JvdXApKSB8fCAodGhpcy5mb3JtR3JvdXBEaXIgJiYgdGhpcy5mb3JtR3JvdXBEaXIuZm9ybSkgfHwgdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7fSk7XG4gICAgdGhpcy5zZXRGb3JtKGZvcm0pO1xuXG4gICAgdGhpcy5mb3JtQXJyYXkgPSB0aGlzLmZvcm1BcnJheSB8fCAodGhpcy5mb3JtQXJyYXlOYW1lICYmIChmb3JtLmdldCh0aGlzLmZvcm1BcnJheU5hbWUpIGFzIFVudHlwZWRGb3JtQXJyYXkpKTtcbiAgICB0aGlzLmZvcm1BcnJheU5hbWUgPVxuICAgICAgdGhpcy5mb3JtQXJyYXlOYW1lIHx8ICh0aGlzLmZvcm1BcnJheSAmJiBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5maW5kKChrZXkpID0+IGZvcm0uZ2V0KGtleSkgPT09IHRoaXMuZm9ybUFycmF5KSkgfHwgJ3Byb3BlcnRpZXMnO1xuICAgIGlmICghdGhpcy5mb3JtQXJyYXkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWlzc2luZyBhcnJheSBjb250cm9sICcke3RoaXMuZm9ybUFycmF5TmFtZX0nLiBXaWxsIGNyZWF0ZSBpdCFgKTtcbiAgICAgIHRoaXMuZm9ybUFycmF5ID0gdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXSk7XG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCh0aGlzLmZvcm1BcnJheU5hbWUsIHRoaXMuZm9ybUFycmF5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9oZWxwZXIgPSBuZXcgRm9ybUFycmF5SGVscGVyPFByb3BlcnR5PihcbiAgICAgIHRoaXMuZm9ybUFycmF5LFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLnZhbGlkYXRvci5nZXRGb3JtR3JvdXAodmFsdWUpLFxuICAgICAgKHYxLCB2MikgPT4gKCF2MSAmJiAhdjIpIHx8IHYxLmtleSA9PT0gdjIua2V5LFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLmlzRW1wdHlQcm9wZXJ0eSh2YWx1ZSksXG4gICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIERlZmF1bHQgdmFsdWVzXG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLm1vYmlsZSA/PyBpc01vYmlsZSh3aW5kb3cpO1xuXG4gICAgLy8gQ29tYm8ga2V5XG4gICAgdGhpcy5fYXV0b2NvbXBsZXRlQ29uZmlnID0ge1xuICAgICAgc3VnZ2VzdEZuOiAodmFsdWUsIGZpbHRlciwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uLCBvcHRzKSA9PiB0aGlzLnN1Z2dlc3REZWZpbml0aW9uS2V5cyh2YWx1ZSwgZmlsdGVyLCAndmFsdWUnLCBzb3J0RGlyZWN0aW9uLCBvcHRzKSxcbiAgICAgIGVxdWFsczogKHYxLCB2MikgPT4gKHYxPy5rZXkgfHwgdjEpID09PSAodjI/LmtleSB8fCB2MiksXG4gICAgICBkaXNwbGF5V2l0aDogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdbYXBwLXByb3BlcnRpZXMtZm9ybV0gRGlzcGxheWluZyB2YWx1ZScsIHZhbHVlKTtcblxuICAgICAgICAvLyBWYWx1ZSBpcyBhbiBvYmplY3QgKGEgUHJvcGVydHkpXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBQcm9wZXJ0eSkudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWx1ZSBpcyBhIGtleVxuICAgICAgICBjb25zdCBkZWYgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHRoaXMuX2RlZmluaXRpb25CeUtleVt2YWx1ZV07XG4gICAgICAgIGlmICghZGVmKSByZXR1cm4gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGRlZi5sYWJlbCk7XG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczogWyd2YWx1ZSddLFxuICAgICAgY29sdW1uTmFtZXM6IFt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdTRVRUSU5HUy5QUk9QRVJUWV9LRVknKV0sXG4gICAgICBzcGxpdFNlYXJjaFRleHQ6IGZhbHNlLFxuICAgICAgc2hvd0FsbE9uRm9jdXM6IHRydWUsXG4gICAgICBzZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzOiAhdGhpcy5tb2JpbGUsXG4gICAgfTtcblxuICAgIHRoaXMuX3N0YXRlLmhvbGQodGhpcy5fc3RhdGUuc2VsZWN0KCdkZWZpbml0aW9ucycpLCAoZGVmaW5pdGlvbnMpID0+IHtcbiAgICAgIGlmICh0aGlzLmxvYWRlZCkgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbnMoZGVmaW5pdGlvbnMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbnModGhpcy5kZWZpbml0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0RlZmluaXRpb25zKGRlZmluaXRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uW10pIHtcbiAgICBpZiAoIWRlZmluaXRpb25zKSByZXR1cm4gW107XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZygnW2FwcC1wcm9wZXJ0aWVzLWZvcm1dIFByb2Nlc3NpbmcgZGVmaW5pdGlvbnMuLi4nLCBkZWZpbml0aW9ucyk7XG5cbiAgICAvLyBQcmVwYXJlIGRlZmluaXRpb24gKGUuZy4gcmVzb2x2ZSB0b2tlbnMgaWYgYW55KVxuICAgIGRlZmluaXRpb25zID0gRm9ybUZpZWxkRGVmaW5pdGlvblV0aWxzLnByZXBhcmVEZWZpbml0aW9ucyh0aGlzLmluamVjdG9yLCBkZWZpbml0aW9ucyB8fCBbXSk7XG5cbiAgICAvLyBGaWxsIG9wdGlvbnMgbWFwXG4gICAgY29uc3QgZGVmaW5pdGlvbnNCeUtleSA9IDxGb3JtRmllbGREZWZpbml0aW9uTWFwPnt9O1xuICAgIHRoaXMuX2RlZmluaXRpb25LZXlzID0gZGVmaW5pdGlvbnNcbiAgICAgIC5tYXAoKGRlZikgPT4ge1xuICAgICAgICBkZWZpbml0aW9uc0J5S2V5W2RlZi5rZXldID0gZGVmO1xuICAgICAgICBpZiAoZGVmLmRpc2FibGVkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHsga2V5OiBkZWYua2V5LCB2YWx1ZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChkZWYubGFiZWwpIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihpc05vdE5pbCk7XG4gICAgdGhpcy5fZGVmaW5pdGlvbkJ5S2V5ID0gZGVmaW5pdGlvbnNCeUtleTtcbiAgfVxuXG4gIGdldERlZmluaXRpb25BdChpbmRleDogbnVtYmVyKTogRm9ybUZpZWxkRGVmaW5pdGlvbiB7XG4gICAgbGV0IGRlZmluaXRpb24gPSB0aGlzLl9kZWZpbml0aW9uc0J5SW5kZXhbaW5kZXhdO1xuICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgZGVmaW5pdGlvbiA9IHRoaXMudXBkYXRlRGVmaW5pdGlvbkF0KGluZGV4LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgdXBkYXRlRGVmaW5pdGlvbkF0KGluZGV4OiBudW1iZXIsIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IEZvcm1GaWVsZERlZmluaXRpb24ge1xuICAgIGxldCB2YWx1ZSA9ICh0aGlzLmZvcm1BcnJheS5hdChpbmRleCkgYXMgVW50eXBlZEZvcm1Hcm91cCkuY29udHJvbHMua2V5LnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IHZhbHVlPy5rZXkgfHwgdmFsdWU7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IChrZXkgJiYgdGhpcy5fZGVmaW5pdGlvbkJ5S2V5W2tleV0pIHx8IG51bGw7XG4gICAgdGhpcy5fZGVmaW5pdGlvbnNCeUluZGV4W2luZGV4XSA9IGRlZmluaXRpb247IC8vIHVwZGF0ZSBtYXAgYnkgaW5kZXhcbiAgICBpZiAob3B0cz8uZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICByZW1vdmVBdChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5faGVscGVyLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLl9kZWZpbml0aW9uc0J5SW5kZXggPSB7fTsgLy8gY2xlYXIgbWFwIGJ5IGluZGV4XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFzeW5jIHNldFZhbHVlKGRhdGE6IFByb3BlcnR5TWFwIHwgVFtdKSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnN0IFtkZWZpbml0aW9ucywgZGVmaW5pdGlvbktleXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuX2RlZmluaXRpb25zJCwgeyBzdG9wOiB0aGlzLmRlc3Ryb3lTdWJqZWN0IH0pLFxuICAgICAgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuX2RlZmluaXRpb25LZXlzJCwgeyBzdG9wOiB0aGlzLmRlc3Ryb3lTdWJqZWN0IH0pLFxuICAgIF0pO1xuXG4gICAgLy8gVHJhbnNmb3JtIHByb3BlcnRpZXMgbWFwIGludG8gYXJyYXlcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBBcHBQcm9wZXJ0aWVzVXRpbHMuYXJyYXlGcm9tT2JqZWN0KGRhdGEsIGRlZmluaXRpb25zKTtcblxuICAgIC8vIFdvcmthcm91bmQgYmVjYXVzZSB3aGVuIGF1dG9jb21wbGV0ZSB1c2UgbWF0LXNlbGVjdCAod2hlbiBtb2JpbGUpLCBpdCBuZWVkcyB0byBkaXNwbGF5IHRoZSB2YWx1ZSAtIGZpeCBpc3N1ZSBuZ3gtc3VtYXJpcy1jb21wb25lbnRzIzE2XG4gICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgcHJvcGVydHkua2V5ID0gKGRlZmluaXRpb25LZXlzLmZpbmQoKGRlZktleSkgPT4gZGVmS2V5LmtleSA9PT0gcHJvcGVydHkua2V5KSB8fCA8UHJvcGVydHk+eyBrZXk6IHByb3BlcnR5LmtleSwgdmFsdWU6IHByb3BlcnR5LmtleSB9KSBhcyBhbnk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9oZWxwZXIucmVzaXplKHZhbHVlcy5sZW5ndGgpO1xuICAgIHRoaXMuX2hlbHBlci5mb3JtQXJyYXkucGF0Y2hWYWx1ZSh2YWx1ZXMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICB9XG5cbiAgZ2V0VmFsdWVBc0pzb24oKTogUHJvcGVydHlNYXAge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnZhbHVlO1xuICAgIGNvbnN0IGpzb24gPSBBcHBQcm9wZXJ0aWVzVXRpbHMuYXJyYXlBc09iamVjdChkYXRhLCB0aGlzLmRlZmluaXRpb25zLCB7XG4gICAgICBvbWl0TmlsT3JCbGFuazogdGhpcy5vcHRpb25zPy5hbGxvd0R1cGxpY2F0ZWRWYWx1ZXMgIT09IHRydWUsXG4gICAgfSk7XG4gICAgY29uc29sZS5kZWJ1ZygnW2FwcC1wcm9wZXJ0aWVzLWZvcm1dIENvbnZlcnRpbmcgZGF0YSBhcyBvYmplY3QnLCBkYXRhLCBqc29uKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGFzeW5jIHN1Z2dlc3REZWZpbml0aW9uS2V5cyhcbiAgICB2YWx1ZTogYW55LFxuICAgIGZpbHRlcj86IGFueSxcbiAgICBzb3J0Qnk/OiBzdHJpbmcgfCBrZXlvZiBQcm9wZXJ0eSxcbiAgICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbixcbiAgICBvcHRzPzoge1xuICAgICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgICAgc2l6ZT86IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9XG4gICk6IFByb21pc2U8TG9hZFJlc3VsdDxQcm9wZXJ0eT4+IHtcbiAgICBsZXQgaXRlbXMgPSBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fZGVmaW5pdGlvbktleXMkLCB7IHN0b3A6IHRoaXMuZGVzdHJveVN1YmplY3QgfSk7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZygnW2FwcC1wcm9wZXJ0aWVzLWZvcm1dIFN1Z2dlc3RpbmcgZGVmaW5pdGlvbiBrZXlzJywgdmFsdWUsIGl0ZW1zKTtcblxuICAgIC8vIEdldCBhcyBrZXlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhUmVnRXhwVXRpbHMuaGFzV2lsZGNhcmRDaGFyYWN0ZXIodmFsdWUpKSB7XG4gICAgICBjb25zdCBvYmogPSBpdGVtcy5maW5kKChvKSA9PiBvLmtleSA9PT0gdmFsdWUpO1xuICAgICAgaWYgKG9iaikgcmV0dXJuIHsgZGF0YTogW29ial0gfSBhcyBMb2FkUmVzdWx0PFByb3BlcnR5PjtcbiAgICB9XG5cbiAgICAvLyBHZXQgYXMgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IFt2YWx1ZV0gfSBhcyBMb2FkUmVzdWx0PFByb3BlcnR5PjtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYWxyZWFkeSB1c2VkIGtleXNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hbGxvd0R1cGxpY2F0ZWRWYWx1ZXMgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9ICh0aGlzLmZvcm1BcnJheS52YWx1ZSB8fCBbXSlcbiAgICAgICAgLmZpbHRlcigoXywgaW5kZXgpID0+IGluZGV4ICE9PSB0aGlzLl9mb2N1c2VkQ29udHJvbEluZGV4KVxuICAgICAgICAubWFwKEFwcFByb3BlcnR5VXRpbHMuZ2V0UHJvcGVydHlLZXkpO1xuICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+ICFleGlzdGluZ0tleXMuaW5jbHVkZXMoaXRlbS5rZXkpKTtcbiAgICB9XG5cbiAgICB2YWx1ZSA9IHZhbHVlID8/ICcqJztcblxuICAgIC8vIEFueSBtYXRjaFxuICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aCgnKicpKSB2YWx1ZSA9ICcqJyArIHZhbHVlO1xuXG4gICAgcmV0dXJuIHN1Z2dlc3RGcm9tQXJyYXkoaXRlbXMsIHZhbHVlLCBmaWx0ZXIsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNFbXB0eVByb3BlcnR5KG9iajogUHJvcGVydHkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOaWwob2JqPy5rZXkpIHx8IGlzTmlsKG9iai52YWx1ZSk7XG4gIH1cbn1cbiIsIjwhLS0gUHJvcGVydGllcyAtLT5cbjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIj5cbiAgQGlmIChsb2FkaW5nU3ViamVjdCB8IGFzeW5jKSB7XG4gICAgPGlvbi1saXN0IFtpbnNldF09XCJtb2JpbGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eVJvd1NrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlSb3dTa2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5Um93U2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2lvbi1saXN0PlxuICB9IEBlbHNlIHtcbiAgICA8aW9uLWxpc3QgZm9ybUFycmF5TmFtZT1cInByb3BlcnRpZXNcIiBbaW5zZXRdPVwibW9iaWxlXCI+XG4gICAgICA8IS0tIFNob3cgbW9yZSBvcHRpb25zIC0tPlxuICAgICAgQGlmICgoX2RlZmluaXRpb25LZXlzJCB8IGFzeW5jIHwgaXNOb3RFbXB0eUFycmF5KSAmJiBmb3JtQXJyYXk/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJsaWdodFwiIFt0aXRsZV09XCJhZGRCdXR0b25UaXRsZSB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJfaGVscGVyLmFkZCgpXCI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPnt7IGFkZEJ1dHRvblRleHQgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwiZW5kXCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICB9XG5cbiAgICAgIEBmb3IgKGZpZWxkRm9ybSBvZiBmaWVsZEZvcm1zOyB0cmFjayBpOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCIgW2NsYXNzLm91dGxpbmVdPVwiYXBwZWFyYW5jZSA9PT0gJ291dGxpbmUnXCI+XG4gICAgICAgICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgIDxpb24tcm93IFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgIEBsZXQgZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb25BdChpKTtcbiAgICAgICAgICAgICAgPCEtLSBwcm9wZXJ0eSBrZXkgLS0+XG4gICAgICAgICAgICAgIEBpZiAoZmllbGRGb3JtIHwgZm9ybUdldENvbnRyb2w6ICdrZXknOyBhcyBjb250cm9sKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1jb2xcbiAgICAgICAgICAgICAgICAgIHNpemU9XCIxMlwiXG4gICAgICAgICAgICAgICAgICBzaXplLXNtPVwiNlwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGRlZmluaXRpb24gfCBwcm9wZXJ0eUdldDogJ2xhYmVsJyB8IHRyYW5zbGF0ZSkgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUtZmllbGRcbiAgICAgICAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICAgICAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInNob3dIaW50S2V5ID8gJ2ZpeGVkJyA6IHN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwidXBkYXRlRGVmaW5pdGlvbkF0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4ICsgaSAqIDJcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cIl9hdXRvY29tcGxldGVDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NFVFRJTkdTLlBST1BFUlRZX0tFWScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJfZm9jdXNlZENvbnRyb2xJbmRleCA9IGlcIlxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGVmaW5pdGlvbj8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbW9iaWxlXT1cIm1vYmlsZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGludCBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhc2hvd0hpbnRLZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAbGV0IGtleVZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB7eyBoaW50S2V5UHJlZml4IHx8ICcnIH19e3sga2V5VmFsdWU/LmtleSB8fCBrZXlWYWx1ZSB8fCAnJyB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDwhLS0gcHJvcGVydHkgdmFsdWUgLS0+XG4gICAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCJcIiBzaXplLXNtPVwiXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tcGFkZGluZy1zdGFydC14c1wiPlxuICAgICAgICAgICAgICAgIEBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgPGFwcC1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vYmlsZSA/ICgnU0VUVElOR1MuUFJPUEVSVFlfVkFMVUUnIHwgdHJhbnNsYXRlKSA6ICcgJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICAgICAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImRlZmluaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZmllbGRGb3JtIHwgZm9ybUdldENvbnRyb2w6ICd2YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NFVFRJTkdTLlBST1BFUlRZX1ZBTFVFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGlwQ29sb3JdPVwiY2hpcENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbaGlkZVJlcXVpcmVkTWFya2VyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXggKyBpICogMiArIDFcIlxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGVmaW5pdGlvbj8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgPjwvYXBwLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8IS0tIHVua25vd24gZGVmaW5pdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCIgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdTRVRUSU5HUy5QUk9QRVJUWV9WQUxVRScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZmllbGRGb3JtIHwgZm9ybUdldENvbnRyb2w6ICd2YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtb2JpbGUgPyAnJyA6ICgnU0VUVElOR1MuUFJPUEVSVFlfVkFMVUUnIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIyMCArIGkgKiAyICsgMVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIEBpZiAoX2hlbHBlci5pc0xhc3QoaSkpIHtcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIHx8IChmaWVsZEZvcm0udmFsdWUgfCBhc0Jvb2xlYW46IGlzRW1wdHlQcm9wZXJ0eSkgfHwgKF9kZWZpbml0aW9uS2V5cyB8IGlzRW1wdHlBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTRVRUSU5HUy5CVE5fQUREX1BST1BFUlRZJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfaGVscGVyLmFkZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjIwICsgaSAqIDIgKyAyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRlZmluaXRpb24/LmRpc2FibGVkIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVBdChpKVwiXG4gICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICA8L2lvbi1ncmlkPlxuICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgfVxuICAgIDwvaW9uLWxpc3Q+XG4gIH1cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eVJvd1NrZWxldG9uPlxuICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCI+XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgPCEtLSBwcm9wZXJ0eSBrZXkgLS0+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI2XCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiBkaXNhYmxlZCAvPlxuICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkIHN0eWxlPVwid2lkdGg6IDYwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LWRyb3Bkb3duXCIgbWF0U3VmZml4PjwvaW9uLWljb24+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8IS0tIHZhbHVlIC0tPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCI+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIGRpc2FibGVkIC8+XG4gICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQgc3R5bGU9XCJ3aWR0aDogNjAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwhLS0gYnV0dG9ucyAtLT5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJsaWdodFwiIGRpc2FibGVkPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG4gIDwvaW9uLWl0ZW0+XG48L25nLXRlbXBsYXRlPlxuIl19