reset-password.component.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from '@angular/core';
  6. import { Router } from '@angular/router';
  7. import { NB_AUTH_OPTIONS, NbAuthService } from '@nebular/auth';
  8. import { getDeepFromObject } from '@nebular/auth/helpers';
  9. import { LoginLangService } from '../login-lang.service';
  10. var ResetPasswordComponent = /** @class */ (function () {
  11. function ResetPasswordComponent(service, langService, options, cd, router) {
  12. if (options === void 0) { options = {}; }
  13. this.service = service;
  14. this.langService = langService;
  15. this.options = options;
  16. this.cd = cd;
  17. this.router = router;
  18. this.redirectDelay = 0;
  19. this.showMessages = {};
  20. this.strategy = '';
  21. this.submitted = false;
  22. this.errors = [];
  23. this.messages = [];
  24. this.user = {};
  25. this.redirectDelay = this.getConfigValue('forms.resetPassword.redirectDelay');
  26. this.showMessages = this.getConfigValue('forms.resetPassword.showMessages');
  27. this.strategy = this.getConfigValue('forms.resetPassword.strategy');
  28. }
  29. /**
  30. * @return {?}
  31. */
  32. ResetPasswordComponent.prototype.resetPass = /**
  33. * @return {?}
  34. */
  35. function () {
  36. var _this = this;
  37. this.errors = this.messages = [];
  38. this.submitted = true;
  39. this.service.resetPassword(this.strategy, this.user).subscribe(function (result) {
  40. _this.submitted = false;
  41. if (result.isSuccess()) {
  42. _this.messages = result.getMessages();
  43. }
  44. else {
  45. _this.errors = result.getErrors();
  46. }
  47. /** @type {?} */
  48. var redirect = result.getRedirect();
  49. if (redirect) {
  50. setTimeout(function () {
  51. return _this.router.navigateByUrl(redirect);
  52. }, _this.redirectDelay);
  53. }
  54. _this.cd.detectChanges();
  55. });
  56. };
  57. /**
  58. * @param {?} key
  59. * @return {?}
  60. */
  61. ResetPasswordComponent.prototype.getConfigValue = /**
  62. * @param {?} key
  63. * @return {?}
  64. */
  65. function (key) {
  66. return getDeepFromObject(this.options, key, null);
  67. };
  68. ResetPasswordComponent.decorators = [
  69. { type: Component, args: [{
  70. selector: 'auth-reset-password-page',
  71. template: "<h1 id=\"title\" class=\"title\" translate>\u4FEE\u6539\u5BC6\u7801</h1>\r\n<p class=\"sub-title\" translate>\u8BF7\u8BBE\u7F6E\u60A8\u7684\u65B0\u5BC6\u7801</p>\r\n\r\n<nb-alert *ngIf=\"showMessages.error && errors?.length && !submitted\" outline=\"danger\" role=\"alert\">\r\n <p class=\"alert-title\"><b translate>\u9519\u8BEF!</b></p>\r\n <ul class=\"alert-message-list\">\r\n <li *ngFor=\"let error of errors\" class=\"alert-message\">{{ error }}</li>\r\n </ul>\r\n</nb-alert>\r\n\r\n<nb-alert *ngIf=\"showMessages.success && messages?.length && !submitted\" outline=\"success\" role=\"alert\">\r\n <p class=\"alert-title\"><b translate>\u6210\u529F!</b></p>\r\n <ul class=\"alert-message-list\">\r\n <li *ngFor=\"let message of messages\" class=\"alert-message\">{{ message }}</li>\r\n </ul>\r\n</nb-alert>\r\n\r\n<form (ngSubmit)=\"resetPass()\" #resetPassForm=\"ngForm\" aria-labelledby=\"title\">\r\n\r\n <div class=\"form-control-group\">\r\n <label class=\"label\" for=\"input-old-password\" translate>\u65E7\u5BC6\u7801:</label>\r\n <input nbInput\r\n [(ngModel)]=\"user.loginPasswordOld\"\r\n #oldPassword=\"ngModel\"\r\n type=\"password\"\r\n id=\"input-old-password\"\r\n name=\"oldPassword\"\r\n class=\"first\"\r\n placeholder=\"{{'\u65B0\u5BC6\u7801'| translate}}\"\r\n autofocus\r\n fullWidth\r\n [status]=\"oldPassword.dirty ? (oldPassword.invalid ? 'danger' : 'success') : ''\"\r\n [required]=\"getConfigValue('forms.validation.password.required')\"\r\n [minlength]=\"getConfigValue('forms.validation.password.minLength')\"\r\n [maxlength]=\"getConfigValue('forms.validation.password.maxLength')\"\r\n [attr.aria-invalid]=\"oldPassword.invalid && oldPassword.touched ? true : null\">\r\n <ng-container *ngIf=\"oldPassword.invalid && oldPassword.touched\">\r\n <p class=\"error-message\" *ngIf=\"oldPassword.errors?.required\" translate=\"\u65E7\u5BC6\u7801\u662F\u5FC5\u586B\u7684!\">\r\n\r\n </p>\r\n <p class=\"error-message\" *ngIf=\"oldPassword.errors?.minlength || oldPassword.errors?.maxlength\"\r\n translate=\"\u5BC6\u7801\u89C4\u5219\u63D0\u793A\" [translateParams]=\"{minLength: getConfigValue('forms.validation.password.minLength'), maxLength:getConfigValue('forms.validation.password.maxLength')}\">\r\n \u5BC6\u7801\u5E94\u8BE5\u5305\u542B\r\n \u6700\u5C0F\u957F\u5EA6 {{ getConfigValue('forms.validation.password.minLength') }}\r\n \u6700\u5927\u957F\u5EA6 {{ getConfigValue('forms.validation.password.maxLength') }}\r\n \u4E2A\u5B57\u7B26\r\n </p>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-control-group\">\r\n <label class=\"label\" for=\"input-new-password\" translate>\u65B0\u5BC6\u7801:</label>\r\n <input nbInput\r\n [(ngModel)]=\"user.loginPasswordNew\"\r\n #newPassword=\"ngModel\"\r\n type=\"password\"\r\n id=\"input-new-password\"\r\n name=\"newPassword\"\r\n class=\"first\"\r\n placeholder=\"{{'\u65B0\u5BC6\u7801'| translate}}\"\r\n autofocus\r\n fullWidth\r\n [status]=\"newPassword.dirty ? (newPassword.invalid ? 'danger' : 'success') : ''\"\r\n [required]=\"getConfigValue('forms.validation.password.required')\"\r\n [minlength]=\"getConfigValue('forms.validation.password.minLength')\"\r\n [maxlength]=\"getConfigValue('forms.validation.password.maxLength')\"\r\n [attr.aria-invalid]=\"newPassword.invalid && newPassword.touched ? true : null\">\r\n <ng-container *ngIf=\"newPassword.invalid && newPassword.touched\">\r\n <p class=\"error-message\" *ngIf=\"newPassword.errors?.required\" translate=\"\u65B0\u5BC6\u7801\u662F\u5FC5\u586B\u7684!\">\r\n\r\n </p>\r\n <p class=\"error-message\" *ngIf=\"newPassword.errors?.minlength || newPassword.errors?.maxlength\"\r\n translate=\"\u5BC6\u7801\u89C4\u5219\u63D0\u793A\"\r\n [translateParams]=\"{minLength: getConfigValue('forms.validation.password.minLength'), maxLength:getConfigValue('forms.validation.password.maxLength')}\">\r\n\r\n \u5BC6\u7801\u5E94\u8BE5\u5305\u542B\r\n \u6700\u5C0F\u957F\u5EA6 {{ getConfigValue('forms.validation.password.minLength') }}\r\n \u6700\u5927\u957F\u5EA6 {{ getConfigValue('forms.validation.password.maxLength') }}\r\n \u4E2A\u5B57\u7B26\r\n </p>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"label\" for=\"input-re-password\" translate>\u786E\u8BA4\u5BC6\u7801:</label>\r\n <input nbInput\r\n [(ngModel)]=\"user.confirmPassword\"\r\n #rePass=\"ngModel\"\r\n id=\"input-re-password\"\r\n name=\"rePass\"\r\n type=\"password\"\r\n class=\"last\"\r\n placeholder=\"{{'\u786E\u8BA4\u5BC6\u7801'| translate}}\"\r\n fullWidth\r\n [status]=\"rePass.touched\r\n ? (rePass.invalid || newPassword.value != rePass.value ? 'danger' : 'success')\r\n : ''\"\r\n [required]=\"getConfigValue('forms.validation.password.required')\"\r\n [attr.aria-invalid]=\"rePass.invalid && rePass.touched ? true : null\">\r\n <ng-container *ngIf=\"rePass.touched\">\r\n <p class=\"error-message\" *ngIf=\"rePass.invalid && rePass.errors?.required\" translate=\"\u786E\u8BA4\u5BC6\u7801\u662F\u5FC5\u586B\u7684!\">\r\n\r\n </p>\r\n <p class=\"error-message\" *ngIf=\"newPassword.value != rePass.value && !rePass.errors?.required\" translate=\"\u4E0E\u7B2C\u4E00\u6B21\u8F93\u5165\u4E0D\u7B26\u5408\"></p>\r\n </ng-container>\r\n </div>\r\n\r\n <button nbButton\r\n status=\"success\"\r\n fullWidth\r\n [disabled]=\"submitted || !resetPassForm.valid\"\r\n [class.btn-pulse]=\"submitted\" translate=\"\u4FEE\u6539\u5BC6\u7801\">\r\n </button>\r\n</form>\r\n\r\n<!--<section class=\"sign-in-or-up\" aria-label=\"Sign in or sign up\">-->\r\n <!--<p><a class=\"text-link\" routerLink=\"../login\">Back to Log In</a></p>-->\r\n <!--<p><a class=\"text-link\" routerLink=\"../register\">Register</a></p>-->\r\n<!--</section>-->\r\n",
  72. changeDetection: ChangeDetectionStrategy.OnPush,
  73. styles: [":host .form-group:last-of-type{margin-bottom:3rem}"]
  74. }] }
  75. ];
  76. /** @nocollapse */
  77. ResetPasswordComponent.ctorParameters = function () { return [
  78. { type: NbAuthService },
  79. { type: LoginLangService },
  80. { type: undefined, decorators: [{ type: Inject, args: [NB_AUTH_OPTIONS,] }] },
  81. { type: ChangeDetectorRef },
  82. { type: Router }
  83. ]; };
  84. return ResetPasswordComponent;
  85. }());
  86. export { ResetPasswordComponent };
  87. if (false) {
  88. /** @type {?} */
  89. ResetPasswordComponent.prototype.redirectDelay;
  90. /** @type {?} */
  91. ResetPasswordComponent.prototype.showMessages;
  92. /** @type {?} */
  93. ResetPasswordComponent.prototype.strategy;
  94. /** @type {?} */
  95. ResetPasswordComponent.prototype.submitted;
  96. /** @type {?} */
  97. ResetPasswordComponent.prototype.errors;
  98. /** @type {?} */
  99. ResetPasswordComponent.prototype.messages;
  100. /** @type {?} */
  101. ResetPasswordComponent.prototype.user;
  102. /**
  103. * @type {?}
  104. * @protected
  105. */
  106. ResetPasswordComponent.prototype.service;
  107. /**
  108. * @type {?}
  109. * @protected
  110. */
  111. ResetPasswordComponent.prototype.langService;
  112. /**
  113. * @type {?}
  114. * @protected
  115. */
  116. ResetPasswordComponent.prototype.options;
  117. /**
  118. * @type {?}
  119. * @protected
  120. */
  121. ResetPasswordComponent.prototype.cd;
  122. /**
  123. * @type {?}
  124. * @protected
  125. */
  126. ResetPasswordComponent.prototype.router;
  127. }
  128. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcGFzc3dvcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2UtYWRtaW4tYXV0aC8iLCJzb3VyY2VzIjpbImxpYi9yZXNldC1wYXNzd29yZC9yZXNldC1wYXNzd29yZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFnQixhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFekQ7SUFpQkUsZ0NBQXNCLE9BQXNCLEVBQVksV0FBNkIsRUFDaEQsT0FBWSxFQUNyQyxFQUFxQixFQUNyQixNQUFjO1FBRlcsd0JBQUEsRUFBQSxZQUFZO1FBRDNCLFlBQU8sR0FBUCxPQUFPLENBQWU7UUFBWSxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDaEQsWUFBTyxHQUFQLE9BQU8sQ0FBSztRQUNyQyxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBWjFCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFZCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUN4QixTQUFJLEdBQVEsRUFBRSxDQUFDO1FBT2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDdEUsQ0FBQzs7OztJQUVELDBDQUFTOzs7SUFBVDtRQUFBLGlCQW9CQztRQW5CQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFDLE1BQW9CO1lBQ2xGLEtBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN0QixLQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN0QztpQkFBTTtnQkFDTCxLQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNsQzs7Z0JBRUssUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFDckMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osVUFBVSxDQUFDO29CQUNULE9BQU8sS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLENBQUMsRUFBRSxLQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDeEI7WUFDRCxLQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCwrQ0FBYzs7OztJQUFkLFVBQWUsR0FBVztRQUN4QixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7O2dCQW5ERixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtvQkFFcEMsa3NNQUE4QztvQkFDOUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2lCQUNoRDs7OztnQkFUdUMsYUFBYTtnQkFFNUMsZ0JBQWdCO2dEQW9CcEIsTUFBTSxTQUFDLGVBQWU7Z0JBeEJPLGlCQUFpQjtnQkFDMUMsTUFBTTs7SUF5RGYsNkJBQUM7Q0FBQSxBQXBERCxJQW9EQztTQTlDWSxzQkFBc0I7OztJQUVqQywrQ0FBa0I7O0lBQ2xCLDhDQUF1Qjs7SUFDdkIsMENBQWM7O0lBRWQsMkNBQWtCOztJQUNsQix3Q0FBc0I7O0lBQ3RCLDBDQUF3Qjs7SUFDeEIsc0NBQWU7Ozs7O0lBRUgseUNBQWdDOzs7OztJQUFFLDZDQUF1Qzs7Ozs7SUFDbkYseUNBQStDOzs7OztJQUMvQyxvQ0FBK0I7Ozs7O0lBQy9CLHdDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTkJfQVVUSF9PUFRJT05TLCBOYkF1dGhSZXN1bHQsIE5iQXV0aFNlcnZpY2UgfSBmcm9tICdAbmVidWxhci9hdXRoJztcclxuaW1wb3J0IHsgZ2V0RGVlcEZyb21PYmplY3QgfSBmcm9tICdAbmVidWxhci9hdXRoL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBMb2dpbkxhbmdTZXJ2aWNlIH0gZnJvbSAnLi4vbG9naW4tbGFuZy5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1yZXNldC1wYXNzd29yZC1wYWdlJyxcclxuICBzdHlsZVVybHM6IFsnLi9yZXNldC1wYXNzd29yZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXNldC1wYXNzd29yZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlc2V0UGFzc3dvcmRDb21wb25lbnQge1xyXG5cclxuICByZWRpcmVjdERlbGF5ID0gMDtcclxuICBzaG93TWVzc2FnZXM6IGFueSA9IHt9O1xyXG4gIHN0cmF0ZWd5ID0gJyc7XHJcblxyXG4gIHN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gIGVycm9yczogc3RyaW5nW10gPSBbXTtcclxuICBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcclxuICB1c2VyOiBhbnkgPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHNlcnZpY2U6IE5iQXV0aFNlcnZpY2UsIHByb3RlY3RlZCBsYW5nU2VydmljZTogTG9naW5MYW5nU2VydmljZSxcclxuICAgIEBJbmplY3QoTkJfQVVUSF9PUFRJT05TKSBwcm90ZWN0ZWQgb3B0aW9ucyA9IHt9LFxyXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcikge1xyXG5cclxuICAgIHRoaXMucmVkaXJlY3REZWxheSA9IHRoaXMuZ2V0Q29uZmlnVmFsdWUoJ2Zvcm1zLnJlc2V0UGFzc3dvcmQucmVkaXJlY3REZWxheScpO1xyXG4gICAgdGhpcy5zaG93TWVzc2FnZXMgPSB0aGlzLmdldENvbmZpZ1ZhbHVlKCdmb3Jtcy5yZXNldFBhc3N3b3JkLnNob3dNZXNzYWdlcycpO1xyXG4gICAgdGhpcy5zdHJhdGVneSA9IHRoaXMuZ2V0Q29uZmlnVmFsdWUoJ2Zvcm1zLnJlc2V0UGFzc3dvcmQuc3RyYXRlZ3knKTtcclxuICB9XHJcblxyXG4gIHJlc2V0UGFzcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZXJyb3JzID0gdGhpcy5tZXNzYWdlcyA9IFtdO1xyXG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuc2VydmljZS5yZXNldFBhc3N3b3JkKHRoaXMuc3RyYXRlZ3ksIHRoaXMudXNlcikuc3Vic2NyaWJlKChyZXN1bHQ6IE5iQXV0aFJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHJlc3VsdC5nZXRNZXNzYWdlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZXJyb3JzID0gcmVzdWx0LmdldEVycm9ycygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZWRpcmVjdCA9IHJlc3VsdC5nZXRSZWRpcmVjdCgpO1xyXG4gICAgICBpZiAocmVkaXJlY3QpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJlZGlyZWN0KTtcclxuICAgICAgICB9LCB0aGlzLnJlZGlyZWN0RGVsYXkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRDb25maWdWYWx1ZShrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gZ2V0RGVlcEZyb21PYmplY3QodGhpcy5vcHRpb25zLCBrZXksIG51bGwpO1xyXG4gIH1cclxufVxyXG4iXX0=