alimetry-detail-edit 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # DetailEdit
2
+
3
+ ## Use Details
4
+
5
+ Selector: `lib-detail-edit`
6
+
7
+ ### Config Object
8
+
9
+ {
10
+ owners: User[],
11
+ deviceDataModelId,
12
+ currentUser: User
13
+ }
14
+
15
+ [NOTE:] the widget relies on the owner's user object containing the `userId` and `dateOfBirth` fields, and the current user's object containing the `emailAddress` field.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpbWV0cnktZGV0YWlsLWVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvYWxpbWV0cnktZGV0YWlsLWVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,150 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
3
+ import { forkJoin, tap } from 'rxjs';
4
+ import { getAge, globaliseDateTime, localiseDateTime, shallowCompare } from './utils';
5
+ import { dateComparison, withinNYears, withinNHours, translateError } from './validators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "shared";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "./entries.pipe";
11
+ const appDataPropertySetId = '34d46477-ad4b-47b4-b555-06358b92f60c';
12
+ const deviceDataPropertySetId = '7a32d851-5e89-46a6-a4b6-cca162dace29';
13
+ const propertyCodes = ['RecordingSession', 'Status', 'UserDetailChangeLog'];
14
+ export class DetailEditComponent {
15
+ constructor(shared) {
16
+ this.shared = shared;
17
+ this.status = 'loading';
18
+ this.formGroup = new FormGroup({
19
+ dob: new FormControl('', [Validators.required, withinNYears(120, 'before')]),
20
+ height: new FormControl(0, [Validators.required, Validators.min(30), Validators.max(272)]),
21
+ weight: new FormControl(0, [Validators.required, Validators.min(1), Validators.max(635)]),
22
+ mealStart: new FormControl('', [Validators.required]),
23
+ mealEnd: new FormControl('', [Validators.required])
24
+ }, [
25
+ dateComparison('mealEnd', 'mealStart', 'after'),
26
+ dateComparison('mealStart', 'dob', 'after'),
27
+ ]);
28
+ }
29
+ parseInputErrors(name, control) {
30
+ return translateError(name, control);
31
+ }
32
+ // make sure than modifications that don't actually differ from the current are marked as such
33
+ monitorFormChanges() {
34
+ this.formGroup.valueChanges.subscribe(current => {
35
+ if (shallowCompare(current, this.initialFormState)) {
36
+ this.formGroup.markAsPristine();
37
+ }
38
+ });
39
+ }
40
+ // handle the relevant data from the response body
41
+ extractFields(recordingSession) {
42
+ const { patient, mealStart, mealEnd, recordingStart } = recordingSession;
43
+ this.recordingStart = recordingStart;
44
+ return {
45
+ dob: this.config.owners[0].dateOfBirth,
46
+ height: patient.height,
47
+ weight: patient.weight,
48
+ mealStart: localiseDateTime(mealStart),
49
+ mealEnd: localiseDateTime(mealEnd)
50
+ };
51
+ }
52
+ initialiseForm(state) {
53
+ this.formGroup.patchValue(state);
54
+ this.formGroup.markAsPristine();
55
+ this.formGroup.get('mealStart').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));
56
+ this.formGroup.get('mealEnd').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));
57
+ this.initialFormState = state; // save this for use in resets
58
+ this.monitorFormChanges();
59
+ }
60
+ // construct a patch object for the save request
61
+ integrateFields(mods, recordingSession) {
62
+ const { patient } = recordingSession;
63
+ patient.height = mods.height;
64
+ patient.weight = mods.weight;
65
+ patient.age = getAge(mods.dob);
66
+ recordingSession.mealStart = globaliseDateTime(mods.mealStart);
67
+ recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);
68
+ this.appendChangeLog(mods);
69
+ return {
70
+ 'Age': patient.age,
71
+ 'RecordingSession': JSON.stringify(recordingSession),
72
+ 'UserDetailChangeLog': this.detailChangeLog
73
+ };
74
+ }
75
+ postDeviceData(devicePropertySetId, data) {
76
+ return this.shared.saveDeviceData(this.config.deviceDataModelId, this.deviceDataId, devicePropertySetId, this.config.owners[0].userId, data);
77
+ }
78
+ // patch the device data record with the modifications
79
+ saveModifications() {
80
+ const mods = this.formGroup.getRawValue();
81
+ const patchedDeviceData = this.integrateFields(mods, this.recordingSession);
82
+ const patchedUserData = Object.assign(this.config.owners[0], { dateOfBirth: mods.dob });
83
+ this.status = 'sending';
84
+ forkJoin([
85
+ this.postDeviceData(appDataPropertySetId, patchedDeviceData),
86
+ this.shared.updateUser(this.config.owners[0].userId, patchedUserData)
87
+ ]).pipe(tap(() => this.regenReport())).subscribe();
88
+ }
89
+ appendChangeLog(mods) {
90
+ const prevChangeLog = {};
91
+ const newChangeLog = {};
92
+ // Only include fields that have changed
93
+ for (const key in mods) {
94
+ if (this.initialFormState[key] !== mods[key]) {
95
+ prevChangeLog[key] = this.initialFormState[key];
96
+ newChangeLog[key] = mods[key];
97
+ }
98
+ }
99
+ const changeLog = {
100
+ author: this.config.currentUser.emailAddress,
101
+ prevChangeLog: prevChangeLog,
102
+ newChangeLog: newChangeLog,
103
+ timestamp: new Date().toISOString()
104
+ };
105
+ this.detailChangeLog.push(changeLog);
106
+ }
107
+ // get the device data record and initialise the form
108
+ loadDeviceData() {
109
+ this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0].userId, propertyCodes).subscribe({
110
+ next: (res) => {
111
+ this.deviceDataId = res.deviceDataId;
112
+ this.recordingSession = JSON.parse(res.data['RecordingSession'].value);
113
+ this.initialiseForm(this.extractFields(this.recordingSession));
114
+ // checking for undefined in case no changes have been logged yet
115
+ this.detailChangeLog = res.data['UserDetailChangeLog'] === undefined ? [] : res.data['UserDetailChangeLog'].value;
116
+ this.status = res.data['Status']?.value === 'Generating Report' ?
117
+ 'generating' :
118
+ 'success';
119
+ },
120
+ error: (err) => {
121
+ console.error(err);
122
+ this.status = "error";
123
+ }
124
+ });
125
+ }
126
+ regenReport() {
127
+ this.postDeviceData(deviceDataPropertySetId, { 'Algorithmhasrun': false, 'AlgorithmRun': true }).subscribe(() => {
128
+ this.status = 'generating'; // assume report starts generating immediately
129
+ });
130
+ }
131
+ resetModifications() {
132
+ this.formGroup.patchValue(this.initialFormState);
133
+ }
134
+ ngOnInit() {
135
+ if (!this.config?.owners?.[0]?.userId) {
136
+ this.status = 'nouser';
137
+ return;
138
+ }
139
+ this.loadDeviceData();
140
+ }
141
+ }
142
+ DetailEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditComponent, deps: [{ token: i1.SharedService }], target: i0.ɵɵFactoryTarget.Component });
143
+ DetailEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DetailEditComponent, selector: "lib-detail-edit", inputs: { config: "config" }, ngImport: i0, template: "<div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the details.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <form *ngIf=\"status !== 'error' && status !== 'nouser'\" [formGroup]=\"formGroup\" (ngSubmit)=\"saveModifications()\">\n <div class=\"inputs\">\n <div class=\"form-row\">\n <label for=\"dob\">Date of Birth:</label>\n <input id=\"dob\" type=\"date\" formControlName=\"dob\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"weight\">Patient Weight (kg):</label>\n <input id=\"weight\" type=\"number\" formControlName=\"weight\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"height\">Patient Height (cm):</label>\n <input id=\"height\" type=\"number\" formControlName=\"height\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealStart\">Meal Start Time:</label>\n <input id=\"mealStart\" type=\"datetime-local\" formControlName=\"mealStart\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealEnd\">Meal End Time:</label>\n <input id=\"mealEnd\" type=\"datetime-local\" formControlName=\"mealEnd\">\n </div>\n </div>\n\n <div *ngIf=\"!formGroup.valid && formGroup.dirty\" class=\"errors\">\n <div *ngFor=\"let control of formGroup.controls | entries\">\n {{ parseInputErrors(control[0], control[1]) }}\n </div>\n </div>\n\n <div *ngIf=\"status === 'generating'\" class=\"info\">\n <div>The report is generating at the moment, check back later if you need to modify this entry.</div>\n </div>\n\n <div class=\"buttons\">\n <button type=\"button\" (click)=\"regenReport()\" [disabled]=\"status === 'sending' || status === 'generating' || status === 'loading'\">Regenerate Report</button>\n <button type=\"button\" (click)=\"resetModifications()\" [disabled]=\"status === 'sending' || status === 'generating' || formGroup.pristine\">Cancel Modification</button>\n <button type=\"submit\" [disabled]=\"status === 'sending' || status === 'generating' || !formGroup.valid || formGroup.pristine\">Save Details</button>\n </div>\n </form>\n</div>\n", styles: [".wrapper{width:100%;height:100%}.status{font-size:2rem;margin:5rem auto;text-align:center}form{display:flex;flex-direction:column;padding:2rem;gap:2rem;font-size:.9rem;max-width:70rem;margin:0 auto}form .inputs{display:flex;flex-flow:row wrap;gap:1rem 3rem}form .inputs .form-row{display:flex;gap:1rem;align-items:center;flex:1 0 calc(50% - 3rem);min-width:400px}form .inputs .form-row label{min-width:9rem}form .inputs .form-row input{background:#f5f5f6;height:36px;border:none;padding-inline:10px;flex-grow:1}form.ng-dirty .form-row .ng-invalid{outline:1px auto red}form .buttons{display:flex;gap:1rem}form .buttons button{padding:.5rem 1rem;height:36px;border:none;font-size:inherit;background:#f5f5f6}form .buttons button:not([disabled]){cursor:pointer}form .buttons button[type=submit]{background:#242C69;color:#fff}form .buttons button[disabled]{background:#fafafa;cursor:not-allowed}form .buttons button[type=submit][disabled]{background:#444C89}form .buttons button:first-child{margin-right:auto}.errors{padding:1rem;background:#fee;border:2px solid red;border-radius:4px;color:red}.info{padding:1rem;background:#eef;border:2px solid #242C69;border-radius:4px;color:#242c69}\n"], dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.EntriesPipe, name: "entries" }] });
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditComponent, decorators: [{
145
+ type: Component,
146
+ args: [{ selector: 'lib-detail-edit', template: "<div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the details.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <form *ngIf=\"status !== 'error' && status !== 'nouser'\" [formGroup]=\"formGroup\" (ngSubmit)=\"saveModifications()\">\n <div class=\"inputs\">\n <div class=\"form-row\">\n <label for=\"dob\">Date of Birth:</label>\n <input id=\"dob\" type=\"date\" formControlName=\"dob\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"weight\">Patient Weight (kg):</label>\n <input id=\"weight\" type=\"number\" formControlName=\"weight\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"height\">Patient Height (cm):</label>\n <input id=\"height\" type=\"number\" formControlName=\"height\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealStart\">Meal Start Time:</label>\n <input id=\"mealStart\" type=\"datetime-local\" formControlName=\"mealStart\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealEnd\">Meal End Time:</label>\n <input id=\"mealEnd\" type=\"datetime-local\" formControlName=\"mealEnd\">\n </div>\n </div>\n\n <div *ngIf=\"!formGroup.valid && formGroup.dirty\" class=\"errors\">\n <div *ngFor=\"let control of formGroup.controls | entries\">\n {{ parseInputErrors(control[0], control[1]) }}\n </div>\n </div>\n\n <div *ngIf=\"status === 'generating'\" class=\"info\">\n <div>The report is generating at the moment, check back later if you need to modify this entry.</div>\n </div>\n\n <div class=\"buttons\">\n <button type=\"button\" (click)=\"regenReport()\" [disabled]=\"status === 'sending' || status === 'generating' || status === 'loading'\">Regenerate Report</button>\n <button type=\"button\" (click)=\"resetModifications()\" [disabled]=\"status === 'sending' || status === 'generating' || formGroup.pristine\">Cancel Modification</button>\n <button type=\"submit\" [disabled]=\"status === 'sending' || status === 'generating' || !formGroup.valid || formGroup.pristine\">Save Details</button>\n </div>\n </form>\n</div>\n", styles: [".wrapper{width:100%;height:100%}.status{font-size:2rem;margin:5rem auto;text-align:center}form{display:flex;flex-direction:column;padding:2rem;gap:2rem;font-size:.9rem;max-width:70rem;margin:0 auto}form .inputs{display:flex;flex-flow:row wrap;gap:1rem 3rem}form .inputs .form-row{display:flex;gap:1rem;align-items:center;flex:1 0 calc(50% - 3rem);min-width:400px}form .inputs .form-row label{min-width:9rem}form .inputs .form-row input{background:#f5f5f6;height:36px;border:none;padding-inline:10px;flex-grow:1}form.ng-dirty .form-row .ng-invalid{outline:1px auto red}form .buttons{display:flex;gap:1rem}form .buttons button{padding:.5rem 1rem;height:36px;border:none;font-size:inherit;background:#f5f5f6}form .buttons button:not([disabled]){cursor:pointer}form .buttons button[type=submit]{background:#242C69;color:#fff}form .buttons button[disabled]{background:#fafafa;cursor:not-allowed}form .buttons button[type=submit][disabled]{background:#444C89}form .buttons button:first-child{margin-right:auto}.errors{padding:1rem;background:#fee;border:2px solid red;border-radius:4px;color:red}.info{padding:1rem;background:#eef;border:2px solid #242C69;border-radius:4px;color:#242c69}\n"] }]
147
+ }], ctorParameters: function () { return [{ type: i1.SharedService }]; }, propDecorators: { config: [{
148
+ type: Input
149
+ }] } });
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9kZXRhaWwtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL2RldGFpbC1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFhLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7QUFFMUYsTUFBTSxvQkFBb0IsR0FBRyxzQ0FBc0MsQ0FBQztBQUNwRSxNQUFNLHVCQUF1QixHQUFHLHNDQUFzQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFNNUUsTUFBTSxPQUFPLG1CQUFtQjtJQXVCOUIsWUFBb0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXBCekMsV0FBTSxHQUEwRSxTQUFTLENBQUM7UUFTMUYsY0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3hCLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUs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QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxjQUFjLENBQ2pCLHVCQUF1QixFQUN2QixFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQ25ELENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsOENBQThDO1FBQzVFLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN2QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7aUhBOUtVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLHFGQ2ZoQywwd0VBb0RBOzRGRHJDYSxtQkFBbUI7a0JBSi9CLFNBQVM7K0JBQ0UsaUJBQWlCO29HQUlsQixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbmZpZywgU2hhcmVkU2VydmljZSB9IGZyb20gJ3NoYXJlZCc7XG5pbXBvcnQgeyBnZXRBZ2UsIGdsb2JhbGlzZURhdGVUaW1lLCBsb2NhbGlzZURhdGVUaW1lLCBzaGFsbG93Q29tcGFyZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZGF0ZUNvbXBhcmlzb24sIHdpdGhpbk5ZZWFycywgd2l0aGluTkhvdXJzLCB0cmFuc2xhdGVFcnJvciB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5cbmNvbnN0IGFwcERhdGFQcm9wZXJ0eVNldElkID0gJzM0ZDQ2NDc3LWFkNGItNDdiNC1iNTU1LTA2MzU4YjkyZjYwYyc7XG5jb25zdCBkZXZpY2VEYXRhUHJvcGVydHlTZXRJZCA9ICc3YTMyZDg1MS01ZTg5LTQ2YTYtYTRiNi1jY2ExNjJkYWNlMjknO1xuY29uc3QgcHJvcGVydHlDb2RlcyA9IFsnUmVjb3JkaW5nU2Vzc2lvbicsICdTdGF0dXMnLCAnVXNlckRldGFpbENoYW5nZUxvZyddO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGV0YWlsLWVkaXQnLCB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtZWRpdC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGV0YWlsRWRpdENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IENvbmZpZztcblxuICBzdGF0dXM6ICdlcnJvcicgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZ2VuZXJhdGluZycgfCAnc2VuZGluZycgfCAnbm91c2VyJyA9ICdsb2FkaW5nJztcblxuICAvLyBwb3B1bGF0ZWQgYnkgbG9hZCByZXF1ZXN0XG4gIHByaXZhdGUgZGV2aWNlRGF0YUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVjb3JkaW5nU2Vzc2lvbjogb2JqZWN0O1xuICBwcml2YXRlIHJlY29yZGluZ1N0YXJ0OiBzdHJpbmc7XG4gIHByaXZhdGUgaW5pdGlhbEZvcm1TdGF0ZTogb2JqZWN0O1xuICBwcml2YXRlIGRldGFpbENoYW5nZUxvZzogb2JqZWN0W107XG5cbiAgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgZG9iOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHdpdGhpbk5ZZWFycygxMjAsICdiZWZvcmUnKV0pLFxuICAgIGhlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDMwKSwgVmFsaWRhdG9ycy5tYXgoMjcyKV0pLFxuICAgIHdlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpLCBWYWxpZGF0b3JzLm1heCg2MzUpXSksXG4gICAgbWVhbFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICBtZWFsRW5kOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICB9LCBbXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxFbmQnLCAnbWVhbFN0YXJ0JywgJ2FmdGVyJyksXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxTdGFydCcsICdkb2InLCAnYWZ0ZXInKSxcbiAgXSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzaGFyZWQ6IFNoYXJlZFNlcnZpY2UpIHsgfVxuXG4gIHBhcnNlSW5wdXRFcnJvcnMobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3IobmFtZSwgY29udHJvbCk7XG4gIH1cblxuICAvLyBtYWtlIHN1cmUgdGhhbiBtb2RpZmljYXRpb25zIHRoYXQgZG9uJ3QgYWN0dWFsbHkgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgYXJlIG1hcmtlZCBhcyBzdWNoXG4gIHByaXZhdGUgbW9uaXRvckZvcm1DaGFuZ2VzKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoY3VycmVudCA9PiB7XG4gICAgICBpZiAoc2hhbGxvd0NvbXBhcmUoY3VycmVudCwgdGhpcy5pbml0aWFsRm9ybVN0YXRlKSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBoYW5kbGUgdGhlIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgcmVzcG9uc2UgYm9keVxuICBwcml2YXRlIGV4dHJhY3RGaWVsZHMocmVjb3JkaW5nU2Vzc2lvbjogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHsgcGF0aWVudCwgbWVhbFN0YXJ0LCBtZWFsRW5kLCByZWNvcmRpbmdTdGFydCB9ID0gcmVjb3JkaW5nU2Vzc2lvbjtcbiAgICB0aGlzLnJlY29yZGluZ1N0YXJ0ID0gcmVjb3JkaW5nU3RhcnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9iOiB0aGlzLmNvbmZpZy5vd25lcnNbMF0uZGF0ZU9mQmlydGgsXG4gICAgICBoZWlnaHQ6IHBhdGllbnQuaGVpZ2h0LFxuICAgICAgd2VpZ2h0OiBwYXRpZW50LndlaWdodCxcbiAgICAgIG1lYWxTdGFydDogbG9jYWxpc2VEYXRlVGltZShtZWFsU3RhcnQpLFxuICAgICAgbWVhbEVuZDogbG9jYWxpc2VEYXRlVGltZShtZWFsRW5kKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGlzZUZvcm0oc3RhdGU6IG9iamVjdCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoc3RhdGUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc1ByaXN0aW5lKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ21lYWxTdGFydCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnbWVhbEVuZCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuXG4gICAgdGhpcy5pbml0aWFsRm9ybVN0YXRlID0gc3RhdGU7IC8vIHNhdmUgdGhpcyBmb3IgdXNlIGluIHJlc2V0c1xuICAgIHRoaXMubW9uaXRvckZvcm1DaGFuZ2VzKCk7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgYSBwYXRjaCBvYmplY3QgZm9yIHRoZSBzYXZlIHJlcXVlc3RcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVGaWVsZHMobW9kczogdHlwZW9mIHRoaXMuZm9ybUdyb3VwLnZhbHVlLCByZWNvcmRpbmdTZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgeyBwYXRpZW50IH0gPSByZWNvcmRpbmdTZXNzaW9uO1xuICAgIHBhdGllbnQuaGVpZ2h0ID0gbW9kcy5oZWlnaHQ7XG4gICAgcGF0aWVudC53ZWlnaHQgPSBtb2RzLndlaWdodDtcbiAgICBwYXRpZW50LmFnZSA9IGdldEFnZShtb2RzLmRvYik7XG5cbiAgICByZWNvcmRpbmdTZXNzaW9uLm1lYWxTdGFydCA9IGdsb2JhbGlzZURhdGVUaW1lKG1vZHMubWVhbFN0YXJ0KTtcbiAgICByZWNvcmRpbmdTZXNzaW9uLm1lYWxFbmQgPSBnbG9iYWxpc2VEYXRlVGltZShtb2RzLm1lYWxFbmQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGFuZ2VMb2cobW9kcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0FnZSc6IHBhdGllbnQuYWdlLFxuICAgICAgJ1JlY29yZGluZ1Nlc3Npb24nOiBKU09OLnN0cmluZ2lmeShyZWNvcmRpbmdTZXNzaW9uKSxcbiAgICAgICdVc2VyRGV0YWlsQ2hhbmdlTG9nJzogdGhpcy5kZXRhaWxDaGFuZ2VMb2dcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc3REZXZpY2VEYXRhKGRldmljZVByb3BlcnR5U2V0SWQ6IHN0cmluZywgZGF0YTogb2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkLnNhdmVEZXZpY2VEYXRhKFxuICAgICAgdGhpcy5jb25maWcuZGV2aWNlRGF0YU1vZGVsSWQsXG4gICAgICB0aGlzLmRldmljZURhdGFJZCxcbiAgICAgIGRldmljZVByb3BlcnR5U2V0SWQsXG4gICAgICB0aGlzLmNvbmZpZy5vd25lcnNbMF0udXNlcklkLFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvLyBwYXRjaCB0aGUgZGV2aWNlIGRhdGEgcmVjb3JkIHdpdGggdGhlIG1vZGlmaWNhdGlvbnNcbiAgc2F2ZU1vZGlmaWNhdGlvbnMoKSB7XG4gICAgY29uc3QgbW9kcyA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgcGF0Y2hlZERldmljZURhdGEgPSB0aGlzLmludGVncmF0ZUZpZWxkcyhtb2RzLCB0aGlzLnJlY29yZGluZ1Nlc3Npb24pO1xuICAgIGNvbnN0IHBhdGNoZWRVc2VyRGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcub3duZXJzWzBdLCB7IGRhdGVPZkJpcnRoOiBtb2RzLmRvYiB9KTtcblxuICAgIHRoaXMuc3RhdHVzID0gJ3NlbmRpbmcnO1xuICAgIGZvcmtKb2luKFtcbiAgICAgIHRoaXMucG9zdERldmljZURhdGEoYXBwRGF0YVByb3BlcnR5U2V0SWQsIHBhdGNoZWREZXZpY2VEYXRhKSxcbiAgICAgIHRoaXMuc2hhcmVkLnVwZGF0ZVVzZXIodGhpcy5jb25maWcub3duZXJzWzBdLnVzZXJJZCwgcGF0Y2hlZFVzZXJEYXRhKVxuICAgIF0pLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5yZWdlblJlcG9ydCgpKVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZENoYW5nZUxvZyhtb2RzOiB0eXBlb2YgdGhpcy5mb3JtR3JvdXAudmFsdWUpIHtcbiAgICBjb25zdCBwcmV2Q2hhbmdlTG9nOiBQYXJ0aWFsPHR5cGVvZiB0aGlzLmZvcm1Hcm91cC52YWx1ZT4gPSB7fTtcbiAgICBjb25zdCBuZXdDaGFuZ2VMb2c6IFBhcnRpYWw8dHlwZW9mIHRoaXMuZm9ybUdyb3VwLnZhbHVlPiA9IHt9O1xuXG4gICAgLy8gT25seSBpbmNsdWRlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgIGZvciAoY29uc3Qga2V5IGluIG1vZHMpIHtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxGb3JtU3RhdGVba2V5XSAhPT0gbW9kc1trZXldKSB7XG4gICAgICAgIHByZXZDaGFuZ2VMb2dba2V5XSA9IHRoaXMuaW5pdGlhbEZvcm1TdGF0ZVtrZXldO1xuICAgICAgICBuZXdDaGFuZ2VMb2dba2V5XSA9IG1vZHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VMb2cgPSB7XG4gICAgICBhdXRob3I6IHRoaXMuY29uZmlnLmN1cnJlbnRVc2VyLmVtYWlsQWRkcmVzcyxcbiAgICAgIHByZXZDaGFuZ2VMb2c6IHByZXZDaGFuZ2VMb2csXG4gICAgICBuZXdDaGFuZ2VMb2c6IG5ld0NoYW5nZUxvZyxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfVxuXG4gICAgdGhpcy5kZXRhaWxDaGFuZ2VMb2cucHVzaChjaGFuZ2VMb2cpO1xuICB9XG5cbiAgLy8gZ2V0IHRoZSBkZXZpY2UgZGF0YSByZWNvcmQgYW5kIGluaXRpYWxpc2UgdGhlIGZvcm1cbiAgcHJpdmF0ZSBsb2FkRGV2aWNlRGF0YSgpIHtcbiAgICB0aGlzLnNoYXJlZC5nZXREZXZpY2VEYXRhKFxuICAgICAgdGhpcy5jb25maWcuZGV2aWNlRGF0YU1vZGVsSWQsXG4gICAgICB0aGlzLmNvbmZpZy5vd25lcnNbMF0udXNlcklkLFxuICAgICAgcHJvcGVydHlDb2Rlc1xuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXZpY2VEYXRhSWQgPSByZXMuZGV2aWNlRGF0YUlkO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1Nlc3Npb24gPSBKU09OLnBhcnNlKHJlcy5kYXRhWydSZWNvcmRpbmdTZXNzaW9uJ10udmFsdWUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpc2VGb3JtKHRoaXMuZXh0cmFjdEZpZWxkcyh0aGlzLnJlY29yZGluZ1Nlc3Npb24pKTtcbiAgICAgICAgLy8gY2hlY2tpbmcgZm9yIHVuZGVmaW5lZCBpbiBjYXNlIG5vIGNoYW5nZXMgaGF2ZSBiZWVuIGxvZ2dlZCB5ZXRcbiAgICAgICAgdGhpcy5kZXRhaWxDaGFuZ2VMb2cgPSByZXMuZGF0YVsnVXNlckRldGFpbENoYW5nZUxvZyddID09PSB1bmRlZmluZWQgPyBbXSA6IHJlcy5kYXRhWydVc2VyRGV0YWlsQ2hhbmdlTG9nJ10udmFsdWU7XG5cbiAgICAgICAgdGhpcy5zdGF0dXMgPSByZXMuZGF0YVsnU3RhdHVzJ10/LnZhbHVlID09PSAnR2VuZXJhdGluZyBSZXBvcnQnID9cbiAgICAgICAgICAnZ2VuZXJhdGluZycgOlxuICAgICAgICAgICdzdWNjZXNzJztcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gXCJlcnJvclwiO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVnZW5SZXBvcnQoKSB7XG4gICAgdGhpcy5wb3N0RGV2aWNlRGF0YShcbiAgICAgIGRldmljZURhdGFQcm9wZXJ0eVNldElkLFxuICAgICAgeyAnQWxnb3JpdGhtaGFzcnVuJzogZmFsc2UsICdBbGdvcml0aG1SdW4nOiB0cnVlIH1cbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXR1cyA9ICdnZW5lcmF0aW5nJzsgLy8gYXNzdW1lIHJlcG9ydCBzdGFydHMgZ2VuZXJhdGluZyBpbW1lZGlhdGVseVxuICAgIH0pXG4gIH1cblxuICByZXNldE1vZGlmaWNhdGlvbnMoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmluaXRpYWxGb3JtU3RhdGUpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8ub3duZXJzPy5bMF0/LnVzZXJJZCkge1xuICAgICAgdGhpcy5zdGF0dXMgPSAnbm91c2VyJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWREZXZpY2VEYXRhKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2Vycm9yJ1wiPlxuICAgIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGdldCB0aGUgZGV0YWlscy5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ25vdXNlcidcIj5cbiAgICBUaGVyZSBpcyBubyB1c2VyIHNwZWNpZmllZCBhcyB0aGUgZGF0YSBvd25lci5cbiAgPC9kaXY+XG4gIDxmb3JtICpuZ0lmPVwic3RhdHVzICE9PSAnZXJyb3InICYmIHN0YXR1cyAhPT0gJ25vdXNlcidcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJzYXZlTW9kaWZpY2F0aW9ucygpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJkb2JcIj5EYXRlIG9mIEJpcnRoOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImRvYlwiIHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZG9iXCI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ3ZWlnaHRcIj5QYXRpZW50IFdlaWdodCAoa2cpOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIndlaWdodFwiIHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJ3ZWlnaHRcIj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImhlaWdodFwiPlBhdGllbnQgSGVpZ2h0IChjbSk6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiaGVpZ2h0XCIgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbFN0YXJ0XCI+TWVhbCBTdGFydCBUaW1lOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIm1lYWxTdGFydFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxTdGFydFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbEVuZFwiPk1lYWwgRW5kIFRpbWU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibWVhbEVuZFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxFbmRcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFmb3JtR3JvdXAudmFsaWQgJiYgZm9ybUdyb3VwLmRpcnR5XCIgY2xhc3M9XCJlcnJvcnNcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgZm9ybUdyb3VwLmNvbnRyb2xzIHwgZW50cmllc1wiPlxuICAgICAgICB7eyBwYXJzZUlucHV0RXJyb3JzKGNvbnRyb2xbMF0sIGNvbnRyb2xbMV0pIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzdGF0dXMgPT09ICdnZW5lcmF0aW5nJ1wiIGNsYXNzPVwiaW5mb1wiPlxuICAgICAgPGRpdj5UaGUgcmVwb3J0IGlzIGdlbmVyYXRpbmcgYXQgdGhlIG1vbWVudCwgY2hlY2sgYmFjayBsYXRlciBpZiB5b3UgbmVlZCB0byBtb2RpZnkgdGhpcyBlbnRyeS48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVnZW5SZXBvcnQoKVwiIFtkaXNhYmxlZF09XCJzdGF0dXMgPT09ICdzZW5kaW5nJyB8fCBzdGF0dXMgPT09ICdnZW5lcmF0aW5nJyB8fCBzdGF0dXMgPT09ICdsb2FkaW5nJ1wiPlJlZ2VuZXJhdGUgUmVwb3J0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXRNb2RpZmljYXRpb25zKClcIiBbZGlzYWJsZWRdPVwic3RhdHVzID09PSAnc2VuZGluZycgfHwgc3RhdHVzID09PSAnZ2VuZXJhdGluZycgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+Q2FuY2VsIE1vZGlmaWNhdGlvbjwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cInN0YXR1cyA9PT0gJ3NlbmRpbmcnIHx8IHN0YXR1cyA9PT0gJ2dlbmVyYXRpbmcnIHx8ICFmb3JtR3JvdXAudmFsaWQgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+U2F2ZSBEZXRhaWxzPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
@@ -0,0 +1,33 @@
1
+ import { CommonModule, JsonPipe } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { DetailEditComponent } from './detail-edit.component';
5
+ import { EntriesPipe } from './entries.pipe';
6
+ import * as i0 from "@angular/core";
7
+ export class DetailEditModule {
8
+ }
9
+ DetailEditModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ DetailEditModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: DetailEditModule, declarations: [DetailEditComponent,
11
+ EntriesPipe], imports: [JsonPipe,
12
+ ReactiveFormsModule,
13
+ CommonModule], exports: [DetailEditComponent] });
14
+ DetailEditModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditModule, imports: [ReactiveFormsModule,
15
+ CommonModule] });
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditModule, decorators: [{
17
+ type: NgModule,
18
+ args: [{
19
+ declarations: [
20
+ DetailEditComponent,
21
+ EntriesPipe
22
+ ],
23
+ imports: [
24
+ JsonPipe,
25
+ ReactiveFormsModule,
26
+ CommonModule
27
+ ],
28
+ exports: [
29
+ DetailEditComponent
30
+ ]
31
+ }]
32
+ }] });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9kZXRhaWwtZWRpdC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFrQjdDLE1BQU0sT0FBTyxnQkFBZ0I7OzhHQUFoQixnQkFBZ0I7K0dBQWhCLGdCQUFnQixpQkFaekIsbUJBQW1CO1FBQ25CLFdBQVcsYUFHWCxRQUFRO1FBQ1IsbUJBQW1CO1FBQ25CLFlBQVksYUFHWixtQkFBbUI7K0dBR1YsZ0JBQWdCLFlBUHpCLG1CQUFtQjtRQUNuQixZQUFZOzRGQU1ILGdCQUFnQjtrQkFkNUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3FCQUNaO29CQUNELE9BQU8sRUFBRTt3QkFDUCxRQUFRO3dCQUNSLG1CQUFtQjt3QkFDbkIsWUFBWTtxQkFDYjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsbUJBQW1CO3FCQUNwQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSwgSnNvblBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEZXRhaWxFZGl0Q29tcG9uZW50IH0gZnJvbSAnLi9kZXRhaWwtZWRpdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW50cmllc1BpcGUgfSBmcm9tICcuL2VudHJpZXMucGlwZSc7XG5cblxuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBEZXRhaWxFZGl0Q29tcG9uZW50LFxuICAgIEVudHJpZXNQaXBlXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBKc29uUGlwZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRGV0YWlsRWRpdENvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERldGFpbEVkaXRNb2R1bGUgeyB9XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DetailEditService {
4
+ constructor() { }
5
+ }
6
+ DetailEditService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
7
+ DetailEditService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditService, providedIn: 'root' });
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DetailEditService, decorators: [{
9
+ type: Injectable,
10
+ args: [{
11
+ providedIn: 'root'
12
+ }]
13
+ }], ctorParameters: function () { return []; } });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RldGFpbC1lZGl0L3NyYy9saWIvZGV0YWlsLWVkaXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLGdCQUFnQixDQUFDOzsrR0FGTixpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZoQixNQUFNOzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERldGFpbEVkaXRTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuIl19
@@ -0,0 +1,16 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class EntriesPipe {
4
+ transform(value) {
5
+ return Object.entries(value);
6
+ }
7
+ }
8
+ EntriesPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EntriesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
9
+ EntriesPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: EntriesPipe, name: "entries" });
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EntriesPipe, decorators: [{
11
+ type: Pipe,
12
+ args: [{
13
+ name: 'entries'
14
+ }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cmllcy5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9lbnRyaWVzLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBS3BELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLFNBQVMsQ0FBQyxLQUFhO1FBQ3JCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDOzt5R0FIVSxXQUFXO3VHQUFYLFdBQVc7NEZBQVgsV0FBVztrQkFIdkIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsU0FBUztpQkFDaEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBQaXBlKHtcbiAgbmFtZTogJ2VudHJpZXMnXG59KVxuZXhwb3J0IGNsYXNzIEVudHJpZXNQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogb2JqZWN0KTogW3N0cmluZywgYW55XVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,48 @@
1
+ // strip the timezone offset to create format usable by <input>
2
+ export function localiseDateTime(datetime) {
3
+ const date = new Date(datetime);
4
+ const year = date.getFullYear();
5
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
6
+ const day = date.getDate().toString().padStart(2, '0');
7
+ const hour = date.getHours().toString().padStart(2, '0');
8
+ const minute = date.getMinutes().toString().padStart(2, '0');
9
+ const second = date.getSeconds().toString().padStart(2, '0');
10
+ return `${year}-${month}-${day}T${hour}:${minute}:${second}`;
11
+ }
12
+ // reconstruct original ISO format
13
+ export function globaliseDateTime(datetime) {
14
+ const date = new Date(datetime);
15
+ const offset = -date.getTimezoneOffset();
16
+ const offsetAbs = Math.abs(offset);
17
+ const sign = offset >= 0 ? '+' : '-';
18
+ const hours = String(Math.floor(offsetAbs / 60)).padStart(2, '0');
19
+ const minutes = String(offsetAbs % 60).padStart(2, '0');
20
+ const offsetString = `${sign}${hours}:${minutes}`;
21
+ const year = date.getFullYear();
22
+ const month = String(date.getMonth() + 1).padStart(2, '0');
23
+ const day = String(date.getDate()).padStart(2, '0');
24
+ const hour = String(date.getHours()).padStart(2, '0');
25
+ const minute = String(date.getMinutes()).padStart(2, '0');
26
+ const second = String(date.getSeconds()).padStart(2, '0');
27
+ const datePart = `${year}-${month}-${day}`;
28
+ const timePart = `${hour}:${minute}:${second}.000`;
29
+ return `${datePart}T${timePart}${offsetString}`;
30
+ }
31
+ export function getAge(dob) {
32
+ const then = new Date(dob);
33
+ const now = new Date();
34
+ let age = now.getFullYear() - then.getFullYear();
35
+ if (now.getMonth() < then.getMonth() ||
36
+ (now.getMonth() === then.getMonth() && now.getDate() < then.getDate())) {
37
+ age--;
38
+ }
39
+ return age;
40
+ }
41
+ export function titleise(camel) {
42
+ let spaced = camel.replace(/(?=[A-Z])/g, ' ');
43
+ return spaced.toLowerCase().replace(/\b\w/g, ch => ch.toUpperCase());
44
+ }
45
+ export function shallowCompare(a, b) {
46
+ return Object.entries(a).every(([k, v]) => b[k] === v);
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUU3RCxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxpQkFB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LENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDakQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHN0cmlwIHRoZSB0aW1lem9uZSBvZmZzZXQgdG8gY3JlYXRlIGZvcm1hdCB1c2FibGUgYnkgPGlucHV0PlxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXNlRGF0ZVRpbWUoZGF0ZXRpbWU6IHN0cmluZykge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZXRpbWUpO1xuXG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7IGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBob3VyID0gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgbWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBzZWNvbmQgPSBkYXRlLmdldFNlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fVQke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH1gO1xufVxuXG4vLyByZWNvbnN0cnVjdCBvcmlnaW5hbCBJU08gZm9ybWF0XG5leHBvcnQgZnVuY3Rpb24gZ2xvYmFsaXNlRGF0ZVRpbWUoZGF0ZXRpbWU6IHN0cmluZykge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZXRpbWUpO1xuXG4gIGNvbnN0IG9mZnNldCA9IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIGNvbnN0IG9mZnNldEFicyA9IE1hdGguYWJzKG9mZnNldCk7XG5cbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+PSAwID8gJysnIDogJy0nO1xuICBjb25zdCBob3VycyA9IFN0cmluZyhNYXRoLmZsb29yKG9mZnNldEFicyAvIDYwKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgbWludXRlcyA9IFN0cmluZyhvZmZzZXRBYnMgJSA2MCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3Qgb2Zmc2V0U3RyaW5nID0gYCR7c2lnbn0ke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBob3VyID0gU3RyaW5nKGRhdGUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgbWludXRlID0gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBzZWNvbmQgPSBTdHJpbmcoZGF0ZS5nZXRTZWNvbmRzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgY29uc3QgZGF0ZVBhcnQgPSBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gO1xuICBjb25zdCB0aW1lUGFydCA9IGAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0uMDAwYDtcblxuICByZXR1cm4gYCR7ZGF0ZVBhcnR9VCR7dGltZVBhcnR9JHtvZmZzZXRTdHJpbmd9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZShkb2I6IHN0cmluZykge1xuICBjb25zdCB0aGVuID0gbmV3IERhdGUoZG9iKTtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICBsZXQgYWdlID0gbm93LmdldEZ1bGxZZWFyKCkgLSB0aGVuLmdldEZ1bGxZZWFyKCk7XG5cbiAgaWYgKG5vdy5nZXRNb250aCgpIDwgdGhlbi5nZXRNb250aCgpIHx8XG4gICAgKG5vdy5nZXRNb250aCgpID09PSB0aGVuLmdldE1vbnRoKCkgJiYgbm93LmdldERhdGUoKSA8IHRoZW4uZ2V0RGF0ZSgpKSkge1xuICAgIGFnZS0tO1xuICB9XG5cbiAgcmV0dXJuIGFnZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpdGxlaXNlKGNhbWVsOiBzdHJpbmcpIHtcbiAgbGV0IHNwYWNlZCA9IGNhbWVsLnJlcGxhY2UoLyg/PVtBLVpdKS9nLCAnICcpO1xuICByZXR1cm4gc3BhY2VkLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxiXFx3L2csIGNoID0+IGNoLnRvVXBwZXJDYXNlKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvbXBhcmUoYTogb2JqZWN0LCBiOiBvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGEpLmV2ZXJ5KChbaywgdl0pID0+IGJba10gPT09IHYpO1xufVxuIl19
@@ -0,0 +1,99 @@
1
+ import { FormGroup } from "@angular/forms";
2
+ import { titleise } from "./utils";
3
+ function setControlError(control, errorKey, errorValue) {
4
+ const currentErrors = control.errors || {};
5
+ if (currentErrors[errorKey])
6
+ return;
7
+ control.setErrors({ ...currentErrors, [errorKey]: errorValue });
8
+ }
9
+ function clearControlError(control, errorKey) {
10
+ const currentErrors = control.errors || {};
11
+ if (!currentErrors[errorKey])
12
+ return;
13
+ control.setErrors({ ...currentErrors, [errorKey]: null });
14
+ }
15
+ export function dateComparison(a, b, comparator) {
16
+ return function (control) {
17
+ if (!(control instanceof FormGroup))
18
+ return null;
19
+ const formGroup = control;
20
+ const aControl = formGroup.get(a);
21
+ const bControl = formGroup.get(b);
22
+ if (!aControl?.value || !bControl?.value) {
23
+ clearControlError(aControl, 'dateRange');
24
+ return null;
25
+ }
26
+ const aDate = new Date(aControl.value);
27
+ const bDate = new Date(bControl.value);
28
+ const hasError = (comparator === 'after' && aDate <= bDate ||
29
+ comparator === 'before' && aDate >= bDate);
30
+ if (hasError) {
31
+ setControlError(aControl, 'dateRange', { against: b, comparator });
32
+ return { dateRange: true };
33
+ }
34
+ clearControlError(aControl, 'dateRange');
35
+ return null;
36
+ };
37
+ }
38
+ export function withinNYears(n, dir = 'both', of) {
39
+ return function (control) {
40
+ const timestamp = control?.value;
41
+ if (!timestamp || isNaN(new Date(timestamp).getTime()))
42
+ return null;
43
+ const date = new Date(timestamp);
44
+ const against = of ?? new Date();
45
+ const min = new Date(against);
46
+ min.setFullYear(against.getFullYear() - n);
47
+ const max = new Date(against);
48
+ max.setFullYear(against.getFullYear() + n);
49
+ let isValid = false;
50
+ if (dir === 'after')
51
+ isValid = date < max && date > against;
52
+ else if (dir === 'before')
53
+ isValid = date > min && date < against;
54
+ else
55
+ isValid = date > min && date < max;
56
+ return isValid ? null : { notWithinYears: { n, against, dir } };
57
+ };
58
+ }
59
+ export function withinNHours(n, dir = 'both', of) {
60
+ return function (control) {
61
+ const timestamp = control?.value;
62
+ if (!timestamp || isNaN(new Date(timestamp).getTime()))
63
+ return null;
64
+ const date = new Date(timestamp);
65
+ const against = of ?? new Date();
66
+ const min = new Date(against);
67
+ min.setHours(against.getHours() - n);
68
+ const max = new Date(against);
69
+ max.setHours(against.getHours() + n);
70
+ let isValid = false;
71
+ if (dir === 'after')
72
+ isValid = date < max && date > against;
73
+ else if (dir === 'before')
74
+ isValid = date > min && date < against;
75
+ else
76
+ isValid = date > min && date < max;
77
+ return isValid ? null : { notWithinHours: { n, against, dir } };
78
+ };
79
+ }
80
+ // translate validation errors into human readable strings
81
+ export function translateError(name, control) {
82
+ const { errors } = control;
83
+ if (control.hasError('required'))
84
+ return `${titleise(name)} is a required value.`;
85
+ else if (control.hasError('min'))
86
+ return `${titleise(name)} needs to be a minimum of ${errors.min.min}.`;
87
+ else if (control.hasError('max'))
88
+ return `${titleise(name)} needs to be a maximum of ${errors.max.max}.`;
89
+ else if (control.hasError('future'))
90
+ return `${titleise(name)} needs to be in the past.`;
91
+ else if (control.hasError('dateRange'))
92
+ return `${titleise(name)} needs to be ${errors.dateRange.comparator} ${titleise(errors.dateRange.against)}.`;
93
+ else if (control.hasError('notWithinYears'))
94
+ return `${titleise(name)} needs to be within ${errors.notWithinYears.n} years of ${errors.notWithinYears.against}`;
95
+ else if (control.hasError('notWithinHours'))
96
+ return `${titleise(name)} needs to be within ${errors.notWithinHours.n} hours of ${errors.notWithinHours.against}`;
97
+ return null;
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RldGFpbC1lZGl0L3NyYy9saWIvdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdDLFNBQVMsRUFBaUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRW5DLFNBQVMsZUFBZSxDQUFDLE9BQXdCLEVBQUUsUUFBZ0IsRUFBRSxVQUFlO0lBQ2xGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzNDLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUFFLE9BQU87SUFDcEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxPQUF3QixFQUFFLFFBQWdCO0lBQ25FLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTztJQUNyQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsVUFBOEI7SUFDakYsT0FBTyxVQUFTLE9BQWtDO1FBQ2hELElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxTQUFTLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVqRCxNQUFNLFNBQVMsR0FBRyxPQUFvQixDQUFDO1FBRXZDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFH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YnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyB0aXRsZWlzZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmZ1bmN0aW9uIHNldENvbnRyb2xFcnJvcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGVycm9yS2V5OiBzdHJpbmcsIGVycm9yVmFsdWU6IGFueSkge1xuICBjb25zdCBjdXJyZW50RXJyb3JzID0gY29udHJvbC5lcnJvcnMgfHwge307XG4gIGlmIChjdXJyZW50RXJyb3JzW2Vycm9yS2V5XSkgcmV0dXJuO1xuICBjb250cm9sLnNldEVycm9ycyh7IC4uLmN1cnJlbnRFcnJvcnMsIFtlcnJvcktleV06IGVycm9yVmFsdWUgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyQ29udHJvbEVycm9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgZXJyb3JLZXk6IHN0cmluZykge1xuICBjb25zdCBjdXJyZW50RXJyb3JzID0gY29udHJvbC5lcnJvcnMgfHwge307XG4gIGlmICghY3VycmVudEVycm9yc1tlcnJvcktleV0pIHJldHVybjtcbiAgY29udHJvbC5zZXRFcnJvcnMoeyAuLi5jdXJyZW50RXJyb3JzLCBbZXJyb3JLZXldOiBudWxsIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUNvbXBhcmlzb24oYTogc3RyaW5nLCBiOiBzdHJpbmcsIGNvbXBhcmF0b3I6ICdiZWZvcmUnIHwgJ2FmdGVyJykge1xuICByZXR1cm4gZnVuY3Rpb24oY29udHJvbDogQWJzdHJhY3RDb250cm9sPGFueSwgYW55Pik6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBpZiAoIShjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcblxuICAgIGNvbnN0IGFDb250cm9sID0gZm9ybUdyb3VwLmdldChhKTtcbiAgICBjb25zdCBiQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoYik7XG5cbiAgICBpZiAoIWFDb250cm9sPy52YWx1ZSB8fCAhYkNvbnRyb2w/LnZhbHVlKSB7XG4gICAgICBjbGVhckNvbnRyb2xFcnJvcihhQ29udHJvbCwgJ2RhdGVSYW5nZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYURhdGUgPSBuZXcgRGF0ZShhQ29udHJvbC52YWx1ZSk7XG4gICAgY29uc3QgYkRhdGUgPSBuZXcgRGF0ZShiQ29udHJvbC52YWx1ZSk7XG5cbiAgICBjb25zdCBoYXNFcnJvciA9IChcbiAgICAgIGNvbXBhcmF0b3IgPT09ICdhZnRlcicgJiYgYURhdGUgPD0gYkRhdGUgfHxcbiAgICAgIGNvbXBhcmF0b3IgPT09ICdiZWZvcmUnICYmIGFEYXRlID49IGJEYXRlXG4gICAgKTtcblxuICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgc2V0Q29udHJvbEVycm9yKGFDb250cm9sLCAnZGF0ZVJhbmdlJywgeyBhZ2FpbnN0OiBiLCBjb21wYXJhdG9yIH0pO1xuICAgICAgcmV0dXJuIHsgZGF0ZVJhbmdlOiB0cnVlIH07XG4gICAgfVxuXG4gICAgY2xlYXJDb250cm9sRXJyb3IoYUNvbnRyb2wsICdkYXRlUmFuZ2UnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTlllYXJzKG46IG51bWJlciwgZGlyOiAnYm90aCcgfCAnYmVmb3JlJyB8ICdhZnRlcicgPSAnYm90aCcsIG9mPzogRGF0ZSk6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBjb250cm9sPy52YWx1ZTtcbiAgICBpZiAoIXRpbWVzdGFtcCB8fCBpc05hTihuZXcgRGF0ZSh0aW1lc3RhbXApLmdldFRpbWUoKSkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7XG4gICAgY29uc3QgYWdhaW5zdCA9IG9mID8/IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBtaW4gPSBuZXcgRGF0ZShhZ2FpbnN0KVxuICAgIG1pbi5zZXRGdWxsWWVhcihhZ2FpbnN0LmdldEZ1bGxZZWFyKCkgLSBuKTtcbiAgICBjb25zdCBtYXggPSBuZXcgRGF0ZShhZ2FpbnN0KVxuICAgIG1heC5zZXRGdWxsWWVhcihhZ2FpbnN0LmdldEZ1bGxZZWFyKCkgKyBuKTtcblxuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgaWYgKGRpciA9PT0gJ2FmdGVyJykgaXNWYWxpZCA9IGRhdGUgPCBtYXggJiYgZGF0ZSA+IGFnYWluc3Q7XG4gICAgZWxzZSBpZiAoZGlyID09PSAnYmVmb3JlJykgaXNWYWxpZCA9IGRhdGUgPiBtaW4gJiYgZGF0ZSA8IGFnYWluc3Q7XG4gICAgZWxzZSBpc1ZhbGlkID0gZGF0ZSA+IG1pbiAmJiBkYXRlIDwgbWF4O1xuXG4gICAgcmV0dXJuIGlzVmFsaWQgPyBudWxsIDogeyBub3RXaXRoaW5ZZWFyczogeyBuLCBhZ2FpbnN0LCBkaXIgfSB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5OSG91cnMobjogbnVtYmVyLCBkaXI6ICdib3RoJyB8ICdiZWZvcmUnIHwgJ2FmdGVyJyA9ICdib3RoJywgb2Y/OiBEYXRlKTogVmFsaWRhdG9yRm4ge1xuICByZXR1cm4gZnVuY3Rpb24oY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGNvbnRyb2w/LnZhbHVlO1xuICAgIGlmICghdGltZXN0YW1wIHx8IGlzTmFOKG5ldyBEYXRlKHRpbWVzdGFtcCkuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgICBjb25zdCBhZ2FpbnN0ID0gb2YgPz8gbmV3IERhdGUoKTtcblxuICAgIGNvbnN0IG1pbiA9IG5ldyBEYXRlKGFnYWluc3QpXG4gICAgbWluLnNldEhvdXJzKGFnYWluc3QuZ2V0SG91cnMoKSAtIG4pO1xuICAgIGNvbnN0IG1heCA9IG5ldyBEYXRlKGFnYWluc3QpXG4gICAgbWF4LnNldEhvdXJzKGFnYWluc3QuZ2V0SG91cnMoKSArIG4pO1xuXG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBpZiAoZGlyID09PSAnYWZ0ZXInKSBpc1ZhbGlkID0gZGF0ZSA8IG1heCAmJiBkYXRlID4gYWdhaW5zdDtcbiAgICBlbHNlIGlmIChkaXIgPT09ICdiZWZvcmUnKSBpc1ZhbGlkID0gZGF0ZSA+IG1pbiAmJiBkYXRlIDwgYWdhaW5zdDtcbiAgICBlbHNlIGlzVmFsaWQgPSBkYXRlID4gbWluICYmIGRhdGUgPCBtYXg7XG5cbiAgICByZXR1cm4gaXNWYWxpZCA/IG51bGwgOiB7IG5vdFdpdGhpbkhvdXJzOiB7IG4sIGFnYWluc3QsIGRpciB9IH07XG4gIH1cbn1cblxuLy8gdHJhbnNsYXRlIHZhbGlkYXRpb24gZXJyb3JzIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5nc1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZUVycm9yKG5hbWU6IHN0cmluZywgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gIGNvbnN0IHsgZXJyb3JzIH0gPSBjb250cm9sO1xuXG4gIGlmIChjb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKVxuICAgIHJldHVybiBgJHt0aXRsZWlzZShuYW1lKX0gaXMgYSByZXF1aXJlZCB2YWx1ZS5gO1xuICBlbHNlIGlmIChjb250cm9sLmhhc0Vycm9yKCdtaW4nKSlcbiAgICByZXR1cm4gYCR7dGl0bGVpc2UobmFtZSl9IG5lZWRzIHRvIGJlIGEgbWluaW11bSBvZiAke2Vycm9ycy5taW4ubWlufS5gO1xuICBlbHNlIGlmIChjb250cm9sLmhhc0Vycm9yKCdtYXgnKSlcbiAgICByZXR1cm4gYCR7dGl0bGVpc2UobmFtZSl9IG5lZWRzIHRvIGJlIGEgbWF4aW11bSBvZiAke2Vycm9ycy5tYXgubWF4fS5gO1xuICBlbHNlIGlmIChjb250cm9sLmhhc0Vycm9yKCdmdXR1cmUnKSlcbiAgICByZXR1cm4gYCR7dGl0bGVpc2UobmFtZSl9IG5lZWRzIHRvIGJlIGluIHRoZSBwYXN0LmA7XG4gIGVsc2UgaWYgKGNvbnRyb2wuaGFzRXJyb3IoJ2RhdGVSYW5nZScpKVxuICAgIHJldHVybiBgJHt0aXRsZWlzZShuYW1lKX0gbmVlZHMgdG8gYmUgJHtlcnJvcnMuZGF0ZVJhbmdlLmNvbXBhcmF0b3J9ICR7dGl0bGVpc2UoZXJyb3JzLmRhdGVSYW5nZS5hZ2FpbnN0KX0uYDtcbiAgZWxzZSBpZiAoY29udHJvbC5oYXNFcnJvcignbm90V2l0aGluWWVhcnMnKSlcbiAgICByZXR1cm4gYCR7dGl0bGVpc2UobmFtZSl9IG5lZWRzIHRvIGJlIHdpdGhpbiAke2Vycm9ycy5ub3RXaXRoaW5ZZWFycy5ufSB5ZWFycyBvZiAke2Vycm9ycy5ub3RXaXRoaW5ZZWFycy5hZ2FpbnN0fWA7XG4gIGVsc2UgaWYgKGNvbnRyb2wuaGFzRXJyb3IoJ25vdFdpdGhpbkhvdXJzJykpXG4gICAgcmV0dXJuIGAke3RpdGxlaXNlKG5hbWUpfSBuZWVkcyB0byBiZSB3aXRoaW4gJHtlcnJvcnMubm90V2l0aGluSG91cnMubn0gaG91cnMgb2YgJHtlcnJvcnMubm90V2l0aGluSG91cnMuYWdhaW5zdH1gO1xuXG4gIHJldHVybiBudWxsO1xufVxuIl19
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Public API Surface of detail-edit
3
+ */
4
+ export * from './lib/detail-edit.service';
5
+ export * from './lib/detail-edit.component';
6
+ export * from './lib/detail-edit.module';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2RldGFpbC1lZGl0L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGRldGFpbC1lZGl0XG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvZGV0YWlsLWVkaXQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kZXRhaWwtZWRpdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGV0YWlsLWVkaXQubW9kdWxlJztcbiJdfQ==