@hitsoft/kadooglu.kalite 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -2
- package/config/enums/index.d.ts +1 -0
- package/config/enums/route-names.d.ts +5 -0
- package/config/index.d.ts +5 -0
- package/config/kalite-config.module.d.ts +8 -0
- package/config/providers/index.d.ts +1 -0
- package/config/providers/route.provider.d.ts +4 -0
- package/config/public-api.d.ts +3 -0
- package/esm2020/config/enums/index.mjs +2 -0
- package/esm2020/config/enums/route-names.mjs +2 -0
- package/esm2020/config/hitsoft-kadooglu.kalite-config.mjs +5 -0
- package/esm2020/config/kalite-config.module.mjs +18 -0
- package/esm2020/config/providers/index.mjs +2 -0
- package/esm2020/config/providers/route.provider.mjs +57 -0
- package/esm2020/config/public-api.mjs +4 -0
- package/esm2020/hitsoft-kadooglu.kalite.mjs +5 -0
- package/esm2020/lib/components/intake-form.component.mjs +162 -0
- package/esm2020/lib/components/intake-list.component.mjs +80 -0
- package/esm2020/lib/components/kalite.component.mjs +18 -0
- package/esm2020/lib/components/process-analysis.component.mjs +197 -0
- package/esm2020/lib/components/quality-definitions.component.mjs +97 -0
- package/esm2020/lib/components/quality-notifications.component.mjs +64 -0
- package/esm2020/lib/components/quality-parameters.component.mjs +332 -0
- package/esm2020/lib/components/quality-reports.component.mjs +107 -0
- package/esm2020/lib/kalite-notification.module.mjs +23 -0
- package/esm2020/lib/kalite-routing.module.mjs +41 -0
- package/esm2020/lib/kalite.module.mjs +41 -0
- package/esm2020/lib/models/intake.models.mjs +2 -0
- package/esm2020/lib/models/quality.models.mjs +2 -0
- package/esm2020/lib/services/kalite.service.mjs +21 -0
- package/esm2020/lib/services/print-form.mjs +96 -0
- package/esm2020/lib/services/quality-api.service.mjs +119 -0
- package/esm2020/lib/services/quality-measurements.mjs +127 -0
- package/esm2020/public-api.mjs +16 -0
- package/fesm2015/hitsoft-kadooglu.kalite-config.mjs +80 -0
- package/fesm2015/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
- package/fesm2015/hitsoft-kadooglu.kalite.mjs +1483 -0
- package/fesm2015/hitsoft-kadooglu.kalite.mjs.map +1 -0
- package/fesm2020/hitsoft-kadooglu.kalite-config.mjs +80 -0
- package/fesm2020/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
- package/fesm2020/hitsoft-kadooglu.kalite.mjs +1442 -0
- package/fesm2020/hitsoft-kadooglu.kalite.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/intake-form.component.d.ts +50 -0
- package/lib/components/intake-list.component.d.ts +48 -0
- package/lib/components/kalite.component.d.ts +10 -0
- package/lib/components/process-analysis.component.d.ts +46 -0
- package/lib/components/quality-definitions.component.d.ts +46 -0
- package/lib/components/quality-notifications.component.d.ts +44 -0
- package/lib/components/quality-parameters.component.d.ts +82 -0
- package/lib/components/quality-reports.component.d.ts +31 -0
- package/lib/kalite-notification.module.d.ts +14 -0
- package/lib/kalite-routing.module.d.ts +7 -0
- package/lib/kalite.module.d.ts +23 -0
- package/lib/models/intake.models.d.ts +185 -0
- package/lib/models/quality.models.d.ts +114 -0
- package/lib/services/kalite.service.d.ts +10 -0
- package/lib/services/print-form.d.ts +2 -0
- package/lib/services/quality-api.service.d.ts +71 -0
- package/lib/services/quality-measurements.d.ts +8 -0
- package/package.json +42 -3
- package/public-api.d.ts +12 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { defer } from 'rxjs';
|
|
3
|
+
import { finalize } from 'rxjs/operators';
|
|
4
|
+
import { errorMessage, localDate } from '../services/quality-measurements';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../services/quality-api.service";
|
|
7
|
+
import * as i2 from "@abp/ng.core";
|
|
8
|
+
import * as i3 from "@angular/router";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
10
|
+
import * as i5 from "@angular/forms";
|
|
11
|
+
import * as i6 from "@abp/ng.theme.shared";
|
|
12
|
+
export class QualityParametersComponent {
|
|
13
|
+
constructor(api, permissions, changeDetector, route) {
|
|
14
|
+
this.api = api;
|
|
15
|
+
this.permissions = permissions;
|
|
16
|
+
this.changeDetector = changeDetector;
|
|
17
|
+
this.route = route;
|
|
18
|
+
this.controlType = 'Process';
|
|
19
|
+
this.movementTypes = [];
|
|
20
|
+
this.movementDetails = [];
|
|
21
|
+
this.movementTypeCode = '';
|
|
22
|
+
this.movementDetailCode = '';
|
|
23
|
+
this.newInputForm = false;
|
|
24
|
+
this.forms = [];
|
|
25
|
+
this.facilities = [];
|
|
26
|
+
this.facilityCode = '';
|
|
27
|
+
this.facilitySteps = [];
|
|
28
|
+
this.editingStep = null;
|
|
29
|
+
this.newStep = false;
|
|
30
|
+
this.formCode = '';
|
|
31
|
+
this.template = null;
|
|
32
|
+
this.editingParameter = null;
|
|
33
|
+
this.editingLimit = null;
|
|
34
|
+
this.newParameter = false;
|
|
35
|
+
this.newLimit = false;
|
|
36
|
+
this.parameterModalVisible = false;
|
|
37
|
+
this.limitModalVisible = false;
|
|
38
|
+
this.modalError = '';
|
|
39
|
+
this.editorModalOptions = { size: 'xl', centered: true };
|
|
40
|
+
this.optionsText = '';
|
|
41
|
+
this.pendingRequests = 0;
|
|
42
|
+
this.busyText = 'Kalite tanımları yükleniyor…';
|
|
43
|
+
this.error = '';
|
|
44
|
+
this.success = '';
|
|
45
|
+
}
|
|
46
|
+
get busy() { return this.pendingRequests > 0; }
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
if (this.route.snapshot.queryParamMap.get('type') === 'Input')
|
|
49
|
+
this.controlType = 'Input';
|
|
50
|
+
this.movementDetailCode = this.route.snapshot.queryParamMap.get('detail') || '';
|
|
51
|
+
this.api.qualityMovementTypes().subscribe({ next: x => this.movementTypes = x, error: e => this.error = errorMessage(e) });
|
|
52
|
+
this.api.movementDetails().subscribe({ next: x => {
|
|
53
|
+
this.movementDetails = x.filter(d => d.active);
|
|
54
|
+
this.movementTypeCode = x.find(d => d.code === this.movementDetailCode)?.movementTypeCode || '';
|
|
55
|
+
if (this.controlType === 'Input')
|
|
56
|
+
this.selectInput();
|
|
57
|
+
}, error: e => this.error = errorMessage(e) });
|
|
58
|
+
this.track(this.api.parameterFacilities(), 'Kalite tanımları yükleniyor…').subscribe({
|
|
59
|
+
next: facilities => { this.facilities = facilities; this.selectFacility(); if (this.facilityCode)
|
|
60
|
+
this.loadSteps(); },
|
|
61
|
+
error: () => this.error = 'Tesis listesi yüklenemedi.',
|
|
62
|
+
});
|
|
63
|
+
this.track(this.api.forms(), 'Kalite tanımları yükleniyor…').subscribe({
|
|
64
|
+
next: forms => { this.forms = forms; this.switchType(this.controlType); },
|
|
65
|
+
error: () => this.error = 'Form listesi yüklenemedi.',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
get canEdit() { return this.permissions.getGrantedPolicy('Kalite.Parameters.Edit'); }
|
|
69
|
+
get canCreate() { return this.permissions.getGrantedPolicy('Kalite.Parameters.Create'); }
|
|
70
|
+
get canDelete() { return this.permissions.getGrantedPolicy('Kalite.Parameters.Delete'); }
|
|
71
|
+
get visibleForms() { return this.forms.filter(f => (f.controlType || 'Process') === this.controlType); }
|
|
72
|
+
get visibleDetails() { return this.movementDetails.filter(d => !this.movementTypeCode || d.movementTypeCode === this.movementTypeCode); }
|
|
73
|
+
switchType(type) {
|
|
74
|
+
this.controlType = type;
|
|
75
|
+
this.editingStep = null;
|
|
76
|
+
this.facilitySteps = [];
|
|
77
|
+
this.template = null;
|
|
78
|
+
if (type === 'Input')
|
|
79
|
+
this.selectInput();
|
|
80
|
+
else {
|
|
81
|
+
this.formCode = this.visibleForms[0]?.code || '';
|
|
82
|
+
this.newInputForm = false;
|
|
83
|
+
this.load();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
selectInput() {
|
|
87
|
+
if (!this.visibleDetails.some(d => d.code === this.movementDetailCode))
|
|
88
|
+
this.movementDetailCode = this.visibleDetails[0]?.code || '';
|
|
89
|
+
const form = this.visibleForms.find(f => f.movementDetailCode === this.movementDetailCode);
|
|
90
|
+
if (form) {
|
|
91
|
+
this.formCode = form.code;
|
|
92
|
+
this.newInputForm = false;
|
|
93
|
+
this.load();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const detail = this.movementDetails.find(d => d.code === this.movementDetailCode);
|
|
97
|
+
this.newInputForm = !!detail;
|
|
98
|
+
this.formCode = detail ? 'IN_' + detail.code : '';
|
|
99
|
+
this.template = detail ? { form: { code: this.formCode, controlType: 'Input', movementDetailCode: detail.code,
|
|
100
|
+
averageMode: 'Arithmetic', name: detail.name || this.movementTypes.find(t => t.code === detail.movementTypeCode)?.name || '',
|
|
101
|
+
documentCode: '', publicationDate: localDate(), revisionDate: localDate(), revisionNumber: '1', active: true },
|
|
102
|
+
parameters: [], limits: [], steps: [] } : null;
|
|
103
|
+
}
|
|
104
|
+
load() {
|
|
105
|
+
if (!this.formCode)
|
|
106
|
+
return;
|
|
107
|
+
if (this.controlType === 'Process') {
|
|
108
|
+
this.selectFacility();
|
|
109
|
+
if (this.facilityCode)
|
|
110
|
+
this.loadSteps();
|
|
111
|
+
}
|
|
112
|
+
this.error = '';
|
|
113
|
+
this.track(this.api.template(this.formCode), 'Kalite tanımları yükleniyor…').subscribe({
|
|
114
|
+
next: template => {
|
|
115
|
+
template.form.publicationDate = template.form.publicationDate?.slice(0, 10);
|
|
116
|
+
template.form.revisionDate = template.form.revisionDate?.slice(0, 10);
|
|
117
|
+
this.template = template;
|
|
118
|
+
this.editingParameter = null;
|
|
119
|
+
this.editingLimit = null;
|
|
120
|
+
},
|
|
121
|
+
error: () => { this.error = 'Form tanımı yüklenemedi.'; },
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
revealStepEditor() {
|
|
125
|
+
this.changeDetector.detectChanges();
|
|
126
|
+
this.stepEditor?.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
127
|
+
this.stepEditor?.nativeElement.focus({ preventScroll: true });
|
|
128
|
+
}
|
|
129
|
+
parameterModalChanged(visible) {
|
|
130
|
+
this.parameterModalVisible = visible;
|
|
131
|
+
if (!visible) {
|
|
132
|
+
this.editingParameter = null;
|
|
133
|
+
this.modalError = '';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
limitModalChanged(visible) {
|
|
137
|
+
this.limitModalVisible = visible;
|
|
138
|
+
if (!visible) {
|
|
139
|
+
this.editingLimit = null;
|
|
140
|
+
this.modalError = '';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
closeParameterModal() {
|
|
144
|
+
if (!this.busy)
|
|
145
|
+
this.parameterModalChanged(false);
|
|
146
|
+
}
|
|
147
|
+
closeLimitModal() {
|
|
148
|
+
if (!this.busy)
|
|
149
|
+
this.limitModalChanged(false);
|
|
150
|
+
}
|
|
151
|
+
track(request, message) {
|
|
152
|
+
return defer(() => {
|
|
153
|
+
this.pendingRequests++;
|
|
154
|
+
this.busyText = message;
|
|
155
|
+
return request.pipe(finalize(() => this.pendingRequests--));
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
processName(code) {
|
|
159
|
+
return this.template?.steps.find(step => step.processCode === code)?.name || code;
|
|
160
|
+
}
|
|
161
|
+
steps() {
|
|
162
|
+
return this.facilitySteps.filter(x => x.active);
|
|
163
|
+
}
|
|
164
|
+
matchingFacilities() {
|
|
165
|
+
return this.facilities.filter(x => x.formCode === this.formCode);
|
|
166
|
+
}
|
|
167
|
+
selectFacility() {
|
|
168
|
+
if (!this.matchingFacilities().some(x => x.code === this.facilityCode))
|
|
169
|
+
this.facilityCode = this.matchingFacilities()[0]?.code || '';
|
|
170
|
+
}
|
|
171
|
+
loadSteps() {
|
|
172
|
+
if (!this.facilityCode)
|
|
173
|
+
return;
|
|
174
|
+
this.track(this.api.steps(this.facilityCode), 'Kalite tanımları yükleniyor…').subscribe({
|
|
175
|
+
next: steps => this.facilitySteps = steps,
|
|
176
|
+
error: () => this.error = 'Proses adımları yüklenemedi.',
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
addStep() {
|
|
180
|
+
this.newStep = true;
|
|
181
|
+
this.editingStep = { code: '', facilityCode: this.facilityCode, processCode: '',
|
|
182
|
+
name: '', order: this.facilitySteps.length + 1, active: true };
|
|
183
|
+
this.revealStepEditor();
|
|
184
|
+
}
|
|
185
|
+
editStep(step) {
|
|
186
|
+
this.newStep = false;
|
|
187
|
+
this.editingStep = { ...step };
|
|
188
|
+
this.revealStepEditor();
|
|
189
|
+
}
|
|
190
|
+
saveStep() {
|
|
191
|
+
if (!this.editingStep)
|
|
192
|
+
return;
|
|
193
|
+
const step = { ...this.editingStep,
|
|
194
|
+
code: this.editingStep.code.trim().toUpperCase(),
|
|
195
|
+
processCode: this.editingStep.processCode.trim().toUpperCase(),
|
|
196
|
+
name: this.editingStep.name.trim() };
|
|
197
|
+
this.track(this.api.saveStep(step), 'Değişiklikler kaydediliyor…').subscribe({
|
|
198
|
+
next: () => { this.editingStep = null; this.success = 'Proses adımı kaydedildi.'; this.loadSteps(); },
|
|
199
|
+
error: () => { this.error = 'Proses adımı kaydedilemedi.'; },
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
orderedParameters() {
|
|
203
|
+
const order = this.steps().map(step => step.processCode);
|
|
204
|
+
return [...(this.template?.parameters || [])].sort((a, b) => order.indexOf(a.stepCode) - order.indexOf(b.stepCode) || a.order - b.order);
|
|
205
|
+
}
|
|
206
|
+
limitsFor(code) {
|
|
207
|
+
return this.template?.limits.filter(limit => limit.parameterCode === code) || [];
|
|
208
|
+
}
|
|
209
|
+
editForm() {
|
|
210
|
+
if (!this.template || !this.canEdit)
|
|
211
|
+
return;
|
|
212
|
+
this.track(this.api.saveForm(this.template.form), 'Değişiklikler kaydediliyor…').subscribe({
|
|
213
|
+
next: () => {
|
|
214
|
+
this.success = 'Form başlığı kaydedildi.';
|
|
215
|
+
this.newInputForm = false;
|
|
216
|
+
this.api.forms().subscribe({ next: forms => { this.forms = forms; this.load(); } });
|
|
217
|
+
},
|
|
218
|
+
error: () => { this.error = 'Form başlığı kaydedilemedi.'; },
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
addParameter() {
|
|
222
|
+
if (!this.template || this.newInputForm)
|
|
223
|
+
return;
|
|
224
|
+
this.newParameter = true;
|
|
225
|
+
this.optionsText = '';
|
|
226
|
+
this.editingParameter = {
|
|
227
|
+
code: '', formCode: this.formCode, stepCode: this.template.steps[0]?.processCode || '',
|
|
228
|
+
order: this.template.parameters.length + 1, name: '', unit: '', valueType: 'Number',
|
|
229
|
+
decimalPlaces: 2, required: false, calculated: false, formula: '', options: [], active: true,
|
|
230
|
+
};
|
|
231
|
+
this.editingLimit = null;
|
|
232
|
+
this.modalError = '';
|
|
233
|
+
this.parameterModalVisible = true;
|
|
234
|
+
}
|
|
235
|
+
editParameter(parameter) {
|
|
236
|
+
this.newParameter = false;
|
|
237
|
+
this.editingParameter = { ...parameter, options: [...(parameter.options || [])] };
|
|
238
|
+
this.optionsText = this.editingParameter.options.join(', ');
|
|
239
|
+
this.editingLimit = null;
|
|
240
|
+
this.modalError = '';
|
|
241
|
+
this.parameterModalVisible = true;
|
|
242
|
+
}
|
|
243
|
+
saveParameter() {
|
|
244
|
+
if (!this.editingParameter || this.busy)
|
|
245
|
+
return;
|
|
246
|
+
const parameter = { ...this.editingParameter,
|
|
247
|
+
code: this.editingParameter.code.trim().toUpperCase(),
|
|
248
|
+
name: this.editingParameter.name.trim(),
|
|
249
|
+
options: this.optionsText.split(',').map(x => x.trim()).filter(Boolean),
|
|
250
|
+
};
|
|
251
|
+
if (!parameter.code || !parameter.name || (this.controlType === 'Process' && !parameter.stepCode)) {
|
|
252
|
+
this.modalError = 'Parametre kodu, adı ve proses kontrolünde proses adımı zorunludur.';
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
this.modalError = '';
|
|
256
|
+
const request = this.newParameter ? this.api.createParameter(parameter) : this.api.updateParameter(parameter);
|
|
257
|
+
this.track(request, 'Değişiklikler kaydediliyor…').subscribe({
|
|
258
|
+
next: () => { this.parameterModalChanged(false); this.success = 'Parametre kaydedildi.'; this.load(); },
|
|
259
|
+
error: () => { this.modalError = 'Parametre kaydedilemedi.'; },
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
deleteParameter(parameter) {
|
|
263
|
+
if (!confirm(`${parameter.name} parametresi ve bağlı limitleri kalıcı olarak silinsin mi?`))
|
|
264
|
+
return;
|
|
265
|
+
this.track(this.api.deleteParameter(parameter.code), 'Değişiklikler kaydediliyor…').subscribe({
|
|
266
|
+
next: () => this.load(), error: e => this.error = errorMessage(e),
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
addLimit(parameter) {
|
|
270
|
+
this.newLimit = true;
|
|
271
|
+
this.editingParameter = null;
|
|
272
|
+
this.editingLimit = {
|
|
273
|
+
code: '', parameterCode: parameter.code, oilType: '', origin: '', minimum: null, maximum: null,
|
|
274
|
+
nominal: null, expectedText: '', validFrom: null, validUntil: null, active: true,
|
|
275
|
+
};
|
|
276
|
+
this.modalError = '';
|
|
277
|
+
this.limitModalVisible = true;
|
|
278
|
+
}
|
|
279
|
+
editLimit(limit) {
|
|
280
|
+
this.newLimit = false;
|
|
281
|
+
this.editingParameter = null;
|
|
282
|
+
this.editingLimit = { ...limit,
|
|
283
|
+
validFrom: limit.validFrom?.slice(0, 10) || null,
|
|
284
|
+
validUntil: limit.validUntil?.slice(0, 10) || null,
|
|
285
|
+
};
|
|
286
|
+
this.modalError = '';
|
|
287
|
+
this.limitModalVisible = true;
|
|
288
|
+
}
|
|
289
|
+
saveLimit() {
|
|
290
|
+
if (!this.editingLimit || this.busy)
|
|
291
|
+
return;
|
|
292
|
+
const limit = { ...this.editingLimit,
|
|
293
|
+
code: this.newLimit ? this.editingLimit.code.trim().toUpperCase() : this.editingLimit.code,
|
|
294
|
+
oilType: this.editingLimit.oilType?.trim() || '',
|
|
295
|
+
};
|
|
296
|
+
if (!limit.code) {
|
|
297
|
+
this.modalError = 'Limit kodu zorunludur.';
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
this.modalError = '';
|
|
301
|
+
const request = this.newLimit ? this.api.createLimit(limit) : this.api.updateLimit(limit);
|
|
302
|
+
this.track(request, 'Değişiklikler kaydediliyor…').subscribe({
|
|
303
|
+
next: () => { this.limitModalChanged(false); this.success = 'Limit kaydedildi.'; this.load(); },
|
|
304
|
+
error: e => { this.modalError = errorMessage(e); },
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
deleteLimit(limit) {
|
|
308
|
+
if (this.busy)
|
|
309
|
+
return;
|
|
310
|
+
if (!confirm(`${limit.code} limiti kalıcı olarak silinsin mi?`))
|
|
311
|
+
return;
|
|
312
|
+
this.track(this.api.deleteLimit(limit.code), 'Değişiklikler kaydediliyor…').subscribe({
|
|
313
|
+
next: () => { this.limitModalChanged(false); this.load(); },
|
|
314
|
+
error: e => {
|
|
315
|
+
if (this.limitModalVisible)
|
|
316
|
+
this.modalError = errorMessage(e);
|
|
317
|
+
else
|
|
318
|
+
this.error = errorMessage(e);
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
QualityParametersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityParametersComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }, { token: i0.ChangeDetectorRef }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
|
324
|
+
QualityParametersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityParametersComponent, selector: "lib-quality-parameters", viewQueries: [{ propertyName: "stepEditor", first: true, predicate: ["stepEditor"], descendants: true }], ngImport: i0, template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Kalite Parametreleri (Kalite Sorular\u0131)</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-primary]=\"controlType === 'Input'\" [class.btn-outline-secondary]=\"controlType !== 'Input'\" (click)=\"switchType('Input')\">Girdi Kontrol</button><button class=\"btn\" [class.btn-primary]=\"controlType === 'Process'\" [class.btn-outline-secondary]=\"controlType !== 'Process'\" (click)=\"switchType('Process')\">Proses Kontrol</button></div>\r\n <div class=\"row mb-3\" *ngIf=\"controlType === 'Input'\">\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"movementTypeCode\" (change)=\"selectInput()\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of movementTypes\" [value]=\"type.code\">{{ type.name }}</option></select></div>\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC / Detay</label><select class=\"form-control\" [(ngModel)]=\"movementDetailCode\" (change)=\"selectInput()\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let d of visibleDetails\" [value]=\"d.code\">{{ d.name || d.movementTypeCode }}{{ d.detailCode ? ' / ' + d.detailCode : ' (detays\u0131z)' }}</option></select></div>\r\n <p class=\"col-md-12 mt-2 text-muted\" *ngIf=\"!visibleDetails.length\">\u00D6nce Kalite Tan\u0131mlar\u0131 ekran\u0131nda kalite kontrole tabi hareket t\u00FCr\u00FCn\u00FC tan\u0131mlay\u0131n.</p>\r\n </div>\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\">\r\n <label for=\"formSelect\">Form</label>\r\n <select id=\"formSelect\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"formCode\" (change)=\"load()\">\r\n <option *ngFor=\"let form of visibleForms\" [value]=\"form.code\">{{ form.documentCode }} \u2013 {{ form.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right mt-2 mt-md-0\">\r\n <button class=\"btn btn-primary\" *ngIf=\"canCreate\" (click)=\"addParameter()\" [disabled]=\"busy || !template || newInputForm\">+ Yeni Parametre</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div>\r\n <div *ngIf=\"success\" class=\"alert alert-success\" (click)=\"success = ''\">{{ success }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n\r\n <ng-container *ngIf=\"template\">\r\n <div [hidden]=\"busy\">\r\n <div class=\"row align-items-end mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <div class=\"col-md-4\"><label for=\"facilitySelect\">Proses s\u0131ras\u0131 i\u00E7in tesis</label>\r\n <select id=\"facilitySelect\" class=\"form-control\" [(ngModel)]=\"facilityCode\" (change)=\"loadSteps()\">\r\n <option *ngFor=\"let facility of matchingFacilities()\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right\"><button class=\"btn btn-outline-primary\" *ngIf=\"canEdit\" (click)=\"addStep()\">+ Proses Ad\u0131m\u0131</button></div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <span class=\"step-pill\" *ngFor=\"let step of facilitySteps\">\r\n <button type=\"button\" class=\"btn btn-sm\" [class.btn-outline-primary]=\"step.active\" [class.btn-outline-secondary]=\"!step.active\"\r\n (click)=\"editStep(step)\" [disabled]=\"!canEdit\">{{ step.order }}. {{ step.name }}<span *ngIf=\"!step.active\"> (pasif)</span></button>\r\n </span>\r\n </div>\r\n <div #stepEditor tabindex=\"-1\" class=\"card mt-3 mb-3 editor-card\" *ngIf=\"editingStep as step\"><div class=\"card-body\">\r\n <h5>{{ newStep ? 'Yeni Proses Ad\u0131m\u0131' : 'Proses Ad\u0131m\u0131n\u0131 D\u00FCzenle' }}</h5>\r\n <div class=\"row\">\r\n <div class=\"col-md-2\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"step.code\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-2\"><label>Proses Kodu</label><input class=\"form-control\" [(ngModel)]=\"step.processCode\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-4\"><label>Ad</label><input class=\"form-control\" [(ngModel)]=\"step.name\" /></div>\r\n <div class=\"col-md-2\"><label>S\u0131ra</label><input type=\"number\" min=\"1\" class=\"form-control\" [(ngModel)]=\"step.order\" /></div>\r\n <div class=\"col-md-2 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"step.active\" /> Aktif</label></div>\r\n </div>\r\n <button class=\"btn btn-primary mt-3 mr-2\" (click)=\"saveStep()\" [disabled]=\"busy\">Kaydet</button>\r\n <button class=\"btn btn-secondary mt-3\" (click)=\"editingStep = null\">\u0130ptal</button>\r\n </div></div>\r\n <div class=\"form-header rounded p-3 mb-3\">\r\n <p *ngIf=\"newInputForm\" class=\"text-muted\">\u00D6nce form ba\u015Fl\u0131\u011F\u0131n\u0131 kaydedin, ard\u0131ndan kalite sorular\u0131n\u0131 ekleyin.</p>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Form Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"template.form.name\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Dok\u00FCman Kodu</label><input class=\"form-control\" [(ngModel)]=\"template.form.documentCode\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Yay\u0131n Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.publicationDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.revisionDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon No</label><input class=\"form-control\" [(ngModel)]=\"template.form.revisionNumber\" [disabled]=\"!canEdit\" /></div>\r\n </div>\r\n <div class=\"row mt-2\" *ngIf=\"controlType === 'Input'\"><div class=\"col-md-4\"><label>Ortalama Tipi</label><select class=\"form-control\" [(ngModel)]=\"template.form.averageMode\" [disabled]=\"!canEdit\"><option value=\"Arithmetic\">Aritmetik</option><option value=\"Weighted\">Miktar a\u011F\u0131rl\u0131kl\u0131</option></select></div><div class=\"col-md-4\"><label>Miktar Birimi</label><select class=\"form-control\" [(ngModel)]=\"template.form.quantityUnit\" [disabled]=\"!canEdit\"><option value=\"kg\">Kilogram</option><option value=\"t\">Ton</option></select></div></div>\r\n <button class=\"btn btn-outline-primary mt-3\" *ngIf=\"canEdit\" (click)=\"editForm()\" [disabled]=\"busy\">Ba\u015Fl\u0131\u011F\u0131 Kaydet</button>\r\n </div>\r\n\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-striped table-sm parameter-table\">\r\n <thead><tr><th>\u0130\u015Flemler</th><th *ngIf=\"controlType === 'Process'\">Proses Ad\u0131m\u0131</th><th>S\u0131ra</th><th>Kod</th><th>Parametre / Soru</th><th>Birim</th><th>Veri Tipi</th><th>Limit / Nominal</th><th>Durum</th></tr></thead>\r\n <tbody>\r\n <tr *ngFor=\"let parameter of orderedParameters()\">\r\n <td class=\"actions\">\r\n <button class=\"btn btn-sm btn-outline-primary mr-1\" *ngIf=\"canEdit\" (click)=\"editParameter(parameter)\">D\u00FCzenle</button>\r\n <button class=\"btn btn-sm btn-outline-secondary mr-1\" *ngIf=\"canCreate\" (click)=\"addLimit(parameter)\">+ Limit</button>\r\n <button class=\"btn btn-sm btn-outline-danger\" *ngIf=\"canDelete && parameter.active\" (click)=\"deleteParameter(parameter)\">Sil</button>\r\n </td>\r\n <td *ngIf=\"controlType === 'Process'\">{{ processName(parameter.stepCode) }}</td><td>{{ parameter.order }}</td>\r\n <td><code>{{ parameter.code }}</code></td><td>{{ parameter.name }}</td><td>{{ parameter.unit || '\u2014' }}</td>\r\n <td>{{ parameter.valueType }}<span *ngIf=\"parameter.calculated\"> / Hesaplanan</span></td>\r\n <td>\r\n <div *ngFor=\"let limit of limitsFor(parameter.code)\">\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0 limit-link\" (click)=\"editLimit(limit)\">{{ limit.code }}</button>:\r\n <span *ngIf=\"limit.oilType\">{{ limit.oilType }} \u00B7 </span>\r\n <span *ngIf=\"limit.origin\">{{ limit.origin === 'Imported' ? '\u0130thal' : '\u0130\u00E7 Piyasa' }} \u00B7 </span>\r\n <span *ngIf=\"limit.minimum != null\">Min {{ limit.minimum }} </span>\r\n <span *ngIf=\"limit.maximum != null\">Max {{ limit.maximum }} </span>\r\n <span *ngIf=\"limit.nominal != null\">Nominal {{ limit.nominal }} </span>\r\n <span *ngIf=\"limit.expectedText\">{{ limit.expectedText }}</span>\r\n <span *ngIf=\"!limit.active\" class=\"text-muted\">(pasif)</span>\r\n </div>\r\n </td>\r\n <td>{{ parameter.active ? 'Aktif' : 'Pasif' }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<abp-modal [visible]=\"parameterModalVisible\" (visibleChange)=\"parameterModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newParameter ? 'Yeni Parametre' : 'Parametreyi D\u00FCzenle' }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingParameter as parameter\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"parameter.code\" [disabled]=\"!newParameter\" /></div>\r\n <div class=\"col-md-4\"><label>Ad / Soru</label><input class=\"form-control\" [(ngModel)]=\"parameter.name\" /></div>\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\"><label>Proses Ad\u0131m\u0131</label><select class=\"form-control\" [(ngModel)]=\"parameter.stepCode\"><option *ngFor=\"let step of steps()\" [value]=\"step.processCode\">{{ step.name }}</option></select></div>\r\n <div class=\"col-md-4\"><label>S\u0131ra</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"parameter.order\" /></div>\r\n <div class=\"col-md-4\"><label>Birim</label><input class=\"form-control\" [(ngModel)]=\"parameter.unit\" /></div>\r\n <div class=\"col-md-4\"><label>Veri Tipi</label><select class=\"form-control\" [(ngModel)]=\"parameter.valueType\"><option value=\"Number\">Say\u0131sal</option><option value=\"Text\">Metin</option><option value=\"Choice\">Se\u00E7im</option></select></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ondal\u0131k Basamak</label><input type=\"number\" min=\"0\" max=\"8\" class=\"form-control\" [(ngModel)]=\"parameter.decimalPlaces\" /></div>\r\n <div class=\"col-md-4\"><label>Se\u00E7enekler (virg\u00FClle ayr\u0131lm\u0131\u015F)</label><input class=\"form-control\" [(ngModel)]=\"optionsText\" [disabled]=\"parameter.valueType !== 'Choice'\" /></div>\r\n <div class=\"col-md-4\"><label>Hesaplama Form\u00FCl\u00FC</label><input class=\"form-control\" [(ngModel)]=\"parameter.formula\" [disabled]=\"!parameter.calculated\" placeholder=\"PARAM_KODU * 2\" /></div>\r\n <div class=\"col-md-4 d-flex flex-column justify-content-end\"><label><input type=\"checkbox\" [(ngModel)]=\"parameter.required\" /> Zorunlu</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.calculated\" /> Hesaplanan</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeParameterModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveParameter()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n\r\n<abp-modal [visible]=\"limitModalVisible\" (visibleChange)=\"limitModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newLimit ? 'Yeni Limit' : 'Limiti D\u00FCzenle' }} \u2013 {{ editingLimit?.parameterCode }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingLimit as limit\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"limit.code\" [disabled]=\"!newLimit\" /></div>\r\n <div class=\"col-md-4\"><label>Ya\u011F Cinsi / Ko\u015Ful</label><select class=\"form-control\" [(ngModel)]=\"limit.oilType\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Palm Oil\">Palm Oil</option><option value=\"Palm Olein\">Palm Olein</option></select></div>\r\n <div class=\"col-md-4\"><label>Men\u015Fei</label><select class=\"form-control\" [(ngModel)]=\"limit.origin\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Domestic\">\u0130\u00E7 Piyasa</option><option value=\"Imported\">\u0130thal</option></select></div>\r\n <div class=\"col-md-4\"><label>Min</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.minimum\" /></div>\r\n <div class=\"col-md-4\"><label>Max</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.maximum\" /></div>\r\n <div class=\"col-md-4\"><label>Nominal</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.nominal\" /></div>\r\n <div class=\"col-md-4\"><label>Beklenen Metin</label><input class=\"form-control\" [(ngModel)]=\"limit.expectedText\" /></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validFrom\" /></div>\r\n <div class=\"col-md-4\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validUntil\" /></div>\r\n <div class=\"col-md-4 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"limit.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-danger\" *ngIf=\"!newLimit && canDelete\"\r\n (click)=\"deleteLimit(editingLimit!)\" [disabled]=\"busy\">Sil</button>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeLimitModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveLimit()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".form-header{background:#f7f8fa;border:1px solid #e3e6eb}.parameter-table{min-width:1100px}.parameter-table .actions{white-space:nowrap}.parameter-table .limit-link{color:#007bff}.parameter-table .limit-link:hover,.parameter-table .limit-link:focus{color:#0056b3}.editor-card{border-color:#8864ac;scroll-margin-top:90px}.editor-card:focus{outline:2px solid #8864ac;outline-offset:2px}.step-pill{display:inline-block;margin:0 .4rem .4rem 0}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\n"], dependencies: [{ 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }] });
|
|
325
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityParametersComponent, decorators: [{
|
|
326
|
+
type: Component,
|
|
327
|
+
args: [{ selector: 'lib-quality-parameters', template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Kalite Parametreleri (Kalite Sorular\u0131)</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-primary]=\"controlType === 'Input'\" [class.btn-outline-secondary]=\"controlType !== 'Input'\" (click)=\"switchType('Input')\">Girdi Kontrol</button><button class=\"btn\" [class.btn-primary]=\"controlType === 'Process'\" [class.btn-outline-secondary]=\"controlType !== 'Process'\" (click)=\"switchType('Process')\">Proses Kontrol</button></div>\r\n <div class=\"row mb-3\" *ngIf=\"controlType === 'Input'\">\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"movementTypeCode\" (change)=\"selectInput()\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of movementTypes\" [value]=\"type.code\">{{ type.name }}</option></select></div>\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC / Detay</label><select class=\"form-control\" [(ngModel)]=\"movementDetailCode\" (change)=\"selectInput()\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let d of visibleDetails\" [value]=\"d.code\">{{ d.name || d.movementTypeCode }}{{ d.detailCode ? ' / ' + d.detailCode : ' (detays\u0131z)' }}</option></select></div>\r\n <p class=\"col-md-12 mt-2 text-muted\" *ngIf=\"!visibleDetails.length\">\u00D6nce Kalite Tan\u0131mlar\u0131 ekran\u0131nda kalite kontrole tabi hareket t\u00FCr\u00FCn\u00FC tan\u0131mlay\u0131n.</p>\r\n </div>\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\">\r\n <label for=\"formSelect\">Form</label>\r\n <select id=\"formSelect\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"formCode\" (change)=\"load()\">\r\n <option *ngFor=\"let form of visibleForms\" [value]=\"form.code\">{{ form.documentCode }} \u2013 {{ form.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right mt-2 mt-md-0\">\r\n <button class=\"btn btn-primary\" *ngIf=\"canCreate\" (click)=\"addParameter()\" [disabled]=\"busy || !template || newInputForm\">+ Yeni Parametre</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div>\r\n <div *ngIf=\"success\" class=\"alert alert-success\" (click)=\"success = ''\">{{ success }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n\r\n <ng-container *ngIf=\"template\">\r\n <div [hidden]=\"busy\">\r\n <div class=\"row align-items-end mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <div class=\"col-md-4\"><label for=\"facilitySelect\">Proses s\u0131ras\u0131 i\u00E7in tesis</label>\r\n <select id=\"facilitySelect\" class=\"form-control\" [(ngModel)]=\"facilityCode\" (change)=\"loadSteps()\">\r\n <option *ngFor=\"let facility of matchingFacilities()\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right\"><button class=\"btn btn-outline-primary\" *ngIf=\"canEdit\" (click)=\"addStep()\">+ Proses Ad\u0131m\u0131</button></div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <span class=\"step-pill\" *ngFor=\"let step of facilitySteps\">\r\n <button type=\"button\" class=\"btn btn-sm\" [class.btn-outline-primary]=\"step.active\" [class.btn-outline-secondary]=\"!step.active\"\r\n (click)=\"editStep(step)\" [disabled]=\"!canEdit\">{{ step.order }}. {{ step.name }}<span *ngIf=\"!step.active\"> (pasif)</span></button>\r\n </span>\r\n </div>\r\n <div #stepEditor tabindex=\"-1\" class=\"card mt-3 mb-3 editor-card\" *ngIf=\"editingStep as step\"><div class=\"card-body\">\r\n <h5>{{ newStep ? 'Yeni Proses Ad\u0131m\u0131' : 'Proses Ad\u0131m\u0131n\u0131 D\u00FCzenle' }}</h5>\r\n <div class=\"row\">\r\n <div class=\"col-md-2\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"step.code\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-2\"><label>Proses Kodu</label><input class=\"form-control\" [(ngModel)]=\"step.processCode\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-4\"><label>Ad</label><input class=\"form-control\" [(ngModel)]=\"step.name\" /></div>\r\n <div class=\"col-md-2\"><label>S\u0131ra</label><input type=\"number\" min=\"1\" class=\"form-control\" [(ngModel)]=\"step.order\" /></div>\r\n <div class=\"col-md-2 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"step.active\" /> Aktif</label></div>\r\n </div>\r\n <button class=\"btn btn-primary mt-3 mr-2\" (click)=\"saveStep()\" [disabled]=\"busy\">Kaydet</button>\r\n <button class=\"btn btn-secondary mt-3\" (click)=\"editingStep = null\">\u0130ptal</button>\r\n </div></div>\r\n <div class=\"form-header rounded p-3 mb-3\">\r\n <p *ngIf=\"newInputForm\" class=\"text-muted\">\u00D6nce form ba\u015Fl\u0131\u011F\u0131n\u0131 kaydedin, ard\u0131ndan kalite sorular\u0131n\u0131 ekleyin.</p>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Form Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"template.form.name\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Dok\u00FCman Kodu</label><input class=\"form-control\" [(ngModel)]=\"template.form.documentCode\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Yay\u0131n Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.publicationDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.revisionDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon No</label><input class=\"form-control\" [(ngModel)]=\"template.form.revisionNumber\" [disabled]=\"!canEdit\" /></div>\r\n </div>\r\n <div class=\"row mt-2\" *ngIf=\"controlType === 'Input'\"><div class=\"col-md-4\"><label>Ortalama Tipi</label><select class=\"form-control\" [(ngModel)]=\"template.form.averageMode\" [disabled]=\"!canEdit\"><option value=\"Arithmetic\">Aritmetik</option><option value=\"Weighted\">Miktar a\u011F\u0131rl\u0131kl\u0131</option></select></div><div class=\"col-md-4\"><label>Miktar Birimi</label><select class=\"form-control\" [(ngModel)]=\"template.form.quantityUnit\" [disabled]=\"!canEdit\"><option value=\"kg\">Kilogram</option><option value=\"t\">Ton</option></select></div></div>\r\n <button class=\"btn btn-outline-primary mt-3\" *ngIf=\"canEdit\" (click)=\"editForm()\" [disabled]=\"busy\">Ba\u015Fl\u0131\u011F\u0131 Kaydet</button>\r\n </div>\r\n\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-striped table-sm parameter-table\">\r\n <thead><tr><th>\u0130\u015Flemler</th><th *ngIf=\"controlType === 'Process'\">Proses Ad\u0131m\u0131</th><th>S\u0131ra</th><th>Kod</th><th>Parametre / Soru</th><th>Birim</th><th>Veri Tipi</th><th>Limit / Nominal</th><th>Durum</th></tr></thead>\r\n <tbody>\r\n <tr *ngFor=\"let parameter of orderedParameters()\">\r\n <td class=\"actions\">\r\n <button class=\"btn btn-sm btn-outline-primary mr-1\" *ngIf=\"canEdit\" (click)=\"editParameter(parameter)\">D\u00FCzenle</button>\r\n <button class=\"btn btn-sm btn-outline-secondary mr-1\" *ngIf=\"canCreate\" (click)=\"addLimit(parameter)\">+ Limit</button>\r\n <button class=\"btn btn-sm btn-outline-danger\" *ngIf=\"canDelete && parameter.active\" (click)=\"deleteParameter(parameter)\">Sil</button>\r\n </td>\r\n <td *ngIf=\"controlType === 'Process'\">{{ processName(parameter.stepCode) }}</td><td>{{ parameter.order }}</td>\r\n <td><code>{{ parameter.code }}</code></td><td>{{ parameter.name }}</td><td>{{ parameter.unit || '\u2014' }}</td>\r\n <td>{{ parameter.valueType }}<span *ngIf=\"parameter.calculated\"> / Hesaplanan</span></td>\r\n <td>\r\n <div *ngFor=\"let limit of limitsFor(parameter.code)\">\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0 limit-link\" (click)=\"editLimit(limit)\">{{ limit.code }}</button>:\r\n <span *ngIf=\"limit.oilType\">{{ limit.oilType }} \u00B7 </span>\r\n <span *ngIf=\"limit.origin\">{{ limit.origin === 'Imported' ? '\u0130thal' : '\u0130\u00E7 Piyasa' }} \u00B7 </span>\r\n <span *ngIf=\"limit.minimum != null\">Min {{ limit.minimum }} </span>\r\n <span *ngIf=\"limit.maximum != null\">Max {{ limit.maximum }} </span>\r\n <span *ngIf=\"limit.nominal != null\">Nominal {{ limit.nominal }} </span>\r\n <span *ngIf=\"limit.expectedText\">{{ limit.expectedText }}</span>\r\n <span *ngIf=\"!limit.active\" class=\"text-muted\">(pasif)</span>\r\n </div>\r\n </td>\r\n <td>{{ parameter.active ? 'Aktif' : 'Pasif' }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<abp-modal [visible]=\"parameterModalVisible\" (visibleChange)=\"parameterModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newParameter ? 'Yeni Parametre' : 'Parametreyi D\u00FCzenle' }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingParameter as parameter\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"parameter.code\" [disabled]=\"!newParameter\" /></div>\r\n <div class=\"col-md-4\"><label>Ad / Soru</label><input class=\"form-control\" [(ngModel)]=\"parameter.name\" /></div>\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\"><label>Proses Ad\u0131m\u0131</label><select class=\"form-control\" [(ngModel)]=\"parameter.stepCode\"><option *ngFor=\"let step of steps()\" [value]=\"step.processCode\">{{ step.name }}</option></select></div>\r\n <div class=\"col-md-4\"><label>S\u0131ra</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"parameter.order\" /></div>\r\n <div class=\"col-md-4\"><label>Birim</label><input class=\"form-control\" [(ngModel)]=\"parameter.unit\" /></div>\r\n <div class=\"col-md-4\"><label>Veri Tipi</label><select class=\"form-control\" [(ngModel)]=\"parameter.valueType\"><option value=\"Number\">Say\u0131sal</option><option value=\"Text\">Metin</option><option value=\"Choice\">Se\u00E7im</option></select></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ondal\u0131k Basamak</label><input type=\"number\" min=\"0\" max=\"8\" class=\"form-control\" [(ngModel)]=\"parameter.decimalPlaces\" /></div>\r\n <div class=\"col-md-4\"><label>Se\u00E7enekler (virg\u00FClle ayr\u0131lm\u0131\u015F)</label><input class=\"form-control\" [(ngModel)]=\"optionsText\" [disabled]=\"parameter.valueType !== 'Choice'\" /></div>\r\n <div class=\"col-md-4\"><label>Hesaplama Form\u00FCl\u00FC</label><input class=\"form-control\" [(ngModel)]=\"parameter.formula\" [disabled]=\"!parameter.calculated\" placeholder=\"PARAM_KODU * 2\" /></div>\r\n <div class=\"col-md-4 d-flex flex-column justify-content-end\"><label><input type=\"checkbox\" [(ngModel)]=\"parameter.required\" /> Zorunlu</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.calculated\" /> Hesaplanan</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeParameterModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveParameter()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n\r\n<abp-modal [visible]=\"limitModalVisible\" (visibleChange)=\"limitModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newLimit ? 'Yeni Limit' : 'Limiti D\u00FCzenle' }} \u2013 {{ editingLimit?.parameterCode }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingLimit as limit\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"limit.code\" [disabled]=\"!newLimit\" /></div>\r\n <div class=\"col-md-4\"><label>Ya\u011F Cinsi / Ko\u015Ful</label><select class=\"form-control\" [(ngModel)]=\"limit.oilType\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Palm Oil\">Palm Oil</option><option value=\"Palm Olein\">Palm Olein</option></select></div>\r\n <div class=\"col-md-4\"><label>Men\u015Fei</label><select class=\"form-control\" [(ngModel)]=\"limit.origin\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Domestic\">\u0130\u00E7 Piyasa</option><option value=\"Imported\">\u0130thal</option></select></div>\r\n <div class=\"col-md-4\"><label>Min</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.minimum\" /></div>\r\n <div class=\"col-md-4\"><label>Max</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.maximum\" /></div>\r\n <div class=\"col-md-4\"><label>Nominal</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.nominal\" /></div>\r\n <div class=\"col-md-4\"><label>Beklenen Metin</label><input class=\"form-control\" [(ngModel)]=\"limit.expectedText\" /></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validFrom\" /></div>\r\n <div class=\"col-md-4\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validUntil\" /></div>\r\n <div class=\"col-md-4 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"limit.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-danger\" *ngIf=\"!newLimit && canDelete\"\r\n (click)=\"deleteLimit(editingLimit!)\" [disabled]=\"busy\">Sil</button>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeLimitModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveLimit()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".form-header{background:#f7f8fa;border:1px solid #e3e6eb}.parameter-table{min-width:1100px}.parameter-table .actions{white-space:nowrap}.parameter-table .limit-link{color:#007bff}.parameter-table .limit-link:hover,.parameter-table .limit-link:focus{color:#0056b3}.editor-card{border-color:#8864ac;scroll-margin-top:90px}.editor-card:focus{outline:2px solid #8864ac;outline-offset:2px}.step-pill{display:inline-block;margin:0 .4rem .4rem 0}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\n"] }]
|
|
328
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }, { type: i0.ChangeDetectorRef }, { type: i3.ActivatedRoute }]; }, propDecorators: { stepEditor: [{
|
|
329
|
+
type: ViewChild,
|
|
330
|
+
args: ['stepEditor']
|
|
331
|
+
}] } });
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eS1wYXJhbWV0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMvcXVhbGl0eS1wYXJhbWV0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMvcXVhbGl0eS1wYXJhbWV0ZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFzQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7QUFPM0UsTUFBTSxPQUFPLDBCQUEwQjtJQWlDckMsWUFDVSxHQUFzQixFQUN0QixXQUE4QixFQUM5QixjQUFpQyxFQUNqQyxLQUFxQjtRQUhyQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBcEMvQixnQkFBVyxHQUF3QixTQUFTLENBQUM7UUFDN0Msa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25DLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUN2QyxxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBR3JCLFVBQUssR0FBa0IsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBQ25DLGlCQUFZLEdBQUcsRUFB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RUQsV0FBVyxDQUFDLEtBQW1CO1FBQzdCLElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxvQ0FBb0MsQ0FBQztZQUFFLE9BQU87UUFDeEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsNkJBQTZCLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEYsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNULElBQUksSUFBSSxDQUFDLGlCQUFpQjtvQkFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ3pELElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOzt1SEF0U1UsMEJBQTBCOzJHQUExQiwwQkFBMEIsd0tDZnZDLDhoZ0JBZ0xBOzJGRGpLYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0Usd0JBQXdCO3FNQVdELFVBQVU7c0JBQTFDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGRlZmVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XHJcbmltcG9ydCB7IFF1YWxpdHlGYWNpbGl0eSwgUXVhbGl0eUZvcm0sIFF1YWxpdHlMaW1pdCwgUXVhbGl0eVBhcmFtZXRlciwgUXVhbGl0eVN0ZXAsIFF1YWxpdHlUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscy9xdWFsaXR5Lm1vZGVscyc7XHJcbmltcG9ydCB7IFF1YWxpdHlBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVhbGl0eS1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTW92ZW1lbnREZXRhaWwsIE1vdmVtZW50VHlwZSB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcclxuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBsb2NhbERhdGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWFsaXR5LW1lYXN1cmVtZW50cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1xdWFsaXR5LXBhcmFtZXRlcnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9xdWFsaXR5LXBhcmFtZXRlcnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3F1YWxpdHktcGFyYW1ldGVycy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUXVhbGl0eVBhcmFtZXRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGNvbnRyb2xUeXBlOiAnSW5wdXQnIHwgJ1Byb2Nlc3MnID0gJ1Byb2Nlc3MnO1xyXG4gIG1vdmVtZW50VHlwZXM6IE1vdmVtZW50VHlwZVtdID0gW107XHJcbiAgbW92ZW1lbnREZXRhaWxzOiBNb3ZlbWVudERldGFpbFtdID0gW107XHJcbiAgbW92ZW1lbnRUeXBlQ29kZSA9ICcnO1xyXG4gIG1vdmVtZW50RGV0YWlsQ29kZSA9ICcnO1xyXG4gIG5ld0lucHV0Rm9ybSA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ3N0ZXBFZGl0b3InKSBwcml2YXRlIHN0ZXBFZGl0b3I/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgZm9ybXM6IFF1YWxpdHlGb3JtW10gPSBbXTtcclxuICBmYWNpbGl0aWVzOiBRdWFsaXR5RmFjaWxpdHlbXSA9IFtdO1xyXG4gIGZhY2lsaXR5Q29kZSA9ICcnO1xyXG4gIGZhY2lsaXR5U3RlcHM6IFF1YWxpdHlTdGVwW10gPSBbXTtcclxuICBlZGl0aW5nU3RlcDogUXVhbGl0eVN0ZXAgfCBudWxsID0gbnVsbDtcclxuICBuZXdTdGVwID0gZmFsc2U7XHJcbiAgZm9ybUNvZGUgPSAnJztcclxuICB0ZW1wbGF0ZTogUXVhbGl0eVRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgZWRpdGluZ1BhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlciB8IG51bGwgPSBudWxsO1xyXG4gIGVkaXRpbmdMaW1pdDogUXVhbGl0eUxpbWl0IHwgbnVsbCA9IG51bGw7XHJcbiAgbmV3UGFyYW1ldGVyID0gZmFsc2U7XHJcbiAgbmV3TGltaXQgPSBmYWxzZTtcclxuICBwYXJhbWV0ZXJNb2RhbFZpc2libGUgPSBmYWxzZTtcclxuICBsaW1pdE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xyXG4gIG1vZGFsRXJyb3IgPSAnJztcclxuICByZWFkb25seSBlZGl0b3JNb2RhbE9wdGlvbnMgPSB7IHNpemU6ICd4bCcgYXMgY29uc3QsIGNlbnRlcmVkOiB0cnVlIH07XHJcbiAgb3B0aW9uc1RleHQgPSAnJztcclxuICBwcml2YXRlIHBlbmRpbmdSZXF1ZXN0cyA9IDA7XHJcbiAgYnVzeVRleHQgPSAnS2FsaXRlIHRhbsSxbWxhcsSxIHnDvGtsZW5peW9y4oCmJztcclxuXHJcbiAgZ2V0IGJ1c3koKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA+IDA7IH1cclxuICBlcnJvciA9ICcnO1xyXG4gIHN1Y2Nlc3MgPSAnJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFwaTogUXVhbGl0eUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCd0eXBlJykgPT09ICdJbnB1dCcpIHRoaXMuY29udHJvbFR5cGUgPSAnSW5wdXQnO1xyXG4gICAgdGhpcy5tb3ZlbWVudERldGFpbENvZGUgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdkZXRhaWwnKSB8fCAnJztcclxuICAgIHRoaXMuYXBpLnF1YWxpdHlNb3ZlbWVudFR5cGVzKCkuc3Vic2NyaWJlKHsgbmV4dDogeCA9PiB0aGlzLm1vdmVtZW50VHlwZXMgPSB4LCBlcnJvcjogZSA9PiB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpIH0pO1xyXG4gICAgdGhpcy5hcGkubW92ZW1lbnREZXRhaWxzKCkuc3Vic2NyaWJlKHsgbmV4dDogeCA9PiB7XHJcbiAgICAgIHRoaXMubW92ZW1lbnREZXRhaWxzID0geC5maWx0ZXIoZCA9PiBkLmFjdGl2ZSk7XHJcbiAgICAgIHRoaXMubW92ZW1lbnRUeXBlQ29kZSA9IHguZmluZChkID0+IGQuY29kZSA9PT0gdGhpcy5tb3ZlbWVudERldGFpbENvZGUpPy5tb3ZlbWVudFR5cGVDb2RlIHx8ICcnO1xyXG4gICAgICBpZiAodGhpcy5jb250cm9sVHlwZSA9PT0gJ0lucHV0JykgdGhpcy5zZWxlY3RJbnB1dCgpO1xyXG4gICAgfSwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSB9KTtcclxuICAgIHRoaXMudHJhY2sodGhpcy5hcGkucGFyYW1ldGVyRmFjaWxpdGllcygpLCAnS2FsaXRlIHRhbsSxbWxhcsSxIHnDvGtsZW5peW9y4oCmJykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogZmFjaWxpdGllcyA9PiB7IHRoaXMuZmFjaWxpdGllcyA9IGZhY2lsaXRpZXM7IHRoaXMuc2VsZWN0RmFjaWxpdHkoKTsgaWYgKHRoaXMuZmFjaWxpdHlDb2RlKSB0aGlzLmxvYWRTdGVwcygpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5lcnJvciA9ICdUZXNpcyBsaXN0ZXNpIHnDvGtsZW5lbWVkaS4nLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyYWNrKHRoaXMuYXBpLmZvcm1zKCksICdLYWxpdGUgdGFuxLFtbGFyxLEgecO8a2xlbml5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBmb3JtcyA9PiB7IHRoaXMuZm9ybXMgPSBmb3JtczsgdGhpcy5zd2l0Y2hUeXBlKHRoaXMuY29udHJvbFR5cGUpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5lcnJvciA9ICdGb3JtIGxpc3Rlc2kgecO8a2xlbmVtZWRpLicsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBjYW5FZGl0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5nZXRHcmFudGVkUG9saWN5KCdLYWxpdGUuUGFyYW1ldGVycy5FZGl0Jyk7IH1cclxuICBnZXQgY2FuQ3JlYXRlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5nZXRHcmFudGVkUG9saWN5KCdLYWxpdGUuUGFyYW1ldGVycy5DcmVhdGUnKTsgfVxyXG4gIGdldCBjYW5EZWxldGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnBlcm1pc3Npb25zLmdldEdyYW50ZWRQb2xpY3koJ0thbGl0ZS5QYXJhbWV0ZXJzLkRlbGV0ZScpOyB9XHJcblxyXG4gIGdldCB2aXNpYmxlRm9ybXMoKTogUXVhbGl0eUZvcm1bXSB7IHJldHVybiB0aGlzLmZvcm1zLmZpbHRlcihmID0+IChmLmNvbnRyb2xUeXBlIHx8ICdQcm9jZXNzJykgPT09IHRoaXMuY29udHJvbFR5cGUpOyB9XHJcbiAgZ2V0IHZpc2libGVEZXRhaWxzKCk6IE1vdmVtZW50RGV0YWlsW10geyByZXR1cm4gdGhpcy5tb3ZlbWVudERldGFpbHMuZmlsdGVyKGQgPT4gIXRoaXMubW92ZW1lbnRUeXBlQ29kZSB8fCBkLm1vdmVtZW50VHlwZUNvZGUgPT09IHRoaXMubW92ZW1lbnRUeXBlQ29kZSk7IH1cclxuICBzd2l0Y2hUeXBlKHR5cGU6ICdJbnB1dCcgfCAnUHJvY2VzcycpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udHJvbFR5cGUgPSB0eXBlOyB0aGlzLmVkaXRpbmdTdGVwID0gbnVsbDsgdGhpcy5mYWNpbGl0eVN0ZXBzID0gW107IHRoaXMudGVtcGxhdGUgPSBudWxsO1xyXG4gICAgaWYgKHR5cGUgPT09ICdJbnB1dCcpIHRoaXMuc2VsZWN0SW5wdXQoKTtcclxuICAgIGVsc2UgeyB0aGlzLmZvcm1Db2RlID0gdGhpcy52aXNpYmxlRm9ybXNbMF0/LmNvZGUgfHwgJyc7IHRoaXMubmV3SW5wdXRGb3JtID0gZmFsc2U7IHRoaXMubG9hZCgpOyB9XHJcbiAgfVxyXG4gIHNlbGVjdElucHV0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnZpc2libGVEZXRhaWxzLnNvbWUoZCA9PiBkLmNvZGUgPT09IHRoaXMubW92ZW1lbnREZXRhaWxDb2RlKSkgdGhpcy5tb3ZlbWVudERldGFpbENvZGUgPSB0aGlzLnZpc2libGVEZXRhaWxzWzBdPy5jb2RlIHx8ICcnO1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMudmlzaWJsZUZvcm1zLmZpbmQoZiA9PiBmLm1vdmVtZW50RGV0YWlsQ29kZSA9PT0gdGhpcy5tb3ZlbWVudERldGFpbENvZGUpO1xyXG4gICAgaWYgKGZvcm0pIHsgdGhpcy5mb3JtQ29kZSA9IGZvcm0uY29kZTsgdGhpcy5uZXdJbnB1dEZvcm0gPSBmYWxzZTsgdGhpcy5sb2FkKCk7IHJldHVybjsgfVxyXG4gICAgY29uc3QgZGV0YWlsID0gdGhpcy5tb3ZlbWVudERldGFpbHMuZmluZChkID0+IGQuY29kZSA9PT0gdGhpcy5tb3ZlbWVudERldGFpbENvZGUpO1xyXG4gICAgdGhpcy5uZXdJbnB1dEZvcm0gPSAhIWRldGFpbDsgdGhpcy5mb3JtQ29kZSA9IGRldGFpbCA/ICdJTl8nICsgZGV0YWlsLmNvZGUgOiAnJztcclxuICAgIHRoaXMudGVtcGxhdGUgPSBkZXRhaWwgPyB7IGZvcm06IHsgY29kZTogdGhpcy5mb3JtQ29kZSwgY29udHJvbFR5cGU6ICdJbnB1dCcsIG1vdmVtZW50RGV0YWlsQ29kZTogZGV0YWlsLmNvZGUsXHJcbiAgICAgIGF2ZXJhZ2VNb2RlOiAnQXJpdGhtZXRpYycsIG5hbWU6IGRldGFpbC5uYW1lIHx8IHRoaXMubW92ZW1lbnRUeXBlcy5maW5kKHQgPT4gdC5jb2RlID09PSBkZXRhaWwubW92ZW1lbnRUeXBlQ29kZSk/Lm5hbWUgfHwgJycsXHJcbiAgICAgIGRvY3VtZW50Q29kZTogJycsIHB1YmxpY2F0aW9uRGF0ZTogbG9jYWxEYXRlKCksIHJldmlzaW9uRGF0ZTogbG9jYWxEYXRlKCksIHJldmlzaW9uTnVtYmVyOiAnMScsIGFjdGl2ZTogdHJ1ZSB9LFxyXG4gICAgICBwYXJhbWV0ZXJzOiBbXSwgbGltaXRzOiBbXSwgc3RlcHM6IFtdIH0gOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbG9hZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtQ29kZSkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJykgeyB0aGlzLnNlbGVjdEZhY2lsaXR5KCk7IGlmICh0aGlzLmZhY2lsaXR5Q29kZSkgdGhpcy5sb2FkU3RlcHMoKTsgfVxyXG4gICAgdGhpcy5lcnJvciA9ICcnO1xyXG4gICAgdGhpcy50cmFjayh0aGlzLmFwaS50ZW1wbGF0ZSh0aGlzLmZvcm1Db2RlKSwgJ0thbGl0ZSB0YW7EsW1sYXLEsSB5w7xrbGVuaXlvcuKApicpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IHRlbXBsYXRlID0+IHtcclxuICAgICAgICB0ZW1wbGF0ZS5mb3JtLnB1YmxpY2F0aW9uRGF0ZSA9IHRlbXBsYXRlLmZvcm0ucHVibGljYXRpb25EYXRlPy5zbGljZSgwLCAxMCk7XHJcbiAgICAgICAgdGVtcGxhdGUuZm9ybS5yZXZpc2lvbkRhdGUgPSB0ZW1wbGF0ZS5mb3JtLnJldmlzaW9uRGF0ZT8uc2xpY2UoMCwgMTApO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZWRpdGluZ0xpbWl0ID0gbnVsbDtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5lcnJvciA9ICdGb3JtIHRhbsSxbcSxIHnDvGtsZW5lbWVkaS4nOyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldmVhbFN0ZXBFZGl0b3IoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuc3RlcEVkaXRvcj8ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XHJcbiAgICB0aGlzLnN0ZXBFZGl0b3I/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcGFyYW1ldGVyTW9kYWxDaGFuZ2VkKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1ldGVyTW9kYWxWaXNpYmxlID0gdmlzaWJsZTtcclxuICAgIGlmICghdmlzaWJsZSkgeyB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSBudWxsOyB0aGlzLm1vZGFsRXJyb3IgPSAnJzsgfVxyXG4gIH1cclxuXHJcbiAgbGltaXRNb2RhbENoYW5nZWQodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5saW1pdE1vZGFsVmlzaWJsZSA9IHZpc2libGU7XHJcbiAgICBpZiAoIXZpc2libGUpIHsgdGhpcy5lZGl0aW5nTGltaXQgPSBudWxsOyB0aGlzLm1vZGFsRXJyb3IgPSAnJzsgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VQYXJhbWV0ZXJNb2RhbCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5idXN5KSB0aGlzLnBhcmFtZXRlck1vZGFsQ2hhbmdlZChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZUxpbWl0TW9kYWwoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYnVzeSkgdGhpcy5saW1pdE1vZGFsQ2hhbmdlZChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYWNrPFQ+KHJlcXVlc3Q6IE9ic2VydmFibGU8VD4sIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcclxuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMrKztcclxuICAgICAgdGhpcy5idXN5VGV4dCA9IG1lc3NhZ2U7XHJcbiAgICAgIHJldHVybiByZXF1ZXN0LnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5wZW5kaW5nUmVxdWVzdHMtLSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzTmFtZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU/LnN0ZXBzLmZpbmQoc3RlcCA9PiBzdGVwLnByb2Nlc3NDb2RlID09PSBjb2RlKT8ubmFtZSB8fCBjb2RlO1xyXG4gIH1cclxuXHJcbiAgc3RlcHMoKTogUXVhbGl0eVN0ZXBbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5mYWNpbGl0eVN0ZXBzLmZpbHRlcih4ID0+IHguYWN0aXZlKTtcclxuICB9XHJcblxyXG4gIG1hdGNoaW5nRmFjaWxpdGllcygpOiBRdWFsaXR5RmFjaWxpdHlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5mYWNpbGl0aWVzLmZpbHRlcih4ID0+IHguZm9ybUNvZGUgPT09IHRoaXMuZm9ybUNvZGUpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0RmFjaWxpdHkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubWF0Y2hpbmdGYWNpbGl0aWVzKCkuc29tZSh4ID0+IHguY29kZSA9PT0gdGhpcy5mYWNpbGl0eUNvZGUpKVxyXG4gICAgICB0aGlzLmZhY2lsaXR5Q29kZSA9IHRoaXMubWF0Y2hpbmdGYWNpbGl0aWVzKClbMF0/LmNvZGUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBsb2FkU3RlcHMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmFjaWxpdHlDb2RlKSByZXR1cm47XHJcbiAgICB0aGlzLnRyYWNrKHRoaXMuYXBpLnN0ZXBzKHRoaXMuZmFjaWxpdHlDb2RlKSwgJ0thbGl0ZSB0YW7EsW1sYXLEsSB5w7xrbGVuaXlvcuKApicpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IHN0ZXBzID0+IHRoaXMuZmFjaWxpdHlTdGVwcyA9IHN0ZXBzLFxyXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5lcnJvciA9ICdQcm9zZXMgYWTEsW1sYXLEsSB5w7xrbGVuZW1lZGkuJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkU3RlcCgpOiB2b2lkIHtcclxuICAgIHRoaXMubmV3U3RlcCA9IHRydWU7XHJcbiAgICB0aGlzLmVkaXRpbmdTdGVwID0geyBjb2RlOiAnJywgZmFjaWxpdHlDb2RlOiB0aGlzLmZhY2lsaXR5Q29kZSwgcHJvY2Vzc0NvZGU6ICcnLFxyXG4gICAgICBuYW1lOiAnJywgb3JkZXI6IHRoaXMuZmFjaWxpdHlTdGVwcy5sZW5ndGggKyAxLCBhY3RpdmU6IHRydWUgfTtcclxuICAgIHRoaXMucmV2ZWFsU3RlcEVkaXRvcigpO1xyXG4gIH1cclxuXHJcbiAgZWRpdFN0ZXAoc3RlcDogUXVhbGl0eVN0ZXApOiB2b2lkIHtcclxuICAgIHRoaXMubmV3U3RlcCA9IGZhbHNlO1xyXG4gICAgdGhpcy5lZGl0aW5nU3RlcCA9IHsgLi4uc3RlcCB9O1xyXG4gICAgdGhpcy5yZXZlYWxTdGVwRWRpdG9yKCk7XHJcbiAgfVxyXG5cclxuICBzYXZlU3RlcCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lZGl0aW5nU3RlcCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3RlcCA9IHsgLi4udGhpcy5lZGl0aW5nU3RlcCxcclxuICAgICAgY29kZTogdGhpcy5lZGl0aW5nU3RlcC5jb2RlLnRyaW0oKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBwcm9jZXNzQ29kZTogdGhpcy5lZGl0aW5nU3RlcC5wcm9jZXNzQ29kZS50cmltKCkudG9VcHBlckNhc2UoKSxcclxuICAgICAgbmFtZTogdGhpcy5lZGl0aW5nU3RlcC5uYW1lLnRyaW0oKSB9O1xyXG4gICAgdGhpcy50cmFjayh0aGlzLmFwaS5zYXZlU3RlcChzdGVwKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMuZWRpdGluZ1N0ZXAgPSBudWxsOyB0aGlzLnN1Y2Nlc3MgPSAnUHJvc2VzIGFkxLFtxLEga2F5ZGVkaWxkaS4nOyB0aGlzLmxvYWRTdGVwcygpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmVycm9yID0gJ1Byb3NlcyBhZMSxbcSxIGtheWRlZGlsZW1lZGkuJzsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb3JkZXJlZFBhcmFtZXRlcnMoKTogUXVhbGl0eVBhcmFtZXRlcltdIHtcclxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zdGVwcygpLm1hcChzdGVwID0+IHN0ZXAucHJvY2Vzc0NvZGUpO1xyXG4gICAgcmV0dXJuIFsuLi4odGhpcy50ZW1wbGF0ZT8ucGFyYW1ldGVycyB8fCBbXSldLnNvcnQoKGEsIGIpID0+XHJcbiAgICAgIG9yZGVyLmluZGV4T2YoYS5zdGVwQ29kZSkgLSBvcmRlci5pbmRleE9mKGIuc3RlcENvZGUpIHx8IGEub3JkZXIgLSBiLm9yZGVyKTtcclxuICB9XHJcblxyXG4gIGxpbWl0c0Zvcihjb2RlOiBzdHJpbmcpOiBRdWFsaXR5TGltaXRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZT8ubGltaXRzLmZpbHRlcihsaW1pdCA9PiBsaW1pdC5wYXJhbWV0ZXJDb2RlID09PSBjb2RlKSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGVkaXRGb3JtKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlIHx8ICF0aGlzLmNhbkVkaXQpIHJldHVybjtcclxuICAgIHRoaXMudHJhY2sodGhpcy5hcGkuc2F2ZUZvcm0odGhpcy50ZW1wbGF0ZS5mb3JtKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMuc3VjY2VzcyA9ICdGb3JtIGJhxZ9sxLHEn8SxIGtheWRlZGlsZGkuJzsgdGhpcy5uZXdJbnB1dEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFwaS5mb3JtcygpLnN1YnNjcmliZSh7IG5leHQ6IGZvcm1zID0+IHsgdGhpcy5mb3JtcyA9IGZvcm1zOyB0aGlzLmxvYWQoKTsgfSB9KTsgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5lcnJvciA9ICdGb3JtIGJhxZ9sxLHEn8SxIGtheWRlZGlsZW1lZGkuJzsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFyYW1ldGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlIHx8IHRoaXMubmV3SW5wdXRGb3JtKSByZXR1cm47XHJcbiAgICB0aGlzLm5ld1BhcmFtZXRlciA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnNUZXh0ID0gJyc7XHJcbiAgICB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSB7XHJcbiAgICAgIGNvZGU6ICcnLCBmb3JtQ29kZTogdGhpcy5mb3JtQ29kZSwgc3RlcENvZGU6IHRoaXMudGVtcGxhdGUuc3RlcHNbMF0/LnByb2Nlc3NDb2RlIHx8ICcnLFxyXG4gICAgICBvcmRlcjogdGhpcy50ZW1wbGF0ZS5wYXJhbWV0ZXJzLmxlbmd0aCArIDEsIG5hbWU6ICcnLCB1bml0OiAnJywgdmFsdWVUeXBlOiAnTnVtYmVyJyxcclxuICAgICAgZGVjaW1hbFBsYWNlczogMiwgcmVxdWlyZWQ6IGZhbHNlLCBjYWxjdWxhdGVkOiBmYWxzZSwgZm9ybXVsYTogJycsIG9wdGlvbnM6IFtdLCBhY3RpdmU6IHRydWUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5lZGl0aW5nTGltaXQgPSBudWxsO1xyXG4gICAgdGhpcy5tb2RhbEVycm9yID0gJyc7XHJcbiAgICB0aGlzLnBhcmFtZXRlck1vZGFsVmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBlZGl0UGFyYW1ldGVyKHBhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlcik6IHZvaWQge1xyXG4gICAgdGhpcy5uZXdQYXJhbWV0ZXIgPSBmYWxzZTtcclxuICAgIHRoaXMuZWRpdGluZ1BhcmFtZXRlciA9IHsgLi4ucGFyYW1ldGVyLCBvcHRpb25zOiBbLi4uKHBhcmFtZXRlci5vcHRpb25zIHx8IFtdKV0gfTtcclxuICAgIHRoaXMub3B0aW9uc1RleHQgPSB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIub3B0aW9ucy5qb2luKCcsICcpO1xyXG4gICAgdGhpcy5lZGl0aW5nTGltaXQgPSBudWxsO1xyXG4gICAgdGhpcy5tb2RhbEVycm9yID0gJyc7XHJcbiAgICB0aGlzLnBhcmFtZXRlck1vZGFsVmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzYXZlUGFyYW1ldGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgfHwgdGhpcy5idXN5KSByZXR1cm47XHJcbiAgICBjb25zdCBwYXJhbWV0ZXIgPSB7IC4uLnRoaXMuZWRpdGluZ1BhcmFtZXRlcixcclxuICAgICAgY29kZTogdGhpcy5lZGl0aW5nUGFyYW1ldGVyLmNvZGUudHJpbSgpLnRvVXBwZXJDYXNlKCksXHJcbiAgICAgIG5hbWU6IHRoaXMuZWRpdGluZ1BhcmFtZXRlci5uYW1lLnRyaW0oKSxcclxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zVGV4dC5zcGxpdCgnLCcpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXHJcbiAgICB9O1xyXG4gICAgaWYgKCFwYXJhbWV0ZXIuY29kZSB8fCAhcGFyYW1ldGVyLm5hbWUgfHwgKHRoaXMuY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJyAmJiAhcGFyYW1ldGVyLnN0ZXBDb2RlKSkge1xyXG4gICAgICB0aGlzLm1vZGFsRXJyb3IgPSAnUGFyYW1ldHJlIGtvZHUsIGFkxLEgdmUgcHJvc2VzIGtvbnRyb2zDvG5kZSBwcm9zZXMgYWTEsW3EsSB6b3J1bmx1ZHVyLic7IHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW9kYWxFcnJvciA9ICcnO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubmV3UGFyYW1ldGVyID8gdGhpcy5hcGkuY3JlYXRlUGFyYW1ldGVyKHBhcmFtZXRlcikgOiB0aGlzLmFwaS51cGRhdGVQYXJhbWV0ZXIocGFyYW1ldGVyKTtcclxuICAgIHRoaXMudHJhY2socmVxdWVzdCwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMucGFyYW1ldGVyTW9kYWxDaGFuZ2VkKGZhbHNlKTsgdGhpcy5zdWNjZXNzID0gJ1BhcmFtZXRyZSBrYXlkZWRpbGRpLic7IHRoaXMubG9hZCgpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLm1vZGFsRXJyb3IgPSAnUGFyYW1ldHJlIGtheWRlZGlsZW1lZGkuJzsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUGFyYW1ldGVyKHBhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlcik6IHZvaWQge1xyXG4gICAgaWYgKCFjb25maXJtKGAke3BhcmFtZXRlci5uYW1lfSBwYXJhbWV0cmVzaSB2ZSBiYcSfbMSxIGxpbWl0bGVyaSBrYWzEsWPEsSBvbGFyYWsgc2lsaW5zaW4gbWk/YCkpIHJldHVybjtcclxuICAgIHRoaXMudHJhY2sodGhpcy5hcGkuZGVsZXRlUGFyYW1ldGVyKHBhcmFtZXRlci5jb2RlKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLmxvYWQoKSwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkTGltaXQocGFyYW1ldGVyOiBRdWFsaXR5UGFyYW1ldGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld0xpbWl0ID0gdHJ1ZTtcclxuICAgIHRoaXMuZWRpdGluZ1BhcmFtZXRlciA9IG51bGw7XHJcbiAgICB0aGlzLmVkaXRpbmdMaW1pdCA9IHtcclxuICAgICAgY29kZTogJycsIHBhcmFtZXRlckNvZGU6IHBhcmFtZXRlci5jb2RlLCBvaWxUeXBlOiAnJywgb3JpZ2luOiAnJywgbWluaW11bTogbnVsbCwgbWF4aW11bTogbnVsbCxcclxuICAgICAgbm9taW5hbDogbnVsbCwgZXhwZWN0ZWRUZXh0OiAnJywgdmFsaWRGcm9tOiBudWxsLCB2YWxpZFVudGlsOiBudWxsLCBhY3RpdmU6IHRydWUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5tb2RhbEVycm9yID0gJyc7XHJcbiAgICB0aGlzLmxpbWl0TW9kYWxWaXNpYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGVkaXRMaW1pdChsaW1pdDogUXVhbGl0eUxpbWl0KTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld0xpbWl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSBudWxsO1xyXG4gICAgdGhpcy5lZGl0aW5nTGltaXQgPSB7IC4uLmxpbWl0LFxyXG4gICAgICB2YWxpZEZyb206IGxpbWl0LnZhbGlkRnJvbT8uc2xpY2UoMCwgMTApIHx8IG51bGwsXHJcbiAgICAgIHZhbGlkVW50aWw6IGxpbWl0LnZhbGlkVW50aWw/LnNsaWNlKDAsIDEwKSB8fCBudWxsLFxyXG4gICAgfTtcclxuICAgIHRoaXMubW9kYWxFcnJvciA9ICcnO1xyXG4gICAgdGhpcy5saW1pdE1vZGFsVmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzYXZlTGltaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWRpdGluZ0xpbWl0IHx8IHRoaXMuYnVzeSkgcmV0dXJuO1xyXG4gICAgY29uc3QgbGltaXQgPSB7IC4uLnRoaXMuZWRpdGluZ0xpbWl0LFxyXG4gICAgICBjb2RlOiB0aGlzLm5ld0xpbWl0ID8gdGhpcy5lZGl0aW5nTGltaXQuY29kZS50cmltKCkudG9VcHBlckNhc2UoKSA6IHRoaXMuZWRpdGluZ0xpbWl0LmNvZGUsXHJcbiAgICAgIG9pbFR5cGU6IHRoaXMuZWRpdGluZ0xpbWl0Lm9pbFR5cGU/LnRyaW0oKSB8fCAnJyxcclxuICAgIH07XHJcbiAgICBpZiAoIWxpbWl0LmNvZGUpIHsgdGhpcy5tb2RhbEVycm9yID0gJ0xpbWl0IGtvZHUgem9ydW5sdWR1ci4nOyByZXR1cm47IH1cclxuICAgIHRoaXMubW9kYWxFcnJvciA9ICcnO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubmV3TGltaXQgPyB0aGlzLmFwaS5jcmVhdGVMaW1pdChsaW1pdCkgOiB0aGlzLmFwaS51cGRhdGVMaW1pdChsaW1pdCk7XHJcbiAgICB0aGlzLnRyYWNrKHJlcXVlc3QsICdEZcSfacWfaWtsaWtsZXIga2F5ZGVkaWxpeW9y4oCmJykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4geyB0aGlzLmxpbWl0TW9kYWxDaGFuZ2VkKGZhbHNlKTsgdGhpcy5zdWNjZXNzID0gJ0xpbWl0IGtheWRlZGlsZGkuJzsgdGhpcy5sb2FkKCk7IH0sXHJcbiAgICAgIGVycm9yOiBlID0+IHsgdGhpcy5tb2RhbEVycm9yID0gZXJyb3JNZXNzYWdlKGUpOyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVMaW1pdChsaW1pdDogUXVhbGl0eUxpbWl0KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm47XHJcbiAgICBpZiAoIWNvbmZpcm0oYCR7bGltaXQuY29kZX0gbGltaXRpIGthbMSxY8SxIG9sYXJhayBzaWxpbnNpbiBtaT9gKSkgcmV0dXJuO1xyXG4gICAgdGhpcy50cmFjayh0aGlzLmFwaS5kZWxldGVMaW1pdChsaW1pdC5jb2RlKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMubGltaXRNb2RhbENoYW5nZWQoZmFsc2UpOyB0aGlzLmxvYWQoKTsgfSxcclxuICAgICAgZXJyb3I6IGUgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxpbWl0TW9kYWxWaXNpYmxlKSB0aGlzLm1vZGFsRXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgPGgzIGNsYXNzPVwicGFnZS10aXRsZVwiPkthbGl0ZSBQYXJhbWV0cmVsZXJpIChLYWxpdGUgU29ydWxhcsSxKTwvaDM+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIG10LTJcIj48ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG1iLTNcIiByb2xlPVwidGFibGlzdFwiPjxidXR0b24gY2xhc3M9XCJidG5cIiBbY2xhc3MuYnRuLXByaW1hcnldPVwiY29udHJvbFR5cGUgPT09ICdJbnB1dCdcIiBbY2xhc3MuYnRuLW91dGxpbmUtc2Vjb25kYXJ5XT1cImNvbnRyb2xUeXBlICE9PSAnSW5wdXQnXCIgKGNsaWNrKT1cInN3aXRjaFR5cGUoJ0lucHV0JylcIj5HaXJkaSBLb250cm9sPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cImJ0blwiIFtjbGFzcy5idG4tcHJpbWFyeV09XCJjb250cm9sVHlwZSA9PT0gJ1Byb2Nlc3MnXCIgW2NsYXNzLmJ0bi1vdXRsaW5lLXNlY29uZGFyeV09XCJjb250cm9sVHlwZSAhPT0gJ1Byb2Nlc3MnXCIgKGNsaWNrKT1cInN3aXRjaFR5cGUoJ1Byb2Nlc3MnKVwiPlByb3NlcyBLb250cm9sPC9idXR0b24+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIiAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnSW5wdXQnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPjxsYWJlbD5BcmHDpyBIYXJla2V0IFTDvHLDvDwvbGFiZWw+PHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibW92ZW1lbnRUeXBlQ29kZVwiIChjaGFuZ2UpPVwic2VsZWN0SW5wdXQoKVwiPjxvcHRpb24gdmFsdWU9XCJcIj5Uw7xtw7w8L29wdGlvbj48b3B0aW9uICpuZ0Zvcj1cImxldCB0eXBlIG9mIG1vdmVtZW50VHlwZXNcIiBbdmFsdWVdPVwidHlwZS5jb2RlXCI+e3sgdHlwZS5uYW1lIH19PC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPjxsYWJlbD5BcmHDpyBIYXJla2V0IFTDvHLDvCAvIERldGF5PC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJtb3ZlbWVudERldGFpbENvZGVcIiAoY2hhbmdlKT1cInNlbGVjdElucHV0KClcIj48b3B0aW9uIHZhbHVlPVwiXCI+U2XDp2luPC9vcHRpb24+PG9wdGlvbiAqbmdGb3I9XCJsZXQgZCBvZiB2aXNpYmxlRGV0YWlsc1wiIFt2YWx1ZV09XCJkLmNvZGVcIj57eyBkLm5hbWUgfHwgZC5tb3ZlbWVudFR5cGVDb2RlIH19e3sgZC5kZXRhaWxDb2RlID8gJyAvICcgKyBkLmRldGFpbENvZGUgOiAnIChkZXRheXPEsXopJyB9fTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PlxyXG4gICAgICA8cCBjbGFzcz1cImNvbC1tZC0xMiBtdC0yIHRleHQtbXV0ZWRcIiAqbmdJZj1cIiF2aXNpYmxlRGV0YWlscy5sZW5ndGhcIj7Dlm5jZSBLYWxpdGUgVGFuxLFtbGFyxLEgZWtyYW7EsW5kYSBrYWxpdGUga29udHJvbGUgdGFiaSBoYXJla2V0IHTDvHLDvG7DvCB0YW7EsW1sYXnEsW4uPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWVuZCBtYi0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiICpuZ0lmPVwiY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJ1wiPlxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJmb3JtU2VsZWN0XCI+Rm9ybTwvbGFiZWw+XHJcbiAgICAgICAgPHNlbGVjdCBpZD1cImZvcm1TZWxlY3RcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtkaXNhYmxlZF09XCJidXN5XCIgWyhuZ01vZGVsKV09XCJmb3JtQ29kZVwiIChjaGFuZ2UpPVwibG9hZCgpXCI+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBmb3JtIG9mIHZpc2libGVGb3Jtc1wiIFt2YWx1ZV09XCJmb3JtLmNvZGVcIj57eyBmb3JtLmRvY3VtZW50Q29kZSB9fSDigJMge3sgZm9ybS5uYW1lIH19PC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggdGV4dC1tZC1yaWdodCBtdC0yIG10LW1kLTBcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKm5nSWY9XCJjYW5DcmVhdGVcIiAoY2xpY2spPVwiYWRkUGFyYW1ldGVyKClcIiBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhdGVtcGxhdGUgfHwgbmV3SW5wdXRGb3JtXCI+KyBZZW5pIFBhcmFtZXRyZTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj57eyBlcnJvciB9fTwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInN1Y2Nlc3NcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIiAoY2xpY2spPVwic3VjY2VzcyA9ICcnXCI+e3sgc3VjY2VzcyB9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInF1YWxpdHktZ3JpZC1sb2FkaW5nXCIgKm5nSWY9XCJidXN5XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYnVzeT1cInRydWVcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgIDxzcGFuPnt7IGJ1c3lUZXh0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlbXBsYXRlXCI+XHJcbiAgICAgIDxkaXYgW2hpZGRlbl09XCJidXN5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kIG1iLTNcIiAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnUHJvY2VzcydcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWwgZm9yPVwiZmFjaWxpdHlTZWxlY3RcIj5Qcm9zZXMgc8SxcmFzxLEgacOnaW4gdGVzaXM8L2xhYmVsPlxyXG4gICAgICAgICAgPHNlbGVjdCBpZD1cImZhY2lsaXR5U2VsZWN0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImZhY2lsaXR5Q29kZVwiIChjaGFuZ2UpPVwibG9hZFN0ZXBzKClcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZmFjaWxpdHkgb2YgbWF0Y2hpbmdGYWNpbGl0aWVzKClcIiBbdmFsdWVdPVwiZmFjaWxpdHkuY29kZVwiPnt7IGZhY2lsaXR5Lm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOCB0ZXh0LW1kLXJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCIgKm5nSWY9XCJjYW5FZGl0XCIgKGNsaWNrKT1cImFkZFN0ZXAoKVwiPisgUHJvc2VzIEFkxLFtxLE8L2J1dHRvbj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgKm5nSWY9XCJjb250cm9sVHlwZSA9PT0gJ1Byb2Nlc3MnXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLXBpbGxcIiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBmYWNpbGl0eVN0ZXBzXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc21cIiBbY2xhc3MuYnRuLW91dGxpbmUtcHJpbWFyeV09XCJzdGVwLmFjdGl2ZVwiIFtjbGFzcy5idG4tb3V0bGluZS1zZWNvbmRhcnldPVwiIXN0ZXAuYWN0aXZlXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRTdGVwKHN0ZXApXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCI+e3sgc3RlcC5vcmRlciB9fS4ge3sgc3RlcC5uYW1lIH19PHNwYW4gKm5nSWY9XCIhc3RlcC5hY3RpdmVcIj4gKHBhc2lmKTwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICNzdGVwRWRpdG9yIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cImNhcmQgbXQtMyBtYi0zIGVkaXRvci1jYXJkXCIgKm5nSWY9XCJlZGl0aW5nU3RlcCBhcyBzdGVwXCI+PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgIDxoNT57eyBuZXdTdGVwID8gJ1llbmkgUHJvc2VzIEFkxLFtxLEnIDogJ1Byb3NlcyBBZMSxbcSxbsSxIETDvHplbmxlJyB9fTwvaDU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PGxhYmVsPktvZDwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzdGVwLmNvZGVcIiBbZGlzYWJsZWRdPVwiIW5ld1N0ZXBcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PGxhYmVsPlByb3NlcyBLb2R1PC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInN0ZXAucHJvY2Vzc0NvZGVcIiBbZGlzYWJsZWRdPVwiIW5ld1N0ZXBcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkFkPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInN0ZXAubmFtZVwiIC8+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj48bGFiZWw+U8SxcmE8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzdGVwLm9yZGVyXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBkLWZsZXggYWxpZ24taXRlbXMtZW5kXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInN0ZXAuYWN0aXZlXCIgLz4gQWt0aWY8L2xhYmVsPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtMyBtci0yXCIgKGNsaWNrKT1cInNhdmVTdGVwKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPktheWRldDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBtdC0zXCIgKGNsaWNrKT1cImVkaXRpbmdTdGVwID0gbnVsbFwiPsSwcHRhbDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyIHJvdW5kZWQgcC0zIG1iLTNcIj5cclxuICAgICAgICA8cCAqbmdJZj1cIm5ld0lucHV0Rm9ybVwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPsOWbmNlIGZvcm0gYmHFn2zEscSfxLFuxLEga2F5ZGVkaW4sIGFyZMSxbmRhbiBrYWxpdGUgc29ydWxhcsSxbsSxIGVrbGV5aW4uPC9wPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5Gb3JtIEFkxLE8L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwidGVtcGxhdGUuZm9ybS5uYW1lXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjxsYWJlbD5Eb2vDvG1hbiBLb2R1PC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0uZG9jdW1lbnRDb2RlXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjxsYWJlbD5ZYXnEsW4gVGFyaWhpPC9sYWJlbD48aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwidGVtcGxhdGUuZm9ybS5wdWJsaWNhdGlvbkRhdGVcIiBbZGlzYWJsZWRdPVwiIWNhbkVkaXRcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PGxhYmVsPlJldml6eW9uIFRhcmloaTwvbGFiZWw+PGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0ucmV2aXNpb25EYXRlXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjxsYWJlbD5SZXZpenlvbiBObzwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJ0ZW1wbGF0ZS5mb3JtLnJldmlzaW9uTnVtYmVyXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTJcIiAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnSW5wdXQnXCI+PGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk9ydGFsYW1hIFRpcGk8L2xhYmVsPjxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0uYXZlcmFnZU1vZGVcIiBbZGlzYWJsZWRdPVwiIWNhbkVkaXRcIj48b3B0aW9uIHZhbHVlPVwiQXJpdGhtZXRpY1wiPkFyaXRtZXRpazwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJXZWlnaHRlZFwiPk1pa3RhciBhxJ/EsXJsxLFrbMSxPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk1pa3RhciBCaXJpbWk8L2xhYmVsPjxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0ucXVhbnRpdHlVbml0XCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCI+PG9wdGlvbiB2YWx1ZT1cImtnXCI+S2lsb2dyYW08L29wdGlvbj48b3B0aW9uIHZhbHVlPVwidFwiPlRvbjwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtdC0zXCIgKm5nSWY9XCJjYW5FZGl0XCIgKGNsaWNrKT1cImVkaXRGb3JtKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPkJhxZ9sxLHEn8SxIEtheWRldDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1zbSBwYXJhbWV0ZXItdGFibGVcIj5cclxuICAgICAgICAgIDx0aGVhZD48dHI+PHRoPsSwxZ9sZW1sZXI8L3RoPjx0aCAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnUHJvY2VzcydcIj5Qcm9zZXMgQWTEsW3EsTwvdGg+PHRoPlPEsXJhPC90aD48dGg+S29kPC90aD48dGg+UGFyYW1ldHJlIC8gU29ydTwvdGg+PHRoPkJpcmltPC90aD48dGg+VmVyaSBUaXBpPC90aD48dGg+TGltaXQgLyBOb21pbmFsPC90aD48dGg+RHVydW08L3RoPjwvdHI+PC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwYXJhbWV0ZXIgb2Ygb3JkZXJlZFBhcmFtZXRlcnMoKVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgbXItMVwiICpuZ0lmPVwiY2FuRWRpdFwiIChjbGljayk9XCJlZGl0UGFyYW1ldGVyKHBhcmFtZXRlcilcIj5Ew7x6ZW5sZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG1yLTFcIiAqbmdJZj1cImNhbkNyZWF0ZVwiIChjbGljayk9XCJhZGRMaW1pdChwYXJhbWV0ZXIpXCI+KyBMaW1pdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtZGFuZ2VyXCIgKm5nSWY9XCJjYW5EZWxldGUgJiYgcGFyYW1ldGVyLmFjdGl2ZVwiIChjbGljayk9XCJkZWxldGVQYXJhbWV0ZXIocGFyYW1ldGVyKVwiPlNpbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJ1wiPnt7IHByb2Nlc3NOYW1lKHBhcmFtZXRlci5zdGVwQ29kZSkgfX08L3RkPjx0ZD57eyBwYXJhbWV0ZXIub3JkZXIgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD48Y29kZT57eyBwYXJhbWV0ZXIuY29kZSB9fTwvY29kZT48L3RkPjx0ZD57eyBwYXJhbWV0ZXIubmFtZSB9fTwvdGQ+PHRkPnt7IHBhcmFtZXRlci51bml0IHx8ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+e3sgcGFyYW1ldGVyLnZhbHVlVHlwZSB9fTxzcGFuICpuZ0lmPVwicGFyYW1ldGVyLmNhbGN1bGF0ZWRcIj4gLyBIZXNhcGxhbmFuPC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbGltaXQgb2YgbGltaXRzRm9yKHBhcmFtZXRlci5jb2RlKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gcC0wIGxpbWl0LWxpbmtcIiAoY2xpY2spPVwiZWRpdExpbWl0KGxpbWl0KVwiPnt7IGxpbWl0LmNvZGUgfX08L2J1dHRvbj46XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGltaXQub2lsVHlwZVwiPnt7IGxpbWl0Lm9pbFR5cGUgfX0gwrcgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxpbWl0Lm9yaWdpblwiPnt7IGxpbWl0Lm9yaWdpbiA9PT0gJ0ltcG9ydGVkJyA/ICfEsHRoYWwnIDogJ8Sww6cgUGl5YXNhJyB9fSDCtyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGltaXQubWluaW11bSAhPSBudWxsXCI+TWluIHt7IGxpbWl0Lm1pbmltdW0gfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxpbWl0Lm1heGltdW0gIT0gbnVsbFwiPk1heCB7eyBsaW1pdC5tYXhpbXVtIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsaW1pdC5ub21pbmFsICE9IG51bGxcIj5Ob21pbmFsIHt7IGxpbWl0Lm5vbWluYWwgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxpbWl0LmV4cGVjdGVkVGV4dFwiPnt7IGxpbWl0LmV4cGVjdGVkVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbGltaXQuYWN0aXZlXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+KHBhc2lmKTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPnt7IHBhcmFtZXRlci5hY3RpdmUgPyAnQWt0aWYnIDogJ1Bhc2lmJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48YWJwLW1vZGFsIFt2aXNpYmxlXT1cInBhcmFtZXRlck1vZGFsVmlzaWJsZVwiICh2aXNpYmxlQ2hhbmdlKT1cInBhcmFtZXRlck1vZGFsQ2hhbmdlZCgkZXZlbnQpXCJcclxuICBbYnVzeV09XCJidXN5XCIgW29wdGlvbnNdPVwiZWRpdG9yTW9kYWxPcHRpb25zXCIgW3N1cHByZXNzVW5zYXZlZENoYW5nZXNXYXJuaW5nXT1cInRydWVcIj5cclxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cclxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+e3sgbmV3UGFyYW1ldGVyID8gJ1llbmkgUGFyYW1ldHJlJyA6ICdQYXJhbWV0cmV5aSBEw7x6ZW5sZScgfX08L2g1PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxyXG4gICAgPGRpdiAqbmdJZj1cIm1vZGFsRXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPnt7IG1vZGFsRXJyb3IgfX08L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJidXN5XCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gdGV4dC1wcmltYXJ5IG1yLTJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgIDxzcGFuPnt7IGJ1c3lUZXh0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZmllbGRzZXQgKm5nSWY9XCJlZGl0aW5nUGFyYW1ldGVyIGFzIHBhcmFtZXRlclwiIFtkaXNhYmxlZF09XCJidXN5XCIgY2xhc3M9XCJib3JkZXItMCBwLTAgbS0wXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPktvZDwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuY29kZVwiIFtkaXNhYmxlZF09XCIhbmV3UGFyYW1ldGVyXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5BZCAvIFNvcnU8L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicGFyYW1ldGVyLm5hbWVcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCIgKm5nSWY9XCJjb250cm9sVHlwZSA9PT0gJ1Byb2Nlc3MnXCI+PGxhYmVsPlByb3NlcyBBZMSxbcSxPC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuc3RlcENvZGVcIj48b3B0aW9uICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzKClcIiBbdmFsdWVdPVwic3RlcC5wcm9jZXNzQ29kZVwiPnt7IHN0ZXAubmFtZSB9fTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPlPEsXJhPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIub3JkZXJcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkJpcmltPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci51bml0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5WZXJpIFRpcGk8L2xhYmVsPjxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci52YWx1ZVR5cGVcIj48b3B0aW9uIHZhbHVlPVwiTnVtYmVyXCI+U2F5xLFzYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiVGV4dFwiPk1ldGluPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIkNob2ljZVwiPlNlw6dpbTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk9uZGFsxLFrIEJhc2FtYWs8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicGFyYW1ldGVyLmRlY2ltYWxQbGFjZXNcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPlNlw6dlbmVrbGVyICh2aXJnw7xsbGUgYXlyxLFsbcSxxZ8pPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnNUZXh0XCIgW2Rpc2FibGVkXT1cInBhcmFtZXRlci52YWx1ZVR5cGUgIT09ICdDaG9pY2UnXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5IZXNhcGxhbWEgRm9ybcO8bMO8PC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci5mb3JtdWxhXCIgW2Rpc2FibGVkXT1cIiFwYXJhbWV0ZXIuY2FsY3VsYXRlZFwiIHBsYWNlaG9sZGVyPVwiUEFSQU1fS09EVSAqIDJcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci5yZXF1aXJlZFwiIC8+IFpvcnVubHU8L2xhYmVsPjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuY2FsY3VsYXRlZFwiIC8+IEhlc2FwbGFuYW48L2xhYmVsPjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuYWN0aXZlXCIgLz4gQWt0aWY8L2xhYmVsPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9maWVsZHNldD5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJjbG9zZVBhcmFtZXRlck1vZGFsKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPsSwcHRhbDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic2F2ZVBhcmFtZXRlcigpXCIgW2Rpc2FibGVkXT1cImJ1c3lcIj5LYXlkZXQ8L2J1dHRvbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2FicC1tb2RhbD5cclxuXHJcbjxhYnAtbW9kYWwgW3Zpc2libGVdPVwibGltaXRNb2RhbFZpc2libGVcIiAodmlzaWJsZUNoYW5nZSk9XCJsaW1pdE1vZGFsQ2hhbmdlZCgkZXZlbnQpXCJcclxuICBbYnVzeV09XCJidXN5XCIgW29wdGlvbnNdPVwiZWRpdG9yTW9kYWxPcHRpb25zXCIgW3N1cHByZXNzVW5zYXZlZENoYW5nZXNXYXJuaW5nXT1cInRydWVcIj5cclxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cclxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+e3sgbmV3TGltaXQgPyAnWWVuaSBMaW1pdCcgOiAnTGltaXRpIETDvHplbmxlJyB9fSDigJMge3sgZWRpdGluZ0xpbWl0Py5wYXJhbWV0ZXJDb2RlIH19PC9oNT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cclxuICAgIDxkaXYgKm5nSWY9XCJtb2RhbEVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57eyBtb2RhbEVycm9yIH19PC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiYnVzeVwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIHRleHQtcHJpbWFyeSBtci0yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICA8c3Bhbj57eyBidXN5VGV4dCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGZpZWxkc2V0ICpuZ0lmPVwiZWRpdGluZ0xpbWl0IGFzIGxpbWl0XCIgW2Rpc2FibGVkXT1cImJ1c3lcIiBjbGFzcz1cImJvcmRlci0wIHAtMCBtLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+S29kPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0LmNvZGVcIiBbZGlzYWJsZWRdPVwiIW5ld0xpbWl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5ZYcSfIENpbnNpIC8gS2/Fn3VsPC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJsaW1pdC5vaWxUeXBlXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPlTDvG3DvDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJQYWxtIE9pbFwiPlBhbG0gT2lsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIlBhbG0gT2xlaW5cIj5QYWxtIE9sZWluPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+TWVuxZ9laTwvbGFiZWw+PHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibGltaXQub3JpZ2luXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPlTDvG3DvDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJEb21lc3RpY1wiPsSww6cgUGl5YXNhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIkltcG9ydGVkXCI+xLB0aGFsPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+TWluPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJsaW1pdC5taW5pbXVtXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5NYXg8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0Lm1heGltdW1cIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk5vbWluYWw8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0Lm5vbWluYWxcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkJla2xlbmVuIE1ldGluPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0LmV4cGVjdGVkVGV4dFwiIC8+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+QmHFn2xhbmfEscOnPC9sYWJlbD48aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibGltaXQudmFsaWRGcm9tXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5CaXRpxZ88L2xhYmVsPjxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJsaW1pdC52YWxpZFVudGlsXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBkLWZsZXggYWxpZ24taXRlbXMtZW5kXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImxpbWl0LmFjdGl2ZVwiIC8+IEFrdGlmPC9sYWJlbD48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZmllbGRzZXQ+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFuZ2VyXCIgKm5nSWY9XCIhbmV3TGltaXQgJiYgY2FuRGVsZXRlXCJcclxuICAgICAgICAoY2xpY2spPVwiZGVsZXRlTGltaXQoZWRpdGluZ0xpbWl0ISlcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPlNpbDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJjbG9zZUxpbWl0TW9kYWwoKVwiIFtkaXNhYmxlZF09XCJidXN5XCI+xLBwdGFsPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlTGltaXQoKVwiIFtkaXNhYmxlZF09XCJidXN5XCI+S2F5ZGV0PC9idXR0b24+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9hYnAtbW9kYWw+XHJcbiJdfQ==
|