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 +15 -0
- package/esm2020/alimetry-detail-edit.mjs +5 -0
- package/esm2020/lib/detail-edit.component.mjs +150 -0
- package/esm2020/lib/detail-edit.module.mjs +33 -0
- package/esm2020/lib/detail-edit.service.mjs +14 -0
- package/esm2020/lib/entries.pipe.mjs +16 -0
- package/esm2020/lib/utils.mjs +48 -0
- package/esm2020/lib/validators.mjs +99 -0
- package/esm2020/public-api.mjs +7 -0
- package/fesm2015/alimetry-detail-edit.mjs +359 -0
- package/fesm2015/alimetry-detail-edit.mjs.map +1 -0
- package/fesm2020/alimetry-detail-edit.mjs +357 -0
- package/fesm2020/alimetry-detail-edit.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/detail-edit.component.d.ts +35 -0
- package/lib/detail-edit.module.d.ts +10 -0
- package/lib/detail-edit.service.d.ts +6 -0
- package/lib/entries.pipe.d.ts +7 -0
- package/lib/utils.d.ts +5 -0
- package/lib/validators.d.ts +5 -0
- package/package.json +31 -0
- package/public-api.d.ts +3 -0
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9kZXRhaWwtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL2RldGFpbC1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFhLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7QUFFMUYsTUFBTSxvQkFBb0IsR0FBRyxzQ0FBc0MsQ0FBQztBQUNwRSxNQUFNLHVCQUF1QixHQUFHLHNDQUFzQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFNNUUsTUFBTSxPQUFPLG1CQUFtQjtJQXVCOUIsWUFBb0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXBCekMsV0FBTSxHQUEwRSxTQUFTLENBQUM7UUFTMUYsY0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3hCLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNwRixNQUFNLEVBQUUsSUFBSSxXQUFXLENBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRyxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdELE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDNUQsRUFBRTtZQUNELGNBQWMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQztZQUMvQyxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUM7U0FDNUMsQ0FBQyxDQUFDO0lBRTBDLENBQUM7SUFFOUMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLE9BQXdCO1FBQ3JELE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsOEZBQThGO0lBQ3RGLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ2pDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsa0RBQWtEO0lBQzFDLGFBQWEsQ0FBQyxnQkFBcUM7UUFDekQsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLGdCQUFnQixDQUFDO1FBQ3pFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLE9BQU87WUFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVztZQUN0QyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7WUFDdEMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztTQUNuQyxDQUFBO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFhO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLDhCQUE4QjtRQUM3RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0RBQWdEO0lBQ3hDLGVBQWUsQ0FBQyxJQUFpQyxFQUFFLGdCQUFxQztRQUM5RixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7UUFDckMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0IsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTztZQUNMLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRztZQUNsQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQ3BELHFCQUFxQixFQUFFLElBQUksQ0FBQyxlQUFlO1NBQzVDLENBQUE7SUFDSCxDQUFDO0lBRU8sY0FBYyxDQUFDLG1CQUEyQixFQUFFLElBQVk7UUFDOUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFDN0IsSUFBSSxDQUFDLFlBQVksRUFDakIsbUJBQW1CLEVBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDNUIsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELGlCQUFpQjtRQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXhGLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLFFBQVEsQ0FBQztZQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7WUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQztTQUN0RSxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDOUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRU8sZUFBZSxDQUFDLElBQWlDO1FBQ3ZELE1BQU0sYUFBYSxHQUF5QyxFQUFFLENBQUM7UUFDL0QsTUFBTSxZQUFZLEdBQXlDLEVBQUUsQ0FBQztRQUU5RCx3Q0FBd0M7UUFDeEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM1QyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRCxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQy9CO1NBQ0Y7UUFFRCxNQUFNLFNBQVMsR0FBRztZQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWTtZQUM1QyxhQUFhLEVBQUUsYUFBYTtZQUM1QixZQUFZLEVBQUUsWUFBWTtZQUMxQixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDcEMsQ0FBQTtRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxxREFBcUQ7SUFDN0MsY0FBYztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUM1QixhQUFhLENBQ2QsQ0FBQyxTQUFTLENBQUM7WUFDVixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELGlFQUFpRTtnQkFDakUsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBRWxILElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEtBQUssbUJBQW1CLENBQUMsQ0FBQztvQkFDL0QsWUFBWSxDQUFDLENBQUM7b0JBQ2QsU0FBUyxDQUFDO1lBQ2QsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxjQUFjLENBQ2pCLHVCQUF1QixFQUN2QixFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQ25ELENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsOENBQThDO1FBQzVFLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN2QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7aUhBOUtVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLHFGQ2ZoQywwd0VBb0RBOzRGRHJDYSxtQkFBbUI7a0JBSi9CLFNBQVM7K0JBQ0UsaUJBQWlCO29HQUlsQixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbmZpZywgU2hhcmVkU2VydmljZSB9IGZyb20gJ3NoYXJlZCc7XG5pbXBvcnQgeyBnZXRBZ2UsIGdsb2JhbGlzZURhdGVUaW1lLCBsb2NhbGlzZURhdGVUaW1lLCBzaGFsbG93Q29tcGFyZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZGF0ZUNvbXBhcmlzb24sIHdpdGhpbk5ZZWFycywgd2l0aGluTkhvdXJzLCB0cmFuc2xhdGVFcnJvciB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5cbmNvbnN0IGFwcERhdGFQcm9wZXJ0eVNldElkID0gJzM0ZDQ2NDc3LWFkNGItNDdiNC1iNTU1LTA2MzU4YjkyZjYwYyc7XG5jb25zdCBkZXZpY2VEYXRhUHJvcGVydHlTZXRJZCA9ICc3YTMyZDg1MS01ZTg5LTQ2YTYtYTRiNi1jY2ExNjJkYWNlMjknO1xuY29uc3QgcHJvcGVydHlDb2RlcyA9IFsnUmVjb3JkaW5nU2Vzc2lvbicsICdTdGF0dXMnLCAnVXNlckRldGFpbENoYW5nZUxvZyddO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGV0YWlsLWVkaXQnLCB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtZWRpdC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGV0YWlsRWRpdENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IENvbmZpZztcblxuICBzdGF0dXM6ICdlcnJvcicgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZ2VuZXJhdGluZycgfCAnc2VuZGluZycgfCAnbm91c2VyJyA9ICdsb2FkaW5nJztcblxuICAvLyBwb3B1bGF0ZWQgYnkgbG9hZCByZXF1ZXN0XG4gIHByaXZhdGUgZGV2aWNlRGF0YUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVjb3JkaW5nU2Vzc2lvbjogb2JqZWN0O1xuICBwcml2YXRlIHJlY29yZGluZ1N0YXJ0OiBzdHJpbmc7XG4gIHByaXZhdGUgaW5pdGlhbEZvcm1TdGF0ZTogb2JqZWN0O1xuICBwcml2YXRlIGRldGFpbENoYW5nZUxvZzogb2JqZWN0W107XG5cbiAgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgZG9iOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHdpdGhpbk5ZZWFycygxMjAsICdiZWZvcmUnKV0pLFxuICAgIGhlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDMwKSwgVmFsaWRhdG9ycy5tYXgoMjcyKV0pLFxuICAgIHdlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpLCBWYWxpZGF0b3JzLm1heCg2MzUpXSksXG4gICAgbWVhbFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICBtZWFsRW5kOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICB9LCBbXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxFbmQnLCAnbWVhbFN0YXJ0JywgJ2FmdGVyJyksXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxTdGFydCcsICdkb2InLCAnYWZ0ZXInKSxcbiAgXSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzaGFyZWQ6IFNoYXJlZFNlcnZpY2UpIHsgfVxuXG4gIHBhcnNlSW5wdXRFcnJvcnMobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3IobmFtZSwgY29udHJvbCk7XG4gIH1cblxuICAvLyBtYWtlIHN1cmUgdGhhbiBtb2RpZmljYXRpb25zIHRoYXQgZG9uJ3QgYWN0dWFsbHkgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgYXJlIG1hcmtlZCBhcyBzdWNoXG4gIHByaXZhdGUgbW9uaXRvckZvcm1DaGFuZ2VzKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoY3VycmVudCA9PiB7XG4gICAgICBpZiAoc2hhbGxvd0NvbXBhcmUoY3VycmVudCwgdGhpcy5pbml0aWFsRm9ybVN0YXRlKSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBoYW5kbGUgdGhlIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgcmVzcG9uc2UgYm9keVxuICBwcml2YXRlIGV4dHJhY3RGaWVsZHMocmVjb3JkaW5nU2Vzc2lvbjogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHsgcGF0aWVudCwgbWVhbFN0YXJ0LCBtZWFsRW5kLCByZWNvcmRpbmdTdGFydCB9ID0gcmVjb3JkaW5nU2Vzc2lvbjtcbiAgICB0aGlzLnJlY29yZGluZ1N0YXJ0ID0gcmVjb3JkaW5nU3RhcnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9iOiB0aGlzLmNvbmZpZy5vd25lcnNbMF0uZGF0ZU9mQmlydGgsXG4gICAgICBoZWlnaHQ6IHBhdGllbnQuaGVpZ2h0LFxuICAgICAgd2VpZ2h0OiBwYXRpZW50LndlaWdodCxcbiAgICAgIG1lYWxTdGFydDogbG9jYWxpc2VEYXRlVGltZShtZWFsU3RhcnQpLFxuICAgICAgbWVhbEVuZDogbG9jYWxpc2VEYXRlVGltZShtZWFsRW5kKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGlzZUZvcm0oc3RhdGU6IG9iamVjdCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoc3RhdGUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc1ByaXN0aW5lKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ21lYWxTdGFydCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnbWVhbEVuZCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuXG4gICAgdGhpcy5pbml0aWFsRm9ybVN0YXRlID0gc3RhdGU7IC8vIHNhdmUgdGhpcyBmb3IgdXNlIGluIHJlc2V0c1xuICAgIHRoaXMubW9uaXRvckZvcm1DaGFuZ2VzKCk7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgYSBwYXRjaCBvYmplY3QgZm9yIHRoZSBzYXZlIHJlcXVlc3RcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVGaWVsZHMobW9kczogdHlwZW9mIHRoaXMuZm9ybUdyb3VwLnZhbHVlLCByZWNvcmRpbmdTZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUU3RCxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxRQUFnQjtJQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsTUFBTSxZQUFZLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFMUQsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzNDLE1BQU0sUUFBUSxHQUFHLEdBQUcsSUFBSSxJQUFJLE1BQU0sSUFBSSxNQUFNLE1BQU0sQ0FBQztJQUVuRCxPQUFPLEdBQUcsUUFBUSxJQUFJLFFBQVEsR0FBRyxZQUFZLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxHQUFXO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVqRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2xDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7UUFDeEUsR0FBRyxFQUFFLENBQUM7S0FDUDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBYTtJQUNwQyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDakQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHN0cmlwIHRoZSB0aW1lem9uZSBvZmZzZXQgdG8gY3JlYXRlIGZvcm1hdCB1c2FibGUgYnkgPGlucHV0PlxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXNlRGF0ZVRpbWUoZGF0ZXRpbWU6IHN0cmluZykge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZXRpbWUpO1xuXG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7IGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBob3VyID0gZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgbWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBzZWNvbmQgPSBkYXRlLmdldFNlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fVQke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH1gO1xufVxuXG4vLyByZWNvbnN0cnVjdCBvcmlnaW5hbCBJU08gZm9ybWF0XG5leHBvcnQgZnVuY3Rpb24gZ2xvYmFsaXNlRGF0ZVRpbWUoZGF0ZXRpbWU6IHN0cmluZykge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZXRpbWUpO1xuXG4gIGNvbnN0IG9mZnNldCA9IC1kYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIGNvbnN0IG9mZnNldEFicyA9IE1hdGguYWJzKG9mZnNldCk7XG5cbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+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==
|