@hmcts/ccd-case-ui-toolkit 7.0.24-upload-timestamp → 7.0.24

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 (25) hide show
  1. package/esm2020/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.mjs +35 -7
  2. package/esm2020/lib/shared/components/case-editor/services/page-validation.service.mjs +10 -5
  3. package/esm2020/lib/shared/components/case-history/case-history.component.mjs +13 -13
  4. package/esm2020/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.mjs +3 -3
  5. package/esm2020/lib/shared/components/palette/case-file-view/components/case-file-view-folder/case-file-view-folder.component.mjs +3 -3
  6. package/esm2020/lib/shared/components/palette/complex/read-complex-field.component.mjs +14 -12
  7. package/esm2020/lib/shared/components/palette/document/write-document-field.component.mjs +25 -16
  8. package/esm2020/lib/shared/components/palette/dynamic-list/dynamic-list.pipe.mjs +2 -2
  9. package/esm2020/lib/shared/domain/http/http-error.model.mjs +7 -1
  10. package/esm2020/lib/shared/services/fields/fields.purger.mjs +4 -3
  11. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs +108 -57
  12. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  13. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +106 -55
  14. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  15. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +2 -1
  16. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  17. package/lib/shared/components/case-editor/services/page-validation.service.d.ts +1 -1
  18. package/lib/shared/components/case-editor/services/page-validation.service.d.ts.map +1 -1
  19. package/lib/shared/components/palette/complex/read-complex-field.component.d.ts.map +1 -1
  20. package/lib/shared/components/palette/document/write-document-field.component.d.ts +1 -0
  21. package/lib/shared/components/palette/document/write-document-field.component.d.ts.map +1 -1
  22. package/lib/shared/domain/http/http-error.model.d.ts +1 -0
  23. package/lib/shared/domain/http/http-error.model.d.ts.map +1 -1
  24. package/lib/shared/services/fields/fields.purger.d.ts.map +1 -1
  25. package/package.json +1 -1
@@ -137,8 +137,9 @@ export class FieldsPurger {
137
137
  }
138
138
  }
139
139
  else {
140
- // Delete the field value
141
- this.deleteFieldValue(form.get('data'), field);
140
+ // Delete the field from formGroup
141
+ const dataGroup = form.get('data');
142
+ dataGroup.removeControl(field.id);
142
143
  }
143
144
  }
144
145
  resetPage(form, wizardPage) {
@@ -300,4 +301,4 @@ FieldsPurger.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: FieldsPurge
300
301
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FieldsPurger, [{
301
302
  type: Injectable
302
303
  }], function () { return [{ type: i1.FieldsUtils }]; }, null); })();
