@huntsman-cancer-institute/cod 16.0.1 → 16.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/attribute-edit.component.d.ts +6 -6
- package/esm2022/components/attribute-configuration.component.mjs +3 -3
- package/esm2022/components/attribute-container.component.mjs +5 -5
- package/esm2022/components/attribute-edit.component.mjs +637 -625
- package/esm2022/services/attribute.service.mjs +11 -10
- package/fesm2022/huntsman-cancer-institute-cod.mjs +626 -613
- package/fesm2022/huntsman-cancer-institute-cod.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Component, ElementRef, Renderer2 } from
|
|
2
|
-
import { NgbModal } from
|
|
3
|
-
import { AttributeBase } from
|
|
4
|
-
import { AttributeService } from
|
|
1
|
+
import { Component, ElementRef, Renderer2 } from '@angular/core';
|
|
2
|
+
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
|
3
|
+
import { AttributeBase } from './attribute-base';
|
|
4
|
+
import { AttributeService } from '../services/attribute.service';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "../services/attribute.service";
|
|
7
7
|
import * as i2 from "@ng-bootstrap/ng-bootstrap";
|
|
@@ -11,11 +11,11 @@ import * as i5 from "@angular/forms";
|
|
|
11
11
|
import * as i6 from "@angular/material/datepicker";
|
|
12
12
|
import * as i7 from "@angular-material-components/datetime-picker";
|
|
13
13
|
/**
|
|
14
|
-
* This component is specifically designed to exist in a modal for editing.
|
|
15
|
-
* because components such as the grid need extra configuration for editing.
|
|
14
|
+
* This component is specifically designed to exist in a modal for editing.
|
|
15
|
+
* This is different from the flex attribute because components such as the grid need extra configuration for editing.
|
|
16
16
|
*/
|
|
17
17
|
export class AttributeEditComponent extends AttributeBase {
|
|
18
|
-
//dictionaryEndpoint = this.attributeService.dictionaryEndpoint;
|
|
18
|
+
// dictionaryEndpoint = this.attributeService.dictionaryEndpoint;
|
|
19
19
|
constructor(attributeService, elementRef, renderer, modalService) {
|
|
20
20
|
super(attributeService, elementRef, renderer, modalService);
|
|
21
21
|
}
|
|
@@ -24,649 +24,661 @@ export class AttributeEditComponent extends AttributeBase {
|
|
|
24
24
|
}
|
|
25
25
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttributeEditComponent, deps: [{ token: i1.AttributeService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.NgbModal }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
26
26
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AttributeEditComponent, selector: "hci-attribute-edit", usesInheritance: true, ngImport: i0, template: `
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
40
|
-
/>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
</ng-container>
|
|
44
|
-
|
|
45
|
-
<!-- Text -->
|
|
46
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'TXT'">
|
|
47
|
-
<div #attributeRef
|
|
48
|
-
class="d-flex flex-row">
|
|
49
|
-
<div class="d-flex col-md-6">
|
|
50
|
-
{{attribute.displayName}}
|
|
51
|
-
</div>
|
|
52
|
-
<div class="d-flex col-md-6">
|
|
53
|
-
<input #inputRef
|
|
54
|
-
type="text"
|
|
55
|
-
spellcheck="spellcheck"
|
|
56
|
-
lang="en"
|
|
57
|
-
[ngModel]="attributeValues[0].valueLongText.textData"
|
|
58
|
-
(ngModelChange)="valueTextChange($event)"
|
|
59
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
60
|
-
/>
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
</ng-container>
|
|
64
|
-
|
|
65
|
-
<!-- Numeric -->
|
|
66
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'N'">
|
|
67
|
-
<div #attributeRef
|
|
68
|
-
class="d-flex flex-row">
|
|
69
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
70
|
-
{{attribute.displayName}}
|
|
71
|
-
</div>
|
|
72
|
-
<div class="d-flex col-md-6">
|
|
73
|
-
<input #inputRef
|
|
74
|
-
type="number"
|
|
75
|
-
[ngModel]="attributeValues[0].valueNumeric"
|
|
76
|
-
(ngModelChange)="valueNumericChange($event)"/>
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
</ng-container>
|
|
80
|
-
|
|
81
|
-
<!-- Integer -->
|
|
82
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'I'">
|
|
83
|
-
<div #attributeRef
|
|
84
|
-
class="d-flex flex-row">
|
|
85
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
86
|
-
{{attribute.displayName}}
|
|
87
|
-
</div>
|
|
88
|
-
<div class="d-flex col-md-6">
|
|
89
|
-
<input #inputRef
|
|
90
|
-
type="number"
|
|
91
|
-
[ngModel]="attributeValues[0].valueInteger"
|
|
92
|
-
(ngModelChange)="valueIntegerChange($event)" />
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
</ng-container>
|
|
96
|
-
|
|
97
|
-
<!-- Date -->
|
|
98
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'D'">
|
|
99
|
-
<div #attributeRef
|
|
100
|
-
class="d-flex flex-row">
|
|
101
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
102
|
-
{{attribute.displayName}}
|
|
103
|
-
</div>
|
|
104
|
-
<div class="d-flex col-md-6">
|
|
105
|
-
<input #inputRef
|
|
106
|
-
matInput
|
|
107
|
-
name="valueDate"
|
|
108
|
-
[(ngModel)]="attributeValues[0].valueDate"
|
|
109
|
-
(ngModelChange)="valueDateChange($event)"
|
|
110
|
-
[matDatepicker]="valueDate"
|
|
111
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
112
|
-
>
|
|
113
|
-
<mat-datepicker-toggle matSuffix [for]="valueDate" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
114
|
-
<mat-datepicker #valueDate></mat-datepicker>
|
|
115
|
-
</div>
|
|
116
|
-
</div>
|
|
117
|
-
</ng-container>
|
|
118
|
-
|
|
119
|
-
<!-- Date Time -->
|
|
120
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'DT'">
|
|
121
|
-
<div #attributeRef
|
|
122
|
-
class="d-flex flex-row">
|
|
123
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
124
|
-
{{attribute.displayName}}
|
|
125
|
-
</div>
|
|
126
|
-
<div class="d-flex col-md-6">
|
|
127
|
-
<input #inputRef
|
|
128
|
-
matInput
|
|
129
|
-
name="valueDateTime"
|
|
130
|
-
[(ngModel)]="attributeValues[0].date"
|
|
131
|
-
(ngModelChange)="valueDateChange($event)"
|
|
132
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
133
|
-
[ngxMatDatetimePicker]="dtpicker">
|
|
134
|
-
<mat-datepicker-toggle matSuffix [for]="dtpicker" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
135
|
-
<ngx-mat-datetime-picker #dtpicker [showSeconds]="true"></ngx-mat-datetime-picker>
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
</ng-container>
|
|
139
|
-
|
|
140
|
-
<!-- Checkbox -->
|
|
141
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'CB'">
|
|
142
|
-
<div #attributeRef
|
|
143
|
-
class="d-flex flex-row">
|
|
144
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
145
|
-
{{attribute.displayName}}
|
|
146
|
-
</div>
|
|
147
|
-
<div class="d-flex col-md-6">
|
|
148
|
-
<input #inputRef
|
|
149
|
-
type="checkbox"
|
|
150
|
-
[checked]="attributeValues[0].valueString === 'Y'"
|
|
151
|
-
(change)="valueCheckboxChange($event)"
|
|
152
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
153
|
-
class="form-control" />
|
|
154
|
-
</div>
|
|
155
|
-
</div>
|
|
156
|
-
</ng-container>
|
|
157
|
-
|
|
158
|
-
<!-- Boolean -->
|
|
159
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'B'">
|
|
160
|
-
<div #attributeRef
|
|
161
|
-
class="d-flex flex-row">
|
|
162
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
163
|
-
{{attribute.displayName}}
|
|
164
|
-
</div>
|
|
165
|
-
<div class="d-flex col-md-6">
|
|
166
|
-
<select [ngModel]="attributeValues[0].valueString"
|
|
167
|
-
(ngModelChange)="valueStringChange($event)"
|
|
168
|
-
class="edit-renderer">
|
|
169
|
-
<option [ngValue]="undefined"></option>
|
|
170
|
-
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
171
|
-
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
172
|
-
</select>
|
|
173
|
-
</div>
|
|
174
|
-
</div>
|
|
175
|
-
</ng-container>
|
|
176
|
-
|
|
177
|
-
<!-- Extended Boolean -->
|
|
178
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'EB'">
|
|
179
|
-
<div #attributeRef
|
|
180
|
-
class="d-flex flex-row">
|
|
181
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
182
|
-
{{attribute.displayName}}
|
|
183
|
-
</div>
|
|
184
|
-
<div class="d-flex col-md-6">
|
|
185
|
-
<select [ngModel]="attributeValues[0].valueString"
|
|
186
|
-
(ngModelChange)="valueStringChange($event)"
|
|
187
|
-
class="edit-renderer">
|
|
188
|
-
<option [ngValue]="undefined"></option>
|
|
189
|
-
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
190
|
-
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
191
|
-
<option [ngValue]="'U'" [selected]="attributeValues[0].valueString === 'U'">Unknown</option>
|
|
192
|
-
</select>
|
|
193
|
-
</div>
|
|
194
|
-
</div>
|
|
195
|
-
</ng-container>
|
|
196
|
-
|
|
197
|
-
<!-- Choice: Single -->
|
|
198
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'N'">
|
|
199
|
-
<div #attributeRef
|
|
200
|
-
class="d-flex flex-row">
|
|
201
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
202
|
-
{{attribute.displayName}}
|
|
203
|
-
</div>
|
|
204
|
-
<div class="d-flex col-md-6">
|
|
205
|
-
<select [ngModel]="(attributeValues[0].valueAttributeChoice)?attributeValues[0].valueAttributeChoice.idAttributeChoice:undefined"
|
|
206
|
-
(ngModelChange)="valueChoiceChange($event)"
|
|
207
|
-
class="edit-renderer">
|
|
208
|
-
<option [ngValue]="undefined"></option>
|
|
209
|
-
<option *ngFor="let attributeChoice of attributeChoices"
|
|
210
|
-
[ngValue]="attributeChoice.idAttributeChoice">
|
|
211
|
-
{{ attributeChoice.choice }}
|
|
212
|
-
</option>
|
|
213
|
-
</select>
|
|
214
|
-
</div>
|
|
215
|
-
</div>
|
|
216
|
-
</ng-container>
|
|
217
|
-
|
|
218
|
-
<!-- Choice: Multi -->
|
|
219
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'Y'">
|
|
220
|
-
<div #attributeRef
|
|
221
|
-
class="d-flex flex-row">
|
|
222
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
223
|
-
{{attribute.displayName}}
|
|
224
|
-
</div>
|
|
225
|
-
<div class="d-flex flex-column col-md-6" style="row-gap: 5px">
|
|
226
|
-
<ng-container *ngFor="let attributeChoice of attributeChoices">
|
|
227
|
-
<div class="d-flex">
|
|
228
|
-
<input type="checkbox"
|
|
229
|
-
[checked]="attributeChoice.value"
|
|
27
|
+
<!-- String -->
|
|
28
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'S'">
|
|
29
|
+
<div #attributeRef
|
|
30
|
+
class="d-flex flex-row">
|
|
31
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
32
|
+
{{attribute.displayName}}
|
|
33
|
+
</div>
|
|
34
|
+
<div class="d-flex col-md-6">
|
|
35
|
+
<input #inputRef
|
|
36
|
+
type="text"
|
|
37
|
+
[ngModel]="attributeValues[0].valueString"
|
|
38
|
+
(ngModelChange)="valueStringChange($event)"
|
|
230
39
|
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
40
|
+
/>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</ng-container>
|
|
44
|
+
|
|
45
|
+
<!-- Text -->
|
|
46
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'TXT'">
|
|
47
|
+
<div #attributeRef
|
|
48
|
+
class="d-flex flex-row">
|
|
49
|
+
<div class="d-flex col-md-6">
|
|
50
|
+
{{attribute.displayName}}
|
|
51
|
+
</div>
|
|
52
|
+
<div class="d-flex col-md-6">
|
|
53
|
+
|
|
54
|
+
<textarea
|
|
55
|
+
#inputRef
|
|
56
|
+
type="text"
|
|
57
|
+
spellcheck="spellcheck"
|
|
58
|
+
lang="en"
|
|
59
|
+
[ngModel]="attributeValues[0].valueLongText.textData"
|
|
60
|
+
(ngModelChange)="valueTextChange($event)"
|
|
61
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
62
|
+
style="width: 500px; height: 125px; resize: none;"
|
|
63
|
+
>
|
|
64
|
+
</textarea>
|
|
65
|
+
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
</ng-container>
|
|
69
|
+
|
|
70
|
+
<!-- Numeric -->
|
|
71
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'N'">
|
|
72
|
+
<div #attributeRef
|
|
73
|
+
class="d-flex flex-row">
|
|
74
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
75
|
+
{{attribute.displayName}}
|
|
76
|
+
</div>
|
|
77
|
+
<div class="d-flex col-md-6">
|
|
78
|
+
<input #inputRef
|
|
79
|
+
type="number"
|
|
80
|
+
[ngModel]="attributeValues[0].valueNumeric"
|
|
81
|
+
(ngModelChange)="valueNumericChange($event)"/>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</ng-container>
|
|
85
|
+
|
|
86
|
+
<!-- Integer -->
|
|
87
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'I'">
|
|
88
|
+
<div #attributeRef
|
|
89
|
+
class="d-flex flex-row">
|
|
90
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
91
|
+
{{attribute.displayName}}
|
|
92
|
+
</div>
|
|
93
|
+
<div class="d-flex col-md-6">
|
|
94
|
+
<input #inputRef
|
|
95
|
+
type="number"
|
|
96
|
+
[ngModel]="attributeValues[0].valueInteger"
|
|
97
|
+
(ngModelChange)="valueIntegerChange($event)"/>
|
|
236
98
|
</div>
|
|
237
|
-
</
|
|
238
|
-
</
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
[
|
|
99
|
+
</div>
|
|
100
|
+
</ng-container>
|
|
101
|
+
|
|
102
|
+
<!-- Date -->
|
|
103
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'D'">
|
|
104
|
+
<div #attributeRef
|
|
105
|
+
class="d-flex flex-row">
|
|
106
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
107
|
+
{{attribute.displayName}}
|
|
108
|
+
</div>
|
|
109
|
+
<div class="d-flex col-md-6">
|
|
110
|
+
<input #inputRef
|
|
111
|
+
matInput
|
|
112
|
+
name="valueDate"
|
|
113
|
+
[(ngModel)]="attributeValues[0].valueDate"
|
|
114
|
+
(ngModelChange)="valueDateChange($event)"
|
|
115
|
+
[matDatepicker]="valueDate"
|
|
116
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
117
|
+
>
|
|
118
|
+
<mat-datepicker-toggle matSuffix [for]="valueDate" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
119
|
+
<mat-datepicker #valueDate></mat-datepicker>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</ng-container>
|
|
123
|
+
|
|
124
|
+
<!-- Date Time -->
|
|
125
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'DT'">
|
|
126
|
+
<div #attributeRef
|
|
127
|
+
class="d-flex flex-row">
|
|
128
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
129
|
+
{{attribute.displayName}}
|
|
130
|
+
</div>
|
|
131
|
+
<div class="d-flex col-md-6">
|
|
132
|
+
<input #inputRef
|
|
133
|
+
matInput
|
|
134
|
+
name="valueDateTime"
|
|
135
|
+
[(ngModel)]="attributeValues[0].date"
|
|
136
|
+
(ngModelChange)="valueDateChange($event)"
|
|
254
137
|
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
255
|
-
|
|
138
|
+
[ngxMatDatetimePicker]="dtpicker">
|
|
139
|
+
<mat-datepicker-toggle matSuffix [for]="dtpicker" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
140
|
+
<ngx-mat-datetime-picker #dtpicker [showSeconds]="true"></ngx-mat-datetime-picker>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</ng-container>
|
|
144
|
+
|
|
145
|
+
<!-- Checkbox -->
|
|
146
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'CB'">
|
|
147
|
+
<div #attributeRef
|
|
148
|
+
class="d-flex flex-row">
|
|
149
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
150
|
+
{{attribute.displayName}}
|
|
151
|
+
</div>
|
|
152
|
+
<div class="d-flex col-md-6">
|
|
153
|
+
<input #inputRef
|
|
154
|
+
type="checkbox"
|
|
155
|
+
[checked]="attributeValues[0].valueString === 'Y'"
|
|
156
|
+
(change)="valueCheckboxChange($event)"
|
|
256
157
|
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
257
|
-
class="form-control
|
|
258
|
-
<div class="cod-label pl-1">
|
|
259
|
-
{{entry.display}}
|
|
260
|
-
</div>
|
|
158
|
+
class="form-control"/>
|
|
261
159
|
</div>
|
|
262
|
-
</
|
|
263
|
-
</
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
160
|
+
</div>
|
|
161
|
+
</ng-container>
|
|
162
|
+
|
|
163
|
+
<!-- Boolean -->
|
|
164
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'B'">
|
|
165
|
+
<div #attributeRef
|
|
166
|
+
class="d-flex flex-row">
|
|
167
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
168
|
+
{{attribute.displayName}}
|
|
169
|
+
</div>
|
|
170
|
+
<div class="d-flex col-md-6">
|
|
171
|
+
<select [ngModel]="attributeValues[0].valueString"
|
|
172
|
+
(ngModelChange)="valueStringChange($event)"
|
|
173
|
+
class="edit-renderer">
|
|
174
|
+
<option [ngValue]="undefined"></option>
|
|
175
|
+
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
176
|
+
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
177
|
+
</select>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
</ng-container>
|
|
181
|
+
|
|
182
|
+
<!-- Extended Boolean -->
|
|
183
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'EB'">
|
|
184
|
+
<div #attributeRef
|
|
185
|
+
class="d-flex flex-row">
|
|
186
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
187
|
+
{{attribute.displayName}}
|
|
188
|
+
</div>
|
|
189
|
+
<div class="d-flex col-md-6">
|
|
190
|
+
<select [ngModel]="attributeValues[0].valueString"
|
|
191
|
+
(ngModelChange)="valueStringChange($event)"
|
|
192
|
+
class="edit-renderer">
|
|
193
|
+
<option [ngValue]="undefined"></option>
|
|
194
|
+
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
195
|
+
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
196
|
+
<option [ngValue]="'U'" [selected]="attributeValues[0].valueString === 'U'">Unknown</option>
|
|
197
|
+
</select>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
</ng-container>
|
|
201
|
+
|
|
202
|
+
<!-- Choice: Single -->
|
|
203
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'N'">
|
|
204
|
+
<div #attributeRef
|
|
205
|
+
class="d-flex flex-row">
|
|
206
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
207
|
+
{{attribute.displayName}}
|
|
208
|
+
</div>
|
|
209
|
+
<div class="d-flex col-md-6">
|
|
210
|
+
<select
|
|
211
|
+
[ngModel]="(attributeValues[0].valueAttributeChoice)?attributeValues[0].valueAttributeChoice.idAttributeChoice:undefined"
|
|
212
|
+
(ngModelChange)="valueChoiceChange($event)"
|
|
213
|
+
class="edit-renderer">
|
|
214
|
+
<option [ngValue]="undefined"></option>
|
|
215
|
+
<option *ngFor="let attributeChoice of attributeChoices"
|
|
216
|
+
[ngValue]="attributeChoice.idAttributeChoice">
|
|
217
|
+
{{ attributeChoice.choice }}
|
|
218
|
+
</option>
|
|
219
|
+
</select>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
</ng-container>
|
|
223
|
+
|
|
224
|
+
<!-- Choice: Multi -->
|
|
225
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'Y'">
|
|
226
|
+
<div #attributeRef
|
|
227
|
+
class="d-flex flex-row">
|
|
228
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
229
|
+
{{attribute.displayName}}
|
|
230
|
+
</div>
|
|
231
|
+
<div class="d-flex flex-column col-md-6" style="row-gap: 5px">
|
|
232
|
+
<ng-container *ngFor="let attributeChoice of attributeChoices">
|
|
233
|
+
<div class="d-flex">
|
|
234
|
+
<input type="checkbox"
|
|
235
|
+
[checked]="attributeChoice.value"
|
|
236
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
237
|
+
(change)="valueMultiChoiceChange(attributeChoice)"
|
|
238
|
+
class="form-control checkbox mt-auto mb-auto mr-2"/>
|
|
239
|
+
<div class="cod-label pl-1">
|
|
240
|
+
{{attributeChoice.choice}}
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
</ng-container>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
</ng-container>
|
|
247
|
+
|
|
248
|
+
<!-- Dictionary: Multi -->
|
|
249
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'DICT' && attribute.isMultiValue === 'Y'">
|
|
250
|
+
<div #attributeRef
|
|
251
|
+
class="d-flex flex-row">
|
|
252
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
253
|
+
{{attribute.displayName}}
|
|
254
|
+
</div>
|
|
255
|
+
<div class="d-flex flex-column col-md-6" style="row-gap: 5px">
|
|
256
|
+
<ng-container *ngFor="let entry of dictionaryEntries">
|
|
257
|
+
<div class="d-flex">
|
|
258
|
+
<input type="checkbox"
|
|
259
|
+
[checked]="entry.checked"
|
|
260
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
261
|
+
(change)="valueMultiDictChange(entry)"
|
|
262
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
263
|
+
class="form-control checkbox"/>
|
|
264
|
+
<div class="cod-label pl-1">
|
|
265
|
+
{{entry.display}}
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
</ng-container>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
</ng-container>
|
|
272
|
+
|
|
273
|
+
<!-- Dictionary -->
|
|
274
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'DICT' && attribute.isMultiValue === 'N'">
|
|
275
|
+
<div #attributeRef
|
|
276
|
+
class="d-flex flex-row">
|
|
277
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
278
|
+
{{attribute.displayName}}
|
|
279
|
+
</div>
|
|
280
|
+
<div class="d-flex col-md-6">
|
|
281
|
+
<select #inputRef
|
|
282
|
+
[ngModel]="attributeValues[0].valueIdDictionary"
|
|
283
|
+
(ngModelChange)="valueDictChange($event)"
|
|
284
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
285
|
+
class="form-control edit-renderer">
|
|
286
|
+
<option [ngValue]="undefined"></option>
|
|
287
|
+
<option *ngFor="let entry of dictionaryEntries"
|
|
288
|
+
[ngValue]="entry.value">
|
|
289
|
+
{{ entry.display }}
|
|
290
|
+
</option>
|
|
291
|
+
</select>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
</ng-container>
|
|
295
|
+
|
|
296
|
+
<!-- Grid -->
|
|
297
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'GA'">
|
|
298
|
+
<div #attributeRef
|
|
299
|
+
class="d-flex flex-column">
|
|
300
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-12">
|
|
301
|
+
<div>
|
|
302
|
+
{{attribute.displayName}}
|
|
303
|
+
</div>
|
|
304
|
+
<div style="margin-left: auto;">
|
|
305
|
+
<button class="btn-ga" (click)="addGridRow(editGridModal, attribute.idAttribute)">
|
|
300
306
|
<span class="ga-icon">
|
|
301
307
|
<i class="fas fa-plus fa-xs"></i>
|
|
302
308
|
</span>
|
|
303
|
-
|
|
304
|
-
|
|
309
|
+
</button>
|
|
310
|
+
<button class="btn-ga" (click)="removeGridRow(attribute.idAttribute)">
|
|
305
311
|
<span class="ga-icon">
|
|
306
312
|
<i class="fas fa-minus fa-xs"></i>
|
|
307
313
|
</span>
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
</ng-container>
|
|
328
|
-
|
|
329
|
-
<ng-template #editGridModal let-close="close">
|
|
330
|
-
<div class="modal-header">
|
|
331
|
-
{{attribute.displayName}} Grid Row
|
|
332
|
-
</div>
|
|
333
|
-
<div class="modal-body d-flex flex-column hci-cod-edit">
|
|
334
|
-
<ng-container *ngFor="let attribute of editGroupRowAttributes">
|
|
335
|
-
<hci-attribute-edit [id]="'edit-id-attribute-' + attribute.idAttribute"
|
|
336
|
-
[groupAttributeRowId]="editGroupAttributeRowId"
|
|
337
|
-
[attribute]="attribute"
|
|
338
|
-
class="attribute"></hci-attribute-edit>
|
|
314
|
+
</button>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
<div class="d-flex col-md-12">
|
|
318
|
+
<ag-grid-angular #gridAttribute
|
|
319
|
+
class="ag-theme-alpine"
|
|
320
|
+
(gridReady)="this.onGridReady($event)"
|
|
321
|
+
(modelUpdated)="onModelUpdated($event)"
|
|
322
|
+
(gridSizeChanged)="onGridSizeChanged($event)"
|
|
323
|
+
(rowDoubleClicked)="editGridRow(editGridModal, attribute.idAttribute, $event)"
|
|
324
|
+
[gridOptions]="this.gridOptions"
|
|
325
|
+
[rowSelection]="'single'"
|
|
326
|
+
[columnDefs]="gridColumns"
|
|
327
|
+
[rowData]="gridData"
|
|
328
|
+
[style.width]="attribute.w + 'px'"
|
|
329
|
+
[style.height]="attribute.h + 'px'">
|
|
330
|
+
</ag-grid-angular>
|
|
331
|
+
</div>
|
|
332
|
+
</div>
|
|
339
333
|
</ng-container>
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
`, isInline: true, styles: [".hci-cod button.mat-icon-button.mat-button-base{height:20px;width:20px;line-height:unset}.btn-ga{padding:0;height:18px;width:18px}.ga-icon{font-size:.9em;vertical-align:top}.hci-cod .mat-datepicker-toggle-default-icon{height:20px;width:20px}\n"], dependencies: [{ kind: "component", type: i3.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i6.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i6.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i7.NgxMatDatetimepicker, selector: "ngx-mat-datetime-picker", exportAs: ["ngxMatDatetimePicker"] }, { kind: "directive", type: i7.NgxMatDatepickerInput, selector: "input[ngxMatDatetimePicker]", inputs: ["ngxMatDatetimePicker", "min", "max", "matDatepickerFilter"], exportAs: ["ngxMatDatepickerInput"] }, { kind: "component", type: AttributeEditComponent, selector: "hci-attribute-edit" }] }); }
|
|
334
|
+
|
|
335
|
+
<ng-template #editGridModal let-close="close">
|
|
336
|
+
<div class="modal-header">
|
|
337
|
+
{{attribute.displayName}} Grid Row
|
|
338
|
+
</div>
|
|
339
|
+
<div class="modal-body d-flex flex-column hci-cod-edit">
|
|
340
|
+
<ng-container *ngFor="let attribute of editGroupRowAttributes">
|
|
341
|
+
<hci-attribute-edit [id]="'edit-id-attribute-' + attribute.idAttribute"
|
|
342
|
+
[groupAttributeRowId]="editGroupAttributeRowId"
|
|
343
|
+
[attribute]="attribute"
|
|
344
|
+
class="attribute"></hci-attribute-edit>
|
|
345
|
+
</ng-container>
|
|
346
|
+
</div>
|
|
347
|
+
<div class="modal-footer">
|
|
348
|
+
<button class="btn btn-primary" (click)="close('Save')">Save</button>
|
|
349
|
+
<button class="btn btn-primary" (click)="close('Cancel')">Cancel</button>
|
|
350
|
+
</div>
|
|
351
|
+
</ng-template>
|
|
352
|
+
`, isInline: true, styles: [".hci-cod button.mat-icon-button.mat-button-base{height:20px;width:20px;line-height:unset}.btn-ga{padding:0;height:18px;width:18px}.ga-icon{font-size:.9em;vertical-align:top}.hci-cod .mat-datepicker-toggle-default-icon{height:20px;width:20px}\n"], dependencies: [{ kind: "component", type: i3.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i6.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i6.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i7.NgxMatDatetimepicker, selector: "ngx-mat-datetime-picker", exportAs: ["ngxMatDatetimePicker"] }, { kind: "directive", type: i7.NgxMatDatepickerInput, selector: "input[ngxMatDatetimePicker]", inputs: ["ngxMatDatetimePicker", "min", "max", "matDatepickerFilter"], exportAs: ["ngxMatDatepickerInput"] }, { kind: "component", type: AttributeEditComponent, selector: "hci-attribute-edit" }] }); }
|
|
347
353
|
}
|
|
348
354
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttributeEditComponent, decorators: [{
|
|
349
355
|
type: Component,
|
|
350
|
-
args: [{ selector:
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
364
|
-
/>
|
|
365
|
-
</div>
|
|
366
|
-
</div>
|
|
367
|
-
</ng-container>
|
|
368
|
-
|
|
369
|
-
<!-- Text -->
|
|
370
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'TXT'">
|
|
371
|
-
<div #attributeRef
|
|
372
|
-
class="d-flex flex-row">
|
|
373
|
-
<div class="d-flex col-md-6">
|
|
374
|
-
{{attribute.displayName}}
|
|
375
|
-
</div>
|
|
376
|
-
<div class="d-flex col-md-6">
|
|
377
|
-
<input #inputRef
|
|
378
|
-
type="text"
|
|
379
|
-
spellcheck="spellcheck"
|
|
380
|
-
lang="en"
|
|
381
|
-
[ngModel]="attributeValues[0].valueLongText.textData"
|
|
382
|
-
(ngModelChange)="valueTextChange($event)"
|
|
383
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
384
|
-
/>
|
|
385
|
-
</div>
|
|
386
|
-
</div>
|
|
387
|
-
</ng-container>
|
|
388
|
-
|
|
389
|
-
<!-- Numeric -->
|
|
390
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'N'">
|
|
391
|
-
<div #attributeRef
|
|
392
|
-
class="d-flex flex-row">
|
|
393
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
394
|
-
{{attribute.displayName}}
|
|
395
|
-
</div>
|
|
396
|
-
<div class="d-flex col-md-6">
|
|
397
|
-
<input #inputRef
|
|
398
|
-
type="number"
|
|
399
|
-
[ngModel]="attributeValues[0].valueNumeric"
|
|
400
|
-
(ngModelChange)="valueNumericChange($event)"/>
|
|
401
|
-
</div>
|
|
402
|
-
</div>
|
|
403
|
-
</ng-container>
|
|
404
|
-
|
|
405
|
-
<!-- Integer -->
|
|
406
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'I'">
|
|
407
|
-
<div #attributeRef
|
|
408
|
-
class="d-flex flex-row">
|
|
409
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
410
|
-
{{attribute.displayName}}
|
|
411
|
-
</div>
|
|
412
|
-
<div class="d-flex col-md-6">
|
|
413
|
-
<input #inputRef
|
|
414
|
-
type="number"
|
|
415
|
-
[ngModel]="attributeValues[0].valueInteger"
|
|
416
|
-
(ngModelChange)="valueIntegerChange($event)" />
|
|
417
|
-
</div>
|
|
418
|
-
</div>
|
|
419
|
-
</ng-container>
|
|
420
|
-
|
|
421
|
-
<!-- Date -->
|
|
422
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'D'">
|
|
423
|
-
<div #attributeRef
|
|
424
|
-
class="d-flex flex-row">
|
|
425
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
426
|
-
{{attribute.displayName}}
|
|
427
|
-
</div>
|
|
428
|
-
<div class="d-flex col-md-6">
|
|
429
|
-
<input #inputRef
|
|
430
|
-
matInput
|
|
431
|
-
name="valueDate"
|
|
432
|
-
[(ngModel)]="attributeValues[0].valueDate"
|
|
433
|
-
(ngModelChange)="valueDateChange($event)"
|
|
434
|
-
[matDatepicker]="valueDate"
|
|
435
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
436
|
-
>
|
|
437
|
-
<mat-datepicker-toggle matSuffix [for]="valueDate" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
438
|
-
<mat-datepicker #valueDate></mat-datepicker>
|
|
439
|
-
</div>
|
|
440
|
-
</div>
|
|
441
|
-
</ng-container>
|
|
442
|
-
|
|
443
|
-
<!-- Date Time -->
|
|
444
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'DT'">
|
|
445
|
-
<div #attributeRef
|
|
446
|
-
class="d-flex flex-row">
|
|
447
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
448
|
-
{{attribute.displayName}}
|
|
449
|
-
</div>
|
|
450
|
-
<div class="d-flex col-md-6">
|
|
451
|
-
<input #inputRef
|
|
452
|
-
matInput
|
|
453
|
-
name="valueDateTime"
|
|
454
|
-
[(ngModel)]="attributeValues[0].date"
|
|
455
|
-
(ngModelChange)="valueDateChange($event)"
|
|
456
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
457
|
-
[ngxMatDatetimePicker]="dtpicker">
|
|
458
|
-
<mat-datepicker-toggle matSuffix [for]="dtpicker" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
459
|
-
<ngx-mat-datetime-picker #dtpicker [showSeconds]="true"></ngx-mat-datetime-picker>
|
|
460
|
-
</div>
|
|
461
|
-
</div>
|
|
462
|
-
</ng-container>
|
|
463
|
-
|
|
464
|
-
<!-- Checkbox -->
|
|
465
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'CB'">
|
|
466
|
-
<div #attributeRef
|
|
467
|
-
class="d-flex flex-row">
|
|
468
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
469
|
-
{{attribute.displayName}}
|
|
470
|
-
</div>
|
|
471
|
-
<div class="d-flex col-md-6">
|
|
472
|
-
<input #inputRef
|
|
473
|
-
type="checkbox"
|
|
474
|
-
[checked]="attributeValues[0].valueString === 'Y'"
|
|
475
|
-
(change)="valueCheckboxChange($event)"
|
|
476
|
-
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
477
|
-
class="form-control" />
|
|
478
|
-
</div>
|
|
479
|
-
</div>
|
|
480
|
-
</ng-container>
|
|
481
|
-
|
|
482
|
-
<!-- Boolean -->
|
|
483
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'B'">
|
|
484
|
-
<div #attributeRef
|
|
485
|
-
class="d-flex flex-row">
|
|
486
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
487
|
-
{{attribute.displayName}}
|
|
488
|
-
</div>
|
|
489
|
-
<div class="d-flex col-md-6">
|
|
490
|
-
<select [ngModel]="attributeValues[0].valueString"
|
|
491
|
-
(ngModelChange)="valueStringChange($event)"
|
|
492
|
-
class="edit-renderer">
|
|
493
|
-
<option [ngValue]="undefined"></option>
|
|
494
|
-
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
495
|
-
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
496
|
-
</select>
|
|
497
|
-
</div>
|
|
498
|
-
</div>
|
|
499
|
-
</ng-container>
|
|
500
|
-
|
|
501
|
-
<!-- Extended Boolean -->
|
|
502
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'EB'">
|
|
503
|
-
<div #attributeRef
|
|
504
|
-
class="d-flex flex-row">
|
|
505
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
506
|
-
{{attribute.displayName}}
|
|
507
|
-
</div>
|
|
508
|
-
<div class="d-flex col-md-6">
|
|
509
|
-
<select [ngModel]="attributeValues[0].valueString"
|
|
510
|
-
(ngModelChange)="valueStringChange($event)"
|
|
511
|
-
class="edit-renderer">
|
|
512
|
-
<option [ngValue]="undefined"></option>
|
|
513
|
-
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
514
|
-
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
515
|
-
<option [ngValue]="'U'" [selected]="attributeValues[0].valueString === 'U'">Unknown</option>
|
|
516
|
-
</select>
|
|
517
|
-
</div>
|
|
518
|
-
</div>
|
|
519
|
-
</ng-container>
|
|
520
|
-
|
|
521
|
-
<!-- Choice: Single -->
|
|
522
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'N'">
|
|
523
|
-
<div #attributeRef
|
|
524
|
-
class="d-flex flex-row">
|
|
525
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
526
|
-
{{attribute.displayName}}
|
|
527
|
-
</div>
|
|
528
|
-
<div class="d-flex col-md-6">
|
|
529
|
-
<select [ngModel]="(attributeValues[0].valueAttributeChoice)?attributeValues[0].valueAttributeChoice.idAttributeChoice:undefined"
|
|
530
|
-
(ngModelChange)="valueChoiceChange($event)"
|
|
531
|
-
class="edit-renderer">
|
|
532
|
-
<option [ngValue]="undefined"></option>
|
|
533
|
-
<option *ngFor="let attributeChoice of attributeChoices"
|
|
534
|
-
[ngValue]="attributeChoice.idAttributeChoice">
|
|
535
|
-
{{ attributeChoice.choice }}
|
|
536
|
-
</option>
|
|
537
|
-
</select>
|
|
538
|
-
</div>
|
|
539
|
-
</div>
|
|
540
|
-
</ng-container>
|
|
541
|
-
|
|
542
|
-
<!-- Choice: Multi -->
|
|
543
|
-
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'Y'">
|
|
544
|
-
<div #attributeRef
|
|
545
|
-
class="d-flex flex-row">
|
|
546
|
-
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
547
|
-
{{attribute.displayName}}
|
|
548
|
-
</div>
|
|
549
|
-
<div class="d-flex flex-column col-md-6" style="row-gap: 5px">
|
|
550
|
-
<ng-container *ngFor="let attributeChoice of attributeChoices">
|
|
551
|
-
<div class="d-flex">
|
|
552
|
-
<input type="checkbox"
|
|
553
|
-
[checked]="attributeChoice.value"
|
|
356
|
+
args: [{ selector: 'hci-attribute-edit', template: `
|
|
357
|
+
<!-- String -->
|
|
358
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'S'">
|
|
359
|
+
<div #attributeRef
|
|
360
|
+
class="d-flex flex-row">
|
|
361
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
362
|
+
{{attribute.displayName}}
|
|
363
|
+
</div>
|
|
364
|
+
<div class="d-flex col-md-6">
|
|
365
|
+
<input #inputRef
|
|
366
|
+
type="text"
|
|
367
|
+
[ngModel]="attributeValues[0].valueString"
|
|
368
|
+
(ngModelChange)="valueStringChange($event)"
|
|
554
369
|
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
370
|
+
/>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
</ng-container>
|
|
374
|
+
|
|
375
|
+
<!-- Text -->
|
|
376
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'TXT'">
|
|
377
|
+
<div #attributeRef
|
|
378
|
+
class="d-flex flex-row">
|
|
379
|
+
<div class="d-flex col-md-6">
|
|
380
|
+
{{attribute.displayName}}
|
|
381
|
+
</div>
|
|
382
|
+
<div class="d-flex col-md-6">
|
|
383
|
+
|
|
384
|
+
<textarea
|
|
385
|
+
#inputRef
|
|
386
|
+
type="text"
|
|
387
|
+
spellcheck="spellcheck"
|
|
388
|
+
lang="en"
|
|
389
|
+
[ngModel]="attributeValues[0].valueLongText.textData"
|
|
390
|
+
(ngModelChange)="valueTextChange($event)"
|
|
391
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
392
|
+
style="width: 500px; height: 125px; resize: none;"
|
|
393
|
+
>
|
|
394
|
+
</textarea>
|
|
395
|
+
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
</ng-container>
|
|
399
|
+
|
|
400
|
+
<!-- Numeric -->
|
|
401
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'N'">
|
|
402
|
+
<div #attributeRef
|
|
403
|
+
class="d-flex flex-row">
|
|
404
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
405
|
+
{{attribute.displayName}}
|
|
406
|
+
</div>
|
|
407
|
+
<div class="d-flex col-md-6">
|
|
408
|
+
<input #inputRef
|
|
409
|
+
type="number"
|
|
410
|
+
[ngModel]="attributeValues[0].valueNumeric"
|
|
411
|
+
(ngModelChange)="valueNumericChange($event)"/>
|
|
412
|
+
</div>
|
|
413
|
+
</div>
|
|
414
|
+
</ng-container>
|
|
415
|
+
|
|
416
|
+
<!-- Integer -->
|
|
417
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'I'">
|
|
418
|
+
<div #attributeRef
|
|
419
|
+
class="d-flex flex-row">
|
|
420
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
421
|
+
{{attribute.displayName}}
|
|
422
|
+
</div>
|
|
423
|
+
<div class="d-flex col-md-6">
|
|
424
|
+
<input #inputRef
|
|
425
|
+
type="number"
|
|
426
|
+
[ngModel]="attributeValues[0].valueInteger"
|
|
427
|
+
(ngModelChange)="valueIntegerChange($event)"/>
|
|
560
428
|
</div>
|
|
561
|
-
</
|
|
562
|
-
</
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
[
|
|
429
|
+
</div>
|
|
430
|
+
</ng-container>
|
|
431
|
+
|
|
432
|
+
<!-- Date -->
|
|
433
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'D'">
|
|
434
|
+
<div #attributeRef
|
|
435
|
+
class="d-flex flex-row">
|
|
436
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
437
|
+
{{attribute.displayName}}
|
|
438
|
+
</div>
|
|
439
|
+
<div class="d-flex col-md-6">
|
|
440
|
+
<input #inputRef
|
|
441
|
+
matInput
|
|
442
|
+
name="valueDate"
|
|
443
|
+
[(ngModel)]="attributeValues[0].valueDate"
|
|
444
|
+
(ngModelChange)="valueDateChange($event)"
|
|
445
|
+
[matDatepicker]="valueDate"
|
|
446
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
447
|
+
>
|
|
448
|
+
<mat-datepicker-toggle matSuffix [for]="valueDate" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
449
|
+
<mat-datepicker #valueDate></mat-datepicker>
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
</ng-container>
|
|
453
|
+
|
|
454
|
+
<!-- Date Time -->
|
|
455
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'DT'">
|
|
456
|
+
<div #attributeRef
|
|
457
|
+
class="d-flex flex-row">
|
|
458
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
459
|
+
{{attribute.displayName}}
|
|
460
|
+
</div>
|
|
461
|
+
<div class="d-flex col-md-6">
|
|
462
|
+
<input #inputRef
|
|
463
|
+
matInput
|
|
464
|
+
name="valueDateTime"
|
|
465
|
+
[(ngModel)]="attributeValues[0].date"
|
|
466
|
+
(ngModelChange)="valueDateChange($event)"
|
|
578
467
|
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
579
|
-
|
|
468
|
+
[ngxMatDatetimePicker]="dtpicker">
|
|
469
|
+
<mat-datepicker-toggle matSuffix [for]="dtpicker" class="cod-dp-toggle"></mat-datepicker-toggle>
|
|
470
|
+
<ngx-mat-datetime-picker #dtpicker [showSeconds]="true"></ngx-mat-datetime-picker>
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
</ng-container>
|
|
474
|
+
|
|
475
|
+
<!-- Checkbox -->
|
|
476
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'CB'">
|
|
477
|
+
<div #attributeRef
|
|
478
|
+
class="d-flex flex-row">
|
|
479
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
480
|
+
{{attribute.displayName}}
|
|
481
|
+
</div>
|
|
482
|
+
<div class="d-flex col-md-6">
|
|
483
|
+
<input #inputRef
|
|
484
|
+
type="checkbox"
|
|
485
|
+
[checked]="attributeValues[0].valueString === 'Y'"
|
|
486
|
+
(change)="valueCheckboxChange($event)"
|
|
580
487
|
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
581
|
-
class="form-control
|
|
582
|
-
<div class="cod-label pl-1">
|
|
583
|
-
{{entry.display}}
|
|
584
|
-
</div>
|
|
488
|
+
class="form-control"/>
|
|
585
489
|
</div>
|
|
586
|
-
</
|
|
587
|
-
</
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
490
|
+
</div>
|
|
491
|
+
</ng-container>
|
|
492
|
+
|
|
493
|
+
<!-- Boolean -->
|
|
494
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'B'">
|
|
495
|
+
<div #attributeRef
|
|
496
|
+
class="d-flex flex-row">
|
|
497
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
498
|
+
{{attribute.displayName}}
|
|
499
|
+
</div>
|
|
500
|
+
<div class="d-flex col-md-6">
|
|
501
|
+
<select [ngModel]="attributeValues[0].valueString"
|
|
502
|
+
(ngModelChange)="valueStringChange($event)"
|
|
503
|
+
class="edit-renderer">
|
|
504
|
+
<option [ngValue]="undefined"></option>
|
|
505
|
+
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
506
|
+
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
507
|
+
</select>
|
|
508
|
+
</div>
|
|
509
|
+
</div>
|
|
510
|
+
</ng-container>
|
|
511
|
+
|
|
512
|
+
<!-- Extended Boolean -->
|
|
513
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'EB'">
|
|
514
|
+
<div #attributeRef
|
|
515
|
+
class="d-flex flex-row">
|
|
516
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
517
|
+
{{attribute.displayName}}
|
|
518
|
+
</div>
|
|
519
|
+
<div class="d-flex col-md-6">
|
|
520
|
+
<select [ngModel]="attributeValues[0].valueString"
|
|
521
|
+
(ngModelChange)="valueStringChange($event)"
|
|
522
|
+
class="edit-renderer">
|
|
523
|
+
<option [ngValue]="undefined"></option>
|
|
524
|
+
<option [ngValue]="'Y'" [selected]="attributeValues[0].valueString === 'Y'">Yes</option>
|
|
525
|
+
<option [ngValue]="'N'" [selected]="attributeValues[0].valueString === 'N'">No</option>
|
|
526
|
+
<option [ngValue]="'U'" [selected]="attributeValues[0].valueString === 'U'">Unknown</option>
|
|
527
|
+
</select>
|
|
528
|
+
</div>
|
|
529
|
+
</div>
|
|
530
|
+
</ng-container>
|
|
531
|
+
|
|
532
|
+
<!-- Choice: Single -->
|
|
533
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'N'">
|
|
534
|
+
<div #attributeRef
|
|
535
|
+
class="d-flex flex-row">
|
|
536
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
537
|
+
{{attribute.displayName}}
|
|
538
|
+
</div>
|
|
539
|
+
<div class="d-flex col-md-6">
|
|
540
|
+
<select
|
|
541
|
+
[ngModel]="(attributeValues[0].valueAttributeChoice)?attributeValues[0].valueAttributeChoice.idAttributeChoice:undefined"
|
|
542
|
+
(ngModelChange)="valueChoiceChange($event)"
|
|
543
|
+
class="edit-renderer">
|
|
544
|
+
<option [ngValue]="undefined"></option>
|
|
545
|
+
<option *ngFor="let attributeChoice of attributeChoices"
|
|
546
|
+
[ngValue]="attributeChoice.idAttributeChoice">
|
|
547
|
+
{{ attributeChoice.choice }}
|
|
548
|
+
</option>
|
|
549
|
+
</select>
|
|
550
|
+
</div>
|
|
551
|
+
</div>
|
|
552
|
+
</ng-container>
|
|
553
|
+
|
|
554
|
+
<!-- Choice: Multi -->
|
|
555
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'AC' && attribute.isMultiValue === 'Y'">
|
|
556
|
+
<div #attributeRef
|
|
557
|
+
class="d-flex flex-row">
|
|
558
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
559
|
+
{{attribute.displayName}}
|
|
560
|
+
</div>
|
|
561
|
+
<div class="d-flex flex-column col-md-6" style="row-gap: 5px">
|
|
562
|
+
<ng-container *ngFor="let attributeChoice of attributeChoices">
|
|
563
|
+
<div class="d-flex">
|
|
564
|
+
<input type="checkbox"
|
|
565
|
+
[checked]="attributeChoice.value"
|
|
566
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
567
|
+
(change)="valueMultiChoiceChange(attributeChoice)"
|
|
568
|
+
class="form-control checkbox mt-auto mb-auto mr-2"/>
|
|
569
|
+
<div class="cod-label pl-1">
|
|
570
|
+
{{attributeChoice.choice}}
|
|
571
|
+
</div>
|
|
572
|
+
</div>
|
|
573
|
+
</ng-container>
|
|
574
|
+
</div>
|
|
575
|
+
</div>
|
|
576
|
+
</ng-container>
|
|
577
|
+
|
|
578
|
+
<!-- Dictionary: Multi -->
|
|
579
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'DICT' && attribute.isMultiValue === 'Y'">
|
|
580
|
+
<div #attributeRef
|
|
581
|
+
class="d-flex flex-row">
|
|
582
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
583
|
+
{{attribute.displayName}}
|
|
584
|
+
</div>
|
|
585
|
+
<div class="d-flex flex-column col-md-6" style="row-gap: 5px">
|
|
586
|
+
<ng-container *ngFor="let entry of dictionaryEntries">
|
|
587
|
+
<div class="d-flex">
|
|
588
|
+
<input type="checkbox"
|
|
589
|
+
[checked]="entry.checked"
|
|
590
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
591
|
+
(change)="valueMultiDictChange(entry)"
|
|
592
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
593
|
+
class="form-control checkbox"/>
|
|
594
|
+
<div class="cod-label pl-1">
|
|
595
|
+
{{entry.display}}
|
|
596
|
+
</div>
|
|
597
|
+
</div>
|
|
598
|
+
</ng-container>
|
|
599
|
+
</div>
|
|
600
|
+
</div>
|
|
601
|
+
</ng-container>
|
|
602
|
+
|
|
603
|
+
<!-- Dictionary -->
|
|
604
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'DICT' && attribute.isMultiValue === 'N'">
|
|
605
|
+
<div #attributeRef
|
|
606
|
+
class="d-flex flex-row">
|
|
607
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-6">
|
|
608
|
+
{{attribute.displayName}}
|
|
609
|
+
</div>
|
|
610
|
+
<div class="d-flex col-md-6">
|
|
611
|
+
<select #inputRef
|
|
612
|
+
[ngModel]="attributeValues[0].valueIdDictionary"
|
|
613
|
+
(ngModelChange)="valueDictChange($event)"
|
|
614
|
+
[disabled]="!editInline || attribute.isCalculated === 'Y'"
|
|
615
|
+
class="form-control edit-renderer">
|
|
616
|
+
<option [ngValue]="undefined"></option>
|
|
617
|
+
<option *ngFor="let entry of dictionaryEntries"
|
|
618
|
+
[ngValue]="entry.value">
|
|
619
|
+
{{ entry.display }}
|
|
620
|
+
</option>
|
|
621
|
+
</select>
|
|
622
|
+
</div>
|
|
623
|
+
</div>
|
|
624
|
+
</ng-container>
|
|
625
|
+
|
|
626
|
+
<!-- Grid -->
|
|
627
|
+
<ng-container *ngIf="attribute.codeAttributeDataType === 'GA'">
|
|
628
|
+
<div #attributeRef
|
|
629
|
+
class="d-flex flex-column">
|
|
630
|
+
<div *ngIf="attribute.displayName" class="d-flex col-md-12">
|
|
631
|
+
<div>
|
|
632
|
+
{{attribute.displayName}}
|
|
633
|
+
</div>
|
|
634
|
+
<div style="margin-left: auto;">
|
|
635
|
+
<button class="btn-ga" (click)="addGridRow(editGridModal, attribute.idAttribute)">
|
|
624
636
|
<span class="ga-icon">
|
|
625
637
|
<i class="fas fa-plus fa-xs"></i>
|
|
626
638
|
</span>
|
|
627
|
-
|
|
628
|
-
|
|
639
|
+
</button>
|
|
640
|
+
<button class="btn-ga" (click)="removeGridRow(attribute.idAttribute)">
|
|
629
641
|
<span class="ga-icon">
|
|
630
642
|
<i class="fas fa-minus fa-xs"></i>
|
|
631
643
|
</span>
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
</ng-container>
|
|
652
|
-
|
|
653
|
-
<ng-template #editGridModal let-close="close">
|
|
654
|
-
<div class="modal-header">
|
|
655
|
-
{{attribute.displayName}} Grid Row
|
|
656
|
-
</div>
|
|
657
|
-
<div class="modal-body d-flex flex-column hci-cod-edit">
|
|
658
|
-
<ng-container *ngFor="let attribute of editGroupRowAttributes">
|
|
659
|
-
<hci-attribute-edit [id]="'edit-id-attribute-' + attribute.idAttribute"
|
|
660
|
-
[groupAttributeRowId]="editGroupAttributeRowId"
|
|
661
|
-
[attribute]="attribute"
|
|
662
|
-
class="attribute"></hci-attribute-edit>
|
|
644
|
+
</button>
|
|
645
|
+
</div>
|
|
646
|
+
</div>
|
|
647
|
+
<div class="d-flex col-md-12">
|
|
648
|
+
<ag-grid-angular #gridAttribute
|
|
649
|
+
class="ag-theme-alpine"
|
|
650
|
+
(gridReady)="this.onGridReady($event)"
|
|
651
|
+
(modelUpdated)="onModelUpdated($event)"
|
|
652
|
+
(gridSizeChanged)="onGridSizeChanged($event)"
|
|
653
|
+
(rowDoubleClicked)="editGridRow(editGridModal, attribute.idAttribute, $event)"
|
|
654
|
+
[gridOptions]="this.gridOptions"
|
|
655
|
+
[rowSelection]="'single'"
|
|
656
|
+
[columnDefs]="gridColumns"
|
|
657
|
+
[rowData]="gridData"
|
|
658
|
+
[style.width]="attribute.w + 'px'"
|
|
659
|
+
[style.height]="attribute.h + 'px'">
|
|
660
|
+
</ag-grid-angular>
|
|
661
|
+
</div>
|
|
662
|
+
</div>
|
|
663
663
|
</ng-container>
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
664
|
+
|
|
665
|
+
<ng-template #editGridModal let-close="close">
|
|
666
|
+
<div class="modal-header">
|
|
667
|
+
{{attribute.displayName}} Grid Row
|
|
668
|
+
</div>
|
|
669
|
+
<div class="modal-body d-flex flex-column hci-cod-edit">
|
|
670
|
+
<ng-container *ngFor="let attribute of editGroupRowAttributes">
|
|
671
|
+
<hci-attribute-edit [id]="'edit-id-attribute-' + attribute.idAttribute"
|
|
672
|
+
[groupAttributeRowId]="editGroupAttributeRowId"
|
|
673
|
+
[attribute]="attribute"
|
|
674
|
+
class="attribute"></hci-attribute-edit>
|
|
675
|
+
</ng-container>
|
|
676
|
+
</div>
|
|
677
|
+
<div class="modal-footer">
|
|
678
|
+
<button class="btn btn-primary" (click)="close('Save')">Save</button>
|
|
679
|
+
<button class="btn btn-primary" (click)="close('Cancel')">Cancel</button>
|
|
680
|
+
</div>
|
|
681
|
+
</ng-template>
|
|
682
|
+
`, styles: [".hci-cod button.mat-icon-button.mat-button-base{height:20px;width:20px;line-height:unset}.btn-ga{padding:0;height:18px;width:18px}.ga-icon{font-size:.9em;vertical-align:top}.hci-cod .mat-datepicker-toggle-default-icon{height:20px;width:20px}\n"] }]
|
|
671
683
|
}], ctorParameters: function () { return [{ type: i1.AttributeService }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.NgbModal }]; } });
|
|
672
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29kL3NyYy9jb21wb25lbnRzL2F0dHJpYnV0ZS1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFNVixTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7O0FBTy9EOzs7R0FHRztBQTRWSCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsYUFBYTtJQUV2RCxnRUFBZ0U7SUFFaEUsWUFBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLFFBQW1CLEVBQUUsWUFBc0I7UUFDakgsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUk7UUFDRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDOytHQVZVLHNCQUFzQjttR0FBdEIsc0JBQXNCLGlGQXpWdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ1VULDZxV0F5QlUsc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQTNWbEMsU0FBUzsrQkFDRSxvQkFBb0IsWUFDcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ1VUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbmplY3QsXHJcbiAgSW5qZWN0aW9uVG9rZW4sXHJcbiAgSW5wdXQsXHJcbiAgaXNEZXZNb2RlLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7TmdiTW9kYWx9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUJhc2V9IGZyb20gXCIuL2F0dHJpYnV0ZS1iYXNlXCI7XHJcbmltcG9ydCB7QXR0cmlidXRlU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QXR0cmlidXRlTG9uZ1RleHR9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtbG9uZy10ZXh0LmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDaG9pY2V9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY2hvaWNlLmVudGl0eVwiO1xyXG5pbXBvcnQge0dyYXBoaWNhbEF0dHJpYnV0ZX0gZnJvbSBcIi4uL21vZGVsL2dyYXBoaWNhbC1hdHRyaWJ1dGUuZW50aXR5XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjb21wb25lbnQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGV4aXN0IGluIGEgbW9kYWwgZm9yIGVkaXRpbmcuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmbGV4IGF0dHJpYnV0ZVxyXG4gKiBiZWNhdXNlIGNvbXBvbmVudHMgc3VjaCBhcyB0aGUgZ3JpZCBuZWVkIGV4dHJhIGNvbmZpZ3VyYXRpb24gZm9yIGVkaXRpbmcuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJoY2ktYXR0cmlidXRlLWVkaXRcIixcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPCEtLSBTdHJpbmcgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ1MnXCI+XHJcbiAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCAjaW5wdXRSZWZcclxuICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVN0cmluZ0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIFRleHQgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ1RYVCdcIj5cclxuICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICA8aW5wdXQgI2lucHV0UmVmXHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJzcGVsbGNoZWNrXCJcclxuICAgICAgICAgICAgICAgICBsYW5nPVwiZW5cIlxyXG4gICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUxvbmdUZXh0LnRleHREYXRhXCJcclxuICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVRleHRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0SW5saW5lIHx8IGF0dHJpYnV0ZS5pc0NhbGN1bGF0ZWQgPT09ICdZJ1wiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gTnVtZXJpYyAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSAnTidcIj5cclxuICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICA8aW5wdXQgI2lucHV0UmVmXHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlTnVtZXJpY1wiXHJcbiAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWVOdW1lcmljQ2hhbmdlKCRldmVudClcIi8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBJbnRlZ2VyIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdJJ1wiPlxyXG4gICAgICA8ZGl2ICNhdHRyaWJ1dGVSZWZcclxuICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgIDxpbnB1dCAjaW5wdXRSZWZcclxuICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVJbnRlZ2VyXCJcclxuICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZUludGVnZXJDaGFuZ2UoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdEJ1wiPlxyXG4gICAgICA8ZGl2ICNhdHRyaWJ1dGVSZWZcclxuICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgIDxpbnB1dCAjaW5wdXRSZWZcclxuICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZURhdGVcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlRGF0ZVwiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWVEYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInZhbHVlRGF0ZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0SW5saW5lIHx8IGF0dHJpYnV0ZS5pc0NhbGN1bGF0ZWQgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlICBtYXRTdWZmaXggW2Zvcl09XCJ2YWx1ZURhdGVcIiBjbGFzcz1cImNvZC1kcC10b2dnbGVcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICN2YWx1ZURhdGU+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIERhdGUgVGltZSAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSAnRFQnXCI+XHJcbiAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPGlucHV0ICNpbnB1dFJlZlxyXG4gICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlRGF0ZVRpbWVcIlxyXG4gICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXR0cmlidXRlVmFsdWVzWzBdLmRhdGVcIlxyXG4gICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInZhbHVlRGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRJbmxpbmUgfHwgYXR0cmlidXRlLmlzQ2FsY3VsYXRlZCA9PT0gJ1knXCJcclxuICAgICAgICAgICAgICAgICBbbmd4TWF0RGF0ZXRpbWVQaWNrZXJdPVwiZHRwaWNrZXJcIj5cclxuICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkdHBpY2tlclwiIGNsYXNzPVwiY29kLWRwLXRvZ2dsZVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICA8bmd4LW1hdC1kYXRldGltZS1waWNrZXIgI2R0cGlja2VyIFtzaG93U2Vjb25kc109XCJ0cnVlXCI+PC9uZ3gtbWF0LWRhdGV0aW1lLXBpY2tlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIENoZWNrYm94IC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdDQidcIj5cclxuICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICA8aW5wdXQgI2lucHV0UmVmXHJcbiAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmcgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ2YWx1ZUNoZWNrYm94Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIEJvb2xlYW4gLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ0InXCI+XHJcbiAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPHNlbGVjdCBbbmdNb2RlbF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVN0cmluZ0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LXJlbmRlcmVyXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwidW5kZWZpbmVkXCI+PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiJ1knXCIgW3NlbGVjdGVkXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9PT0gJ1knXCI+WWVzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiJ04nXCIgW3NlbGVjdGVkXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9PT0gJ04nXCI+Tm88L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gRXh0ZW5kZWQgQm9vbGVhbiAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSAnRUInXCI+XHJcbiAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPHNlbGVjdCBbbmdNb2RlbF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVN0cmluZ0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0LXJlbmRlcmVyXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwidW5kZWZpbmVkXCI+PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiJ1knXCIgW3NlbGVjdGVkXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9PT0gJ1knXCI+WWVzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiJ04nXCIgW3NlbGVjdGVkXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9PT0gJ04nXCI+Tm88L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCInVSdcIiBbc2VsZWN0ZWRdPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlU3RyaW5nID09PSAnVSdcIj5Vbmtub3duPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIENob2ljZTogU2luZ2xlIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdBQycgJiYgYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSA9PT0gJ04nXCI+XHJcbiAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPHNlbGVjdCBbbmdNb2RlbF09XCIoYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlQXR0cmlidXRlQ2hvaWNlKT9hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2U6dW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWVDaG9pY2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1yZW5kZXJlclwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cInVuZGVmaW5lZFwiPjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBhdHRyaWJ1dGVDaG9pY2Ugb2YgYXR0cmlidXRlQ2hvaWNlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlXCI+XHJcbiAgICAgICAgICAgICAge3sgYXR0cmlidXRlQ2hvaWNlLmNob2ljZSB9fVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQ2hvaWNlOiBNdWx0aSAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSAnQUMnICYmIGF0dHJpYnV0ZS5pc011bHRpVmFsdWUgPT09ICdZJ1wiPlxyXG4gICAgICA8ZGl2ICNhdHRyaWJ1dGVSZWZcclxuICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gY29sLW1kLTZcIiBzdHlsZT1cInJvdy1nYXA6IDVweFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXR0cmlidXRlQ2hvaWNlIG9mIGF0dHJpYnV0ZUNob2ljZXNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhdHRyaWJ1dGVDaG9pY2UudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRJbmxpbmUgfHwgYXR0cmlidXRlLmlzQ2FsY3VsYXRlZCA9PT0gJ1knXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ2YWx1ZU11bHRpQ2hvaWNlQ2hhbmdlKGF0dHJpYnV0ZUNob2ljZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBjaGVja2JveCBtdC1hdXRvIG1iLWF1dG8gbXItMlwiIC8+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvZC1sYWJlbCBwbC0xXCI+XHJcbiAgICAgICAgICAgICAgICB7e2F0dHJpYnV0ZUNob2ljZS5jaG9pY2V9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgXHJcbiAgICA8IS0tIERpY3Rpb25hcnk6IE11bHRpIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdESUNUJyAmJiBhdHRyaWJ1dGUuaXNNdWx0aVZhbHVlID09PSAnWSdcIj5cclxuICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGNvbC1tZC02XCIgc3R5bGU9XCJyb3ctZ2FwOiA1cHhcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGRpY3Rpb25hcnlFbnRyaWVzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZW50cnkuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInZhbHVlTXVsdGlEaWN0Q2hhbmdlKGVudHJ5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBjaGVja2JveFwiIC8+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvZC1sYWJlbCBwbC0xXCI+XHJcbiAgICAgICAgICAgICAgICB7e2VudHJ5LmRpc3BsYXl9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPiAgIFxyXG5cclxuICAgIDwhLS0gRGljdGlvbmFyeSAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSAnRElDVCcgJiYgYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSA9PT0gJ04nXCI+XHJcbiAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgPHNlbGVjdCAjaW5wdXRSZWZcclxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlSWREaWN0aW9uYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWVEaWN0Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRJbmxpbmUgfHwgYXR0cmlidXRlLmlzQ2FsY3VsYXRlZCA9PT0gJ1knXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZWRpdC1yZW5kZXJlclwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cInVuZGVmaW5lZFwiPjwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBlbnRyeSBvZiBkaWN0aW9uYXJ5RW50cmllc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiZW50cnkudmFsdWVcIj5cclxuICAgICAgICAgICAgICB7eyBlbnRyeS5kaXNwbGF5IH19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBHcmlkIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdHQSdcIj5cclxuICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bztcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1nYVwiIChjbGljayk9XCJhZGRHcmlkUm93KGVkaXRHcmlkTW9kYWwsIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhLWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMgZmEteHNcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1nYVwiIChjbGljayk9XCJyZW1vdmVHcmlkUm93KGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhLWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzIGZhLXhzXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPGFnLWdyaWQtYW5ndWxhciAjZ3JpZEF0dHJpYnV0ZVxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWctdGhlbWUtYWxwaW5lXCJcclxuICAgICAgICAgICAgICAoZ3JpZFJlYWR5KT1cInRoaXMub25HcmlkUmVhZHkoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKG1vZGVsVXBkYXRlZCk9XCJvbk1vZGVsVXBkYXRlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoZ3JpZFNpemVDaGFuZ2VkKT1cIm9uR3JpZFNpemVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChyb3dEb3VibGVDbGlja2VkKT1cImVkaXRHcmlkUm93KGVkaXRHcmlkTW9kYWwsIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cInRoaXMuZ3JpZE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25dPVwiJ3NpbmdsZSdcIlxyXG4gICAgICAgICAgICAgIFtjb2x1bW5EZWZzXT1cImdyaWRDb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbcm93RGF0YV09XCJncmlkRGF0YVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImF0dHJpYnV0ZS53ICsgJ3B4J1wiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJhdHRyaWJ1dGUuaCArICdweCdcIj5cclxuICAgICAgICAgIDwvYWctZ3JpZC1hbmd1bGFyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZWRpdEdyaWRNb2RhbCBsZXQtY2xvc2U9XCJjbG9zZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fSBHcmlkIFJvd1xyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgZC1mbGV4IGZsZXgtY29sdW1uIGhjaS1jb2QtZWRpdFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGF0dHJpYnV0ZSBvZiBlZGl0R3JvdXBSb3dBdHRyaWJ1dGVzXCI+XHJcbiAgICAgICAgICA8aGNpLWF0dHJpYnV0ZS1lZGl0IFtpZF09XCInZWRpdC1pZC1hdHRyaWJ1dGUtJyArIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cEF0dHJpYnV0ZVJvd0lkXT1cImVkaXRHcm91cEF0dHJpYnV0ZVJvd0lkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHJpYnV0ZV09XCJhdHRyaWJ1dGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dHJpYnV0ZVwiPjwvaGNpLWF0dHJpYnV0ZS1lZGl0PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoJ1NhdmUnKVwiPlNhdmU8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKCdDYW5jZWwnKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICAuaGNpLWNvZCBidXR0b24ubWF0LWljb24tYnV0dG9uLm1hdC1idXR0b24tYmFzZSB7XHJcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xyXG4gICAgICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgICAgIGxpbmUtaGVpZ2h0OiB1bnNldDtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLWdhIHtcclxuICAgICAgcGFkZGluZzogMHB4O1xyXG4gICAgICBoZWlnaHQ6IDE4cHg7XHJcbiAgICAgIHdpZHRoOiAxOHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5nYS1pY29uIHtcclxuICAgICAgZm9udC1zaXplOiAuOWVtO1xyXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29kIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUtZGVmYXVsdC1pY29uIHtcclxuICAgICAgaGVpZ2h0OiAyMHB4O1xyXG4gICAgICB3aWR0aDogMjBweDtcclxuICAgIH1cclxuIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVFZGl0Q29tcG9uZW50IGV4dGVuZHMgQXR0cmlidXRlQmFzZSB7XHJcblxyXG4gIC8vZGljdGlvbmFyeUVuZHBvaW50ID0gdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLmRpY3Rpb25hcnlFbmRwb2ludDtcclxuXHJcbiAgY29uc3RydWN0b3IoYXR0cmlidXRlU2VydmljZTogQXR0cmlidXRlU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMiwgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCkge1xyXG4gICAgc3VwZXIoYXR0cmlidXRlU2VydmljZSwgZWxlbWVudFJlZiwgcmVuZGVyZXIsIG1vZGFsU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBpbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIuaW5pdCgpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
684
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29kL3NyYy9jb21wb25lbnRzL2F0dHJpYnV0ZS1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7O0FBRS9EOzs7R0FHRztBQXVXSCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsYUFBYTtJQUV2RCxpRUFBaUU7SUFFakUsWUFBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLFFBQW1CLEVBQUUsWUFBc0I7UUFDakgsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUk7UUFDRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDOytHQVZVLHNCQUFzQjttR0FBdEIsc0JBQXNCLGlGQWxXN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc1VDLDZxV0E0Qk0sc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQXRXbEMsU0FBUzsrQkFFSSxvQkFBb0IsWUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc1VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBSZW5kZXJlcjJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7TmdiTW9kYWx9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHtBdHRyaWJ1dGVCYXNlfSBmcm9tICcuL2F0dHJpYnV0ZS1iYXNlJztcclxuaW1wb3J0IHtBdHRyaWJ1dGVTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9hdHRyaWJ1dGUuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogVGhpcyBjb21wb25lbnQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIGV4aXN0IGluIGEgbW9kYWwgZm9yIGVkaXRpbmcuXHJcbiAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZsZXggYXR0cmlidXRlIGJlY2F1c2UgY29tcG9uZW50cyBzdWNoIGFzIHRoZSBncmlkIG5lZWQgZXh0cmEgY29uZmlndXJhdGlvbiBmb3IgZWRpdGluZy5cclxuICovXHJcbkBDb21wb25lbnQoXHJcbiAge1xyXG4gICAgc2VsZWN0b3I6ICdoY2ktYXR0cmlidXRlLWVkaXQnLFxyXG4gICAgdGVtcGxhdGU6XHJcbiAgICAgIGBcclxuICAgICAgICA8IS0tIFN0cmluZyAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ1MnXCI+XHJcbiAgICAgICAgICA8ZGl2ICNhdHRyaWJ1dGVSZWZcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCAjaW5wdXRSZWZcclxuICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVN0cmluZ0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0SW5saW5lIHx8IGF0dHJpYnV0ZS5pc0NhbGN1bGF0ZWQgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBUZXh0IC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSAnVFhUJ1wiPlxyXG4gICAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcblxyXG4gICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICNpbnB1dFJlZlxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJzcGVsbGNoZWNrXCJcclxuICAgICAgICAgICAgbGFuZz1cImVuXCJcclxuICAgICAgICAgICAgW25nTW9kZWxdPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlTG9uZ1RleHQudGV4dERhdGFcIlxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVRleHRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1MDBweDsgaGVpZ2h0OiAxMjVweDsgcmVzaXplOiBub25lO1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3RleHRhcmVhPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBOdW1lcmljIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSAnTidcIj5cclxuICAgICAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0ICNpbnB1dFJlZlxyXG4gICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlTnVtZXJpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInZhbHVlTnVtZXJpY0NoYW5nZSgkZXZlbnQpXCIvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEludGVnZXIgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdJJ1wiPlxyXG4gICAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgI2lucHV0UmVmXHJcbiAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVJbnRlZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWVJbnRlZ2VyQ2hhbmdlKCRldmVudClcIi8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGF0ZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ0QnXCI+XHJcbiAgICAgICAgICA8ZGl2ICNhdHRyaWJ1dGVSZWZcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCAjaW5wdXRSZWZcclxuICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInZhbHVlRGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwidmFsdWVEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0SW5saW5lIHx8IGF0dHJpYnV0ZS5pc0NhbGN1bGF0ZWQgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwidmFsdWVEYXRlXCIgY2xhc3M9XCJjb2QtZHAtdG9nZ2xlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICN2YWx1ZURhdGU+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBEYXRlIFRpbWUgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdEVCdcIj5cclxuICAgICAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0ICNpbnB1dFJlZlxyXG4gICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICBuYW1lPVwidmFsdWVEYXRlVGltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXR0cmlidXRlVmFsdWVzWzBdLmRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZURhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbmd4TWF0RGF0ZXRpbWVQaWNrZXJdPVwiZHRwaWNrZXJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cImR0cGlja2VyXCIgY2xhc3M9XCJjb2QtZHAtdG9nZ2xlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgPG5neC1tYXQtZGF0ZXRpbWUtcGlja2VyICNkdHBpY2tlciBbc2hvd1NlY29uZHNdPVwidHJ1ZVwiPjwvbmd4LW1hdC1kYXRldGltZS1waWNrZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gQ2hlY2tib3ggLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdDQidcIj5cclxuICAgICAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0ICNpbnB1dFJlZlxyXG4gICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmcgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidmFsdWVDaGVja2JveENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0SW5saW5lIHx8IGF0dHJpYnV0ZS5pc0NhbGN1bGF0ZWQgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEJvb2xlYW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdCJ1wiPlxyXG4gICAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8c2VsZWN0IFtuZ01vZGVsXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVN0cmluZ0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1yZW5kZXJlclwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJ1bmRlZmluZWRcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiJ1knXCIgW3NlbGVjdGVkXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9PT0gJ1knXCI+WWVzPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIidOJ1wiIFtzZWxlY3RlZF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmcgPT09ICdOJ1wiPk5vPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRXh0ZW5kZWQgQm9vbGVhbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ0VCJ1wiPlxyXG4gICAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8c2VsZWN0IFtuZ01vZGVsXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZVN0cmluZ0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1yZW5kZXJlclwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJ1bmRlZmluZWRcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiJ1knXCIgW3NlbGVjdGVkXT1cImF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9PT0gJ1knXCI+WWVzPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIidOJ1wiIFtzZWxlY3RlZF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmcgPT09ICdOJ1wiPk5vPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIidVJ1wiIFtzZWxlY3RlZF09XCJhdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmcgPT09ICdVJ1wiPlVua25vd248L29wdGlvbj5cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBDaG9pY2U6IFNpbmdsZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ0FDJyAmJiBhdHRyaWJ1dGUuaXNNdWx0aVZhbHVlID09PSAnTidcIj5cclxuICAgICAgICAgIDxkaXYgI2F0dHJpYnV0ZVJlZlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXR0cmlidXRlLmRpc3BsYXlOYW1lXCIgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICB7e2F0dHJpYnV0ZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgPHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKGF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUF0dHJpYnV0ZUNob2ljZSk/YXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlOnVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZUNob2ljZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdC1yZW5kZXJlclwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJ1bmRlZmluZWRcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGF0dHJpYnV0ZUNob2ljZSBvZiBhdHRyaWJ1dGVDaG9pY2VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGF0dHJpYnV0ZUNob2ljZS5jaG9pY2UgfX1cclxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIENob2ljZTogTXVsdGkgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09ICdBQycgJiYgYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSA9PT0gJ1knXCI+XHJcbiAgICAgICAgICA8ZGl2ICNhdHRyaWJ1dGVSZWZcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF0dHJpYnV0ZS5kaXNwbGF5TmFtZVwiIGNsYXNzPVwiZC1mbGV4IGNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBjb2wtbWQtNlwiIHN0eWxlPVwicm93LWdhcDogNXB4XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXR0cmlidXRlQ2hvaWNlIG9mIGF0dHJpYnV0ZUNob2ljZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhdHRyaWJ1dGVDaG9pY2UudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0SW5saW5lIHx8IGF0dHJpYnV0ZS5pc0NhbGN1bGF0ZWQgPT09ICdZJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInZhbHVlTXVsdGlDaG9pY2VDaGFuZ2UoYXR0cmlidXRlQ2hvaWNlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBjaGVja2JveCBtdC1hdXRvIG1iLWF1dG8gbXItMlwiLz5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvZC1sYWJlbCBwbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3thdHRyaWJ1dGVDaG9pY2UuY2hvaWNlfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBEaWN0aW9uYXJ5OiBNdWx0aSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ0RJQ1QnICYmIGF0dHJpYnV0ZS5pc011bHRpVmFsdWUgPT09ICdZJ1wiPlxyXG4gICAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gY29sLW1kLTZcIiBzdHlsZT1cInJvdy1nYXA6IDVweFwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGRpY3Rpb25hcnlFbnRyaWVzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZW50cnkuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRJbmxpbmUgfHwgYXR0cmlidXRlLmlzQ2FsY3VsYXRlZCA9PT0gJ1knXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidmFsdWVNdWx0aURpY3RDaGFuZ2UoZW50cnkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgY2hlY2tib3hcIi8+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2QtbGFiZWwgcGwtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZW50cnkuZGlzcGxheX19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGljdGlvbmFyeSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ0RJQ1QnICYmIGF0dHJpYnV0ZS5pc011bHRpVmFsdWUgPT09ICdOJ1wiPlxyXG4gICAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8c2VsZWN0ICNpbnB1dFJlZlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlSWREaWN0aW9uYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInZhbHVlRGljdENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdElubGluZSB8fCBhdHRyaWJ1dGUuaXNDYWxjdWxhdGVkID09PSAnWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZWRpdC1yZW5kZXJlclwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJ1bmRlZmluZWRcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGVudHJ5IG9mIGRpY3Rpb25hcnlFbnRyaWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiZW50cnkudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAge3sgZW50cnkuZGlzcGxheSB9fVxyXG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gR3JpZCAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gJ0dBJ1wiPlxyXG4gICAgICAgICAgPGRpdiAjYXR0cmlidXRlUmVmXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdHRyaWJ1dGUuZGlzcGxheU5hbWVcIiBjbGFzcz1cImQtZmxleCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAge3thdHRyaWJ1dGUuZGlzcGxheU5hbWV9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bztcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tZ2FcIiAoY2xpY2spPVwiYWRkR3JpZFJvdyhlZGl0R3JpZE1vZGFsLCBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYS1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzIGZhLXhzXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1nYVwiIChjbGljayk9XCJyZW1vdmVHcmlkUm93KGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhLWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzIGZhLXhzXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyICNncmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFnLXRoZW1lLWFscGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JpZFJlYWR5KT1cInRoaXMub25HcmlkUmVhZHkoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZWxVcGRhdGVkKT1cIm9uTW9kZWxVcGRhdGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyaWRTaXplQ2hhbmdlZCk9XCJvbkdyaWRTaXplQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3dEb3VibGVDbGlja2VkKT1cImVkaXRHcmlkUm93KGVkaXRHcmlkTW9kYWwsIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5ncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uXT1cIidzaW5nbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5EZWZzXT1cImdyaWRDb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cImdyaWREYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJhdHRyaWJ1dGUudyArICdweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJhdHRyaWJ1dGUuaCArICdweCdcIj5cclxuICAgICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlZGl0R3JpZE1vZGFsIGxldC1jbG9zZT1cImNsb3NlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIHt7YXR0cmlidXRlLmRpc3BsYXlOYW1lfX0gR3JpZCBSb3dcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgZC1mbGV4IGZsZXgtY29sdW1uIGhjaS1jb2QtZWRpdFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhdHRyaWJ1dGUgb2YgZWRpdEdyb3VwUm93QXR0cmlidXRlc1wiPlxyXG4gICAgICAgICAgICAgIDxoY2ktYXR0cmlidXRlLWVkaXQgW2lkXT1cIidlZGl0LWlkLWF0dHJpYnV0ZS0nICsgYXR0cmlidXRlLmlkQXR0cmlidXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cEF0dHJpYnV0ZVJvd0lkXT1cImVkaXRHcm91cEF0dHJpYnV0ZVJvd0lkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVdPVwiYXR0cmlidXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0cmlidXRlXCI+PC9oY2ktYXR0cmlidXRlLWVkaXQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoJ1NhdmUnKVwiPlNhdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjbG9zZSgnQ2FuY2VsJylcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIGAsXHJcbiAgICBzdHlsZXM6IFtcclxuICAgICAgYFxyXG4gICAgICAgIC5oY2ktY29kIGJ1dHRvbi5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1iYXNlIHtcclxuICAgICAgICAgIGhlaWdodDogMjBweDtcclxuICAgICAgICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgICAgICAgbGluZS1oZWlnaHQ6IHVuc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmJ0bi1nYSB7XHJcbiAgICAgICAgICBwYWRkaW5nOiAwcHg7XHJcbiAgICAgICAgICBoZWlnaHQ6IDE4cHg7XHJcbiAgICAgICAgICB3aWR0aDogMThweDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5nYS1pY29uIHtcclxuICAgICAgICAgIGZvbnQtc2l6ZTogLjllbTtcclxuICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuaGNpLWNvZCAubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWRlZmF1bHQtaWNvbiB7XHJcbiAgICAgICAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICAgICAgICB3aWR0aDogMjBweDtcclxuICAgICAgICB9XHJcbiAgICAgIGBcclxuICAgIF1cclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZUVkaXRDb21wb25lbnQgZXh0ZW5kcyBBdHRyaWJ1dGVCYXNlIHtcclxuXHJcbiAgLy8gZGljdGlvbmFyeUVuZHBvaW50ID0gdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLmRpY3Rpb25hcnlFbmRwb2ludDtcclxuXHJcbiAgY29uc3RydWN0b3IoYXR0cmlidXRlU2VydmljZTogQXR0cmlidXRlU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMiwgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCkge1xyXG4gICAgc3VwZXIoYXR0cmlidXRlU2VydmljZSwgZWxlbWVudFJlZiwgcmVuZGVyZXIsIG1vZGFsU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBpbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIuaW5pdCgpO1xyXG4gIH1cclxufVxyXG4iXX0=
|