303
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnB1cmdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvc2VydmljZXMvZmllbGRzL2ZpZWxkcy5wdXJnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU0zQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFJaEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFN0MsV0FBVztBQUVYLE1BQU0sT0FBTyxZQUFZO0lBRXZCLFlBQTZCLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUksQ0FBQztJQUVuRCxpQkFBaUIsQ0FBQyxJQUFlLEVBQUUsTUFBYyxFQUFFLFlBQThCLEVBQUUsYUFBcUI7UUFDN0csSUFBSSxDQUFDLHFDQUFxQyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxvQ0FBb0MsQ0FBQyxJQUFlLEVBQUUsTUFBYyxFQUFFLFlBQThCO1FBQzFHLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FB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QUksQ0FBQyxDQUFDO2FBQy9CO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxvQkFBb0IsQ0FBQyxLQUFZO1FBQ3RDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekIsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7b0JBQzdDLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUTt3QkFDaEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3RFLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ1Y7cUJBQU07b0JBQ0wsT0FBTyxFQUFFLENBQUM7aUJBQ1g7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQTtTQUNiO0lBQ0gsQ0FBQzs7d0VBdFRVLFlBQVk7a0VBQVosWUFBWSxXQUFaLFlBQVk7dUZBQVosWUFBWTtjQUR4QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBXaXphcmRQYWdlRmllbGQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbi93aXphcmQtcGFnZS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmRQYWdlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jYXNlLWVkaXRvci9kb21haW4vd2l6YXJkLXBhZ2UubW9kZWwnO1xuaW1wb3J0IHsgV2l6YXJkIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jYXNlLWVkaXRvci9kb21haW4vd2l6YXJkLm1vZGVsJztcbmltcG9ydCB7IFNob3dDb25kaXRpb24gfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NvbmRpdGlvbmFsLXNob3cvZG9tYWluL2NvbmRpdGlvbmFsLXNob3cubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUV2ZW50VHJpZ2dlciB9IGZyb20gJy4uLy4uL2RvbWFpbi9jYXNlLXZpZXcvY2FzZS1ldmVudC10cmlnZ2VyLm1vZGVsJztcbmltcG9ydCB7IENhc2VGaWVsZCB9IGZyb20gJy4uLy4uL2RvbWFpbi9kZWZpbml0aW9uL2Nhc2UtZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgRmllbGRUeXBlRW51bSB9IGZyb20gJy4uLy4uL2RvbWFpbi9kZWZpbml0aW9uL2ZpZWxkLXR5cGUtZW51bS5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZHNVdGlscyB9IGZyb20gJy4vZmllbGRzLnV0aWxzJztcblxuLy8gQGR5bmFtaWNcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGaWVsZHNQdXJnZXIge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmllbGRzVXRpbHM6IEZpZWxkc1V0aWxzKSB7IH1cblxuICBwdWJsaWMgY2xlYXJIaWRkZW5GaWVsZHMoZm9ybTogRm9ybUdyb3VwLCB3aXphcmQ6IFdpemFyZCwgZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyLCBjdXJyZW50UGFnZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFySGlkZGVuRmllbGRGb3JGaWVsZFNob3dDb25kaXRpb24oY3VycmVudFBhZ2VJZCwgZm9ybSwgd2l6YXJkLCBldmVudFRyaWdnZXIpO1xuICAgIHRoaXMuY2xlYXJIaWRkZW5GaWVsZEZvclBhZ2VTaG93Q29uZGl0aW9uKGZvcm0sIHdpemFyZCwgZXZlbnRUcmlnZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJIaWRkZW5GaWVsZEZvclBhZ2VTaG93Q29uZGl0aW9uKGZvcm06IEZvcm1Hcm91cCwgd2l6YXJkOiBXaXphcmQsIGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRFdmVudFN0YXRlID0gdGhpcy5maWVsZHNVdGlscy5nZXRDdXJyZW50RXZlbnRTdGF0ZShldmVudFRyaWdnZXIsIGZvcm0pO1xuICAgIHdpemFyZC5wYWdlcy5mb3JFYWNoKHdwID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc1Nob3dDb25kaXRpb25QYWdlKHdwLCBjdXJyZW50RXZlbnRTdGF0ZSkpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gbmV3IFNob3dDb25kaXRpb24od3Auc2hvd19jb25kaXRpb24pO1xuICAgICAgICBpZiAodGhpcy5pc0hpZGRlbihjb25kaXRpb24sIGN1cnJlbnRFdmVudFN0YXRlKSkge1xuICAgICAgICAgIHRoaXMucmVzZXRQYWdlKGZvcm0sIHdwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckhpZGRlbkZpZWxkRm9yRmllbGRTaG93Q29uZGl0aW9uKGN1cnJlbnRQYWdlSWQ6IHN0cmluZyxcbiAgICBmb3JtOiBGb3JtR3JvdXAsXG4gICAgd2l6YXJkOiBXaXphcmQsXG4gICAgZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUZpZWxkcyA9IGZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBjdXJyZW50UGFnZTogV2l6YXJkUGFnZSA9IHdpemFyZC5nZXRQYWdlKGN1cnJlbnRQYWdlSWQsIHRoaXMuZmllbGRzVXRpbHMuYnVpbGRDYW5TaG93UHJlZGljYXRlKGV2ZW50VHJpZ2dlciwgZm9ybSkpO1xuICAgIGN1cnJlbnRQYWdlLndpemFyZF9wYWdlX2ZpZWxkcy5mb3JFYWNoKHdwZiA9PiB7XG4gICAgICBjb25zdCBjYXNlRmllbGQgPSB0aGlzLmZpbmRDYXNlRmllbGRCeVdpemFyZFBhZ2VGaWVsZElkKGN1cnJlbnRQYWdlLCB3cGYpO1xuICAgICAgaWYgKHRoaXMuaGFzU2hvd0NvbmRpdGlvbkZpZWxkKGNhc2VGaWVsZCwgZm9ybUZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gbmV3IFNob3dDb25kaXRpb24oY2FzZUZpZWxkLnNob3dfY29uZGl0aW9uKTtcbiAgICAgICAgaWYgKHRoaXMuaXNIaWRkZW4oY29uZGl0aW9uLCBmb3JtRmllbGRzLmRhdGEpICYmICEodGhpcy5pc1JlYWRvbmx5KGNhc2VGaWVsZCkpKSB7XG4gICAgICAgICAgdGhpcy5yZXNldEZpZWxkKGZvcm0sIGNhc2VGaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucmV0YWluSGlkZGVuVmFsdWVCeUZpZWxkVHlwZShjYXNlRmllbGQsIGZvcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXRhaW5IaWRkZW5WYWx1ZUJ5RmllbGRUeXBlKGZpZWxkOiBDYXNlRmllbGQsIGZvcm06IGFueSk6IHZvaWQge1xuICAgIC8vIHNvIGZhciBvbmx5IGFwcGxpZXMgdG8gdGhlIG5ldyBmaWVsZCB0eXBlIE9yZ2FuaXNhdGlvblBvbGljeSB3aGljaCBuZWVkcyB0byByZXRhaW4gdGhlIGRlZmF1bHQgY2FzZSByb2xlIHZhbHVlXG4gICAgLy8gZm9yIG90aGVyIGNhc2UgZmllbGRzIHRoZXJlIHNob3VsZCBiZSBubyBzaWRlIGVmZmVjdHNcbiAgICBpZiAoZmllbGQgJiYgZmllbGQuZmllbGRfdHlwZSAmJiBmaWVsZC5maWVsZF90eXBlLmlkID09PSAnT3JnYW5pc2F0aW9uUG9saWN5Jykge1xuICAgICAgLy8gPGJ1YmJsZV93cmFwPlxuICAgICAgLy8gRG9pbmcgc29tZSBudWxsIGNoZWNraW5nIHRvIHN0b3AgaXQgZnJvbSBmYWxsaW5nIG92ZXIuXG4gICAgICBjb25zdCBkYXRhOiBGb3JtR3JvdXAgPSBmb3JtLmdldCgnZGF0YScpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkR3JvdXA6IEZvcm1Hcm91cCA9IGRhdGEuY29udHJvbHNbZmllbGQuaWRdIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgaWYgKGZpZWxkR3JvdXApIHtcbiAgICAgICAgICBjb25zdCBjYXNlUm9sZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbCA9IGZpZWxkR3JvdXAuZ2V0KCdPcmdQb2xpY3lDYXNlQXNzaWduZWRSb2xlJykgYXMgRm9ybUNvbnRyb2w7XG4gICAgICAgICAgaWYgKGNhc2VSb2xlRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNhc2VSb2xlRm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyA8L2J1YmJsZV93cmFwPlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNIaWRkZW4oY29uZGl0aW9uOiBTaG93Q29uZGl0aW9uLCBmb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWNvbmRpdGlvbi5tYXRjaChmb3JtRmllbGRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZENhc2VGaWVsZEJ5V2l6YXJkUGFnZUZpZWxkSWQoY3VycmVudFBhZ2U6IFdpemFyZFBhZ2UsIHdpemFyZFBhZ2VGaWVsZDogV2l6YXJkUGFnZUZpZWxkKTogQ2FzZUZpZWxkIHtcbiAgICByZXR1cm4gY3VycmVudFBhZ2UuY2FzZV9maWVsZHMuZmluZChjZiA9PiBjZi5pZCA9PT0gd2l6YXJkUGFnZUZpZWxkLmNhc2VfZmllbGRfaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNTaG93Q29uZGl0aW9uUGFnZSh3aXphcmRQYWdlOiBXaXphcmRQYWdlLCBmb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2l6YXJkUGFnZS5zaG93X2NvbmRpdGlvbiAmJiBmb3JtRmllbGRzW3RoaXMuZ2V0U2hvd0NvbmRpdGlvbktleSh3aXphcmRQYWdlLnNob3dfY29uZGl0aW9uKV07XG4gIH1cblxuICBwcml2YXRlIGhhc1Nob3dDb25kaXRpb25GaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCwgZm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhc2VGaWVsZC5zaG93X2NvbmRpdGlvbiAmJiBmb3JtRmllbGRzLmRhdGFbdGhpcy5nZXRTaG93Q29uZGl0aW9uS2V5KGNhc2VGaWVsZC5zaG93X2NvbmRpdGlvbildO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTaG93Q29uZGl0aW9uS2V5KHNob3dDb25kaXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gTmVlZCB0byBhbGxvdyBmb3IgbmVnYXRlZCBjb25kaXRpb25zLCBpLmUuICE9LCBhcyB3ZWxsIGFzIHJlZ3VsYXIgb25lcyAoPSlcbiAgICAvLyBBbHNvIG5lZWQgdG8gYWxsb3cgZm9yIGNvbmRpdGlvbnMgc3BlY2lmaWVkIHVzaW5nIHRoZSBcIkNPTlRBSU5TXCIga2V5d29yZFxuICAgIHJldHVybiBzaG93Q29uZGl0aW9uLnNwbGl0KC8hPXw9fENPTlRBSU5TLylbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmllbGQoZm9ybTogRm9ybUdyb3VwLCBmaWVsZDogQ2FzZUZpZWxkKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGhpZGRlbiBmaWVsZCdzIHZhbHVlIGlzIHRvIGJlIHJldGFpbmVkLCBkbyBub3RoaW5nIChleGNlcHQgaWYgaXQgaXMgYSBDb21wbGV4IHR5cGUgb3IgY29sbGVjdGlvbiBvZlxuICAgICAqIENvbXBsZXggdHlwZXMpLiBUaGlzIGlzIGEgY2hhbmdlIHRvIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIgKHdoaWNoIHVzZWQgdG8gY2xlYXIgdGhlIGZpZWxkIHZhbHVlIGJ1dCByZW1vdmUgaXRcbiAgICAgKiBmcm9tIHN1Ym1pc3Npb24gYXMgYW4gdXBkYXRlIHRvIHRoZSBiYWNrLWVuZCkuIFRoZSBuZXcgYmVoYXZpb3VyIGlzIHRvIGxlYXZlIHRoZSBmaWVsZCBhcyBpcywgc28gaWYgdGhlIGZpZWxkXG4gICAgICogaXMgaGlkZGVuIGJ1dCB0aGVuIHVuLWhpZGRlbiBiZWZvcmUgZm9ybSBzdWJtaXNzaW9uLCBhbnkgcHJldmlvdXNseSBlbnRlcmVkIHZhbHVlIGlzIHJldGFpbmVkLlxuICAgICAqXG4gICAgICogRm9yIENvbXBsZXggZmllbGQgdHlwZXMsIGFuIGFkZGl0aW9uYWwgY2hlY2sgb2Ygc3ViLWZpZWxkcyBpcyByZXF1aXJlZC4gVGhlIHNhbWUgYXBwbGllcyB0byBhIGNvbGxlY3Rpb24gb2ZcbiAgICAgKiBDb21wbGV4IHR5cGVzLlxuICAgICAqL1xuICAgIGlmIChmaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlKSB7XG4gICAgICBjb25zdCBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW0gPSBmaWVsZC5maWVsZF90eXBlLnR5cGU7XG4gICAgICAvLyBJZiB0aGUgZmllbGQgaXMgYSBDb21wbGV4IHR5cGUsIGxvb3Agb3ZlciBpdHMgc3ViLWZpZWxkcyBhbmQgY2FsbCBkZWxldGVGaWVsZFZhbHVlKCkgZm9yIGFueSBzdWItZmllbGRzXG4gICAgICAvLyB3aGVyZSByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlLCBPUiBmb3IgYW55IENvbXBsZXggc3ViLWZpZWxkcyAqcmVnYXJkbGVzcyBvZiB0aGVpciByZXRhaW5faGlkZGVuX3ZhbHVlKlxuICAgICAgLy8gKGluIG9yZGVyIHRvIGluc3BlY3QgdGhlIHN1Yi1maWVsZHMgb2YgYSBDb21wbGV4IHR5cGUgd2l0aGluIGFub3RoZXIgQ29tcGxleCB0eXBlKVxuICAgICAgaWYgKGZpZWxkVHlwZSA9PT0gJ0NvbXBsZXgnICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBsZXhTdWJGaWVsZCBvZiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgaWYgKChjb21wbGV4U3ViRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICFjb21wbGV4U3ViRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHBhcmVudCBGb3JtR3JvdXAgY29ycmVzcG9uZGluZyB0byB0aGUgQ29tcGxleCBmaWVsZDsgaWYgaXQgZXhpc3RzLCBjYWxsXG4gICAgICAgICAgICAvLyBkZWxldGVGaWVsZFZhbHVlKCkgdG8gZGVsZXRlIHRoZSBzdWItZmllbGRcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1Hcm91cCA9IChmb3JtLmdldCgnZGF0YScpIGFzIEZvcm1Hcm91cCkuY29udHJvbHNbZmllbGQuaWRdIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgICAgICAgICAgdGhpcy5kZWxldGVGaWVsZFZhbHVlKHBhcmVudEZvcm1Hcm91cCwgY29tcGxleFN1YkZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSAnQ29sbGVjdGlvbicgJiYgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmXG4gICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgY29sbGVjdGlvbiBvZiBDb21wbGV4IHR5cGVzLCBsb29wIHRocm91Z2ggZWFjaCBvbmUgYW5kIGNhbGwgZGVsZXRlRmllbGRWYWx1ZSgpIGZvciBhbnlcbiAgICAgICAgLy8gc3ViLWZpZWxkcyB3aGVyZSByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlLCBPUiBmb3IgYW55IENvbXBsZXggc3ViLWZpZWxkcyAqcmVnYXJkbGVzcyBvZiB0aGVpclxuICAgICAgICAvLyByZXRhaW5faGlkZGVuX3ZhbHVlKiAoaW4gb3JkZXIgdG8gaW5zcGVjdCB0aGUgc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggdHlwZSB3aXRoaW4gYW5vdGhlciBDb21wbGV4IHR5cGUpXG5cbiAgICAgICAgLy8gR2V0IHRoZSBhcnJheSBvZiBmaWVsZCBjb250cm9scyBjb3JyZXNwb25kaW5nIHRvIHRoZSBDb21wbGV4IGZpZWxkIHZhbHVlc1xuICAgICAgICBjb25zdCBmaWVsZENvbnRyb2xzID0gKGZvcm0uZ2V0KCdkYXRhJykgYXMgRm9ybUdyb3VwKS5jb250cm9sc1tmaWVsZC5pZF0gYXMgRm9ybUFycmF5O1xuXG4gICAgICAgIGlmIChmaWVsZENvbnRyb2xzKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBhcnJheSBvZiBDb21wbGV4IGZpZWxkIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXhGaWVsZFZhbHVlcyA9IGZpZWxkQ29udHJvbHMudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAvLyBGb3IgZWFjaCBDb21wbGV4IGZpZWxkIHZhbHVlLCBnZXQgdGhlIElEIG9mIGVhY2ggc3ViLWZpZWxkIHdpdGhpbiBpdCBhbmQgdXNlIGFzIGEga2V5IHRvIGZpbmQgdGhlXG4gICAgICAgICAgLy8gY29ycmVzcG9uZGluZyBzdWItQ2FzZUZpZWxkICh3aGljaCBjb250YWlucyB0aGUgZmllbGQgdHlwZSBpbmZvcm1hdGlvbilcbiAgICAgICAgICBpZiAoY29tcGxleEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICBjb21wbGV4RmllbGRWYWx1ZXMuZm9yRWFjaCgoZmllbGRWYWx1ZSwgaW5kZXgpID0+IE9iamVjdC5rZXlzKGZpZWxkVmFsdWUudmFsdWUpLmZvckVhY2goc3ViRmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHN1Yi1DYXNlRmllbGQgY29ycmVzcG9uZGluZyB0byB0aGUgc3ViLWZpZWxkIElEXG4gICAgICAgICAgICAgIGxldCBzdWJDYXNlRmllbGQ6IENhc2VGaWVsZDtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXNlRmllbGQgb2YgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FzZUZpZWxkLmlkID09PSBzdWJGaWVsZElkKSB7XG4gICAgICAgICAgICAgICAgICBzdWJDYXNlRmllbGQgPSBjYXNlRmllbGQ7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgdGhlIHN1Yi1maWVsZCB2YWx1ZSBpZiByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlLCBPUiBpZiB0aGUgc3ViLWZpZWxkIHR5cGUgaXNcbiAgICAgICAgICAgICAgLy8gQ29tcGxleCBhbmQgcmVnYXJkbGVzcyBvZiByZXRhaW5faGlkZGVuX3ZhbHVlLCBwYXNzaW5nIGluIHRoZSBwYXJlbnQgRm9ybUdyb3VwXG4gICAgICAgICAgICAgIGlmIChzdWJDYXNlRmllbGQgJiZcbiAgICAgICAgICAgICAgICAoKHN1YkNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiBzdWJDYXNlRmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgIXN1YkNhc2VGaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwID0gZmllbGRDb250cm9scy5hdChpbmRleCkuZ2V0KCd2YWx1ZScpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUocGFyZW50Rm9ybUdyb3VwLCBzdWJDYXNlRmllbGQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgZmllbGQgdmFsdWVcbiAgICAgIHRoaXMuZGVsZXRlRmllbGRWYWx1ZShmb3JtLmdldCgnZGF0YScpIGFzIEZvcm1Hcm91cCwgZmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRQYWdlKGZvcm06IEZvcm1Hcm91cCwgd2l6YXJkUGFnZTogV2l6YXJkUGFnZSk6IHZvaWQge1xuICAgIHdpemFyZFBhZ2Uud2l6YXJkX3BhZ2VfZmllbGRzLmZvckVhY2god3BmID0+IHtcbiAgICAgIGNvbnN0IGNhc2VGaWVsZCA9IHRoaXMuZmluZENhc2VGaWVsZEJ5V2l6YXJkUGFnZUZpZWxkSWQod2l6YXJkUGFnZSwgd3BmKTtcbiAgICAgIHRoaXMucmVzZXRGaWVsZChmb3JtLCBjYXNlRmllbGQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlKGVsZW06IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbGVtKS5zbGljZSg4LCAtMSk7XG4gIH1cblxuICBwcml2YXRlIGlzT2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFR5cGUoZWxlbSkgPT09ICdPYmplY3QnO1xuICB9XG5cbiAgLy8gVE9ETzogY2FsbCBpc1JlYWRPbmx5IG9uIENhc2VGaWVsZHMgb25jZSB3ZSBtYWtlIGl0IGF2YWlsYWJsZVxuICBwcml2YXRlIGlzUmVhZG9ubHkoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2FzZUZpZWxkLmRpc3BsYXlfY29udGV4dC50b1VwcGVyQ2FzZSgpID09PSAnUkVBRE9OTFknO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBmaWVsZCB2YWx1ZSBieSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgRm9ybUNvbnRyb2x9IHRvIG51bGwgKG9yIGFuIGVtcHR5IGFycmF5XG4gICAqIGlmIHRoZSBmaWVsZCB0eXBlIGlzIGBDb2xsZWN0aW9uYCksIGV4Y2VwdCB3aGVuIHRoZSBmaWVsZCB0eXBlIGlzIGBDb21wbGV4YCBvciBgRG9jdW1lbnRgLiBGb3IgYENvbXBsZXhgIGZpZWxkXG4gICAqIHR5cGVzLCB0aGlzIHJlY3Vyc2l2ZSBtZXRob2QgaXMgY2FsbGVkIHVudGlsIHNpbXBsZSBvciBcImJhc2VcIiBmaWVsZCB0eXBlcyBhcmUgcmVhY2hlZC4gRm9yIGBEb2N1bWVudGAgZmllbGRcbiAgICogdHlwZXMsIGl0cyBfc3ViLWZpZWxkXyBgRm9ybUNvbnRyb2xgIHZhbHVlcyBhcmUgc2V0IHRvIG51bGwuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtR3JvdXAgVGhlIGBGb3JtR3JvdXBgIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGBGb3JtQ29udHJvbGAgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRcbiAgICogQHBhcmFtIGZpZWxkIFRoZSBgQ2FzZUZpZWxkYCB3aG9zZSB2YWx1ZSBpcyB0byBiZSBkZWxldGVkIGluIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSBwYXJlbnRGaWVsZCBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBgQ2FzZUZpZWxkYC4gVXNlZCBmb3IgY2hlY2tpbmcgc3BlY2lmaWNhbGx5IHdoZXJlIGEgQ29tcGxleCBmaWVsZCBhbmRcbiAgICogaXRzIHN1Yi1maWVsZHMgaGF2ZSBgcmV0YWluX2hpZGRlbl92YWx1ZWAgc2V0IHRvIGB0cnVlYCwgYnV0IHRoZSBmaWVsZCdzIHBhcmVudCBoYXMgaXQgc2V0IHRvIGBmYWxzZWAgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlRmllbGRWYWx1ZShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgZmllbGQ6IENhc2VGaWVsZCwgcGFyZW50RmllbGQ/OiBDYXNlRmllbGQpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW0gPSBmaWVsZC5maWVsZF90eXBlLnR5cGU7XG4gICAgY29uc3QgZmllbGRDb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZC5pZCk7XG5cbiAgICBpZiAoZmllbGRDb250cm9sKSB7XG4gICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBJZiB0aGUgZmllbGQgaXMgYSBDb21wbGV4IHR5cGUsIGxvb3Agb3ZlciBpdHMgc3ViLWZpZWxkcyBhbmQgY2FsbCBkZWxldGVGaWVsZFZhbHVlKCkgZm9yOlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogKiBBbnkgc3ViLWZpZWxkcyB3aGVyZSByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlL3VuZGVmaW5lZCwgaWYgdGhlIHBhcmVudCBmaWVsZCBoYXNcbiAgICAgICAgICAgKiByZXRhaW5faGlkZGVuX3ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgKiAqIEFMTCBzdWItZmllbGRzIGlmIHRoZSBwYXJlbnQgZmllbGQgaGFzIHJldGFpbl9oaWRkZW5fdmFsdWUgPSB0cnVlIEJVVCBpdHMgX293bl8gcGFyZW50IGhhc1xuICAgICAgICAgICAqIHJldGFpbl9oaWRkZW5fdmFsdWUgPSBmYWxzZS91bmRlZmluZWQgKHRodXMgb3ZlcnJpZGluZyBhbnl0aGluZyBlbHNlKTtcbiAgICAgICAgICAgKiAqIEFMTCBzdWItZmllbGRzIGlmIHRoZSBwYXJlbnQgZmllbGQgaGFzIHJldGFpbl9oaWRkZW5fdmFsdWUgPSBmYWxzZS91bmRlZmluZWQ7XG4gICAgICAgICAgICogKiBBbnkgQ29tcGxleCBzdWItZmllbGRzICpyZWdhcmRsZXNzIG9mIHRoZWlyIHJldGFpbl9oaWRkZW5fdmFsdWUqIChpbiBvcmRlciB0byBpbnNwZWN0IHRoZSBzdWItZmllbGRzXG4gICAgICAgICAgICogb2YgYSBDb21wbGV4IHR5cGUgd2l0aGluIGFub3RoZXIgQ29tcGxleCB0eXBlKVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcGxleFN1YkZpZWxkIG9mIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgaWYgKChjb21wbGV4U3ViRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAoY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUudHlwZSAhPT0gJ0NvbXBsZXgnICYmXG4gICAgICAgICAgICAgICAgICAoZmllbGQucmV0YWluX2hpZGRlbl92YWx1ZVxuICAgICAgICAgICAgICAgICAgICA/ICFjb21wbGV4U3ViRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSB8fCAocGFyZW50RmllbGQgJiYgIXBhcmVudEZpZWxkLnJldGFpbl9oaWRkZW5fdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogdHJ1ZSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpZWxkQ29udHJvbCBpcyBjYXN0IHRvIGEgRm9ybUdyb3VwIGJlY2F1c2UgYSBDb21wbGV4IGZpZWxkIHR5cGUgdXNlcyB0aGlzIGFzIGl0cyB1bmRlcmx5aW5nXG4gICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUoZmllbGRDb250cm9sIGFzIEZvcm1Hcm91cCwgY29tcGxleFN1YkZpZWxkLCBmaWVsZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIC8vIElmIGl0IGlzIGEgY29sbGVjdGlvbiBvZiBDb21wbGV4IHR5cGVzLCBsb29wIHRocm91Z2ggZWFjaCBvbmU7IGVsc2UgZmFsbCB0aHJvdWdoIHRvIGJlIGhhbmRsZWQgYXMgYVxuICAgICAgICAgIC8vIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIHR5cGVzIChpbiB0aGUgc2FtZSB3YXkgYXMgTXVsdGlTZWxlY3RMaXN0KSwgdW5sZXNzIGl0J3MgYSBjb2xsZWN0aW9uIG9mIERvY3VtZW50XG4gICAgICAgICAgLy8gdHlwZXMsIHdoaWNoIHJlcXVpcmVzIGRpZmZlcmVudCBoYW5kbGluZ1xuICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25GaWVsZFR5cGUgPSBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbkZpZWxkVHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgY29sbGVjdGlvbkZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIENvbXBsZXggZmllbGQgdmFsdWVzXG4gICAgICAgICAgICBjb25zdCBjb21wbGV4RmllbGRWYWx1ZXMgPSBmaWVsZENvbnRyb2wudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIENvbXBsZXggZmllbGQgdmFsdWUsIGdldCB0aGUgSUQgb2YgZWFjaCBzdWItZmllbGQgd2l0aGluIGl0IGFuZCB1c2UgYXMgYSBrZXkgdG8gZmluZCB0aGVcbiAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgc3ViLUNhc2VGaWVsZCAod2hpY2ggY29udGFpbnMgdGhlIGZpZWxkIHR5cGUgaW5mb3JtYXRpb24pXG4gICAgICAgICAgICBpZiAoY29tcGxleEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXhGaWVsZFZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4gT2JqZWN0LmtleXMoZmllbGRWYWx1ZS52YWx1ZSkuZm9yRWFjaChzdWJGaWVsZElkID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBzdWItQ2FzZUZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1Yi1maWVsZCBJRFxuICAgICAgICAgICAgICAgIGxldCBzdWJDYXNlRmllbGQ6IENhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhc2VGaWVsZCBvZiBjb2xsZWN0aW9uRmllbGRUeXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2FzZUZpZWxkLmlkID09PSBzdWJGaWVsZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YkNhc2VGaWVsZCA9IGNhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIHRoZSBzdWItZmllbGQgdmFsdWUsIHBhc3NpbmcgaW4gdGhlIHBhcmVudCBGb3JtR3JvdXBcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cCA9IChmaWVsZENvbnRyb2wgYXMgRm9ybUFycmF5KS5hdChpbmRleCkuZ2V0KCd2YWx1ZScpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUocGFyZW50Rm9ybUdyb3VwLCBzdWJDYXNlRmllbGQpO1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25GaWVsZFR5cGUudHlwZSA9PT0gJ0RvY3VtZW50Jykge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBhcnJheSBvZiBEb2N1bWVudCBmaWVsZCB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmllbGRWYWx1ZXMgPSBmaWVsZENvbnRyb2wudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIERvY3VtZW50IGZpZWxkIHZhbHVlLCBzZXQgYWxsIGl0cyBwcm9wZXJ0eSB2YWx1ZXMgdG8gbnVsbCAodGhpcyBpcyBub3QgYWNjZXB0ZWQgYnkgdGhlXG4gICAgICAgICAgICAvLyBiYWNrLWVuZCBidXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHNhbml0aXNlT2JqZWN0KCkgaW4gRm9ybVZhbHVlU2VydmljZSBiZWZvcmUgc2VuZGluZyAtIHNlZSBiZWxvdyBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBzaW5nbGUgRG9jdW1lbnQgY2FzZSlcbiAgICAgICAgICAgIGlmIChkb2N1bWVudEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50RmllbGRWYWx1ZXMuZm9yRWFjaCgoZmllbGRWYWx1ZSwgaW5kZXgpID0+IE9iamVjdC5rZXlzKGZpZWxkVmFsdWUudmFsdWUpLmZvckVhY2goc3ViRmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBGb3JtR3JvdXAgY29udGFpbmluZyB0aGUgRm9ybUNvbnRyb2wgZm9yIHRoZSBzdWItZmllbGQgYW5kIHNldCBpdHMgdmFsdWUgdG8gbnVsbFxuICAgICAgICAgICAgICAgIChmaWVsZENvbnRyb2wgYXMgRm9ybUFycmF5KS5hdChpbmRleCkuZ2V0KGB2YWx1ZS4ke3N1YkZpZWxkSWR9YCkuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgLy8gT21pdHRlZCBcImJyZWFrXCIgaXMgaW50ZW50aW9uYWwgYmVjYXVzZSBhIGNvbGxlY3Rpb24gc2hvdWxkIGJlIGhhbmRsZWQgYXMgcGVyIE11bHRpU2VsZWN0TGlzdCBpZiBpdCBpc1xuICAgICAgICAvLyBub3QgYSBjb2xsZWN0aW9uIG9mIENvbXBsZXggdHlwZXNcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zd2l0Y2gtY2FzZS1mYWxsLXRocm91Z2hcbiAgICAgICAgY2FzZSAnTXVsdGlTZWxlY3RMaXN0JzpcbiAgICAgICAgICAvLyBGaWVsZCBjb250cm9sIHNob3VsZCBiZSBhIEZvcm1BcnJheSwgc28gbWFwIGVhY2ggb2YgaXRzIHZhbHVlcyB0byBudWxsXG4gICAgICAgICAgLy8gTk9URTogVGhlIEZvcm1BcnJheSBjYW5ub3QganVzdCBiZSBzZXQgdG8gYW4gZW1wdHkgYXJyYXkgYmVjYXVzZSBBbmd1bGFyIGNoZWNrcyB0aGF0IGFsbCBleGlzdGluZyB2YWx1ZXNcbiAgICAgICAgICAvLyBvZiBhIEZvcm1BcnJheSBhcmUgcHJlc2VudDsgc2V0dGluZyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5IGNhdXNlcyBhIHJ1bnRpbWUgZXJyb3JcbiAgICAgICAgICBpZiAoZmllbGRDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGFsbG93IGZvciBmaWVsZCB2YWx1ZXMgdGhhdCBhcmUgb2JqZWN0cywgbm90IGp1c3QgcHJpbWl0aXZlc1xuICAgICAgICAgICAgZmllbGRDb250cm9sLnNldFZhbHVlKHRoaXMubWFwQXJyYXlWYWx1ZXNUb051bGwoZmllbGRDb250cm9sLnZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdEb2N1bWVudCc6XG4gICAgICAgICAgLy8gTk9URTogVGhlIGZpZWxkIGNvbnRyb2wgKGEgRm9ybUdyb3VwIGluIHRoaXMgY2FzZSkgY2Fubm90IGp1c3QgYmUgc2V0IHRvIG51bGwgYmVjYXVzZSBBbmd1bGFyIGNoZWNrcyB0aGF0XG4gICAgICAgICAgLy8gYWxsIGV4aXN0aW5nIHZhbHVlcyBvZiBhIEZvcm1Hcm91cCBhcmUgcHJlc2VudDsgc2V0dGluZyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIG51bGwgY2F1c2VzIGEgcnVudGltZSBlcnJvclxuICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmllbGRWYWx1ZSA9IGZpZWxkQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb2N1bWVudEZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZENvbnRyb2wuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGJhY2stZW5kIGRvZXNuJ3QgYWNjZXB0IG51bGwgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgYW55IG9mIHRoZSBEb2N1bWVudCBmaWVsZCB0eXBlIHByb3BlcnRpZXMgYnV0XG4gICAgICAgICAgICAgIC8vIHRoaXMgaXMgaGFuZGxlZCBieSBzYW5pdGlzZU9iamVjdCgpIGluIEZvcm1WYWx1ZVNlcnZpY2UsIHJldHVybmluZyBhIG51bGwgb2JqZWN0IGZvciB0aGUgZW50aXJlXG4gICAgICAgICAgICAgIC8vIERvY3VtZW50IGZpZWxkLCBpZiBhbnkgb2YgaXRzIHByb3BlcnRpZXMgaXMgbnVsbCAtIHdoaWNoIGlzIGFjY2VwdGVkIGJ5IHRoZSBiYWNrLWVuZFxuICAgICAgICAgICAgICBmaWVsZENvbnRyb2wuZ2V0KGtleSkuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBOb3RlOiB0aGUgZGVmYXVsdCBjYXNlIGFwcGxpZXMgdG8gRHluYW1pY0xpc3QgZmllbGRzLCB0b29cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBmaWVsZENvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYWxsIHZhbHVlcyBvZiBhbiBhcnJheSB0byBgbnVsbGAsIHJldGFpbmluZyBrZXlzIGZvciBhbnkgdmFsdWVzIHRoYXQgYXJlIG9iamVjdHMuIEZvciBleGFtcGxlLFxuICAgKiBgW3sgaWQ6ICcwJywgdmFsdWU6ICdUZXN0JyB9LCAnVGVzdCddYCB3b3VsZCBiZWNvbWUgYFt7IGlkOiBudWxsLCB2YWx1ZTogbnVsbCB9LCBudWxsXWAuXG4gICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgb2YgdmFsdWVzIHRvIG1hcFxuICAgKiBAcmV0dXJucyBBIG5ldyBhcnJheSB3aXRoIHRoZSBtYXBwZWQgdmFsdWVzXG4gICAqL1xuICBwdWJsaWMgbWFwQXJyYXlWYWx1ZXNUb051bGwoYXJyYXk6IGFueVtdKTogYW55W10ge1xuICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYXJyYXkubWFwKGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oe30sIC4uLk9iamVjdC5rZXlzKGVsZW1lbnQpLm1hcChrID0+ICh7IFtrXTogbnVsbCB9KSkpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFycmF5XG4gICAgfVxuICB9XG59XG4iXX0=
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnB1cmdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvc2VydmljZXMvZmllbGRzL2ZpZWxkcy5wdXJnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU0zQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFJaEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFN0MsV0FBVztBQUVYLE1BQU0sT0FBTyxZQUFZO0lBRXZCLFlBQTZCLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUksQ0FBQztJQUVuRCxpQkFBaUIsQ0FBQyxJQUFlLEVBQUUsTUFBYyxFQUFFLFlBQThCLEVBQUUsYUFBcUI7UUFDN0csSUFBSSxDQUFDLHFDQUFxQyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxvQ0FBb0MsQ0FBQyxJQUFlLEVBQUUsTUFBYyxFQUFFLFlBQThCO1FBQzFHLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FB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O29CQUNFLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0I7U0FDRjtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG9CQUFvQixDQUFDLEtBQVk7UUFDdEMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN6QixJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtvQkFDN0MsT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRO3dCQUNoQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDdEUsQ0FBQyxDQUFDLElBQUksQ0FBQztpQkFDVjtxQkFBTTtvQkFDTCxPQUFPLEVBQUUsQ0FBQztpQkFDWDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFBO1NBQ2I7SUFDSCxDQUFDOzt3RUF2VFUsWUFBWTtrRUFBWixZQUFZLFdBQVosWUFBWTt1RkFBWixZQUFZO2NBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFdpemFyZFBhZ2VGaWVsZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY2FzZS1lZGl0b3IvZG9tYWluL3dpemFyZC1wYWdlLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFdpemFyZFBhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbi93aXphcmQtcGFnZS5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbi93aXphcmQubW9kZWwnO1xuaW1wb3J0IHsgU2hvd0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29uZGl0aW9uYWwtc2hvdy9kb21haW4vY29uZGl0aW9uYWwtc2hvdy5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlRXZlbnRUcmlnZ2VyIH0gZnJvbSAnLi4vLi4vZG9tYWluL2Nhc2Utdmlldy9jYXNlLWV2ZW50LXRyaWdnZXIubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUZpZWxkIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vY2FzZS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vZmllbGQtdHlwZS1lbnVtLm1vZGVsJztcbmltcG9ydCB7IEZpZWxkc1V0aWxzIH0gZnJvbSAnLi9maWVsZHMudXRpbHMnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpZWxkc1B1cmdlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmaWVsZHNVdGlsczogRmllbGRzVXRpbHMpIHsgfVxuXG4gIHB1YmxpYyBjbGVhckhpZGRlbkZpZWxkcyhmb3JtOiBGb3JtR3JvdXAsIHdpemFyZDogV2l6YXJkLCBldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXIsIGN1cnJlbnRQYWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJIaWRkZW5GaWVsZEZvckZpZWxkU2hvd0NvbmRpdGlvbihjdXJyZW50UGFnZUlkLCBmb3JtLCB3aXphcmQsIGV2ZW50VHJpZ2dlcik7XG4gICAgdGhpcy5jbGVhckhpZGRlbkZpZWxkRm9yUGFnZVNob3dDb25kaXRpb24oZm9ybSwgd2l6YXJkLCBldmVudFRyaWdnZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckhpZGRlbkZpZWxkRm9yUGFnZVNob3dDb25kaXRpb24oZm9ybTogRm9ybUdyb3VwLCB3aXphcmQ6IFdpemFyZCwgZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudEV2ZW50U3RhdGUgPSB0aGlzLmZpZWxkc1V0aWxzLmdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlciwgZm9ybSk7XG4gICAgd2l6YXJkLnBhZ2VzLmZvckVhY2god3AgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzU2hvd0NvbmRpdGlvblBhZ2Uod3AsIGN1cnJlbnRFdmVudFN0YXRlKSkge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBuZXcgU2hvd0NvbmRpdGlvbih3cC5zaG93X2NvbmRpdGlvbik7XG4gICAgICAgIGlmICh0aGlzLmlzSGlkZGVuKGNvbmRpdGlvbiwgY3VycmVudEV2ZW50U3RhdGUpKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFBhZ2UoZm9ybSwgd3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySGlkZGVuRmllbGRGb3JGaWVsZFNob3dDb25kaXRpb24oY3VycmVudFBhZ2VJZDogc3RyaW5nLFxuICAgIGZvcm06IEZvcm1Hcm91cCxcbiAgICB3aXphcmQ6IFdpemFyZCxcbiAgICBldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRmllbGRzID0gZm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlOiBXaXphcmRQYWdlID0gd2l6YXJkLmdldFBhZ2UoY3VycmVudFBhZ2VJZCwgdGhpcy5maWVsZHNVdGlscy5idWlsZENhblNob3dQcmVkaWNhdGUoZXZlbnRUcmlnZ2VyLCBmb3JtKSk7XG4gICAgY3VycmVudFBhZ2Uud2l6YXJkX3BhZ2VfZmllbGRzLmZvckVhY2god3BmID0+IHtcbiAgICAgIGNvbnN0IGNhc2VGaWVsZCA9IHRoaXMuZmluZENhc2VGaWVsZEJ5V2l6YXJkUGFnZUZpZWxkSWQoY3VycmVudFBhZ2UsIHdwZik7XG4gICAgICBpZiAodGhpcy5oYXNTaG93Q29uZGl0aW9uRmllbGQoY2FzZUZpZWxkLCBmb3JtRmllbGRzKSkge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBuZXcgU2hvd0NvbmRpdGlvbihjYXNlRmllbGQuc2hvd19jb25kaXRpb24pO1xuICAgICAgICBpZiAodGhpcy5pc0hpZGRlbihjb25kaXRpb24sIGZvcm1GaWVsZHMuZGF0YSkgJiYgISh0aGlzLmlzUmVhZG9ubHkoY2FzZUZpZWxkKSkpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0RmllbGQoZm9ybSwgY2FzZUZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZXRhaW5IaWRkZW5WYWx1ZUJ5RmllbGRUeXBlKGNhc2VGaWVsZCwgZm9ybSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJldGFpbkhpZGRlblZhbHVlQnlGaWVsZFR5cGUoZmllbGQ6IENhc2VGaWVsZCwgZm9ybTogYW55KTogdm9pZCB7XG4gICAgLy8gc28gZmFyIG9ubHkgYXBwbGllcyB0byB0aGUgbmV3IGZpZWxkIHR5cGUgT3JnYW5pc2F0aW9uUG9saWN5IHdoaWNoIG5lZWRzIHRvIHJldGFpbiB0aGUgZGVmYXVsdCBjYXNlIHJvbGUgdmFsdWVcbiAgICAvLyBmb3Igb3RoZXIgY2FzZSBmaWVsZHMgdGhlcmUgc2hvdWxkIGJlIG5vIHNpZGUgZWZmZWN0c1xuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5maWVsZF90eXBlICYmIGZpZWxkLmZpZWxkX3R5cGUuaWQgPT09ICdPcmdhbmlzYXRpb25Qb2xpY3knKSB7XG4gICAgICAvLyA8YnViYmxlX3dyYXA+XG4gICAgICAvLyBEb2luZyBzb21lIG51bGwgY2hlY2tpbmcgdG8gc3RvcCBpdCBmcm9tIGZhbGxpbmcgb3Zlci5cbiAgICAgIGNvbnN0IGRhdGE6IEZvcm1Hcm91cCA9IGZvcm0uZ2V0KCdkYXRhJykgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgY29uc3QgZmllbGRHcm91cDogRm9ybUdyb3VwID0gZGF0YS5jb250cm9sc1tmaWVsZC5pZF0gYXMgRm9ybUdyb3VwO1xuICAgICAgICBpZiAoZmllbGRHcm91cCkge1xuICAgICAgICAgIGNvbnN0IGNhc2VSb2xlRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gZmllbGRHcm91cC5nZXQoJ09yZ1BvbGljeUNhc2VBc3NpZ25lZFJvbGUnKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgICAgICBpZiAoY2FzZVJvbGVGb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgY2FzZVJvbGVGb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIDwvYnViYmxlX3dyYXA+XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0hpZGRlbihjb25kaXRpb246IFNob3dDb25kaXRpb24sIGZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhY29uZGl0aW9uLm1hdGNoKGZvcm1GaWVsZHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ2FzZUZpZWxkQnlXaXphcmRQYWdlRmllbGRJZChjdXJyZW50UGFnZTogV2l6YXJkUGFnZSwgd2l6YXJkUGFnZUZpZWxkOiBXaXphcmRQYWdlRmllbGQpOiBDYXNlRmllbGQge1xuICAgIHJldHVybiBjdXJyZW50UGFnZS5jYXNlX2ZpZWxkcy5maW5kKGNmID0+IGNmLmlkID09PSB3aXphcmRQYWdlRmllbGQuY2FzZV9maWVsZF9pZCk7XG4gIH1cblxuICBwcml2YXRlIGhhc1Nob3dDb25kaXRpb25QYWdlKHdpemFyZFBhZ2U6IFdpemFyZFBhZ2UsIGZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aXphcmRQYWdlLnNob3dfY29uZGl0aW9uICYmIGZvcm1GaWVsZHNbdGhpcy5nZXRTaG93Q29uZGl0aW9uS2V5KHdpemFyZFBhZ2Uuc2hvd19jb25kaXRpb24pXTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzU2hvd0NvbmRpdGlvbkZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCBmb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2FzZUZpZWxkLnNob3dfY29uZGl0aW9uICYmIGZvcm1GaWVsZHMuZGF0YVt0aGlzLmdldFNob3dDb25kaXRpb25LZXkoY2FzZUZpZWxkLnNob3dfY29uZGl0aW9uKV07XG4gIH1cblxuICBwcml2YXRlIGdldFNob3dDb25kaXRpb25LZXkoc2hvd0NvbmRpdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBOZWVkIHRvIGFsbG93IGZvciBuZWdhdGVkIGNvbmRpdGlvbnMsIGkuZS4gIT0sIGFzIHdlbGwgYXMgcmVndWxhciBvbmVzICg9KVxuICAgIC8vIEFsc28gbmVlZCB0byBhbGxvdyBmb3IgY29uZGl0aW9ucyBzcGVjaWZpZWQgdXNpbmcgdGhlIFwiQ09OVEFJTlNcIiBrZXl3b3JkXG4gICAgcmV0dXJuIHNob3dDb25kaXRpb24uc3BsaXQoLyE9fD18Q09OVEFJTlMvKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWVsZChmb3JtOiBGb3JtR3JvdXAsIGZpZWxkOiBDYXNlRmllbGQpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgaGlkZGVuIGZpZWxkJ3MgdmFsdWUgaXMgdG8gYmUgcmV0YWluZWQsIGRvIG5vdGhpbmcgKGV4Y2VwdCBpZiBpdCBpcyBhIENvbXBsZXggdHlwZSBvciBjb2xsZWN0aW9uIG9mXG4gICAgICogQ29tcGxleCB0eXBlcykuIFRoaXMgaXMgYSBjaGFuZ2UgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW91ciAod2hpY2ggdXNlZCB0byBjbGVhciB0aGUgZmllbGQgdmFsdWUgYnV0IHJlbW92ZSBpdFxuICAgICAqIGZyb20gc3VibWlzc2lvbiBhcyBhbiB1cGRhdGUgdG8gdGhlIGJhY2stZW5kKS4gVGhlIG5ldyBiZWhhdmlvdXIgaXMgdG8gbGVhdmUgdGhlIGZpZWxkIGFzIGlzLCBzbyBpZiB0aGUgZmllbGRcbiAgICAgKiBpcyBoaWRkZW4gYnV0IHRoZW4gdW4taGlkZGVuIGJlZm9yZSBmb3JtIHN1Ym1pc3Npb24sIGFueSBwcmV2aW91c2x5IGVudGVyZWQgdmFsdWUgaXMgcmV0YWluZWQuXG4gICAgICpcbiAgICAgKiBGb3IgQ29tcGxleCBmaWVsZCB0eXBlcywgYW4gYWRkaXRpb25hbCBjaGVjayBvZiBzdWItZmllbGRzIGlzIHJlcXVpcmVkLiBUaGUgc2FtZSBhcHBsaWVzIHRvIGEgY29sbGVjdGlvbiBvZlxuICAgICAqIENvbXBsZXggdHlwZXMuXG4gICAgICovXG4gICAgaWYgKGZpZWxkLnJldGFpbl9oaWRkZW5fdmFsdWUpIHtcbiAgICAgIGNvbnN0IGZpZWxkVHlwZTogRmllbGRUeXBlRW51bSA9IGZpZWxkLmZpZWxkX3R5cGUudHlwZTtcbiAgICAgIC8vIElmIHRoZSBmaWVsZCBpcyBhIENvbXBsZXggdHlwZSwgbG9vcCBvdmVyIGl0cyBzdWItZmllbGRzIGFuZCBjYWxsIGRlbGV0ZUZpZWxkVmFsdWUoKSBmb3IgYW55IHN1Yi1maWVsZHNcbiAgICAgIC8vIHdoZXJlIHJldGFpbl9oaWRkZW5fdmFsdWUgaXMgZmFsc2UsIE9SIGZvciBhbnkgQ29tcGxleCBzdWItZmllbGRzICpyZWdhcmRsZXNzIG9mIHRoZWlyIHJldGFpbl9oaWRkZW5fdmFsdWUqXG4gICAgICAvLyAoaW4gb3JkZXIgdG8gaW5zcGVjdCB0aGUgc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggdHlwZSB3aXRoaW4gYW5vdGhlciBDb21wbGV4IHR5cGUpXG4gICAgICBpZiAoZmllbGRUeXBlID09PSAnQ29tcGxleCcgJiYgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29tcGxleFN1YkZpZWxkIG9mIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICBpZiAoKGNvbXBsZXhTdWJGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiBjb21wbGV4U3ViRmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgIWNvbXBsZXhTdWJGaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgcGFyZW50IEZvcm1Hcm91cCBjb3JyZXNwb25kaW5nIHRvIHRoZSBDb21wbGV4IGZpZWxkOyBpZiBpdCBleGlzdHMsIGNhbGxcbiAgICAgICAgICAgIC8vIGRlbGV0ZUZpZWxkVmFsdWUoKSB0byBkZWxldGUgdGhlIHN1Yi1maWVsZFxuICAgICAgICAgICAgY29uc3QgcGFyZW50Rm9ybUdyb3VwID0gKGZvcm0uZ2V0KCdkYXRhJykgYXMgRm9ybUdyb3VwKS5jb250cm9sc1tmaWVsZC5pZF0gYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgaWYgKHBhcmVudEZvcm1Hcm91cCkge1xuICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUocGFyZW50Rm9ybUdyb3VwLCBjb21wbGV4U3ViRmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT09ICdDb2xsZWN0aW9uJyAmJiBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiZcbiAgICAgICAgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgYSBjb2xsZWN0aW9uIG9mIENvbXBsZXggdHlwZXMsIGxvb3AgdGhyb3VnaCBlYWNoIG9uZSBhbmQgY2FsbCBkZWxldGVGaWVsZFZhbHVlKCkgZm9yIGFueVxuICAgICAgICAvLyBzdWItZmllbGRzIHdoZXJlIHJldGFpbl9oaWRkZW5fdmFsdWUgaXMgZmFsc2UsIE9SIGZvciBhbnkgQ29tcGxleCBzdWItZmllbGRzICpyZWdhcmRsZXNzIG9mIHRoZWlyXG4gICAgICAgIC8vIHJldGFpbl9oaWRkZW5fdmFsdWUqIChpbiBvcmRlciB0byBpbnNwZWN0IHRoZSBzdWItZmllbGRzIG9mIGEgQ29tcGxleCB0eXBlIHdpdGhpbiBhbm90aGVyIENvbXBsZXggdHlwZSlcblxuICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIGZpZWxkIGNvbnRyb2xzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENvbXBsZXggZmllbGQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGZpZWxkQ29udHJvbHMgPSAoZm9ybS5nZXQoJ2RhdGEnKSBhcyBGb3JtR3JvdXApLmNvbnRyb2xzW2ZpZWxkLmlkXSBhcyBGb3JtQXJyYXk7XG5cbiAgICAgICAgaWYgKGZpZWxkQ29udHJvbHMpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIENvbXBsZXggZmllbGQgdmFsdWVzXG4gICAgICAgICAgY29uc3QgY29tcGxleEZpZWxkVmFsdWVzID0gZmllbGRDb250cm9scy52YWx1ZSBhcyBhbnlbXTtcblxuICAgICAgICAgIC8vIEZvciBlYWNoIENvbXBsZXggZmllbGQgdmFsdWUsIGdldCB0aGUgSUQgb2YgZWFjaCBzdWItZmllbGQgd2l0aGluIGl0IGFuZCB1c2UgYXMgYSBrZXkgdG8gZmluZCB0aGVcbiAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIHN1Yi1DYXNlRmllbGQgKHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZCB0eXBlIGluZm9ybWF0aW9uKVxuICAgICAgICAgIGlmIChjb21wbGV4RmllbGRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbXBsZXhGaWVsZFZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4gT2JqZWN0LmtleXMoZmllbGRWYWx1ZS52YWx1ZSkuZm9yRWFjaChzdWJGaWVsZElkID0+IHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgc3ViLUNhc2VGaWVsZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdWItZmllbGQgSURcbiAgICAgICAgICAgICAgbGV0IHN1YkNhc2VGaWVsZDogQ2FzZUZpZWxkO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhc2VGaWVsZCBvZiBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChjYXNlRmllbGQuaWQgPT09IHN1YkZpZWxkSWQpIHtcbiAgICAgICAgICAgICAgICAgIHN1YkNhc2VGaWVsZCA9IGNhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgc3ViLWZpZWxkIHZhbHVlIGlmIHJldGFpbl9oaWRkZW5fdmFsdWUgaXMgZmFsc2UsIE9SIGlmIHRoZSBzdWItZmllbGQgdHlwZSBpc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGFuZCByZWdhcmRsZXNzIG9mIHJldGFpbl9oaWRkZW5fdmFsdWUsIHBhc3NpbmcgaW4gdGhlIHBhcmVudCBGb3JtR3JvdXBcbiAgICAgICAgICAgICAgaWYgKHN1YkNhc2VGaWVsZCAmJlxuICAgICAgICAgICAgICAgICgoc3ViQ2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmIHN1YkNhc2VGaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAhc3ViQ2FzZUZpZWxkLnJldGFpbl9oaWRkZW5fdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXAgPSBmaWVsZENvbnRyb2xzLmF0KGluZGV4KS5nZXQoJ3ZhbHVlJykgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlRmllbGRWYWx1ZShwYXJlbnRGb3JtR3JvdXAsIHN1YkNhc2VGaWVsZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVsZXRlIHRoZSBmaWVsZCBmcm9tIGZvcm1Hcm91cFxuICAgICAgY29uc3QgZGF0YUdyb3VwID0gZm9ybS5nZXQoJ2RhdGEnKSBhcyBGb3JtR3JvdXA7XG4gICAgICBkYXRhR3JvdXAucmVtb3ZlQ29udHJvbChmaWVsZC5pZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldFBhZ2UoZm9ybTogRm9ybUdyb3VwLCB3aXphcmRQYWdlOiBXaXphcmRQYWdlKTogdm9pZCB7XG4gICAgd2l6YXJkUGFnZS53aXphcmRfcGFnZV9maWVsZHMuZm9yRWFjaCh3cGYgPT4ge1xuICAgICAgY29uc3QgY2FzZUZpZWxkID0gdGhpcy5maW5kQ2FzZUZpZWxkQnlXaXphcmRQYWdlRmllbGRJZCh3aXphcmRQYWdlLCB3cGYpO1xuICAgICAgdGhpcy5yZXNldEZpZWxkKGZvcm0sIGNhc2VGaWVsZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFR5cGUoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsZW0pLnNsaWNlKDgsIC0xKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPYmplY3QoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHlwZShlbGVtKSA9PT0gJ09iamVjdCc7XG4gIH1cblxuICAvLyBUT0RPOiBjYWxsIGlzUmVhZE9ubHkgb24gQ2FzZUZpZWxkcyBvbmNlIHdlIG1ha2UgaXQgYXZhaWxhYmxlXG4gIHByaXZhdGUgaXNSZWFkb25seShjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjYXNlRmllbGQuZGlzcGxheV9jb250ZXh0LnRvVXBwZXJDYXNlKCkgPT09ICdSRUFET05MWSc7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIGZpZWxkIHZhbHVlIGJ5IHNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBGb3JtQ29udHJvbH0gdG8gbnVsbCAob3IgYW4gZW1wdHkgYXJyYXlcbiAgICogaWYgdGhlIGZpZWxkIHR5cGUgaXMgYENvbGxlY3Rpb25gKSwgZXhjZXB0IHdoZW4gdGhlIGZpZWxkIHR5cGUgaXMgYENvbXBsZXhgIG9yIGBEb2N1bWVudGAuIEZvciBgQ29tcGxleGAgZmllbGRcbiAgICogdHlwZXMsIHRoaXMgcmVjdXJzaXZlIG1ldGhvZCBpcyBjYWxsZWQgdW50aWwgc2ltcGxlIG9yIFwiYmFzZVwiIGZpZWxkIHR5cGVzIGFyZSByZWFjaGVkLiBGb3IgYERvY3VtZW50YCBmaWVsZFxuICAgKiB0eXBlcywgaXRzIF9zdWItZmllbGRfIGBGb3JtQ29udHJvbGAgdmFsdWVzIGFyZSBzZXQgdG8gbnVsbC5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1Hcm91cCBUaGUgYEZvcm1Hcm91cGAgaW5zdGFuY2UgY29udGFpbmluZyB0aGUgYEZvcm1Db250cm9sYCBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgVGhlIGBDYXNlRmllbGRgIHdob3NlIHZhbHVlIGlzIHRvIGJlIGRlbGV0ZWQgaW4gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHBhcmVudEZpZWxkIFJlZmVyZW5jZSB0byB0aGUgcGFyZW50IGBDYXNlRmllbGRgLiBVc2VkIGZvciBjaGVja2luZyBzcGVjaWZpY2FsbHkgd2hlcmUgYSBDb21wbGV4IGZpZWxkIGFuZFxuICAgKiBpdHMgc3ViLWZpZWxkcyBoYXZlIGByZXRhaW5faGlkZGVuX3ZhbHVlYCBzZXQgdG8gYHRydWVgLCBidXQgdGhlIGZpZWxkJ3MgcGFyZW50IGhhcyBpdCBzZXQgdG8gYGZhbHNlYCBvciB1bmRlZmluZWRcbiAgICovXG4gIHB1YmxpYyBkZWxldGVGaWVsZFZhbHVlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBmaWVsZDogQ2FzZUZpZWxkLCBwYXJlbnRGaWVsZD86IENhc2VGaWVsZCk6IHZvaWQge1xuICAgIGNvbnN0IGZpZWxkVHlwZTogRmllbGRUeXBlRW51bSA9IGZpZWxkLmZpZWxkX3R5cGUudHlwZTtcbiAgICBjb25zdCBmaWVsZENvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZpZWxkLmlkKTtcblxuICAgIGlmIChmaWVsZENvbnRyb2wpIHtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ0NvbXBsZXgnOlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIElmIHRoZSBmaWVsZCBpcyBhIENvbXBsZXggdHlwZSwgbG9vcCBvdmVyIGl0cyBzdWItZmllbGRzIGFuZCBjYWxsIGRlbGV0ZUZpZWxkVmFsdWUoKSBmb3I6XG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiAqIEFueSBzdWItZmllbGRzIHdoZXJlIHJldGFpbl9oaWRkZW5fdmFsdWUgaXMgZmFsc2UvdW5kZWZpbmVkLCBpZiB0aGUgcGFyZW50IGZpZWxkIGhhc1xuICAgICAgICAgICAqIHJldGFpbl9oaWRkZW5fdmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAqICogQUxMIHN1Yi1maWVsZHMgaWYgdGhlIHBhcmVudCBmaWVsZCBoYXMgcmV0YWluX2hpZGRlbl92YWx1ZSA9IHRydWUgQlVUIGl0cyBfb3duXyBwYXJlbnQgaGFzXG4gICAgICAgICAgICogcmV0YWluX2hpZGRlbl92YWx1ZSA9IGZhbHNlL3VuZGVmaW5lZCAodGh1cyBvdmVycmlkaW5nIGFueXRoaW5nIGVsc2UpO1xuICAgICAgICAgICAqICogQUxMIHN1Yi1maWVsZHMgaWYgdGhlIHBhcmVudCBmaWVsZCBoYXMgcmV0YWluX2hpZGRlbl92YWx1ZSA9IGZhbHNlL3VuZGVmaW5lZDtcbiAgICAgICAgICAgKiAqIEFueSBDb21wbGV4IHN1Yi1maWVsZHMgKnJlZ2FyZGxlc3Mgb2YgdGhlaXIgcmV0YWluX2hpZGRlbl92YWx1ZSogKGluIG9yZGVyIHRvIGluc3BlY3QgdGhlIHN1Yi1maWVsZHNcbiAgICAgICAgICAgKiBvZiBhIENvbXBsZXggdHlwZSB3aXRoaW4gYW5vdGhlciBDb21wbGV4IHR5cGUpXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wbGV4U3ViRmllbGQgb2YgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgICBpZiAoKGNvbXBsZXhTdWJGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiBjb21wbGV4U3ViRmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgIChjb21wbGV4U3ViRmllbGQuZmllbGRfdHlwZS50eXBlICE9PSAnQ29tcGxleCcgJiZcbiAgICAgICAgICAgICAgICAgIChmaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8gIWNvbXBsZXhTdWJGaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlIHx8IChwYXJlbnRGaWVsZCAmJiAhcGFyZW50RmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZmllbGRDb250cm9sIGlzIGNhc3QgdG8gYSBGb3JtR3JvdXAgYmVjYXVzZSBhIENvbXBsZXggZmllbGQgdHlwZSB1c2VzIHRoaXMgYXMgaXRzIHVuZGVybHlpbmdcbiAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlRmllbGRWYWx1ZShmaWVsZENvbnRyb2wgYXMgRm9ybUdyb3VwLCBjb21wbGV4U3ViRmllbGQsIGZpZWxkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgLy8gSWYgaXQgaXMgYSBjb2xsZWN0aW9uIG9mIENvbXBsZXggdHlwZXMsIGxvb3AgdGhyb3VnaCBlYWNoIG9uZTsgZWxzZSBmYWxsIHRocm91Z2ggdG8gYmUgaGFuZGxlZCBhcyBhXG4gICAgICAgICAgLy8gY29sbGVjdGlvbiBvZiBzaW1wbGUgdHlwZXMgKGluIHRoZSBzYW1lIHdheSBhcyBNdWx0aVNlbGVjdExpc3QpLCB1bmxlc3MgaXQncyBhIGNvbGxlY3Rpb24gb2YgRG9jdW1lbnRcbiAgICAgICAgICAvLyB0eXBlcywgd2hpY2ggcmVxdWlyZXMgZGlmZmVyZW50IGhhbmRsaW5nXG4gICAgICAgICAgY29uc3QgY29sbGVjdGlvbkZpZWxkVHlwZSA9IGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlO1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uRmllbGRUeXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiBjb2xsZWN0aW9uRmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgYXJyYXkgb2YgQ29tcGxleCBmaWVsZCB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhGaWVsZFZhbHVlcyA9IGZpZWxkQ29udHJvbC52YWx1ZSBhcyBhbnlbXTtcblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggQ29tcGxleCBmaWVsZCB2YWx1ZSwgZ2V0IHRoZSBJRCBvZiBlYWNoIHN1Yi1maWVsZCB3aXRoaW4gaXQgYW5kIHVzZSBhcyBhIGtleSB0byBmaW5kIHRoZVxuICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyBzdWItQ2FzZUZpZWxkICh3aGljaCBjb250YWlucyB0aGUgZmllbGQgdHlwZSBpbmZvcm1hdGlvbilcbiAgICAgICAgICAgIGlmIChjb21wbGV4RmllbGRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgY29tcGxleEZpZWxkVmFsdWVzLmZvckVhY2goKGZpZWxkVmFsdWUsIGluZGV4KSA9PiBPYmplY3Qua2V5cyhmaWVsZFZhbHVlLnZhbHVlKS5mb3JFYWNoKHN1YkZpZWxkSWQgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHN1Yi1DYXNlRmllbGQgY29ycmVzcG9uZGluZyB0byB0aGUgc3ViLWZpZWxkIElEXG4gICAgICAgICAgICAgICAgbGV0IHN1YkNhc2VGaWVsZDogQ2FzZUZpZWxkO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2FzZUZpZWxkIG9mIGNvbGxlY3Rpb25GaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjYXNlRmllbGQuaWQgPT09IHN1YkZpZWxkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViQ2FzZUZpZWxkID0gY2FzZUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgdGhlIHN1Yi1maWVsZCB2YWx1ZSwgcGFzc2luZyBpbiB0aGUgcGFyZW50IEZvcm1Hcm91cFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwID0gKGZpZWxkQ29udHJvbCBhcyBGb3JtQXJyYXkpLmF0KGluZGV4KS5nZXQoJ3ZhbHVlJykgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlRmllbGRWYWx1ZShwYXJlbnRGb3JtR3JvdXAsIHN1YkNhc2VGaWVsZCk7XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbkZpZWxkVHlwZS50eXBlID09PSAnRG9jdW1lbnQnKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIERvY3VtZW50IGZpZWxkIHZhbHVlc1xuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRGaWVsZFZhbHVlcyA9IGZpZWxkQ29udHJvbC52YWx1ZSBhcyBhbnlbXTtcblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggRG9jdW1lbnQgZmllbGQgdmFsdWUsIHNldCBhbGwgaXRzIHByb3BlcnR5IHZhbHVlcyB0byBudWxsICh0aGlzIGlzIG5vdCBhY2NlcHRlZCBieSB0aGVcbiAgICAgICAgICAgIC8vIGJhY2stZW5kIGJ1dCB3aWxsIGJlIGhhbmRsZWQgYnkgc2FuaXRpc2VPYmplY3QoKSBpbiBGb3JtVmFsdWVTZXJ2aWNlIGJlZm9yZSBzZW5kaW5nIC0gc2VlIGJlbG93IGZvclxuICAgICAgICAgICAgLy8gdGhlIHNpbmdsZSBEb2N1bWVudCBjYXNlKVxuICAgICAgICAgICAgaWYgKGRvY3VtZW50RmllbGRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnRGaWVsZFZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4gT2JqZWN0LmtleXMoZmllbGRWYWx1ZS52YWx1ZSkuZm9yRWFjaChzdWJGaWVsZElkID0+IHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIEZvcm1Hcm91cCBjb250YWluaW5nIHRoZSBGb3JtQ29udHJvbCBmb3IgdGhlIHN1Yi1maWVsZCBhbmQgc2V0IGl0cyB2YWx1ZSB0byBudWxsXG4gICAgICAgICAgICAgICAgKGZpZWxkQ29udHJvbCBhcyBGb3JtQXJyYXkpLmF0KGluZGV4KS5nZXQoYHZhbHVlLiR7c3ViRmllbGRJZH1gKS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAvLyBPbWl0dGVkIFwiYnJlYWtcIiBpcyBpbnRlbnRpb25hbCBiZWNhdXNlIGEgY29sbGVjdGlvbiBzaG91bGQgYmUgaGFuZGxlZCBhcyBwZXIgTXVsdGlTZWxlY3RMaXN0IGlmIGl0IGlzXG4gICAgICAgIC8vIG5vdCBhIGNvbGxlY3Rpb24gb2YgQ29tcGxleCB0eXBlc1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXN3aXRjaC1jYXNlLWZhbGwtdGhyb3VnaFxuICAgICAgICBjYXNlICdNdWx0aVNlbGVjdExpc3QnOlxuICAgICAgICAgIC8vIEZpZWxkIGNvbnRyb2wgc2hvdWxkIGJlIGEgRm9ybUFycmF5LCBzbyBtYXAgZWFjaCBvZiBpdHMgdmFsdWVzIHRvIG51bGxcbiAgICAgICAgICAvLyBOT1RFOiBUaGUgRm9ybUFycmF5IGNhbm5vdCBqdXN0IGJlIHNldCB0byBhbiBlbXB0eSBhcnJheSBiZWNhdXNlIEFuZ3VsYXIgY2hlY2tzIHRoYXQgYWxsIGV4aXN0aW5nIHZhbHVlc1xuICAgICAgICAgIC8vIG9mIGEgRm9ybUFycmF5IGFyZSBwcmVzZW50OyBzZXR0aW5nIHRoZSBjb250cm9sJ3MgdmFsdWUgdG8gYW4gZW1wdHkgYXJyYXkgY2F1c2VzIGEgcnVudGltZSBlcnJvclxuICAgICAgICAgIGlmIChmaWVsZENvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIE5lZWQgdG8gYWxsb3cgZm9yIGZpZWxkIHZhbHVlcyB0aGF0IGFyZSBvYmplY3RzLCBub3QganVzdCBwcmltaXRpdmVzXG4gICAgICAgICAgICBmaWVsZENvbnRyb2wuc2V0VmFsdWUodGhpcy5tYXBBcnJheVZhbHVlc1RvTnVsbChmaWVsZENvbnRyb2wudmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RvY3VtZW50JzpcbiAgICAgICAgICAvLyBOT1RFOiBUaGUgZmllbGQgY29udHJvbCAoYSBGb3JtR3JvdXAgaW4gdGhpcyBjYXNlKSBjYW5ub3QganVzdCBiZSBzZXQgdG8gbnVsbCBiZWNhdXNlIEFuZ3VsYXIgY2hlY2tzIHRoYXRcbiAgICAgICAgICAvLyBhbGwgZXhpc3RpbmcgdmFsdWVzIG9mIGEgRm9ybUdyb3VwIGFyZSBwcmVzZW50OyBzZXR0aW5nIHRoZSBjb250cm9sJ3MgdmFsdWUgdG8gbnVsbCBjYXVzZXMgYSBydW50aW1lIGVycm9yXG4gICAgICAgICAgY29uc3QgZG9jdW1lbnRGaWVsZFZhbHVlID0gZmllbGRDb250cm9sLnZhbHVlO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvY3VtZW50RmllbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQ29udHJvbC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgICAvLyBUaGUgYmFjay1lbmQgZG9lc24ndCBhY2NlcHQgbnVsbCBhcyBhIHZhbGlkIHZhbHVlIGZvciBhbnkgb2YgdGhlIERvY3VtZW50IGZpZWxkIHR5cGUgcHJvcGVydGllcyBidXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBpcyBoYW5kbGVkIGJ5IHNhbml0aXNlT2JqZWN0KCkgaW4gRm9ybVZhbHVlU2VydmljZSwgcmV0dXJuaW5nIGEgbnVsbCBvYmplY3QgZm9yIHRoZSBlbnRpcmVcbiAgICAgICAgICAgICAgLy8gRG9jdW1lbnQgZmllbGQsIGlmIGFueSBvZiBpdHMgcHJvcGVydGllcyBpcyBudWxsIC0gd2hpY2ggaXMgYWNjZXB0ZWQgYnkgdGhlIGJhY2stZW5kXG4gICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5nZXQoa2V5KS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIE5vdGU6IHRoZSBkZWZhdWx0IGNhc2UgYXBwbGllcyB0byBEeW5hbWljTGlzdCBmaWVsZHMsIHRvb1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGZpZWxkQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhbGwgdmFsdWVzIG9mIGFuIGFycmF5IHRvIGBudWxsYCwgcmV0YWluaW5nIGtleXMgZm9yIGFueSB2YWx1ZXMgdGhhdCBhcmUgb2JqZWN0cy4gRm9yIGV4YW1wbGUsXG4gICAqIGBbeyBpZDogJzAnLCB2YWx1ZTogJ1Rlc3QnIH0sICdUZXN0J11gIHdvdWxkIGJlY29tZSBgW3sgaWQ6IG51bGwsIHZhbHVlOiBudWxsIH0sIG51bGxdYC5cbiAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gbWFwXG4gICAqIEByZXR1cm5zIEEgbmV3IGFycmF5IHdpdGggdGhlIG1hcHBlZCB2YWx1ZXNcbiAgICovXG4gIHB1YmxpYyBtYXBBcnJheVZhbHVlc1RvTnVsbChhcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhcnJheS5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50ICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgLi4uT2JqZWN0LmtleXMoZWxlbWVudCkubWFwKGsgPT4gKHsgW2tdOiBudWxsIH0pKSlcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXJyYXlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1333,6 +1333,11 @@ class HttpError {
1333
1333
  }
1334
1334
  static from(response) {
1335
1335
  const error = new HttpError();
1336
+ if ((response === null || response === void 0 ? void 0 : response.status) === 429) {
1337
+ error.error = HttpError.MESSAGE_ERROR_429;
1338
+ error.status = response.status;
1339
+ error.message = response.message;
1340
+ }
1336
1341
  // Check that the HttpErrorResponse contains an "error" object before mapping the error properties
1337
1342
  if (!!(response && response.error)) {
1338
1343
  Object.keys(error).forEach((key) => {
@@ -1352,6 +1357,7 @@ class HttpError {
1352
1357
  HttpError.DEFAULT_ERROR = 'Unknown error';
1353
1358
  HttpError.DEFAULT_MESSAGE = 'Something unexpected happened, our technical staff have been automatically notified';
1354
1359
  HttpError.DEFAULT_STATUS = 500;
1360
+ HttpError.MESSAGE_ERROR_429 = 'Your request was rate limited. Please wait a few seconds before retrying your document upload';
1355
1361
 
1356
1362
  class AbstractAppConfig {
1357
1363
  /**
@@ -5034,8 +5040,9 @@ class FieldsPurger {
5034
5040
  }
5035
5041
  }
5036
5042
  else {
5037
- // Delete the field value
5038
- this.deleteFieldValue(form.get('data'), field);
5043
+ // Delete the field from formGroup
5044
+ const dataGroup = form.get('data');
5045
+ dataGroup.removeControl(field.id);
5039
5046
  }
5040
5047
  }
5041
5048
  resetPage(form, wizardPage) {
@@ -8678,16 +8685,21 @@ class PageValidationService {
8678
8685
  constructor(caseFieldService) {
8679
8686
  this.caseFieldService = caseFieldService;
8680
8687
  }
8681
- isPageValid(page, editForm) {
8682
- return page.case_fields
8688
+ getInvalidFields(page, editForm) {
8689
+ const failingCaseFields = [];
8690
+ page.case_fields
8683
8691
  .filter(caseField => !this.caseFieldService.isReadOnly(caseField))
8684
8692
  .filter(caseField => !this.isHidden(caseField, editForm))
8685
- .every(caseField => {
8693
+ .map(caseField => {
8686
8694
  const theControl = FieldsUtils.isCaseFieldOfType(caseField, ['JudicialUser'])
8687
8695
  ? editForm.controls['data'].get(`${caseField.id}_judicialUserControl`)
8688
8696
  : editForm.controls['data'].get(caseField.id);
8689
- return this.checkDocumentField(caseField, theControl) && this.checkOptionalField(caseField, theControl);
8697
+ if (!(this.checkDocumentField(caseField, theControl) && this.checkOptionalField(caseField, theControl))) {
8698
+ failingCaseFields.push(caseField);
8699
+ }
8700
+ ;
8690
8701
  });
8702
+ return failingCaseFields;
8691
8703
  }
8692
8704
  isHidden(caseField, editForm, path) {
8693
8705
  const formFields = editForm.getRawValue();
@@ -10112,7 +10124,8 @@ class CaseEditPageComponent {
10112
10124
  return this.caseEdit.first();
10113
10125
  }
10114
10126
  currentPageIsNotValid() {
10115
- return !this.pageValidationService.isPageValid(this.currentPage, this.editForm) ||
10127
+ this.failingCaseFields = this.pageValidationService.getInvalidFields(this.currentPage, this.editForm);
10128
+ return this.failingCaseFields.length > 0 ||
10116
10129
  (this.isLinkedCasesJourney() && !this.isLinkedCasesJourneyAtFinalStep);
10117
10130
  }
10118
10131
  isLinkedCasesJourney() {
@@ -10134,9 +10147,15 @@ class CaseEditPageComponent {
10134
10147
  // Adding validation message to show it as Error Summary
10135
10148
  generateErrorMessage(fields, container, path) {
10136
10149
  const group = container || this.editForm.controls['data'];
10137
- fields.filter(casefield => !this.caseFieldService.isReadOnly(casefield))
10138
- .filter(casefield => !this.pageValidationService.isHidden(casefield, this.editForm, path))
10150
+ let validErrorFieldFound = false;
10151
+ let validationErrorAmount = this.validationErrors.length;
10152
+ const failingFields = fields.filter(casefield => !this.caseFieldService.isReadOnly(casefield))
10153
+ .filter(casefield => !this.pageValidationService.isHidden(casefield, this.editForm, path));
10154
+ // note that thougn these checks are on getinvalidfields they are needed for sub field checks
10155
+ failingFields
10139
10156
  .forEach(casefield => {
10157
+ let errorPresent = true;
10158
+ validErrorFieldFound = true;
10140
10159
  const fieldElement = FieldsUtils.isCaseFieldOfType(casefield, ['JudicialUser'])
10141
10160
  ? group.get(`${casefield.id}_judicialUserControl`)
10142
10161
  : group.get(casefield.id);
@@ -10181,7 +10200,7 @@ class CaseEditPageComponent {
10181
10200
  }
10182
10201
  else if (fieldElement.invalid) {
10183
10202
  if (casefield.isComplex()) {
10184
- this.generateErrorMessage(casefield.field_type.complex_fields, fieldElement, id);
10203
+ errorPresent = this.generateErrorMessage(casefield.field_type.complex_fields, fieldElement, id);
10185
10204
  }
10186
10205
  else if (casefield.isCollection() && casefield.field_type.collection_field_type.type === 'Complex') {
10187
10206
  const fieldArray = fieldElement;
@@ -10189,7 +10208,7 @@ class CaseEditPageComponent {
10189
10208
  id = `${fieldArray['component']['collItems'][0].prefix}`;
10190
10209
  }
10191
10210
  fieldArray.controls.forEach((c) => {
10192
- this.generateErrorMessage(casefield.field_type.collection_field_type.complex_fields, c.get('value'), id);
10211
+ errorPresent = this.generateErrorMessage(casefield.field_type.collection_field_type.complex_fields, c.get('value'), id);
10193
10212
  });
10194
10213
  }
10195
10214
  else if (FieldsUtils.isCaseFieldOfType(casefield, ['FlagLauncher'])) {
@@ -10204,8 +10223,29 @@ class CaseEditPageComponent {
10204
10223
  }
10205
10224
  }
10206
10225
  }
10226
+ else {
10227
+ validErrorFieldFound = false;
10228
+ }
10229
+ if (!errorPresent && this.validationErrors.length === validationErrorAmount) {
10230
+ // if no error messages have been added in internal field despite parent field failing
10231
+ this.validationErrors.push({ id: casefield.id, message: `A field that is causing an error is ${casefield.id} but it is not producing a valid error message. Please ensure all details are correct` });
10232
+ }
10207
10233
  });
10234
+ if (!validErrorFieldFound) {
10235
+ path ? this.validationErrors.push({ id: path, message: `There is an internal issue with ${path} fields. The field that is causing the error cannot be determined but there is an error present` })
10236
+ : this.validationErrors.push({ id: null, message: `The field that is causing the error cannot be determined but there is an error present` });
10237
+ }
10238
+ else if (this.validationErrors.length === validationErrorAmount) {
10239
+ // if no error messages have been generated
10240
+ if (path) {
10241
+ return false;
10242
+ }
10243
+ else {
10244
+ this.validationErrors.push({ id: null, message: `The field that is causing the error cannot be determined but there is an error present. Please fill in more of the form` });
10245
+ }
10246
+ }
10208
10247
  CaseEditPageComponent.scrollToTop();
10248
+ return true;
10209
10249
  }
10210
10250
  navigateToErrorElement(elementId) {
10211
10251
  /* istanbul ignore else */
@@ -10230,7 +10270,7 @@ class CaseEditPageComponent {
10230
10270
  CaseEditPageComponent.scrollToTop();
10231
10271
  }
10232
10272
  else {
10233
- this.generateErrorMessage(this.currentPage.case_fields);
10273
+ this.generateErrorMessage(this.failingCaseFields);
10234
10274
  }
10235
10275
  }
10236
10276
  if (!this.caseEdit.isSubmitting && !this.currentPageIsNotValid()) {
@@ -13460,7 +13500,7 @@ class ReadComplexFieldComponent extends AbstractFieldReadComponent {
13460
13500
  this.paletteContext = PaletteContext;
13461
13501
  }
13462
13502
  ngOnInit() {
13463
- var _a, _b, _c;
13503
+ var _a, _b, _c, _d;
13464
13504
  super.ngOnInit();
13465
13505
  if (this.caseField.display_context_parameter) {
13466
13506
  this.context = PaletteContext.TABLE_VIEW;
@@ -13471,18 +13511,20 @@ class ReadComplexFieldComponent extends AbstractFieldReadComponent {
13471
13511
  this.context = PaletteContext.DEFAULT;
13472
13512
  }
13473
13513
  }
13474
- (_c = (_b = (_a = this.caseField) === null || _a === void 0 ? void 0 : _a.field_type) === null || _b === void 0 ? void 0 : _b.complex_fields) === null || _c === void 0 ? void 0 : _c.forEach((field) => {
13475
- var _a, _b, _c;
13476
- if (field === null || field === void 0 ? void 0 : field.isDynamic()) {
13477
- field.list_items = (_a = this.caseField.value[field.id]) === null || _a === void 0 ? void 0 : _a.list_items;
13478
- field.value = {
13479
- list_items: field.list_items,
13480
- value: ((_b = this.caseField.value[field.id]) === null || _b === void 0 ? void 0 : _b.value) && this.caseField.value[field.id].value.code ?
13481
- this.caseField.value[field.id].value.code :
13482
- (_c = this.caseField.value[field.id]) === null || _c === void 0 ? void 0 : _c.value
13483
- };
13484
- }
13485
- });
13514
+ if (((_a = this.caseField) === null || _a === void 0 ? void 0 : _a.field_type) && this.caseField.field_type.complex_fields) {
13515
+ (_d = (_c = (_b = this.caseField) === null || _b === void 0 ? void 0 : _b.field_type) === null || _c === void 0 ? void 0 : _c.complex_fields) === null || _d === void 0 ? void 0 : _d.forEach((field) => {
13516
+ var _a, _b, _c;
13517
+ if (field === null || field === void 0 ? void 0 : field.isDynamic()) {
13518
+ field.list_items = (_a = this.caseField.value[field.id]) === null || _a === void 0 ? void 0 : _a.list_items;
13519
+ field.value = {
13520
+ list_items: field.list_items,
13521
+ value: ((_b = this.caseField.value[field.id]) === null || _b === void 0 ? void 0 : _b.value) && this.caseField.value[field.id].value.code ?
13522
+ this.caseField.value[field.id].value.code :
13523
+ (_c = this.caseField.value[field.id]) === null || _c === void 0 ? void 0 : _c.value
13524
+ };
13525
+ }
13526
+ });
13527
+ }
13486
13528
  }
13487
13529
  }
13488
13530
  ReadComplexFieldComponent.ɵfac = /*@__PURE__*/ function () { let ɵReadComplexFieldComponent_BaseFactory; return function ReadComplexFieldComponent_Factory(t) { return (ɵReadComplexFieldComponent_BaseFactory || (ɵReadComplexFieldComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ReadComplexFieldComponent)))(t || ReadComplexFieldComponent); }; }();
@@ -14253,23 +14295,31 @@ class WriteDocumentFieldComponent extends AbstractFieldWriteComponent {
14253
14295
  this.uploadedDocument = this.registerControl(new FormGroup(documentFormGroup), true);
14254
14296
  }
14255
14297
  getErrorMessage(error) {
14256
- // Document Management unavailable
14257
- if (0 === error.status || 502 === error.status) {
14258
- return WriteDocumentFieldComponent.UPLOAD_ERROR_NOT_AVAILABLE;
14259
- }
14260
- let errorMsg = 'Error uploading file';
14261
- if (error === null || error === void 0 ? void 0 : error.error) {
14262
- const fullError = error.error;
14263
- const start = fullError.indexOf('{');
14264
- if (start >= 0) {
14265
- const json = fullError.substring(start, fullError.length - 1).split('<EOL>').join('');
14266
- const obj = JSON.parse(json);
14267
- if (obj === null || obj === void 0 ? void 0 : obj.error) {
14268
- errorMsg = obj.error;
14298
+ switch (error.status) {
14299
+ case 0:
14300
+ case 502:
14301
+ return WriteDocumentFieldComponent.UPLOAD_ERROR_NOT_AVAILABLE;
14302
+ case 422:
14303
+ {
14304
+ let errorMsg = WriteDocumentFieldComponent.ERROR_UPLOADING_FILE;
14305
+ if (error === null || error === void 0 ? void 0 : error.error) {
14306
+ const fullError = error.error;
14307
+ const start = fullError.indexOf('{');
14308
+ if (start >= 0) {
14309
+ const json = fullError.substring(start, fullError.length - 1).split('<EOL>').join('');
14310
+ const obj = JSON.parse(json);
14311
+ if (obj === null || obj === void 0 ? void 0 : obj.error) {
14312
+ errorMsg = obj.error;
14313
+ }
14314
+ }
14315
+ }
14316
+ return errorMsg;
14269
14317
  }
14270
- }
14318
+ case 429:
14319
+ return error === null || error === void 0 ? void 0 : error.error;
14320
+ default:
14321
+ return WriteDocumentFieldComponent.ERROR_UPLOADING_FILE;
14271
14322
  }
14272
- return errorMsg;
14273
14323
  }
14274
14324
  buildDocumentUploadData(selectedFile) {
14275
14325
  const documentUpload = new FormData();
@@ -14325,6 +14375,7 @@ WriteDocumentFieldComponent.UPLOAD_TIMESTAMP = 'upload_timestamp';
14325
14375
  WriteDocumentFieldComponent.UPLOAD_ERROR_FILE_REQUIRED = 'File required';
14326
14376
  WriteDocumentFieldComponent.UPLOAD_ERROR_NOT_AVAILABLE = 'Document upload facility is not available at the moment';
14327
14377
  WriteDocumentFieldComponent.UPLOAD_WAITING_FILE_STATUS = 'Uploading...';
14378
+ WriteDocumentFieldComponent.ERROR_UPLOADING_FILE = 'Error Uploading File';
14328
14379
  WriteDocumentFieldComponent.ɵfac = function WriteDocumentFieldComponent_Factory(t) { return new (t || WriteDocumentFieldComponent)(i0.ɵɵdirectiveInject(AbstractAppConfig), i0.ɵɵdirectiveInject(CaseNotifier), i0.ɵɵdirectiveInject(DocumentManagementService), i0.ɵɵdirectiveInject(i1$3.MatLegacyDialog), i0.ɵɵdirectiveInject(FileUploadStateService), i0.ɵɵdirectiveInject(JurisdictionService)); };
14329
14380
  WriteDocumentFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WriteDocumentFieldComponent, selectors: [["ccd-write-document-field"]], viewQuery: function WriteDocumentFieldComponent_Query(rf, ctx) {
14330
14381
  if (rf & 1) {
@@ -14395,7 +14446,7 @@ WriteDocumentFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
14395
14446
 
14396
14447
  class DynamicListPipe {
14397
14448
  transform(value, items) {
14398
- const item = items.find(i => i.code === value);
14449
+ const item = items === null || items === void 0 ? void 0 : items.find(i => i.code === value);
14399
14450
  return item ? item.label : DynamicListPipe.EMPTY;
14400
14451
  }
14401
14452
  }
@@ -23227,7 +23278,7 @@ CaseFileViewFolderComponent.UNCATEGORISED_DOCUMENTS_TITLE = 'Uncategorised docum
23227
23278
  CaseFileViewFolderComponent.DOCUMENT_SEARCH_FORM_CONTROL_NAME = 'documentSearchFormControl';
23228
23279
  CaseFileViewFolderComponent.MINIMUM_SEARCH_CHARACTERS = 1;
23229
23280
  CaseFileViewFolderComponent.ɵfac = function CaseFileViewFolderComponent_Factory(t) { return new (t || CaseFileViewFolderComponent)(i0.ɵɵdirectiveInject(WindowService), i0.ɵɵdirectiveInject(i1$1.Router), i0.ɵɵdirectiveInject(DocumentManagementService), i0.ɵɵdirectiveInject(i1$3.MatLegacyDialog), i0.ɵɵdirectiveInject(AbstractAppConfig)); };
23230
- CaseFileViewFolderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseFileViewFolderComponent, selectors: [["ccd-case-file-view-folder"]], inputs: { categoriesAndDocuments: "categoriesAndDocuments", allowMoving: "allowMoving" }, outputs: { clickedDocument: "clickedDocument", moveDocument: "moveDocument" }, decls: 9, vars: 3, consts: [[1, "document-filter-container"], [1, "form-group", "document-filter", 3, "formGroup"], ["type", "search", "id", "document-search", "name", "documentSearchFormControl", "formControlName", "documentSearchFormControl", "placeholder", "Search by document name", 1, "form-control", "document-search"], [1, "document-folders-header"], [1, "document-folders-header__title"], [3, "sortAscending", "sortDescending"], ["class", "document-tree-container", 4, "ngIf"], [1, "document-tree-container"], [4, "ngIf"], [3, "dataSource", "treeControl"], ["class", "document-tree-container__node document-tree-container__node--document", 4, "cdkTreeNodeDef"], ["class", "document-tree-container__node document-tree-container__folder", 4, "cdkTreeNodeDef", "cdkTreeNodeDefWhen"], [1, "document-tree-container__node", "document-tree-container__node--document"], [1, "node", 3, "click"], ["disabled", "", 1, "node__icon"], ["src", "/assets/img/case-file-view/case-file-view-document.svg", "alt", "Document icon", 1, "node__iconImg"], [1, "node__name", "node-name-document"], [1, "node__document-upload-timestamp"], [1, "node__document-options"], [3, "allowMoving", "changeFolderAction", "openInANewTabAction", "downloadAction", "printAction"], [1, "document-tree-container__node", "document-tree-container__folder"], ["cdkTreeNodeToggle", "", 1, "node"], [1, "node__icon"], ["alt", "Folder icon", 1, "node__iconImg", 3, "src"], [1, "node__count"], [1, "node__name", "node__name--folder"], ["cdkTreeNodeOutlet", ""]], template: function CaseFileViewFolderComponent_Template(rf, ctx) {
23281
+ CaseFileViewFolderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseFileViewFolderComponent, selectors: [["ccd-case-file-view-folder"]], inputs: { categoriesAndDocuments: "categoriesAndDocuments", allowMoving: "allowMoving" }, outputs: { clickedDocument: "clickedDocument", moveDocument: "moveDocument" }, decls: 9, vars: 3, consts: [[1, "document-filter-container"], [1, "form-group", "document-filter", 3, "formGroup"], ["type", "search", "id", "document-search", "name", "documentSearchFormControl", "formControlName", "documentSearchFormControl", "placeholder", "Search by document name", "aria-label", "Search by document name", 1, "form-control", "document-search"], [1, "document-folders-header"], [1, "document-folders-header__title"], [3, "sortAscending", "sortDescending"], ["class", "document-tree-container", 4, "ngIf"], [1, "document-tree-container"], [4, "ngIf"], [3, "dataSource", "treeControl"], ["class", "document-tree-container__node document-tree-container__node--document", 4, "cdkTreeNodeDef"], ["class", "document-tree-container__node document-tree-container__folder", 4, "cdkTreeNodeDef", "cdkTreeNodeDefWhen"], [1, "document-tree-container__node", "document-tree-container__node--document"], [1, "node", 3, "click"], ["disabled", "", 1, "node__icon"], ["src", "/assets/img/case-file-view/case-file-view-document.svg", "alt", "Document icon", 1, "node__iconImg"], [1, "node__name", "node-name-document"], [1, "node__document-upload-timestamp"], [1, "node__document-options"], [3, "allowMoving", "changeFolderAction", "openInANewTabAction", "downloadAction", "printAction"], [1, "document-tree-container__node", "document-tree-container__folder"], ["cdkTreeNodeToggle", "", 1, "node"], [1, "node__icon"], ["alt", "Folder icon", 1, "node__iconImg", 3, "src"], [1, "node__count"], [1, "node__name", "node__name--folder"], ["cdkTreeNodeOutlet", ""]], template: function CaseFileViewFolderComponent_Template(rf, ctx) {
23231
23282
  if (rf & 1) {
23232
23283
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
23233
23284
  i0.ɵɵelement(2, "input", 2);
@@ -23252,7 +23303,7 @@ CaseFileViewFolderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
23252
23303
  (function () {
23253
23304
  (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseFileViewFolderComponent, [{
23254
23305
  type: Component,
23255
- args: [{ selector: 'ccd-case-file-view-folder', template: "<div class=\"document-filter-container\">\n <div class=\"form-group document-filter\" [formGroup]=\"documentFilterFormGroup\">\n <input class=\"form-control document-search\"\n type=\"search\"\n id=\"document-search\"\n name=\"documentSearchFormControl\"\n formControlName=\"documentSearchFormControl\"\n placeholder=\"Search by document name\">\n </div>\n</div>\n\n<div class=\"document-folders-header\">\n <div class=\"document-folders-header__title\">Documents ({{ documentCount }})</div>\n <div>\n <ccd-case-file-view-folder-sort\n (sortAscending)=\"sortDataSourceAscending($event)\"\n (sortDescending)=\"sortDataSourceDescending($event)\"\n ></ccd-case-file-view-folder-sort>\n </div>\n</div>\n\n<div class=\"document-tree-container\" *ngIf=\"documentTreeData\">\n <div *ngIf=\"!nestedDataSource || nestedDataSource.length === 0\">\n No results found\n </div>\n <div>\n <cdk-tree [dataSource]=\"nestedDataSource\" [treeControl]=\"nestedTreeControl\">\n <!-- document -->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__node--document\" *cdkTreeNodeDef=\"let node\">\n <button class=\"node\" (click)=\"selectedNodeItem = node; clickedDocument.emit(node)\"\n [class.node--selected]=\"selectedNodeItem?.name === node.name\">\n <div class=\"node__icon\" disabled>\n <img src=\"/assets/img/case-file-view/case-file-view-document.svg\" class=\"node__iconImg\" alt=\"Document icon\">\n </div>\n <span class=\"node__name node-name-document\">\n {{node.name}}\n <br>\n <span class=\"node__document-upload-timestamp\">{{node.upload_timestamp | date:\"dd MMM YYYY\"}}</span>\n </span>\n <div class=\"node__document-options\">\n <ccd-case-file-view-folder-document-actions\n (changeFolderAction)=\"triggerDocumentAction('changeFolder', node)\"\n (openInANewTabAction)=\"triggerDocumentAction('openInANewTab', node)\"\n (downloadAction)=\"triggerDocumentAction('download', node)\"\n (printAction)=\"triggerDocumentAction('print', node)\"\n [allowMoving]=\"allowMoving\"\n >\n </ccd-case-file-view-folder-document-actions>\n </div>\n </button>\n </cdk-nested-tree-node>\n <!-- folder-->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__folder\" *cdkTreeNodeDef=\"let node; when: nestedChildren\">\n <button class=\"node\" cdkTreeNodeToggle>\n <div class=\"node__icon\" [attr.aria-label]=\"'toggle ' + node.name\" >\n <img class=\"node__iconImg\"\n [src]=\"nestedTreeControl.isExpanded(node) ? '/assets/images/folder-open.png' : '/assets/images/folder.png'\" alt=\"Folder icon\">\n <span class=\"node__count\">{{node.childDocumentCount}}</span>\n </div>\n <span class=\"node__name node__name--folder\">{{node.name}}</span>\n </button>\n\n <div [class.document-tree-invisible]=\"!nestedTreeControl.isExpanded(node)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column}:host .document-tree-container{flex:1 0}.document-filter-container{border-bottom:2px solid #C9C9C9}.document-filter-container .document-filter{padding:10px}.document-filter-container .document-filter .document-search{background:url(/assets/images/icon-search-black.svg) no-repeat right #FFF;background-position-x:calc(100% - 4px);padding-right:30px;width:100%}.document-filter-container .documents-title{height:30%;margin-left:8px;font-weight:700}.document-tree-container{padding:4px;overflow-x:hidden;overflow-y:scroll}.document-tree-container__node{display:block}.document-tree-container__node .document-tree-container__node{padding-left:40px}.document-tree-container .document-tree-invisible{display:none}.document-tree-container::-webkit-scrollbar{width:7px}.document-tree-container::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.document-tree-container::-webkit-scrollbar-button{display:none}.document-tree-container::-webkit-scrollbar-track-piece{background:#EEE}.document-tree-container::-webkit-scrollbar-thumb{background:#CCC}.document-folders-header{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #C9C9C9;padding:10px}.document-folders-header__title{font-weight:700}.node{display:flex;align-items:center;width:100%;padding:10px;background:none;border:0;cursor:pointer;white-space:nowrap}.node--selected{background:#fff2cc}.node__icon{position:relative;display:inline-block}.node__count{color:#fff;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:.875rem;padding-top:4px}.node__iconImg{display:block;height:30px;width:30px}.node__name{margin-left:6px;font-size:1rem;overflow:hidden;text-overflow:ellipsis}.node__document-options{margin-left:auto;margin-right:0}.node__document-upload-timestamp{font-size:.8rem;float:left;padding-left:10px}\n"] }]
23306
+ args: [{ selector: 'ccd-case-file-view-folder', template: "<div class=\"document-filter-container\">\n <div class=\"form-group document-filter\" [formGroup]=\"documentFilterFormGroup\">\n <input class=\"form-control document-search\"\n type=\"search\"\n id=\"document-search\"\n name=\"documentSearchFormControl\"\n formControlName=\"documentSearchFormControl\"\n placeholder=\"Search by document name\"\n aria-label=\"Search by document name\">\n </div>\n</div>\n\n<div class=\"document-folders-header\">\n <div class=\"document-folders-header__title\">Documents ({{ documentCount }})</div>\n <div>\n <ccd-case-file-view-folder-sort\n (sortAscending)=\"sortDataSourceAscending($event)\"\n (sortDescending)=\"sortDataSourceDescending($event)\"\n ></ccd-case-file-view-folder-sort>\n </div>\n</div>\n\n<div class=\"document-tree-container\" *ngIf=\"documentTreeData\">\n <div *ngIf=\"!nestedDataSource || nestedDataSource.length === 0\">\n No results found\n </div>\n <div>\n <cdk-tree [dataSource]=\"nestedDataSource\" [treeControl]=\"nestedTreeControl\">\n <!-- document -->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__node--document\" *cdkTreeNodeDef=\"let node\">\n <button class=\"node\" (click)=\"selectedNodeItem = node; clickedDocument.emit(node)\"\n [class.node--selected]=\"selectedNodeItem?.name === node.name\">\n <div class=\"node__icon\" disabled>\n <img src=\"/assets/img/case-file-view/case-file-view-document.svg\" class=\"node__iconImg\" alt=\"Document icon\">\n </div>\n <span class=\"node__name node-name-document\">\n {{node.name}}\n <br>\n <span class=\"node__document-upload-timestamp\">{{node.upload_timestamp | date:\"dd MMM YYYY\"}}</span>\n </span>\n <div class=\"node__document-options\">\n <ccd-case-file-view-folder-document-actions\n (changeFolderAction)=\"triggerDocumentAction('changeFolder', node)\"\n (openInANewTabAction)=\"triggerDocumentAction('openInANewTab', node)\"\n (downloadAction)=\"triggerDocumentAction('download', node)\"\n (printAction)=\"triggerDocumentAction('print', node)\"\n [allowMoving]=\"allowMoving\"\n >\n </ccd-case-file-view-folder-document-actions>\n </div>\n </button>\n </cdk-nested-tree-node>\n <!-- folder-->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__folder\" *cdkTreeNodeDef=\"let node; when: nestedChildren\">\n <button class=\"node\" cdkTreeNodeToggle>\n <div class=\"node__icon\" [attr.aria-label]=\"'toggle ' + node.name\" >\n <img class=\"node__iconImg\"\n [src]=\"nestedTreeControl.isExpanded(node) ? '/assets/images/folder-open.png' : '/assets/images/folder.png'\" alt=\"Folder icon\">\n <span class=\"node__count\">{{node.childDocumentCount}}</span>\n </div>\n <span class=\"node__name node__name--folder\">{{node.name}}</span>\n </button>\n\n <div [class.document-tree-invisible]=\"!nestedTreeControl.isExpanded(node)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column}:host .document-tree-container{flex:1 0}.document-filter-container{border-bottom:2px solid #C9C9C9}.document-filter-container .document-filter{padding:10px}.document-filter-container .document-filter .document-search{background:url(/assets/images/icon-search-black.svg) no-repeat right #FFF;background-position-x:calc(100% - 4px);padding-right:30px;width:100%}.document-filter-container .documents-title{height:30%;margin-left:8px;font-weight:700}.document-tree-container{padding:4px;overflow-x:hidden;overflow-y:scroll}.document-tree-container__node{display:block}.document-tree-container__node .document-tree-container__node{padding-left:40px}.document-tree-container .document-tree-invisible{display:none}.document-tree-container::-webkit-scrollbar{width:7px}.document-tree-container::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.document-tree-container::-webkit-scrollbar-button{display:none}.document-tree-container::-webkit-scrollbar-track-piece{background:#EEE}.document-tree-container::-webkit-scrollbar-thumb{background:#CCC}.document-folders-header{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #C9C9C9;padding:10px}.document-folders-header__title{font-weight:700}.node{display:flex;align-items:center;width:100%;padding:10px;background:none;border:0;cursor:pointer;white-space:nowrap}.node--selected{background:#fff2cc}.node__icon{position:relative;display:inline-block}.node__count{color:#fff;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:.875rem;padding-top:4px}.node__iconImg{display:block;height:30px;width:30px}.node__name{margin-left:6px;font-size:1rem;overflow:hidden;text-overflow:ellipsis}.node__document-options{margin-left:auto;margin-right:0}.node__document-upload-timestamp{font-size:.8rem;float:left;padding-left:10px}\n"] }]
23256
23307
  }], function () { return [{ type: WindowService }, { type: i1$1.Router }, { type: DocumentManagementService }, { type: i1$3.MatLegacyDialog }, { type: AbstractAppConfig }]; }, { categoriesAndDocuments: [{
23257
23308
  type: Input
23258
23309
  }], allowMoving: [{
@@ -32226,29 +32277,29 @@ function CaseHistoryComponent_div_0_Template(rf, ctx) {
32226
32277
  i0.ɵɵadvance(6);
32227
32278
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(15, 19, "Date"));
32228
32279
  i0.ɵɵadvance(3);
32229
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(18, 21, ctx_r0.caseHistory.event.timestamp));
32280
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(18, 21, ctx_r0.caseHistory.event.timestamp, "local"));
32230
32281
  i0.ɵɵadvance(4);
32231
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(22, 23, "Author"));
32282
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(22, 24, "Author"));
32232
32283
  i0.ɵɵadvance(3);
32233
- i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(25, 25, ctx_r0.caseHistory.event.user_first_name), " ", i0.ɵɵpipeBind1(26, 27, ctx_r0.caseHistory.event.user_last_name), "");
32284
+ i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(25, 26, ctx_r0.caseHistory.event.user_first_name), " ", i0.ɵɵpipeBind1(26, 28, ctx_r0.caseHistory.event.user_last_name), "");
32234
32285
  i0.ɵɵadvance(5);
32235
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(30, 29, "End state"));
32286
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(30, 30, "End state"));
32236
32287
  i0.ɵɵadvance(3);
32237
32288
  i0.ɵɵtextInterpolate(ctx_r0.caseHistory.event.state_name);
32238
32289
  i0.ɵɵadvance(3);
32239
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(36, 31, "Event"));
32290
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(36, 32, "Event"));
32240
32291
  i0.ɵɵadvance(3);
32241
32292
  i0.ɵɵtextInterpolate(ctx_r0.caseHistory.event.event_name);
32242
32293
  i0.ɵɵadvance(3);
32243
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(42, 33, "Summary"));
32294
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(42, 34, "Summary"));
32244
32295
  i0.ɵɵadvance(3);
32245
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(45, 35, ctx_r0.caseHistory.event.summary));
32296
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(45, 36, ctx_r0.caseHistory.event.summary));
32246
32297
  i0.ɵɵadvance(4);
32247
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(49, 37, "Comment"));
32298
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(49, 38, "Comment"));
32248
32299
  i0.ɵɵadvance(3);
32249
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(52, 39, ctx_r0.caseHistory.event.comment));
32300
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(52, 40, ctx_r0.caseHistory.event.comment));
32250
32301
  i0.ɵɵadvance(4);
32251
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(56, 41, "Case Details"));
32302
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(56, 42, "Case Details"));
32252
32303
  i0.ɵɵadvance(2);
32253
32304
  i0.ɵɵproperty("ngForOf", ctx_r0.tabs);
32254
32305
  }
@@ -32304,7 +32355,7 @@ CaseHistoryComponent.ERROR_MESSAGE = 'No case history to show';
32304
32355
  CaseHistoryComponent.ɵfac = function CaseHistoryComponent_Factory(t) { return new (t || CaseHistoryComponent)(i0.ɵɵdirectiveInject(i1$1.ActivatedRoute), i0.ɵɵdirectiveInject(AlertService), i0.ɵɵdirectiveInject(OrderService), i0.ɵɵdirectiveInject(CaseNotifier), i0.ɵɵdirectiveInject(CaseHistoryService)); };
32305
32356
  CaseHistoryComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseHistoryComponent, selectors: [["ccd-case-history"]], inputs: { event: "event" }, decls: 1, vars: 1, consts: [[4, "ngIf"], [1, "grid-row"], [1, "column-full"], [3, "caseDetails"], [1, "heading-h2"], ["aria-describedby", "event details table", 1, "EventDetails"], [4, "ngFor", "ngForOf"], [1, "caseHistorySection"], [1, "heading-h3"], [1, "CaseHistory", 3, "id"], ["ccdLabelSubstitutor", "", 3, "caseField", "contextFields", "hidden"], [3, "ngSwitch"], [4, "ngSwitchCase"], ["class", "compound-field", 4, "ngSwitchCase"], ["id", "case-viewer-label-header"], [1, "case-viewer-label"], [3, "caseField", "caseReference"], [1, "compound-field"], ["colspan", "2"]], template: function CaseHistoryComponent_Template(rf, ctx) {
32306
32357
  if (rf & 1) {
32307
- i0.ɵɵtemplate(0, CaseHistoryComponent_div_0_Template, 58, 43, "div", 0);
32358
+ i0.ɵɵtemplate(0, CaseHistoryComponent_div_0_Template, 58, 44, "div", 0);
32308
32359
  }
32309
32360
  if (rf & 2) {
32310
32361
  i0.ɵɵproperty("ngIf", ctx.isDataLoaded());
@@ -32313,7 +32364,7 @@ CaseHistoryComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseHi
32313
32364
  (function () {
32314
32365
  (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseHistoryComponent, [{
32315
32366
  type: Component,
32316
- args: [{ selector: 'ccd-case-history', template: "<div *ngIf=\"isDataLoaded()\">\n <div class=\"grid-row\">\n <div class=\"column-full\">\n <ccd-case-header [caseDetails]=\"caseDetails\"></ccd-case-header>\n </div>\n </div>\n <div class=\"grid-row\">\n <div class=\"column-full\">\n <div>\n <h2 class=\"heading-h2\">{{'Event Details' | rpxTranslate}}</h2>\n <table class=\"EventDetails\" aria-describedby=\"event details table\">\n <tbody>\n <tr>\n <th>{{'Date' | rpxTranslate}}</th>\n <td>{{caseHistory.event.timestamp | ccdDate}}</td>\n </tr>\n <tr>\n <th>{{'Author' | rpxTranslate}}</th>\n <td>{{caseHistory.event.user_first_name | titlecase}} {{caseHistory.event.user_last_name | uppercase}}</td>\n </tr>\n <tr>\n <th>{{'End state' | rpxTranslate}}</th>\n <td>{{caseHistory.event.state_name}}</td>\n </tr>\n <tr>\n <th>{{'Event' | rpxTranslate}}</th>\n <td>{{caseHistory.event.event_name}}</td>\n </tr>\n <tr>\n <th>{{'Summary' | rpxTranslate}}</th>\n <td>{{caseHistory.event.summary | ccdDash}}</td>\n </tr>\n <tr>\n <th>{{'Comment' | rpxTranslate}}</th>\n <td>{{caseHistory.event.comment | ccdDash}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n <div>\n <h2 class=\"heading-h2\">{{'Case Details' | rpxTranslate}}</h2>\n <ng-container *ngFor=\"let tab of tabs\">\n <div class=\"caseHistorySection\">\n <h3 class=\"heading-h3\">{{tab.label}}</h3>\n <table class=\"CaseHistory\" id=\"{{tab.id}}\" [attr.aria-describedby]=\"'case history table' | rpxTranslate\">\n <ng-container *ngFor=\"let field of tab | ccdTabFields | ccdReadFieldsFilter:false :undefined :true\">\n <div ccdLabelSubstitutor [caseField]=\"field\" [contextFields]=\"tab.fields\" [hidden]=\"field.hidden\">\n <ng-container [ngSwitch]=\"!(field | ccdIsCompound)\">\n <tr *ngSwitchCase=\"true\">\n <th id=\"case-viewer-label-header\">\n <div class=\"case-viewer-label\">{{field.label}}</div>\n </th>\n <td>\n <ccd-field-read [caseField]=\"field\" [caseReference]=\"caseHistory.case_id\"></ccd-field-read>\n </td>\n </tr>\n <tr *ngSwitchCase=\"false\" class=\"compound-field\">\n <td colspan=\"2\">\n <ccd-field-read [caseField]=\"field\" [caseReference]=\"caseHistory.case_id\"></ccd-field-read>\n </td>\n </tr>\n </ng-container>\n </div>\n </ng-container>\n </table>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [".CaseHistory th,.CaseHistory td{border-bottom:none}.caseHistorySection{margin-top:40px}.EventDetails th,.EventDetails td{border-bottom:none}th{width:1%;white-space:nowrap;vertical-align:top}.compound-field td{padding:0}.case-viewer-controls{margin-top:47px;margin-bottom:20px}ccd-case-header{float:left;margin-right:10px}ccd-event-trigger{float:right}.case-viewer-label{min-width:300px;white-space:normal}\n"] }]
32367
+ args: [{ selector: 'ccd-case-history', template: "<div *ngIf=\"isDataLoaded()\">\n <div class=\"grid-row\">\n <div class=\"column-full\">\n <ccd-case-header [caseDetails]=\"caseDetails\"></ccd-case-header>\n </div>\n </div>\n <div class=\"grid-row\">\n <div class=\"column-full\">\n <div>\n <h2 class=\"heading-h2\">{{'Event Details' | rpxTranslate}}</h2>\n <table class=\"EventDetails\" aria-describedby=\"event details table\">\n <tbody>\n <tr>\n <th>{{'Date' | rpxTranslate}}</th>\n <td>{{caseHistory.event.timestamp | ccdDate : 'local'}}</td>\n </tr>\n <tr>\n <th>{{'Author' | rpxTranslate}}</th>\n <td>{{caseHistory.event.user_first_name | titlecase}} {{caseHistory.event.user_last_name | uppercase}}</td>\n </tr>\n <tr>\n <th>{{'End state' | rpxTranslate}}</th>\n <td>{{caseHistory.event.state_name}}</td>\n </tr>\n <tr>\n <th>{{'Event' | rpxTranslate}}</th>\n <td>{{caseHistory.event.event_name}}</td>\n </tr>\n <tr>\n <th>{{'Summary' | rpxTranslate}}</th>\n <td>{{caseHistory.event.summary | ccdDash}}</td>\n </tr>\n <tr>\n <th>{{'Comment' | rpxTranslate}}</th>\n <td>{{caseHistory.event.comment | ccdDash}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n <div>\n <h2 class=\"heading-h2\">{{'Case Details' | rpxTranslate}}</h2>\n <ng-container *ngFor=\"let tab of tabs\">\n <div class=\"caseHistorySection\">\n <h3 class=\"heading-h3\">{{tab.label}}</h3>\n <table class=\"CaseHistory\" id=\"{{tab.id}}\" [attr.aria-describedby]=\"'case history table' | rpxTranslate\">\n <ng-container *ngFor=\"let field of tab | ccdTabFields | ccdReadFieldsFilter:false :undefined :true\">\n <div ccdLabelSubstitutor [caseField]=\"field\" [contextFields]=\"tab.fields\" [hidden]=\"field.hidden\">\n <ng-container [ngSwitch]=\"!(field | ccdIsCompound)\">\n <tr *ngSwitchCase=\"true\">\n <th id=\"case-viewer-label-header\">\n <div class=\"case-viewer-label\">{{field.label}}</div>\n </th>\n <td>\n <ccd-field-read [caseField]=\"field\" [caseReference]=\"caseHistory.case_id\"></ccd-field-read>\n </td>\n </tr>\n <tr *ngSwitchCase=\"false\" class=\"compound-field\">\n <td colspan=\"2\">\n <ccd-field-read [caseField]=\"field\" [caseReference]=\"caseHistory.case_id\"></ccd-field-read>\n </td>\n </tr>\n </ng-container>\n </div>\n </ng-container>\n </table>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n", styles: [".CaseHistory th,.CaseHistory td{border-bottom:none}.caseHistorySection{margin-top:40px}.EventDetails th,.EventDetails td{border-bottom:none}th{width:1%;white-space:nowrap;vertical-align:top}.compound-field td{padding:0}.case-viewer-controls{margin-top:47px;margin-bottom:20px}ccd-case-header{float:left;margin-right:10px}ccd-event-trigger{float:right}.case-viewer-label{min-width:300px;white-space:normal}\n"] }]
32317
32368
  }], function () { return [{ type: i1$1.ActivatedRoute }, { type: AlertService }, { type: OrderService }, { type: CaseNotifier }, { type: CaseHistoryService }]; }, { event: [{
32318
32369
  type: Input
32319
32370
  }] });
@@ -33515,7 +33566,7 @@ function CaseFullAccessViewComponent_ng_container_12_mat_tab_4_ng_template_2_Tem
33515
33566
  const tab_r20 = i0.ɵɵnextContext().$implicit;
33516
33567
  const ctx_r22 = i0.ɵɵnextContext(2);
33517
33568
  i0.ɵɵclassMap(tab_r20.id);
33518
- i0.ɵɵattribute("aria-describedby", i0.ɵɵpipeBind1(1, 4, "case viewer table"));
33569
+ i0.ɵɵattribute("aria-label", i0.ɵɵpipeBind1(1, 4, "case viewer table"));
33519
33570
  i0.ɵɵadvance(3);
33520
33571
  i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBindV(4, 6, i0.ɵɵpureFunction2(14, _c1$3, i0.ɵɵpipeBind1(5, 12, tab_r20), ctx_r22.formGroup.controls["data"])));
33521
33572
  }
@@ -33999,7 +34050,7 @@ CaseFullAccessViewComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
33999
34050
  (function () {
34000
34051
  (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseFullAccessViewComponent, [{
34001
34052
  type: Component,
34002
- args: [{ selector: 'ccd-case-full-access-view', template: "<!-- Generic error heading and error message to be displayed only if there are no specific callback errors or warnings, or no error details -->\n<div *ngIf=\"error && !(error.callbackErrors || error.callbackWarnings || error.details)\" class=\"error-summary\"\n role=\"group\" aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h1 class=\"heading-h1 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'Something went wrong' | rpxTranslate}}\n </h1>\n <div class=\"govuk-error-summary__body\" id=\"edit-case-event_error-summary-body\">\n <p>{{\"We're working to fix the problem. Try again shortly.\" | rpxTranslate}}</p>\n <p>\n <a href=\"get-help\" target=\"_blank\">\n {{\"Contact us\" | rpxTranslate}}</a> {{\"if you're still having problems.\" | rpxTranslate}}\n </p>\n </div>\n</div>\n<!-- Callback error heading and error message to be displayed if there are specific error details -->\n<div *ngIf=\"error && error.details\" class=\"error-summary\" role=\"group\"\n aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-h2 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'The callback data failed validation' | rpxTranslate}}\n </h2>\n <p>{{error.message | rpxTranslate}}</p>\n <ul *ngIf=\"error.details?.field_errors\" class=\"error-summary-list\">\n <li *ngFor=\"let fieldError of error.details.field_errors\">\n {{fieldError.message | rpxTranslate}}\n </li>\n </ul>\n</div>\n<ccd-callback-errors\n [triggerTextContinue]=\"triggerTextStart\"\n [triggerTextIgnore]=\"triggerTextIgnoreWarnings\"\n [callbackErrorsSubject]=\"callbackErrorsSubject\"\n (callbackErrorsContext)=\"callbackErrorsNotify($event)\">\n</ccd-callback-errors>\n<ccd-activity [caseId]=\"caseDetails.case_id\" [displayMode]=\"BANNER\"></ccd-activity>\n<div class=\"grid-row\">\n <div class=\"column-one-half\">\n <ccd-case-header [caseDetails]=\"caseDetails\"></ccd-case-header>\n <div class=\"case-viewer-controls\" *ngIf=\"hasPrint && !isDraft() && isPrintEnabled()\">\n <a id=\"case-viewer-control-print\" routerLink=\"print\" class=\"button button-secondary\">{{'Print' | rpxTranslate}}</a>\n </div>\n </div>\n <div *ngIf=\"hasEventSelector\" class=\"column-one-half\">\n <ccd-event-trigger [isDisabled]=\"isTriggerButtonDisabled()\" [triggers]=\"caseDetails.triggers\"\n [triggerText]=\"triggerText\" (onTriggerChange)=\"clearErrorsAndWarnings()\"\n (onTriggerSubmit)=\"applyTrigger($event)\"></ccd-event-trigger>\n </div>\n</div>\n<div class=\"grid-row\" *ngIf=\"activeCaseFlags && !caseFlagsExternalUser\">\n <div class=\"column-full\">\n <ccd-notification-banner [notificationBannerConfig]=\"notificationBannerConfig\" (linkClicked)=\"onLinkClicked($event)\">\n </ccd-notification-banner>\n </div>\n</div>\n<div class=\"grid-row\">\n <div class=\"column-full\">\n <ng-container *ngIf=\"hasTabsPresent()\">\n <mat-tab-group #tabGroup animationDuration=\"0ms\" (selectedIndexChange)=\"tabChanged($event)\" [disableRipple]=\"true\"\n [selectedIndex]=\"selectedTabIndex\">\n <mat-tab *ngFor=\"let tab of prependedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n <mat-tab *ngFor=\"let tab of sortedTabs; let curIdx=index\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n <ng-template matTabContent>\n <table [class]=\"tab.id\" [attr.aria-describedby]=\"'case viewer table' | rpxTranslate\">\n <tbody>\n <ng-container *ngFor=\"let field of tab | ccdTabFields | ccdReadFieldsFilter:false :undefined :true : formGroup.controls['data']\">\n <div ccdLabelSubstitutor [caseField]=\"field\" [contextFields]=\"caseFields\" [hidden]=\"field.hidden\">\n <ng-container [ngSwitch]=\"!(field | ccdIsCompound)\">\n <tr *ngSwitchCase=\"true\">\n <th id=\"case-viewer-field-label\" *ngIf=\"!isFieldToHaveNoLabel(field)\">\n <div class=\"case-viewer-label text-16\">\n {{field.label | rpxTranslate}}</div>\n </th>\n <td [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </td>\n </tr>\n <tr *ngSwitchCase=\"false\" class=\"compound-field\">\n <th [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </th>\n </tr>\n </ng-container>\n </div>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n </mat-tab>\n <mat-tab *ngFor=\"let tab of appendedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n </mat-tab-group>\n <router-outlet *ngIf=\"(prependedTabs && prependedTabs.length) || (appendedTabs && appendedTabs.length)\"></router-outlet>\n </ng-container>\n </div>\n</div>\n", styles: ["th{width:1%;white-space:nowrap;vertical-align:top}.compound-field th{padding:0}.case-viewer-controls{margin-top:47px;margin-bottom:20px}ccd-case-header{float:left;margin-right:10px}ccd-event-trigger{float:right}.case-viewer-label{min-width:300px;white-space:normal}.markdown h3{margin-bottom:0}\n"] }]
34053
+ args: [{ selector: 'ccd-case-full-access-view', template: "<!-- Generic error heading and error message to be displayed only if there are no specific callback errors or warnings, or no error details -->\n<div *ngIf=\"error && !(error.callbackErrors || error.callbackWarnings || error.details)\" class=\"error-summary\"\n role=\"group\" aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h1 class=\"heading-h1 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'Something went wrong' | rpxTranslate}}\n </h1>\n <div class=\"govuk-error-summary__body\" id=\"edit-case-event_error-summary-body\">\n <p>{{\"We're working to fix the problem. Try again shortly.\" | rpxTranslate}}</p>\n <p>\n <a href=\"get-help\" target=\"_blank\">\n {{\"Contact us\" | rpxTranslate}}</a> {{\"if you're still having problems.\" | rpxTranslate}}\n </p>\n </div>\n</div>\n<!-- Callback error heading and error message to be displayed if there are specific error details -->\n<div *ngIf=\"error && error.details\" class=\"error-summary\" role=\"group\"\n aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-h2 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'The callback data failed validation' | rpxTranslate}}\n </h2>\n <p>{{error.message | rpxTranslate}}</p>\n <ul *ngIf=\"error.details?.field_errors\" class=\"error-summary-list\">\n <li *ngFor=\"let fieldError of error.details.field_errors\">\n {{fieldError.message | rpxTranslate}}\n </li>\n </ul>\n</div>\n<ccd-callback-errors\n [triggerTextContinue]=\"triggerTextStart\"\n [triggerTextIgnore]=\"triggerTextIgnoreWarnings\"\n [callbackErrorsSubject]=\"callbackErrorsSubject\"\n (callbackErrorsContext)=\"callbackErrorsNotify($event)\">\n</ccd-callback-errors>\n<ccd-activity [caseId]=\"caseDetails.case_id\" [displayMode]=\"BANNER\"></ccd-activity>\n<div class=\"grid-row\">\n <div class=\"column-one-half\">\n <ccd-case-header [caseDetails]=\"caseDetails\"></ccd-case-header>\n <div class=\"case-viewer-controls\" *ngIf=\"hasPrint && !isDraft() && isPrintEnabled()\">\n <a id=\"case-viewer-control-print\" routerLink=\"print\" class=\"button button-secondary\">{{'Print' | rpxTranslate}}</a>\n </div>\n </div>\n <div *ngIf=\"hasEventSelector\" class=\"column-one-half\">\n <ccd-event-trigger [isDisabled]=\"isTriggerButtonDisabled()\" [triggers]=\"caseDetails.triggers\"\n [triggerText]=\"triggerText\" (onTriggerChange)=\"clearErrorsAndWarnings()\"\n (onTriggerSubmit)=\"applyTrigger($event)\"></ccd-event-trigger>\n </div>\n</div>\n<div class=\"grid-row\" *ngIf=\"activeCaseFlags && !caseFlagsExternalUser\">\n <div class=\"column-full\">\n <ccd-notification-banner [notificationBannerConfig]=\"notificationBannerConfig\" (linkClicked)=\"onLinkClicked($event)\">\n </ccd-notification-banner>\n </div>\n</div>\n<div class=\"grid-row\">\n <div class=\"column-full\">\n <ng-container *ngIf=\"hasTabsPresent()\">\n <mat-tab-group #tabGroup animationDuration=\"0ms\" (selectedIndexChange)=\"tabChanged($event)\" [disableRipple]=\"true\"\n [selectedIndex]=\"selectedTabIndex\">\n <mat-tab *ngFor=\"let tab of prependedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n <mat-tab *ngFor=\"let tab of sortedTabs; let curIdx=index\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n <ng-template matTabContent>\n <table [class]=\"tab.id\" [attr.aria-label]=\"'case viewer table' | rpxTranslate\">\n <tbody>\n <ng-container *ngFor=\"let field of tab | ccdTabFields | ccdReadFieldsFilter:false :undefined :true : formGroup.controls['data']\">\n <div ccdLabelSubstitutor [caseField]=\"field\" [contextFields]=\"caseFields\" [hidden]=\"field.hidden\">\n <ng-container [ngSwitch]=\"!(field | ccdIsCompound)\">\n <tr *ngSwitchCase=\"true\">\n <th id=\"case-viewer-field-label\" *ngIf=\"!isFieldToHaveNoLabel(field)\">\n <div class=\"case-viewer-label text-16\">\n {{field.label | rpxTranslate}}</div>\n </th>\n <td [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </td>\n </tr>\n <tr *ngSwitchCase=\"false\" class=\"compound-field\">\n <th [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </th>\n </tr>\n </ng-container>\n </div>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n </mat-tab>\n <mat-tab *ngFor=\"let tab of appendedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n </mat-tab-group>\n <router-outlet *ngIf=\"(prependedTabs && prependedTabs.length) || (appendedTabs && appendedTabs.length)\"></router-outlet>\n </ng-container>\n </div>\n</div>\n", styles: ["th{width:1%;white-space:nowrap;vertical-align:top}.compound-field th{padding:0}.case-viewer-controls{margin-top:47px;margin-bottom:20px}ccd-case-header{float:left;margin-right:10px}ccd-event-trigger{float:right}.case-viewer-label{min-width:300px;white-space:normal}.markdown h3{margin-bottom:0}\n"] }]
34003
34054
  }], function () { return [{ type: i0.NgZone }, { type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: NavigationNotifierService }, { type: OrderService }, { type: ActivityPollingService }, { type: i1$3.MatLegacyDialog }, { type: AlertService }, { type: DraftService }, { type: ErrorNotifierService }, { type: ConvertHrefToRouterService }, { type: i4.Location }, { type: i0.ChangeDetectorRef }, { type: SessionStorageService }, { type: i1.RpxTranslatePipe }]; }, { hasPrint: [{
34004
34055
  type: Input
34005
34056
  }], hasEventSelector: [{