tango-app-ui-analyse-trax 4.0.38 → 4.0.40
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/esm2022/lib/components/audit-v2/gallery/audit-v2-gallery.component.mjs +312 -27
- package/esm2022/lib/components/gallery/gallery.component.mjs +3 -3
- package/esm2022/lib/services/trax.service.mjs +4 -1
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-Cq20YiqB.mjs +11666 -0
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-Cq20YiqB.mjs.map +1 -0
- package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-NmfU_bD9.mjs +33521 -0
- package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-NmfU_bD9.mjs.map +1 -0
- package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
- package/lib/components/audit-v2/gallery/audit-v2-gallery.component.d.ts +111 -3
- package/lib/services/trax.service.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
1
|
+
import { Component, HostListener } from '@angular/core';
|
|
2
2
|
import { Subject, debounceTime, forkJoin, of, takeUntil } from 'rxjs';
|
|
3
3
|
import { catchError, map } from 'rxjs/operators';
|
|
4
4
|
import { auditAccess } from '../audit-v2-access';
|
|
@@ -40,6 +40,8 @@ const APPROVE_FILTER = { 'All': 'all', 'Approved': 'Approved', 'Not-Approved': '
|
|
|
40
40
|
const IMAGE_TYPES = ['image', 'descriptiveImage', 'multipleImage'];
|
|
41
41
|
const VIDEO_TYPES = ['video'];
|
|
42
42
|
const VIDEO_FILE = /\.(mp4|webm|mov|ogg|m4v|avi|wmv)$/i;
|
|
43
|
+
/** Option questions: their reference images sit on each chosen userAnswer (v1 gallery). */
|
|
44
|
+
const CHOICE_TYPES = ['dropdown', 'yes/no', 'multiplechoicesingle', 'multiplechoicemultiple'];
|
|
43
45
|
/** Revisions are one configured option, so only single-choice answers can be edited (as the API enforces). */
|
|
44
46
|
const REVISABLE_TYPES = ['yes/no', 'multiplechoicesingle', 'dropdown'];
|
|
45
47
|
/** "Reason for change" choices, from the prototype's edit flow. */
|
|
@@ -105,6 +107,14 @@ export class AuditV2GalleryComponent {
|
|
|
105
107
|
/** Filter sources. */
|
|
106
108
|
audits = [];
|
|
107
109
|
storeOptions = [];
|
|
110
|
+
/**
|
|
111
|
+
* Stores with submissions of the chosen audit in the chosen dates (as the v1 gallery's storesDetails):
|
|
112
|
+
* the Stores filter offers only these. null = no audit chosen yet, or not loaded: every store.
|
|
113
|
+
*/
|
|
114
|
+
auditStoreIds = null;
|
|
115
|
+
auditStoresLoading = false;
|
|
116
|
+
/** Audit and dates auditStoreIds was loaded for. */
|
|
117
|
+
auditStoresKey = '';
|
|
108
118
|
clusterNames = [];
|
|
109
119
|
teamNames = [];
|
|
110
120
|
/** Submission shown on the right. */
|
|
@@ -318,9 +328,58 @@ export class AuditV2GalleryComponent {
|
|
|
318
328
|
this.fAuditId = '';
|
|
319
329
|
this.fName = '';
|
|
320
330
|
}
|
|
331
|
+
this.loadAuditStores();
|
|
321
332
|
this.loadStores(() => this.applyFilters());
|
|
322
333
|
});
|
|
323
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* Loads the stores the chosen audit has submissions at in the chosen dates (the drawer's audit and
|
|
337
|
+
* dates, before Apply). While the drawer is open, store picks that are not in the new list are dropped.
|
|
338
|
+
*/
|
|
339
|
+
loadAuditStores() {
|
|
340
|
+
const from = this.fStart;
|
|
341
|
+
const to = this.fEnd && this.fEnd >= this.fStart ? this.fEnd : this.fStart;
|
|
342
|
+
const key = [this.fAuditId, from, to].join('|');
|
|
343
|
+
if (key === this.auditStoresKey) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
this.auditStoresKey = key;
|
|
347
|
+
if (!this.fAuditId || !from || !this.clientId) {
|
|
348
|
+
this.auditStoreIds = null;
|
|
349
|
+
this.auditStoresLoading = false;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
this.auditStoresLoading = true;
|
|
353
|
+
this.traxService.auditGalleryStores({ clientId: this.clientId, checklistId: this.fAuditId, fromDate: from, toDate: to })
|
|
354
|
+
.pipe(takeUntil(this.destroy$), catchError(() => of(null)))
|
|
355
|
+
.subscribe((res) => {
|
|
356
|
+
if (key !== this.auditStoresKey) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
this.auditStoresLoading = false;
|
|
360
|
+
// A failed call keeps every store rather than an empty list.
|
|
361
|
+
this.auditStoreIds = res?.code === 200
|
|
362
|
+
? new Set((res.data?.stores || []).map((s) => String(s.storeId)))
|
|
363
|
+
: (res === null ? null : new Set());
|
|
364
|
+
if (this.filtersOpen && this.auditStoreIds) {
|
|
365
|
+
const ids = this.auditStoreIds;
|
|
366
|
+
this.fStores = this.fStores.filter(id => ids.has(id));
|
|
367
|
+
}
|
|
368
|
+
this.cd.detectChanges();
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/** Stores the Stores filter lists: the client's stores in scope, narrowed to the audit's stores once known. */
|
|
372
|
+
get filterStores() {
|
|
373
|
+
const ids = this.auditStoreIds;
|
|
374
|
+
return ids ? this.storeOptions.filter(s => ids.has(s.storeId)) : this.storeOptions;
|
|
375
|
+
}
|
|
376
|
+
/** Why the option pane is empty. */
|
|
377
|
+
get noOptionText() {
|
|
378
|
+
if (this.activeDef.id === 'stores' && !this.optionQuery.trim()) {
|
|
379
|
+
return this.auditStoresLoading ? 'Loading stores…' : 'No store has a submission of this audit in the selected dates.';
|
|
380
|
+
}
|
|
381
|
+
return 'No match for this search.';
|
|
382
|
+
}
|
|
324
383
|
/** Audits for the Name filter: the client's audits only (POST /trax/audit/list reads auditchecklist). */
|
|
325
384
|
fetchAudits() {
|
|
326
385
|
return this.traxService.auditList({
|
|
@@ -512,7 +571,9 @@ export class AuditV2GalleryComponent {
|
|
|
512
571
|
approvalEnable: !!info.approvalEnable,
|
|
513
572
|
approvalStatus: !!info.approvalStatus,
|
|
514
573
|
approvedBy: info.approvalByName || '',
|
|
515
|
-
approvedAt: info.approvalTime_string || ''
|
|
574
|
+
approvedAt: info.approvalTime_string || '',
|
|
575
|
+
acknowledgedBy: String(info.userSignature || '').trim(),
|
|
576
|
+
proofImage: this.mediaUrl(info.userImage, this.answerCdn)
|
|
516
577
|
};
|
|
517
578
|
this.cd.detectChanges();
|
|
518
579
|
}
|
|
@@ -521,7 +582,7 @@ export class AuditV2GalleryComponent {
|
|
|
521
582
|
submissionId: '', storeId: '', storeName: '—', region: '—', auditName: this.fName || '—',
|
|
522
583
|
subtitle: this.selectedAudit?.checkListDescription || '', questionCount: 0, questionFlag: 0, complianceEnabled: false, complianceScore: null,
|
|
523
584
|
submittedBy: '—', email: '', duration: '—', date: '—', dateIso: '', time: '—', status: '',
|
|
524
|
-
approvalEnable: false, approvalStatus: false, approvedBy: '', approvedAt: ''
|
|
585
|
+
approvalEnable: false, approvalStatus: false, approvedBy: '', approvedAt: '', acknowledgedBy: '', proofImage: ''
|
|
525
586
|
};
|
|
526
587
|
}
|
|
527
588
|
/**
|
|
@@ -552,19 +613,29 @@ export class AuditV2GalleryComponent {
|
|
|
552
613
|
const given = q.userAnswer || [];
|
|
553
614
|
const answers = [];
|
|
554
615
|
const media = [];
|
|
616
|
+
const proof = [];
|
|
555
617
|
const proofText = [];
|
|
618
|
+
const dateLabel = this.record?.checklistInfo?.date;
|
|
556
619
|
// Run AI keeps an annotated copy of a photo; it replaces the original, as in the checklist gallery.
|
|
557
|
-
const add = (path, video, aiPath, caption) => {
|
|
620
|
+
const add = (into, path, video, aiPath, caption, ai) => {
|
|
558
621
|
const src = !video && aiPath ? this.mediaUrl(aiPath, this.runAiCdn) : this.mediaUrl(path, this.answerCdn);
|
|
559
|
-
if (src) {
|
|
560
|
-
|
|
622
|
+
if (!src) {
|
|
623
|
+
return;
|
|
561
624
|
}
|
|
625
|
+
const status = this.detectionStatus(ai);
|
|
626
|
+
into.push({
|
|
627
|
+
src, video, caption: this.clean(caption), uploaded: this.uploadTime(path, dateLabel),
|
|
628
|
+
detection: status === null ? '' : status ? 'matched' : 'notmatched'
|
|
629
|
+
});
|
|
562
630
|
};
|
|
563
631
|
given.forEach((a) => {
|
|
564
632
|
const kind = q.answerType === 'image/video' ? (this.isVideoAnswer(a) ? 'video' : 'image') : q.answerType;
|
|
565
633
|
const captured = IMAGE_TYPES.includes(kind) || VIDEO_TYPES.includes(kind);
|
|
566
634
|
if (captured) {
|
|
567
|
-
|
|
635
|
+
// v1: each multipleImage tile has its own badge; single captures fall back to detectionStatus once AI ran.
|
|
636
|
+
const aiData = a.runAIData?.length ? a.runAIData
|
|
637
|
+
: (a.runAIAnswer && a.detectionStatus !== undefined ? [{ lableName: 'detectionStatus', value: a.detectionStatus }] : null);
|
|
638
|
+
add(media, a.answer, VIDEO_TYPES.includes(kind), a.runAIAnswer, a.description, aiData);
|
|
568
639
|
}
|
|
569
640
|
else if (a.answer !== undefined && a.answer !== null && a.answer !== '') {
|
|
570
641
|
answers.push(String(a.answer));
|
|
@@ -572,18 +643,33 @@ export class AuditV2GalleryComponent {
|
|
|
572
643
|
// Proof the chosen option asked for (answer validation): a photo, a video, text, or several photos.
|
|
573
644
|
if (a.validationAnswer) {
|
|
574
645
|
if (a.validationType === 'Capture Image') {
|
|
575
|
-
add(a.validationAnswer, false, captured ? '' : a.runAIAnswer);
|
|
646
|
+
add(proof, a.validationAnswer, false, captured ? '' : a.runAIAnswer, '', captured ? null : (a.runAIData || given[0]?.runAIData));
|
|
576
647
|
}
|
|
577
648
|
else if (a.validationType === 'Capture Video') {
|
|
578
|
-
add(a.validationAnswer, true);
|
|
649
|
+
add(proof, a.validationAnswer, true);
|
|
579
650
|
}
|
|
580
651
|
else {
|
|
581
652
|
proofText.push(String(a.validationAnswer));
|
|
582
653
|
}
|
|
583
654
|
}
|
|
584
|
-
(a.validationImage || []).forEach((p, i) => add(p, false, a.runAIData?.[i]?.answerImage));
|
|
585
|
-
(a.validationVideo || []).forEach((p) => add(p, true));
|
|
655
|
+
(a.validationImage || []).forEach((p, i) => add(proof, p, false, a.runAIData?.[i]?.answerImage, '', a.runAIData?.[i]?.results));
|
|
656
|
+
(a.validationVideo || []).forEach((p) => add(proof, p, true));
|
|
586
657
|
});
|
|
658
|
+
// Reference images, as the v1 gallery picks them: the question's own, then the chosen options' (choice
|
|
659
|
+
// types, on each userAnswer) or the capture's (image / video types, on the configured answers).
|
|
660
|
+
const questionRefs = this.refUrls(q.multiQuestionReferenceImage?.length ? q.multiQuestionReferenceImage : q.questionReferenceImage);
|
|
661
|
+
const refsOf = (list) => {
|
|
662
|
+
const out = [];
|
|
663
|
+
(list || []).forEach((x) => out.push(...this.refUrls(x?.multiReferenceImage?.length ? x.multiReferenceImage : x?.referenceImage)));
|
|
664
|
+
return out;
|
|
665
|
+
};
|
|
666
|
+
const optionRefs = CHOICE_TYPES.includes(q.answerType)
|
|
667
|
+
? refsOf(given)
|
|
668
|
+
: (IMAGE_TYPES.includes(q.answerType) || VIDEO_TYPES.includes(q.answerType) || q.answerType === 'image/video')
|
|
669
|
+
? refsOf(q.answers)
|
|
670
|
+
: [];
|
|
671
|
+
const linear = q.answers?.[0]?.linearType;
|
|
672
|
+
const unit = q.answerType === 'linearscale' ? (linear === 'percentage' ? '%' : linear === 'degree' ? '°C' : '') : '';
|
|
587
673
|
const scored = !!q.compliance;
|
|
588
674
|
const options = (q.answers || [])
|
|
589
675
|
.map((o) => ({ label: String(o?.answer ?? ''), score: scored ? (Number(o?.complianceScore) || 0) : null, flag: !!o?.sopFlag }))
|
|
@@ -614,11 +700,18 @@ export class AuditV2GalleryComponent {
|
|
|
614
700
|
qno: String(q.qno ?? ''),
|
|
615
701
|
text: this.clean(q.qname),
|
|
616
702
|
answerType: q.answerType || '',
|
|
703
|
+
description: this.visibleQdescription(q),
|
|
704
|
+
questionRefs,
|
|
705
|
+
optionRefs,
|
|
617
706
|
answers,
|
|
707
|
+
unit,
|
|
618
708
|
media,
|
|
619
|
-
|
|
620
|
-
|
|
709
|
+
proof,
|
|
710
|
+
images: [...media, ...proof].filter(m => !m.video).map(m => m.src),
|
|
711
|
+
videos: [...media, ...proof].filter(m => m.video).map(m => m.src),
|
|
621
712
|
validationText: proofText.join(', '),
|
|
713
|
+
validationTexts: proofText,
|
|
714
|
+
aiResults: this.aiResults(q),
|
|
622
715
|
remark: q.remarks || '',
|
|
623
716
|
extraRemark: q.storeManagerRemark || '',
|
|
624
717
|
actualScore,
|
|
@@ -638,6 +731,86 @@ export class AuditV2GalleryComponent {
|
|
|
638
731
|
}
|
|
639
732
|
return /^https?:\/\//i.test(p) ? p : cdn + p.replace(/^\/+/, '');
|
|
640
733
|
}
|
|
734
|
+
/** Reference image field as URLs: a key, a list of keys (tasks), or [{ imageURL }] (multi reference images). */
|
|
735
|
+
refUrls(value) {
|
|
736
|
+
const list = Array.isArray(value) ? value : [value];
|
|
737
|
+
return list
|
|
738
|
+
.map((v) => this.mediaUrl(typeof v === 'string' ? v : v?.imageURL, this.answerCdn))
|
|
739
|
+
.filter(Boolean);
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Run AI detectionStatus ('true' / 'false') at the top level of runAIData or inside an entry's results
|
|
743
|
+
* (v1 checkDetectionStatus); null when no detection was run.
|
|
744
|
+
*/
|
|
745
|
+
detectionStatus(runAIData) {
|
|
746
|
+
if (!Array.isArray(runAIData)) {
|
|
747
|
+
return null;
|
|
748
|
+
}
|
|
749
|
+
for (const entry of runAIData) {
|
|
750
|
+
const hit = entry?.lableName === 'detectionStatus' ? entry
|
|
751
|
+
: (entry?.results || []).find((r) => r?.lableName === 'detectionStatus');
|
|
752
|
+
if (hit) {
|
|
753
|
+
return String(hit.value).toLowerCase() === 'true';
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
return null;
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Upload time from the capture key (…/YYYY-MM-DD/…/HH:mm:ss/file) as "YYYY-MM-DD hh:mm AM", the v1 label; the
|
|
760
|
+
* submission date stands in for keys without a date segment, and keys without a time give ''.
|
|
761
|
+
*/
|
|
762
|
+
uploadTime(path, submissionDate) {
|
|
763
|
+
if (!path || typeof path !== 'string') {
|
|
764
|
+
return '';
|
|
765
|
+
}
|
|
766
|
+
const parts = path.split('/');
|
|
767
|
+
const clock = parts[parts.length - 2] || '';
|
|
768
|
+
if (!/^\d{1,2}:\d{2}:\d{2}$/.test(clock)) {
|
|
769
|
+
return '';
|
|
770
|
+
}
|
|
771
|
+
const [h, m] = clock.split(':');
|
|
772
|
+
const hour = parseInt(h, 10);
|
|
773
|
+
const time = `${String(hour % 12 || 12).padStart(2, '0')}:${m} ${hour >= 12 ? 'PM' : 'AM'}`;
|
|
774
|
+
const day = parts.find(p => /^\d{4}-\d{2}-\d{2}$/.test(p));
|
|
775
|
+
if (day) {
|
|
776
|
+
return `${day} ${time}`;
|
|
777
|
+
}
|
|
778
|
+
// checklistInfo.date is "DD MMM YYYY", which Date parses without the customParseFormat plugin.
|
|
779
|
+
const d = submissionDate ? dayjs(new Date(submissionDate)) : null;
|
|
780
|
+
return d && d.isValid() ? `${d.format('YYYY-MM-DD')} ${time}` : time;
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* Run AI result lines of the first answer, as the v1 gallery lists them: each labelled entry (or each entry's
|
|
784
|
+
* results) except detectionStatus, values padded to two digits; an image answer without AI data shows its
|
|
785
|
+
* Employee Count when it has one.
|
|
786
|
+
*/
|
|
787
|
+
aiResults(q) {
|
|
788
|
+
const first = q?.userAnswer?.[0];
|
|
789
|
+
const data = Array.isArray(first?.runAIData) ? first.runAIData : [];
|
|
790
|
+
const out = [];
|
|
791
|
+
const push = (e) => {
|
|
792
|
+
if (e?.lableName && e.lableName !== 'detectionStatus' && e.value !== undefined && e.value !== null) {
|
|
793
|
+
out.push({ label: String(e.lableName), value: String(e.value).padStart(2, '0') });
|
|
794
|
+
}
|
|
795
|
+
};
|
|
796
|
+
data.forEach((e) => e?.lableName ? push(e) : (e?.results || []).forEach(push));
|
|
797
|
+
if (!data.length && q?.answerType === 'image' && first?.employeeCount !== undefined && first?.employeeCount !== null) {
|
|
798
|
+
out.push({ label: 'Employee Count', value: String(first.employeeCount) });
|
|
799
|
+
}
|
|
800
|
+
return out;
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* qdescription, except the copy an old auto-task save left in it (an answer's autoTask.taskDescription), which
|
|
804
|
+
* the v1 gallery and the question builder do not show either.
|
|
805
|
+
*/
|
|
806
|
+
visibleQdescription(q) {
|
|
807
|
+
const text = String(q?.qdescription || '').trim();
|
|
808
|
+
if (!text) {
|
|
809
|
+
return '';
|
|
810
|
+
}
|
|
811
|
+
const taskCopy = (q?.answers || []).some((o) => o?.autoTask?.enabled && o.autoTask.taskDescription === q.qdescription);
|
|
812
|
+
return taskCopy ? '' : text;
|
|
813
|
+
}
|
|
641
814
|
/** Capture Image/Video answers: the entry's own type, else the file extension (checklist gallery rule). */
|
|
642
815
|
isVideoAnswer(a) {
|
|
643
816
|
if (a?.answerType === 'video' || a?.mediaType === 'video' || a?.type === 'video') {
|
|
@@ -689,6 +862,89 @@ export class AuditV2GalleryComponent {
|
|
|
689
862
|
get sections() {
|
|
690
863
|
return this.questionSections;
|
|
691
864
|
}
|
|
865
|
+
/** « / » hides the question panel so the answers take the full width (v1 sidenav toggle). */
|
|
866
|
+
navCollapsed = false;
|
|
867
|
+
toggleNav() {
|
|
868
|
+
this.navCollapsed = !this.navCollapsed;
|
|
869
|
+
}
|
|
870
|
+
/**
|
|
871
|
+
* "(earned/max)" compliance points of a section in the submission on the right, as the v1 gallery shows next to
|
|
872
|
+
* the section name; '' when the section scores nothing.
|
|
873
|
+
*/
|
|
874
|
+
sectionPoints(s) {
|
|
875
|
+
const found = (this.record?.questionAnswer || []).find((x) => x?.sectionName === s.name);
|
|
876
|
+
const max = Number(found?.answers_complianceScore) || 0;
|
|
877
|
+
return max ? `(${Number(found.userAnswer_complianceScore) || 0}/${max})` : '';
|
|
878
|
+
}
|
|
879
|
+
// ---------------------------------------------------------------------------
|
|
880
|
+
// Image viewer (v1 #imageModal: one image at a time, ‹ › through the set it was opened from)
|
|
881
|
+
// ---------------------------------------------------------------------------
|
|
882
|
+
viewer = null;
|
|
883
|
+
/** Option question (yes/no, dropdown, single / multiple choice). */
|
|
884
|
+
isChoice(q) {
|
|
885
|
+
return CHOICE_TYPES.includes(q.answerType);
|
|
886
|
+
}
|
|
887
|
+
/**
|
|
888
|
+
* The answer gets a right-hand column (v1 col-md-6): validation photos / videos, or an option question's reference
|
|
889
|
+
* image. A typed validation answer stays on the left under the answer.
|
|
890
|
+
*/
|
|
891
|
+
hasSide(q) {
|
|
892
|
+
return !!(q.proof.length || (this.isChoice(q) && q.optionRefs.length));
|
|
893
|
+
}
|
|
894
|
+
/** v1 block titles: "Uploaded Image", "Uploaded Video", or both kinds together. */
|
|
895
|
+
mediaTitle(list) {
|
|
896
|
+
const videos = list.filter(m => m.video).length;
|
|
897
|
+
return !videos ? 'Uploaded Image' : videos === list.length ? 'Uploaded Video' : 'Uploaded Image / Video';
|
|
898
|
+
}
|
|
899
|
+
/** v1 collage: one image full width, up to four in two columns, more in three; tall rows for one or two. */
|
|
900
|
+
gridClass(count) {
|
|
901
|
+
return count <= 1 ? 'is-one' : count === 2 ? 'is-two is-tall' : count <= 4 ? 'is-two' : 'is-three';
|
|
902
|
+
}
|
|
903
|
+
openViewer(items, index, title) {
|
|
904
|
+
if (!items.length) {
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
this.viewer = { items, index: Math.min(Math.max(index, 0), items.length - 1), title };
|
|
908
|
+
this.setPageScrollLocked(true);
|
|
909
|
+
}
|
|
910
|
+
/** Opens the viewer on one capture tile: the image tiles of that group, at the clicked one. */
|
|
911
|
+
openMediaViewer(list, m, title) {
|
|
912
|
+
const images = list.filter(x => !x.video && !this.brokenMedia.has(x.src)).map(x => x.src);
|
|
913
|
+
this.openViewer(images, images.indexOf(m.src), title);
|
|
914
|
+
}
|
|
915
|
+
closeViewer() {
|
|
916
|
+
this.viewer = null;
|
|
917
|
+
this.setPageScrollLocked(this.filtersOpen);
|
|
918
|
+
}
|
|
919
|
+
stepViewer(delta) {
|
|
920
|
+
if (!this.viewer) {
|
|
921
|
+
return;
|
|
922
|
+
}
|
|
923
|
+
const index = this.viewer.index + delta;
|
|
924
|
+
if (index >= 0 && index < this.viewer.items.length) {
|
|
925
|
+
this.viewer = { ...this.viewer, index };
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
onViewerKey(event) {
|
|
929
|
+
if (this.proofOpen && event.key === 'Escape') {
|
|
930
|
+
this.proofOpen = false;
|
|
931
|
+
return;
|
|
932
|
+
}
|
|
933
|
+
if (!this.viewer) {
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
if (event.key === 'Escape') {
|
|
937
|
+
this.closeViewer();
|
|
938
|
+
}
|
|
939
|
+
else if (event.key === 'ArrowLeft') {
|
|
940
|
+
this.stepViewer(-1);
|
|
941
|
+
}
|
|
942
|
+
else if (event.key === 'ArrowRight') {
|
|
943
|
+
this.stepViewer(1);
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
/** "View Proof" next to Acknowledged By: the name and the photo captured at submit (v1 Verification Details). */
|
|
947
|
+
proofOpen = false;
|
|
692
948
|
toggleSection(i) {
|
|
693
949
|
this.openSection = this.openSection === i ? null : i;
|
|
694
950
|
}
|
|
@@ -727,7 +983,8 @@ export class AuditV2GalleryComponent {
|
|
|
727
983
|
// ---------------------------------------------------------------------------
|
|
728
984
|
/** Every filter category, in the order the drawer lists them. */
|
|
729
985
|
get filterDefs() {
|
|
730
|
-
const
|
|
986
|
+
const stores = this.filterStores;
|
|
987
|
+
const storeIds = stores.map(s => s.storeId);
|
|
731
988
|
const groups = this.fScope === 'Clusters' ? this.clusterNames : this.teamNames;
|
|
732
989
|
const defs = [
|
|
733
990
|
{
|
|
@@ -736,13 +993,14 @@ export class AuditV2GalleryComponent {
|
|
|
736
993
|
options: [{ label: 'Audit', meta: 'Submitted audits' }]
|
|
737
994
|
},
|
|
738
995
|
{
|
|
739
|
-
id: 'stores', label: 'Stores', hint: 'Select all stores, or pick them individually.',
|
|
996
|
+
id: 'stores', label: 'Stores', hint: 'Select all stores, or pick them individually. Search several store names separated by commas.',
|
|
740
997
|
multi: true, kind: 'list', group: 'primary', searchable: true,
|
|
741
998
|
// User-coverage audits are scoped by team users, not stores.
|
|
742
999
|
hide: this.fScope === 'Teams',
|
|
743
1000
|
options: [
|
|
744
|
-
{ label: 'All stores', meta: 'Select every store in scope', allOf: storeIds },
|
|
745
|
-
|
|
1001
|
+
...(storeIds.length ? [{ label: 'All stores', meta: this.auditStoreIds ? 'Every store with a submission of this audit' : 'Select every store in scope', allOf: storeIds }] : []),
|
|
1002
|
+
// Store name only: the store id is never shown.
|
|
1003
|
+
...stores.map(s => ({ label: s.storeName || s.storeId, value: s.storeId }))
|
|
746
1004
|
]
|
|
747
1005
|
},
|
|
748
1006
|
{
|
|
@@ -822,13 +1080,30 @@ export class AuditV2GalleryComponent {
|
|
|
822
1080
|
get activeDef() {
|
|
823
1081
|
return this.filterDefs.find(f => f.id === this.activeFilter) || this.filterDefs[0];
|
|
824
1082
|
}
|
|
825
|
-
/**
|
|
1083
|
+
/**
|
|
1084
|
+
* Options in the active category, narrowed by the pane search box. Stores search by name as in
|
|
1085
|
+
* the v1 gallery: "a, b, c" lists the stores named exactly a, b and c; one term lists the names
|
|
1086
|
+
* containing it. While a store search is on, "All stores" becomes "All matching stores" and
|
|
1087
|
+
* picks just the stores listed.
|
|
1088
|
+
*/
|
|
826
1089
|
get activeOptions() {
|
|
1090
|
+
const def = this.activeDef;
|
|
827
1091
|
const q = this.optionQuery.trim().toLowerCase();
|
|
828
1092
|
if (!q) {
|
|
829
|
-
return
|
|
1093
|
+
return def.options;
|
|
1094
|
+
}
|
|
1095
|
+
if (def.id === 'stores') {
|
|
1096
|
+
const terms = q.split(',').map(t => t.trim()).filter(Boolean);
|
|
1097
|
+
const hit = (name) => {
|
|
1098
|
+
const n = name.trim().toLowerCase();
|
|
1099
|
+
return q.includes(',') ? terms.includes(n) : n.includes(q);
|
|
1100
|
+
};
|
|
1101
|
+
const stores = def.options.filter(o => !o.allOf && hit(o.label));
|
|
1102
|
+
return stores.length
|
|
1103
|
+
? [{ label: 'All matching stores', meta: stores.length + (stores.length === 1 ? ' store' : ' stores'), allOf: stores.map(o => this.valueOf(o)) }, ...stores]
|
|
1104
|
+
: [];
|
|
830
1105
|
}
|
|
831
|
-
return
|
|
1106
|
+
return def.options.filter(o => (o.label + ' ' + (o.meta || '')).toLowerCase().includes(q));
|
|
832
1107
|
}
|
|
833
1108
|
get noOptionMatch() {
|
|
834
1109
|
return this.activeDef.kind === 'list' && !this.activeOptions.length;
|
|
@@ -927,6 +1202,7 @@ export class AuditV2GalleryComponent {
|
|
|
927
1202
|
}
|
|
928
1203
|
this.fStart = picked.from;
|
|
929
1204
|
this.fEnd = picked.to;
|
|
1205
|
+
this.loadAuditStores();
|
|
930
1206
|
}
|
|
931
1207
|
applyFilters() {
|
|
932
1208
|
this.snapshot = null;
|
|
@@ -949,6 +1225,7 @@ export class AuditV2GalleryComponent {
|
|
|
949
1225
|
if (this.fScope === 'Clusters' && clustersBefore !== this.fClusters.join('|')) {
|
|
950
1226
|
this.loadStores();
|
|
951
1227
|
}
|
|
1228
|
+
this.loadAuditStores();
|
|
952
1229
|
}
|
|
953
1230
|
clearFilters() {
|
|
954
1231
|
this.fStart = this.headerStart;
|
|
@@ -966,6 +1243,7 @@ export class AuditV2GalleryComponent {
|
|
|
966
1243
|
if (this.fScope === 'Clusters') {
|
|
967
1244
|
this.loadStores();
|
|
968
1245
|
}
|
|
1246
|
+
this.loadAuditStores();
|
|
969
1247
|
}
|
|
970
1248
|
capture() {
|
|
971
1249
|
return {
|
|
@@ -998,7 +1276,8 @@ export class AuditV2GalleryComponent {
|
|
|
998
1276
|
isSelected(opt) {
|
|
999
1277
|
const id = this.activeDef.id;
|
|
1000
1278
|
if (opt.allOf) {
|
|
1001
|
-
|
|
1279
|
+
const list = this.listFor(id);
|
|
1280
|
+
return !!opt.allOf.length && opt.allOf.every(v => list.includes(v));
|
|
1002
1281
|
}
|
|
1003
1282
|
switch (id) {
|
|
1004
1283
|
case 'type': return this.fType === opt.label;
|
|
@@ -1026,8 +1305,10 @@ export class AuditV2GalleryComponent {
|
|
|
1026
1305
|
pick(opt) {
|
|
1027
1306
|
const id = this.activeDef.id;
|
|
1028
1307
|
if (opt.allOf) {
|
|
1308
|
+
// Adds or removes just the values it stands for (every one, or the stores a search lists).
|
|
1029
1309
|
const all = opt.allOf;
|
|
1030
|
-
const
|
|
1310
|
+
const list = this.listFor(id);
|
|
1311
|
+
const chosen = all.every(v => list.includes(v)) ? list.filter(v => !all.includes(v)) : [...new Set([...list, ...all])];
|
|
1031
1312
|
if (id === 'cluster') {
|
|
1032
1313
|
this.fClusters = chosen;
|
|
1033
1314
|
if (this.fScope === 'Clusters') {
|
|
@@ -1051,6 +1332,7 @@ export class AuditV2GalleryComponent {
|
|
|
1051
1332
|
if (this.fScope !== scopeBefore && this.fScope === 'Clusters') {
|
|
1052
1333
|
this.loadStores();
|
|
1053
1334
|
}
|
|
1335
|
+
this.loadAuditStores();
|
|
1054
1336
|
}
|
|
1055
1337
|
break;
|
|
1056
1338
|
}
|
|
@@ -1473,7 +1755,7 @@ export class AuditV2GalleryComponent {
|
|
|
1473
1755
|
const score = this.num(info.complianceScore) ?? this.flagScore(count, flags);
|
|
1474
1756
|
// No question with compliance scoring: no score and no result (blank cells), as on the page.
|
|
1475
1757
|
const scored = this.complianceOn(record);
|
|
1476
|
-
const base = { 'Store
|
|
1758
|
+
const base = { 'Store Name': store.storeName || store.store_id || '', 'Date': info.date || '' };
|
|
1477
1759
|
summary.push({
|
|
1478
1760
|
...base,
|
|
1479
1761
|
'Location': [store.city, store.state, store.Country].filter(Boolean).join(', '),
|
|
@@ -1524,10 +1806,13 @@ export class AuditV2GalleryComponent {
|
|
|
1524
1806
|
return o.label;
|
|
1525
1807
|
}
|
|
1526
1808
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2GalleryComponent, deps: [{ token: i1.TraxService }, { token: i2.GlobalStateService }, { token: i0.ChangeDetectorRef }, { token: i3.ActivatedRoute }, { token: i4.ToastService }, { token: i4.AuthService }, { token: i5.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
1527
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2GalleryComponent, selector: "lib-audit-v2-gallery", ngImport: i0, template: "<div class=\"av2-page audit-gallery\">\r\n\r\n <!-- Header bar with quick selects -->\r\n <section class=\"gal-header\">\r\n <div class=\"gal-heading\">\r\n <div class=\"gal-header-title\">Gallery</div>\r\n <div class=\"gal-header-sub\">\r\n <ng-container *ngIf=\"total\">{{ total }} {{ total === 1 ? 'submission' : 'submissions' }} \u00B7 </ng-container>{{ rangeLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <!-- Chevrons are SVGs, not text glyphs, so they sit on the chip's centre line. -->\r\n <button type=\"button\" class=\"quickchip chip-on\" (click)=\"openFilters('type')\">\r\n {{ fType }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--name\" (click)=\"openFilters('name')\" [title]=\"fName\">\r\n <span class=\"quickchip-label\">{{ fName || 'Select audit' }}</span>\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip chip-on\" *ngIf=\"datePicked\" (click)=\"openFilters('date')\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"6\"></line>\r\n </svg>\r\n {{ rangeLabel }}\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip\" (click)=\"openScopeFilter()\">\r\n {{ storeSummary }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--strong\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n All Filters\r\n <span class=\"countbadge\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n </button>\r\n\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm av2-btn--wide\" (click)=\"applyFilters()\">\r\n Apply\r\n </button>\r\n </section>\r\n\r\n <div class=\"gal-body\">\r\n\r\n <!-- Question navigation -->\r\n <!-- The white column runs the full height of the right card; its content stays in view while scrolling. -->\r\n <aside class=\"gal-left\">\r\n <div class=\"gal-left-inner\">\r\n <div class=\"gal-left-head\">\r\n <span class=\"av2-sk av2-sk--title\" *ngIf=\"navLoading && !fName\"></span>\r\n <div class=\"gal-audit-name\" *ngIf=\"!navLoading || fName\">{{ fName || 'No audit selected' }}</div>\r\n <div class=\"gal-audit-sub\" *ngIf=\"detail.subtitle\">{{ detail.subtitle }}</div>\r\n </div>\r\n\r\n <!-- No submission for the filters (e.g. the last one was just approved under \"Not Approved\"):\r\n nothing to navigate, so the question list goes with it. -->\r\n <div class=\"gal-nav-empty\" *ngIf=\"!loading && !hasSubmission\">No submissions for the selected filters.</div>\r\n\r\n <ng-container *ngIf=\"loading || hasSubmission\">\r\n <!-- Clears any question selection. -->\r\n <div class=\"view-all\" [class.is-active]=\"!hasSelection\">\r\n <button type=\"button\" class=\"view-all-link\" (click)=\"viewAllAnswers()\">View All Answers</button>\r\n </div>\r\n\r\n <!-- Section accordion: one open at a time. -->\r\n <div class=\"gal-sections\">\r\n <lib-audit-v2-shimmer *ngIf=\"navLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!navLoading\">\r\n <ng-container *ngFor=\"let s of sections; let i = index; trackBy: trackBySection\">\r\n <button type=\"button\" class=\"gal-section\" [class.is-open]=\"openSection === i\" (click)=\"toggleSection(i)\">\r\n <span class=\"gal-section-name\">{{ s.name }}</span>\r\n <!-- Ticks stay when a section is collapsed; the count shows they are still narrowing the answers. -->\r\n <span class=\"gal-section-count\" *ngIf=\"sectionPicked(s) as n\" [attr.title]=\"n + ' selected in this section'\">{{ n }}</span>\r\n <span class=\"gal-section-rule\"></span>\r\n <span class=\"gal-section-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"openSection !== i\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <ng-container *ngIf=\"openSection === i\">\r\n <button type=\"button\" class=\"gal-nav-item\" *ngFor=\"let q of s.questions; trackBy: trackById\"\r\n [class.is-picked]=\"isQuestionSelected(q)\" (click)=\"toggleQuestion(q)\">\r\n <span class=\"gal-check\" [class.is-on]=\"isQuestionSelected(q)\">\r\n <svg *ngIf=\"isQuestionSelected(q)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"gal-nav-text\">{{ q.qno }} . {{ q.text }}</span>\r\n <span class=\"gal-dot gal-dot--flag\" *ngIf=\"isFlagged(q)\" title=\"Flagged\"></span>\r\n <span class=\"gal-dot gal-dot--revised\" *ngIf=\"isRevised(q)\" title=\"Revised\"></span>\r\n </button>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!s.questions.length\">No questions in this section</div>\r\n </ng-container>\r\n </ng-container>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!sections.length\">No questions for the selected filters</div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </aside>\r\n\r\n <section class=\"gal-main\">\r\n <!-- Pager + export -->\r\n <div class=\"gal-toolbar\">\r\n <div class=\"gal-pager\" *ngIf=\"total\">\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canPrev\" (click)=\"prevPage()\" title=\"Previous submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"15 18 9 12 15 6\"></polyline>\r\n </svg>\r\n </button>\r\n <span class=\"gal-pager-label\">Submission <strong>{{ pageLabel }}</strong></span>\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canNext\" (click)=\"nextPage()\" title=\"Next submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n <span class=\"status-pill status-pill--warning\" *ngIf=\"!loading && hasSubmission && detail.status !== 'submit'\">Re-do requested</span>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <div class=\"export-wrap\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm gal-export\" [disabled]=\"exporting || !total\"\r\n (click)=\"toggleExport()\" [attr.aria-expanded]=\"exportOpen\">\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n <div class=\"export-menu\" *ngIf=\"exportOpen\" role=\"menu\">\r\n <!-- Excel: built here, downloads right away (hidden for now, see showExcelExport) -->\r\n <ng-container *ngIf=\"showExcelExport\">\r\n <div class=\"export-group\">Excel (.xlsx) \u00B7 downloads now</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" [disabled]=\"!hasSubmission\" (click)=\"exportCurrent()\">\r\n <span class=\"export-title\">This submission</span>\r\n <span class=\"export-meta\">{{ detail.storeName }} \u00B7 {{ detail.date }}</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportAll()\">\r\n <span class=\"export-title\">All {{ total }} {{ total === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"export-meta\">Current filters \u00B7 summary + every answer</span>\r\n </button>\r\n </ng-container>\r\n <!-- CSV / PDF / PPT / ZIP: the v1 gallery's download service -->\r\n <div class=\"export-group\">Report files \u00B7 Notifications \u203A Downloads</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('csv')\">\r\n <span class=\"export-title\">Export as CSV</span>\r\n <span class=\"export-meta\">Current filters</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('pdf')\">\r\n <span class=\"export-title\">Export as PDF</span>\r\n <span class=\"export-meta\">One report per submission</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('ppt')\">\r\n <span class=\"export-title\">Export as PPT</span>\r\n <span class=\"export-meta\">Tick up to 3 questions on the left</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('zipfiles')\">\r\n <span class=\"export-title\">Export as ZIP</span>\r\n <span class=\"export-meta\">Photos and videos</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading -->\r\n <div class=\"gal-skeleton\" *ngIf=\"loading\" aria-busy=\"true\" aria-label=\"Loading submission\">\r\n <div class=\"sk sk-logo\"></div>\r\n <div class=\"sk sk-facts\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card sk-card--short\"></div>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && loadError\">\r\n <span class=\"gal-state-icon gal-state-icon--error\">\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12.5\"></line>\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\r\n </svg>\r\n </span>\r\n <div class=\"gal-state-title\">{{ loadError }}</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"retry()\">Retry</button>\r\n </div>\r\n\r\n <!-- Nothing submitted -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && !loadError && !hasSubmission\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"gal-state-title\">{{ fName ? 'No submissions found' : (linkMissing ? 'Audit not found' : 'No audits to show') }}</div>\r\n <div class=\"gal-state-sub\" *ngIf=\"fName\">\r\n Nothing was submitted for <strong>{{ fName }}</strong> between {{ rangeLabel }} with the current filters.\r\n Try a wider date range or another store.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && linkMissing\">\r\n The audit you opened was deleted or is not an audit. Pick an audit in the filters to see its submissions.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && !linkMissing\">Create an audit in Manage to see its submissions here.</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"fName || (linkMissing && audits.length)\"\r\n (click)=\"openFilters(fName ? 'date' : 'name')\">{{ fName ? 'Change filters' : 'Pick an audit' }}</button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!loading && hasSubmission\">\r\n <!-- Client brand -->\r\n <div class=\"gal-brand\">\r\n <span class=\"gal-brand-box\" [class.has-logo]=\"clientLogo && !logoFailed\">\r\n <img *ngIf=\"clientLogo && !logoFailed\" [src]=\"clientLogo\" [alt]=\"clientName || 'Client logo'\" (error)=\"logoFailed = true\">\r\n <ng-container *ngIf=\"!clientLogo || logoFailed\">{{ clientName || 'Logo' }}</ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Who / where / when, read row by row across the two columns -->\r\n <dl class=\"gal-facts\">\r\n <div class=\"gal-fact\"><dt>Store Name:</dt><dd>{{ detail.storeName }}<span class=\"gal-fact-sub\" *ngIf=\"detail.storeId && detail.storeId !== detail.storeName\">{{ detail.storeId }}</span></dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Duration:</dt><dd>{{ detail.duration }}</dd></div>\r\n <div class=\"gal-fact\"><dt>Audit Name:</dt><dd>{{ detail.auditName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Date:</dt><dd>{{ detail.date }}</dd></div>\r\n <div class=\"gal-fact\"><dt>State & Country:</dt><dd>{{ detail.region }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Time:</dt><dd>{{ detail.time }}</dd></div>\r\n <div class=\"gal-fact\"><dt>No. of Questions:</dt><dd>{{ detail.questionCount }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\">\r\n <dt>Compliance Score:</dt>\r\n <dd *ngIf=\"detail.complianceEnabled\" [title]=\"'Pass mark ' + passThreshold + '%'\">{{ compliancePercent }}% <span class=\"gal-result\" [class.is-fail]=\"!passed\">({{ resultLabel }})</span></dd>\r\n <!-- No question of this audit has compliance scoring on: no score (the flag-based rule would read 100%). -->\r\n <dd *ngIf=\"!detail.complianceEnabled\" title=\"Compliance score is not enabled for this audit\">\u2014</dd>\r\n </div>\r\n <div class=\"gal-fact\"><dt>Submitted By:</dt><dd>{{ detail.submittedBy }}</dd></div>\r\n </dl>\r\n\r\n <!-- Answers -->\r\n <div class=\"gal-answers\" id=\"view-all\">\r\n <article class=\"answerbox\" *ngFor=\"let q of visibleQuestions; let i = index; trackBy: trackById\"\r\n [class.is-flagged]=\"q.flagged\" [class.is-editing]=\"isEditing(q)\"\r\n [style.animation-delay.ms]=\"i < 10 ? i * 35 : 0\">\r\n <header class=\"answerbox-head\">\r\n <div class=\"qtext\">\r\n <span class=\"qsection\" *ngIf=\"sections.length > 1\">{{ q.section }}</span>\r\n {{ q.qno }}.{{ q.text }}\r\n </div>\r\n <span class=\"gal-tag gal-tag--warning\" *ngIf=\"q.revised\">Revised</span>\r\n <span class=\"gal-tag gal-tag--error\" *ngIf=\"q.flagged\">\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 21V4h11l-1.5 4L15 12H4\"></path></svg>\r\n Flagged\r\n </span>\r\n <span class=\"gal-tag gal-tag--gray\" *ngIf=\"q.redo\">Re-do</span>\r\n <span class=\"scorechip\" *ngIf=\"q.score !== null && !q.revised\">Score:{{ q.score }}</span>\r\n <button type=\"button\" class=\"editicon\" *ngIf=\"q.editable && !isEditing(q)\"\r\n [class.is-locked]=\"!!editBlockedReason\" [attr.aria-disabled]=\"!!editBlockedReason\"\r\n [ngbTooltip]=\"editBlockedReason || 'Edit answer'\" tooltipClass=\"av2-tip\" placement=\"top-end\" container=\"body\"\r\n [attr.aria-label]=\"editBlockedReason || 'Edit answer'\" (click)=\"startEdit(q)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 20h9\"></path>\r\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"></path>\r\n </svg>\r\n </button>\r\n </header>\r\n\r\n <!-- As submitted -->\r\n <div class=\"answerbox-body\" *ngIf=\"!q.revised && !isEditing(q)\">\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n\r\n <!-- Actual vs revised -->\r\n <div class=\"revision\" *ngIf=\"q.revised && !isEditing(q)\">\r\n <div class=\"rev-block\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label\">Actual submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.actualScore !== null\">Score:{{ q.actualScore }}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n <div class=\"rev-block rev-block--revised\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label rev-label--warning\">Revised submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.revised.score !== null\">Score:{{ q.revised.score }}</span>\r\n </div>\r\n <div class=\"answertext answertext--strong\">{{ q.revised.answer || '\u2014' }}</div>\r\n <div class=\"rev-reason-label\">Reason for Change:<span *ngIf=\"q.revised.by\"> \u00B7 {{ q.revised.by }}</span></div>\r\n <div class=\"rev-reason\">{{ q.revised.reason || '\u2014' }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit -->\r\n <div class=\"editpanel\" *ngIf=\"isEditing(q)\">\r\n <div class=\"edit-title\">Select the revised answer</div>\r\n <div class=\"edit-options\" role=\"radiogroup\" [attr.aria-label]=\"'Answer for question ' + q.qno\">\r\n <button type=\"button\" role=\"radio\" class=\"edit-option\" *ngFor=\"let opt of q.options; trackBy: trackByLabel\"\r\n [class.is-on]=\"isDraft(opt)\" [attr.aria-checked]=\"isDraft(opt)\" (click)=\"pickDraft(opt)\">\r\n <span class=\"edit-radio\">\r\n <svg *ngIf=\"isDraft(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"edit-option-label\">{{ opt.label }}</span>\r\n <span class=\"edit-option-flag\" *ngIf=\"opt.flag\">Flags</span>\r\n <span class=\"edit-option-score\" *ngIf=\"opt.score !== null\">Score {{ opt.score }}</span>\r\n <span class=\"edit-option-actual\" *ngIf=\"isActualOption(q, opt)\">Actual answer</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"edit-reason\" *ngIf=\"draftChanged(q)\">\r\n <div class=\"edit-title\">Reason for change <span class=\"req\">*</span></div>\r\n <lib-audit-v2-select class=\"edit-select\" [(ngModel)]=\"draftReason\" [options]=\"reasonOptions\"\r\n placeholder=\"Select a reason\" ariaLabel=\"Reason for change\"></lib-audit-v2-select>\r\n <input *ngIf=\"draftReason === 'Other'\" type=\"text\" class=\"edit-input\" maxlength=\"300\"\r\n placeholder=\"Enter the reason for change\" [(ngModel)]=\"draftOther\">\r\n </div>\r\n <div class=\"edit-hint\" *ngIf=\"!draftChanged(q) && q.revised\">\r\n Saving keeps the store's actual answer and removes the revision.\r\n </div>\r\n\r\n <div class=\"edit-actions\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"!canSave(q)\" (click)=\"saveEdit(q)\">\r\n {{ saving ? 'Saving\u2026' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </article>\r\n\r\n <div class=\"gal-nomatch\" *ngIf=\"!visibleQuestions.length\">\r\n No answers match the question selection. <button type=\"button\" class=\"av2-link\" (click)=\"viewAllAnswers()\">View all answers</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n <!-- Approve bar -->\r\n <div class=\"gal-approve-bar\" *ngIf=\"hasSubmission && !loading\">\r\n <div class=\"approve-status\">\r\n <ng-container *ngIf=\"detail.approvalStatus\">\r\n <span class=\"approve-dot approve-dot--success\"></span>\r\n Approved<ng-container *ngIf=\"detail.approvedBy\"> by <strong>{{ detail.approvedBy }}</strong></ng-container><ng-container *ngIf=\"detail.approvedAt\"> \u00B7 {{ detail.approvedAt }}</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalStatus && detail.approvalEnable\">\r\n <span class=\"approve-dot approve-dot--warning\"></span>\r\n Waiting for approval<ng-container *ngIf=\"revisedCount\"> \u00B7 {{ revisedCount }} {{ revisedCount === 1 ? 'answer' : 'answers' }} revised</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalEnable\">\r\n <span class=\"approve-dot\"></span>\r\n No approval step is set for this audit\r\n </ng-container>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <ng-container *ngIf=\"detail.approvalEnable && !detail.approvalStatus && menuAccess.canEdit\">\r\n <button type=\"button\" class=\"av2-btn gal-approve\" *ngIf=\"!approveConfirm\" (click)=\"requestApprove()\">Approve</button>\r\n <ng-container *ngIf=\"approveConfirm\">\r\n <span class=\"approve-warn\">Approval records the final score and locks further edits.</span>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelApprove()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn gal-approve gal-approve--confirm\" [disabled]=\"approving\" (click)=\"confirmApprove()\">\r\n {{ approving ? 'Approving\u2026' : 'Confirm approval' }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- What the store submitted: answer, proof, captures and remarks. Shared by the plain and the revised views. -->\r\n <ng-template #submitted let-q>\r\n <div class=\"answertext\" *ngIf=\"actualAnswer(q)\">{{ actualAnswer(q) }}</div>\r\n <div class=\"answertext\" *ngIf=\"!actualAnswer(q) && !q.media.length && !q.validationText\">\u2014</div>\r\n <div class=\"prooftext\" *ngIf=\"q.validationText\">Validation Answer: {{ q.validationText }}</div>\r\n <div class=\"gal-media\" *ngIf=\"q.media.length\">\r\n <figure class=\"gal-media-item\" *ngFor=\"let m of q.media; let mi = index\">\r\n <ng-container *ngIf=\"!brokenMedia.has(m.src); else mediaMissing\">\r\n <a *ngIf=\"!m.video\" [href]=\"m.src\" target=\"_blank\" rel=\"noopener\" class=\"gal-media-thumb\" title=\"Open image\">\r\n <img [src]=\"m.src\" [alt]=\"'Answer image ' + (mi + 1)\" loading=\"lazy\" (error)=\"onMediaError(m.src)\">\r\n </a>\r\n <video *ngIf=\"m.video\" [src]=\"m.src\" controls preload=\"metadata\" class=\"gal-media-thumb\" (error)=\"onMediaError(m.src)\"></video>\r\n </ng-container>\r\n <ng-template #mediaMissing>\r\n <a [href]=\"m.src\" target=\"_blank\" rel=\"noopener\" class=\"gal-media-thumb gal-media-thumb--missing\"\r\n [title]=\"(m.video ? 'Video' : 'Image') + ' could not be loaded - open the file'\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <circle cx=\"9\" cy=\"10\" r=\"1.6\"></circle>\r\n <path d=\"M21 16l-5-5-9 9\"></path>\r\n </svg>\r\n <span>Not available</span>\r\n </a>\r\n </ng-template>\r\n <figcaption *ngIf=\"m.caption\">Image {{ mi + 1 }} : {{ m.caption }}</figcaption>\r\n </figure>\r\n </div>\r\n <div class=\"remarktext\" *ngIf=\"q.remark\">{{ labels.remarks }}: {{ q.remark }}</div>\r\n <div class=\"remarktext\" *ngIf=\"q.extraRemark\">{{ labels.additional }}: {{ q.extraRemark }}</div>\r\n </ng-template>\r\n\r\n <!-- Closes the export menu on an outside click -->\r\n <div class=\"menu-backdrop\" *ngIf=\"exportOpen\" (click)=\"exportOpen = false\"></div>\r\n\r\n <!-- Filter drawer -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"countpill\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <!-- Categories -->\r\n <div class=\"drawer-nav\">\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Primary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of primaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Secondary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of secondaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"drawer-pane\">\r\n <div class=\"pane-head\">\r\n <div class=\"panetitle\">{{ activeDef.label }}</div>\r\n <div class=\"panehint\">{{ activeDef.hint }}</div>\r\n </div>\r\n\r\n <!-- Date range -->\r\n <div class=\"pane-scroll pane-fields pane-fields--date\" *ngIf=\"activeDef.kind === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Selected</span>\r\n <span class=\"gal-range-readout\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n {{ rangeLabel }}\r\n </span>\r\n </div>\r\n <!-- Inline calendars: a dropdown inside this scrolling pane opened off to the side and scrolled sideways.\r\n Keyed on fRange so Clear all / reopening rebuilds it on the restored range. -->\r\n <div class=\"av2-datepick av2-datepick--compact gal-inline-picker\" *ngFor=\"let r of [fRange]\">\r\n <ngx-daterangepicker-material *ngIf=\"r\" [startDate]=\"r.startDate\" [endDate]=\"r.endDate\"\r\n [locale]=\"pickerLocale\" [maxDate]=\"today\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\"\r\n [showCancel]=\"false\" (datesUpdated)=\"onRangePicked($event)\"></ngx-daterangepicker-material>\r\n </div>\r\n </div>\r\n\r\n <!-- Score range -->\r\n <div class=\"pane-scroll pane-fields\" *ngIf=\"activeDef.kind === 'score'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">From</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMin\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <span class=\"field-sep\">to</span>\r\n <div class=\"field\">\r\n <span class=\"field-label\">To</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMax\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <span class=\"score-readout\">{{ fScoreMin }}% \u2013 {{ fScoreMax }}%</span>\r\n </div>\r\n\r\n <!-- Option list -->\r\n <div class=\"pane-scroll pane-list\" *ngIf=\"activeDef.kind === 'list'\">\r\n <label class=\"panesearch\" *ngIf=\"activeDef.searchable\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"searchPlaceholder\" [(ngModel)]=\"optionQuery\">\r\n </label>\r\n\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let opt of activeOptions; trackBy: trackByOption\"\r\n [class.option-selected]=\"isSelected(opt)\" (click)=\"pick(opt)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"isSelected(opt)\" [class.mark-multi]=\"activeDef.multi\">\r\n <svg *ngIf=\"isSelected(opt)\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ opt.label }}</span>\r\n <span class=\"optmeta\" *ngIf=\"opt.meta\">{{ opt.meta }}</span>\r\n </span>\r\n </button>\r\n\r\n <div class=\"nomatch\" *ngIf=\"noOptionMatch\">No match for this search.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"clearFilters()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:18px;line-height:26px;font-weight:700;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:13px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat{border-radius:10px;background:linear-gradient(90deg,#f0f7ff,#f8fbff 60%,#fff);box-shadow:inset 0 0 0 1px #d1e9ff;padding:20px 24px;display:flex;align-items:center;gap:16px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:700;color:#101828}.av2-stat-label{font-size:15px;line-height:22px;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #b2ddff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eff8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:15px;line-height:22px;font-weight:600;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:24px;line-height:32px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:40px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:40px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#1570ef;color:#fff}.av2-btn--primary:hover:not(:disabled){background:#175cd3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:40px;padding:0 26px;border:0;border-radius:8px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eff8ff;color:#175cd3;font-weight:600}.av2-badge{display:inline-flex;align-items:center;height:28px;padding:0 12px;border-radius:6px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#1570ef;font-size:13px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#175cd3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px 8px;font-size:12px;line-height:18px;font-weight:600;color:#475467;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:14px 8px;border:0;border-bottom:1px solid #F2F4F7;font-size:13px;line-height:20px;color:#1d2939;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:14px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eff8ff;color:#175cd3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#1570ef}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.audit-gallery{position:relative}.gal-header{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:14px 20px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.gal-heading{display:flex;flex-direction:column;min-width:0}.gal-header-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.gal-header-sub{font-size:12px;line-height:18px;color:#667085}.quickchip{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.quickchip:hover{background:#f9fafb}.quickchip.chip-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #b2ddff;color:#175cd3;font-weight:600}.quickchip.quickchip--strong{padding:0 14px;font-weight:600}.quickchip.quickchip--name{max-width:300px}.quickchip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chip-chev{flex-shrink:0}.countbadge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9999px;background:#1570ef;color:#fff;font-size:11px;font-weight:700}.gal-body{display:flex;gap:16px;align-items:stretch}.gal-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.gal-left-inner{position:sticky;top:16px;max-height:calc(100vh - 32px);overflow:auto;padding:16px;display:flex;flex-direction:column;gap:12px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.gal-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.gal-audit-sub{font-size:11px;line-height:16px;color:#667085}.view-all{border-radius:8px;background:#eff8ff;padding:10px 12px}.view-all-link{padding:0;border:none;background:none;font-family:inherit;font-size:13px;font-weight:600;color:#1570ef;text-decoration:underline;text-underline-offset:2px;cursor:pointer}.view-all-link:hover{color:#175cd3}.gal-sections{display:flex;flex-direction:column;gap:6px}.gal-section{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0;border:none;background:transparent;font-family:inherit;font-size:13px;line-height:20px;font-weight:500;color:#344054;text-align:left;cursor:pointer}.gal-section.is-open{padding:4px 0;font-weight:600;color:#1d2939}.gal-section-name{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gal-section-count{flex:none;min-width:18px;height:18px;padding:0 6px;border-radius:9px;background:#eff8ff;color:#175cd3;font-size:11px;line-height:18px;font-weight:600;text-align:center}.gal-section-rule{flex:1;border-top:1px solid #EAECF0}.gal-section-chev{display:flex;color:#98a2b3}.gal-section-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.gal-section-chev .rotate{transform:rotate(-90deg)}.gal-nav-item{display:flex;align-items:flex-start;gap:8px;width:100%;padding:3px 4px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:12px;line-height:18px;color:#475467;text-align:left;cursor:pointer}.gal-nav-item:hover{background:#f9fafb}.gal-nav-item.is-picked .gal-nav-text{color:#175cd3;font-weight:500}.gal-check{width:14px;height:14px;flex-shrink:0;margin-top:2px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:inline-flex;align-items:center;justify-content:center;color:#fff}.gal-check.is-on{background:#1570ef;box-shadow:none}.gal-nav-text{flex:1}.gal-dot{display:inline-block;width:8px;height:8px;border-radius:9999px;flex-shrink:0;margin-top:5px;background:#d0d5dd}.gal-dot--flag{background:#f04438}.gal-dot--revised{background:#f79009}.gal-nav-empty{padding:4px;font-size:12px;line-height:18px;color:#667085}.gal-main{flex:1;min-width:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px;display:flex;flex-direction:column;gap:16px}.gal-toolbar{display:flex;align-items:center;gap:10px;min-height:36px}.gal-pager{display:inline-flex;align-items:center;gap:4px;height:36px;padding:0 4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd}.gal-pager-btn{width:28px;height:28px;border:none;border-radius:6px;background:transparent;color:#344054;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-pager-btn:hover:not(:disabled){background:#f2f4f7;color:#1570ef}.gal-pager-btn:disabled{opacity:.35;cursor:default}.gal-pager-label{padding:0 6px;font-size:13px;color:#475467;white-space:nowrap}.gal-pager-label strong{font-weight:600;color:#101828}.status-pill{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.status-pill--warning{background:#fffaeb;color:#b54708}.export-wrap{position:relative}.gal-export{padding:0 16px;font-size:14px;font-weight:600;box-shadow:0 1px 2px #1018280d}.export-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:30;width:300px;max-height:min(520px,75vh);overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 24px -6px #10182829;display:flex;flex-direction:column;gap:2px;animation:gal-pop .12s cubic-bezier(.4,0,.2,1)}.export-item{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;border-radius:6px;background:transparent;font-family:inherit;text-align:left;cursor:pointer}.export-item:hover:not(:disabled){background:#f9fafb}.export-item:disabled{opacity:.45;cursor:not-allowed}.export-title{font-size:13px;font-weight:600;color:#101828}.export-meta{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.export-foot{padding:6px 12px 4px;border-top:1px solid #F2F4F7;margin-top:2px;font-size:11px;color:#98a2b3}.export-group{padding:8px 12px 4px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:#98a2b3}.export-group+.export-item{margin-top:0}.export-group:not(:first-child){margin-top:4px;border-top:1px solid #F2F4F7;padding-top:10px}.menu-backdrop{position:fixed;inset:0;z-index:20}.gal-skeleton{display:flex;flex-direction:column;gap:12px}.sk{border-radius:8px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.sk-logo{width:64px;height:64px;align-self:center}.sk-facts{height:116px}.sk-card{height:96px}.sk-card--short{height:64px;opacity:.6}.gal-state{padding:48px 24px;display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}.gal-state-icon{width:56px;height:56px;border-radius:9999px;background:#eff8ff;box-shadow:0 0 0 8px #f5faff;color:#1570ef;display:inline-flex;align-items:center;justify-content:center;margin-bottom:8px}.gal-state-icon--error{background:#fef3f2;box-shadow:0 0 0 8px #fffbfa;color:#d92d20}.gal-state-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.gal-state-sub{max-width:440px;font-size:14px;line-height:20px;color:#667085;margin-bottom:6px}.gal-state-sub strong{font-weight:600;color:#344054}.gal-brand{display:flex;justify-content:center}.gal-brand-box{width:64px;height:64px;padding:4px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;align-items:center;justify-content:center;overflow:hidden;font-size:11px;line-height:14px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;text-align:center;overflow-wrap:anywhere;color:#667085}.gal-brand-box img{max-width:100%;max-height:100%;object-fit:contain;display:block}.gal-facts{margin:0;display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:6px 32px;font-size:13px;line-height:20px}.gal-fact{display:grid;grid-template-columns:136px minmax(0,1fr);column-gap:8px;min-width:0}.gal-fact dt{font-weight:600;color:#101828;white-space:nowrap}.gal-fact dd{margin:0;min-width:0;color:#344054;overflow-wrap:anywhere}.gal-fact--side{grid-template-columns:136px minmax(0,1fr)}.gal-fact-sub{margin-left:6px;color:#98a2b3}.gal-result{font-weight:600;color:#027a48}.gal-result.is-fail{color:#d92d20}.gal-answers{display:flex;flex-direction:column;gap:12px}.answerbox{position:relative;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px 20px;display:flex;flex-direction:column;gap:12px;background:#fff;animation:gal-rise .22s cubic-bezier(.4,0,.2,1) both;transition:box-shadow .15s cubic-bezier(.4,0,.2,1)}.answerbox.is-flagged:before{content:\"\";position:absolute;left:0;top:14px;bottom:14px;width:3px;border-radius:0 3px 3px 0;background:#f04438}.answerbox.is-editing{box-shadow:inset 0 0 0 1.5px #84caff,0 0 0 4px #eff8ff}.answerbox-head{display:flex;align-items:flex-start;gap:12px}.qtext{flex:1;min-width:0;font-size:14px;line-height:20px;font-weight:600;color:#101828}.qsection{display:block;margin-bottom:2px;font-size:12px;line-height:18px;font-weight:500;color:#667085}.gal-tag{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:16px;font-weight:600;flex-shrink:0;white-space:nowrap}.gal-tag--warning{color:#b54708;background:#fffaeb}.gal-tag--error{color:#d92d20;background:#fef3f2}.gal-tag--gray{color:#475467;background:#f2f4f7}.scorechip{background:#f2f4f7;border-radius:6px;padding:2px 8px;font-size:12px;line-height:18px;font-weight:500;color:#344054;flex-shrink:0;white-space:nowrap;font-variant-numeric:tabular-nums}.editicon{width:28px;height:28px;flex-shrink:0;margin-top:-4px;border:none;border-radius:6px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),color .15s cubic-bezier(.4,0,.2,1)}.editicon:hover{background:#f2f4f7;color:#1570ef}.editicon.is-locked{color:#d0d5dd;cursor:not-allowed}.editicon.is-locked:hover{background:transparent;color:#98a2b3}.answerbox-body{display:flex;flex-direction:column;gap:4px}.answertext{font-size:14px;line-height:20px;font-style:italic;color:#1d2939}.answertext--strong{font-weight:600;color:#101828}.prooftext{font-size:13px;line-height:18px;color:#475467}.remarktext{font-size:13px;line-height:18px;font-style:italic;color:#667085}.gal-media{display:flex;flex-wrap:wrap;gap:10px;margin:6px 0 2px}.gal-media-item{width:120px;margin:0;display:flex;flex-direction:column;gap:4px}.gal-media-item figcaption{font-size:12px;line-height:16px;color:#475467;overflow-wrap:anywhere}.gal-media-thumb{display:block;width:120px;height:90px;border-radius:8px;overflow:hidden;background:#f2f4f7;box-shadow:inset 0 0 0 1px #eaecf0;object-fit:cover;transition:transform .15s cubic-bezier(.4,0,.2,1),box-shadow .15s cubic-bezier(.4,0,.2,1)}.gal-media-thumb img{width:100%;height:100%;object-fit:cover;display:block}.gal-media-thumb:hover{transform:translateY(-1px);box-shadow:inset 0 0 0 1px #d0d5dd,0 4px 10px -2px #1018281f}.gal-media-thumb--missing{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:11px;color:#98a2b3;text-decoration:none}.gal-media-thumb--missing:hover{color:#667085}.revision{display:flex;flex-direction:column;gap:10px}.rev-block{min-width:0;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:6px}.rev-block--revised{background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89}.rev-head{display:flex;align-items:center;gap:8px}.rev-label{font-size:11px;line-height:16px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#667085}.rev-label--warning{padding:2px 8px;border-radius:9999px;background:#fffaeb;color:#dc6803}.rev-reason-label{font-size:12px;line-height:18px;color:#475467}.rev-reason{border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;padding:10px 12px;font-size:13px;line-height:18px;color:#1570ef}.editpanel{border-radius:8px;background:#fcfcfd;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px;display:flex;flex-direction:column;gap:12px;animation:gal-rise .16s cubic-bezier(.4,0,.2,1) both}.edit-title{font-size:12px;line-height:18px;font-weight:600;color:#475467}.edit-title .req{color:#f04438}.edit-options{display:flex;flex-direction:column;gap:8px}.edit-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;text-align:left;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),box-shadow .15s cubic-bezier(.4,0,.2,1)}.edit-option:hover{box-shadow:inset 0 0 0 1px #d0d5dd}.edit-option.is-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #84caff}.edit-option.is-on .edit-option-label{font-weight:600;color:#101828}.edit-option.is-on .edit-radio{background:#1570ef;box-shadow:none}.edit-radio{width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1.5px #d0d5dd;color:#fff;display:inline-flex;align-items:center;justify-content:center}.edit-option-label{flex:1;min-width:0;font-size:14px;line-height:20px;color:#344054}.edit-option-flag{font-size:11px;font-weight:600;color:#d92d20}.edit-option-score{font-size:12px;color:#667085;white-space:nowrap}.edit-option-actual{font-size:11px;font-weight:500;color:#667085;background:#f2f4f7;border-radius:9999px;padding:2px 8px;white-space:nowrap;flex-shrink:0}.edit-reason{display:flex;flex-direction:column;gap:6px}.edit-input{height:40px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#344054;outline:none}.edit-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.edit-select{display:block}.edit-hint{font-size:12px;color:#667085}.edit-actions{display:flex;justify-content:flex-end;gap:8px}.gal-nomatch{padding:20px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px;color:#667085;text-align:center}.gal-nomatch .av2-link{border:none;background:none;padding:0;font-family:inherit}.gal-approve-bar{position:sticky;bottom:0;z-index:10;background:#fff;box-shadow:0 -4px 10px #0000000a,inset 0 0 0 1px #eaecf0;border-radius:8px;padding:12px 24px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}.approve-status{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:#475467}.approve-status strong{font-weight:600;color:#1d2939}.approve-dot{width:8px;height:8px;border-radius:9999px;background:#d0d5dd}.approve-dot--success{background:#12b76a}.approve-dot--warning{background:#f79009}.approve-warn{font-size:12px;color:#b54708}.gal-approve{height:40px;padding:0 20px;background:#1570ef;color:#fff;box-shadow:0 1px 2px #1018280d}.gal-approve:hover:not(:disabled){background:#175cd3}.gal-approve--confirm{background:#039855}.gal-approve--confirm:hover:not(:disabled){background:#027a48}@keyframes gal-rise{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes gal-pop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.answerbox,.editpanel,.export-menu,.sk{animation:none}}@media (max-width: 1200px){.gal-facts{grid-template-columns:minmax(0,1fr)}.gal-fact--side dt{min-width:130px}}@media (max-width: 900px){.gal-body{flex-direction:column;align-items:stretch}.gal-left{width:100%}.gal-left-inner{position:static;max-height:none}.gal-main{padding:16px}.gal-fact dt,.gal-fact--side dt{min-width:110px}}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:760px;max-width:94vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.countpill{min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{width:270px;flex-shrink:0;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow:auto;padding:8px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.drawer-nav::-webkit-scrollbar{width:6px}.drawer-nav::-webkit-scrollbar-thumb{border-radius:3px;background:#d0d5dd}.drawer-group{display:flex;flex-direction:column;gap:2px;padding-bottom:10px}.grouplabel{padding:10px 12px 6px;font-size:11px;line-height:16px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#667085}.drawer-navitem{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column}.navtitle{font-size:13px;line-height:18px;font-weight:600;color:#1d2939}.navvalue{font-size:12px;line-height:18px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#175cd3}.dirtydot{width:7px;height:7px;border-radius:9999px;background:#1570ef;flex-shrink:0}.navchev{color:#98a2b3;flex-shrink:0}.drawer-pane{flex:1;min-width:0;display:flex;flex-direction:column}.pane-head{padding:16px 20px 10px;display:flex;flex-direction:column;gap:4px}.panetitle{font-size:15px;line-height:22px;font-weight:700;color:#101828}.panehint{font-size:12px;line-height:18px;color:#667085}.pane-scroll{flex:1;overflow:auto}.pane-fields{padding:6px 20px 16px;display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap}.pane-fields--date{flex-direction:column;align-items:flex-start;align-content:flex-start}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:12px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eff8ff;color:#1570ef;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eff8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.gal-range-readout{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fcfcfd;font-size:14px;font-weight:600;color:#101828}.gal-range-readout svg{color:#667085}.gal-inline-picker{max-width:100%}:host ::ng-deep .gal-inline-picker .md-drppicker.inline{margin-top:0;box-shadow:inset 0 0 0 1px #eaecf0}.field{display:flex;flex-direction:column;gap:6px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-box{display:flex;align-items:center;gap:6px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff}.field-box input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.field-box.field-box--num{width:120px}.field-box:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.field-unit{font-size:14px;color:#667085}.field-sep{height:40px;display:flex;align-items:center;color:#98a2b3;font-size:14px}.score-readout{height:40px;display:inline-flex;align-items:center;padding:0 12px;border-radius:8px;background:#eff8ff;color:#175cd3;font-size:13px;font-weight:700;white-space:nowrap}.pane-list{padding:0 12px 16px;display:flex;flex-direction:column;gap:2px}.panesearch{display:flex;align-items:center;gap:8px;height:38px;margin:0 0 8px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;flex-shrink:0}.panesearch input{flex:1;min-width:0;height:36px;border:none;outline:none;background:transparent;font-family:inherit;font-size:13px;color:#101828}.panesearch input::placeholder{color:#98a2b3}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eff8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-multi{border-radius:5px}.optionmark.mark-on{background:#1570ef;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.nomatch{padding:18px 12px;font-size:13px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #101828;--bs-tooltip-color: #fff;--bs-tooltip-max-width: 260px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#101828!important;color:#fff!important;padding:8px 12px;border-radius:8px;font-size:12px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.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: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i7.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i8.DaterangepickerComponent, selector: "ngx-daterangepicker-material", inputs: ["startDate", "endDate", "dateLimit", "autoApply", "singleDatePicker", "showDropdowns", "showWeekNumbers", "showISOWeekNumbers", "linkedCalendars", "autoUpdateInput", "alwaysShowCalendars", "maxSpan", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "showClearButton", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "showCustomRangeLabel", "showCancel", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "customRangeDirection", "drops", "opens", "closeOnAutoApply", "minDate", "locale", "ranges", "maxDate", "isInvalidDate", "isCustomDate", "isTooltipDate"], outputs: ["choosedDate", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "cancelClicked", "clearClicked"] }, { kind: "component", type: i9.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i10.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }] });
|
|
1809
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2GalleryComponent, selector: "lib-audit-v2-gallery", host: { listeners: { "document:keydown": "onViewerKey($event)" } }, ngImport: i0, template: "<div class=\"av2-page audit-gallery\">\r\n\r\n <!-- Header bar with quick selects -->\r\n <section class=\"gal-header\">\r\n <div class=\"gal-heading\">\r\n <div class=\"gal-header-title\">Gallery</div>\r\n <div class=\"gal-header-sub\">\r\n <ng-container *ngIf=\"total\">{{ total }} {{ total === 1 ? 'submission' : 'submissions' }} \u00B7 </ng-container>{{ rangeLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <!-- Chevrons are SVGs, not text glyphs, so they sit on the chip's centre line. -->\r\n <button type=\"button\" class=\"quickchip chip-on\" (click)=\"openFilters('type')\">\r\n {{ fType }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--name\" (click)=\"openFilters('name')\" [title]=\"fName\">\r\n <span class=\"quickchip-label\">{{ fName || 'Select audit' }}</span>\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip chip-on\" *ngIf=\"datePicked\" (click)=\"openFilters('date')\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"6\"></line>\r\n </svg>\r\n {{ rangeLabel }}\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip\" (click)=\"openScopeFilter()\">\r\n {{ storeSummary }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--strong\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n All Filters\r\n <span class=\"countbadge\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n </button>\r\n\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm av2-btn--wide\" (click)=\"applyFilters()\">\r\n Apply\r\n </button>\r\n </section>\r\n\r\n <div class=\"gal-body\">\r\n\r\n <!-- Question navigation -->\r\n <!-- The white column runs the full height of the right card; its content stays in view while scrolling. -->\r\n <aside class=\"gal-left\" [class.is-collapsed]=\"navCollapsed\">\r\n <!-- \u00AB hides the panel (v1 sidenav); \u00BB in the toolbar brings it back. -->\r\n <button type=\"button\" class=\"gal-nav-toggle\" *ngIf=\"!navCollapsed\" (click)=\"toggleNav()\"\r\n title=\"Hide questions\" aria-label=\"Hide questions\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 17L6 12L11 7M18 17L13 12L18 7\"></path></svg>\r\n </button>\r\n <div class=\"gal-left-inner\" *ngIf=\"!navCollapsed\">\r\n <div class=\"gal-left-head\">\r\n <span class=\"av2-sk av2-sk--title\" *ngIf=\"navLoading && !fName\"></span>\r\n <div class=\"gal-audit-name\" *ngIf=\"!navLoading || fName\">{{ fName || 'No audit selected' }}</div>\r\n <div class=\"gal-audit-sub\" *ngIf=\"detail.subtitle\">{{ detail.subtitle }}</div>\r\n </div>\r\n\r\n <!-- No submission for the filters (e.g. the last one was just approved under \"Not Approved\"):\r\n nothing to navigate, so the question list goes with it. -->\r\n <div class=\"gal-nav-empty\" *ngIf=\"!loading && !hasSubmission\">No submissions for the selected filters.</div>\r\n\r\n <ng-container *ngIf=\"loading || hasSubmission\">\r\n <!-- Clears any question selection. -->\r\n <div class=\"view-all\" [class.is-active]=\"!hasSelection\">\r\n <button type=\"button\" class=\"view-all-link\" (click)=\"viewAllAnswers()\">View All Answers</button>\r\n </div>\r\n\r\n <!-- Section accordion: one open at a time. -->\r\n <div class=\"gal-sections\">\r\n <lib-audit-v2-shimmer *ngIf=\"navLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!navLoading\">\r\n <ng-container *ngFor=\"let s of sections; let i = index; trackBy: trackBySection\">\r\n <button type=\"button\" class=\"gal-section\" [class.is-open]=\"openSection === i\" (click)=\"toggleSection(i)\">\r\n <span class=\"gal-section-name\">{{ s.name }}<span class=\"gal-section-points\" *ngIf=\"sectionPoints(s) as pts\"\r\n title=\"Compliance points earned / possible in this section\">{{ pts }}</span></span>\r\n <!-- Ticks stay when a section is collapsed; the count shows they are still narrowing the answers. -->\r\n <span class=\"gal-section-count\" *ngIf=\"sectionPicked(s) as n\" [attr.title]=\"n + ' selected in this section'\">{{ n }}</span>\r\n <span class=\"gal-section-rule\"></span>\r\n <span class=\"gal-section-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"openSection !== i\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <ng-container *ngIf=\"openSection === i\">\r\n <button type=\"button\" class=\"gal-nav-item\" *ngFor=\"let q of s.questions; trackBy: trackById\"\r\n [class.is-picked]=\"isQuestionSelected(q)\" (click)=\"toggleQuestion(q)\">\r\n <span class=\"gal-check\" [class.is-on]=\"isQuestionSelected(q)\">\r\n <svg *ngIf=\"isQuestionSelected(q)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"gal-nav-text\">{{ q.qno }} . {{ q.text }}</span>\r\n <span class=\"gal-dot gal-dot--flag\" *ngIf=\"isFlagged(q)\" title=\"Flagged\"></span>\r\n <span class=\"gal-dot gal-dot--revised\" *ngIf=\"isRevised(q)\" title=\"Revised\"></span>\r\n </button>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!s.questions.length\">No questions in this section</div>\r\n </ng-container>\r\n </ng-container>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!sections.length\">No questions for the selected filters</div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </aside>\r\n\r\n <section class=\"gal-main\">\r\n <!-- Pager + export -->\r\n <div class=\"gal-toolbar\">\r\n <button type=\"button\" class=\"gal-nav-toggle gal-nav-toggle--open\" *ngIf=\"navCollapsed\" (click)=\"toggleNav()\"\r\n title=\"Show questions\" aria-label=\"Show questions\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M13 17L18 12L13 7M6 17L11 12L6 7\"></path></svg>\r\n </button>\r\n <div class=\"gal-pager\" *ngIf=\"total\">\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canPrev\" (click)=\"prevPage()\" title=\"Previous submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"15 18 9 12 15 6\"></polyline>\r\n </svg>\r\n </button>\r\n <span class=\"gal-pager-label\">Submission <strong>{{ pageLabel }}</strong></span>\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canNext\" (click)=\"nextPage()\" title=\"Next submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n <span class=\"status-pill status-pill--warning\" *ngIf=\"!loading && hasSubmission && detail.status !== 'submit'\">Re-do requested</span>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <div class=\"export-wrap\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm gal-export\" [disabled]=\"exporting || !total\"\r\n (click)=\"toggleExport()\" [attr.aria-expanded]=\"exportOpen\">\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n <div class=\"export-menu\" *ngIf=\"exportOpen\" role=\"menu\">\r\n <!-- Excel: built here, downloads right away (hidden for now, see showExcelExport) -->\r\n <ng-container *ngIf=\"showExcelExport\">\r\n <div class=\"export-group\">Excel (.xlsx) \u00B7 downloads now</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" [disabled]=\"!hasSubmission\" (click)=\"exportCurrent()\">\r\n <span class=\"export-title\">This submission</span>\r\n <span class=\"export-meta\">{{ detail.storeName }} \u00B7 {{ detail.date }}</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportAll()\">\r\n <span class=\"export-title\">All {{ total }} {{ total === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"export-meta\">Current filters \u00B7 summary + every answer</span>\r\n </button>\r\n </ng-container>\r\n <!-- CSV / PDF / PPT / ZIP: the v1 gallery's download service -->\r\n <div class=\"export-group\">Report files \u00B7 Notifications \u203A Downloads</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('csv')\">\r\n <span class=\"export-title\">Export as CSV</span>\r\n <span class=\"export-meta\">Current filters</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('pdf')\">\r\n <span class=\"export-title\">Export as PDF</span>\r\n <span class=\"export-meta\">One report per submission</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('ppt')\">\r\n <span class=\"export-title\">Export as PPT</span>\r\n <span class=\"export-meta\">Tick up to 3 questions on the left</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('zipfiles')\">\r\n <span class=\"export-title\">Export as ZIP</span>\r\n <span class=\"export-meta\">Photos and videos</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading -->\r\n <div class=\"gal-skeleton\" *ngIf=\"loading\" aria-busy=\"true\" aria-label=\"Loading submission\">\r\n <div class=\"sk sk-logo\"></div>\r\n <div class=\"sk sk-facts\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card sk-card--short\"></div>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && loadError\">\r\n <span class=\"gal-state-icon gal-state-icon--error\">\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12.5\"></line>\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\r\n </svg>\r\n </span>\r\n <div class=\"gal-state-title\">{{ loadError }}</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"retry()\">Retry</button>\r\n </div>\r\n\r\n <!-- Nothing submitted -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && !loadError && !hasSubmission\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"gal-state-title\">{{ fName ? 'No submissions found' : (linkMissing ? 'Audit not found' : 'No audits to show') }}</div>\r\n <div class=\"gal-state-sub\" *ngIf=\"fName\">\r\n Nothing was submitted for <strong>{{ fName }}</strong> between {{ rangeLabel }} with the current filters.\r\n Try a wider date range or another store.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && linkMissing\">\r\n The audit you opened was deleted or is not an audit. Pick an audit in the filters to see its submissions.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && !linkMissing\">Create an audit in Manage to see its submissions here.</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"fName || (linkMissing && audits.length)\"\r\n (click)=\"openFilters(fName ? 'date' : 'name')\">{{ fName ? 'Change filters' : 'Pick an audit' }}</button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!loading && hasSubmission\">\r\n <!-- Client brand -->\r\n <div class=\"gal-brand\">\r\n <span class=\"gal-brand-box\" [class.has-logo]=\"clientLogo && !logoFailed\">\r\n <img *ngIf=\"clientLogo && !logoFailed\" [src]=\"clientLogo\" [alt]=\"clientName || 'Client logo'\" (error)=\"logoFailed = true\">\r\n <ng-container *ngIf=\"!clientLogo || logoFailed\">{{ clientName || 'Logo' }}</ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Who / where / when, read row by row across the two columns -->\r\n <dl class=\"gal-facts\">\r\n <div class=\"gal-fact\"><dt>Store Name:</dt><dd>{{ detail.storeName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Duration:</dt><dd>{{ detail.duration }}</dd></div>\r\n <div class=\"gal-fact\"><dt>Audit Name:</dt><dd>{{ detail.auditName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Date:</dt><dd>{{ detail.date }}</dd></div>\r\n <div class=\"gal-fact\"><dt>State & Country:</dt><dd>{{ detail.region }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Time:</dt><dd>{{ detail.time }}</dd></div>\r\n <div class=\"gal-fact\"><dt>No. of Questions:</dt><dd>{{ detail.questionCount }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\">\r\n <dt>Compliance Score:</dt>\r\n <dd *ngIf=\"detail.complianceEnabled\" [title]=\"'Pass mark ' + passThreshold + '%'\">{{ compliancePercent }}% <span class=\"gal-result\" [class.is-fail]=\"!passed\">({{ resultLabel }})</span></dd>\r\n <!-- No question of this audit has compliance scoring on: no score (the flag-based rule would read 100%). -->\r\n <dd *ngIf=\"!detail.complianceEnabled\" title=\"Compliance score is not enabled for this audit\">\u2014</dd>\r\n </div>\r\n <div class=\"gal-fact\"><dt>Submitted By:</dt><dd>{{ detail.submittedBy }}</dd></div>\r\n <!-- v1: shown only when the submitter acknowledged with a name; View Proof also when only a photo exists. -->\r\n <div class=\"gal-fact gal-fact--side\" *ngIf=\"detail.acknowledgedBy || detail.proofImage\">\r\n <dt>Acknowledged By:</dt>\r\n <dd>\r\n {{ detail.acknowledgedBy || '\u2014' }}\r\n <button type=\"button\" class=\"gal-proof-link\" (click)=\"proofOpen = true\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle></svg>\r\n View Proof\r\n </button>\r\n </dd>\r\n </div>\r\n </dl>\r\n\r\n <!-- Answers -->\r\n <div class=\"gal-answers\" id=\"view-all\">\r\n <article class=\"answerbox\" *ngFor=\"let q of visibleQuestions; let i = index; trackBy: trackById\"\r\n [class.is-flagged]=\"q.flagged\" [class.is-editing]=\"isEditing(q)\"\r\n [style.animation-delay.ms]=\"i < 10 ? i * 35 : 0\">\r\n <header class=\"answerbox-head\">\r\n <div class=\"qtext\">\r\n <span class=\"qsection\" *ngIf=\"sections.length > 1\">{{ q.section }}</span>\r\n {{ q.qno }}.{{ q.text }}\r\n <span class=\"qdesc\" *ngIf=\"q.description\">{{ q.description }}</span>\r\n </div>\r\n <span class=\"gal-tag gal-tag--warning\" *ngIf=\"q.revised\">Revised</span>\r\n <span class=\"gal-tag gal-tag--error\" *ngIf=\"q.flagged\">\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 21V4h11l-1.5 4L15 12H4\"></path></svg>\r\n Flagged\r\n </span>\r\n <span class=\"gal-tag gal-tag--gray\" *ngIf=\"q.redo\">Re-do</span>\r\n <span class=\"scorechip\" *ngIf=\"q.score !== null && !q.revised\">Score:{{ q.score }}</span>\r\n <button type=\"button\" class=\"editicon\" *ngIf=\"q.editable && !isEditing(q)\"\r\n [class.is-locked]=\"!!editBlockedReason\" [attr.aria-disabled]=\"!!editBlockedReason\"\r\n [ngbTooltip]=\"editBlockedReason || 'Edit answer'\" tooltipClass=\"av2-tip\" placement=\"top-end\" container=\"body\"\r\n [attr.aria-label]=\"editBlockedReason || 'Edit answer'\" (click)=\"startEdit(q)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 20h9\"></path>\r\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"></path>\r\n </svg>\r\n </button>\r\n </header>\r\n\r\n <!-- As submitted -->\r\n <div class=\"answerbox-body\" *ngIf=\"!q.revised && !isEditing(q)\">\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n\r\n <!-- Actual vs revised -->\r\n <div class=\"revision\" *ngIf=\"q.revised && !isEditing(q)\">\r\n <div class=\"rev-block\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label\">Actual submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.actualScore !== null\">Score:{{ q.actualScore }}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n <div class=\"rev-block rev-block--revised\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label rev-label--warning\">Revised submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.revised.score !== null\">Score:{{ q.revised.score }}</span>\r\n </div>\r\n <div class=\"answertext answertext--strong\">{{ q.revised.answer || '\u2014' }}</div>\r\n <div class=\"rev-reason-label\">Reason for Change:<span *ngIf=\"q.revised.by\"> \u00B7 {{ q.revised.by }}</span></div>\r\n <div class=\"rev-reason\">{{ q.revised.reason || '\u2014' }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit -->\r\n <div class=\"editpanel\" *ngIf=\"isEditing(q)\">\r\n <div class=\"edit-title\">Select the revised answer</div>\r\n <div class=\"edit-options\" role=\"radiogroup\" [attr.aria-label]=\"'Answer for question ' + q.qno\">\r\n <button type=\"button\" role=\"radio\" class=\"edit-option\" *ngFor=\"let opt of q.options; trackBy: trackByLabel\"\r\n [class.is-on]=\"isDraft(opt)\" [attr.aria-checked]=\"isDraft(opt)\" (click)=\"pickDraft(opt)\">\r\n <span class=\"edit-radio\">\r\n <svg *ngIf=\"isDraft(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"edit-option-label\">{{ opt.label }}</span>\r\n <span class=\"edit-option-flag\" *ngIf=\"opt.flag\">Flags</span>\r\n <span class=\"edit-option-score\" *ngIf=\"opt.score !== null\">Score {{ opt.score }}</span>\r\n <span class=\"edit-option-actual\" *ngIf=\"isActualOption(q, opt)\">Actual answer</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"edit-reason\" *ngIf=\"draftChanged(q)\">\r\n <div class=\"edit-title\">Reason for change <span class=\"req\">*</span></div>\r\n <lib-audit-v2-select class=\"edit-select\" [(ngModel)]=\"draftReason\" [options]=\"reasonOptions\"\r\n placeholder=\"Select a reason\" ariaLabel=\"Reason for change\"></lib-audit-v2-select>\r\n <input *ngIf=\"draftReason === 'Other'\" type=\"text\" class=\"edit-input\" maxlength=\"300\"\r\n placeholder=\"Enter the reason for change\" [(ngModel)]=\"draftOther\">\r\n </div>\r\n <div class=\"edit-hint\" *ngIf=\"!draftChanged(q) && q.revised\">\r\n Saving keeps the store's actual answer and removes the revision.\r\n </div>\r\n\r\n <div class=\"edit-actions\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"!canSave(q)\" (click)=\"saveEdit(q)\">\r\n {{ saving ? 'Saving\u2026' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </article>\r\n\r\n <div class=\"gal-nomatch\" *ngIf=\"!visibleQuestions.length\">\r\n No answers match the question selection. <button type=\"button\" class=\"av2-link\" (click)=\"viewAllAnswers()\">View all answers</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n <!-- Approve bar -->\r\n <div class=\"gal-approve-bar\" *ngIf=\"hasSubmission && !loading\">\r\n <div class=\"approve-status\">\r\n <ng-container *ngIf=\"detail.approvalStatus\">\r\n <span class=\"approve-dot approve-dot--success\"></span>\r\n Approved<ng-container *ngIf=\"detail.approvedBy\"> by <strong>{{ detail.approvedBy }}</strong></ng-container><ng-container *ngIf=\"detail.approvedAt\"> \u00B7 {{ detail.approvedAt }}</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalStatus && detail.approvalEnable\">\r\n <span class=\"approve-dot approve-dot--warning\"></span>\r\n Waiting for approval<ng-container *ngIf=\"revisedCount\"> \u00B7 {{ revisedCount }} {{ revisedCount === 1 ? 'answer' : 'answers' }} revised</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalEnable\">\r\n <span class=\"approve-dot\"></span>\r\n No approval step is set for this audit\r\n </ng-container>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <ng-container *ngIf=\"detail.approvalEnable && !detail.approvalStatus && menuAccess.canEdit\">\r\n <button type=\"button\" class=\"av2-btn gal-approve\" *ngIf=\"!approveConfirm\" (click)=\"requestApprove()\">Approve</button>\r\n <ng-container *ngIf=\"approveConfirm\">\r\n <span class=\"approve-warn\">Approval records the final score and locks further edits.</span>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelApprove()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn gal-approve gal-approve--confirm\" [disabled]=\"approving\" (click)=\"confirmApprove()\">\r\n {{ approving ? 'Approving\u2026' : 'Confirm approval' }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- What the store submitted: answer, proof, captures and remarks. Shared by the plain and the revised views. -->\r\n <ng-template #submitted let-q>\r\n <!-- v1 layout: the question's reference image and the answer on the left; validation photos / videos, the\r\n chosen option's reference image and the AI results in a right-hand column (col-md-6 / col-md-6). -->\r\n <div class=\"gal-split\" [class.is-split]=\"hasSide(q)\">\r\n <div class=\"gal-split-main\">\r\n <div class=\"gal-block\" *ngIf=\"q.questionRefs.length\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.questionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <!-- Every chosen answer on a line of its own (a multiple-choice answer is not run together with commas). -->\r\n <ng-container *ngIf=\"actualAnswer(q)\">\r\n <div class=\"answertext\" *ngFor=\"let a of q.answers\" [class.is-flag]=\"q.flagged\">{{ a }}{{ q.unit }}</div>\r\n </ng-container>\r\n <div class=\"answertext\" *ngIf=\"!actualAnswer(q) && !q.media.length && !q.proof.length && !q.validationText\">\u2014</div>\r\n <!-- Typed validation answer under the answer (v1 \"Validation Answer : 88\"); several are listed one per line. -->\r\n <div class=\"prooftext\" *ngIf=\"q.validationTexts.length === 1\" [class.is-flag]=\"q.flagged\">Validation Answer : {{ q.validationTexts[0] }}</div>\r\n <ng-container *ngIf=\"q.validationTexts.length > 1\">\r\n <div class=\"prooftext\" [class.is-flag]=\"q.flagged\">Validation Answer :</div>\r\n <div class=\"prooftext\" *ngFor=\"let v of q.validationTexts\" [class.is-flag]=\"q.flagged\">{{ v }}</div>\r\n </ng-container>\r\n\r\n <!-- Image / video questions: the capture's reference image, then the uploads. -->\r\n <div class=\"gal-block\" *ngIf=\"q.optionRefs.length && !isChoice(q)\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.optionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <div class=\"gal-block\" *ngIf=\"q.media.length\">\r\n <div class=\"gal-block-title\">{{ mediaTitle(q.media) }}</div>\r\n <ng-container *ngTemplateOutlet=\"mediaGrid; context: { $implicit: q.media, title: mediaTitle(q.media) }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"gal-split-side\" *ngIf=\"hasSide(q)\">\r\n <!-- Reference image of the chosen option. -->\r\n <div class=\"gal-block\" *ngIf=\"q.optionRefs.length && isChoice(q)\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.optionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <!-- Photo / video proof the chosen option asked for. -->\r\n <div class=\"gal-block\" *ngIf=\"q.proof.length\">\r\n <div class=\"gal-block-title\">Validation Answer</div>\r\n <ng-container *ngTemplateOutlet=\"mediaGrid; context: { $implicit: q.proof, title: 'Validation Answer' }\"></ng-container>\r\n </div>\r\n\r\n <div class=\"gal-ai\" *ngIf=\"q.aiResults.length\">\r\n <div class=\"gal-ai-line\" *ngFor=\"let r of q.aiResults\"><b>{{ r.label }} :</b> {{ r.value }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Image / video questions keep their AI results under the uploads (v1). -->\r\n <div class=\"gal-ai\" *ngIf=\"q.aiResults.length && !hasSide(q)\">\r\n <div class=\"gal-ai-line\" *ngFor=\"let r of q.aiResults\"><b>{{ r.label }} :</b> {{ r.value }}</div>\r\n </div>\r\n\r\n <div class=\"remarktext\" *ngIf=\"q.remark\">{{ labels.remarks }} : {{ q.remark }}</div>\r\n <div class=\"remarktext\" *ngIf=\"q.extraRemark\">{{ labels.additional }} : {{ q.extraRemark }}</div>\r\n </ng-template>\r\n\r\n <!-- Reference images: v1 collage (1 column for one, 2 for up to four, then 3), click opens the viewer. -->\r\n <ng-template #refGrid let-list let-title=\"title\">\r\n <div class=\"gal-grid\" [ngClass]=\"gridClass(list.length)\">\r\n <button type=\"button\" class=\"gal-tile\" *ngFor=\"let src of list; let i = index\" [title]=\"'Open ' + title\"\r\n (click)=\"openViewer(list, i, title)\">\r\n <img [src]=\"src\" [alt]=\"title + ' ' + (i + 1)\" loading=\"lazy\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Captured photos / videos with the v1 extras: Matched badge, upload time, per-image description. -->\r\n <ng-template #mediaGrid let-list let-title=\"title\">\r\n <div class=\"gal-grid\" [ngClass]=\"gridClass(list.length)\">\r\n <figure class=\"gal-tile-wrap\" *ngFor=\"let m of list; let mi = index\">\r\n <ng-container *ngIf=\"!brokenMedia.has(m.src)\">\r\n <button *ngIf=\"!m.video\" type=\"button\" class=\"gal-tile\" [title]=\"'Open ' + title\" (click)=\"openMediaViewer(list, m, title)\">\r\n <img [src]=\"m.src\" [alt]=\"title + ' ' + (mi + 1)\" loading=\"lazy\" (error)=\"onMediaError(m.src)\">\r\n </button>\r\n <video *ngIf=\"m.video\" [src]=\"m.src\" controls preload=\"metadata\" class=\"gal-tile gal-tile--video\" (error)=\"onMediaError(m.src)\"></video>\r\n </ng-container>\r\n <a *ngIf=\"brokenMedia.has(m.src)\" [href]=\"m.src\" target=\"_blank\" rel=\"noopener\" class=\"gal-tile gal-tile--missing\"\r\n [title]=\"(m.video ? 'Video' : 'Image') + ' could not be loaded - open the file'\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <circle cx=\"9\" cy=\"10\" r=\"1.6\"></circle>\r\n <path d=\"M21 16l-5-5-9 9\"></path>\r\n </svg>\r\n <span>Not available</span>\r\n </a>\r\n <span class=\"gal-detect\" *ngIf=\"m.detection\" [class.is-bad]=\"m.detection === 'notmatched'\">{{ m.detection === 'matched' ? 'Matched' : 'Not Matched' }}</span>\r\n <figcaption>\r\n <span class=\"gal-upload-time\" *ngIf=\"m.uploaded\">{{ m.uploaded }}</span>\r\n <span *ngIf=\"m.caption\">Image {{ mi + 1 }} : {{ m.caption }}</span>\r\n </figcaption>\r\n </figure>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Image viewer -->\r\n <div class=\"gal-viewer\" *ngIf=\"viewer\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"viewer.title\" (click)=\"closeViewer()\">\r\n <div class=\"gal-viewer-box\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"gal-viewer-head\">\r\n <span class=\"gal-viewer-title\">{{ viewer.title }}<span *ngIf=\"viewer.items.length > 1\"> \u00B7 {{ viewer.index + 1 }} / {{ viewer.items.length }}</span></span>\r\n <button type=\"button\" class=\"gal-viewer-close\" (click)=\"closeViewer()\" aria-label=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"gal-viewer-stage\">\r\n <button type=\"button\" class=\"gal-viewer-nav gal-viewer-nav--prev\" *ngIf=\"viewer.items.length > 1\"\r\n [disabled]=\"viewer.index === 0\" (click)=\"stepViewer(-1)\" aria-label=\"Previous image\">\u2039</button>\r\n <img [src]=\"viewer.items[viewer.index]\" [alt]=\"viewer.title\">\r\n <button type=\"button\" class=\"gal-viewer-nav gal-viewer-nav--next\" *ngIf=\"viewer.items.length > 1\"\r\n [disabled]=\"viewer.index === viewer.items.length - 1\" (click)=\"stepViewer(1)\" aria-label=\"Next image\">\u203A</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- View Proof (v1 \"Verification Details\") -->\r\n <div class=\"gal-viewer\" *ngIf=\"proofOpen\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Verification Details\" (click)=\"proofOpen = false\">\r\n <div class=\"gal-viewer-box gal-viewer-box--md\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"gal-viewer-head\">\r\n <span class=\"gal-viewer-title\">Verification Details</span>\r\n <button type=\"button\" class=\"gal-viewer-close\" (click)=\"proofOpen = false\" aria-label=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"gal-proof-body\">\r\n <ng-container *ngIf=\"detail.proofImage\">\r\n <div class=\"gal-block-title\">Captured Photo</div>\r\n <img class=\"gal-proof-img\" [src]=\"detail.proofImage\" alt=\"Captured photo\">\r\n </ng-container>\r\n <div class=\"gal-proof-name\"><b>Name :</b> {{ detail.acknowledgedBy || '\u2014' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Closes the export menu on an outside click -->\r\n <div class=\"menu-backdrop\" *ngIf=\"exportOpen\" (click)=\"exportOpen = false\"></div>\r\n\r\n <!-- Filter drawer -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"countpill\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <!-- Categories -->\r\n <div class=\"drawer-nav\">\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Primary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of primaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Secondary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of secondaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"drawer-pane\">\r\n <div class=\"pane-head\">\r\n <div class=\"panetitle\">{{ activeDef.label }}</div>\r\n <div class=\"panehint\">{{ activeDef.hint }}</div>\r\n </div>\r\n\r\n <!-- Date range -->\r\n <div class=\"pane-scroll pane-fields pane-fields--date\" *ngIf=\"activeDef.kind === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Selected</span>\r\n <span class=\"gal-range-readout\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n {{ rangeLabel }}\r\n </span>\r\n </div>\r\n <!-- Inline calendars: a dropdown inside this scrolling pane opened off to the side and scrolled sideways.\r\n Keyed on fRange so Clear all / reopening rebuilds it on the restored range. -->\r\n <div class=\"av2-datepick av2-datepick--compact gal-inline-picker\" *ngFor=\"let r of [fRange]\">\r\n <ngx-daterangepicker-material *ngIf=\"r\" [startDate]=\"r.startDate\" [endDate]=\"r.endDate\"\r\n [locale]=\"pickerLocale\" [maxDate]=\"today\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\"\r\n [showCancel]=\"false\" (datesUpdated)=\"onRangePicked($event)\"></ngx-daterangepicker-material>\r\n </div>\r\n </div>\r\n\r\n <!-- Score range -->\r\n <div class=\"pane-scroll pane-fields\" *ngIf=\"activeDef.kind === 'score'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">From</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMin\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <span class=\"field-sep\">to</span>\r\n <div class=\"field\">\r\n <span class=\"field-label\">To</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMax\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <span class=\"score-readout\">{{ fScoreMin }}% \u2013 {{ fScoreMax }}%</span>\r\n </div>\r\n\r\n <!-- Option list -->\r\n <div class=\"pane-scroll pane-list\" *ngIf=\"activeDef.kind === 'list'\">\r\n <label class=\"panesearch\" *ngIf=\"activeDef.searchable\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"searchPlaceholder\" [(ngModel)]=\"optionQuery\">\r\n </label>\r\n\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let opt of activeOptions; trackBy: trackByOption\"\r\n [class.option-selected]=\"isSelected(opt)\" (click)=\"pick(opt)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"isSelected(opt)\" [class.mark-multi]=\"activeDef.multi\">\r\n <svg *ngIf=\"isSelected(opt)\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ opt.label }}</span>\r\n <span class=\"optmeta\" *ngIf=\"opt.meta\">{{ opt.meta }}</span>\r\n </span>\r\n </button>\r\n\r\n <div class=\"nomatch\" *ngIf=\"noOptionMatch\">{{ noOptionText }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"clearFilters()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:18px;line-height:26px;font-weight:700;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:13px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat{border-radius:10px;background:linear-gradient(90deg,#f0f7ff,#f8fbff 60%,#fff);box-shadow:inset 0 0 0 1px #d1e9ff;padding:20px 24px;display:flex;align-items:center;gap:16px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:700;color:#101828}.av2-stat-label{font-size:15px;line-height:22px;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #b2ddff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eff8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:15px;line-height:22px;font-weight:600;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:24px;line-height:32px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:40px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:40px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#1570ef;color:#fff}.av2-btn--primary:hover:not(:disabled){background:#175cd3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:40px;padding:0 26px;border:0;border-radius:8px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eff8ff;color:#175cd3;font-weight:600}.av2-badge{display:inline-flex;align-items:center;height:28px;padding:0 12px;border-radius:6px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#1570ef;font-size:13px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#175cd3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px 8px;font-size:12px;line-height:18px;font-weight:600;color:#475467;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:14px 8px;border:0;border-bottom:1px solid #F2F4F7;font-size:13px;line-height:20px;color:#1d2939;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:14px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eff8ff;color:#175cd3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#1570ef}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.audit-gallery{position:relative}.gal-header{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:14px 20px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.gal-heading{display:flex;flex-direction:column;min-width:0}.gal-header-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.gal-header-sub{font-size:12px;line-height:18px;color:#667085}.quickchip{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.quickchip:hover{background:#f9fafb}.quickchip.chip-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #b2ddff;color:#175cd3;font-weight:600}.quickchip.quickchip--strong{padding:0 14px;font-weight:600}.quickchip.quickchip--name{max-width:300px}.quickchip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chip-chev{flex-shrink:0}.countbadge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9999px;background:#1570ef;color:#fff;font-size:11px;font-weight:700}.gal-body{display:flex;gap:16px;align-items:stretch}.gal-left{position:relative;width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.gal-left.is-collapsed{display:none}.gal-nav-toggle{position:absolute;top:24px;right:-18px;z-index:2;width:36px;height:36px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 2px 6px #1018281f;color:#344054;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-nav-toggle:hover{color:#1570ef}.gal-nav-toggle--open{position:static;flex-shrink:0}.gal-section-points{margin-left:4px;font-weight:500;color:#475467}.gal-left-inner{position:sticky;top:16px;max-height:calc(100vh - 32px);overflow:auto;padding:16px;display:flex;flex-direction:column;gap:12px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.gal-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.gal-audit-sub{font-size:11px;line-height:16px;color:#667085}.view-all{border-radius:8px;background:#eff8ff;padding:10px 12px}.view-all-link{padding:0;border:none;background:none;font-family:inherit;font-size:13px;font-weight:600;color:#1570ef;text-decoration:underline;text-underline-offset:2px;cursor:pointer}.view-all-link:hover{color:#175cd3}.gal-sections{display:flex;flex-direction:column;gap:6px}.gal-section{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0;border:none;background:transparent;font-family:inherit;font-size:13px;line-height:20px;font-weight:500;color:#344054;text-align:left;cursor:pointer}.gal-section.is-open{padding:4px 0;font-weight:600;color:#1d2939}.gal-section-name{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gal-section-count{flex:none;min-width:18px;height:18px;padding:0 6px;border-radius:9px;background:#eff8ff;color:#175cd3;font-size:11px;line-height:18px;font-weight:600;text-align:center}.gal-section-rule{flex:1;border-top:1px solid #EAECF0}.gal-section-chev{display:flex;color:#98a2b3}.gal-section-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.gal-section-chev .rotate{transform:rotate(-90deg)}.gal-nav-item{display:flex;align-items:flex-start;gap:8px;width:100%;padding:3px 4px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:12px;line-height:18px;color:#475467;text-align:left;cursor:pointer}.gal-nav-item:hover{background:#f9fafb}.gal-nav-item.is-picked .gal-nav-text{color:#175cd3;font-weight:500}.gal-check{width:14px;height:14px;flex-shrink:0;margin-top:2px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:inline-flex;align-items:center;justify-content:center;color:#fff}.gal-check.is-on{background:#1570ef;box-shadow:none}.gal-nav-text{flex:1}.gal-dot{display:inline-block;width:8px;height:8px;border-radius:9999px;flex-shrink:0;margin-top:5px;background:#d0d5dd}.gal-dot--flag{background:#f04438}.gal-dot--revised{background:#f79009}.gal-nav-empty{padding:4px;font-size:12px;line-height:18px;color:#667085}.gal-main{flex:1;min-width:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px;display:flex;flex-direction:column;gap:16px}.gal-toolbar{display:flex;align-items:center;gap:10px;min-height:36px}.gal-pager{display:inline-flex;align-items:center;gap:4px;height:36px;padding:0 4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd}.gal-pager-btn{width:28px;height:28px;border:none;border-radius:6px;background:transparent;color:#344054;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-pager-btn:hover:not(:disabled){background:#f2f4f7;color:#1570ef}.gal-pager-btn:disabled{opacity:.35;cursor:default}.gal-pager-label{padding:0 6px;font-size:13px;color:#475467;white-space:nowrap}.gal-pager-label strong{font-weight:600;color:#101828}.status-pill{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.status-pill--warning{background:#fffaeb;color:#b54708}.export-wrap{position:relative}.gal-export{padding:0 16px;font-size:14px;font-weight:600;box-shadow:0 1px 2px #1018280d}.export-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:30;width:300px;max-height:min(520px,75vh);overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 24px -6px #10182829;display:flex;flex-direction:column;gap:2px;animation:gal-pop .12s cubic-bezier(.4,0,.2,1)}.export-item{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;border-radius:6px;background:transparent;font-family:inherit;text-align:left;cursor:pointer}.export-item:hover:not(:disabled){background:#f9fafb}.export-item:disabled{opacity:.45;cursor:not-allowed}.export-title{font-size:13px;font-weight:600;color:#101828}.export-meta{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.export-foot{padding:6px 12px 4px;border-top:1px solid #F2F4F7;margin-top:2px;font-size:11px;color:#98a2b3}.export-group{padding:8px 12px 4px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:#98a2b3}.export-group+.export-item{margin-top:0}.export-group:not(:first-child){margin-top:4px;border-top:1px solid #F2F4F7;padding-top:10px}.menu-backdrop{position:fixed;inset:0;z-index:20}.gal-skeleton{display:flex;flex-direction:column;gap:12px}.sk{border-radius:8px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.sk-logo{width:64px;height:64px;align-self:center}.sk-facts{height:116px}.sk-card{height:96px}.sk-card--short{height:64px;opacity:.6}.gal-state{padding:48px 24px;display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}.gal-state-icon{width:56px;height:56px;border-radius:9999px;background:#eff8ff;box-shadow:0 0 0 8px #f5faff;color:#1570ef;display:inline-flex;align-items:center;justify-content:center;margin-bottom:8px}.gal-state-icon--error{background:#fef3f2;box-shadow:0 0 0 8px #fffbfa;color:#d92d20}.gal-state-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.gal-state-sub{max-width:440px;font-size:14px;line-height:20px;color:#667085;margin-bottom:6px}.gal-state-sub strong{font-weight:600;color:#344054}.gal-brand{display:flex;justify-content:center}.gal-brand-box{width:64px;height:64px;padding:4px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;align-items:center;justify-content:center;overflow:hidden;font-size:11px;line-height:14px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;text-align:center;overflow-wrap:anywhere;color:#667085}.gal-brand-box img{max-width:100%;max-height:100%;object-fit:contain;display:block}.gal-facts{margin:0;display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:8px 32px;font-size:17px;line-height:28px}.gal-fact{display:grid;grid-template-columns:180px minmax(0,1fr);column-gap:8px;min-width:0}.gal-fact dt{font-weight:600;color:#101828;white-space:nowrap}.gal-fact dd{margin:0;min-width:0;color:#101828;overflow-wrap:anywhere}.gal-fact--side{grid-template-columns:180px minmax(0,1fr)}.gal-proof-link{display:inline-flex;align-items:center;gap:4px;margin-left:8px;padding:0;border:none;background:none;font-family:inherit;font-size:14px;font-weight:600;line-height:20px;color:#1570ef;cursor:pointer;vertical-align:middle}.gal-proof-link:hover{color:#175cd3}.gal-result{font-weight:600;color:#027a48}.gal-result.is-fail{color:#d92d20}.gal-answers{display:flex;flex-direction:column;gap:12px}.answerbox{position:relative;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px 20px;display:flex;flex-direction:column;gap:12px;background:#fff;animation:gal-rise .22s cubic-bezier(.4,0,.2,1) both;transition:box-shadow .15s cubic-bezier(.4,0,.2,1)}.answerbox.is-flagged:before{content:\"\";position:absolute;left:0;top:14px;bottom:14px;width:3px;border-radius:0 3px 3px 0;background:#f04438}.answerbox.is-editing{box-shadow:inset 0 0 0 1.5px #84caff,0 0 0 4px #eff8ff}.answerbox-head{display:flex;align-items:flex-start;gap:12px}.qtext{flex:1;min-width:0;font-size:18px;line-height:28px;font-weight:700;color:#101828}.qdesc{display:block;margin-top:2px;font-size:14px;line-height:20px;font-weight:400;color:#667085}.qsection{display:block;margin-bottom:2px;font-size:12px;line-height:18px;font-weight:500;color:#667085}.gal-tag{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:16px;font-weight:600;flex-shrink:0;white-space:nowrap}.gal-tag--warning{color:#b54708;background:#fffaeb}.gal-tag--error{color:#d92d20;background:#fef3f2}.gal-tag--gray{color:#475467;background:#f2f4f7}.scorechip{background:#f2f4f7;border-radius:6px;padding:2px 8px;font-size:12px;line-height:18px;font-weight:500;color:#344054;flex-shrink:0;white-space:nowrap;font-variant-numeric:tabular-nums}.editicon{width:28px;height:28px;flex-shrink:0;margin-top:-4px;border:none;border-radius:6px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),color .15s cubic-bezier(.4,0,.2,1)}.editicon:hover{background:#f2f4f7;color:#1570ef}.editicon.is-locked{color:#d0d5dd;cursor:not-allowed}.editicon.is-locked:hover{background:transparent;color:#98a2b3}.answerbox-body{display:flex;flex-direction:column;gap:4px}.answertext{font-size:16px;line-height:24px;font-style:italic;color:#1d2939}.answertext--strong{font-weight:600;color:#101828}.answertext.is-flag{color:#d92d20}.prooftext{font-size:16px;line-height:24px;color:#344054}.prooftext.is-flag{color:#d92d20}.remarktext{margin-top:6px;font-size:18px;line-height:28px;font-style:italic;color:#475467;white-space:pre-line}.gal-split{display:flex;flex-direction:column;gap:4px}.gal-split.is-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:24px;align-items:start}.gal-split-main,.gal-split-side{min-width:0;display:flex;flex-direction:column;gap:4px}.gal-split-side .gal-block-title{font-style:italic}@media (max-width: 900px){.gal-split.is-split{grid-template-columns:minmax(0,1fr);gap:8px}}.gal-block{display:flex;flex-direction:column;gap:8px;margin:8px 0 4px}.gal-block-title{font-size:16px;line-height:24px;font-weight:500;color:#101828}.gal-grid{display:grid;gap:10px;grid-auto-rows:220px;max-height:460px;overflow-y:auto;scrollbar-width:thin}.gal-grid.is-one{grid-template-columns:minmax(0,1fr);grid-auto-rows:400px}.gal-grid.is-two{grid-template-columns:repeat(2,minmax(0,1fr))}.gal-grid.is-tall{grid-auto-rows:400px}.gal-grid.is-three{grid-template-columns:repeat(3,minmax(0,1fr))}.gal-tile-wrap{position:relative;margin:0;min-height:0;display:flex;flex-direction:column;gap:4px}.gal-tile-wrap figcaption{flex:0 0 auto;display:flex;flex-direction:column;gap:2px;font-size:12px;line-height:16px;color:#475467;text-align:center;overflow-wrap:anywhere}.gal-tile-wrap figcaption:empty{display:none}.gal-tile{flex:1 1 auto;min-height:0;width:100%;height:100%;padding:0;border:none;border-radius:8px;overflow:hidden;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;cursor:zoom-in;display:block}.gal-tile img{width:100%;height:100%;object-fit:contain;display:block}.gal-tile:hover{box-shadow:inset 0 0 0 1px #d0d5dd,0 4px 10px -2px #1018281f}.gal-tile--video{background:#f9fafb;object-fit:contain;cursor:default}.gal-tile--missing{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:12px;color:#98a2b3;text-decoration:none;cursor:pointer}.gal-tile--missing:hover{color:#667085}.gal-upload-time{font-size:11px;color:#667085}.gal-detect{position:absolute;top:8px;left:8px;padding:2px 10px;border-radius:16px;font-size:12px;line-height:18px;font-weight:500;color:#027a48;background:#ecfdf3;pointer-events:none}.gal-detect.is-bad{color:#b42318;background:#fef3f2}.gal-ai{display:flex;flex-direction:column;gap:2px;margin-top:4px;font-size:16px;line-height:24px;color:#1d2939}.gal-viewer{position:fixed;inset:0;z-index:1100;display:flex;align-items:center;justify-content:center;padding:24px;background:#101828b8}.gal-viewer-box{width:min(1000px,100%);max-height:100%;display:flex;flex-direction:column;border-radius:12px;background:#fff;box-shadow:0 20px 24px -4px #1018282e;overflow:hidden}.gal-viewer-box--md{width:min(520px,100%)}.gal-viewer-head{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid #EAECF0}.gal-viewer-title{flex:1;min-width:0;font-size:16px;line-height:24px;font-weight:600;color:#101828}.gal-viewer-close{width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-viewer-close:hover{background:#f2f4f7;color:#344054}.gal-viewer-stage{position:relative;display:flex;align-items:center;justify-content:center;min-height:0;padding:12px 56px;background:#f9fafb}.gal-viewer-stage img{max-width:100%;max-height:calc(100vh - 160px);object-fit:contain;display:block}.gal-viewer-nav{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;font-size:26px;line-height:1;color:#344054;cursor:pointer}.gal-viewer-nav--prev{left:8px}.gal-viewer-nav--next{right:8px}.gal-viewer-nav:disabled{opacity:.35;cursor:default}.gal-proof-body{display:flex;flex-direction:column;gap:10px;padding:16px}.gal-proof-img{width:100%;height:350px;object-fit:contain;border-radius:8px;background:#f9fafb}.gal-proof-name{font-size:16px;line-height:24px;color:#101828}.revision{display:flex;flex-direction:column;gap:10px}.rev-block{min-width:0;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:6px}.rev-block--revised{background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89}.rev-head{display:flex;align-items:center;gap:8px}.rev-label{font-size:11px;line-height:16px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#667085}.rev-label--warning{padding:2px 8px;border-radius:9999px;background:#fffaeb;color:#dc6803}.rev-reason-label{font-size:12px;line-height:18px;color:#475467}.rev-reason{border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;padding:10px 12px;font-size:13px;line-height:18px;color:#1570ef}.editpanel{border-radius:8px;background:#fcfcfd;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px;display:flex;flex-direction:column;gap:12px;animation:gal-rise .16s cubic-bezier(.4,0,.2,1) both}.edit-title{font-size:12px;line-height:18px;font-weight:600;color:#475467}.edit-title .req{color:#f04438}.edit-options{display:flex;flex-direction:column;gap:8px}.edit-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;text-align:left;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),box-shadow .15s cubic-bezier(.4,0,.2,1)}.edit-option:hover{box-shadow:inset 0 0 0 1px #d0d5dd}.edit-option.is-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #84caff}.edit-option.is-on .edit-option-label{font-weight:600;color:#101828}.edit-option.is-on .edit-radio{background:#1570ef;box-shadow:none}.edit-radio{width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1.5px #d0d5dd;color:#fff;display:inline-flex;align-items:center;justify-content:center}.edit-option-label{flex:1;min-width:0;font-size:14px;line-height:20px;color:#344054}.edit-option-flag{font-size:11px;font-weight:600;color:#d92d20}.edit-option-score{font-size:12px;color:#667085;white-space:nowrap}.edit-option-actual{font-size:11px;font-weight:500;color:#667085;background:#f2f4f7;border-radius:9999px;padding:2px 8px;white-space:nowrap;flex-shrink:0}.edit-reason{display:flex;flex-direction:column;gap:6px}.edit-input{height:40px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#344054;outline:none}.edit-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.edit-select{display:block}.edit-hint{font-size:12px;color:#667085}.edit-actions{display:flex;justify-content:flex-end;gap:8px}.gal-nomatch{padding:20px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px;color:#667085;text-align:center}.gal-nomatch .av2-link{border:none;background:none;padding:0;font-family:inherit}.gal-approve-bar{position:sticky;bottom:0;z-index:10;background:#fff;box-shadow:0 -4px 10px #0000000a,inset 0 0 0 1px #eaecf0;border-radius:8px;padding:12px 24px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}.approve-status{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:#475467}.approve-status strong{font-weight:600;color:#1d2939}.approve-dot{width:8px;height:8px;border-radius:9999px;background:#d0d5dd}.approve-dot--success{background:#12b76a}.approve-dot--warning{background:#f79009}.approve-warn{font-size:12px;color:#b54708}.gal-approve{height:40px;padding:0 20px;background:#1570ef;color:#fff;box-shadow:0 1px 2px #1018280d}.gal-approve:hover:not(:disabled){background:#175cd3}.gal-approve--confirm{background:#039855}.gal-approve--confirm:hover:not(:disabled){background:#027a48}@keyframes gal-rise{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes gal-pop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.answerbox,.editpanel,.export-menu,.sk{animation:none}}@media (max-width: 1200px){.gal-facts{grid-template-columns:minmax(0,1fr)}.gal-fact--side dt{min-width:130px}}@media (max-width: 900px){.gal-body{flex-direction:column;align-items:stretch}.gal-left{width:100%}.gal-left-inner{position:static;max-height:none}.gal-main{padding:16px}.gal-fact dt,.gal-fact--side dt{min-width:110px}}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:760px;max-width:94vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.countpill{min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{width:270px;flex-shrink:0;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow:auto;padding:8px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.drawer-nav::-webkit-scrollbar{width:6px}.drawer-nav::-webkit-scrollbar-thumb{border-radius:3px;background:#d0d5dd}.drawer-group{display:flex;flex-direction:column;gap:2px;padding-bottom:10px}.grouplabel{padding:10px 12px 6px;font-size:11px;line-height:16px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#667085}.drawer-navitem{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column}.navtitle{font-size:13px;line-height:18px;font-weight:600;color:#1d2939}.navvalue{font-size:12px;line-height:18px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#175cd3}.dirtydot{width:7px;height:7px;border-radius:9999px;background:#1570ef;flex-shrink:0}.navchev{color:#98a2b3;flex-shrink:0}.drawer-pane{flex:1;min-width:0;display:flex;flex-direction:column}.pane-head{padding:16px 20px 10px;display:flex;flex-direction:column;gap:4px}.panetitle{font-size:15px;line-height:22px;font-weight:700;color:#101828}.panehint{font-size:12px;line-height:18px;color:#667085}.pane-scroll{flex:1;overflow:auto}.pane-fields{padding:6px 20px 16px;display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap}.pane-fields--date{flex-direction:column;align-items:flex-start;align-content:flex-start}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:12px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eff8ff;color:#1570ef;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eff8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.gal-range-readout{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fcfcfd;font-size:14px;font-weight:600;color:#101828}.gal-range-readout svg{color:#667085}.gal-inline-picker{max-width:100%}:host ::ng-deep .gal-inline-picker .md-drppicker.inline{margin-top:0;box-shadow:inset 0 0 0 1px #eaecf0}.field{display:flex;flex-direction:column;gap:6px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-box{display:flex;align-items:center;gap:6px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff}.field-box input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.field-box.field-box--num{width:120px}.field-box:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.field-unit{font-size:14px;color:#667085}.field-sep{height:40px;display:flex;align-items:center;color:#98a2b3;font-size:14px}.score-readout{height:40px;display:inline-flex;align-items:center;padding:0 12px;border-radius:8px;background:#eff8ff;color:#175cd3;font-size:13px;font-weight:700;white-space:nowrap}.pane-list{padding:0 12px 16px;display:flex;flex-direction:column;gap:2px}.panesearch{display:flex;align-items:center;gap:8px;height:38px;margin:0 0 8px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;flex-shrink:0}.panesearch input{flex:1;min-width:0;height:36px;border:none;outline:none;background:transparent;font-family:inherit;font-size:13px;color:#101828}.panesearch input::placeholder{color:#98a2b3}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eff8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-multi{border-radius:5px}.optionmark.mark-on{background:#1570ef;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.nomatch{padding:18px 12px;font-size:13px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #101828;--bs-tooltip-color: #fff;--bs-tooltip-max-width: 260px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#101828!important;color:#fff!important;padding:8px 12px;border-radius:8px;font-size:12px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.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: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i7.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i8.DaterangepickerComponent, selector: "ngx-daterangepicker-material", inputs: ["startDate", "endDate", "dateLimit", "autoApply", "singleDatePicker", "showDropdowns", "showWeekNumbers", "showISOWeekNumbers", "linkedCalendars", "autoUpdateInput", "alwaysShowCalendars", "maxSpan", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "showClearButton", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "showCustomRangeLabel", "showCancel", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "customRangeDirection", "drops", "opens", "closeOnAutoApply", "minDate", "locale", "ranges", "maxDate", "isInvalidDate", "isCustomDate", "isTooltipDate"], outputs: ["choosedDate", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "cancelClicked", "clearClicked"] }, { kind: "component", type: i9.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i10.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }] });
|
|
1528
1810
|
}
|
|
1529
1811
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2GalleryComponent, decorators: [{
|
|
1530
1812
|
type: Component,
|
|
1531
|
-
args: [{ selector: 'lib-audit-v2-gallery', template: "<div class=\"av2-page audit-gallery\">\r\n\r\n <!-- Header bar with quick selects -->\r\n <section class=\"gal-header\">\r\n <div class=\"gal-heading\">\r\n <div class=\"gal-header-title\">Gallery</div>\r\n <div class=\"gal-header-sub\">\r\n <ng-container *ngIf=\"total\">{{ total }} {{ total === 1 ? 'submission' : 'submissions' }} \u00B7 </ng-container>{{ rangeLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <!-- Chevrons are SVGs, not text glyphs, so they sit on the chip's centre line. -->\r\n <button type=\"button\" class=\"quickchip chip-on\" (click)=\"openFilters('type')\">\r\n {{ fType }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--name\" (click)=\"openFilters('name')\" [title]=\"fName\">\r\n <span class=\"quickchip-label\">{{ fName || 'Select audit' }}</span>\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip chip-on\" *ngIf=\"datePicked\" (click)=\"openFilters('date')\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"6\"></line>\r\n </svg>\r\n {{ rangeLabel }}\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip\" (click)=\"openScopeFilter()\">\r\n {{ storeSummary }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--strong\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n All Filters\r\n <span class=\"countbadge\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n </button>\r\n\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm av2-btn--wide\" (click)=\"applyFilters()\">\r\n Apply\r\n </button>\r\n </section>\r\n\r\n <div class=\"gal-body\">\r\n\r\n <!-- Question navigation -->\r\n <!-- The white column runs the full height of the right card; its content stays in view while scrolling. -->\r\n <aside class=\"gal-left\">\r\n <div class=\"gal-left-inner\">\r\n <div class=\"gal-left-head\">\r\n <span class=\"av2-sk av2-sk--title\" *ngIf=\"navLoading && !fName\"></span>\r\n <div class=\"gal-audit-name\" *ngIf=\"!navLoading || fName\">{{ fName || 'No audit selected' }}</div>\r\n <div class=\"gal-audit-sub\" *ngIf=\"detail.subtitle\">{{ detail.subtitle }}</div>\r\n </div>\r\n\r\n <!-- No submission for the filters (e.g. the last one was just approved under \"Not Approved\"):\r\n nothing to navigate, so the question list goes with it. -->\r\n <div class=\"gal-nav-empty\" *ngIf=\"!loading && !hasSubmission\">No submissions for the selected filters.</div>\r\n\r\n <ng-container *ngIf=\"loading || hasSubmission\">\r\n <!-- Clears any question selection. -->\r\n <div class=\"view-all\" [class.is-active]=\"!hasSelection\">\r\n <button type=\"button\" class=\"view-all-link\" (click)=\"viewAllAnswers()\">View All Answers</button>\r\n </div>\r\n\r\n <!-- Section accordion: one open at a time. -->\r\n <div class=\"gal-sections\">\r\n <lib-audit-v2-shimmer *ngIf=\"navLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!navLoading\">\r\n <ng-container *ngFor=\"let s of sections; let i = index; trackBy: trackBySection\">\r\n <button type=\"button\" class=\"gal-section\" [class.is-open]=\"openSection === i\" (click)=\"toggleSection(i)\">\r\n <span class=\"gal-section-name\">{{ s.name }}</span>\r\n <!-- Ticks stay when a section is collapsed; the count shows they are still narrowing the answers. -->\r\n <span class=\"gal-section-count\" *ngIf=\"sectionPicked(s) as n\" [attr.title]=\"n + ' selected in this section'\">{{ n }}</span>\r\n <span class=\"gal-section-rule\"></span>\r\n <span class=\"gal-section-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"openSection !== i\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <ng-container *ngIf=\"openSection === i\">\r\n <button type=\"button\" class=\"gal-nav-item\" *ngFor=\"let q of s.questions; trackBy: trackById\"\r\n [class.is-picked]=\"isQuestionSelected(q)\" (click)=\"toggleQuestion(q)\">\r\n <span class=\"gal-check\" [class.is-on]=\"isQuestionSelected(q)\">\r\n <svg *ngIf=\"isQuestionSelected(q)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"gal-nav-text\">{{ q.qno }} . {{ q.text }}</span>\r\n <span class=\"gal-dot gal-dot--flag\" *ngIf=\"isFlagged(q)\" title=\"Flagged\"></span>\r\n <span class=\"gal-dot gal-dot--revised\" *ngIf=\"isRevised(q)\" title=\"Revised\"></span>\r\n </button>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!s.questions.length\">No questions in this section</div>\r\n </ng-container>\r\n </ng-container>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!sections.length\">No questions for the selected filters</div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </aside>\r\n\r\n <section class=\"gal-main\">\r\n <!-- Pager + export -->\r\n <div class=\"gal-toolbar\">\r\n <div class=\"gal-pager\" *ngIf=\"total\">\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canPrev\" (click)=\"prevPage()\" title=\"Previous submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"15 18 9 12 15 6\"></polyline>\r\n </svg>\r\n </button>\r\n <span class=\"gal-pager-label\">Submission <strong>{{ pageLabel }}</strong></span>\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canNext\" (click)=\"nextPage()\" title=\"Next submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n <span class=\"status-pill status-pill--warning\" *ngIf=\"!loading && hasSubmission && detail.status !== 'submit'\">Re-do requested</span>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <div class=\"export-wrap\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm gal-export\" [disabled]=\"exporting || !total\"\r\n (click)=\"toggleExport()\" [attr.aria-expanded]=\"exportOpen\">\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n <div class=\"export-menu\" *ngIf=\"exportOpen\" role=\"menu\">\r\n <!-- Excel: built here, downloads right away (hidden for now, see showExcelExport) -->\r\n <ng-container *ngIf=\"showExcelExport\">\r\n <div class=\"export-group\">Excel (.xlsx) \u00B7 downloads now</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" [disabled]=\"!hasSubmission\" (click)=\"exportCurrent()\">\r\n <span class=\"export-title\">This submission</span>\r\n <span class=\"export-meta\">{{ detail.storeName }} \u00B7 {{ detail.date }}</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportAll()\">\r\n <span class=\"export-title\">All {{ total }} {{ total === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"export-meta\">Current filters \u00B7 summary + every answer</span>\r\n </button>\r\n </ng-container>\r\n <!-- CSV / PDF / PPT / ZIP: the v1 gallery's download service -->\r\n <div class=\"export-group\">Report files \u00B7 Notifications \u203A Downloads</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('csv')\">\r\n <span class=\"export-title\">Export as CSV</span>\r\n <span class=\"export-meta\">Current filters</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('pdf')\">\r\n <span class=\"export-title\">Export as PDF</span>\r\n <span class=\"export-meta\">One report per submission</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('ppt')\">\r\n <span class=\"export-title\">Export as PPT</span>\r\n <span class=\"export-meta\">Tick up to 3 questions on the left</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('zipfiles')\">\r\n <span class=\"export-title\">Export as ZIP</span>\r\n <span class=\"export-meta\">Photos and videos</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading -->\r\n <div class=\"gal-skeleton\" *ngIf=\"loading\" aria-busy=\"true\" aria-label=\"Loading submission\">\r\n <div class=\"sk sk-logo\"></div>\r\n <div class=\"sk sk-facts\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card sk-card--short\"></div>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && loadError\">\r\n <span class=\"gal-state-icon gal-state-icon--error\">\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12.5\"></line>\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\r\n </svg>\r\n </span>\r\n <div class=\"gal-state-title\">{{ loadError }}</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"retry()\">Retry</button>\r\n </div>\r\n\r\n <!-- Nothing submitted -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && !loadError && !hasSubmission\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"gal-state-title\">{{ fName ? 'No submissions found' : (linkMissing ? 'Audit not found' : 'No audits to show') }}</div>\r\n <div class=\"gal-state-sub\" *ngIf=\"fName\">\r\n Nothing was submitted for <strong>{{ fName }}</strong> between {{ rangeLabel }} with the current filters.\r\n Try a wider date range or another store.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && linkMissing\">\r\n The audit you opened was deleted or is not an audit. Pick an audit in the filters to see its submissions.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && !linkMissing\">Create an audit in Manage to see its submissions here.</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"fName || (linkMissing && audits.length)\"\r\n (click)=\"openFilters(fName ? 'date' : 'name')\">{{ fName ? 'Change filters' : 'Pick an audit' }}</button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!loading && hasSubmission\">\r\n <!-- Client brand -->\r\n <div class=\"gal-brand\">\r\n <span class=\"gal-brand-box\" [class.has-logo]=\"clientLogo && !logoFailed\">\r\n <img *ngIf=\"clientLogo && !logoFailed\" [src]=\"clientLogo\" [alt]=\"clientName || 'Client logo'\" (error)=\"logoFailed = true\">\r\n <ng-container *ngIf=\"!clientLogo || logoFailed\">{{ clientName || 'Logo' }}</ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Who / where / when, read row by row across the two columns -->\r\n <dl class=\"gal-facts\">\r\n <div class=\"gal-fact\"><dt>Store Name:</dt><dd>{{ detail.storeName }}<span class=\"gal-fact-sub\" *ngIf=\"detail.storeId && detail.storeId !== detail.storeName\">{{ detail.storeId }}</span></dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Duration:</dt><dd>{{ detail.duration }}</dd></div>\r\n <div class=\"gal-fact\"><dt>Audit Name:</dt><dd>{{ detail.auditName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Date:</dt><dd>{{ detail.date }}</dd></div>\r\n <div class=\"gal-fact\"><dt>State & Country:</dt><dd>{{ detail.region }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Time:</dt><dd>{{ detail.time }}</dd></div>\r\n <div class=\"gal-fact\"><dt>No. of Questions:</dt><dd>{{ detail.questionCount }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\">\r\n <dt>Compliance Score:</dt>\r\n <dd *ngIf=\"detail.complianceEnabled\" [title]=\"'Pass mark ' + passThreshold + '%'\">{{ compliancePercent }}% <span class=\"gal-result\" [class.is-fail]=\"!passed\">({{ resultLabel }})</span></dd>\r\n <!-- No question of this audit has compliance scoring on: no score (the flag-based rule would read 100%). -->\r\n <dd *ngIf=\"!detail.complianceEnabled\" title=\"Compliance score is not enabled for this audit\">\u2014</dd>\r\n </div>\r\n <div class=\"gal-fact\"><dt>Submitted By:</dt><dd>{{ detail.submittedBy }}</dd></div>\r\n </dl>\r\n\r\n <!-- Answers -->\r\n <div class=\"gal-answers\" id=\"view-all\">\r\n <article class=\"answerbox\" *ngFor=\"let q of visibleQuestions; let i = index; trackBy: trackById\"\r\n [class.is-flagged]=\"q.flagged\" [class.is-editing]=\"isEditing(q)\"\r\n [style.animation-delay.ms]=\"i < 10 ? i * 35 : 0\">\r\n <header class=\"answerbox-head\">\r\n <div class=\"qtext\">\r\n <span class=\"qsection\" *ngIf=\"sections.length > 1\">{{ q.section }}</span>\r\n {{ q.qno }}.{{ q.text }}\r\n </div>\r\n <span class=\"gal-tag gal-tag--warning\" *ngIf=\"q.revised\">Revised</span>\r\n <span class=\"gal-tag gal-tag--error\" *ngIf=\"q.flagged\">\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 21V4h11l-1.5 4L15 12H4\"></path></svg>\r\n Flagged\r\n </span>\r\n <span class=\"gal-tag gal-tag--gray\" *ngIf=\"q.redo\">Re-do</span>\r\n <span class=\"scorechip\" *ngIf=\"q.score !== null && !q.revised\">Score:{{ q.score }}</span>\r\n <button type=\"button\" class=\"editicon\" *ngIf=\"q.editable && !isEditing(q)\"\r\n [class.is-locked]=\"!!editBlockedReason\" [attr.aria-disabled]=\"!!editBlockedReason\"\r\n [ngbTooltip]=\"editBlockedReason || 'Edit answer'\" tooltipClass=\"av2-tip\" placement=\"top-end\" container=\"body\"\r\n [attr.aria-label]=\"editBlockedReason || 'Edit answer'\" (click)=\"startEdit(q)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 20h9\"></path>\r\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"></path>\r\n </svg>\r\n </button>\r\n </header>\r\n\r\n <!-- As submitted -->\r\n <div class=\"answerbox-body\" *ngIf=\"!q.revised && !isEditing(q)\">\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n\r\n <!-- Actual vs revised -->\r\n <div class=\"revision\" *ngIf=\"q.revised && !isEditing(q)\">\r\n <div class=\"rev-block\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label\">Actual submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.actualScore !== null\">Score:{{ q.actualScore }}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n <div class=\"rev-block rev-block--revised\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label rev-label--warning\">Revised submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.revised.score !== null\">Score:{{ q.revised.score }}</span>\r\n </div>\r\n <div class=\"answertext answertext--strong\">{{ q.revised.answer || '\u2014' }}</div>\r\n <div class=\"rev-reason-label\">Reason for Change:<span *ngIf=\"q.revised.by\"> \u00B7 {{ q.revised.by }}</span></div>\r\n <div class=\"rev-reason\">{{ q.revised.reason || '\u2014' }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit -->\r\n <div class=\"editpanel\" *ngIf=\"isEditing(q)\">\r\n <div class=\"edit-title\">Select the revised answer</div>\r\n <div class=\"edit-options\" role=\"radiogroup\" [attr.aria-label]=\"'Answer for question ' + q.qno\">\r\n <button type=\"button\" role=\"radio\" class=\"edit-option\" *ngFor=\"let opt of q.options; trackBy: trackByLabel\"\r\n [class.is-on]=\"isDraft(opt)\" [attr.aria-checked]=\"isDraft(opt)\" (click)=\"pickDraft(opt)\">\r\n <span class=\"edit-radio\">\r\n <svg *ngIf=\"isDraft(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"edit-option-label\">{{ opt.label }}</span>\r\n <span class=\"edit-option-flag\" *ngIf=\"opt.flag\">Flags</span>\r\n <span class=\"edit-option-score\" *ngIf=\"opt.score !== null\">Score {{ opt.score }}</span>\r\n <span class=\"edit-option-actual\" *ngIf=\"isActualOption(q, opt)\">Actual answer</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"edit-reason\" *ngIf=\"draftChanged(q)\">\r\n <div class=\"edit-title\">Reason for change <span class=\"req\">*</span></div>\r\n <lib-audit-v2-select class=\"edit-select\" [(ngModel)]=\"draftReason\" [options]=\"reasonOptions\"\r\n placeholder=\"Select a reason\" ariaLabel=\"Reason for change\"></lib-audit-v2-select>\r\n <input *ngIf=\"draftReason === 'Other'\" type=\"text\" class=\"edit-input\" maxlength=\"300\"\r\n placeholder=\"Enter the reason for change\" [(ngModel)]=\"draftOther\">\r\n </div>\r\n <div class=\"edit-hint\" *ngIf=\"!draftChanged(q) && q.revised\">\r\n Saving keeps the store's actual answer and removes the revision.\r\n </div>\r\n\r\n <div class=\"edit-actions\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"!canSave(q)\" (click)=\"saveEdit(q)\">\r\n {{ saving ? 'Saving\u2026' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </article>\r\n\r\n <div class=\"gal-nomatch\" *ngIf=\"!visibleQuestions.length\">\r\n No answers match the question selection. <button type=\"button\" class=\"av2-link\" (click)=\"viewAllAnswers()\">View all answers</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n <!-- Approve bar -->\r\n <div class=\"gal-approve-bar\" *ngIf=\"hasSubmission && !loading\">\r\n <div class=\"approve-status\">\r\n <ng-container *ngIf=\"detail.approvalStatus\">\r\n <span class=\"approve-dot approve-dot--success\"></span>\r\n Approved<ng-container *ngIf=\"detail.approvedBy\"> by <strong>{{ detail.approvedBy }}</strong></ng-container><ng-container *ngIf=\"detail.approvedAt\"> \u00B7 {{ detail.approvedAt }}</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalStatus && detail.approvalEnable\">\r\n <span class=\"approve-dot approve-dot--warning\"></span>\r\n Waiting for approval<ng-container *ngIf=\"revisedCount\"> \u00B7 {{ revisedCount }} {{ revisedCount === 1 ? 'answer' : 'answers' }} revised</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalEnable\">\r\n <span class=\"approve-dot\"></span>\r\n No approval step is set for this audit\r\n </ng-container>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <ng-container *ngIf=\"detail.approvalEnable && !detail.approvalStatus && menuAccess.canEdit\">\r\n <button type=\"button\" class=\"av2-btn gal-approve\" *ngIf=\"!approveConfirm\" (click)=\"requestApprove()\">Approve</button>\r\n <ng-container *ngIf=\"approveConfirm\">\r\n <span class=\"approve-warn\">Approval records the final score and locks further edits.</span>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelApprove()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn gal-approve gal-approve--confirm\" [disabled]=\"approving\" (click)=\"confirmApprove()\">\r\n {{ approving ? 'Approving\u2026' : 'Confirm approval' }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- What the store submitted: answer, proof, captures and remarks. Shared by the plain and the revised views. -->\r\n <ng-template #submitted let-q>\r\n <div class=\"answertext\" *ngIf=\"actualAnswer(q)\">{{ actualAnswer(q) }}</div>\r\n <div class=\"answertext\" *ngIf=\"!actualAnswer(q) && !q.media.length && !q.validationText\">\u2014</div>\r\n <div class=\"prooftext\" *ngIf=\"q.validationText\">Validation Answer: {{ q.validationText }}</div>\r\n <div class=\"gal-media\" *ngIf=\"q.media.length\">\r\n <figure class=\"gal-media-item\" *ngFor=\"let m of q.media; let mi = index\">\r\n <ng-container *ngIf=\"!brokenMedia.has(m.src); else mediaMissing\">\r\n <a *ngIf=\"!m.video\" [href]=\"m.src\" target=\"_blank\" rel=\"noopener\" class=\"gal-media-thumb\" title=\"Open image\">\r\n <img [src]=\"m.src\" [alt]=\"'Answer image ' + (mi + 1)\" loading=\"lazy\" (error)=\"onMediaError(m.src)\">\r\n </a>\r\n <video *ngIf=\"m.video\" [src]=\"m.src\" controls preload=\"metadata\" class=\"gal-media-thumb\" (error)=\"onMediaError(m.src)\"></video>\r\n </ng-container>\r\n <ng-template #mediaMissing>\r\n <a [href]=\"m.src\" target=\"_blank\" rel=\"noopener\" class=\"gal-media-thumb gal-media-thumb--missing\"\r\n [title]=\"(m.video ? 'Video' : 'Image') + ' could not be loaded - open the file'\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <circle cx=\"9\" cy=\"10\" r=\"1.6\"></circle>\r\n <path d=\"M21 16l-5-5-9 9\"></path>\r\n </svg>\r\n <span>Not available</span>\r\n </a>\r\n </ng-template>\r\n <figcaption *ngIf=\"m.caption\">Image {{ mi + 1 }} : {{ m.caption }}</figcaption>\r\n </figure>\r\n </div>\r\n <div class=\"remarktext\" *ngIf=\"q.remark\">{{ labels.remarks }}: {{ q.remark }}</div>\r\n <div class=\"remarktext\" *ngIf=\"q.extraRemark\">{{ labels.additional }}: {{ q.extraRemark }}</div>\r\n </ng-template>\r\n\r\n <!-- Closes the export menu on an outside click -->\r\n <div class=\"menu-backdrop\" *ngIf=\"exportOpen\" (click)=\"exportOpen = false\"></div>\r\n\r\n <!-- Filter drawer -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"countpill\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <!-- Categories -->\r\n <div class=\"drawer-nav\">\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Primary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of primaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Secondary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of secondaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"drawer-pane\">\r\n <div class=\"pane-head\">\r\n <div class=\"panetitle\">{{ activeDef.label }}</div>\r\n <div class=\"panehint\">{{ activeDef.hint }}</div>\r\n </div>\r\n\r\n <!-- Date range -->\r\n <div class=\"pane-scroll pane-fields pane-fields--date\" *ngIf=\"activeDef.kind === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Selected</span>\r\n <span class=\"gal-range-readout\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n {{ rangeLabel }}\r\n </span>\r\n </div>\r\n <!-- Inline calendars: a dropdown inside this scrolling pane opened off to the side and scrolled sideways.\r\n Keyed on fRange so Clear all / reopening rebuilds it on the restored range. -->\r\n <div class=\"av2-datepick av2-datepick--compact gal-inline-picker\" *ngFor=\"let r of [fRange]\">\r\n <ngx-daterangepicker-material *ngIf=\"r\" [startDate]=\"r.startDate\" [endDate]=\"r.endDate\"\r\n [locale]=\"pickerLocale\" [maxDate]=\"today\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\"\r\n [showCancel]=\"false\" (datesUpdated)=\"onRangePicked($event)\"></ngx-daterangepicker-material>\r\n </div>\r\n </div>\r\n\r\n <!-- Score range -->\r\n <div class=\"pane-scroll pane-fields\" *ngIf=\"activeDef.kind === 'score'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">From</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMin\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <span class=\"field-sep\">to</span>\r\n <div class=\"field\">\r\n <span class=\"field-label\">To</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMax\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <span class=\"score-readout\">{{ fScoreMin }}% \u2013 {{ fScoreMax }}%</span>\r\n </div>\r\n\r\n <!-- Option list -->\r\n <div class=\"pane-scroll pane-list\" *ngIf=\"activeDef.kind === 'list'\">\r\n <label class=\"panesearch\" *ngIf=\"activeDef.searchable\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"searchPlaceholder\" [(ngModel)]=\"optionQuery\">\r\n </label>\r\n\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let opt of activeOptions; trackBy: trackByOption\"\r\n [class.option-selected]=\"isSelected(opt)\" (click)=\"pick(opt)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"isSelected(opt)\" [class.mark-multi]=\"activeDef.multi\">\r\n <svg *ngIf=\"isSelected(opt)\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ opt.label }}</span>\r\n <span class=\"optmeta\" *ngIf=\"opt.meta\">{{ opt.meta }}</span>\r\n </span>\r\n </button>\r\n\r\n <div class=\"nomatch\" *ngIf=\"noOptionMatch\">No match for this search.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"clearFilters()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:18px;line-height:26px;font-weight:700;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:13px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat{border-radius:10px;background:linear-gradient(90deg,#f0f7ff,#f8fbff 60%,#fff);box-shadow:inset 0 0 0 1px #d1e9ff;padding:20px 24px;display:flex;align-items:center;gap:16px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:700;color:#101828}.av2-stat-label{font-size:15px;line-height:22px;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #b2ddff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eff8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:15px;line-height:22px;font-weight:600;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:24px;line-height:32px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:40px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:40px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#1570ef;color:#fff}.av2-btn--primary:hover:not(:disabled){background:#175cd3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:40px;padding:0 26px;border:0;border-radius:8px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eff8ff;color:#175cd3;font-weight:600}.av2-badge{display:inline-flex;align-items:center;height:28px;padding:0 12px;border-radius:6px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#1570ef;font-size:13px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#175cd3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px 8px;font-size:12px;line-height:18px;font-weight:600;color:#475467;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:14px 8px;border:0;border-bottom:1px solid #F2F4F7;font-size:13px;line-height:20px;color:#1d2939;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:14px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eff8ff;color:#175cd3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#1570ef}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.audit-gallery{position:relative}.gal-header{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:14px 20px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.gal-heading{display:flex;flex-direction:column;min-width:0}.gal-header-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.gal-header-sub{font-size:12px;line-height:18px;color:#667085}.quickchip{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.quickchip:hover{background:#f9fafb}.quickchip.chip-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #b2ddff;color:#175cd3;font-weight:600}.quickchip.quickchip--strong{padding:0 14px;font-weight:600}.quickchip.quickchip--name{max-width:300px}.quickchip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chip-chev{flex-shrink:0}.countbadge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9999px;background:#1570ef;color:#fff;font-size:11px;font-weight:700}.gal-body{display:flex;gap:16px;align-items:stretch}.gal-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.gal-left-inner{position:sticky;top:16px;max-height:calc(100vh - 32px);overflow:auto;padding:16px;display:flex;flex-direction:column;gap:12px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.gal-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.gal-audit-sub{font-size:11px;line-height:16px;color:#667085}.view-all{border-radius:8px;background:#eff8ff;padding:10px 12px}.view-all-link{padding:0;border:none;background:none;font-family:inherit;font-size:13px;font-weight:600;color:#1570ef;text-decoration:underline;text-underline-offset:2px;cursor:pointer}.view-all-link:hover{color:#175cd3}.gal-sections{display:flex;flex-direction:column;gap:6px}.gal-section{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0;border:none;background:transparent;font-family:inherit;font-size:13px;line-height:20px;font-weight:500;color:#344054;text-align:left;cursor:pointer}.gal-section.is-open{padding:4px 0;font-weight:600;color:#1d2939}.gal-section-name{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gal-section-count{flex:none;min-width:18px;height:18px;padding:0 6px;border-radius:9px;background:#eff8ff;color:#175cd3;font-size:11px;line-height:18px;font-weight:600;text-align:center}.gal-section-rule{flex:1;border-top:1px solid #EAECF0}.gal-section-chev{display:flex;color:#98a2b3}.gal-section-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.gal-section-chev .rotate{transform:rotate(-90deg)}.gal-nav-item{display:flex;align-items:flex-start;gap:8px;width:100%;padding:3px 4px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:12px;line-height:18px;color:#475467;text-align:left;cursor:pointer}.gal-nav-item:hover{background:#f9fafb}.gal-nav-item.is-picked .gal-nav-text{color:#175cd3;font-weight:500}.gal-check{width:14px;height:14px;flex-shrink:0;margin-top:2px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:inline-flex;align-items:center;justify-content:center;color:#fff}.gal-check.is-on{background:#1570ef;box-shadow:none}.gal-nav-text{flex:1}.gal-dot{display:inline-block;width:8px;height:8px;border-radius:9999px;flex-shrink:0;margin-top:5px;background:#d0d5dd}.gal-dot--flag{background:#f04438}.gal-dot--revised{background:#f79009}.gal-nav-empty{padding:4px;font-size:12px;line-height:18px;color:#667085}.gal-main{flex:1;min-width:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px;display:flex;flex-direction:column;gap:16px}.gal-toolbar{display:flex;align-items:center;gap:10px;min-height:36px}.gal-pager{display:inline-flex;align-items:center;gap:4px;height:36px;padding:0 4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd}.gal-pager-btn{width:28px;height:28px;border:none;border-radius:6px;background:transparent;color:#344054;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-pager-btn:hover:not(:disabled){background:#f2f4f7;color:#1570ef}.gal-pager-btn:disabled{opacity:.35;cursor:default}.gal-pager-label{padding:0 6px;font-size:13px;color:#475467;white-space:nowrap}.gal-pager-label strong{font-weight:600;color:#101828}.status-pill{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.status-pill--warning{background:#fffaeb;color:#b54708}.export-wrap{position:relative}.gal-export{padding:0 16px;font-size:14px;font-weight:600;box-shadow:0 1px 2px #1018280d}.export-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:30;width:300px;max-height:min(520px,75vh);overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 24px -6px #10182829;display:flex;flex-direction:column;gap:2px;animation:gal-pop .12s cubic-bezier(.4,0,.2,1)}.export-item{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;border-radius:6px;background:transparent;font-family:inherit;text-align:left;cursor:pointer}.export-item:hover:not(:disabled){background:#f9fafb}.export-item:disabled{opacity:.45;cursor:not-allowed}.export-title{font-size:13px;font-weight:600;color:#101828}.export-meta{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.export-foot{padding:6px 12px 4px;border-top:1px solid #F2F4F7;margin-top:2px;font-size:11px;color:#98a2b3}.export-group{padding:8px 12px 4px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:#98a2b3}.export-group+.export-item{margin-top:0}.export-group:not(:first-child){margin-top:4px;border-top:1px solid #F2F4F7;padding-top:10px}.menu-backdrop{position:fixed;inset:0;z-index:20}.gal-skeleton{display:flex;flex-direction:column;gap:12px}.sk{border-radius:8px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.sk-logo{width:64px;height:64px;align-self:center}.sk-facts{height:116px}.sk-card{height:96px}.sk-card--short{height:64px;opacity:.6}.gal-state{padding:48px 24px;display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}.gal-state-icon{width:56px;height:56px;border-radius:9999px;background:#eff8ff;box-shadow:0 0 0 8px #f5faff;color:#1570ef;display:inline-flex;align-items:center;justify-content:center;margin-bottom:8px}.gal-state-icon--error{background:#fef3f2;box-shadow:0 0 0 8px #fffbfa;color:#d92d20}.gal-state-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.gal-state-sub{max-width:440px;font-size:14px;line-height:20px;color:#667085;margin-bottom:6px}.gal-state-sub strong{font-weight:600;color:#344054}.gal-brand{display:flex;justify-content:center}.gal-brand-box{width:64px;height:64px;padding:4px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;align-items:center;justify-content:center;overflow:hidden;font-size:11px;line-height:14px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;text-align:center;overflow-wrap:anywhere;color:#667085}.gal-brand-box img{max-width:100%;max-height:100%;object-fit:contain;display:block}.gal-facts{margin:0;display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:6px 32px;font-size:13px;line-height:20px}.gal-fact{display:grid;grid-template-columns:136px minmax(0,1fr);column-gap:8px;min-width:0}.gal-fact dt{font-weight:600;color:#101828;white-space:nowrap}.gal-fact dd{margin:0;min-width:0;color:#344054;overflow-wrap:anywhere}.gal-fact--side{grid-template-columns:136px minmax(0,1fr)}.gal-fact-sub{margin-left:6px;color:#98a2b3}.gal-result{font-weight:600;color:#027a48}.gal-result.is-fail{color:#d92d20}.gal-answers{display:flex;flex-direction:column;gap:12px}.answerbox{position:relative;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px 20px;display:flex;flex-direction:column;gap:12px;background:#fff;animation:gal-rise .22s cubic-bezier(.4,0,.2,1) both;transition:box-shadow .15s cubic-bezier(.4,0,.2,1)}.answerbox.is-flagged:before{content:\"\";position:absolute;left:0;top:14px;bottom:14px;width:3px;border-radius:0 3px 3px 0;background:#f04438}.answerbox.is-editing{box-shadow:inset 0 0 0 1.5px #84caff,0 0 0 4px #eff8ff}.answerbox-head{display:flex;align-items:flex-start;gap:12px}.qtext{flex:1;min-width:0;font-size:14px;line-height:20px;font-weight:600;color:#101828}.qsection{display:block;margin-bottom:2px;font-size:12px;line-height:18px;font-weight:500;color:#667085}.gal-tag{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:16px;font-weight:600;flex-shrink:0;white-space:nowrap}.gal-tag--warning{color:#b54708;background:#fffaeb}.gal-tag--error{color:#d92d20;background:#fef3f2}.gal-tag--gray{color:#475467;background:#f2f4f7}.scorechip{background:#f2f4f7;border-radius:6px;padding:2px 8px;font-size:12px;line-height:18px;font-weight:500;color:#344054;flex-shrink:0;white-space:nowrap;font-variant-numeric:tabular-nums}.editicon{width:28px;height:28px;flex-shrink:0;margin-top:-4px;border:none;border-radius:6px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),color .15s cubic-bezier(.4,0,.2,1)}.editicon:hover{background:#f2f4f7;color:#1570ef}.editicon.is-locked{color:#d0d5dd;cursor:not-allowed}.editicon.is-locked:hover{background:transparent;color:#98a2b3}.answerbox-body{display:flex;flex-direction:column;gap:4px}.answertext{font-size:14px;line-height:20px;font-style:italic;color:#1d2939}.answertext--strong{font-weight:600;color:#101828}.prooftext{font-size:13px;line-height:18px;color:#475467}.remarktext{font-size:13px;line-height:18px;font-style:italic;color:#667085}.gal-media{display:flex;flex-wrap:wrap;gap:10px;margin:6px 0 2px}.gal-media-item{width:120px;margin:0;display:flex;flex-direction:column;gap:4px}.gal-media-item figcaption{font-size:12px;line-height:16px;color:#475467;overflow-wrap:anywhere}.gal-media-thumb{display:block;width:120px;height:90px;border-radius:8px;overflow:hidden;background:#f2f4f7;box-shadow:inset 0 0 0 1px #eaecf0;object-fit:cover;transition:transform .15s cubic-bezier(.4,0,.2,1),box-shadow .15s cubic-bezier(.4,0,.2,1)}.gal-media-thumb img{width:100%;height:100%;object-fit:cover;display:block}.gal-media-thumb:hover{transform:translateY(-1px);box-shadow:inset 0 0 0 1px #d0d5dd,0 4px 10px -2px #1018281f}.gal-media-thumb--missing{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:11px;color:#98a2b3;text-decoration:none}.gal-media-thumb--missing:hover{color:#667085}.revision{display:flex;flex-direction:column;gap:10px}.rev-block{min-width:0;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:6px}.rev-block--revised{background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89}.rev-head{display:flex;align-items:center;gap:8px}.rev-label{font-size:11px;line-height:16px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#667085}.rev-label--warning{padding:2px 8px;border-radius:9999px;background:#fffaeb;color:#dc6803}.rev-reason-label{font-size:12px;line-height:18px;color:#475467}.rev-reason{border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;padding:10px 12px;font-size:13px;line-height:18px;color:#1570ef}.editpanel{border-radius:8px;background:#fcfcfd;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px;display:flex;flex-direction:column;gap:12px;animation:gal-rise .16s cubic-bezier(.4,0,.2,1) both}.edit-title{font-size:12px;line-height:18px;font-weight:600;color:#475467}.edit-title .req{color:#f04438}.edit-options{display:flex;flex-direction:column;gap:8px}.edit-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;text-align:left;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),box-shadow .15s cubic-bezier(.4,0,.2,1)}.edit-option:hover{box-shadow:inset 0 0 0 1px #d0d5dd}.edit-option.is-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #84caff}.edit-option.is-on .edit-option-label{font-weight:600;color:#101828}.edit-option.is-on .edit-radio{background:#1570ef;box-shadow:none}.edit-radio{width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1.5px #d0d5dd;color:#fff;display:inline-flex;align-items:center;justify-content:center}.edit-option-label{flex:1;min-width:0;font-size:14px;line-height:20px;color:#344054}.edit-option-flag{font-size:11px;font-weight:600;color:#d92d20}.edit-option-score{font-size:12px;color:#667085;white-space:nowrap}.edit-option-actual{font-size:11px;font-weight:500;color:#667085;background:#f2f4f7;border-radius:9999px;padding:2px 8px;white-space:nowrap;flex-shrink:0}.edit-reason{display:flex;flex-direction:column;gap:6px}.edit-input{height:40px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#344054;outline:none}.edit-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.edit-select{display:block}.edit-hint{font-size:12px;color:#667085}.edit-actions{display:flex;justify-content:flex-end;gap:8px}.gal-nomatch{padding:20px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px;color:#667085;text-align:center}.gal-nomatch .av2-link{border:none;background:none;padding:0;font-family:inherit}.gal-approve-bar{position:sticky;bottom:0;z-index:10;background:#fff;box-shadow:0 -4px 10px #0000000a,inset 0 0 0 1px #eaecf0;border-radius:8px;padding:12px 24px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}.approve-status{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:#475467}.approve-status strong{font-weight:600;color:#1d2939}.approve-dot{width:8px;height:8px;border-radius:9999px;background:#d0d5dd}.approve-dot--success{background:#12b76a}.approve-dot--warning{background:#f79009}.approve-warn{font-size:12px;color:#b54708}.gal-approve{height:40px;padding:0 20px;background:#1570ef;color:#fff;box-shadow:0 1px 2px #1018280d}.gal-approve:hover:not(:disabled){background:#175cd3}.gal-approve--confirm{background:#039855}.gal-approve--confirm:hover:not(:disabled){background:#027a48}@keyframes gal-rise{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes gal-pop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.answerbox,.editpanel,.export-menu,.sk{animation:none}}@media (max-width: 1200px){.gal-facts{grid-template-columns:minmax(0,1fr)}.gal-fact--side dt{min-width:130px}}@media (max-width: 900px){.gal-body{flex-direction:column;align-items:stretch}.gal-left{width:100%}.gal-left-inner{position:static;max-height:none}.gal-main{padding:16px}.gal-fact dt,.gal-fact--side dt{min-width:110px}}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:760px;max-width:94vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.countpill{min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{width:270px;flex-shrink:0;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow:auto;padding:8px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.drawer-nav::-webkit-scrollbar{width:6px}.drawer-nav::-webkit-scrollbar-thumb{border-radius:3px;background:#d0d5dd}.drawer-group{display:flex;flex-direction:column;gap:2px;padding-bottom:10px}.grouplabel{padding:10px 12px 6px;font-size:11px;line-height:16px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#667085}.drawer-navitem{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column}.navtitle{font-size:13px;line-height:18px;font-weight:600;color:#1d2939}.navvalue{font-size:12px;line-height:18px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#175cd3}.dirtydot{width:7px;height:7px;border-radius:9999px;background:#1570ef;flex-shrink:0}.navchev{color:#98a2b3;flex-shrink:0}.drawer-pane{flex:1;min-width:0;display:flex;flex-direction:column}.pane-head{padding:16px 20px 10px;display:flex;flex-direction:column;gap:4px}.panetitle{font-size:15px;line-height:22px;font-weight:700;color:#101828}.panehint{font-size:12px;line-height:18px;color:#667085}.pane-scroll{flex:1;overflow:auto}.pane-fields{padding:6px 20px 16px;display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap}.pane-fields--date{flex-direction:column;align-items:flex-start;align-content:flex-start}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:12px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eff8ff;color:#1570ef;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eff8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.gal-range-readout{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fcfcfd;font-size:14px;font-weight:600;color:#101828}.gal-range-readout svg{color:#667085}.gal-inline-picker{max-width:100%}:host ::ng-deep .gal-inline-picker .md-drppicker.inline{margin-top:0;box-shadow:inset 0 0 0 1px #eaecf0}.field{display:flex;flex-direction:column;gap:6px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-box{display:flex;align-items:center;gap:6px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff}.field-box input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.field-box.field-box--num{width:120px}.field-box:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.field-unit{font-size:14px;color:#667085}.field-sep{height:40px;display:flex;align-items:center;color:#98a2b3;font-size:14px}.score-readout{height:40px;display:inline-flex;align-items:center;padding:0 12px;border-radius:8px;background:#eff8ff;color:#175cd3;font-size:13px;font-weight:700;white-space:nowrap}.pane-list{padding:0 12px 16px;display:flex;flex-direction:column;gap:2px}.panesearch{display:flex;align-items:center;gap:8px;height:38px;margin:0 0 8px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;flex-shrink:0}.panesearch input{flex:1;min-width:0;height:36px;border:none;outline:none;background:transparent;font-family:inherit;font-size:13px;color:#101828}.panesearch input::placeholder{color:#98a2b3}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eff8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-multi{border-radius:5px}.optionmark.mark-on{background:#1570ef;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.nomatch{padding:18px 12px;font-size:13px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #101828;--bs-tooltip-color: #fff;--bs-tooltip-max-width: 260px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#101828!important;color:#fff!important;padding:8px 12px;border-radius:8px;font-size:12px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}\n"] }]
|
|
1532
|
-
}], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i0.ChangeDetectorRef }, { type: i3.ActivatedRoute }, { type: i4.ToastService }, { type: i4.AuthService }, { type: i5.NgbModal }]
|
|
1533
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2dhbGxlcnkvYXVkaXQtdjItZ2FsbGVyeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2dhbGxlcnkvYXVkaXQtdjItZ2FsbGVyeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFxQixhQUFhLEVBQWUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJaEosT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7Ozs7Ozs7Ozs7QUF1SXZGLG1GQUFtRjtBQUNuRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckIsb0VBQW9FO0FBQ3BFLE1BQU0sWUFBWSxHQUFtQjtJQUNuQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzFDLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxh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QUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQWtCLENBQUMsRUFDckYsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFtQixDQUFDLENBQUMsQ0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFRCwwR0FBMEc7SUFDbEcsVUFBVSxDQUFDLElBQWlCO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO2FBQzVFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUMxRCxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxJQUFJLEVBQUU7Z0JBQUUsSUFBSSxFQUFFLENBQUM7YUFBRTtRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBa0I7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUNqQyxnRkFBZ0Y7UUFDaEYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQy9ELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGVBQWU7SUFDZiw4RUFBOEU7SUFFOUUsMEVBQTBFO0lBQ2xFLFlBQVk7UUFDbEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtZQUMzQixzRkFBc0Y7WUFDdEYsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFBRTtZQUMxRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdkUsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2YsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1SCxxRkFBcUY7Z0JBQ3JGLGtGQUFrRjtnQkFDbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQy9FLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNuRSxDQUFDO1NBQ0g7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0YsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLFdBQVc7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuRSxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHO2dCQUNsQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQ2hDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLFFBQVE7Z0JBQzlDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHO2dCQUN0QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ3ZCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixVQUFVLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssSUFBSSxLQUFLO2dCQUM1RSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN0QyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsRUFBRTtnQkFDVixhQUFhLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLO2FBQ3JELENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztpQkFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUMxRCxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFBRSxPQUFPO2lCQUFFO2dCQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUMzRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsTUFBYyxFQUFFLEtBQWE7UUFDbEQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDO1lBQzFDLEdBQUcsSUFBSSxDQUFDLFlBQVk7WUFDcEIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUN0RCxTQUFTLEVBQUUsRUFBRTtZQUNiLE1BQU07WUFDTixLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDJDQUEyQztJQUNuQyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUUsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQUUsT0FBTztpQkFBRTtnQkFDckMsa0RBQWtEO2dCQUNsRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLElBQUksRUFBRTtvQkFDUixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxFQUFFLENBQUM7aUJBQ3RGO2dCQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFBRSxPQUFPO2lCQUFFO2dCQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsU0FBUyxHQUFHLHdDQUF3QyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sY0FBYyxDQUFDLE1BQVc7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUNqRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQzVDLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFDN0IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxHQUFHO1lBQ25ELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRztZQUN0RSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSztZQUMzQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsSUFBSSxFQUFFO1lBQ3hELGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUM3RCxZQUFZLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU07WUFDOUQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDNUMsZUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUMvQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEdBQUc7WUFDdEQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFO1lBQzlDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUc7WUFDOUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUc7WUFDM0MsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTtZQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHO1lBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxJQUFJLFFBQVE7WUFDeEMsY0FBYyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYztZQUNyQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3JDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUU7WUFDckMsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFO1NBQzNDLENBQUM7UUFDRixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE9BQU87WUFDTCxZQUFZLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEdBQUc7WUFDeEYsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsb0JBQW9CLElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUk7WUFDNUksV0FBVyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDekYsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUU7U0FDN0UsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssWUFBWSxDQUFDLE1BQVc7UUFDOUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQztRQUN0RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1NBQUU7UUFDL0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEgsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFXO1FBQzVCLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVztZQUNuQixTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUM3QyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO2dCQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUN6QixPQUFPLEVBQUUsQ0FBQyxDQUFDLFdBQVc7Z0JBQ3RCLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7YUFDdkMsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQWUsRUFBRSxDQUFNO1FBQ25DLE1BQU0sS0FBSyxHQUFVLENBQUMsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQ3hDLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBa0IsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUMvQixvR0FBb0c7UUFDcEcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFTLEVBQUUsS0FBYyxFQUFFLE1BQVksRUFBRSxPQUFhLEVBQUUsRUFBRTtZQUNyRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFHLElBQUksR0FBRyxFQUFFO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUFFO1FBQ3hFLENBQUMsQ0FBQztRQUNGLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUN2QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3pHLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLFFBQVEsRUFBRTtnQkFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3pFO2lCQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7Z0JBQ3pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0Qsb0dBQW9HO1lBQ3BHLElBQUksQ0FBQyxDQUFDLGdCQUFnQixFQUFFO2dCQUN0QixJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssZUFBZSxFQUFFO29CQUN4QyxHQUFHLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUMvRDtxQkFBTSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssZUFBZSxFQUFFO29CQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMvQjtxQkFBTTtvQkFDTCxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2lCQUM1QzthQUNGO1lBQ0QsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2FBQzlDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ25JLE1BQU0sQ0FBQyxDQUFDLENBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUVwSCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDeEgsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsV0FBVztZQUN6QixDQUFDLENBQUM7Z0JBQ0EsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbkcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7YUFDcEM7WUFDRCxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsNEZBQTRGO1FBQzVGLE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hHLDZGQUE2RjtRQUM3RiwrQkFBK0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUU5RSxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDdkMsT0FBTztZQUNQLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDeEIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxFQUFFO1lBQzlCLE9BQU87WUFDUCxLQUFLO1lBQ0wsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDbEQsY0FBYyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUU7WUFDdkIsV0FBVyxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxFQUFFO1lBQ3ZDLFdBQVc7WUFDWCxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDdEQsT0FBTztZQUNQLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDZCxPQUFPO1lBQ1AsT0FBTztZQUNQLFFBQVEsRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7U0FDdkUsQ0FBQztJQUNKLENBQUM7SUFFRCxpRkFBaUY7SUFDekUsUUFBUSxDQUFDLElBQVMsRUFBRSxHQUFXO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFDdEIsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsMkdBQTJHO0lBQ25HLGFBQWEsQ0FBQyxDQUFNO1FBQzFCLElBQUksQ0FBQyxFQUFFLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxFQUFFLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxPQUFPLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztTQUFFO1FBQ2xHLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQVc7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxXQUFXLENBQUMsT0FBZSxFQUFFLEtBQWE7UUFDaEQsT0FBTyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFTO1FBQ3JCLE9BQU8sTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTyxHQUFHLENBQUMsQ0FBTTtRQUNoQixPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxTQUFTO0lBQ1QsOEVBQThFO0lBRTlFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDNUUsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzFELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDOUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzlCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxhQUFhO0lBQ2IsOEVBQThFO0lBRTlFLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxhQUFhLENBQUMsQ0FBUztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsQ0FBZ0I7UUFDakMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGNBQWMsQ0FBQyxDQUFnQjtRQUM3Qix1RUFBdUU7UUFDdkUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxhQUFhLENBQUMsQ0FBZTtRQUMzQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsY0FBYztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxTQUFTLENBQUMsQ0FBZ0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxTQUFTLENBQUMsQ0FBZ0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELGNBQWMsQ0FBQyxDQUFTLEVBQUUsQ0FBZTtRQUN2QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxnQkFBZ0I7SUFDaEIsOEVBQThFO0lBRTlFLGlFQUFpRTtJQUNqRSxJQUFJLFVBQVU7UUFDWixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMvRSxNQUFNLElBQUksR0FBZ0I7WUFDeEI7Z0JBQ0UsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxvREFBb0Q7Z0JBQ3JGLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJO2dCQUM5RCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLENBQUM7YUFDeEQ7WUFDRDtnQkFDRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLCtDQUErQztnQkFDcEYsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUk7Z0JBQzdELDZEQUE2RDtnQkFDN0QsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTztnQkFDN0IsT0FBTyxFQUFFO29CQUNQLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtvQkFDN0UsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztpQkFDeEc7YUFDRjtZQUNEO2dCQUNFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsMENBQTBDO2dCQUNwRixLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSTtnQkFDOUQsT0FBTyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3JEO1lBQ0Q7Z0JBQ0Usd0RBQXdEO2dCQUN4RCxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsSUFBSTtnQkFDckQsSUFBSSxFQUFFLGtFQUFrRSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSTtnQkFDcEcsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTO2dCQUM1QyxPQUFPLEVBQUU7b0JBQ1AsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRTtvQkFDL0MsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSx1Q0FBdUMsRUFBRTtvQkFDaEUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxpQ0FBaUMsRUFBRTtpQkFDM0Q7YUFDRjtZQUNEO2dCQUNFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxJQUFJO2dCQUNsRCxJQUFJLEVBQUUsd0VBQXdFO2dCQUM5RSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTthQUMzRDtZQUNEO2dCQUNFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUseURBQXlEO2dCQUNoRyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTthQUMxRDtZQUNEO2dCQUNFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSx1Q0FBdUM7Z0JBQ3RGLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJO2dCQUNoRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM3QixLQUFLLEVBQUUsQ0FBQyxDQUFDLGFBQWE7b0JBQ3RCLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRztvQkFDWixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDaEUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDekQsQ0FBQyxDQUFDO2FBQ0o7WUFDRDtnQkFDRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsd0NBQXdDO2dCQUN0RixLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVc7Z0JBQzlDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVU7b0JBQ2pDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsMENBQTBDLEVBQUUsQ0FBQztvQkFDM0UsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRSxDQUFDO2FBQ3RFO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxjQUFjO2dCQUNyRixJQUFJLEVBQUUsa0NBQWtDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTTtnQkFDbkUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSTtnQkFDcEMsT0FBTyxFQUFFO29CQUNQLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtvQkFDN0csR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQzthQUNGO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLG1DQUFtQztnQkFDakYsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXO2dCQUM5QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQzthQUM5RTtZQUNEO2dCQUNFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSwyQ0FBMkM7Z0JBQ3pGLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVztnQkFDN0MsT0FBTyxFQUFFO29CQUNQLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRTtvQkFDbkUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRTtvQkFDL0MsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTtpQkFDM0M7YUFDRjtTQUNGLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLElBQUksYUFBYTtRQUNmLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7U0FBRTtRQUMxQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUN2QyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELFVBQVUsQ0FBQyxFQUFVO1FBQ25CLFFBQVEsRUFBRSxFQUFFO1lBQ1YsS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDL0IsS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDO1lBQzlDLEtBQUssUUFBUSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ25DLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3BDLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2pDLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTtvQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFdBQVc7b0JBQ3JDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xFLEtBQUssUUFBUSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDN0YsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDbkMsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDbkMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHO29CQUNuRCxDQUFDLENBQUMsWUFBWTtvQkFDZCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDckQsS0FBSyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQzFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxPQUFPLENBQUMsRUFBVTtRQUNoQixRQUFRLEVBQUUsRUFBRTtZQUNWLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakQsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN2RCxLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNwQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELEtBQUssUUFBUSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDOUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN2RCxLQUFLLFFBQVEsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3ZELEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQztZQUNwRSxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNoRSxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQy9ELENBQUMsQ0FBQztRQUNGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFFLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztTQUN4STtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU8sWUFBWSxDQUFDO1NBQUU7UUFDbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RSxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQVc7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1NBQUU7UUFDM0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLGVBQWU7UUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxjQUFjLENBQUMsRUFBVTtRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGFBQWEsQ0FBQyxDQUFxQjtRQUNqQyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU87U0FBRTtRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUFFO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQUU7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLDBGQUEwRjtRQUMxRixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxJQUFJLGNBQWMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUFFO0lBQ3ZHLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtZQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUFFO0lBQ3hELENBQUM7SUFFTyxPQUFPO1FBQ2IsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNuRyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDMUUsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3hFLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUMvRSxDQUFDO0lBQ0osQ0FBQztJQUVPLE9BQU8sQ0FBQyxDQUEwQjtRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQVcsQ0FBQztRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQVcsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQVcsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQWEsQ0FBQztRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQWEsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQWEsQ0FBQztRQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQVcsQ0FBQztJQUM1QyxDQUFDO0lBRU8sT0FBTyxDQUFDLEdBQWlCO1FBQy9CLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsVUFBVSxDQUFDLEdBQWlCO1FBQzFCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUNiLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1NBQzNFO1FBQ0QsUUFBUSxFQUFFLEVBQUU7WUFDVixLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQzdDLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEQsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNqRCxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQy9DLEtBQUssUUFBUSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDakQsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNqRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELEtBQUssUUFBUSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0QsS0FBSyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFTyxPQUFPLENBQUMsRUFBVTtRQUN4QixJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7U0FBRTtRQUNoRCxJQUFJLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7U0FBRTtRQUM3QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxJQUFJLENBQUMsR0FBaUI7UUFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFFN0IsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ2IsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN0RSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO2dCQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO29CQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFBRTthQUN2RDtpQkFBTSxJQUFJLEVBQUUsS0FBSyxRQUFRLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2FBQ3ZCO1lBQ0QsT0FBTztTQUNSO1FBRUQsUUFBUSxFQUFFLEVBQUU7WUFDVixLQUFLLE1BQU07Z0JBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFDLE1BQU07WUFDM0MsS0FBSyxNQUFNLENBQUMsQ0FBQztnQkFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLEtBQUssRUFBRTtvQkFDVCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO3dCQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztxQkFBRTtpQkFDdEY7Z0JBQ0QsTUFBTTthQUNQO1lBQ0QsS0FBSyxRQUFRO2dCQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFBQyxNQUFNO1lBQy9DLEtBQUssT0FBTyxDQUFDLENBQUMsTUFBTTtZQUNwQixLQUFLLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFDLE1BQU07WUFDL0MsS0FBSyxRQUFRO2dCQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFBQyxNQUFNO1lBQy9DLEtBQUssU0FBUztnQkFDWixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7b0JBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2lCQUFFO2dCQUN0RCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ2xGLEtBQUssT0FBTztnQkFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtTQUN4RTtJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsSUFBYyxFQUFFLEtBQWE7UUFDMUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsUUFBUTtJQUNSLDhFQUE4RTtJQUU5RSxxQ0FBcUM7SUFDckMsWUFBWSxDQUFDLENBQVk7UUFDdkIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsNEhBQTRIO0lBQzVILElBQUksaUJBQWlCO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztTQUFFO1FBQ2pGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDNUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixvRkFBb0Y7UUFDcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVk7WUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQztZQUNqRCxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDYixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLCtCQUErQjtJQUMvQiw4RUFBOEU7SUFFOUUsc0VBQXNFO0lBQ3RFLElBQUksaUJBQWlCO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQUUsT0FBTyx3QkFBd0IsQ0FBQztTQUFFO1FBQzdELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7WUFBRSxPQUFPLGlFQUFpRSxDQUFDO1NBQUU7UUFDN0csSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFBRSxPQUFPLGdEQUFnRCxDQUFDO1NBQUU7UUFDakcsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLDZCQUE2QixDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFZO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLENBQUMsQ0FBWTtRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDdkMsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFpQjtRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFpQjtRQUN2QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsRixDQUFDO0lBRUQsY0FBYyxDQUFDLENBQVksRUFBRSxHQUFpQjtRQUM1QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0RixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLFlBQVksQ0FBQyxDQUFZO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdGLENBQUM7SUFFRCxJQUFZLFdBQVc7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUNsRixDQUFDO0lBRUQsT0FBTyxDQUFDLENBQVk7UUFDbEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7UUFDdkQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLHVGQUF1RjtRQUN2RixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQ3JILE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVEsQ0FBQyxDQUFZO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDO1lBQ2xDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQ3RDLFdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTztZQUN0QixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUc7WUFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDeEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztTQUMxQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO29CQUN0RCxPQUFPO2lCQUNSO2dCQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUc7b0JBQ1osR0FBRyxJQUFJLENBQUMsTUFBTTtvQkFDZCxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDaEQsZUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWU7aUJBQ25GLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7Z0JBQy9ILElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUdBQWlHO0lBQ3pGLG1CQUFtQixDQUFDLENBQVksRUFBRSxRQUFhO1FBQ3JELE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRyxNQUFNLElBQUksR0FBVSxPQUFPLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUM3QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztTQUFFO1FBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUU7WUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztTQUN6RTtJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsR0FBUSxFQUFFLFFBQWdCO1FBQzFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxLQUFLLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0csT0FBTyxJQUFJLElBQUksUUFBUSxDQUFDO0lBQzFCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsMEZBQTBGO0lBQzFGLDhFQUE4RTtJQUU5RSxjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNqRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVELGNBQWM7UUFDWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDO1lBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFDM0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzVDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsR0FBRztZQUM3QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDeEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksZ0JBQWdCLENBQUMsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNqQjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2lCQUN6RTtnQkFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLDhCQUE4QixDQUFDLENBQUMsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLHVEQUF1RDtJQUN2RCw4RUFBOEU7SUFFOUUsWUFBWTtRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDN0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNwRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQVUsRUFBRSxDQUFDO1FBQzFCLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzlFLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNqQixNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO29CQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFO3dCQUNwRCxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNoQixPQUFPO3FCQUNSO29CQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTt3QkFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsQ0FBQztxQkFDdEQ7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDMUQsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsRUFBRTs0QkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLG1EQUFtRCxDQUFDLENBQUM7eUJBQzdJO3FCQUNGO29CQUNELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtvQkFDVixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztvQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUNGLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsMkdBQTJHO0lBQzNHLHVHQUF1RztJQUN2Ryw4RUFBOEU7SUFDOUUsOEVBQThFO0lBRTlFLDBHQUEwRztJQUNsRyx3QkFBd0I7UUFDOUIsTUFBTSxHQUFHLEdBQThFLEVBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdEk7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGdIQUFnSDtJQUN4RyxlQUFlLENBQUMsUUFBZ0I7UUFDdEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDbEMsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsSUFBSSxFQUFFO1lBQ2pELFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNoQyxRQUFRO1lBQ1IsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDMUQsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQzVCLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtZQUNuQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQzFDLFVBQVUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSztZQUNwQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUs7WUFDMUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUN6QixXQUFXLEVBQUUsT0FBTztTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FDeEIsb0xBQW9MLENBQ3JMLENBQUM7SUFDSixDQUFDO0lBRUQscUVBQXFFO0lBQzdELGFBQWE7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNsSSxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1lBQzlFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsVUFBVSxDQUFDLFFBQXVCO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUMvQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3RyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7b0JBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7aUJBQUU7cUJBQU07b0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7aUJBQUU7Z0JBQ3ZKLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsUUFBNEI7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDckUsSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0YsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsMENBQTBDLENBQUMsQ0FBQztnQkFBQyxPQUFPO2FBQUU7WUFDL0csSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsMENBQTBDLENBQUMsQ0FBQztnQkFBQyxPQUFPO2FBQUU7U0FDL0c7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUNsRCxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxxQkFBcUI7U0FDckcsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbkMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDL0MsR0FBRyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQzlCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUFFO2lCQUNwRCxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsQ0FBQzthQUFFO1FBQzFGLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBbUIsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUFjLEVBQUUsSUFBWTtRQUM5QyxNQUFNLE9BQU8sR0FBVSxFQUFFLENBQUM7UUFDMUIsTUFBTSxPQUFPLEdBQVUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEdBQWdCLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUN6RSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNoRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RSw2RkFBNkY7WUFDN0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDaEgsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWCxHQUFHLElBQUk7Z0JBQ1AsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDL0UsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUs7Z0JBQ3pDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUU7Z0JBQy9CLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUU7Z0JBQzdCLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixTQUFTLEVBQUUsS0FBSztnQkFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTTtnQkFDN0Msc0JBQXNCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzNDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUMzRixVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO2FBQzlKLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUM3QixHQUFHLElBQUk7Z0JBQ1AsU0FBUyxFQUFFLENBQUMsQ0FBQyxPQUFPO2dCQUNwQixNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUc7Z0JBQ2IsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNsQixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxjQUFjO2dCQUNyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxFQUFFO2dCQUM1QixTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNuQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxFQUFFO2dCQUN6QyxlQUFlLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekQsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksRUFBRTtnQkFDNUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUU7Z0JBQ2pDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTTtnQkFDL0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXO2dCQUN2QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUM1QixRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxTQUFTLENBQUMsQ0FBUyxFQUFFLENBQWtCO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxhQUFhLENBQUMsQ0FBUyxFQUFFLEdBQWlCO1FBQ3hDLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUyxFQUFFLEdBQWM7UUFDbEMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxZQUFZLENBQUMsQ0FBUyxFQUFFLENBQW9CO1FBQzFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNqQixDQUFDO3dHQWo4Q1UsdUJBQXVCOzRGQUF2Qix1QkFBdUIsNERDOU1wQyxxd2pDQThpQkE7OzRGRGhXYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZvcmtKb2luLCBvZiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQXVkaXRBY2Nlc3MsIGF1ZGl0QWNjZXNzIH0gZnJvbSAnLi4vYXVkaXQtdjItYWNjZXNzJztcclxuaW1wb3J0IHsgSW5saW5lUGlja2VyUmFuZ2UsIFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBmcm9tUGlja2VyUmFuZ2UsIGlubGluZVBpY2tlclRvZGF5LCB0b0lubGluZVBpY2tlclJhbmdlIH0gZnJvbSAnLi4vYXVkaXQtdjItZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSwgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEV4cG9ydEdhbGxlcnlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9leHBvcnQtZ2FsbGVyeS9leHBvcnQtZ2FsbGVyeS5jb21wb25lbnQnO1xyXG5cclxuLyoqIEEgcXVlc3Rpb24gaW4gdGhlIGxlZnQgcGFuZWwsIGZyb20gL2F1ZGl0L2dhbGxlcnkvcXVlc3Rpb25zLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0UXVlc3Rpb24ge1xyXG4gIC8qKiBzZWN0aW9uICsgcXVlc3Rpb24gdGV4dDsgcW5vIGlzIG5vdCB1bmlxdWUgYWNyb3NzIHNlY3Rpb25zLiAqL1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIHFubzogc3RyaW5nO1xyXG4gIHRleHQ6IHN0cmluZztcclxuICBzZWN0aW9uOiBzdHJpbmc7XHJcbiAgLyoqIFNlbnQgd2l0aCB0aGUgc2VsZWN0ZWQgcXVlc3Rpb25zIHRvIHRoZSBkb3dubG9hZCBzZXJ2aWNlIChhcyB0aGUgdjEgZ2FsbGVyeSBkb2VzKS4gKi9cclxuICBhbnN3ZXJUeXBlOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBPbmUgbGVmdC1wYW5lbCBhY2NvcmRpb24gZ3JvdXAuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRTZWN0aW9uIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgcXVlc3Rpb25zOiBBdWRpdFF1ZXN0aW9uW107XHJcbn1cclxuXHJcbi8qKiBBIGNvbmZpZ3VyZWQgb3B0aW9uIG9mIGEgc2luZ2xlLWNob2ljZSBxdWVzdGlvbiAtIHdoYXQgYW4gZWRpdCBjYW4gc3dpdGNoIHRoZSBhbnN3ZXIgdG8uICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQW5zd2VyT3B0aW9uIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBudWxsIGZvciBhIHF1ZXN0aW9uIHdpdGhvdXQgY29tcGxpYW5jZSBzY29yaW5nLiAqL1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIGZsYWc6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKiBBIHBob3RvIG9yIHZpZGVvIGNhcHR1cmVkIHdpdGggYW4gYW5zd2VyLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFuc3dlck1lZGlhIHtcclxuICBzcmM6IHN0cmluZztcclxuICB2aWRlbzogYm9vbGVhbjtcclxuICAvKiogUGVyLWltYWdlIGRlc2NyaXB0aW9uIChDYXB0dXJlIE11bHRpcGxlIEltYWdlLCBcImRlc2NyaXB0aW9uIHBlciBpbWFnZVwiKTsgJycgd2hlbiBub25lLiAqL1xyXG4gIGNhcHRpb246IHN0cmluZztcclxufVxyXG5cclxuLyoqIE9uZSBhbnN3ZXJlZCBxdWVzdGlvbiBvZiB0aGUgc3VibWlzc2lvbiBvbiB0aGUgcmlnaHQsIGZyb20gL2F1ZGl0L2dhbGxlcnkvYW5zd2Vycy4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBbnN3ZXJSb3cge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIHNlY3Rpb246IHN0cmluZztcclxuICBxbm86IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgYW5zd2VyVHlwZTogc3RyaW5nO1xyXG4gIGFuc3dlcnM6IHN0cmluZ1tdO1xyXG4gIC8qKiBUaGUgYW5zd2VyJ3Mgb3duIGNhcHR1cmUgcGx1cyBhbnkgdmFsaWRhdGlvbiBwcm9vZiwgaW4gc3VibWlzc2lvbiBvcmRlci4gKi9cclxuICBtZWRpYTogQW5zd2VyTWVkaWFbXTtcclxuICBpbWFnZXM6IHN0cmluZ1tdO1xyXG4gIHZpZGVvczogc3RyaW5nW107XHJcbiAgLyoqIFRleHQgdHlwZWQgYXMgdmFsaWRhdGlvbiBwcm9vZiBvZiB0aGUgY2hvc2VuIGFuc3dlci4gKi9cclxuICB2YWxpZGF0aW9uVGV4dDogc3RyaW5nO1xyXG4gIHJlbWFyazogc3RyaW5nO1xyXG4gIC8qKiBTZWNvbmQgcmVtYXJrIGZpZWxkIChzdG9yZU1hbmFnZXJSZW1hcmspLiAqL1xyXG4gIGV4dHJhUmVtYXJrOiBzdHJpbmc7XHJcbiAgLyoqIFNjb3JlIG9mIHRoZSBzdWJtaXR0ZWQgYW5zd2VyOyBudWxsIGZvciBhIHF1ZXN0aW9uIHdpdGhvdXQgY29tcGxpYW5jZSBzY29yaW5nLiAqL1xyXG4gIGFjdHVhbFNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBTY29yZSBpbiBmb3JjZSAtIHRoZSByZXZpc2lvbidzIHdoZW4gdGhlcmUgaXMgb25lLiAqL1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBUaGUgYW5zd2VyIGluIGZvcmNlIGNhcnJpZXMgYW4gU09QIGZsYWcgLSB0aGUgc2FtZSBmbGFnIHRoZSBhdWRpdCBkYXNoYm9hcmQgc2NvcmVzIG9uLiAqL1xyXG4gIGZsYWdnZWQ6IGJvb2xlYW47XHJcbiAgcmVkbzogYm9vbGVhbjtcclxuICAvKiogU2V0IG9uY2UgYSByZXZpZXdlciAob3IgYW4gYXBwcm92ZWQgZGlzcHV0ZSkgY2hhbmdlZCB0aGUgc3VibWl0dGVkIGFuc3dlci4gKi9cclxuICByZXZpc2VkOiB7IGFuc3dlcjogc3RyaW5nOyByZWFzb246IHN0cmluZzsgc2NvcmU6IG51bWJlciB8IG51bGw7IGJ5OiBzdHJpbmcgfSB8IG51bGw7XHJcbiAgb3B0aW9uczogQW5zd2VyT3B0aW9uW107XHJcbiAgLyoqIFNpbmdsZS1jaG9pY2Ugd2l0aCBjb25maWd1cmVkIG9wdGlvbnMsIHNvIGEgcmV2aWV3ZXIgY2FuIHJldmlzZSBpdC4gKi9cclxuICBlZGl0YWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEhlYWRlciBmYWN0cyBvZiB0aGUgc3VibWlzc2lvbiBvbiB0aGUgcmlnaHQuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VibWlzc2lvbkRldGFpbCB7XHJcbiAgLyoqIHByb2Nlc3NlZGNoZWNrbGlzdCBpZCAtIHdoYXQgcmV2aXNlIC8gYXBwcm92ZSBhY3Qgb24uICovXHJcbiAgc3VibWlzc2lvbklkOiBzdHJpbmc7XHJcbiAgc3RvcmVJZDogc3RyaW5nO1xyXG4gIHN0b3JlTmFtZTogc3RyaW5nO1xyXG4gIC8qKiBcIlN0YXRlLCBDb3VudHJ5XCIgb2YgdGhlIHN0b3JlLiAqL1xyXG4gIHJlZ2lvbjogc3RyaW5nO1xyXG4gIGF1ZGl0TmFtZTogc3RyaW5nO1xyXG4gIHN1YnRpdGxlOiBzdHJpbmc7XHJcbiAgcXVlc3Rpb25Db3VudDogbnVtYmVyO1xyXG4gIC8qKiBGbGFnZ2VkIGFuc3dlcnMgYWZ0ZXIgcmV2aXNpb25zLiAqL1xyXG4gIHF1ZXN0aW9uRmxhZzogbnVtYmVyO1xyXG4gIC8qKiBBIHF1ZXN0aW9uIGhhcyBcIkNvbmZpZ3VyZSBDb21wbGlhbmNlIFNjb3JlXCIgb247IHdpdGhvdXQgb25lIHRoZSBzdWJtaXNzaW9uIGhhcyBubyBDb21wbGlhbmNlIFNjb3JlLiAqL1xyXG4gIGNvbXBsaWFuY2VFbmFibGVkOiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIENvbXBsaWFuY2UgU2NvcmUgKDAtMTAwKSBmcm9tIHRoZSBBUEk6IGNvbXBsaWFuY2UgcG9pbnRzIChvcHRpb24gc2NvcmVzKSBvZiB0aGUgcXVlc3Rpb25zIHdpdGggQ29uZmlndXJlXHJcbiAgICogQ29tcGxpYW5jZSBTY29yZSBvbiwgYWZ0ZXIgcmV2aXNpb25zIC0gdGhlIHNhbWUgcnVsZSBhcyB0aGUgYXVkaXQgZGFzaGJvYXJkLiBudWxsID0gbm9uZSBzZW50LlxyXG4gICAqL1xyXG4gIGNvbXBsaWFuY2VTY29yZTogbnVtYmVyIHwgbnVsbDtcclxuICBzdWJtaXR0ZWRCeTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgZHVyYXRpb246IHN0cmluZztcclxuICBkYXRlOiBzdHJpbmc7XHJcbiAgLyoqIFlZWVktTU0tREQgb2YgdGhlIHN1Ym1pc3Npb24uICovXHJcbiAgZGF0ZUlzbzogc3RyaW5nO1xyXG4gIHRpbWU6IHN0cmluZztcclxuICBzdGF0dXM6IHN0cmluZztcclxuICBhcHByb3ZhbEVuYWJsZTogYm9vbGVhbjtcclxuICBhcHByb3ZhbFN0YXR1czogYm9vbGVhbjtcclxuICBhcHByb3ZlZEJ5OiBzdHJpbmc7XHJcbiAgYXBwcm92ZWRBdDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlck9wdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBtZXRhPzogc3RyaW5nO1xyXG4gIC8qKiBXaGF0IGlzIHN0b3JlZCBhbmQgc2VudCB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgbGFiZWwgKHN0b3JlIGlkLCBhdWRpdCBpZCwgYW5zd2VyIHR5cGUgY29kZSkuICovXHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbiAgLyoqIFByZXNlbnQgb24gYSBcInNlbGVjdCBhbGxcIiBvcHRpb247IGhvbGRzIGV2ZXJ5IHZhbHVlIGl0IHN0YW5kcyBmb3IuICovXHJcbiAgYWxsT2Y/OiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJEZWYge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBoaW50OiBzdHJpbmc7XHJcbiAgb3B0aW9uczogRmlsdGVyT3B0aW9uW107XHJcbiAgbXVsdGk6IGJvb2xlYW47XHJcbiAgLyoqIERhdGUgYW5kIHNjb3JlIHBhbmVzIHJlbmRlciB0aGVpciBvd24gY29udHJvbHMuICovXHJcbiAga2luZDogJ2xpc3QnIHwgJ2RhdGUnIHwgJ3Njb3JlJztcclxuICAvKiogRHJhd2VyIGdyb3VwaW5nLiAqL1xyXG4gIGdyb3VwOiAncHJpbWFyeScgfCAnc2Vjb25kYXJ5JztcclxuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcclxuICBoaWRlPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEF1ZGl0IHJvd3MgYXMgL2F1ZGl0L2xpc3QgcmV0dXJucyB0aGVtLiAqL1xyXG5pbnRlcmZhY2UgQXVkaXRPcHRpb24ge1xyXG4gIF9pZDogc3RyaW5nO1xyXG4gIGNoZWNrTGlzdE5hbWU6IHN0cmluZztcclxuICBjaGVja0xpc3REZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBjaGVja0xpc3RUeXBlPzogc3RyaW5nO1xyXG4gIGNvdmVyYWdlPzogc3RyaW5nO1xyXG4gIHBhc3NNYXJrPzogbnVtYmVyIHwgbnVsbDtcclxuICAvKiogU3VibWlzc2lvbnMgaW4gdGhlIGhlYWRlciBwZXJpb2QuICovXHJcbiAgdmlzaXRzPzogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogUGFzcyBtYXJrIHdoZW4gYW4gYXVkaXQgaGFzIG5vbmUgY29uZmlndXJlZCAtIHRoZSBhdWRpdCBkYXNoYm9hcmQncyBkZWZhdWx0LiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuXHJcbi8qKiBEcmF3ZXIgbGFiZWxzIGFuZCB0aGUgYW5zd2VyVHlwZSBjb2RlcyB0aGUgZ2FsbGVyeSBBUEkgdGFrZXMuICovXHJcbmNvbnN0IEFOU1dFUl9UWVBFUzogRmlsdGVyT3B0aW9uW10gPSBbXHJcbiAgeyBsYWJlbDogJ0FsbCBBbnN3ZXIgVHlwZScsIHZhbHVlOiAnYWxsJyB9LFxyXG4gIHsgbGFiZWw6ICdEZXNjcmlwdGl2ZSBBbnN3ZXInLCB2YWx1ZTogJ2Rlc2NyaXB0aXZlJyB9LFxyXG4gIHsgbGFiZWw6ICdBL0IgUXVlc3Rpb24nLCB2YWx1ZTogJ3llcy9ubycgfSxcclxuICB7IGxhYmVsOiAnTXVsdGlwbGUgQ2hvaWNlIFF1ZXN0aW9uIC0gU2luZ2xlIEFuc3dlcicsIHZhbHVlOiAnbXVsdGlwbGVjaG9pY2VzaW5nbGUnIH0sXHJcbiAgeyBsYWJlbDogJ011bHRpcGxlIENob2ljZSBRdWVzdGlvbiAtIE11bHRpcGxlIEFuc3dlcicsIHZhbHVlOiAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZScgfSxcclxuICB7IGxhYmVsOiAnQ2FwdHVyZSBJbWFnZSBhcyBhbnN3ZXInLCB2YWx1ZTogJ2ltYWdlJyB9LFxyXG4gIHsgbGFiZWw6ICdDYXB0dXJlIEltYWdlIHdpdGggRGVzY3JpcHRpb24nLCB2YWx1ZTogJ2Rlc2NyaXB0aXZlSW1hZ2UnIH0sXHJcbiAgeyBsYWJlbDogJ0NhcHR1cmUgdmlkZW8gYXMgYW5zd2VyJywgdmFsdWU6ICd2aWRlbycgfSxcclxuICB7IGxhYmVsOiAnQ2FwdHVyZSBNdWx0aXBsZSBJbWFnZScsIHZhbHVlOiAnbXVsdGlwbGVJbWFnZScgfSxcclxuICB7IGxhYmVsOiAnRGF0ZSBBcyBBbnN3ZXInLCB2YWx1ZTogJ2RhdGUnIH0sXHJcbiAgeyBsYWJlbDogJ1RpbWUgQXMgQW5zd2VyJywgdmFsdWU6ICd0aW1lJyB9LFxyXG4gIHsgbGFiZWw6ICdMaW5lYXIgU2NhbGUnLCB2YWx1ZTogJ2xpbmVhcnNjYWxlJyB9LFxyXG4gIHsgbGFiZWw6ICdEcm9wZG93biBhcyBhbiBhbnN3ZXInLCB2YWx1ZTogJ2Ryb3Bkb3duJyB9LFxyXG4gIHsgbGFiZWw6ICdDYXB0dXJlIEltYWdlL1ZpZGVvIGFzIEFuc3dlcicsIHZhbHVlOiAnaW1hZ2UvdmlkZW8nIH1cclxuXTtcclxuXHJcbmNvbnN0IEFQUFJPVkVfRklMVEVSOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnQWxsJzogJ2FsbCcsICdBcHByb3ZlZCc6ICdBcHByb3ZlZCcsICdOb3QtQXBwcm92ZWQnOiAnbm90YXBwcm92ZWQnIH07XHJcblxyXG4vKiogQW5zd2VyIHR5cGVzIHdob3NlIGFuc3dlciBpcyBhIG1lZGlhIHBhdGggcmF0aGVyIHRoYW4gdGV4dC4gKi9cclxuY29uc3QgSU1BR0VfVFlQRVMgPSBbJ2ltYWdlJywgJ2Rlc2NyaXB0aXZlSW1hZ2UnLCAnbXVsdGlwbGVJbWFnZSddO1xyXG5jb25zdCBWSURFT19UWVBFUyA9IFsndmlkZW8nXTtcclxuY29uc3QgVklERU9fRklMRSA9IC9cXC4obXA0fHdlYm18bW92fG9nZ3xtNHZ8YXZpfHdtdikkL2k7XHJcblxyXG4vKiogUmV2aXNpb25zIGFyZSBvbmUgY29uZmlndXJlZCBvcHRpb24sIHNvIG9ubHkgc2luZ2xlLWNob2ljZSBhbnN3ZXJzIGNhbiBiZSBlZGl0ZWQgKGFzIHRoZSBBUEkgZW5mb3JjZXMpLiAqL1xyXG5jb25zdCBSRVZJU0FCTEVfVFlQRVMgPSBbJ3llcy9ubycsICdtdWx0aXBsZWNob2ljZXNpbmdsZScsICdkcm9wZG93biddO1xyXG5cclxuLyoqIFwiUmVhc29uIGZvciBjaGFuZ2VcIiBjaG9pY2VzLCBmcm9tIHRoZSBwcm90b3R5cGUncyBlZGl0IGZsb3cuICovXHJcbmNvbnN0IENIQU5HRV9SRUFTT05TID0gW1xyXG4gICdJbmNvcnJlY3QgUmVzcG9uc2UgU3VibWl0dGVkIEJ5IFRoZSBBdWRpdG9yJyxcclxuICAnRXZpZGVuY2UgRG9lcyBOb3QgU3VwcG9ydCBUaGUgQW5zd2VyJyxcclxuICAnQ29ycmVjdGVkIEFmdGVyIFJlLVZlcmlmaWNhdGlvbiBXaXRoIFN0b3JlJyxcclxuICAnT3RoZXInXHJcbl07XHJcblxyXG4vKiogRXhwb3J0IHBhZ2VzIHRocm91Z2ggdGhlIGFuc3dlcnMgQVBJIHRoaXMgbWFueSBzdWJtaXNzaW9ucyBhdCBhIHRpbWUsIHVwIHRvIEVYUE9SVF9NQVguICovXHJcbi8qKiB1c2VyRW1haWwgZmlsdGVyIHZhbHVlIG5vIHJlYWwgdXNlciBoYXMgKHNlZSByZXNvbHZlU2NvcGUpLiAqL1xyXG5jb25zdCBOT19NQVRDSF9FTUFJTCA9ICduby10ZWFtLXVzZXJAaW52YWxpZCc7XHJcbmNvbnN0IEVYUE9SVF9QQUdFID0gMTAwO1xyXG5jb25zdCBFWFBPUlRfTUFYID0gMzAwMDtcclxuXHJcbmNvbnN0IERFRkFVTFRTID0ge1xyXG4gIHR5cGU6ICdBdWRpdCcsXHJcbiAgYW5zd2VyOiAnQWxsIEFuc3dlciBUeXBlJyxcclxuICBzY29wZTogJ0NsdXN0ZXJzJyxcclxuICBzdGF0dXM6ICdBbGwnLFxyXG4gIHJlc3VsdDogJ0FsbCcsXHJcbiAgc2NvcmVNaW46IDAsXHJcbiAgc2NvcmVNYXg6IDEwMFxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXVkaXQtdjItZ2FsbGVyeScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F1ZGl0LXYyLWdhbGxlcnkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1nYWxsZXJ5LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaXRWMkdhbGxlcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIExlZnQgcGFuZWwsIGZyb20gdGhlIHF1ZXN0aW9ucyBBUEkuICovXHJcbiAgcXVlc3Rpb25TZWN0aW9uczogQXVkaXRTZWN0aW9uW10gPSBbXTtcclxuICAvKiogU3VibWlzc2lvbiBvbiB0aGUgcmlnaHQsIGZyb20gdGhlIGFuc3dlcnMgQVBJLiAqL1xyXG4gIHJvd3M6IEFuc3dlclJvd1tdID0gW107XHJcblxyXG4gIC8qKiBJbmRleCBvZiB0aGUgZXhwYW5kZWQgbGVmdC1wYW5lbCBzZWN0aW9uOyBudWxsID0gYWxsIGNvbGxhcHNlZC4gRmlyc3Qgb3BlbiBieSBkZWZhdWx0LiAqL1xyXG4gIG9wZW5TZWN0aW9uOiBudW1iZXIgfCBudWxsID0gMDtcclxuXHJcbiAgLyoqIFF1ZXN0aW9uIGtleXMgdGlja2VkIGluIHRoZSBsZWZ0IHBhbmVsOyBlbXB0eSA9IHNob3cgZXZlcnkgYW5zd2VyLiAqL1xyXG4gIHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBEcmF3ZXIgc3RhdGUuICovXHJcbiAgZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICBhY3RpdmVGaWx0ZXIgPSAndHlwZSc7XHJcbiAgb3B0aW9uUXVlcnkgPSAnJztcclxuXHJcbiAgLyoqIEZpbHRlciB2YWx1ZXMuIGZTdG9yZXMgaG9sZHMgc3RvcmUgaWRzLCBmQ2x1c3RlcnMgaG9sZHMgY2x1c3RlciBvciB0ZWFtIG5hbWVzLiAqL1xyXG4gIGZTdGFydCA9ICcnO1xyXG4gIGZFbmQgPSAnJztcclxuICAvKiogRHJhd2VyJ3MgaW5saW5lIHJhbmdlIHBpY2tlciBkYXRlcyBmb3IgZlN0YXJ0IC8gZkVuZDsgc2V0IHdoZW4gdGhlIGRyYXdlciBvcGVucyBvciBpcyBjbGVhcmVkLiAqL1xyXG4gIGZSYW5nZTogSW5saW5lUGlja2VyUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICByZWFkb25seSBwaWNrZXJMb2NhbGUgPSBQSUNLRVJfTE9DQUxFO1xyXG4gIHJlYWRvbmx5IHRvZGF5ID0gaW5saW5lUGlja2VyVG9kYXkoKTtcclxuICBmVHlwZSA9IERFRkFVTFRTLnR5cGU7XHJcbiAgZkF1ZGl0SWQgPSAnJztcclxuICBmTmFtZSA9ICcnO1xyXG4gIGZBbnN3ZXIgPSBERUZBVUxUUy5hbnN3ZXI7XHJcbiAgZlNjb3BlID0gREVGQVVMVFMuc2NvcGU7XHJcbiAgZkNsdXN0ZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZTdG9yZXM6IHN0cmluZ1tdID0gW107XHJcbiAgZlN0YXR1cyA9IERFRkFVTFRTLnN0YXR1cztcclxuICBmUmVzdWx0ID0gREVGQVVMVFMucmVzdWx0O1xyXG4gIGZGbGFnczogc3RyaW5nW10gPSBbXTtcclxuICBmU2NvcmVNaW4gPSBERUZBVUxUUy5zY29yZU1pbjtcclxuICBmU2NvcmVNYXggPSBERUZBVUxUUy5zY29yZU1heDtcclxuXHJcbiAgLyoqIEZpbHRlciBzb3VyY2VzLiAqL1xyXG4gIGF1ZGl0czogQXVkaXRPcHRpb25bXSA9IFtdO1xyXG4gIHN0b3JlT3B0aW9uczogQXJyYXk8eyBzdG9yZUlkOiBzdHJpbmc7IHN0b3JlTmFtZTogc3RyaW5nIH0+ID0gW107XHJcbiAgY2x1c3Rlck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHRlYW1OYW1lczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLyoqIFN1Ym1pc3Npb24gc2hvd24gb24gdGhlIHJpZ2h0LiAqL1xyXG4gIGRldGFpbDogU3VibWlzc2lvbkRldGFpbCA9IHRoaXMuZW1wdHlEZXRhaWwoKTtcclxuXHJcbiAgLyoqIFBhZ2luZzogb25lIHN1Ym1pc3Npb24gcGVyIHBhZ2UsIHBhZ2VJbmRleCBpcyAwLWJhc2VkIGFzIHRoZSBhbnN3ZXJzIEFQSSByZWFkcyBvZmZzZXQuICovXHJcbiAgcGFnZUluZGV4ID0gMDtcclxuICB0b3RhbCA9IDA7XHJcblxyXG4gIC8qKiBTdGFydCB0cnVlOiB0aGUgZmlsdGVyIHNvdXJjZXMgbG9hZCBiZWZvcmUgdGhlIGZpcnN0IGFuc3dlcnMgcGFnZSwgYW5kIHRoYXQgd2FpdCBzaGltbWVycyB0b28uICovXHJcbiAgbG9hZGluZyA9IHRydWU7XHJcbiAgLyoqIFF1ZXN0aW9uIG5hdmlnYXRpb24gaXMgaW4gZmxpZ2h0IChzb3VyY2VzLCB0aGVuIHRoZSBxdWVzdGlvbnMgY2FsbCkuICovXHJcbiAgbmF2TG9hZGluZyA9IHRydWU7XHJcbiAgbG9hZEVycm9yID0gJyc7XHJcblxyXG4gIC8qKiBQYXNzIG1hcmsgYW5kIGVkaXQgcGVybWlzc2lvbiBvZiB0aGUgYXVkaXQgaW4gdmlldywgc2VudCB3aXRoIGV2ZXJ5IGFuc3dlcnMgcGFnZS4gKi9cclxuICBwYXNzTWFyazogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgYWNjZXNzID0geyBjYW5FZGl0OiBmYWxzZSwgcmVhc29uOiAnJyB9O1xyXG4gIC8qKiBDbGllbnQtbGV2ZWwgb3V0Y29tZSAvIHJlbWFyayBsYWJlbHMgKE1hbmFnZSA+IFNldHRpbmdzID4gVHJheCBDb25maWd1cmF0aW9uKS4gKi9cclxuICBsYWJlbHMgPSB7IHBhc3M6ICdQYXNzJywgZmFpbDogJ0ZhaWwnLCByZW1hcmtzOiAnUmVtYXJrcycsIGFkZGl0aW9uYWw6ICdBZGRpdGlvbmFsIFJlbWFya3MnIH07XHJcblxyXG4gIC8qKiBDbGllbnQgYnJhbmQgc2hvd24gYWJvdmUgdGhlIHN1Ym1pc3Npb24gZmFjdHMuICovXHJcbiAgY2xpZW50TG9nbyA9ICcnO1xyXG4gIGNsaWVudE5hbWUgPSAnJztcclxuICBsb2dvRmFpbGVkID0gZmFsc2U7XHJcbiAgLyoqIE1lZGlhIFVSTHMgdGhhdCBmYWlsZWQgdG8gbG9hZCwgc2hvd24gYXMgYW4gXCJ1bmF2YWlsYWJsZVwiIHRpbGUgaW5zdGVhZCBvZiBhIGJyb2tlbiBpbWFnZS4gKi9cclxuICBicm9rZW5NZWRpYSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogQW5zd2VyIGVkaXQgKG9uZSBxdWVzdGlvbiBhdCBhIHRpbWUpLiAqL1xyXG4gIHJlYWRvbmx5IGNoYW5nZVJlYXNvbnMgPSBDSEFOR0VfUkVBU09OUztcclxuICAvKiogUmVhc29uIGZvciBjaGFuZ2UgZHJvcGRvd24gKGxpYi1hdWRpdC12Mi1zZWxlY3QpLiAqL1xyXG4gIHJlYWRvbmx5IHJlYXNvbk9wdGlvbnMgPSBDSEFOR0VfUkVBU09OUy5tYXAociA9PiAoeyB2YWx1ZTogciwgbGFiZWw6IHIgfSkpO1xyXG4gIGVkaXRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIGRyYWZ0QW5zd2VyID0gJyc7XHJcbiAgZHJhZnRSZWFzb24gPSAnJztcclxuICBkcmFmdE90aGVyID0gJyc7XHJcbiAgc2F2aW5nID0gZmFsc2U7XHJcblxyXG4gIC8qKiBBcHByb3ZlIGJhcjogYSBzZWNvbmQgY2xpY2sgY29uZmlybXMsIHNpbmNlIGFwcHJvdmFsIGNsb3NlcyBlZGl0aW5nLiAqL1xyXG4gIGFwcHJvdmVDb25maXJtID0gZmFsc2U7XHJcbiAgYXBwcm92aW5nID0gZmFsc2U7XHJcblxyXG4gIGV4cG9ydE9wZW4gPSBmYWxzZTtcclxuICAvKiogRXhjZWwgZ3JvdXAgKFRoaXMgc3VibWlzc2lvbiAvIEFsbCBzdWJtaXNzaW9ucykgaW4gdGhlIEV4cG9ydCBtZW51OyBoaWRkZW4gZm9yIG5vdywgc2V0IHRydWUgdG8gYnJpbmcgaXQgYmFjay4gKi9cclxuICByZWFkb25seSBzaG93RXhjZWxFeHBvcnQgPSBmYWxzZTtcclxuICBleHBvcnRpbmcgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFNuYXBzaG90IHRha2VuIHdoZW4gdGhlIGRyYXdlciBvcGVucywgcmVzdG9yZWQgb24gY2FuY2VsLiAqL1xyXG4gIHByaXZhdGUgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgaGVhZGVyRGF0YTogYW55O1xyXG4gIHByaXZhdGUgaGVhZGVyU3RhcnQgPSAnJztcclxuICBwcml2YXRlIGhlYWRlckVuZCA9ICcnO1xyXG4gIHByaXZhdGUgYW5zd2VyQ2RuID0gJyc7XHJcbiAgcHJpdmF0ZSBydW5BaUNkbiA9ICcnO1xyXG4gIC8qKiBSYXcgcmVjb3JkIG9uIHRoZSByaWdodCwgZm9yIHRoZSBzaW5nbGUtc3VibWlzc2lvbiBleHBvcnQuICovXHJcbiAgcHJpdmF0ZSByZWNvcmQ6IGFueSA9IG51bGw7XHJcbiAgLyoqIFNjb3BlIHNlbnQgd2l0aCBldmVyeSBhbnN3ZXJzIHBhZ2UsIGZpeGVkIHdoZW4gZmlsdGVycyBhcmUgYXBwbGllZC4gKi9cclxuICBwcml2YXRlIHNjb3BlUGF5bG9hZDogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG4gIC8qKiBEcm9wcyByZXNwb25zZXMgZnJvbSBhIGxvYWQgdGhhdCBhIG5ld2VyIG9uZSByZXBsYWNlZC4gKi9cclxuICBwcml2YXRlIGxvYWRTZXEgPSAwO1xyXG4gIC8qKiA/YXVkaXQ9JnN0b3JlPSZkYXRlPSZzdGF0dXM9IGZyb20gQWN0aW9uIENlbnRlciAoVmlldyAvIGFwcHJvdmFsIGNhcmRzKTsgYXBwbGllZCBvbmNlIG9uIHRoZSBmaXJzdCBsb2FkLiAqL1xyXG4gIHByaXZhdGUgZGVlcExpbms6IHsgYXVkaXQ6IHN0cmluZzsgc3RvcmU6IHN0cmluZzsgZGF0ZTogc3RyaW5nOyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmc7IGZsYWc6IGJvb2xlYW47IHN0YXR1czogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcclxuICAvKiogQXVkaXQgaWQgZnJvbSB0aGF0IGxpbmssIHVudGlsIHRoZSBhdWRpdCBsaXN0IGNvbmZpcm1zIGl0OyBhbiB1bmtub3duIGlkIGlzIG5vdCBzd2FwcGVkIGZvciBhbm90aGVyIGF1ZGl0LiAqL1xyXG4gIHByaXZhdGUgbGlua2VkQXVkaXRJZCA9ICcnO1xyXG4gIC8qKiBUaGUgbGlua2VkIGlkIGlzIG5vdCBvbmUgb2YgdGhpcyBjbGllbnQncyBsaXZlIGF1ZGl0cyAoZGVsZXRlZCwgb3Igbm90IGFuIGF1ZGl0KS4gKi9cclxuICBsaW5rTWlzc2luZyA9IGZhbHNlO1xyXG4gIC8qKiBBcHByb3ZlIG5lZWRzIHRoZSBDaGVja2xpc3QgZWRpdCBwZXJtaXNzaW9uIChQT1NUIC90cmF4L2F1ZGl0L2dhbGxlcnkvYXBwcm92ZSBjaGVja3MgaXQgdG9vKS4gQW5zd2VyIGVkaXRpbmdcclxuICAgKiAgZm9sbG93cyB0aGUgc2VydmVyJ3Mgb3duIGBhY2Nlc3NgIGJlbG93LiAqL1xyXG4gIG1lbnVBY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsOiBOZ2JNb2RhbFxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgYXVkaXRBY2Nlc3ModGhpcy5ncykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShhY2Nlc3MgPT4ge1xyXG4gICAgICB0aGlzLm1lbnVBY2Nlc3MgPSBhY2Nlc3M7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBxcCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcDtcclxuICAgIGlmIChxcC5nZXQoJ2F1ZGl0JykpIHtcclxuICAgICAgdGhpcy5kZWVwTGluayA9IHtcclxuICAgICAgICBhdWRpdDogcXAuZ2V0KCdhdWRpdCcpIHx8ICcnLCBzdG9yZTogcXAuZ2V0KCdzdG9yZScpIHx8ICcnLCBkYXRlOiBxcC5nZXQoJ2RhdGUnKSB8fCAnJyxcclxuICAgICAgICBmcm9tOiBxcC5nZXQoJ2Zyb20nKSB8fCAnJywgdG86IHFwLmdldCgndG8nKSB8fCAnJyxcclxuICAgICAgICAvLyBGbGFncyAtPiBWaWV3OiBvbmx5IGZsYWdnZWQgc3VibWlzc2lvbnMuXHJcbiAgICAgICAgZmxhZzogcXAuZ2V0KCdmbGFnJykgPT09ICcxJyxcclxuICAgICAgICAvLyBBY3Rpb24gQ2VudGVyIGFwcHJvdmFsIGNhcmRzOiBPcGVuIC0+IE5vdC1BcHByb3ZlZCwgQXBwcm92ZWQgLT4gQXBwcm92ZWQuXHJcbiAgICAgICAgc3RhdHVzOiBBUFBST1ZFX0ZJTFRFUltxcC5nZXQoJ3N0YXR1cycpIHx8ICcnXSA/IChxcC5nZXQoJ3N0YXR1cycpIHx8ICcnKSA6ICcnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLmdzLmVudmlyb25tZW50LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGVudjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuYW5zd2VyQ2RuID0gZW52Py5UcmF4QW5zd2VyQ0ROIHx8ICcnO1xyXG4gICAgICB0aGlzLnJ1bkFpQ2RuID0gZW52Py50cmF4UnVuQWlDRE4gfHwgdGhpcy5hbnN3ZXJDZG47XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhPy5jbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgY29uc3QgY2xpZW50Q2hhbmdlZCA9IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50ICE9PSBkYXRhLmNsaWVudDtcclxuICAgICAgICB0aGlzLmhlYWRlckRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMuaGVhZGVyU3RhcnQgPSBkYXRhLmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJztcclxuICAgICAgICB0aGlzLmhlYWRlckVuZCA9IGRhdGEuZGF0ZT8uZW5kRGF0ZSB8fCB0aGlzLmhlYWRlclN0YXJ0O1xyXG4gICAgICAgIHRoaXMuZlN0YXJ0ID0gdGhpcy5oZWFkZXJTdGFydDtcclxuICAgICAgICB0aGlzLmZFbmQgPSB0aGlzLmhlYWRlckVuZDtcclxuICAgICAgICBpZiAoY2xpZW50Q2hhbmdlZCkge1xyXG4gICAgICAgICAgdGhpcy5mQ2x1c3RlcnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuZlN0b3JlcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5sb2FkTGFiZWxzKCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRDbGllbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQXJyaXZpbmcgZnJvbSBBY3Rpb24gQ2VudGVyIChhdWRpdCAvIHN0b3JlIC8gZGF5KSBvciBNYW5hZ2UgKGF1ZGl0LCBzY2hlZHVsZSBkYXRlIHJhbmdlKVxyXG4gICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIGhlYWRlciByYW5nZS5cclxuICAgICAgICBpZiAodGhpcy5kZWVwTGluaykge1xyXG4gICAgICAgICAgdGhpcy5mQXVkaXRJZCA9IHRoaXMuZGVlcExpbmsuYXVkaXQ7XHJcbiAgICAgICAgICB0aGlzLmxpbmtlZEF1ZGl0SWQgPSB0aGlzLmRlZXBMaW5rLmF1ZGl0O1xyXG4gICAgICAgICAgaWYgKHRoaXMuZGVlcExpbmsuc3RvcmUpIHsgdGhpcy5mU3RvcmVzID0gW3RoaXMuZGVlcExpbmsuc3RvcmVdOyB9XHJcbiAgICAgICAgICBpZiAodGhpcy5kZWVwTGluay5kYXRlKSB7IHRoaXMuZlN0YXJ0ID0gdGhpcy5kZWVwTGluay5kYXRlOyB0aGlzLmZFbmQgPSB0aGlzLmRlZXBMaW5rLmRhdGU7IH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZGVlcExpbmsuZnJvbSkgeyB0aGlzLmZTdGFydCA9IHRoaXMuZGVlcExpbmsuZnJvbTsgdGhpcy5mRW5kID0gdGhpcy5kZWVwTGluay50byB8fCB0aGlzLmRlZXBMaW5rLmZyb207IH1cclxuICAgICAgICAgIGlmICh0aGlzLmRlZXBMaW5rLmZsYWcgJiYgIXRoaXMuZkZsYWdzLmluY2x1ZGVzKCdGbGFnJykpIHsgdGhpcy5mRmxhZ3MgPSBbLi4udGhpcy5mRmxhZ3MsICdGbGFnJ107IH1cclxuICAgICAgICAgIGlmICh0aGlzLmRlZXBMaW5rLnN0YXR1cykgeyB0aGlzLmZTdGF0dXMgPSB0aGlzLmRlZXBMaW5rLnN0YXR1czsgfVxyXG4gICAgICAgICAgdGhpcy5kZWVwTGluayA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZFNvdXJjZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogTmV2ZXIgbGVhdmUgdGhlIHBhZ2Ugc2Nyb2xsIGxvY2tlZCBpZiB0aGUgcm91dGUgY2hhbmdlcyB3aGlsZSB0aGUgZHJhd2VyIGlzIG9wZW4uICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFBhZ2VTY3JvbGxMb2NrZWQoZmFsc2UpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZG9jdW1lbnQgaXMgdGhlIGFwcCdzIHNjcm9sbGVyLCBzbyB3aGlsZSB0aGUgZHJhd2VyIGlzIG9wZW4gbG9jayA8Ym9keT4uXHJcbiAgICogT3RoZXJ3aXNlIHRoZSBwYWdlIHNjcm9sbHMgYmVoaW5kIHRoZSBiYWNrZHJvcCBhbmQgaXRzIHNjcm9sbGJhciBzdG9wcyB0aGVcclxuICAgKiBmaXhlZCBkcmF3ZXIgc2hvcnQgb2YgdGhlIHZpZXdwb3J0J3MgcmlnaHQgZWRnZS5cclxuICAgKi9cclxuICBwcml2YXRlIHNldFBhZ2VTY3JvbGxMb2NrZWQobG9ja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gbG9ja2VkID8gJ2hpZGRlbicgOiAnJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGNsaWVudElkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgfVxyXG5cclxuICAvKiogUGFzcyAvIEZhaWwgYW5kIHJlbWFyayBsYWJlbHMgZnJvbSBUcmF4IENvbmZpZ3VyYXRpb247IGRlZmF1bHRzIHdoZW4gdW5zZXQuICovXHJcbiAgcHJpdmF0ZSBsb2FkTGFiZWxzKCk6IHZvaWQge1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdFNldHRpbmdzR2V0KHRoaXMuY2xpZW50SWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZCA9IHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGEgOiBudWxsO1xyXG4gICAgICAgIHRoaXMubGFiZWxzID0ge1xyXG4gICAgICAgICAgcGFzczogZD8ucGFzc0xhYmVsIHx8ICdQYXNzJyxcclxuICAgICAgICAgIGZhaWw6IGQ/LmZhaWxMYWJlbCB8fCAnRmFpbCcsXHJcbiAgICAgICAgICByZW1hcmtzOiBkPy5yZW1hcmtzTGFiZWwgfHwgJ1JlbWFya3MnLFxyXG4gICAgICAgICAgYWRkaXRpb25hbDogZD8uYWRkaXRpb25hbFJlbWFya3NMYWJlbCB8fCAnQWRkaXRpb25hbCBSZW1hcmtzJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsaWVudCBsb2dvIGFuZCBuYW1lLCB0aGUgc2FtZSByZWNvcmQgdGhlIGhlYWRlcidzIGNsaWVudCBiYWRnZSByZWFkcy4gKi9cclxuICBwcml2YXRlIGxvYWRDbGllbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsaWVudExvZ28gPSAnJztcclxuICAgIHRoaXMuY2xpZW50TmFtZSA9ICcnO1xyXG4gICAgdGhpcy5sb2dvRmFpbGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmF1dGguZ2V0Q2xpZW50SW5mbyh0aGlzLmNsaWVudElkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGE/LnJlc3VsdCA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5jbGllbnRMb2dvID0gY2xpZW50Py5sb2dvIHx8ICcnO1xyXG4gICAgICAgIHRoaXMuY2xpZW50TmFtZSA9IGNsaWVudD8uY2xpZW50TmFtZSB8fCAnJztcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBGaWx0ZXIgc291cmNlczogYXVkaXRzLCBjbHVzdGVycywgdGVhbXMsIHN0b3Jlc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogTG9hZHMgZXZlcnkgZHJhd2VyIGxpc3QsIHRoZW4gdGhlIGdhbGxlcnkgZm9yIHRoZSBmaXJzdCAob3Igc3RpbGwgc2VsZWN0ZWQpIGF1ZGl0LiAqL1xyXG4gIHByaXZhdGUgbG9hZFNvdXJjZXMoKTogdm9pZCB7XHJcbiAgICAvLyBsb2FkR2FsbGVyeSAodmlhIGFwcGx5RmlsdGVycykgYWx3YXlzIHJ1bnMgbmV4dCBhbmQgY2xlYXJzIGJvdGggZmxhZ3MuXHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5uYXZMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHNhZmUgPSAobzogT2JzZXJ2YWJsZTxhbnk+KSA9PiBvLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpO1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBhdWRpdHM6IHRoaXMuZmV0Y2hBdWRpdHMoKSxcclxuICAgICAgY2x1c3RlcnM6IHNhZmUodGhpcy50cmF4U2VydmljZS5nZXRjbHVzdGVycyh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkLCBncm91cDogW10sIGNpdHk6IFtdIH0pKSxcclxuICAgICAgdGVhbXM6IHNhZmUodGhpcy50cmF4U2VydmljZS5nZXRBbGxUZWFtcyh0aGlzLmNsaWVudElkKSlcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHsgYXVkaXRzLCBjbHVzdGVycywgdGVhbXMgfTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuYXVkaXRzID0gYXVkaXRzO1xyXG4gICAgICB0aGlzLmNsdXN0ZXJOYW1lcyA9IGNsdXN0ZXJzPy5jb2RlID09PSAyMDAgPyAoY2x1c3RlcnMuZGF0YT8uZ3JvdXBEYXRhIHx8IFtdKS5tYXAoKGM6IGFueSkgPT4gYy5ncm91cE5hbWUpLmZpbHRlcihCb29sZWFuKSA6IFtdO1xyXG4gICAgICB0aGlzLnRlYW1OYW1lcyA9IHRlYW1zPy5jb2RlID09PSAyMDAgPyAodGVhbXMuZGF0YSB8fCBbXSkubWFwKCh0OiBhbnkpID0+IHQudGVhbU5hbWUpLmZpbHRlcihCb29sZWFuKSA6IFtdO1xyXG5cclxuICAgICAgLy8gS2VlcCB0aGUgYXVkaXQgaW4gdmlldzsgb3RoZXJ3aXNlIG9wZW4gb24gdGhlIGZpcnN0IG9uZSB3aXRoIHN1Ym1pc3Npb25zIGluIHRoZSBwZXJpb2QuXHJcbiAgICAgIC8vIEEgbGlua2VkIGF1ZGl0IHRoYXQgaXMgbm90IGluIHRoZSBsaXN0IHNob3dzIFwibm90IGZvdW5kXCIgcmF0aGVyIHRoYW4gYW5vdGhlciBhdWRpdCdzIGRhdGEuXHJcbiAgICAgIGNvbnN0IGxpbmtlZCA9IHRoaXMubGlua2VkQXVkaXRJZDtcclxuICAgICAgdGhpcy5saW5rZWRBdWRpdElkID0gJyc7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmF1ZGl0cy5maW5kKGEgPT4gYS5faWQgPT09IHRoaXMuZkF1ZGl0SWQpXHJcbiAgICAgICAgfHwgKGxpbmtlZCA/IHVuZGVmaW5lZCA6IHRoaXMuYXVkaXRzLmZpbmQoYSA9PiBOdW1iZXIoYS52aXNpdHMpID4gMCkgfHwgdGhpcy5hdWRpdHNbMF0pO1xyXG4gICAgICB0aGlzLmxpbmtNaXNzaW5nID0gISFsaW5rZWQgJiYgIWN1cnJlbnQ7XHJcbiAgICAgIGlmIChjdXJyZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RBdWRpdChjdXJyZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZBdWRpdElkID0gJyc7XHJcbiAgICAgICAgdGhpcy5mTmFtZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubG9hZFN0b3JlcygoKSA9PiB0aGlzLmFwcGx5RmlsdGVycygpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEF1ZGl0cyBmb3IgdGhlIE5hbWUgZmlsdGVyOiB0aGUgY2xpZW50J3MgYXVkaXRzIG9ubHkgKFBPU1QgL3RyYXgvYXVkaXQvbGlzdCByZWFkcyBhdWRpdGNoZWNrbGlzdCkuICovXHJcbiAgcHJpdmF0ZSBmZXRjaEF1ZGl0cygpOiBPYnNlcnZhYmxlPEF1ZGl0T3B0aW9uW10+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0TGlzdCh7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLCBmcm9tRGF0ZTogdGhpcy5oZWFkZXJTdGFydCwgdG9EYXRlOiB0aGlzLmhlYWRlckVuZCxcclxuICAgICAgbGltaXQ6IDUwMCwgb2Zmc2V0OiAxLCBzZWFyY2g6ICcnXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICBtYXAoKHJlczogYW55KSA9PiAocmVzPy5jb2RlID09PSAyMDAgPyByZXMuZGF0YT8ucmVzdWx0IHx8IFtdIDogW10pIGFzIEF1ZGl0T3B0aW9uW10pLFxyXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIEF1ZGl0T3B0aW9uW10pKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgZm9yIHRoZSBTdG9yZXMgZmlsdGVyLCBuYXJyb3dlZCB0byB0aGUgY2hvc2VuIGNsdXN0ZXJzOyBwcnVuZXMgcGlja3MgdGhhdCBmZWxsIG91dCBvZiBzY29wZS4gKi9cclxuICBwcml2YXRlIGxvYWRTdG9yZXMoZG9uZT86ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsdXN0ZXJzID0gdGhpcy5mU2NvcGUgPT09ICdDbHVzdGVycycgPyB0aGlzLmZDbHVzdGVycyA6IFtdO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5nZXRTdG9yZXNsaXN0KHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIGNsdXN0ZXJzLCBjaXR5OiBbXSB9KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGE/LnN0b3Jlc0RhdGEgfHwgW10pIDogW107XHJcbiAgICAgICAgY29uc3QgaWRzID0gbmV3IFNldCh0aGlzLnN0b3JlT3B0aW9ucy5tYXAocyA9PiBzLnN0b3JlSWQpKTtcclxuICAgICAgICB0aGlzLmZTdG9yZXMgPSB0aGlzLmZTdG9yZXMuZmlsdGVyKGlkID0+IGlkcy5oYXMoaWQpKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAoZG9uZSkgeyBkb25lKCk7IH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdEF1ZGl0KGF1ZGl0OiBBdWRpdE9wdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5saW5rTWlzc2luZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5mQXVkaXRJZCA9IGF1ZGl0Ll9pZDtcclxuICAgIHRoaXMuZk5hbWUgPSBhdWRpdC5jaGVja0xpc3ROYW1lO1xyXG4gICAgLy8gU3RvcmUtY292ZXJhZ2UgYXVkaXRzIGFyZSBzY29wZWQgYnkgc3RvcmVzLCB1c2VyLWNvdmVyYWdlIG9uZXMgYnkgdGVhbSB1c2Vycy5cclxuICAgIGNvbnN0IHNjb3BlID0gYXVkaXQuY292ZXJhZ2UgPT09ICd1c2VyJyA/ICdUZWFtcycgOiAnQ2x1c3RlcnMnO1xyXG4gICAgaWYgKHNjb3BlICE9PSB0aGlzLmZTY29wZSkge1xyXG4gICAgICB0aGlzLmZTY29wZSA9IHNjb3BlO1xyXG4gICAgICB0aGlzLmZDbHVzdGVycyA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQXVkaXQoKTogQXVkaXRPcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuYXVkaXRzLmZpbmQoYSA9PiBhLl9pZCA9PT0gdGhpcy5mQXVkaXRJZCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFzc1RocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgbWFyayA9IE51bWJlcih0aGlzLnBhc3NNYXJrID8/IHRoaXMuc2VsZWN0ZWRBdWRpdD8ucGFzc01hcmspO1xyXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShtYXJrKSAmJiBtYXJrID4gMCA/IG1hcmsgOiBQQVNTX01BUks7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBHYWxsZXJ5IGxvYWRcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIFRlYW1zIHNjb3BlIHNlbmRzIHRoZSB0ZWFtcycgdXNlcnM7IENsdXN0ZXJzIHNjb3BlIHNlbmRzIHN0b3JlIGlkcy4gKi9cclxuICBwcml2YXRlIHJlc29sdmVTY29wZSgpOiBPYnNlcnZhYmxlPHsgc3RvcmVJZDogc3RyaW5nW107IHVzZXJFbWFpbDogc3RyaW5nW10gfT4ge1xyXG4gICAgaWYgKHRoaXMuZlNjb3BlID09PSAnVGVhbXMnKSB7XHJcbiAgICAgIC8vIE5vIHRlYW0gcGlja2VkID0gZXZlcnkgc3VibWlzc2lvbiBvZiB0aGUgYXVkaXQuIEV4cGFuZGluZyB0byBcImFsbCB0ZWFtc1wiIHdvdWxkIGhpZGVcclxuICAgICAgLy8gYXVkaXRvcnMgd2hvIGFyZSBub3QgaW4gYW55IHRlYW0uXHJcbiAgICAgIGlmICghdGhpcy5mQ2x1c3RlcnMubGVuZ3RoKSB7IHJldHVybiBvZih7IHN0b3JlSWQ6IFtdLCB1c2VyRW1haWw6IFtdIH0pOyB9XHJcbiAgICAgIGNvbnN0IHRlYW1zID0gdGhpcy5mQ2x1c3RlcnM7XHJcbiAgICAgIHJldHVybiB0aGlzLnRyYXhTZXJ2aWNlLmdldHVzZXJzKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIHRlYW1zIH0pLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZW1haWxzID0gcmVzPy5jb2RlID09PSAyMDAgPyBbLi4ubmV3IFNldDxzdHJpbmc+KChyZXMuZGF0YSB8fCBbXSkubWFwKCh1OiBhbnkpID0+IHUudXNlckVtYWlsKS5maWx0ZXIoQm9vbGVhbikpXSA6IFtdO1xyXG4gICAgICAgICAgLy8gVGhlIEFQSSB0cmVhdHMgYW4gZW1wdHkgbGlzdCBhcyBcIm5vIGZpbHRlclwiLCBzbyBwaWNrZWQgdGVhbXMgd2l0aG91dCB1c2VycyBzZW5kIGFuXHJcbiAgICAgICAgICAvLyBlbWFpbCB0aGF0IG1hdGNoZXMgbm9ib2R5IChzaG93cyBcIk5vIHN1Ym1pc3Npb25zIGZvdW5kXCIsIG5vdCBldmVyeSBzdWJtaXNzaW9uKS5cclxuICAgICAgICAgIHJldHVybiB7IHN0b3JlSWQ6IFtdLCB1c2VyRW1haWw6IGVtYWlscy5sZW5ndGggPyBlbWFpbHMgOiBbTk9fTUFUQ0hfRU1BSUxdIH07XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IHN0b3JlSWQ6IFtdLCB1c2VyRW1haWw6IFtOT19NQVRDSF9FTUFJTF0gfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdG9yZUlkID0gdGhpcy5mU3RvcmVzLmxlbmd0aCA/IHRoaXMuZlN0b3JlcyA6IHRoaXMuc3RvcmVPcHRpb25zLm1hcChzID0+IHMuc3RvcmVJZCk7XHJcbiAgICByZXR1cm4gb2YoeyBzdG9yZUlkLCB1c2VyRW1haWw6IFtdIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkR2FsbGVyeSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGF1ZGl0ID0gdGhpcy5zZWxlY3RlZEF1ZGl0O1xyXG4gICAgY29uc3Qgc2VxID0gKyt0aGlzLmxvYWRTZXE7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XHJcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICB0aGlzLnBhc3NNYXJrID0gbnVsbDtcclxuICAgIGlmICghYXVkaXQgfHwgIXRoaXMuY2xpZW50SWQpIHtcclxuICAgICAgdGhpcy5zY29wZVBheWxvYWQgPSBudWxsO1xyXG4gICAgICB0aGlzLnF1ZXN0aW9uU2VjdGlvbnMgPSBbXTtcclxuICAgICAgdGhpcy50b3RhbCA9IDA7XHJcbiAgICAgIHRoaXMubmF2TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dTdWJtaXNzaW9uKG51bGwpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5uYXZMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZEVycm9yID0gJyc7XHJcbiAgICB0aGlzLnJlc29sdmVTY29wZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoc2NvcGUgPT4ge1xyXG4gICAgICBpZiAoc2VxICE9PSB0aGlzLmxvYWRTZXEpIHsgcmV0dXJuOyB9XHJcbiAgICAgIHRoaXMuc2NvcGVQYXlsb2FkID0ge1xyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgIGZyb21EYXRlOiB0aGlzLmZTdGFydCxcclxuICAgICAgICB0b0RhdGU6IHRoaXMuZkVuZCB8fCB0aGlzLmZTdGFydCxcclxuICAgICAgICBDaGVja2xpc3RUeXBlOiBhdWRpdC5jaGVja0xpc3RUeXBlIHx8ICdjdXN0b20nLFxyXG4gICAgICAgIGNoZWNrbGlzdE5hbWU6IGF1ZGl0LmNoZWNrTGlzdE5hbWUsXHJcbiAgICAgICAgY2hlY2tsaXN0SWQ6IGF1ZGl0Ll9pZCxcclxuICAgICAgICBmaWx0ZXJ0eXBlOiB0aGlzLmZTY29wZSxcclxuICAgICAgICBzdG9yZUlkOiBzY29wZS5zdG9yZUlkLFxyXG4gICAgICAgIHVzZXJFbWFpbDogc2NvcGUudXNlckVtYWlsLFxyXG4gICAgICAgIGFuc3dlclR5cGU6IEFOU1dFUl9UWVBFUy5maW5kKGEgPT4gYS5sYWJlbCA9PT0gdGhpcy5mQW5zd2VyKT8udmFsdWUgfHwgJ2FsbCcsXHJcbiAgICAgICAgdmlld0ZsYWc6IHRoaXMuZkZsYWdzLmluY2x1ZGVzKCdGbGFnJyksXHJcbiAgICAgICAgdmlld1JlZG86IHRoaXMuZkZsYWdzLmluY2x1ZGVzKCdSZS1kbycpLFxyXG4gICAgICAgIGZpbHRlcjogJycsXHJcbiAgICAgICAgYXBwcm92ZUZpbHRlcjogQVBQUk9WRV9GSUxURVJbdGhpcy5mU3RhdHVzXSB8fCAnYWxsJ1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0R2FsbGVyeVF1ZXN0aW9ucyh7IC4uLnRoaXMuc2NvcGVQYXlsb2FkLCBxdWVzdGlvbnM6ICcnIH0pXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHNlcSAhPT0gdGhpcy5sb2FkU2VxKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgdGhpcy5uYXZMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uU2VjdGlvbnMgPSB0aGlzLnRvU2VjdGlvbnMocmVzPy5jb2RlID09PSAyMDAgPyByZXMuZGF0YT8uY2hlY2tsaXN0UXVlc3Rpb25zIDogW10pO1xyXG4gICAgICAgICAgdGhpcy5vcGVuU2VjdGlvbiA9IHRoaXMucXVlc3Rpb25TZWN0aW9ucy5sZW5ndGggPyAwIDogbnVsbDtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB0aGlzLmxvYWRQYWdlKHNlcSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW5zd2Vyc1JlcXVlc3Qob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJheFNlcnZpY2UuYXVkaXRHYWxsZXJ5QW5zd2Vycyh7XHJcbiAgICAgIC4uLnRoaXMuc2NvcGVQYXlsb2FkLFxyXG4gICAgICBzb3VyY2VDaGVja0xpc3RfaWQ6IHRoaXMuc2NvcGVQYXlsb2FkPy5bJ2NoZWNrbGlzdElkJ10sXHJcbiAgICAgIHF1ZXN0aW9uczogW10sXHJcbiAgICAgIG9mZnNldCxcclxuICAgICAgbGltaXRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZldGNoZXMgdGhlIHN1Ym1pc3Npb24gYXQgcGFnZUluZGV4LiAqL1xyXG4gIHByaXZhdGUgbG9hZFBhZ2Uoc2VxID0gdGhpcy5sb2FkU2VxKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NvcGVQYXlsb2FkKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xyXG4gICAgdGhpcy5hcHByb3ZlQ29uZmlybSA9IGZhbHNlO1xyXG4gICAgdGhpcy5hbnN3ZXJzUmVxdWVzdCh0aGlzLnBhZ2VJbmRleCwgMSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzZXEgIT09IHRoaXMubG9hZFNlcSkgeyByZXR1cm47IH1cclxuICAgICAgICAvLyAyMDQgKG5vdGhpbmcgbWF0Y2hlZCkgYXJyaXZlcyBhcyBhbiBlbXB0eSBib2R5LlxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmNvZGUgPT09IDIwMCA/IHJlcy5kYXRhIDogbnVsbDtcclxuICAgICAgICB0aGlzLnRvdGFsID0gTnVtYmVyKGRhdGE/LnRvdGFsX2NvdW50KSB8fCAwO1xyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLnBhc3NNYXJrID0gdGhpcy5udW0oZGF0YS5wYXNzTWFyayk7XHJcbiAgICAgICAgICB0aGlzLmFjY2VzcyA9IHsgY2FuRWRpdDogISFkYXRhLmFjY2Vzcz8uY2FuRWRpdCwgcmVhc29uOiBkYXRhLmFjY2Vzcz8ucmVhc29uIHx8ICcnIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd1N1Ym1pc3Npb24oZGF0YT8uY2hlY2tsaXN0QW5zd2Vycz8uWzBdIHx8IG51bGwpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIGlmIChzZXEgIT09IHRoaXMubG9hZFNlcSkgeyByZXR1cm47IH1cclxuICAgICAgICB0aGlzLnRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLmxvYWRFcnJvciA9ICdDb3VsZCBub3QgbG9hZCB0aGUgZ2FsbGVyeS4gVHJ5IGFnYWluLic7XHJcbiAgICAgICAgdGhpcy5zaG93U3VibWlzc2lvbihudWxsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXRyeSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZEdhbGxlcnkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd1N1Ym1pc3Npb24ocmVjb3JkOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XHJcbiAgICBpZiAoIXJlY29yZCkge1xyXG4gICAgICB0aGlzLnJvd3MgPSBbXTtcclxuICAgICAgdGhpcy5kZXRhaWwgPSB0aGlzLmVtcHR5RGV0YWlsKCk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbmZvID0gcmVjb3JkLmNoZWNrbGlzdEluZm8gfHwge307XHJcbiAgICBjb25zdCBzdG9yZSA9IHJlY29yZC5zdG9yZVByb2ZpbGUgfHwge307XHJcbiAgICB0aGlzLnJvd3MgPSAocmVjb3JkLnF1ZXN0aW9uQW5zd2VyIHx8IFtdKS5mbGF0TWFwKChzZWN0aW9uOiBhbnkpID0+XHJcbiAgICAgIChzZWN0aW9uLnF1ZXN0aW9ucyB8fCBbXSkubWFwKChxOiBhbnkpID0+IHRoaXMudG9Sb3coc2VjdGlvbi5zZWN0aW9uTmFtZSwgcSkpKTtcclxuICAgIGNvbnN0IGZsYWdzID0gdGhpcy5udW0oaW5mby5xdWVzdGlvbkZsYWcpO1xyXG4gICAgdGhpcy5kZXRhaWwgPSB7XHJcbiAgICAgIHN1Ym1pc3Npb25JZDogU3RyaW5nKGluZm8uY2hlY2tsaXN0SWQgfHwgJycpLFxyXG4gICAgICBzdG9yZUlkOiBzdG9yZS5zdG9yZV9pZCB8fCAnJyxcclxuICAgICAgc3RvcmVOYW1lOiBzdG9yZS5zdG9yZU5hbWUgfHwgc3RvcmUuc3RvcmVfaWQgfHwgJ+KAlCcsXHJcbiAgICAgIHJlZ2lvbjogW3N0b3JlLnN0YXRlLCBzdG9yZS5Db3VudHJ5XS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKSB8fCAn4oCUJyxcclxuICAgICAgYXVkaXROYW1lOiBpbmZvLmNoZWNrbGlzdE5hbWUgfHwgdGhpcy5mTmFtZSxcclxuICAgICAgc3VidGl0bGU6IHRoaXMuc2VsZWN0ZWRBdWRpdD8uY2hlY2tMaXN0RGVzY3JpcHRpb24gfHwgJycsXHJcbiAgICAgIHF1ZXN0aW9uQ291bnQ6IE51bWJlcihpbmZvLm5vb2ZRdWVzdGlvbnMpIHx8IHRoaXMucm93cy5sZW5ndGgsXHJcbiAgICAgIHF1ZXN0aW9uRmxhZzogZmxhZ3MgPz8gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuZmxhZ2dlZCkubGVuZ3RoLFxyXG4gICAgICBjb21wbGlhbmNlRW5hYmxlZDogdGhpcy5jb21wbGlhbmNlT24ocmVjb3JkKSxcclxuICAgICAgY29tcGxpYW5jZVNjb3JlOiB0aGlzLm51bShpbmZvLmNvbXBsaWFuY2VTY29yZSksXHJcbiAgICAgIHN1Ym1pdHRlZEJ5OiBpbmZvLnN1Ym1pdHRlZEJ5IHx8IHN0b3JlLnVzZXJOYW1lIHx8ICfigJQnLFxyXG4gICAgICBlbWFpbDogaW5mby51c2VyRW1haWwgfHwgc3RvcmUudXNlckVtYWlsIHx8ICcnLFxyXG4gICAgICBkdXJhdGlvbjogaW5mby5kdXJhdGlvbiB8fCAn4oCUJyxcclxuICAgICAgZGF0ZTogU3RyaW5nKGluZm8uZGF0ZSB8fCAnJykudHJpbSgpIHx8ICfigJQnLFxyXG4gICAgICBkYXRlSXNvOiBpbmZvLmRhdGVfc3RyaW5nIHx8ICcnLFxyXG4gICAgICB0aW1lOiBpbmZvLnRpbWUgfHwgJ+KAlCcsXHJcbiAgICAgIHN0YXR1czogaW5mby5jaGVja2xpc3RTdGF0dXMgfHwgJ3N1Ym1pdCcsXHJcbiAgICAgIGFwcHJvdmFsRW5hYmxlOiAhIWluZm8uYXBwcm92YWxFbmFibGUsXHJcbiAgICAgIGFwcHJvdmFsU3RhdHVzOiAhIWluZm8uYXBwcm92YWxTdGF0dXMsXHJcbiAgICAgIGFwcHJvdmVkQnk6IGluZm8uYXBwcm92YWxCeU5hbWUgfHwgJycsXHJcbiAgICAgIGFwcHJvdmVkQXQ6IGluZm8uYXBwcm92YWxUaW1lX3N0cmluZyB8fCAnJ1xyXG4gICAgfTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbXB0eURldGFpbCgpOiBTdWJtaXNzaW9uRGV0YWlsIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1Ym1pc3Npb25JZDogJycsIHN0b3JlSWQ6ICcnLCBzdG9yZU5hbWU6ICfigJQnLCByZWdpb246ICfigJQnLCBhdWRpdE5hbWU6IHRoaXMuZk5hbWUgfHwgJ+KAlCcsXHJcbiAgICAgIHN1YnRpdGxlOiB0aGlzLnNlbGVjdGVkQXVkaXQ/LmNoZWNrTGlzdERlc2NyaXB0aW9uIHx8ICcnLCBxdWVzdGlvbkNvdW50OiAwLCBxdWVzdGlvbkZsYWc6IDAsIGNvbXBsaWFuY2VFbmFibGVkOiBmYWxzZSwgY29tcGxpYW5jZVNjb3JlOiBudWxsLFxyXG4gICAgICBzdWJtaXR0ZWRCeTogJ+KAlCcsIGVtYWlsOiAnJywgZHVyYXRpb246ICfigJQnLCBkYXRlOiAn4oCUJywgZGF0ZUlzbzogJycsIHRpbWU6ICfigJQnLCBzdGF0dXM6ICcnLFxyXG4gICAgICBhcHByb3ZhbEVuYWJsZTogZmFsc2UsIGFwcHJvdmFsU3RhdHVzOiBmYWxzZSwgYXBwcm92ZWRCeTogJycsIGFwcHJvdmVkQXQ6ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgc3VibWlzc2lvbiBoYXMgYSBDb21wbGlhbmNlIFNjb3JlIGF0IGFsbDogdGhlIEFQSSdzIGNoZWNrbGlzdEluZm8uY29tcGxpYW5jZUVuYWJsZWQgKHJlYWQgb3ZlciBldmVyeVxyXG4gICAqIHNlY3Rpb24pLCBlbHNlIGFueSBxdWVzdGlvbiBpbiB0aGUgcmVjb3JkIHdpdGggY29tcGxpYW5jZSBzY29yaW5nIG9uLiBXaXRob3V0IGl0IHRoZSBmbGFnLWJhc2VkIHNjb3JlIHdvdWxkXHJcbiAgICogYWx3YXlzIHJlYWQgMTAwJSwgc28gdGhlIHBhZ2Ugc2hvd3Mgbm8gc2NvcmUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb21wbGlhbmNlT24ocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZsYWcgPSByZWNvcmQ/LmNoZWNrbGlzdEluZm8/LmNvbXBsaWFuY2VFbmFibGVkO1xyXG4gICAgaWYgKHR5cGVvZiBmbGFnID09PSAnYm9vbGVhbicpIHsgcmV0dXJuIGZsYWc7IH1cclxuICAgIHJldHVybiAocmVjb3JkPy5xdWVzdGlvbkFuc3dlciB8fCBbXSkuc29tZSgoczogYW55KSA9PiAocz8ucXVlc3Rpb25zIHx8IFtdKS5zb21lKChxOiBhbnkpID0+IHE/LmNvbXBsaWFuY2UgPT09IHRydWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9TZWN0aW9ucyhsaXN0OiBhbnlbXSk6IEF1ZGl0U2VjdGlvbltdIHtcclxuICAgIHJldHVybiAobGlzdCB8fCBbXSkubWFwKChzOiBhbnkpID0+ICh7XHJcbiAgICAgIG5hbWU6IHMuc2VjdGlvbk5hbWUsXHJcbiAgICAgIHF1ZXN0aW9uczogKHMucXVlc3Rpb25zIHx8IFtdKS5tYXAoKHE6IGFueSkgPT4gKHtcclxuICAgICAgICBrZXk6IHRoaXMucXVlc3Rpb25LZXkocy5zZWN0aW9uTmFtZSwgcS5xbmFtZSksXHJcbiAgICAgICAgcW5vOiBTdHJpbmcocS5xbm8gPz8gJycpLFxyXG4gICAgICAgIHRleHQ6IHRoaXMuY2xlYW4ocS5xbmFtZSksXHJcbiAgICAgICAgc2VjdGlvbjogcy5zZWN0aW9uTmFtZSxcclxuICAgICAgICBhbnN3ZXJUeXBlOiBTdHJpbmcocS5hbnN3ZXJUeXBlIHx8ICcnKVxyXG4gICAgICB9KSlcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9Sb3coc2VjdGlvbjogc3RyaW5nLCBxOiBhbnkpOiBBbnN3ZXJSb3cge1xyXG4gICAgY29uc3QgZ2l2ZW46IGFueVtdID0gcS51c2VyQW5zd2VyIHx8IFtdO1xyXG4gICAgY29uc3QgYW5zd2Vyczogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IG1lZGlhOiBBbnN3ZXJNZWRpYVtdID0gW107XHJcbiAgICBjb25zdCBwcm9vZlRleHQ6IHN0cmluZ1tdID0gW107XHJcbiAgICAvLyBSdW4gQUkga2VlcHMgYW4gYW5ub3RhdGVkIGNvcHkgb2YgYSBwaG90bzsgaXQgcmVwbGFjZXMgdGhlIG9yaWdpbmFsLCBhcyBpbiB0aGUgY2hlY2tsaXN0IGdhbGxlcnkuXHJcbiAgICBjb25zdCBhZGQgPSAocGF0aDogYW55LCB2aWRlbzogYm9vbGVhbiwgYWlQYXRoPzogYW55LCBjYXB0aW9uPzogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHNyYyA9ICF2aWRlbyAmJiBhaVBhdGggPyB0aGlzLm1lZGlhVXJsKGFpUGF0aCwgdGhpcy5ydW5BaUNkbikgOiB0aGlzLm1lZGlhVXJsKHBhdGgsIHRoaXMuYW5zd2VyQ2RuKTtcclxuICAgICAgaWYgKHNyYykgeyBtZWRpYS5wdXNoKHsgc3JjLCB2aWRlbywgY2FwdGlvbjogdGhpcy5jbGVhbihjYXB0aW9uKSB9KTsgfVxyXG4gICAgfTtcclxuICAgIGdpdmVuLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBraW5kID0gcS5hbnN3ZXJUeXBlID09PSAnaW1hZ2UvdmlkZW8nID8gKHRoaXMuaXNWaWRlb0Fuc3dlcihhKSA/ICd2aWRlbycgOiAnaW1hZ2UnKSA6IHEuYW5zd2VyVHlwZTtcclxuICAgICAgY29uc3QgY2FwdHVyZWQgPSBJTUFHRV9UWVBFUy5pbmNsdWRlcyhraW5kKSB8fCBWSURFT19UWVBFUy5pbmNsdWRlcyhraW5kKTtcclxuICAgICAgaWYgKGNhcHR1cmVkKSB7XHJcbiAgICAgICAgYWRkKGEuYW5zd2VyLCBWSURFT19UWVBFUy5pbmNsdWRlcyhraW5kKSwgYS5ydW5BSUFuc3dlciwgYS5kZXNjcmlwdGlvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAoYS5hbnN3ZXIgIT09IHVuZGVmaW5lZCAmJiBhLmFuc3dlciAhPT0gbnVsbCAmJiBhLmFuc3dlciAhPT0gJycpIHtcclxuICAgICAgICBhbnN3ZXJzLnB1c2goU3RyaW5nKGEuYW5zd2VyKSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gUHJvb2YgdGhlIGNob3NlbiBvcHRpb24gYXNrZWQgZm9yIChhbnN3ZXIgdmFsaWRhdGlvbik6IGEgcGhvdG8sIGEgdmlkZW8sIHRleHQsIG9yIHNldmVyYWwgcGhvdG9zLlxyXG4gICAgICBpZiAoYS52YWxpZGF0aW9uQW5zd2VyKSB7XHJcbiAgICAgICAgaWYgKGEudmFsaWRhdGlvblR5cGUgPT09ICdDYXB0dXJlIEltYWdlJykge1xyXG4gICAgICAgICAgYWRkKGEudmFsaWRhdGlvbkFuc3dlciwgZmFsc2UsIGNhcHR1cmVkID8gJycgOiBhLnJ1bkFJQW5zd2VyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGEudmFsaWRhdGlvblR5cGUgPT09ICdDYXB0dXJlIFZpZGVvJykge1xyXG4gICAgICAgICAgYWRkKGEudmFsaWRhdGlvbkFuc3dlciwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHByb29mVGV4dC5wdXNoKFN0cmluZyhhLnZhbGlkYXRpb25BbnN3ZXIpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgKGEudmFsaWRhdGlvbkltYWdlIHx8IFtdKS5mb3JFYWNoKChwOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gYWRkKHAsIGZhbHNlLCBhLnJ1bkFJRGF0YT8uW2ldPy5hbnN3ZXJJbWFnZSkpO1xyXG4gICAgICAoYS52YWxpZGF0aW9uVmlkZW8gfHwgW10pLmZvckVhY2goKHA6IHN0cmluZykgPT4gYWRkKHAsIHRydWUpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHNjb3JlZCA9ICEhcS5jb21wbGlhbmNlO1xyXG4gICAgY29uc3Qgb3B0aW9uczogQW5zd2VyT3B0aW9uW10gPSAocS5hbnN3ZXJzIHx8IFtdKVxyXG4gICAgICAubWFwKChvOiBhbnkpID0+ICh7IGxhYmVsOiBTdHJpbmcobz8uYW5zd2VyID8/ICcnKSwgc2NvcmU6IHNjb3JlZCA/IChOdW1iZXIobz8uY29tcGxpYW5jZVNjb3JlKSB8fCAwKSA6IG51bGwsIGZsYWc6ICEhbz8uc29wRmxhZyB9KSlcclxuICAgICAgLmZpbHRlcigobzogQW5zd2VyT3B0aW9uKSA9PiBvLmxhYmVsKTtcclxuICAgIGNvbnN0IG9wdGlvbkZvciA9IChsYWJlbDogc3RyaW5nKSA9PiBvcHRpb25zLmZpbmQobyA9PiBvLmxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcblxyXG4gICAgY29uc3QgaGFzUmV2aXNpb24gPSAhIShxLnJldmlzZWRBbnN3ZXIgfHwgcS5yZXZpc2VkUmVhc29uKSB8fCAocS5yZXZpc2VkU2NvcmUgIT09IHVuZGVmaW5lZCAmJiBxLnJldmlzZWRTY29yZSAhPT0gbnVsbCk7XHJcbiAgICBjb25zdCByZXZpc2VkQW5zd2VyID0gU3RyaW5nKHEucmV2aXNlZEFuc3dlciB8fCAnJyk7XHJcbiAgICBjb25zdCByZXZpc2VkID0gaGFzUmV2aXNpb25cclxuICAgICAgPyB7XHJcbiAgICAgICAgYW5zd2VyOiByZXZpc2VkQW5zd2VyLFxyXG4gICAgICAgIHJlYXNvbjogU3RyaW5nKHEucmV2aXNlZFJlYXNvbiB8fCAnJyksXHJcbiAgICAgICAgc2NvcmU6IHRoaXMubnVtKHEucmV2aXNlZFNjb3JlKSA/PyAocmV2aXNlZEFuc3dlciA/IG9wdGlvbkZvcihyZXZpc2VkQW5zd2VyKT8uc2NvcmUgPz8gbnVsbCA6IG51bGwpLFxyXG4gICAgICAgIGJ5OiBTdHJpbmcocS5yZXZpc2VkQnk/Lm5hbWUgfHwgJycpXHJcbiAgICAgIH1cclxuICAgICAgOiBudWxsO1xyXG4gICAgLy8gQSByZXZpc2VkIGFuc3dlciBpcyBiYXJlIG9wdGlvbiB0ZXh0OyBpdHMgZmxhZyBjb21lcyBmcm9tIHRoZSBtYXRjaGluZyBjb25maWd1cmVkIG9wdGlvbi5cclxuICAgIGNvbnN0IGZsYWdnZWQgPSByZXZpc2VkPy5hbnN3ZXIgPyAhIW9wdGlvbkZvcihyZXZpc2VkLmFuc3dlcik/LmZsYWcgOiBnaXZlbi5zb21lKChhOiBhbnkpID0+IGEuc29wRmxhZyk7XHJcbiAgICAvLyBUaGUgc3VibWl0dGVkIGFuc3dlcidzIG93biBjb21wbGlhbmNlU2NvcmUsIGVsc2UgdGhlIGNvbmZpZ3VyZWQgb3B0aW9uJ3MgKHNvbWUgc3VibWlzc2lvbnNcclxuICAgIC8vIGNhcnJ5IG9ubHkgdGhlIGFuc3dlciB0ZXh0KS5cclxuICAgIGNvbnN0IHNjb3JlcyA9IGdpdmVuLm1hcCgoYTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG93biA9IHRoaXMubnVtKGEuY29tcGxpYW5jZVNjb3JlKTtcclxuICAgICAgcmV0dXJuIG93biA/PyAob3B0aW9uRm9yKFN0cmluZyhhPy5hbnN3ZXIgPz8gJycpKT8uc2NvcmUgPz8gMCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGFjdHVhbFNjb3JlID0gc2NvcmVkID8gKHNjb3Jlcy5sZW5ndGggPyBNYXRoLm1heCguLi5zY29yZXMpIDogMCkgOiBudWxsO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogdGhpcy5xdWVzdGlvbktleShzZWN0aW9uLCBxLnFuYW1lKSxcclxuICAgICAgc2VjdGlvbixcclxuICAgICAgcW5vOiBTdHJpbmcocS5xbm8gPz8gJycpLFxyXG4gICAgICB0ZXh0OiB0aGlzLmNsZWFuKHEucW5hbWUpLFxyXG4gICAgICBhbnN3ZXJUeXBlOiBxLmFuc3dlclR5cGUgfHwgJycsXHJcbiAgICAgIGFuc3dlcnMsXHJcbiAgICAgIG1lZGlhLFxyXG4gICAgICBpbWFnZXM6IG1lZGlhLmZpbHRlcihtID0+ICFtLnZpZGVvKS5tYXAobSA9PiBtLnNyYyksXHJcbiAgICAgIHZpZGVvczogbWVkaWEuZmlsdGVyKG0gPT4gbS52aWRlbykubWFwKG0gPT4gbS5zcmMpLFxyXG4gICAgICB2YWxpZGF0aW9uVGV4dDogcHJvb2ZUZXh0LmpvaW4oJywgJyksXHJcbiAgICAgIHJlbWFyazogcS5yZW1hcmtzIHx8ICcnLFxyXG4gICAgICBleHRyYVJlbWFyazogcS5zdG9yZU1hbmFnZXJSZW1hcmsgfHwgJycsXHJcbiAgICAgIGFjdHVhbFNjb3JlLFxyXG4gICAgICBzY29yZTogc2NvcmVkID8gKHJldmlzZWQ/LnNjb3JlID8/IGFjdHVhbFNjb3JlKSA6IG51bGwsXHJcbiAgICAgIGZsYWdnZWQsXHJcbiAgICAgIHJlZG86ICEhcS5yZWRvLFxyXG4gICAgICByZXZpc2VkLFxyXG4gICAgICBvcHRpb25zLFxyXG4gICAgICBlZGl0YWJsZTogUkVWSVNBQkxFX1RZUEVTLmluY2x1ZGVzKHEuYW5zd2VyVHlwZSkgJiYgb3B0aW9ucy5sZW5ndGggPiAxXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlZCBtZWRpYSBpcyBhIGJ1Y2tldCBrZXk7IGEgZmV3IG9sZGVyIHJlY29yZHMgYWxyZWFkeSBob2xkIGEgZnVsbCBVUkwuICovXHJcbiAgcHJpdmF0ZSBtZWRpYVVybChwYXRoOiBhbnksIGNkbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHAgPSBTdHJpbmcocGF0aCA/PyAnJykudHJpbSgpO1xyXG4gICAgaWYgKCFwKSB7IHJldHVybiAnJzsgfVxyXG4gICAgcmV0dXJuIC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QocCkgPyBwIDogY2RuICsgcC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcclxuICB9XHJcblxyXG4gIC8qKiBDYXB0dXJlIEltYWdlL1ZpZGVvIGFuc3dlcnM6IHRoZSBlbnRyeSdzIG93biB0eXBlLCBlbHNlIHRoZSBmaWxlIGV4dGVuc2lvbiAoY2hlY2tsaXN0IGdhbGxlcnkgcnVsZSkuICovXHJcbiAgcHJpdmF0ZSBpc1ZpZGVvQW5zd2VyKGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGE/LmFuc3dlclR5cGUgPT09ICd2aWRlbycgfHwgYT8ubWVkaWFUeXBlID09PSAndmlkZW8nIHx8IGE/LnR5cGUgPT09ICd2aWRlbycpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHJldHVybiBWSURFT19GSUxFLnRlc3QoU3RyaW5nKGE/LmFuc3dlciB8fCAnJykuc3BsaXQoJz8nKVswXSk7XHJcbiAgfVxyXG5cclxuICBvbk1lZGlhRXJyb3Ioc3JjOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYnJva2VuTWVkaWEgPSBuZXcgU2V0KHRoaXMuYnJva2VuTWVkaWEpLmFkZChzcmMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBxdWVzdGlvbktleShzZWN0aW9uOiBzdHJpbmcsIHFuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHNlY3Rpb24gKyAnfCcgKyB0aGlzLmNsZWFuKHFuYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYW4odGV4dDogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTdHJpbmcodGV4dCA/PyAnJykucmVwbGFjZSgvXFxuL2csICcgJykudHJpbSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBudW0odjogYW55KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gJycgfHwgIU51bWJlci5pc0Zpbml0ZShOdW1iZXIodikpID8gbnVsbCA6IE51bWJlcih2KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIFBhZ2luZ1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBnZXQgcGFnZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b3RhbCA/ICh0aGlzLnBhZ2VJbmRleCArIDEpICsgJyBvZiAnICsgdGhpcy50b3RhbCA6ICcwIG9mIDAnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhblByZXYoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZyAmJiB0aGlzLnBhZ2VJbmRleCA+IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuTmV4dCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5sb2FkaW5nICYmIHRoaXMucGFnZUluZGV4ICsgMSA8IHRoaXMudG90YWw7XHJcbiAgfVxyXG5cclxuICBwcmV2UGFnZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jYW5QcmV2KSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5wYWdlSW5kZXgtLTtcclxuICAgIHRoaXMubG9hZFBhZ2UoKTtcclxuICB9XHJcblxyXG4gIG5leHRQYWdlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbk5leHQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnBhZ2VJbmRleCsrO1xyXG4gICAgdGhpcy5sb2FkUGFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gTGVmdCBwYW5lbFxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBnZXQgc2VjdGlvbnMoKTogQXVkaXRTZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25TZWN0aW9ucztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oaTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZW5TZWN0aW9uID0gdGhpcy5vcGVuU2VjdGlvbiA9PT0gaSA/IG51bGwgOiBpO1xyXG4gIH1cclxuXHJcbiAgaXNRdWVzdGlvblNlbGVjdGVkKHE6IEF1ZGl0UXVlc3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSWRzLmhhcyhxLmtleSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVRdWVzdGlvbihxOiBBdWRpdFF1ZXN0aW9uKTogdm9pZCB7XHJcbiAgICAvLyBSZS1jcmVhdGUgdGhlIFNldCBzbyB0aGUgZ2V0dGVyLWRyaXZlbiB0ZW1wbGF0ZSBwaWNrcyB1cCB0aGUgY2hhbmdlLlxyXG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZElkcyk7XHJcbiAgICBuZXh0LmhhcyhxLmtleSkgPyBuZXh0LmRlbGV0ZShxLmtleSkgOiBuZXh0LmFkZChxLmtleSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV4dDtcclxuICB9XHJcblxyXG4gIC8qKiBUaWNrZWQgcXVlc3Rpb25zIGluIG9uZSBzZWN0aW9uICgwID0gbm9uZSkuICovXHJcbiAgc2VjdGlvblBpY2tlZChzOiBBdWRpdFNlY3Rpb24pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuc2l6ZSA/IHMucXVlc3Rpb25zLmZpbHRlcihxID0+IHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHEua2V5KSkubGVuZ3RoIDogMDtcclxuICB9XHJcblxyXG4gIC8qKiBcIlZpZXcgQWxsIEFuc3dlcnNcIjogZHJvcCBhbnkgcXVlc3Rpb24gc2VsZWN0aW9uLiAqL1xyXG4gIHZpZXdBbGxBbnN3ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSWRzLnNpemUgPiAwO1xyXG4gIH1cclxuXHJcbiAgLyoqIExlZnQtcGFuZWwgZG90cyBmb3IgdGhlIHN1Ym1pc3Npb24gaW4gdmlldy4gKi9cclxuICBpc1JldmlzZWQocTogQXVkaXRRdWVzdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5zb21lKHIgPT4gci5rZXkgPT09IHEua2V5ICYmIHIucmV2aXNlZCAhPT0gbnVsbCk7XHJcbiAgfVxyXG5cclxuICBpc0ZsYWdnZWQocTogQXVkaXRRdWVzdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5zb21lKHIgPT4gci5rZXkgPT09IHEua2V5ICYmIHIuZmxhZ2dlZCk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5U2VjdGlvbihfOiBudW1iZXIsIHM6IEF1ZGl0U2VjdGlvbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gRmlsdGVyIGRyYXdlclxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogRXZlcnkgZmlsdGVyIGNhdGVnb3J5LCBpbiB0aGUgb3JkZXIgdGhlIGRyYXdlciBsaXN0cyB0aGVtLiAqL1xyXG4gIGdldCBmaWx0ZXJEZWZzKCk6IEZpbHRlckRlZltdIHtcclxuICAgIGNvbnN0IHN0b3JlSWRzID0gdGhpcy5zdG9yZU9wdGlvbnMubWFwKHMgPT4gcy5zdG9yZUlkKTtcclxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnID8gdGhpcy5jbHVzdGVyTmFtZXMgOiB0aGlzLnRlYW1OYW1lcztcclxuICAgIGNvbnN0IGRlZnM6IEZpbHRlckRlZltdID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICd0eXBlJywgbGFiZWw6ICdUeXBlJywgaGludDogJ1BpY2sgd2hhdCBraW5kIG9mIHJlY29yZHMgdGhlIGdhbGxlcnkgc2hvdWxkIGxpc3QuJyxcclxuICAgICAgICBtdWx0aTogZmFsc2UsIGtpbmQ6ICdsaXN0JywgZ3JvdXA6ICdwcmltYXJ5Jywgc2VhcmNoYWJsZTogdHJ1ZSxcclxuICAgICAgICBvcHRpb25zOiBbeyBsYWJlbDogJ0F1ZGl0JywgbWV0YTogJ1N1Ym1pdHRlZCBhdWRpdHMnIH1dXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ3N0b3JlcycsIGxhYmVsOiAnU3RvcmVzJywgaGludDogJ1NlbGVjdCBhbGwgc3RvcmVzLCBvciBwaWNrIHRoZW0gaW5kaXZpZHVhbGx5LicsXHJcbiAgICAgICAgbXVsdGk6IHRydWUsIGtpbmQ6ICdsaXN0JywgZ3JvdXA6ICdwcmltYXJ5Jywgc2VhcmNoYWJsZTogdHJ1ZSxcclxuICAgICAgICAvLyBVc2VyLWNvdmVyYWdlIGF1ZGl0cyBhcmUgc2NvcGVkIGJ5IHRlYW0gdXNlcnMsIG5vdCBzdG9yZXMuXHJcbiAgICAgICAgaGlkZTogdGhpcy5mU2NvcGUgPT09ICdUZWFtcycsXHJcbiAgICAgICAgb3B0aW9uczogW1xyXG4gICAgICAgICAgeyBsYWJlbDogJ0FsbCBzdG9yZXMnLCBtZXRhOiAnU2VsZWN0IGV2ZXJ5IHN0b3JlIGluIHNjb3BlJywgYWxsT2Y6IHN0b3JlSWRzIH0sXHJcbiAgICAgICAgICAuLi50aGlzLnN0b3JlT3B0aW9ucy5tYXAocyA9PiAoeyBsYWJlbDogcy5zdG9yZU5hbWUgfHwgcy5zdG9yZUlkLCBtZXRhOiBzLnN0b3JlSWQsIHZhbHVlOiBzLnN0b3JlSWQgfSkpXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdhbnN3ZXInLCBsYWJlbDogJ0Fuc3dlciBUeXBlJywgaGludDogJ0ZpbHRlciBxdWVzdGlvbnMgYnkgdGhlIGFuc3dlciBjYXB0dXJlZC4nLFxyXG4gICAgICAgIG11bHRpOiBmYWxzZSwga2luZDogJ2xpc3QnLCBncm91cDogJ3ByaW1hcnknLCBzZWFyY2hhYmxlOiB0cnVlLFxyXG4gICAgICAgIG9wdGlvbnM6IEFOU1dFUl9UWVBFUy5tYXAoYSA9PiAoeyBsYWJlbDogYS5sYWJlbCB9KSlcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIC8vIFRoZSBnYWxsZXJ5IEFQSSBjYW5ub3QgZmlsdGVyIG9uIHRoZSBmaW5hbCBzY29yZSB5ZXQuXHJcbiAgICAgICAgaWQ6ICdyZXN1bHQnLCBsYWJlbDogJ1Bhc3MgLyBGYWlsIFJlc3VsdCcsIGhpZGU6IHRydWUsXHJcbiAgICAgICAgaGludDogJ0V2YWx1YXRlZCBvbiB0aGUgZmluYWwgc2NvcmUgYWZ0ZXIgYXBwcm92ZWQgZGlzcHV0ZXMuIFBhc3MgbWFyayAnICsgdGhpcy5wYXNzVGhyZXNob2xkICsgJyUuJyxcclxuICAgICAgICBtdWx0aTogZmFsc2UsIGtpbmQ6ICdsaXN0JywgZ3JvdXA6ICdwcmltYXJ5JyxcclxuICAgICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgICB7IGxhYmVsOiAnQWxsJywgbWV0YTogJ0V2ZXJ5IHN1Ym1pdHRlZCBhdWRpdCcgfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdQYXNzJywgbWV0YTogJ0ZpbmFsIHNjb3JlIGF0IG9yIGFib3ZlIHRoZSBwYXNzIG1hcmsnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnRmFpbCcsIG1ldGE6ICdGaW5hbCBzY29yZSBiZWxvdyB0aGUgcGFzcyBtYXJrJyB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdzY29yZScsIGxhYmVsOiAnQ29tcGxpYW5jZSBTY29yZScsIGhpZGU6IHRydWUsXHJcbiAgICAgICAgaGludDogJ1Nob3cgc3VibWlzc2lvbnMgd2hvc2UgZmluYWwgY29tcGxpYW5jZSBzY29yZSBmYWxscyBpbnNpZGUgdGhpcyByYW5nZS4nLFxyXG4gICAgICAgIG11bHRpOiBmYWxzZSwga2luZDogJ3Njb3JlJywgZ3JvdXA6ICdwcmltYXJ5Jywgb3B0aW9uczogW11cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnZGF0ZScsIGxhYmVsOiAnRGF0ZSBSYW5nZScsIGhpbnQ6ICdQaWNrIGEgc2luZ2xlIGRhdGUgb3IgYSBzdGFydCBhbmQgZW5kIGRhdGUgZm9yIGEgcmFuZ2UuJyxcclxuICAgICAgICBtdWx0aTogZmFsc2UsIGtpbmQ6ICdkYXRlJywgZ3JvdXA6ICdwcmltYXJ5Jywgb3B0aW9uczogW11cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnbmFtZScsIGxhYmVsOiB0aGlzLmZUeXBlICsgJyBOYW1lJywgaGludDogJ0F1ZGl0cyBjb25maWd1cmVkIHdpdGggYXVkaXQgbW9kZSBvbi4nLFxyXG4gICAgICAgIG11bHRpOiBmYWxzZSwga2luZDogJ2xpc3QnLCBncm91cDogJ3NlY29uZGFyeScsIHNlYXJjaGFibGU6IHRydWUsXHJcbiAgICAgICAgb3B0aW9uczogdGhpcy5hdWRpdHMubWFwKGEgPT4gKHtcclxuICAgICAgICAgIGxhYmVsOiBhLmNoZWNrTGlzdE5hbWUsXHJcbiAgICAgICAgICB2YWx1ZTogYS5faWQsXHJcbiAgICAgICAgICBtZXRhOiAoYS5jb3ZlcmFnZSA9PT0gJ3VzZXInID8gJ1VzZXIgY292ZXJhZ2UnIDogJ1N0b3JlIGNvdmVyYWdlJykgK1xyXG4gICAgICAgICAgICAoYS5wYXNzTWFyayA/ICcgwrcgUGFzcyBtYXJrICcgKyBhLnBhc3NNYXJrICsgJyUnIDogJycpXHJcbiAgICAgICAgfSkpXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ3Njb3BlJywgbGFiZWw6ICdDbHVzdGVycyAvIFRlYW1zJywgaGludDogJ1NldCBieSB0aGUgc2VsZWN0ZWQgYXVkaXRcXCdzIGNvdmVyYWdlLicsXHJcbiAgICAgICAgbXVsdGk6IGZhbHNlLCBraW5kOiAnbGlzdCcsIGdyb3VwOiAnc2Vjb25kYXJ5JyxcclxuICAgICAgICBvcHRpb25zOiB0aGlzLmZTY29wZSA9PT0gJ0NsdXN0ZXJzJ1xyXG4gICAgICAgICAgPyBbeyBsYWJlbDogJ0NsdXN0ZXJzJywgbWV0YTogJ1N0b3JlIGNvdmVyYWdlIC0gZ3JvdXAgc3RvcmVzIGJ5IGNsdXN0ZXInIH1dXHJcbiAgICAgICAgICA6IFt7IGxhYmVsOiAnVGVhbXMnLCBtZXRhOiAnVXNlciBjb3ZlcmFnZSAtIGdyb3VwIHVzZXJzIGJ5IHRlYW0nIH1dXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ2NsdXN0ZXInLCBsYWJlbDogdGhpcy5mU2NvcGUgPT09ICdDbHVzdGVycycgPyAnU2VsZWN0IENsdXN0ZXJzJyA6ICdTZWxlY3QgVGVhbXMnLFxyXG4gICAgICAgIGhpbnQ6ICdTZWxlY3Qgb25lIG9yIG1vcmUsIG9yIHBpY2sgYWxsLicsIG11bHRpOiB0cnVlLCBraW5kOiAnbGlzdCcsXHJcbiAgICAgICAgZ3JvdXA6ICdzZWNvbmRhcnknLCBzZWFyY2hhYmxlOiB0cnVlLFxyXG4gICAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICAgIHsgbGFiZWw6IHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnID8gJ0FsbCBjbHVzdGVycycgOiAnQWxsIHRlYW1zJywgbWV0YTogJ1NlbGVjdCBldmVyeSBvbmUnLCBhbGxPZjogZ3JvdXBzIH0sXHJcbiAgICAgICAgICAuLi5ncm91cHMubWFwKGcgPT4gKHsgbGFiZWw6IGcgfSkpXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdzdGF0dXMnLCBsYWJlbDogJ0FwcHJvdmFsIFN0YXR1cycsIGhpbnQ6ICdBcHByb3ZhbCBzdGF0ZSBvZiB0aGUgc3VibWlzc2lvbi4nLFxyXG4gICAgICAgIG11bHRpOiBmYWxzZSwga2luZDogJ2xpc3QnLCBncm91cDogJ3NlY29uZGFyeScsXHJcbiAgICAgICAgb3B0aW9uczogW3sgbGFiZWw6ICdBbGwnIH0sIHsgbGFiZWw6ICdBcHByb3ZlZCcgfSwgeyBsYWJlbDogJ05vdC1BcHByb3ZlZCcgfV1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnZmxhZ3MnLCBsYWJlbDogJ1N1Ym1pc3Npb24gRmxhZ3MnLCBoaW50OiAnU2hvdyBvbmx5IHN1Ym1pc3Npb25zIHdpdGggdGhlc2UgbWFya2Vycy4nLFxyXG4gICAgICAgIG11bHRpOiB0cnVlLCBraW5kOiAnbGlzdCcsIGdyb3VwOiAnc2Vjb25kYXJ5JyxcclxuICAgICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgICB7IGxhYmVsOiAnRGlzcHV0ZWQgU3VibWlzc2lvbnMnLCBtZXRhOiAnSGFzIG9uZSBvciBtb3JlIGRpc3B1dGVzJyB9LFxyXG4gICAgICAgICAgeyBsYWJlbDogJ1JlLWRvJywgbWV0YTogJ1JlLWRvIHdhcyByZXF1ZXN0ZWQnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnRmxhZycsIG1ldGE6ICdGbGFnZ2VkIGFuc3dlcnMnIH1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgICByZXR1cm4gZGVmcy5maWx0ZXIoZiA9PiAhZi5oaWRlKTtcclxuICB9XHJcblxyXG4gIGdldCBwcmltYXJ5RGVmcygpOiBGaWx0ZXJEZWZbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJEZWZzLmZpbHRlcihmID0+IGYuZ3JvdXAgPT09ICdwcmltYXJ5Jyk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2Vjb25kYXJ5RGVmcygpOiBGaWx0ZXJEZWZbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJEZWZzLmZpbHRlcihmID0+IGYuZ3JvdXAgPT09ICdzZWNvbmRhcnknKTtcclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVEZWYoKTogRmlsdGVyRGVmIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckRlZnMuZmluZChmID0+IGYuaWQgPT09IHRoaXMuYWN0aXZlRmlsdGVyKSB8fCB0aGlzLmZpbHRlckRlZnNbMF07XHJcbiAgfVxyXG5cclxuICAvKiogT3B0aW9ucyBpbiB0aGUgYWN0aXZlIGNhdGVnb3J5LCBuYXJyb3dlZCBieSB0aGUgcGFuZSBzZWFyY2ggYm94LiAqL1xyXG4gIGdldCBhY3RpdmVPcHRpb25zKCk6IEZpbHRlck9wdGlvbltdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLm9wdGlvblF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKCFxKSB7IHJldHVybiB0aGlzLmFjdGl2ZURlZi5vcHRpb25zOyB9XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVEZWYub3B0aW9ucy5maWx0ZXIobyA9PlxyXG4gICAgICAoby5sYWJlbCArICcgJyArIChvLm1ldGEgfHwgJycpKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcclxuICB9XHJcblxyXG4gIGdldCBub09wdGlvbk1hdGNoKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRGVmLmtpbmQgPT09ICdsaXN0JyAmJiAhdGhpcy5hY3RpdmVPcHRpb25zLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGdldCBzZWFyY2hQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICdTZWFyY2ggJyArIHRoaXMuYWN0aXZlRGVmLmxhYmVsLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogSHVtYW4tcmVhZGFibGUgY3VycmVudCB2YWx1ZSBmb3IgYSBjYXRlZ29yeS4gKi9cclxuICBzdW1tYXJ5Rm9yKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChpZCkge1xyXG4gICAgICBjYXNlICd0eXBlJzogcmV0dXJuIHRoaXMuZlR5cGU7XHJcbiAgICAgIGNhc2UgJ25hbWUnOiByZXR1cm4gdGhpcy5mTmFtZSB8fCAnTm8gYXVkaXRzJztcclxuICAgICAgY2FzZSAnYW5zd2VyJzogcmV0dXJuIHRoaXMuZkFuc3dlcjtcclxuICAgICAgY2FzZSAnZGF0ZSc6IHJldHVybiB0aGlzLnJhbmdlTGFiZWw7XHJcbiAgICAgIGNhc2UgJ3Njb3BlJzogcmV0dXJuIHRoaXMuZlNjb3BlO1xyXG4gICAgICBjYXNlICdjbHVzdGVyJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5mQ2x1c3RlcnMubGVuZ3RoXHJcbiAgICAgICAgICA/IHRoaXMuZkNsdXN0ZXJzLmxlbmd0aCArICcgc2VsZWN0ZWQnXHJcbiAgICAgICAgICA6ICh0aGlzLmZTY29wZSA9PT0gJ0NsdXN0ZXJzJyA/ICdBbGwgY2x1c3RlcnMnIDogJ0FsbCB0ZWFtcycpO1xyXG4gICAgICBjYXNlICdzdG9yZXMnOiByZXR1cm4gdGhpcy5mU3RvcmVzLmxlbmd0aCA/IHRoaXMuZlN0b3Jlcy5sZW5ndGggKyAnIHNlbGVjdGVkJyA6ICdBbGwgc3RvcmVzJztcclxuICAgICAgY2FzZSAnc3RhdHVzJzogcmV0dXJuIHRoaXMuZlN0YXR1cztcclxuICAgICAgY2FzZSAncmVzdWx0JzogcmV0dXJuIHRoaXMuZlJlc3VsdDtcclxuICAgICAgY2FzZSAnc2NvcmUnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmZTY29yZU1pbiA9PT0gMCAmJiB0aGlzLmZTY29yZU1heCA9PT0gMTAwXHJcbiAgICAgICAgICA/ICdBbGwgc2NvcmVzJ1xyXG4gICAgICAgICAgOiB0aGlzLmZTY29yZU1pbiArICclIOKAkyAnICsgdGhpcy5mU2NvcmVNYXggKyAnJSc7XHJcbiAgICAgIGNhc2UgJ2ZsYWdzJzogcmV0dXJuIHRoaXMuZkZsYWdzLmxlbmd0aCA/IHRoaXMuZkZsYWdzLmpvaW4oJywgJykgOiAnTm9uZSc7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gYSBjYXRlZ29yeSBkaWZmZXJzIGZyb20gaXRzIGRlZmF1bHQuICovXHJcbiAgaXNEaXJ0eShpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgIGNhc2UgJ3R5cGUnOiByZXR1cm4gdGhpcy5mVHlwZSAhPT0gREVGQVVMVFMudHlwZTtcclxuICAgICAgY2FzZSAnYW5zd2VyJzogcmV0dXJuIHRoaXMuZkFuc3dlciAhPT0gREVGQVVMVFMuYW5zd2VyO1xyXG4gICAgICBjYXNlICdkYXRlJzogcmV0dXJuIHRoaXMuZGF0ZVBpY2tlZDtcclxuICAgICAgY2FzZSAnY2x1c3Rlcic6IHJldHVybiB0aGlzLmZDbHVzdGVycy5sZW5ndGggPiAwO1xyXG4gICAgICBjYXNlICdzdG9yZXMnOiByZXR1cm4gdGhpcy5mU3RvcmVzLmxlbmd0aCA+IDA7XHJcbiAgICAgIGNhc2UgJ3N0YXR1cyc6IHJldHVybiB0aGlzLmZTdGF0dXMgIT09IERFRkFVTFRTLnN0YXR1cztcclxuICAgICAgY2FzZSAncmVzdWx0JzogcmV0dXJuIHRoaXMuZlJlc3VsdCAhPT0gREVGQVVMVFMucmVzdWx0O1xyXG4gICAgICBjYXNlICdzY29yZSc6IHJldHVybiB0aGlzLmZTY29yZU1pbiAhPT0gMCB8fCB0aGlzLmZTY29yZU1heCAhPT0gMTAwO1xyXG4gICAgICBjYXNlICdmbGFncyc6IHJldHVybiB0aGlzLmZGbGFncy5sZW5ndGggPiAwO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aXZlRmlsdGVyQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckRlZnMuZmlsdGVyKGYgPT4gdGhpcy5pc0RpcnR5KGYuaWQpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgcmFuZ2VMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZm10ID0gKGlzbzogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IHAgPSAoaXNvIHx8ICcnKS5zcGxpdCgnLScpO1xyXG4gICAgICByZXR1cm4gcC5sZW5ndGggPT09IDMgPyBwWzJdICsgJy0nICsgcFsxXSArICctJyArIHBbMF0gOiBpc287XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGZtdCh0aGlzLmZTdGFydCkgKyAnIC0gJyArIGZtdCh0aGlzLmZFbmQgfHwgdGhpcy5mU3RhcnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBkcmF3ZXIgZGF0ZSBkaWZmZXJzIGZyb20gdGhlIGhlYWRlciByYW5nZS4gKi9cclxuICBnZXQgZGF0ZVBpY2tlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZTdGFydCAhPT0gdGhpcy5oZWFkZXJTdGFydCB8fCB0aGlzLmZFbmQgIT09IHRoaXMuaGVhZGVyRW5kO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlIGNoaXAgbGFiZWwgaW4gdGhlIGhlYWRlciBiYXIuICovXHJcbiAgZ2V0IHN0b3JlU3VtbWFyeSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZlNjb3BlID09PSAnVGVhbXMnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZDbHVzdGVycy5sZW5ndGggPyB0aGlzLmZDbHVzdGVyc1swXSArICh0aGlzLmZDbHVzdGVycy5sZW5ndGggPiAxID8gJyArJyArICh0aGlzLmZDbHVzdGVycy5sZW5ndGggLSAxKSA6ICcnKSA6ICdBbGwgdGVhbXMnO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZTdG9yZXMubGVuZ3RoKSB7IHJldHVybiAnQWxsIHN0b3Jlcyc7IH1cclxuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zdG9yZU9wdGlvbnMuZmluZChzID0+IHMuc3RvcmVJZCA9PT0gdGhpcy5mU3RvcmVzWzBdKTtcclxuICAgIHJldHVybiAoZmlyc3Q/LnN0b3JlTmFtZSB8fCB0aGlzLmZTdG9yZXNbMF0pICsgKHRoaXMuZlN0b3Jlcy5sZW5ndGggPiAxID8gJyArJyArICh0aGlzLmZTdG9yZXMubGVuZ3RoIC0gMSkgOiAnJyk7XHJcbiAgfVxyXG5cclxuICBvcGVuRmlsdGVycyhpZD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBvcnRPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLnNuYXBzaG90ID0gdGhpcy5jYXB0dXJlKCk7XHJcbiAgICB0aGlzLmFjdGl2ZUZpbHRlciA9IGlkIHx8IHRoaXMuYWN0aXZlRmlsdGVyO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlckRlZnMuc29tZShmID0+IGYuaWQgPT09IHRoaXMuYWN0aXZlRmlsdGVyKSkgeyB0aGlzLmFjdGl2ZUZpbHRlciA9ICd0eXBlJzsgfVxyXG4gICAgdGhpcy5vcHRpb25RdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5mUmFuZ2UgPSB0b0lubGluZVBpY2tlclJhbmdlKHRoaXMuZlN0YXJ0LCB0aGlzLmZFbmQgfHwgdGhpcy5mU3RhcnQpO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLnNldFBhZ2VTY3JvbGxMb2NrZWQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogSGVhZGVyIFwiU3RvcmVzXCIgY2hpcCBvcGVucyB0aGUgVGVhbXMgbGlzdCBmb3IgYSB1c2VyLWNvdmVyYWdlIGF1ZGl0LiAqL1xyXG4gIG9wZW5TY29wZUZpbHRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlbkZpbHRlcnModGhpcy5mU2NvcGUgPT09ICdUZWFtcycgPyAnY2x1c3RlcicgOiAnc3RvcmVzJyk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXRlZ29yeShpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUZpbHRlciA9IGlkO1xyXG4gICAgdGhpcy5vcHRpb25RdWVyeSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIERyYXdlciByYW5nZSBwaWNrZXI6IGEgc2luZ2xlIGRheSBjb21lcyBiYWNrIGFzIHRoZSBzYW1lIHN0YXJ0IGFuZCBlbmQuICovXHJcbiAgb25SYW5nZVBpY2tlZChlOiBQaWNrZWREYXRlcyB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBpY2tlZCA9IGZyb21QaWNrZXJSYW5nZShlKTtcclxuICAgIGlmICghcGlja2VkKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5mU3RhcnQgPSBwaWNrZWQuZnJvbTtcclxuICAgIHRoaXMuZkVuZCA9IHBpY2tlZC50bztcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuc25hcHNob3QgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZXRQYWdlU2Nyb2xsTG9ja2VkKGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5mRW5kIHx8IHRoaXMuZkVuZCA8IHRoaXMuZlN0YXJ0KSB7IHRoaXMuZkVuZCA9IHRoaXMuZlN0YXJ0OyB9XHJcbiAgICB0aGlzLmxvYWRHYWxsZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2x1c3RlcnNCZWZvcmUgPSB0aGlzLmZDbHVzdGVycy5qb2luKCd8Jyk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdCkgeyB0aGlzLnJlc3RvcmUodGhpcy5zbmFwc2hvdCk7IH1cclxuICAgIHRoaXMuc25hcHNob3QgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZXRQYWdlU2Nyb2xsTG9ja2VkKGZhbHNlKTtcclxuICAgIC8vIENsdXN0ZXIgcGlja3MgcmVsb2FkIHRoZSBzdG9yZSBsaXN0LCBzbyBwdXQgaXQgYmFjayBpbiBzdGVwIHdpdGggdGhlIHJlc3RvcmVkIGNsdXN0ZXJzLlxyXG4gICAgaWYgKHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnICYmIGNsdXN0ZXJzQmVmb3JlICE9PSB0aGlzLmZDbHVzdGVycy5qb2luKCd8JykpIHsgdGhpcy5sb2FkU3RvcmVzKCk7IH1cclxuICB9XHJcblxyXG4gIGNsZWFyRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZlN0YXJ0ID0gdGhpcy5oZWFkZXJTdGFydDtcclxuICAgIHRoaXMuZkVuZCA9IHRoaXMuaGVhZGVyRW5kO1xyXG4gICAgdGhpcy5mUmFuZ2UgPSB0b0lubGluZVBpY2tlclJhbmdlKHRoaXMuZlN0YXJ0LCB0aGlzLmZFbmQgfHwgdGhpcy5mU3RhcnQpO1xyXG4gICAgdGhpcy5mVHlwZSA9IERFRkFVTFRTLnR5cGU7XHJcbiAgICB0aGlzLmZBbnN3ZXIgPSBERUZBVUxUUy5hbnN3ZXI7XHJcbiAgICB0aGlzLmZDbHVzdGVycyA9IFtdO1xyXG4gICAgdGhpcy5mU3RvcmVzID0gW107XHJcbiAgICB0aGlzLmZTdGF0dXMgPSBERUZBVUxUUy5zdGF0dXM7XHJcbiAgICB0aGlzLmZSZXN1bHQgPSBERUZBVUxUUy5yZXN1bHQ7XHJcbiAgICB0aGlzLmZGbGFncyA9IFtdO1xyXG4gICAgdGhpcy5mU2NvcmVNaW4gPSBERUZBVUxUUy5zY29yZU1pbjtcclxuICAgIHRoaXMuZlNjb3JlTWF4ID0gREVGQVVMVFMuc2NvcmVNYXg7XHJcbiAgICBpZiAodGhpcy5mU2NvcGUgPT09ICdDbHVzdGVycycpIHsgdGhpcy5sb2FkU3RvcmVzKCk7IH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FwdHVyZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmU3RhcnQ6IHRoaXMuZlN0YXJ0LCBmRW5kOiB0aGlzLmZFbmQsIGZUeXBlOiB0aGlzLmZUeXBlLCBmQXVkaXRJZDogdGhpcy5mQXVkaXRJZCwgZk5hbWU6IHRoaXMuZk5hbWUsXHJcbiAgICAgIGZBbnN3ZXI6IHRoaXMuZkFuc3dlciwgZlNjb3BlOiB0aGlzLmZTY29wZSwgZkNsdXN0ZXJzOiBbLi4udGhpcy5mQ2x1c3RlcnNdLFxyXG4gICAgICBmU3RvcmVzOiBbLi4udGhpcy5mU3RvcmVzXSwgZlN0YXR1czogdGhpcy5mU3RhdHVzLCBmUmVzdWx0OiB0aGlzLmZSZXN1bHQsXHJcbiAgICAgIGZGbGFnczogWy4uLnRoaXMuZkZsYWdzXSwgZlNjb3JlTWluOiB0aGlzLmZTY29yZU1pbiwgZlNjb3JlTWF4OiB0aGlzLmZTY29yZU1heFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzdG9yZShzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xyXG4gICAgdGhpcy5mU3RhcnQgPSBzWydmU3RhcnQnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZFbmQgPSBzWydmRW5kJ10gYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mVHlwZSA9IHNbJ2ZUeXBlJ10gYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mQXVkaXRJZCA9IHNbJ2ZBdWRpdElkJ10gYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mTmFtZSA9IHNbJ2ZOYW1lJ10gYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mQW5zd2VyID0gc1snZkFuc3dlciddIGFzIHN0cmluZztcclxuICAgIHRoaXMuZlNjb3BlID0gc1snZlNjb3BlJ10gYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mQ2x1c3RlcnMgPSBzWydmQ2x1c3RlcnMnXSBhcyBzdHJpbmdbXTtcclxuICAgIHRoaXMuZlN0b3JlcyA9IHNbJ2ZTdG9yZXMnXSBhcyBzdHJpbmdbXTtcclxuICAgIHRoaXMuZlN0YXR1cyA9IHNbJ2ZTdGF0dXMnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZSZXN1bHQgPSBzWydmUmVzdWx0J10gYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mRmxhZ3MgPSBzWydmRmxhZ3MnXSBhcyBzdHJpbmdbXTtcclxuICAgIHRoaXMuZlNjb3JlTWluID0gc1snZlNjb3JlTWluJ10gYXMgbnVtYmVyO1xyXG4gICAgdGhpcy5mU2NvcmVNYXggPSBzWydmU2NvcmVNYXgnXSBhcyBudW1iZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlT2Yob3B0OiBGaWx0ZXJPcHRpb24pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG9wdC52YWx1ZSA/PyBvcHQubGFiZWw7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhbiBvcHRpb24gaW4gdGhlIGFjdGl2ZSBjYXRlZ29yeSBpcyBjdXJyZW50bHkgY2hvc2VuLiAqL1xyXG4gIGlzU2VsZWN0ZWQob3B0OiBGaWx0ZXJPcHRpb24pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5hY3RpdmVEZWYuaWQ7XHJcbiAgICBpZiAob3B0LmFsbE9mKSB7XHJcbiAgICAgIHJldHVybiAhIW9wdC5hbGxPZi5sZW5ndGggJiYgdGhpcy5saXN0Rm9yKGlkKS5sZW5ndGggPT09IG9wdC5hbGxPZi5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgIGNhc2UgJ3R5cGUnOiByZXR1cm4gdGhpcy5mVHlwZSA9PT0gb3B0LmxhYmVsO1xyXG4gICAgICBjYXNlICduYW1lJzogcmV0dXJuIHRoaXMuZkF1ZGl0SWQgPT09IHRoaXMudmFsdWVPZihvcHQpO1xyXG4gICAgICBjYXNlICdhbnN3ZXInOiByZXR1cm4gdGhpcy5mQW5zd2VyID09PSBvcHQubGFiZWw7XHJcbiAgICAgIGNhc2UgJ3Njb3BlJzogcmV0dXJuIHRoaXMuZlNjb3BlID09PSBvcHQubGFiZWw7XHJcbiAgICAgIGNhc2UgJ3N0YXR1cyc6IHJldHVybiB0aGlzLmZTdGF0dXMgPT09IG9wdC5sYWJlbDtcclxuICAgICAgY2FzZSAncmVzdWx0JzogcmV0dXJuIHRoaXMuZlJlc3VsdCA9PT0gb3B0LmxhYmVsO1xyXG4gICAgICBjYXNlICdjbHVzdGVyJzogcmV0dXJuIHRoaXMuZkNsdXN0ZXJzLmluY2x1ZGVzKG9wdC5sYWJlbCk7XHJcbiAgICAgIGNhc2UgJ3N0b3Jlcyc6IHJldHVybiB0aGlzLmZTdG9yZXMuaW5jbHVkZXModGhpcy52YWx1ZU9mKG9wdCkpO1xyXG4gICAgICBjYXNlICdmbGFncyc6IHJldHVybiB0aGlzLmZGbGFncy5pbmNsdWRlcyhvcHQubGFiZWwpO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RGb3IoaWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIGlmIChpZCA9PT0gJ2NsdXN0ZXInKSB7IHJldHVybiB0aGlzLmZDbHVzdGVyczsgfVxyXG4gICAgaWYgKGlkID09PSAnc3RvcmVzJykgeyByZXR1cm4gdGhpcy5mU3RvcmVzOyB9XHJcbiAgICByZXR1cm4gdGhpcy5mRmxhZ3M7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbHkgYSBjbGljayBvbiBhbiBvcHRpb24gaW4gdGhlIGFjdGl2ZSBjYXRlZ29yeS4gKi9cclxuICBwaWNrKG9wdDogRmlsdGVyT3B0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMuYWN0aXZlRGVmLmlkO1xyXG5cclxuICAgIGlmIChvcHQuYWxsT2YpIHtcclxuICAgICAgY29uc3QgYWxsID0gb3B0LmFsbE9mO1xyXG4gICAgICBjb25zdCBjaG9zZW4gPSB0aGlzLmxpc3RGb3IoaWQpLmxlbmd0aCA9PT0gYWxsLmxlbmd0aCA/IFtdIDogWy4uLmFsbF07XHJcbiAgICAgIGlmIChpZCA9PT0gJ2NsdXN0ZXInKSB7XHJcbiAgICAgICAgdGhpcy5mQ2x1c3RlcnMgPSBjaG9zZW47XHJcbiAgICAgICAgaWYgKHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnKSB7IHRoaXMubG9hZFN0b3JlcygpOyB9XHJcbiAgICAgIH0gZWxzZSBpZiAoaWQgPT09ICdzdG9yZXMnKSB7XHJcbiAgICAgICAgdGhpcy5mU3RvcmVzID0gY2hvc2VuO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgIGNhc2UgJ3R5cGUnOiB0aGlzLmZUeXBlID0gb3B0LmxhYmVsOyBicmVhaztcclxuICAgICAgY2FzZSAnbmFtZSc6IHtcclxuICAgICAgICBjb25zdCBhdWRpdCA9IHRoaXMuYXVkaXRzLmZpbmQoYSA9PiBhLl9pZCA9PT0gdGhpcy52YWx1ZU9mKG9wdCkpO1xyXG4gICAgICAgIGlmIChhdWRpdCkge1xyXG4gICAgICAgICAgY29uc3Qgc2NvcGVCZWZvcmUgPSB0aGlzLmZTY29wZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0QXVkaXQoYXVkaXQpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZlNjb3BlICE9PSBzY29wZUJlZm9yZSAmJiB0aGlzLmZTY29wZSA9PT0gJ0NsdXN0ZXJzJykgeyB0aGlzLmxvYWRTdG9yZXMoKTsgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdhbnN3ZXInOiB0aGlzLmZBbnN3ZXIgPSBvcHQubGFiZWw7IGJyZWFrO1xyXG4gICAgICBjYXNlICdzY29wZSc6IGJyZWFrO1xyXG4gICAgICBjYXNlICdzdGF0dXMnOiB0aGlzLmZTdGF0dXMgPSBvcHQubGFiZWw7IGJyZWFrO1xyXG4gICAgICBjYXNlICdyZXN1bHQnOiB0aGlzLmZSZXN1bHQgPSBvcHQubGFiZWw7IGJyZWFrO1xyXG4gICAgICBjYXNlICdjbHVzdGVyJzpcclxuICAgICAgICB0aGlzLmZDbHVzdGVycyA9IHRoaXMudG9nZ2xlKHRoaXMuZkNsdXN0ZXJzLCBvcHQubGFiZWwpO1xyXG4gICAgICAgIGlmICh0aGlzLmZTY29wZSA9PT0gJ0NsdXN0ZXJzJykgeyB0aGlzLmxvYWRTdG9yZXMoKTsgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzdG9yZXMnOiB0aGlzLmZTdG9yZXMgPSB0aGlzLnRvZ2dsZSh0aGlzLmZTdG9yZXMsIHRoaXMudmFsdWVPZihvcHQpKTsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2ZsYWdzJzogdGhpcy5mRmxhZ3MgPSB0aGlzLnRvZ2dsZSh0aGlzLmZGbGFncywgb3B0LmxhYmVsKTsgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvZ2dsZShsaXN0OiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBsaXN0LmluY2x1ZGVzKHZhbHVlKSA/IGxpc3QuZmlsdGVyKHggPT4geCAhPT0gdmFsdWUpIDogbGlzdC5jb25jYXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gU2NvcmVcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIFRoZSBzdWJtaXR0ZWQgYW5zd2VyLCBhcyB0ZXh0LiAqL1xyXG4gIGFjdHVhbEFuc3dlcihxOiBBbnN3ZXJSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHEuYW5zd2Vycy5qb2luKCcsICcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBBUEkncyBjb21wbGlhbmNlIHNjb3JlIChzYW1lIHJ1bGUgYXMgdGhlIGF1ZGl0IGRhc2hib2FyZCk7IGFuIG9sZGVyIEFQSSBzZW5kcyBub25lOiBzaGFyZSBvZiB1bmZsYWdnZWQgcXVlc3Rpb25zLiAqL1xyXG4gIGdldCBjb21wbGlhbmNlUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuZGV0YWlsLmNvbXBsaWFuY2VTY29yZSAhPT0gbnVsbCkgeyByZXR1cm4gdGhpcy5kZXRhaWwuY29tcGxpYW5jZVNjb3JlOyB9XHJcbiAgICByZXR1cm4gdGhpcy5mbGFnU2NvcmUodGhpcy5kZXRhaWwucXVlc3Rpb25Db3VudCwgdGhpcy5kZXRhaWwucXVlc3Rpb25GbGFnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmxhZ1Njb3JlKGNvdW50OiBudW1iZXIsIGZsYWdzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGNvdW50ID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChjb3VudCAtIGZsYWdzKSAvIGNvdW50ICogMTAwKSkpIDogMDtcclxuICB9XHJcblxyXG4gIGdldCBwYXNzZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wbGlhbmNlUGVyY2VudCA+PSB0aGlzLnBhc3NUaHJlc2hvbGQ7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVzdWx0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnBhc3NlZCA/IHRoaXMubGFiZWxzLnBhc3MgOiB0aGlzLmxhYmVscy5mYWlsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc1N1Ym1pc3Npb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnJlY29yZDtcclxuICB9XHJcblxyXG4gIGdldCByZXZpc2VkQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5yZXZpc2VkICE9PSBudWxsKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgdmlzaWJsZVF1ZXN0aW9ucygpOiBBbnN3ZXJSb3dbXSB7XHJcbiAgICAvLyBMZWZ0LXBhbmVsIHRpY2tzIG5hcnJvdyB0aGUgYW5zd2VycyBmaXJzdDsgdGhlIERpc3B1dGVkIGZsYWcgdGhlbiBhcHBsaWVzIG9uIHRvcC5cclxuICAgIGNvbnN0IHBpY2tlZCA9IHRoaXMuaGFzU2VsZWN0aW9uXHJcbiAgICAgID8gdGhpcy5yb3dzLmZpbHRlcihxID0+IHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHEua2V5KSlcclxuICAgICAgOiB0aGlzLnJvd3M7XHJcbiAgICByZXR1cm4gdGhpcy5mRmxhZ3MuaW5jbHVkZXMoJ0Rpc3B1dGVkIFN1Ym1pc3Npb25zJylcclxuICAgICAgPyBwaWNrZWQuZmlsdGVyKHEgPT4gcS5yZXZpc2VkICE9PSBudWxsKVxyXG4gICAgICA6IHBpY2tlZDtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEFuc3dlciBlZGl0IChzY29yZSByZXZpc2lvbilcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIFdoeSB0aGlzIHN1Ym1pc3Npb24gY2Fubm90IGJlIGVkaXRlZCByaWdodCBub3c7ICcnIHdoZW4gaXQgY2FuLiAqL1xyXG4gIGdldCBlZGl0QmxvY2tlZFJlYXNvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmhhc1N1Ym1pc3Npb24pIHsgcmV0dXJuICdObyBzdWJtaXNzaW9uIHNlbGVjdGVkJzsgfVxyXG4gICAgaWYgKHRoaXMuZGV0YWlsLmFwcHJvdmFsU3RhdHVzKSB7IHJldHVybiAnVGhpcyBhdWRpdCBpcyBhcHByb3ZlZCwgc28gaXRzIGFuc3dlcnMgY2FuIG5vIGxvbmdlciBiZSBlZGl0ZWQuJzsgfVxyXG4gICAgaWYgKHRoaXMuZGV0YWlsLnN0YXR1cyAhPT0gJ3N1Ym1pdCcpIHsgcmV0dXJuICdUaGlzIGF1ZGl0IGlzIGJhY2sgd2l0aCB0aGUgc3RvcmUgZm9yIGEgcmUtZG8uJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuYWNjZXNzLmNhbkVkaXQgPyAnJyA6ICh0aGlzLmFjY2Vzcy5yZWFzb24gfHwgJ1lvdSBjYW5ub3QgZWRpdCB0aGlzIGF1ZGl0LicpO1xyXG4gIH1cclxuXHJcbiAgaXNFZGl0aW5nKHE6IEFuc3dlclJvdyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZWRpdEtleSA9PT0gcS5rZXk7XHJcbiAgfVxyXG5cclxuICBzdGFydEVkaXQocTogQW5zd2VyUm93KTogdm9pZCB7XHJcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5lZGl0QmxvY2tlZFJlYXNvbjtcclxuICAgIGlmIChibG9ja2VkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChibG9ja2VkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lZGl0S2V5ID0gcS5rZXk7XHJcbiAgICB0aGlzLmRyYWZ0QW5zd2VyID0gcS5yZXZpc2VkPy5hbnN3ZXIgfHwgdGhpcy5hY3R1YWxBbnN3ZXIocSk7XHJcbiAgICBjb25zdCByZWFzb24gPSBxLnJldmlzZWQ/LnJlYXNvbiB8fCAnJztcclxuICAgIGNvbnN0IGtub3duID0gQ0hBTkdFX1JFQVNPTlMuaW5jbHVkZXMocmVhc29uKTtcclxuICAgIHRoaXMuZHJhZnRSZWFzb24gPSAhcmVhc29uID8gJycgOiAoa25vd24gPyByZWFzb24gOiAnT3RoZXInKTtcclxuICAgIHRoaXMuZHJhZnRPdGhlciA9IGtub3duID8gJycgOiByZWFzb247XHJcbiAgfVxyXG5cclxuICBjYW5jZWxFZGl0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0S2V5ID0gbnVsbDtcclxuICAgIHRoaXMuZHJhZnRBbnN3ZXIgPSAnJztcclxuICAgIHRoaXMuZHJhZnRSZWFzb24gPSAnJztcclxuICAgIHRoaXMuZHJhZnRPdGhlciA9ICcnO1xyXG4gIH1cclxuXHJcbiAgcGlja0RyYWZ0KG9wdDogQW5zd2VyT3B0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0QW5zd2VyID0gb3B0LmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgaXNEcmFmdChvcHQ6IEFuc3dlck9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZHJhZnRBbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IG9wdC5sYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGlzQWN0dWFsT3B0aW9uKHE6IEFuc3dlclJvdywgb3B0OiBBbnN3ZXJPcHRpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFjdHVhbEFuc3dlcihxKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gb3B0LmxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBkcmFmdCBkaWZmZXJzIGZyb20gd2hhdCB0aGUgc3RvcmUgc3VibWl0dGVkLCBzbyBhIHJlYXNvbiBpcyByZXF1aXJlZC4gKi9cclxuICBkcmFmdENoYW5nZWQocTogQW5zd2VyUm93KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5kcmFmdEFuc3dlci50cmltKCkudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5hY3R1YWxBbnN3ZXIocSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBmaW5hbFJlYXNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZHJhZnRSZWFzb24gPT09ICdPdGhlcicgPyB0aGlzLmRyYWZ0T3RoZXIudHJpbSgpIDogdGhpcy5kcmFmdFJlYXNvbjtcclxuICB9XHJcblxyXG4gIGNhblNhdmUocTogQW5zd2VyUm93KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zYXZpbmcgfHwgIXRoaXMuZHJhZnRBbnN3ZXIpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBxLnJldmlzZWQ/LmFuc3dlciB8fCB0aGlzLmFjdHVhbEFuc3dlcihxKTtcclxuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmRyYWZ0Q2hhbmdlZChxKTtcclxuICAgIC8vIE5vdGhpbmcgdG8gZG8gd2hlbiB0aGUgZHJhZnQgaXMgd2hhdCBpcyBhbHJlYWR5IGluIGZvcmNlIChzYW1lIGFuc3dlciwgc2FtZSByZWFzb24pLlxyXG4gICAgaWYgKHRoaXMuZHJhZnRBbnN3ZXIgPT09IGVmZmVjdGl2ZSAmJiAoIWNoYW5nZWQgfHwgdGhpcy5maW5hbFJlYXNvbiA9PT0gKHEucmV2aXNlZD8ucmVhc29uIHx8ICcnKSkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICByZXR1cm4gIWNoYW5nZWQgfHwgISF0aGlzLmZpbmFsUmVhc29uO1xyXG4gIH1cclxuXHJcbiAgc2F2ZUVkaXQocTogQW5zd2VyUm93KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU2F2ZShxKSkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHJlc3RvcmluZyA9ICF0aGlzLmRyYWZ0Q2hhbmdlZChxKTtcclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRHYWxsZXJ5UmV2aXNlKHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIHN1Ym1pc3Npb25JZDogdGhpcy5kZXRhaWwuc3VibWlzc2lvbklkLFxyXG4gICAgICBzZWN0aW9uTmFtZTogcS5zZWN0aW9uLFxyXG4gICAgICBxbm86IHEucW5vLFxyXG4gICAgICBhbnN3ZXI6IHRoaXMuZHJhZnRBbnN3ZXIsXHJcbiAgICAgIHJlYXNvbjogcmVzdG9yaW5nID8gJycgOiB0aGlzLmZpbmFsUmVhc29uXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAocmVzPy5jb2RlICE9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IHNhdmUgdGhlIGNoYW5nZScpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy50b1JvdyhxLnNlY3Rpb24sIHJlcy5kYXRhLnF1ZXN0aW9uKTtcclxuICAgICAgICB0aGlzLnJvd3MgPSB0aGlzLnJvd3MubWFwKHIgPT4gci5rZXkgPT09IHEua2V5ID8gbmV4dCA6IHIpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hSZWNvcmRRdWVzdGlvbihxLCByZXMuZGF0YS5xdWVzdGlvbik7XHJcbiAgICAgICAgdGhpcy5kZXRhaWwgPSB7XHJcbiAgICAgICAgICAuLi50aGlzLmRldGFpbCxcclxuICAgICAgICAgIHF1ZXN0aW9uRmxhZzogTnVtYmVyKHJlcy5kYXRhLnF1ZXN0aW9uRmxhZykgfHwgMCxcclxuICAgICAgICAgIGNvbXBsaWFuY2VTY29yZTogdGhpcy5udW0ocmVzLmRhdGEuY29tcGxpYW5jZVNjb3JlKSA/PyB0aGlzLmRldGFpbC5jb21wbGlhbmNlU2NvcmVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5kYXRhLnJlc3RvcmVkID8gJ1JldmlzaW9uIHJlbW92ZWQg4oCUIGFjdHVhbCBhbnN3ZXIgcmVzdG9yZWQnIDogJ0Fuc3dlciByZXZpc2VkIOKAlCBzY29yZSB1cGRhdGVkJyk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmVycm9yVGV4dChlcnIsICdDb3VsZCBub3Qgc2F2ZSB0aGUgY2hhbmdlJykpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBLZWVwcyB0aGUgcmF3IHJlY29yZCAodXNlZCBieSB0aGUgc2luZ2xlLXN1Ym1pc3Npb24gZXhwb3J0KSBpbiBzdGVwIHdpdGggYSBzYXZlZCByZXZpc2lvbi4gKi9cclxuICBwcml2YXRlIHBhdGNoUmVjb3JkUXVlc3Rpb24ocTogQW5zd2VyUm93LCBxdWVzdGlvbjogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWN0aW9uID0gKHRoaXMucmVjb3JkPy5xdWVzdGlvbkFuc3dlciB8fCBbXSkuZmluZCgoczogYW55KSA9PiBzLnNlY3Rpb25OYW1lID09PSBxLnNlY3Rpb24pO1xyXG4gICAgY29uc3QgbGlzdDogYW55W10gPSBzZWN0aW9uPy5xdWVzdGlvbnMgfHwgW107XHJcbiAgICBjb25zdCBpID0gbGlzdC5maW5kSW5kZXgoKHg6IGFueSkgPT4gU3RyaW5nKHgucW5vID8/ICcnKSA9PT0gcS5xbm8pO1xyXG4gICAgaWYgKGkgPj0gMCkgeyBsaXN0W2ldID0gcXVlc3Rpb247IH1cclxuICAgIGlmICh0aGlzLnJlY29yZD8uY2hlY2tsaXN0SW5mbykge1xyXG4gICAgICB0aGlzLnJlY29yZC5jaGVja2xpc3RJbmZvLnF1ZXN0aW9uRmxhZyA9IHRoaXMuZGV0YWlsLnF1ZXN0aW9uRmxhZztcclxuICAgICAgdGhpcy5yZWNvcmQuY2hlY2tsaXN0SW5mby5jb21wbGlhbmNlU2NvcmUgPSB0aGlzLmRldGFpbC5jb21wbGlhbmNlU2NvcmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVycm9yVGV4dChlcnI6IGFueSwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBlID0gZXJyPy5lcnJvcjtcclxuICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgZT8uZXJyb3IgPT09ICdzdHJpbmcnID8gZS5lcnJvciA6IChlPy5lcnJvcj8ubWVzc2FnZSB8fCBlPy5kZXRhaWxzPy5tZXNzYWdlIHx8IGU/Lm1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIHRleHQgfHwgZmFsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBBcHByb3ZlIChleGlzdGluZyBjaGVja2xpc3QgYXBwcm92YWw6IGFsbCBzdWJtaXNzaW9ucyBvZiB0aGlzIHN0b3JlIC8gdXNlciBvbiB0aGlzIGRheSlcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcmVxdWVzdEFwcHJvdmUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGFzU3VibWlzc2lvbiB8fCB0aGlzLmRldGFpbC5hcHByb3ZhbFN0YXR1cyB8fCAhdGhpcy5kZXRhaWwuYXBwcm92YWxFbmFibGUpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmNhbmNlbEVkaXQoKTtcclxuICAgIHRoaXMuYXBwcm92ZUNvbmZpcm0gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY29uZmlybUFwcHJvdmUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhdWRpdCA9IHRoaXMuc2VsZWN0ZWRBdWRpdDtcclxuICAgIGlmICghYXVkaXQgfHwgdGhpcy5hcHByb3ZpbmcpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBieVVzZXIgPSB0aGlzLmZTY29wZSA9PT0gJ1RlYW1zJztcclxuICAgIHRoaXMuYXBwcm92aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRHYWxsZXJ5QXBwcm92ZSh7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5kZXRhaWwuZGF0ZUlzbyxcclxuICAgICAgdG9EYXRlOiB0aGlzLmRldGFpbC5kYXRlSXNvLFxyXG4gICAgICBzdG9yZUlkOiBieVVzZXIgPyBbXSA6IFt0aGlzLmRldGFpbC5zdG9yZUlkXSxcclxuICAgICAgdXNlckVtYWlsOiBieVVzZXIgPyBbdGhpcy5kZXRhaWwuZW1haWxdIDogW10sXHJcbiAgICAgIHNvdXJjZUNoZWNrTGlzdF9pZDogYXVkaXQuX2lkLFxyXG4gICAgICBmaWx0ZXJ0eXBlOiB0aGlzLmZTY29wZVxyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwcm92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hcHByb3ZlQ29uZmlybSA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UgfHwgJ0F1ZGl0IGFwcHJvdmVkJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRQYWdlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm90aGluZyBsZWZ0IHRvIGFwcHJvdmUgZm9yIHRoaXMgc3VibWlzc2lvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwcm92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuZXJyb3JUZXh0KGVyciwgJ0NvdWxkIG5vdCBhcHByb3ZlIHRoaXMgYXVkaXQnKSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsQXBwcm92ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwcm92ZUNvbmZpcm0gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEV4cG9ydCAoLnhsc3g6IGEgU3VtbWFyeSBzaGVldCBhbmQgYW4gQW5zd2VycyBzaGVldClcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgdG9nZ2xlRXhwb3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBvcnRPcGVuID0gIXRoaXMuZXhwb3J0T3BlbjtcclxuICB9XHJcblxyXG4gIGV4cG9ydEN1cnJlbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cG9ydE9wZW4gPSBmYWxzZTtcclxuICAgIGlmICghdGhpcy5yZWNvcmQpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBkID0gdGhpcy5kZXRhaWw7XHJcbiAgICB0aGlzLndyaXRlRXhwb3J0KFt0aGlzLnJlY29yZF0sIFt0aGlzLmZOYW1lLCBkLnN0b3JlTmFtZSwgZC5kYXRlSXNvXS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJykpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0QWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBvcnRPcGVuID0gZmFsc2U7XHJcbiAgICBpZiAoIXRoaXMuc2NvcGVQYXlsb2FkIHx8ICF0aGlzLnRvdGFsIHx8IHRoaXMuZXhwb3J0aW5nKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3Qgd2FudGVkID0gTWF0aC5taW4odGhpcy50b3RhbCwgRVhQT1JUX01BWCk7XHJcbiAgICBjb25zdCBwYWdlcyA9IE1hdGguY2VpbCh3YW50ZWQgLyBFWFBPUlRfUEFHRSk7XHJcbiAgICBjb25zdCByZWNvcmRzOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3Qgc2NvcGVOYW1lID0gW3RoaXMuZk5hbWUsIHRoaXMuZlN0YXJ0ICsgJyB0byAnICsgKHRoaXMuZkVuZCB8fCB0aGlzLmZTdGFydCldLmpvaW4oJyAtICcpO1xyXG4gICAgdGhpcy5leHBvcnRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgZmV0Y2ggPSAocGFnZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIHRoaXMuYW5zd2Vyc1JlcXVlc3QocGFnZSwgRVhQT1JUX1BBR0UpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYmF0Y2ggPSByZXM/LmNvZGUgPT09IDIwMCA/IHJlcy5kYXRhPy5jaGVja2xpc3RBbnN3ZXJzIHx8IFtdIDogW107XHJcbiAgICAgICAgICByZWNvcmRzLnB1c2goLi4uYmF0Y2gpO1xyXG4gICAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gRVhQT1JUX1BBR0UgJiYgcGFnZSArIDEgPCBwYWdlcykge1xyXG4gICAgICAgICAgICBmZXRjaChwYWdlICsgMSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIXJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gc3VibWlzc2lvbnMgdG8gZXhwb3J0Jyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLndyaXRlRXhwb3J0KHJlY29yZHMuc2xpY2UoMCwgRVhQT1JUX01BWCksIHNjb3BlTmFtZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRvdGFsID4gRVhQT1JUX01BWCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdFeHBvcnRlZCB0aGUgbGF0ZXN0ICcgKyBFWFBPUlRfTUFYICsgJyBvZiAnICsgdGhpcy50b3RhbCArICcgc3VibWlzc2lvbnMuIE5hcnJvdyB0aGUgZGF0ZSByYW5nZSBmb3IgdGhlIHJlc3QuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0V4cG9ydCBmYWlsZWQuIFRyeSBhZ2Fpbi4nKTtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgZmV0Y2goMCk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBDU1YgLyBQREYgLyBQUFQgLyBaSVA6IFBPU1QgL3RyYXgvYXVkaXQvZ2FsbGVyeS9kb3dubG9hZCwgdGhlIGF1ZGl0IGNvcHkgb2YgdGhlIGNoZWNrbGlzdCBkb3dubG9hZEluc2VydFxyXG4gIC8vIChjaGVja3MgdGhlIGlkIGlzIGEgbGl2ZSBhdWRpdCB3aXRoIHN1Ym1pc3Npb25zIGZvciB0aGVzZSBmaWx0ZXJzLCB0aGVuIHF1ZXVlcyB0aGUgc2FtZSByZXBvcnQgam9iKS5cclxuICAvLyBUaGUgZmlsZSBpcyBidWlsdCBpbiB0aGUgYmFja2dyb3VuZCBhbmQgbGFuZHMgaW4gTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIFRpY2tlZCBsZWZ0LXBhbmVsIHF1ZXN0aW9ucywgZ3JvdXBlZCBieSBzZWN0aW9uIGFzIHRoZSB2MSBnYWxsZXJ5IHNlbmRzIHRoZW0gKFtdID0gZXZlcnkgcXVlc3Rpb24pLiAqL1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRRdWVzdGlvbnNQYXlsb2FkKCk6IEFycmF5PHsgc2VjdGlvbk5hbWU6IHN0cmluZzsgcXVlc3Rpb25zOiBzdHJpbmdbXTsgYW5zd2VyVHlwZTogc3RyaW5nW10gfT4ge1xyXG4gICAgY29uc3Qgb3V0OiBBcnJheTx7IHNlY3Rpb25OYW1lOiBzdHJpbmc7IHF1ZXN0aW9uczogc3RyaW5nW107IGFuc3dlclR5cGU6IHN0cmluZ1tdIH0+ID0gW107XHJcbiAgICB0aGlzLnF1ZXN0aW9uU2VjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgY29uc3QgcGlja2VkID0gcy5xdWVzdGlvbnMuZmlsdGVyKHEgPT4gdGhpcy5zZWxlY3RlZElkcy5oYXMocS5rZXkpKTtcclxuICAgICAgaWYgKHBpY2tlZC5sZW5ndGgpIHtcclxuICAgICAgICBvdXQucHVzaCh7IHNlY3Rpb25OYW1lOiBzLm5hbWUsIHF1ZXN0aW9uczogcGlja2VkLm1hcChxID0+IHEudGV4dC5yZXBsYWNlKC9cXG4vZywgJyAnKSksIGFuc3dlclR5cGU6IHBpY2tlZC5tYXAocSA9PiBxLmFuc3dlclR5cGUpIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvdXQ7XHJcbiAgfVxyXG5cclxuICAvKiogQXVkaXQgZXhwb3J0IHJlcXVlc3QgZm9yIHRoaXMgYXVkaXQgYW5kIHRoZSBhcHBsaWVkIGZpbHRlcnMgKHRoZSBmaWVsZHMgYXVkaXREb3dubG9hZFZhbGlkYXRpb24gYWNjZXB0cykuICovXHJcbiAgcHJpdmF0ZSBkb3dubG9hZFBheWxvYWQoZmlsZVR5cGU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgY29uc3QgcCA9IHRoaXMuc2NvcGVQYXlsb2FkIHx8IHt9O1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIHNvdXJjZUNoZWNrTGlzdF9pZDogdGhpcy5zZWxlY3RlZEF1ZGl0Py5faWQgfHwgJycsXHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZTdGFydCxcclxuICAgICAgdG9EYXRlOiB0aGlzLmZFbmQgfHwgdGhpcy5mU3RhcnQsXHJcbiAgICAgIGZpbGVUeXBlLFxyXG4gICAgICBmaWx0ZXJ0eXBlOiB0aGlzLmZTY29wZSA9PT0gJ1RlYW1zJyA/ICdUZWFtcycgOiAnQ2x1c3RlcnMnLFxyXG4gICAgICBzdG9yZUlkczogcFsnc3RvcmVJZCddIHx8IFtdLFxyXG4gICAgICB1c2VyRW1haWxMaXN0OiBwWyd1c2VyRW1haWwnXSB8fCBbXSxcclxuICAgICAgcXVlc3Rpb25zOiB0aGlzLnNlbGVjdGVkUXVlc3Rpb25zUGF5bG9hZCgpLFxyXG4gICAgICBhbnN3ZXJUeXBlOiBwWydhbnN3ZXJUeXBlJ10gfHwgJ2FsbCcsXHJcbiAgICAgIGFwcHJvdmVGaWx0ZXI6IHBbJ2FwcHJvdmVGaWx0ZXInXSB8fCAnYWxsJyxcclxuICAgICAgdmlld0ZsYWc6ICEhcFsndmlld0ZsYWcnXSxcclxuICAgICAgdmlld1JlZG86ICEhcFsndmlld1JlZG8nXSxcclxuICAgICAgcHJldmlld1R5cGU6ICdpbWFnZSdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvd25sb2FkUXVldWVkVG9hc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChcclxuICAgICAgJzxkaXY+PHNwYW4gY2xhc3M9XCJtZS04XCI+RG93bmxvYWRpbmcgeW91ciByZXBvcnRzPC9zcGFuPjxhIGhyZWY9XCJub3RpZmljYXRpb25zL2FsZXJ0cz90YWI9ZG93bmxvYWRcIiBzdHlsZT1cImNvbG9yOiM5OWMzZmY7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IGN1cnNvcjpwb2ludGVyXCI+VmlldzwvYT48L2Rpdj4nXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV4cG9ydHMgbmVlZCBsb2FkZWQgcmVzdWx0czogc2F5IHdoeSBpbnN0ZWFkIG9mIGRvaW5nIG5vdGhpbmcuICovXHJcbiAgcHJpdmF0ZSBleHBvcnRCbG9ja2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCAhdGhpcy5zY29wZVBheWxvYWQpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuc2VsZWN0ZWRBdWRpdCA/ICdTdWJtaXNzaW9ucyBhcmUgc3RpbGwgbG9hZGluZywgdHJ5IGFnYWluIGluIGEgbW9tZW50JyA6ICdQaWNrIGFuIGF1ZGl0IHRvIGV4cG9ydCcpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy50b3RhbCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vIHN1Ym1pc3Npb25zIHRvIGV4cG9ydCBmb3IgdGhlIHNlbGVjdGVkIGZpbHRlcnMnKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogQ1NWIGFuZCBQREYgYXJlIHF1ZXVlZCBzdHJhaWdodCBhd2F5LCBhcyBpbiB0aGUgdjEgZ2FsbGVyeS4gKi9cclxuICBleHBvcnRGaWxlKGZpbGVUeXBlOiAnY3N2JyB8ICdwZGYnKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cG9ydE9wZW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmV4cG9ydGluZykgeyByZXR1cm47IH1cclxuICAgIGlmICh0aGlzLmV4cG9ydEJsb2NrZWQoKSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuZXhwb3J0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRHYWxsZXJ5RG93bmxvYWQodGhpcy5kb3dubG9hZFBheWxvYWQoZmlsZVR5cGUpKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAocmVzPy5jb2RlID09PSAyMDApIHsgdGhpcy5kb3dubG9hZFF1ZXVlZFRvYXN0KCk7IH0gZWxzZSB7IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmVycm9yVGV4dCh7IGVycm9yOiByZXMgfSwgJ0NvdWxkIG5vdCBzdGFydCB0aGUgZXhwb3J0JykpOyB9XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QodGhpcy5lcnJvclRleHQoZSwgJ0NvdWxkIG5vdCBzdGFydCB0aGUgZXhwb3J0JykpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBQVCBhbmQgWklQIG9wZW4gdGhlIHYxIGV4cG9ydCBwb3B1cCAoZGF0ZSByYW5nZSAvIHByZXZpZXcgdHlwZSkgdGhhdCB0aGVuIHF1ZXVlcyB0aGUgam9iLiBQUFQga2VlcHNcclxuICAgKiB0aGUgdjEgbGltaXRzOiBhIDEtMyBkYXkgcmFuZ2UgYWxsb3dzIGF0IG1vc3QgMyBxdWVzdGlvbnMgKDEgcXVlc3Rpb24gZm9yIDMgZGF5cyk7IHBpY2sgdGhlbSBvbiB0aGUgbGVmdC5cclxuICAgKi9cclxuICBleHBvcnRXaXRoT3B0aW9ucyhmaWxlVHlwZTogJ3BwdCcgfCAnemlwZmlsZXMnKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cG9ydE9wZW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmV4cG9ydEJsb2NrZWQoKSkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGxhYmVsID0gZmlsZVR5cGUgPT09ICdwcHQnID8gJ0V4cG9ydCBhcyBQUFQnIDogJ0V4cG9ydCBhcyBaSVAnO1xyXG4gICAgaWYgKGZpbGVUeXBlID09PSAncHB0Jykge1xyXG4gICAgICBjb25zdCBkYXlzID0gZGF5anModGhpcy5mRW5kIHx8IHRoaXMuZlN0YXJ0KS5kaWZmKGRheWpzKHRoaXMuZlN0YXJ0KSwgJ2RheScpO1xyXG4gICAgICBjb25zdCBwaWNrZWQgPSB0aGlzLnNlbGVjdGVkUXVlc3Rpb25zUGF5bG9hZCgpLnJlZHVjZSgobiwgcykgPT4gbiArIHMucXVlc3Rpb25zLmxlbmd0aCwgMCk7XHJcbiAgICAgIGlmIChkYXlzID09PSAyICYmIHBpY2tlZCA+IDEpIHsgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdQbGVhc2Ugc2VsZWN0IG1heGltdW0gb2YgMSBxdWVzdGlvbiBvbmx5Jyk7IHJldHVybjsgfVxyXG4gICAgICBpZiAoZGF5cyA8PSAxICYmIHBpY2tlZCA+IDMpIHsgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdQbGVhc2Ugc2VsZWN0IG1heGltdW0gb2YgMyBxdWVzdGlvbiBvbmx5Jyk7IHJldHVybjsgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgcmVmID0gdGhpcy5tb2RhbC5vcGVuKEV4cG9ydEdhbGxlcnlDb21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJywgd2luZG93Q2xhc3M6ICdjdXN0b20taGVpZ2h0LW1vZGFsJ1xyXG4gICAgfSk7XHJcbiAgICByZWYuY29tcG9uZW50SW5zdGFuY2UudHlwZSA9IGxhYmVsO1xyXG4gICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLnBheWxvYWQgPSB0aGlzLmRvd25sb2FkUGF5bG9hZChmaWxlVHlwZSk7XHJcbiAgICByZWYuY29tcG9uZW50SW5zdGFuY2UuZXhwb3J0Z2FsbGVyeVBkZiA9IGZhbHNlO1xyXG4gICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLnN1Ym1pdEZuID0gKHBheWxvYWQ6IGFueSkgPT4gdGhpcy50cmF4U2VydmljZS5hdWRpdEdhbGxlcnlEb3dubG9hZChwYXlsb2FkKTtcclxuICAgIHJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3N1Y2Nlc3MnKSB7IHRoaXMuZG93bmxvYWRRdWV1ZWRUb2FzdCgpOyB9XHJcbiAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PT0gJ2Vycm9yJykgeyB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBzdGFydCB0aGUgZXhwb3J0Jyk7IH1cclxuICAgIH0sICgpID0+IHsgLyogZGlzbWlzc2VkICovIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3cml0ZUV4cG9ydChyZWNvcmRzOiBhbnlbXSwgbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdW1tYXJ5OiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3QgYW5zd2VyczogYW55W10gPSBbXTtcclxuICAgIHJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4ge1xyXG4gICAgICBjb25zdCBpbmZvID0gcmVjb3JkLmNoZWNrbGlzdEluZm8gfHwge307XHJcbiAgICAgIGNvbnN0IHN0b3JlID0gcmVjb3JkLnN0b3JlUHJvZmlsZSB8fCB7fTtcclxuICAgICAgY29uc3Qgcm93czogQW5zd2VyUm93W10gPSAocmVjb3JkLnF1ZXN0aW9uQW5zd2VyIHx8IFtdKS5mbGF0TWFwKChzOiBhbnkpID0+XHJcbiAgICAgICAgKHMucXVlc3Rpb25zIHx8IFtdKS5tYXAoKHE6IGFueSkgPT4gdGhpcy50b1JvdyhzLnNlY3Rpb25OYW1lLCBxKSkpO1xyXG4gICAgICBjb25zdCBjb3VudCA9IE51bWJlcihpbmZvLm5vb2ZRdWVzdGlvbnMpIHx8IHJvd3MubGVuZ3RoO1xyXG4gICAgICBjb25zdCBmbGFncyA9IHRoaXMubnVtKGluZm8ucXVlc3Rpb25GbGFnKSA/PyByb3dzLmZpbHRlcihyID0+IHIuZmxhZ2dlZCkubGVuZ3RoO1xyXG4gICAgICBjb25zdCBzY29yZSA9IHRoaXMubnVtKGluZm8uY29tcGxpYW5jZVNjb3JlKSA/PyB0aGlzLmZsYWdTY29yZShjb3VudCwgZmxhZ3MpO1xyXG4gICAgICAvLyBObyBxdWVzdGlvbiB3aXRoIGNvbXBsaWFuY2Ugc2NvcmluZzogbm8gc2NvcmUgYW5kIG5vIHJlc3VsdCAoYmxhbmsgY2VsbHMpLCBhcyBvbiB0aGUgcGFnZS5cclxuICAgICAgY29uc3Qgc2NvcmVkID0gdGhpcy5jb21wbGlhbmNlT24ocmVjb3JkKTtcclxuICAgICAgY29uc3QgYmFzZSA9IHsgJ1N0b3JlIElEJzogc3RvcmUuc3RvcmVfaWQgfHwgJycsICdTdG9yZSBOYW1lJzogc3RvcmUuc3RvcmVOYW1lIHx8ICcnLCAnRGF0ZSc6IGluZm8uZGF0ZSB8fCAnJyB9O1xyXG4gICAgICBzdW1tYXJ5LnB1c2goe1xyXG4gICAgICAgIC4uLmJhc2UsXHJcbiAgICAgICAgJ0xvY2F0aW9uJzogW3N0b3JlLmNpdHksIHN0b3JlLnN0YXRlLCBzdG9yZS5Db3VudHJ5XS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKSxcclxuICAgICAgICAnQXVkaXQnOiBpbmZvLmNoZWNrbGlzdE5hbWUgfHwgdGhpcy5mTmFtZSxcclxuICAgICAgICAnVGltZSc6IGluZm8udGltZSB8fCAnJyxcclxuICAgICAgICAnRHVyYXRpb24nOiBpbmZvLmR1cmF0aW9uIHx8ICcnLFxyXG4gICAgICAgICdTdWJtaXR0ZWQgQnknOiBpbmZvLnN1Ym1pdHRlZEJ5IHx8ICcnLFxyXG4gICAgICAgICdFbWFpbCc6IGluZm8udXNlckVtYWlsIHx8ICcnLFxyXG4gICAgICAgICdRdWVzdGlvbnMnOiBjb3VudCxcclxuICAgICAgICAnRmxhZ2dlZCc6IGZsYWdzLFxyXG4gICAgICAgICdSZXZpc2VkJzogcm93cy5maWx0ZXIociA9PiByLnJldmlzZWQpLmxlbmd0aCxcclxuICAgICAgICAnQ29tcGxpYW5jZSBTY29yZSAoJSknOiBzY29yZWQgPyBzY29yZSA6ICcnLFxyXG4gICAgICAgICdSZXN1bHQnOiBzY29yZWQgPyAoc2NvcmUgPj0gdGhpcy5wYXNzVGhyZXNob2xkID8gdGhpcy5sYWJlbHMucGFzcyA6IHRoaXMubGFiZWxzLmZhaWwpIDogJycsXHJcbiAgICAgICAgJ0FwcHJvdmFsJzogaW5mby5hcHByb3ZhbFN0YXR1cyA/ICdBcHByb3ZlZCcgKyAoaW5mby5hcHByb3ZhbEJ5TmFtZSA/ICcgYnkgJyArIGluZm8uYXBwcm92YWxCeU5hbWUgOiAnJykgOiAoaW5mby5hcHByb3ZhbEVuYWJsZSA/ICdQZW5kaW5nJyA6ICdOb3QgcmVxdWlyZWQnKVxyXG4gICAgICB9KTtcclxuICAgICAgcm93cy5mb3JFYWNoKHIgPT4gYW5zd2Vycy5wdXNoKHtcclxuICAgICAgICAuLi5iYXNlLFxyXG4gICAgICAgICdTZWN0aW9uJzogci5zZWN0aW9uLFxyXG4gICAgICAgICdRLk5vJzogci5xbm8sXHJcbiAgICAgICAgJ1F1ZXN0aW9uJzogci50ZXh0LFxyXG4gICAgICAgICdBbnN3ZXInOiB0aGlzLmFjdHVhbEFuc3dlcihyKSxcclxuICAgICAgICAnVmFsaWRhdGlvbiBBbnN3ZXInOiByLnZhbGlkYXRpb25UZXh0LFxyXG4gICAgICAgICdTY29yZSc6IHIuYWN0dWFsU2NvcmUgPz8gJycsXHJcbiAgICAgICAgJ0ZsYWdnZWQnOiByLmZsYWdnZWQgPyAnWWVzJyA6ICdObycsXHJcbiAgICAgICAgJ1JldmlzZWQgQW5zd2VyJzogci5yZXZpc2VkPy5hbnN3ZXIgfHwgJycsXHJcbiAgICAgICAgJ1JldmlzZWQgU2NvcmUnOiByLnJldmlzZWQgPyAoci5yZXZpc2VkLnNjb3JlID8/ICcnKSA6ICcnLFxyXG4gICAgICAgICdSZWFzb24gZm9yIENoYW5nZSc6IHIucmV2aXNlZD8ucmVhc29uIHx8ICcnLFxyXG4gICAgICAgICdSZXZpc2VkIEJ5Jzogci5yZXZpc2VkPy5ieSB8fCAnJyxcclxuICAgICAgICBbdGhpcy5sYWJlbHMucmVtYXJrc106IHIucmVtYXJrLFxyXG4gICAgICAgIFt0aGlzLmxhYmVscy5hZGRpdGlvbmFsXTogci5leHRyYVJlbWFyayxcclxuICAgICAgICAnSW1hZ2VzJzogci5pbWFnZXMuam9pbignICcpLFxyXG4gICAgICAgICdWaWRlb3MnOiByLnZpZGVvcy5qb2luKCcgJylcclxuICAgICAgfSkpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmaWxlID0gKG5hbWUgfHwgJ0F1ZGl0IGdhbGxlcnknKS5yZXBsYWNlKC9bXFxcXC86Kj9cIjw+fF0rL2csICctJykuc2xpY2UoMCwgMTIwKTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0V29ya2Jvb2soW3sgbmFtZTogJ1N1bW1hcnknLCByb3dzOiBzdW1tYXJ5IH0sIHsgbmFtZTogJ0Fuc3dlcnMnLCByb3dzOiBhbnN3ZXJzIH1dLCBmaWxlKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlJZChfOiBudW1iZXIsIHE6IHsga2V5OiBzdHJpbmcgfSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcS5rZXk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5T3B0aW9uKF86IG51bWJlciwgb3B0OiBGaWx0ZXJPcHRpb24pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG9wdC52YWx1ZSA/PyBvcHQubGFiZWw7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5RGVmKF86IG51bWJlciwgZGVmOiBGaWx0ZXJEZWYpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRlZi5pZDtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlMYWJlbChfOiBudW1iZXIsIG86IHsgbGFiZWw6IHN0cmluZyB9KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBvLmxhYmVsO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYXYyLXBhZ2UgYXVkaXQtZ2FsbGVyeVwiPlxyXG5cclxuICA8IS0tIEhlYWRlciBiYXIgd2l0aCBxdWljayBzZWxlY3RzIC0tPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiZ2FsLWhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImdhbC1oZWFkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtaGVhZGVyLXRpdGxlXCI+R2FsbGVyeTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWhlYWRlci1zdWJcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG90YWxcIj57eyB0b3RhbCB9fSB7eyB0b3RhbCA9PT0gMSA/ICdzdWJtaXNzaW9uJyA6ICdzdWJtaXNzaW9ucycgfX0gwrcgPC9uZy1jb250YWluZXI+e3sgcmFuZ2VMYWJlbCB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcblxyXG4gICAgPCEtLSBDaGV2cm9ucyBhcmUgU1ZHcywgbm90IHRleHQgZ2x5cGhzLCBzbyB0aGV5IHNpdCBvbiB0aGUgY2hpcCdzIGNlbnRyZSBsaW5lLiAtLT5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicXVpY2tjaGlwIGNoaXAtb25cIiAoY2xpY2spPVwib3BlbkZpbHRlcnMoJ3R5cGUnKVwiPlxyXG4gICAgICB7eyBmVHlwZSB9fVxyXG4gICAgICA8c3ZnIGNsYXNzPVwiY2hpcC1jaGV2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrY2hpcCBxdWlja2NoaXAtLW5hbWVcIiAoY2xpY2spPVwib3BlbkZpbHRlcnMoJ25hbWUnKVwiIFt0aXRsZV09XCJmTmFtZVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInF1aWNrY2hpcC1sYWJlbFwiPnt7IGZOYW1lIHx8ICdTZWxlY3QgYXVkaXQnIH19PC9zcGFuPlxyXG4gICAgICA8c3ZnIGNsYXNzPVwiY2hpcC1jaGV2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrY2hpcCBjaGlwLW9uXCIgKm5nSWY9XCJkYXRlUGlja2VkXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKCdkYXRlJylcIj5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjVcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMTZcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIzXCIgeTE9XCIxMFwiIHgyPVwiMjFcIiB5Mj1cIjEwXCI+PC9saW5lPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiOFwiIHkxPVwiM1wiIHgyPVwiOFwiIHkyPVwiNlwiPjwvbGluZT5cclxuICAgICAgICA8bGluZSB4MT1cIjE2XCIgeTE9XCIzXCIgeDI9XCIxNlwiIHkyPVwiNlwiPjwvbGluZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIHt7IHJhbmdlTGFiZWwgfX1cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicXVpY2tjaGlwXCIgKGNsaWNrKT1cIm9wZW5TY29wZUZpbHRlcigpXCI+XHJcbiAgICAgIHt7IHN0b3JlU3VtbWFyeSB9fVxyXG4gICAgICA8c3ZnIGNsYXNzPVwiY2hpcC1jaGV2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrY2hpcCBxdWlja2NoaXAtLXN0cm9uZ1wiIChjbGljayk9XCJvcGVuRmlsdGVycygpXCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICA8bGluZSB4MT1cIjRcIiB5MT1cIjdcIiB4Mj1cIjIwXCIgeTI9XCI3XCI+PC9saW5lPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiN1wiIHkxPVwiMTJcIiB4Mj1cIjE3XCIgeTI9XCIxMlwiPjwvbGluZT5cclxuICAgICAgICA8bGluZSB4MT1cIjEwXCIgeTE9XCIxN1wiIHgyPVwiMTRcIiB5Mj1cIjE3XCI+PC9saW5lPlxyXG4gICAgICA8L3N2Zz5cclxuICAgICAgQWxsIEZpbHRlcnNcclxuICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudGJhZGdlXCIgKm5nSWY9XCJhY3RpdmVGaWx0ZXJDb3VudFwiPnt7IGFjdGl2ZUZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgYXYyLWJ0bi0tc20gYXYyLWJ0bi0td2lkZVwiIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiPlxyXG4gICAgICBBcHBseVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9zZWN0aW9uPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZ2FsLWJvZHlcIj5cclxuXHJcbiAgICA8IS0tIFF1ZXN0aW9uIG5hdmlnYXRpb24gLS0+XHJcbiAgICA8IS0tIFRoZSB3aGl0ZSBjb2x1bW4gcnVucyB0aGUgZnVsbCBoZWlnaHQgb2YgdGhlIHJpZ2h0IGNhcmQ7IGl0cyBjb250ZW50IHN0YXlzIGluIHZpZXcgd2hpbGUgc2Nyb2xsaW5nLiAtLT5cclxuICAgIDxhc2lkZSBjbGFzcz1cImdhbC1sZWZ0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtbGVmdC1pbm5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWxlZnQtaGVhZFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdGl0bGVcIiAqbmdJZj1cIm5hdkxvYWRpbmcgJiYgIWZOYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYXVkaXQtbmFtZVwiICpuZ0lmPVwiIW5hdkxvYWRpbmcgfHwgZk5hbWVcIj57eyBmTmFtZSB8fCAnTm8gYXVkaXQgc2VsZWN0ZWQnIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1hdWRpdC1zdWJcIiAqbmdJZj1cImRldGFpbC5zdWJ0aXRsZVwiPnt7IGRldGFpbC5zdWJ0aXRsZSB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTm8gc3VibWlzc2lvbiBmb3IgdGhlIGZpbHRlcnMgKGUuZy4gdGhlIGxhc3Qgb25lIHdhcyBqdXN0IGFwcHJvdmVkIHVuZGVyIFwiTm90IEFwcHJvdmVkXCIpOlxyXG4gICAgICAgICAgIG5vdGhpbmcgdG8gbmF2aWdhdGUsIHNvIHRoZSBxdWVzdGlvbiBsaXN0IGdvZXMgd2l0aCBpdC4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtbmF2LWVtcHR5XCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhaGFzU3VibWlzc2lvblwiPk5vIHN1Ym1pc3Npb25zIGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVycy48L2Rpdj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nIHx8IGhhc1N1Ym1pc3Npb25cIj5cclxuICAgICAgPCEtLSBDbGVhcnMgYW55IHF1ZXN0aW9uIHNlbGVjdGlvbi4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LWFsbFwiIFtjbGFzcy5pcy1hY3RpdmVdPVwiIWhhc1NlbGVjdGlvblwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1hbGwtbGlua1wiIChjbGljayk9XCJ2aWV3QWxsQW5zd2VycygpXCI+VmlldyBBbGwgQW5zd2VyczwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gU2VjdGlvbiBhY2NvcmRpb246IG9uZSBvcGVuIGF0IGEgdGltZS4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtc2VjdGlvbnNcIj5cclxuICAgICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJuYXZMb2FkaW5nXCIgW3Jvd3NdPVwiM1wiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbmF2TG9hZGluZ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2Ygc2VjdGlvbnM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTZWN0aW9uXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbC1zZWN0aW9uXCIgW2NsYXNzLmlzLW9wZW5dPVwib3BlblNlY3Rpb24gPT09IGlcIiAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbihpKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1zZWN0aW9uLW5hbWVcIj57eyBzLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwhLS0gVGlja3Mgc3RheSB3aGVuIGEgc2VjdGlvbiBpcyBjb2xsYXBzZWQ7IHRoZSBjb3VudCBzaG93cyB0aGV5IGFyZSBzdGlsbCBuYXJyb3dpbmcgdGhlIGFuc3dlcnMuIC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1zZWN0aW9uLWNvdW50XCIgKm5nSWY9XCJzZWN0aW9uUGlja2VkKHMpIGFzIG5cIiBbYXR0ci50aXRsZV09XCJuICsgJyBzZWxlY3RlZCBpbiB0aGlzIHNlY3Rpb24nXCI+e3sgbiB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtc2VjdGlvbi1ydWxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1zZWN0aW9uLWNoZXZcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgW2NsYXNzLnJvdGF0ZV09XCJvcGVuU2VjdGlvbiAhPT0gaVwiPlxyXG4gICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZW5TZWN0aW9uID09PSBpXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2FsLW5hdi1pdGVtXCIgKm5nRm9yPVwibGV0IHEgb2Ygcy5xdWVzdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLXBpY2tlZF09XCJpc1F1ZXN0aW9uU2VsZWN0ZWQocSlcIiAoY2xpY2spPVwidG9nZ2xlUXVlc3Rpb24ocSlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1jaGVja1wiIFtjbGFzcy5pcy1vbl09XCJpc1F1ZXN0aW9uU2VsZWN0ZWQocSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1F1ZXN0aW9uU2VsZWN0ZWQocSlcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtbmF2LXRleHRcIj57eyBxLnFubyB9fSAuIHt7IHEudGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1kb3QgZ2FsLWRvdC0tZmxhZ1wiICpuZ0lmPVwiaXNGbGFnZ2VkKHEpXCIgdGl0bGU9XCJGbGFnZ2VkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2FsLWRvdCBnYWwtZG90LS1yZXZpc2VkXCIgKm5nSWY9XCJpc1JldmlzZWQocSlcIiB0aXRsZT1cIlJldmlzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLW5hdi1lbXB0eVwiICpuZ0lmPVwiIXMucXVlc3Rpb25zLmxlbmd0aFwiPk5vIHF1ZXN0aW9ucyBpbiB0aGlzIHNlY3Rpb248L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtbmF2LWVtcHR5XCIgKm5nSWY9XCIhc2VjdGlvbnMubGVuZ3RoXCI+Tm8gcXVlc3Rpb25zIGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVyczwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9hc2lkZT5cclxuXHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImdhbC1tYWluXCI+XHJcbiAgICAgIDwhLS0gUGFnZXIgKyBleHBvcnQgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtdG9vbGJhclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtcGFnZXJcIiAqbmdJZj1cInRvdGFsXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbC1wYWdlci1idG5cIiBbZGlzYWJsZWRdPVwiIWNhblByZXZcIiAoY2xpY2spPVwicHJldlBhZ2UoKVwiIHRpdGxlPVwiUHJldmlvdXMgc3VibWlzc2lvblwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxNSAxOCA5IDEyIDE1IDZcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtcGFnZXItbGFiZWxcIj5TdWJtaXNzaW9uIDxzdHJvbmc+e3sgcGFnZUxhYmVsIH19PC9zdHJvbmc+PC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnYWwtcGFnZXItYnRuXCIgW2Rpc2FibGVkXT1cIiFjYW5OZXh0XCIgKGNsaWNrKT1cIm5leHRQYWdlKClcIiB0aXRsZT1cIk5leHQgc3VibWlzc2lvblwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI5IDE4IDE1IDEyIDkgNlwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtcGlsbCBzdGF0dXMtcGlsbC0td2FybmluZ1wiICpuZ0lmPVwiIWxvYWRpbmcgJiYgaGFzU3VibWlzc2lvbiAmJiBkZXRhaWwuc3RhdHVzICE9PSAnc3VibWl0J1wiPlJlLWRvIHJlcXVlc3RlZDwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImV4cG9ydC13cmFwXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS1zbSBnYWwtZXhwb3J0XCIgW2Rpc2FibGVkXT1cImV4cG9ydGluZyB8fCAhdG90YWxcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwb3J0KClcIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImV4cG9ydE9wZW5cIj5cclxuICAgICAgICAgICAge3sgZXhwb3J0aW5nID8gJ0V4cG9ydGluZ+KApicgOiAnRXhwb3J0JyB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwb3J0LW1lbnVcIiAqbmdJZj1cImV4cG9ydE9wZW5cIiByb2xlPVwibWVudVwiPlxyXG4gICAgICAgICAgICA8IS0tIEV4Y2VsOiBidWlsdCBoZXJlLCBkb3dubG9hZHMgcmlnaHQgYXdheSAoaGlkZGVuIGZvciBub3csIHNlZSBzaG93RXhjZWxFeHBvcnQpIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0V4Y2VsRXhwb3J0XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4cG9ydC1ncm91cFwiPkV4Y2VsICgueGxzeCkgwrcgZG93bmxvYWRzIG5vdzwvZGl2PlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZXhwb3J0LWl0ZW1cIiByb2xlPVwibWVudWl0ZW1cIiBbZGlzYWJsZWRdPVwiIWhhc1N1Ym1pc3Npb25cIiAoY2xpY2spPVwiZXhwb3J0Q3VycmVudCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC10aXRsZVwiPlRoaXMgc3VibWlzc2lvbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LW1ldGFcIj57eyBkZXRhaWwuc3RvcmVOYW1lIH19IMK3IHt7IGRldGFpbC5kYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZXhwb3J0LWl0ZW1cIiByb2xlPVwibWVudWl0ZW1cIiAoY2xpY2spPVwiZXhwb3J0QWxsKClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LXRpdGxlXCI+QWxsIHt7IHRvdGFsIH19IHt7IHRvdGFsID09PSAxID8gJ3N1Ym1pc3Npb24nIDogJ3N1Ym1pc3Npb25zJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LW1ldGFcIj5DdXJyZW50IGZpbHRlcnMgwrcgc3VtbWFyeSArIGV2ZXJ5IGFuc3dlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwhLS0gQ1NWIC8gUERGIC8gUFBUIC8gWklQOiB0aGUgdjEgZ2FsbGVyeSdzIGRvd25sb2FkIHNlcnZpY2UgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleHBvcnQtZ3JvdXBcIj5SZXBvcnQgZmlsZXMgwrcgTm90aWZpY2F0aW9ucyDigLogRG93bmxvYWRzPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZXhwb3J0LWl0ZW1cIiByb2xlPVwibWVudWl0ZW1cIiAoY2xpY2spPVwiZXhwb3J0RmlsZSgnY3N2JylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC10aXRsZVwiPkV4cG9ydCBhcyBDU1Y8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBvcnQtbWV0YVwiPkN1cnJlbnQgZmlsdGVyczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZXhwb3J0LWl0ZW1cIiByb2xlPVwibWVudWl0ZW1cIiAoY2xpY2spPVwiZXhwb3J0RmlsZSgncGRmJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC10aXRsZVwiPkV4cG9ydCBhcyBQREY8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBvcnQtbWV0YVwiPk9uZSByZXBvcnQgcGVyIHN1Ym1pc3Npb248L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImV4cG9ydC1pdGVtXCIgcm9sZT1cIm1lbnVpdGVtXCIgKGNsaWNrKT1cImV4cG9ydFdpdGhPcHRpb25zKCdwcHQnKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LXRpdGxlXCI+RXhwb3J0IGFzIFBQVDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC1tZXRhXCI+VGljayB1cCB0byAzIHF1ZXN0aW9ucyBvbiB0aGUgbGVmdDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZXhwb3J0LWl0ZW1cIiByb2xlPVwibWVudWl0ZW1cIiAoY2xpY2spPVwiZXhwb3J0V2l0aE9wdGlvbnMoJ3ppcGZpbGVzJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC10aXRsZVwiPkV4cG9ydCBhcyBaSVA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBvcnQtbWV0YVwiPlBob3RvcyBhbmQgdmlkZW9zPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTG9hZGluZyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImdhbC1za2VsZXRvblwiICpuZ0lmPVwibG9hZGluZ1wiIGFyaWEtYnVzeT1cInRydWVcIiBhcmlhLWxhYmVsPVwiTG9hZGluZyBzdWJtaXNzaW9uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNrIHNrLWxvZ29cIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2sgc2stZmFjdHNcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2sgc2stY2FyZFwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzayBzay1jYXJkXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNrIHNrLWNhcmQgc2stY2FyZC0tc2hvcnRcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEVycm9yIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXN0YXRlXCIgKm5nSWY9XCIhbG9hZGluZyAmJiBsb2FkRXJyb3JcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1zdGF0ZS1pY29uIGdhbC1zdGF0ZS1pY29uLS1lcnJvclwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI4XCIgaGVpZ2h0PVwiMjhcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMi41XCI+PC9saW5lPlxyXG4gICAgICAgICAgICA8bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtc3RhdGUtdGl0bGVcIj57eyBsb2FkRXJyb3IgfX08L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwicmV0cnkoKVwiPlJldHJ5PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBOb3RoaW5nIHN1Ym1pdHRlZCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImdhbC1zdGF0ZVwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgIWxvYWRFcnJvciAmJiAhaGFzU3VibWlzc2lvblwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXN0YXRlLXRpdGxlXCI+e3sgZk5hbWUgPyAnTm8gc3VibWlzc2lvbnMgZm91bmQnIDogKGxpbmtNaXNzaW5nID8gJ0F1ZGl0IG5vdCBmb3VuZCcgOiAnTm8gYXVkaXRzIHRvIHNob3cnKSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtc3RhdGUtc3ViXCIgKm5nSWY9XCJmTmFtZVwiPlxyXG4gICAgICAgICAgTm90aGluZyB3YXMgc3VibWl0dGVkIGZvciA8c3Ryb25nPnt7IGZOYW1lIH19PC9zdHJvbmc+IGJldHdlZW4ge3sgcmFuZ2VMYWJlbCB9fSB3aXRoIHRoZSBjdXJyZW50IGZpbHRlcnMuXHJcbiAgICAgICAgICBUcnkgYSB3aWRlciBkYXRlIHJhbmdlIG9yIGFub3RoZXIgc3RvcmUuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1zdGF0ZS1zdWJcIiAqbmdJZj1cIiFmTmFtZSAmJiBsaW5rTWlzc2luZ1wiPlxyXG4gICAgICAgICAgVGhlIGF1ZGl0IHlvdSBvcGVuZWQgd2FzIGRlbGV0ZWQgb3IgaXMgbm90IGFuIGF1ZGl0LiBQaWNrIGFuIGF1ZGl0IGluIHRoZSBmaWx0ZXJzIHRvIHNlZSBpdHMgc3VibWlzc2lvbnMuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1zdGF0ZS1zdWJcIiAqbmdJZj1cIiFmTmFtZSAmJiAhbGlua01pc3NpbmdcIj5DcmVhdGUgYW4gYXVkaXQgaW4gTWFuYWdlIHRvIHNlZSBpdHMgc3VibWlzc2lvbnMgaGVyZS48L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAqbmdJZj1cImZOYW1lIHx8IChsaW5rTWlzc2luZyAmJiBhdWRpdHMubGVuZ3RoKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkZpbHRlcnMoZk5hbWUgPyAnZGF0ZScgOiAnbmFtZScpXCI+e3sgZk5hbWUgPyAnQ2hhbmdlIGZpbHRlcnMnIDogJ1BpY2sgYW4gYXVkaXQnIH19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nICYmIGhhc1N1Ym1pc3Npb25cIj5cclxuICAgICAgICA8IS0tIENsaWVudCBicmFuZCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWJyYW5kXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1icmFuZC1ib3hcIiBbY2xhc3MuaGFzLWxvZ29dPVwiY2xpZW50TG9nbyAmJiAhbG9nb0ZhaWxlZFwiPlxyXG4gICAgICAgICAgICA8aW1nICpuZ0lmPVwiY2xpZW50TG9nbyAmJiAhbG9nb0ZhaWxlZFwiIFtzcmNdPVwiY2xpZW50TG9nb1wiIFthbHRdPVwiY2xpZW50TmFtZSB8fCAnQ2xpZW50IGxvZ28nXCIgKGVycm9yKT1cImxvZ29GYWlsZWQgPSB0cnVlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2xpZW50TG9nbyB8fCBsb2dvRmFpbGVkXCI+e3sgY2xpZW50TmFtZSB8fCAnTG9nbycgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBXaG8gLyB3aGVyZSAvIHdoZW4sIHJlYWQgcm93IGJ5IHJvdyBhY3Jvc3MgdGhlIHR3byBjb2x1bW5zIC0tPlxyXG4gICAgICAgIDxkbCBjbGFzcz1cImdhbC1mYWN0c1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1mYWN0XCI+PGR0PlN0b3JlIE5hbWU6PC9kdD48ZGQ+e3sgZGV0YWlsLnN0b3JlTmFtZSB9fTxzcGFuIGNsYXNzPVwiZ2FsLWZhY3Qtc3ViXCIgKm5nSWY9XCJkZXRhaWwuc3RvcmVJZCAmJiBkZXRhaWwuc3RvcmVJZCAhPT0gZGV0YWlsLnN0b3JlTmFtZVwiPnt7IGRldGFpbC5zdG9yZUlkIH19PC9zcGFuPjwvZGQ+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3QgZ2FsLWZhY3QtLXNpZGVcIj48ZHQ+RHVyYXRpb246PC9kdD48ZGQ+e3sgZGV0YWlsLmR1cmF0aW9uIH19PC9kZD48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtZmFjdFwiPjxkdD5BdWRpdCBOYW1lOjwvZHQ+PGRkPnt7IGRldGFpbC5hdWRpdE5hbWUgfX08L2RkPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1mYWN0IGdhbC1mYWN0LS1zaWRlXCI+PGR0PkRhdGU6PC9kdD48ZGQ+e3sgZGV0YWlsLmRhdGUgfX08L2RkPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1mYWN0XCI+PGR0PlN0YXRlICZhbXA7IENvdW50cnk6PC9kdD48ZGQ+e3sgZGV0YWlsLnJlZ2lvbiB9fTwvZGQ+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3QgZ2FsLWZhY3QtLXNpZGVcIj48ZHQ+VGltZTo8L2R0PjxkZD57eyBkZXRhaWwudGltZSB9fTwvZGQ+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3RcIj48ZHQ+Tm8uIG9mIFF1ZXN0aW9uczo8L2R0PjxkZD57eyBkZXRhaWwucXVlc3Rpb25Db3VudCB9fTwvZGQ+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3QgZ2FsLWZhY3QtLXNpZGVcIj5cclxuICAgICAgICAgICAgPGR0PkNvbXBsaWFuY2UgU2NvcmU6PC9kdD5cclxuICAgICAgICAgICAgPGRkICpuZ0lmPVwiZGV0YWlsLmNvbXBsaWFuY2VFbmFibGVkXCIgW3RpdGxlXT1cIidQYXNzIG1hcmsgJyArIHBhc3NUaHJlc2hvbGQgKyAnJSdcIj57eyBjb21wbGlhbmNlUGVyY2VudCB9fSUgPHNwYW4gY2xhc3M9XCJnYWwtcmVzdWx0XCIgW2NsYXNzLmlzLWZhaWxdPVwiIXBhc3NlZFwiPih7eyByZXN1bHRMYWJlbCB9fSk8L3NwYW4+PC9kZD5cclxuICAgICAgICAgICAgPCEtLSBObyBxdWVzdGlvbiBvZiB0aGlzIGF1ZGl0IGhhcyBjb21wbGlhbmNlIHNjb3Jpbmcgb246IG5vIHNjb3JlICh0aGUgZmxhZy1iYXNlZCBydWxlIHdvdWxkIHJlYWQgMTAwJSkuIC0tPlxyXG4gICAgICAgICAgICA8ZGQgKm5nSWY9XCIhZGV0YWlsLmNvbXBsaWFuY2VFbmFibGVkXCIgdGl0bGU9XCJDb21wbGlhbmNlIHNjb3JlIGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIGF1ZGl0XCI+4oCUPC9kZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1mYWN0XCI+PGR0PlN1Ym1pdHRlZCBCeTo8L2R0PjxkZD57eyBkZXRhaWwuc3VibWl0dGVkQnkgfX08L2RkPjwvZGl2PlxyXG4gICAgICAgIDwvZGw+XHJcblxyXG4gICAgICAgIDwhLS0gQW5zd2VycyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWFuc3dlcnNcIiBpZD1cInZpZXctYWxsXCI+XHJcbiAgICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cImFuc3dlcmJveFwiICpuZ0Zvcj1cImxldCBxIG9mIHZpc2libGVRdWVzdGlvbnM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJZFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1mbGFnZ2VkXT1cInEuZmxhZ2dlZFwiIFtjbGFzcy5pcy1lZGl0aW5nXT1cImlzRWRpdGluZyhxKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5hbmltYXRpb24tZGVsYXkubXNdPVwiaSA8IDEwID8gaSAqIDM1IDogMFwiPlxyXG4gICAgICAgICAgICA8aGVhZGVyIGNsYXNzPVwiYW5zd2VyYm94LWhlYWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXNlY3Rpb25cIiAqbmdJZj1cInNlY3Rpb25zLmxlbmd0aCA+IDFcIj57eyBxLnNlY3Rpb24gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICB7eyBxLnFubyB9fS57eyBxLnRleHQgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC10YWcgZ2FsLXRhZy0td2FybmluZ1wiICpuZ0lmPVwicS5yZXZpc2VkXCI+UmV2aXNlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC10YWcgZ2FsLXRhZy0tZXJyb3JcIiAqbmdJZj1cInEuZmxhZ2dlZFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjRcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTQgMjFWNGgxMWwtMS41IDRMMTUgMTJINFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIEZsYWdnZWRcclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtdGFnIGdhbC10YWctLWdyYXlcIiAqbmdJZj1cInEucmVkb1wiPlJlLWRvPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NvcmVjaGlwXCIgKm5nSWY9XCJxLnNjb3JlICE9PSBudWxsICYmICFxLnJldmlzZWRcIj5TY29yZTp7eyBxLnNjb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZWRpdGljb25cIiAqbmdJZj1cInEuZWRpdGFibGUgJiYgIWlzRWRpdGluZyhxKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtbG9ja2VkXT1cIiEhZWRpdEJsb2NrZWRSZWFzb25cIiBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIiEhZWRpdEJsb2NrZWRSZWFzb25cIlxyXG4gICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiZWRpdEJsb2NrZWRSZWFzb24gfHwgJ0VkaXQgYW5zd2VyJ1wiIHRvb2x0aXBDbGFzcz1cImF2Mi10aXBcIiBwbGFjZW1lbnQ9XCJ0b3AtZW5kXCIgY29udGFpbmVyPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImVkaXRCbG9ja2VkUmVhc29uIHx8ICdFZGl0IGFuc3dlcidcIiAoY2xpY2spPVwic3RhcnRFZGl0KHEpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiAyMGg5XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE2LjUgMy41YTIuMTIxIDIuMTIxIDAgMCAxIDMgM0w3IDE5bC00IDEgMS00TDE2LjUgMy41elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2hlYWRlcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQXMgc3VibWl0dGVkIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5zd2VyYm94LWJvZHlcIiAqbmdJZj1cIiFxLnJldmlzZWQgJiYgIWlzRWRpdGluZyhxKVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdWJtaXR0ZWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBxIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEFjdHVhbCB2cyByZXZpc2VkIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aXNpb25cIiAqbmdJZj1cInEucmV2aXNlZCAmJiAhaXNFZGl0aW5nKHEpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldi1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldi1oZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmV2LWxhYmVsXCI+QWN0dWFsIHN1Ym1pc3Npb248L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLWdyb3dcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NvcmVjaGlwXCIgKm5nSWY9XCJxLmFjdHVhbFNjb3JlICE9PSBudWxsXCI+U2NvcmU6e3sgcS5hY3R1YWxTY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1Ym1pdHRlZDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHEgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXYtYmxvY2sgcmV2LWJsb2NrLS1yZXZpc2VkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2LWhlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXYtbGFiZWwgcmV2LWxhYmVsLS13YXJuaW5nXCI+UmV2aXNlZCBzdWJtaXNzaW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1ncm93XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjb3JlY2hpcFwiICpuZ0lmPVwicS5yZXZpc2VkLnNjb3JlICE9PSBudWxsXCI+U2NvcmU6e3sgcS5yZXZpc2VkLnNjb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5zd2VydGV4dCBhbnN3ZXJ0ZXh0LS1zdHJvbmdcIj57eyBxLnJldmlzZWQuYW5zd2VyIHx8ICfigJQnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2LXJlYXNvbi1sYWJlbFwiPlJlYXNvbiBmb3IgQ2hhbmdlOjxzcGFuICpuZ0lmPVwicS5yZXZpc2VkLmJ5XCI+IMK3IHt7IHEucmV2aXNlZC5ieSB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXYtcmVhc29uXCI+e3sgcS5yZXZpc2VkLnJlYXNvbiB8fCAn4oCUJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRWRpdCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXRwYW5lbFwiICpuZ0lmPVwiaXNFZGl0aW5nKHEpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtdGl0bGVcIj5TZWxlY3QgdGhlIHJldmlzZWQgYW5zd2VyPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtb3B0aW9uc1wiIHJvbGU9XCJyYWRpb2dyb3VwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQW5zd2VyIGZvciBxdWVzdGlvbiAnICsgcS5xbm9cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJyYWRpb1wiIGNsYXNzPVwiZWRpdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0IG9mIHEub3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLW9uXT1cImlzRHJhZnQob3B0KVwiIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc0RyYWZ0KG9wdClcIiAoY2xpY2spPVwicGlja0RyYWZ0KG9wdClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlZGl0LXJhZGlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzRHJhZnQob3B0KVwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVkaXQtb3B0aW9uLWxhYmVsXCI+e3sgb3B0LmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVkaXQtb3B0aW9uLWZsYWdcIiAqbmdJZj1cIm9wdC5mbGFnXCI+RmxhZ3M8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWRpdC1vcHRpb24tc2NvcmVcIiAqbmdJZj1cIm9wdC5zY29yZSAhPT0gbnVsbFwiPlNjb3JlIHt7IG9wdC5zY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlZGl0LW9wdGlvbi1hY3R1YWxcIiAqbmdJZj1cImlzQWN0dWFsT3B0aW9uKHEsIG9wdClcIj5BY3R1YWwgYW5zd2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LXJlYXNvblwiICpuZ0lmPVwiZHJhZnRDaGFuZ2VkKHEpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC10aXRsZVwiPlJlYXNvbiBmb3IgY2hhbmdlIDxzcGFuIGNsYXNzPVwicmVxXCI+Kjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZWRpdC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyYWZ0UmVhc29uXCIgW29wdGlvbnNdPVwicmVhc29uT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGEgcmVhc29uXCIgYXJpYUxhYmVsPVwiUmVhc29uIGZvciBjaGFuZ2VcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJkcmFmdFJlYXNvbiA9PT0gJ090aGVyJ1wiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgbWF4bGVuZ3RoPVwiMzAwXCJcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0aGUgcmVhc29uIGZvciBjaGFuZ2VcIiBbKG5nTW9kZWwpXT1cImRyYWZ0T3RoZXJcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1oaW50XCIgKm5nSWY9XCIhZHJhZnRDaGFuZ2VkKHEpICYmIHEucmV2aXNlZFwiPlxyXG4gICAgICAgICAgICAgICAgU2F2aW5nIGtlZXBzIHRoZSBzdG9yZSdzIGFjdHVhbCBhbnN3ZXIgYW5kIHJlbW92ZXMgdGhlIHJldmlzaW9uLlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwiY2FuY2VsRWRpdCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCIhY2FuU2F2ZShxKVwiIChjbGljayk9XCJzYXZlRWRpdChxKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzYXZpbmcgPyAnU2F2aW5n4oCmJyA6ICdTYXZlIENoYW5nZXMnIH19XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2FydGljbGU+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1ub21hdGNoXCIgKm5nSWY9XCIhdmlzaWJsZVF1ZXN0aW9ucy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgTm8gYW5zd2VycyBtYXRjaCB0aGUgcXVlc3Rpb24gc2VsZWN0aW9uLiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1saW5rXCIgKGNsaWNrKT1cInZpZXdBbGxBbnN3ZXJzKClcIj5WaWV3IGFsbCBhbnN3ZXJzPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQXBwcm92ZSBiYXIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImdhbC1hcHByb3ZlLWJhclwiICpuZ0lmPVwiaGFzU3VibWlzc2lvbiAmJiAhbG9hZGluZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFwcHJvdmUtc3RhdHVzXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWwuYXBwcm92YWxTdGF0dXNcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFwcHJvdmUtZG90IGFwcHJvdmUtZG90LS1zdWNjZXNzXCI+PC9zcGFuPlxyXG4gICAgICAgIEFwcHJvdmVkPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbC5hcHByb3ZlZEJ5XCI+IGJ5IDxzdHJvbmc+e3sgZGV0YWlsLmFwcHJvdmVkQnkgfX08L3N0cm9uZz48L25nLWNvbnRhaW5lcj48bmctY29udGFpbmVyICpuZ0lmPVwiZGV0YWlsLmFwcHJvdmVkQXRcIj4gwrcge3sgZGV0YWlsLmFwcHJvdmVkQXQgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGV0YWlsLmFwcHJvdmFsU3RhdHVzICYmIGRldGFpbC5hcHByb3ZhbEVuYWJsZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwcm92ZS1kb3QgYXBwcm92ZS1kb3QtLXdhcm5pbmdcIj48L3NwYW4+XHJcbiAgICAgICAgV2FpdGluZyBmb3IgYXBwcm92YWw8bmctY29udGFpbmVyICpuZ0lmPVwicmV2aXNlZENvdW50XCI+IMK3IHt7IHJldmlzZWRDb3VudCB9fSB7eyByZXZpc2VkQ291bnQgPT09IDEgPyAnYW5zd2VyJyA6ICdhbnN3ZXJzJyB9fSByZXZpc2VkPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRldGFpbC5hcHByb3ZhbEVuYWJsZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwcm92ZS1kb3RcIj48L3NwYW4+XHJcbiAgICAgICAgTm8gYXBwcm92YWwgc3RlcCBpcyBzZXQgZm9yIHRoaXMgYXVkaXRcclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbC5hcHByb3ZhbEVuYWJsZSAmJiAhZGV0YWlsLmFwcHJvdmFsU3RhdHVzICYmIG1lbnVBY2Nlc3MuY2FuRWRpdFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gZ2FsLWFwcHJvdmVcIiAqbmdJZj1cIiFhcHByb3ZlQ29uZmlybVwiIChjbGljayk9XCJyZXF1ZXN0QXBwcm92ZSgpXCI+QXBwcm92ZTwvYnV0dG9uPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXBwcm92ZUNvbmZpcm1cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFwcHJvdmUtd2FyblwiPkFwcHJvdmFsIHJlY29yZHMgdGhlIGZpbmFsIHNjb3JlIGFuZCBsb2NrcyBmdXJ0aGVyIGVkaXRzLjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwiY2FuY2VsQXBwcm92ZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGdhbC1hcHByb3ZlIGdhbC1hcHByb3ZlLS1jb25maXJtXCIgW2Rpc2FibGVkXT1cImFwcHJvdmluZ1wiIChjbGljayk9XCJjb25maXJtQXBwcm92ZSgpXCI+XHJcbiAgICAgICAgICB7eyBhcHByb3ZpbmcgPyAnQXBwcm92aW5n4oCmJyA6ICdDb25maXJtIGFwcHJvdmFsJyB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFdoYXQgdGhlIHN0b3JlIHN1Ym1pdHRlZDogYW5zd2VyLCBwcm9vZiwgY2FwdHVyZXMgYW5kIHJlbWFya3MuIFNoYXJlZCBieSB0aGUgcGxhaW4gYW5kIHRoZSByZXZpc2VkIHZpZXdzLiAtLT5cclxuICA8bmctdGVtcGxhdGUgI3N1Ym1pdHRlZCBsZXQtcT5cclxuICAgIDxkaXYgY2xhc3M9XCJhbnN3ZXJ0ZXh0XCIgKm5nSWY9XCJhY3R1YWxBbnN3ZXIocSlcIj57eyBhY3R1YWxBbnN3ZXIocSkgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhbnN3ZXJ0ZXh0XCIgKm5nSWY9XCIhYWN0dWFsQW5zd2VyKHEpICYmICFxLm1lZGlhLmxlbmd0aCAmJiAhcS52YWxpZGF0aW9uVGV4dFwiPuKAlDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInByb29mdGV4dFwiICpuZ0lmPVwicS52YWxpZGF0aW9uVGV4dFwiPlZhbGlkYXRpb24gQW5zd2VyOiB7eyBxLnZhbGlkYXRpb25UZXh0IH19PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FsLW1lZGlhXCIgKm5nSWY9XCJxLm1lZGlhLmxlbmd0aFwiPlxyXG4gICAgICA8ZmlndXJlIGNsYXNzPVwiZ2FsLW1lZGlhLWl0ZW1cIiAqbmdGb3I9XCJsZXQgbSBvZiBxLm1lZGlhOyBsZXQgbWkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYnJva2VuTWVkaWEuaGFzKG0uc3JjKTsgZWxzZSBtZWRpYU1pc3NpbmdcIj5cclxuICAgICAgICAgIDxhICpuZ0lmPVwiIW0udmlkZW9cIiBbaHJlZl09XCJtLnNyY1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCIgY2xhc3M9XCJnYWwtbWVkaWEtdGh1bWJcIiB0aXRsZT1cIk9wZW4gaW1hZ2VcIj5cclxuICAgICAgICAgICAgPGltZyBbc3JjXT1cIm0uc3JjXCIgW2FsdF09XCInQW5zd2VyIGltYWdlICcgKyAobWkgKyAxKVwiIGxvYWRpbmc9XCJsYXp5XCIgKGVycm9yKT1cIm9uTWVkaWFFcnJvcihtLnNyYylcIj5cclxuICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDx2aWRlbyAqbmdJZj1cIm0udmlkZW9cIiBbc3JjXT1cIm0uc3JjXCIgY29udHJvbHMgcHJlbG9hZD1cIm1ldGFkYXRhXCIgY2xhc3M9XCJnYWwtbWVkaWEtdGh1bWJcIiAoZXJyb3IpPVwib25NZWRpYUVycm9yKG0uc3JjKVwiPjwvdmlkZW8+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNtZWRpYU1pc3Npbmc+XHJcbiAgICAgICAgICA8YSBbaHJlZl09XCJtLnNyY1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCIgY2xhc3M9XCJnYWwtbWVkaWEtdGh1bWIgZ2FsLW1lZGlhLXRodW1iLS1taXNzaW5nXCJcclxuICAgICAgICAgICAgW3RpdGxlXT1cIihtLnZpZGVvID8gJ1ZpZGVvJyA6ICdJbWFnZScpICsgJyBjb3VsZCBub3QgYmUgbG9hZGVkIC0gb3BlbiB0aGUgZmlsZSdcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMTZcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjlcIiBjeT1cIjEwXCIgcj1cIjEuNlwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjEgMTZsLTUtNS05IDlcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8c3Bhbj5Ob3QgYXZhaWxhYmxlPC9zcGFuPlxyXG4gICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPGZpZ2NhcHRpb24gKm5nSWY9XCJtLmNhcHRpb25cIj5JbWFnZSB7eyBtaSArIDEgfX0gOiB7eyBtLmNhcHRpb24gfX08L2ZpZ2NhcHRpb24+XHJcbiAgICAgIDwvZmlndXJlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicmVtYXJrdGV4dFwiICpuZ0lmPVwicS5yZW1hcmtcIj57eyBsYWJlbHMucmVtYXJrcyB9fToge3sgcS5yZW1hcmsgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJyZW1hcmt0ZXh0XCIgKm5nSWY9XCJxLmV4dHJhUmVtYXJrXCI+e3sgbGFiZWxzLmFkZGl0aW9uYWwgfX06IHt7IHEuZXh0cmFSZW1hcmsgfX08L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8IS0tIENsb3NlcyB0aGUgZXhwb3J0IG1lbnUgb24gYW4gb3V0c2lkZSBjbGljayAtLT5cclxuICA8ZGl2IGNsYXNzPVwibWVudS1iYWNrZHJvcFwiICpuZ0lmPVwiZXhwb3J0T3BlblwiIChjbGljayk9XCJleHBvcnRPcGVuID0gZmFsc2VcIj48L2Rpdj5cclxuXHJcbiAgPCEtLSBGaWx0ZXIgZHJhd2VyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItYmFja2Ryb3BcIiAqbmdJZj1cImZpbHRlcnNPcGVuXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPjwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyYXdlclwiICpuZ0lmPVwiZmlsdGVyc09wZW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItaGVhZFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRyYXdlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRwaWxsXCIgKm5nSWY9XCJhY3RpdmVGaWx0ZXJDb3VudFwiPnt7IGFjdGl2ZUZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZWJ0blwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIiB0aXRsZT1cIkNsb3NlXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XHJcbiAgICAgIDwhLS0gQ2F0ZWdvcmllcyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1uYXZcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWdyb3VwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBsYWJlbFwiPlByaW1hcnk8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgZGVmIG9mIHByaW1hcnlEZWZzOyB0cmFja0J5OiB0cmFja0J5RGVmXCJcclxuICAgICAgICAgICAgW2NsYXNzLm5hdml0ZW0tYWN0aXZlXT1cImFjdGl2ZUZpbHRlciA9PT0gZGVmLmlkXCIgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5KGRlZi5pZClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0aXRsZVwiPnt7IGRlZi5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnZhbHVlXCIgW2NsYXNzLmlzLWRpcnR5XT1cImlzRGlydHkoZGVmLmlkKVwiPnt7IHN1bW1hcnlGb3IoZGVmLmlkKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpcnR5ZG90XCIgKm5nSWY9XCJpc0RpcnR5KGRlZi5pZClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJuYXZjaGV2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjkgNiAxNSAxMiA5IDE4XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1ncm91cFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwbGFiZWxcIj5TZWNvbmRhcnk8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgZGVmIG9mIHNlY29uZGFyeURlZnM7IHRyYWNrQnk6IHRyYWNrQnlEZWZcIlxyXG4gICAgICAgICAgICBbY2xhc3MubmF2aXRlbS1hY3RpdmVdPVwiYWN0aXZlRmlsdGVyID09PSBkZWYuaWRcIiAoY2xpY2spPVwic2VsZWN0Q2F0ZWdvcnkoZGVmLmlkKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRpdGxlXCI+e3sgZGVmLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dmFsdWVcIiBbY2xhc3MuaXMtZGlydHldPVwiaXNEaXJ0eShkZWYuaWQpXCI+e3sgc3VtbWFyeUZvcihkZWYuaWQpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHlkb3RcIiAqbmdJZj1cImlzRGlydHkoZGVmLmlkKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm5hdmNoZXZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiOSA2IDE1IDEyIDkgMThcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gT3B0aW9ucyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1wYW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtaGVhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmV0aXRsZVwiPnt7IGFjdGl2ZURlZi5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVoaW50XCI+e3sgYWN0aXZlRGVmLmhpbnQgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBEYXRlIHJhbmdlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLXNjcm9sbCBwYW5lLWZpZWxkcyBwYW5lLWZpZWxkcy0tZGF0ZVwiICpuZ0lmPVwiYWN0aXZlRGVmLmtpbmQgPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TZWxlY3RlZDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtcmFuZ2UtcmVhZG91dFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICB7eyByYW5nZUxhYmVsIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSBJbmxpbmUgY2FsZW5kYXJzOiBhIGRyb3Bkb3duIGluc2lkZSB0aGlzIHNjcm9sbGluZyBwYW5lIG9wZW5lZCBvZmYgdG8gdGhlIHNpZGUgYW5kIHNjcm9sbGVkIHNpZGV3YXlzLlxyXG4gICAgICAgICAgICAgICBLZXllZCBvbiBmUmFuZ2Ugc28gQ2xlYXIgYWxsIC8gcmVvcGVuaW5nIHJlYnVpbGRzIGl0IG9uIHRoZSByZXN0b3JlZCByYW5nZS4gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrIGF2Mi1kYXRlcGljay0tY29tcGFjdCBnYWwtaW5saW5lLXBpY2tlclwiICpuZ0Zvcj1cImxldCByIG9mIFtmUmFuZ2VdXCI+XHJcbiAgICAgICAgICAgIDxuZ3gtZGF0ZXJhbmdlcGlja2VyLW1hdGVyaWFsICpuZ0lmPVwiclwiIFtzdGFydERhdGVdPVwici5zdGFydERhdGVcIiBbZW5kRGF0ZV09XCJyLmVuZERhdGVcIlxyXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwicGlja2VyTG9jYWxlXCIgW21heERhdGVdPVwidG9kYXlcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbYWx3YXlzU2hvd0NhbGVuZGFyc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbc2hvd0NhbmNlbF09XCJmYWxzZVwiIChkYXRlc1VwZGF0ZWQpPVwib25SYW5nZVBpY2tlZCgkZXZlbnQpXCI+PC9uZ3gtZGF0ZXJhbmdlcGlja2VyLW1hdGVyaWFsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2NvcmUgcmFuZ2UgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtc2Nyb2xsIHBhbmUtZmllbGRzXCIgKm5nSWY9XCJhY3RpdmVEZWYua2luZCA9PT0gJ3Njb3JlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5Gcm9tPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1ib3ggZmllbGQtYm94LS1udW1cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cImZTY29yZU1pblwiPjxzcGFuIGNsYXNzPVwiZmllbGQtdW5pdFwiPiU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtc2VwXCI+dG88L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlRvPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1ib3ggZmllbGQtYm94LS1udW1cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cImZTY29yZU1heFwiPjxzcGFuIGNsYXNzPVwiZmllbGQtdW5pdFwiPiU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY29yZS1yZWFkb3V0XCI+e3sgZlNjb3JlTWluIH19JSDigJMge3sgZlNjb3JlTWF4IH19JTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBPcHRpb24gbGlzdCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1zY3JvbGwgcGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVEZWYua2luZCA9PT0gJ2xpc3QnXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYW5lc2VhcmNoXCIgKm5nSWY9XCJhY3RpdmVEZWYuc2VhcmNoYWJsZVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwib3B0aW9uUXVlcnlcIj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGFjdGl2ZU9wdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlPcHRpb25cIlxyXG4gICAgICAgICAgICBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiIChjbGljayk9XCJwaWNrKG9wdClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiaXNTZWxlY3RlZChvcHQpXCIgW2NsYXNzLm1hcmstbXVsdGldPVwiYWN0aXZlRGVmLm11bHRpXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzU2VsZWN0ZWQob3B0KVwiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0dGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyBvcHQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRtZXRhXCIgKm5nSWY9XCJvcHQubWV0YVwiPnt7IG9wdC5tZXRhIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9tYXRjaFwiICpuZ0lmPVwibm9PcHRpb25NYXRjaFwiPk5vIG1hdGNoIGZvciB0aGlzIHNlYXJjaC48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWZvb3RcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCI+Q2xlYXIgYWxsPC9idXR0b24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS13aWRlXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCI+QXBwbHkgZmlsdGVyczwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuIl19
|
|
1813
|
+
args: [{ selector: 'lib-audit-v2-gallery', template: "<div class=\"av2-page audit-gallery\">\r\n\r\n <!-- Header bar with quick selects -->\r\n <section class=\"gal-header\">\r\n <div class=\"gal-heading\">\r\n <div class=\"gal-header-title\">Gallery</div>\r\n <div class=\"gal-header-sub\">\r\n <ng-container *ngIf=\"total\">{{ total }} {{ total === 1 ? 'submission' : 'submissions' }} \u00B7 </ng-container>{{ rangeLabel }}\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <!-- Chevrons are SVGs, not text glyphs, so they sit on the chip's centre line. -->\r\n <button type=\"button\" class=\"quickchip chip-on\" (click)=\"openFilters('type')\">\r\n {{ fType }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--name\" (click)=\"openFilters('name')\" [title]=\"fName\">\r\n <span class=\"quickchip-label\">{{ fName || 'Select audit' }}</span>\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip chip-on\" *ngIf=\"datePicked\" (click)=\"openFilters('date')\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"6\"></line>\r\n </svg>\r\n {{ rangeLabel }}\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip\" (click)=\"openScopeFilter()\">\r\n {{ storeSummary }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--strong\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n All Filters\r\n <span class=\"countbadge\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n </button>\r\n\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm av2-btn--wide\" (click)=\"applyFilters()\">\r\n Apply\r\n </button>\r\n </section>\r\n\r\n <div class=\"gal-body\">\r\n\r\n <!-- Question navigation -->\r\n <!-- The white column runs the full height of the right card; its content stays in view while scrolling. -->\r\n <aside class=\"gal-left\" [class.is-collapsed]=\"navCollapsed\">\r\n <!-- \u00AB hides the panel (v1 sidenav); \u00BB in the toolbar brings it back. -->\r\n <button type=\"button\" class=\"gal-nav-toggle\" *ngIf=\"!navCollapsed\" (click)=\"toggleNav()\"\r\n title=\"Hide questions\" aria-label=\"Hide questions\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 17L6 12L11 7M18 17L13 12L18 7\"></path></svg>\r\n </button>\r\n <div class=\"gal-left-inner\" *ngIf=\"!navCollapsed\">\r\n <div class=\"gal-left-head\">\r\n <span class=\"av2-sk av2-sk--title\" *ngIf=\"navLoading && !fName\"></span>\r\n <div class=\"gal-audit-name\" *ngIf=\"!navLoading || fName\">{{ fName || 'No audit selected' }}</div>\r\n <div class=\"gal-audit-sub\" *ngIf=\"detail.subtitle\">{{ detail.subtitle }}</div>\r\n </div>\r\n\r\n <!-- No submission for the filters (e.g. the last one was just approved under \"Not Approved\"):\r\n nothing to navigate, so the question list goes with it. -->\r\n <div class=\"gal-nav-empty\" *ngIf=\"!loading && !hasSubmission\">No submissions for the selected filters.</div>\r\n\r\n <ng-container *ngIf=\"loading || hasSubmission\">\r\n <!-- Clears any question selection. -->\r\n <div class=\"view-all\" [class.is-active]=\"!hasSelection\">\r\n <button type=\"button\" class=\"view-all-link\" (click)=\"viewAllAnswers()\">View All Answers</button>\r\n </div>\r\n\r\n <!-- Section accordion: one open at a time. -->\r\n <div class=\"gal-sections\">\r\n <lib-audit-v2-shimmer *ngIf=\"navLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!navLoading\">\r\n <ng-container *ngFor=\"let s of sections; let i = index; trackBy: trackBySection\">\r\n <button type=\"button\" class=\"gal-section\" [class.is-open]=\"openSection === i\" (click)=\"toggleSection(i)\">\r\n <span class=\"gal-section-name\">{{ s.name }}<span class=\"gal-section-points\" *ngIf=\"sectionPoints(s) as pts\"\r\n title=\"Compliance points earned / possible in this section\">{{ pts }}</span></span>\r\n <!-- Ticks stay when a section is collapsed; the count shows they are still narrowing the answers. -->\r\n <span class=\"gal-section-count\" *ngIf=\"sectionPicked(s) as n\" [attr.title]=\"n + ' selected in this section'\">{{ n }}</span>\r\n <span class=\"gal-section-rule\"></span>\r\n <span class=\"gal-section-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"openSection !== i\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <ng-container *ngIf=\"openSection === i\">\r\n <button type=\"button\" class=\"gal-nav-item\" *ngFor=\"let q of s.questions; trackBy: trackById\"\r\n [class.is-picked]=\"isQuestionSelected(q)\" (click)=\"toggleQuestion(q)\">\r\n <span class=\"gal-check\" [class.is-on]=\"isQuestionSelected(q)\">\r\n <svg *ngIf=\"isQuestionSelected(q)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"gal-nav-text\">{{ q.qno }} . {{ q.text }}</span>\r\n <span class=\"gal-dot gal-dot--flag\" *ngIf=\"isFlagged(q)\" title=\"Flagged\"></span>\r\n <span class=\"gal-dot gal-dot--revised\" *ngIf=\"isRevised(q)\" title=\"Revised\"></span>\r\n </button>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!s.questions.length\">No questions in this section</div>\r\n </ng-container>\r\n </ng-container>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!sections.length\">No questions for the selected filters</div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </aside>\r\n\r\n <section class=\"gal-main\">\r\n <!-- Pager + export -->\r\n <div class=\"gal-toolbar\">\r\n <button type=\"button\" class=\"gal-nav-toggle gal-nav-toggle--open\" *ngIf=\"navCollapsed\" (click)=\"toggleNav()\"\r\n title=\"Show questions\" aria-label=\"Show questions\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M13 17L18 12L13 7M6 17L11 12L6 7\"></path></svg>\r\n </button>\r\n <div class=\"gal-pager\" *ngIf=\"total\">\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canPrev\" (click)=\"prevPage()\" title=\"Previous submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"15 18 9 12 15 6\"></polyline>\r\n </svg>\r\n </button>\r\n <span class=\"gal-pager-label\">Submission <strong>{{ pageLabel }}</strong></span>\r\n <button type=\"button\" class=\"gal-pager-btn\" [disabled]=\"!canNext\" (click)=\"nextPage()\" title=\"Next submission\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n <span class=\"status-pill status-pill--warning\" *ngIf=\"!loading && hasSubmission && detail.status !== 'submit'\">Re-do requested</span>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <div class=\"export-wrap\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm gal-export\" [disabled]=\"exporting || !total\"\r\n (click)=\"toggleExport()\" [attr.aria-expanded]=\"exportOpen\">\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n <div class=\"export-menu\" *ngIf=\"exportOpen\" role=\"menu\">\r\n <!-- Excel: built here, downloads right away (hidden for now, see showExcelExport) -->\r\n <ng-container *ngIf=\"showExcelExport\">\r\n <div class=\"export-group\">Excel (.xlsx) \u00B7 downloads now</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" [disabled]=\"!hasSubmission\" (click)=\"exportCurrent()\">\r\n <span class=\"export-title\">This submission</span>\r\n <span class=\"export-meta\">{{ detail.storeName }} \u00B7 {{ detail.date }}</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportAll()\">\r\n <span class=\"export-title\">All {{ total }} {{ total === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"export-meta\">Current filters \u00B7 summary + every answer</span>\r\n </button>\r\n </ng-container>\r\n <!-- CSV / PDF / PPT / ZIP: the v1 gallery's download service -->\r\n <div class=\"export-group\">Report files \u00B7 Notifications \u203A Downloads</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('csv')\">\r\n <span class=\"export-title\">Export as CSV</span>\r\n <span class=\"export-meta\">Current filters</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('pdf')\">\r\n <span class=\"export-title\">Export as PDF</span>\r\n <span class=\"export-meta\">One report per submission</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('ppt')\">\r\n <span class=\"export-title\">Export as PPT</span>\r\n <span class=\"export-meta\">Tick up to 3 questions on the left</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('zipfiles')\">\r\n <span class=\"export-title\">Export as ZIP</span>\r\n <span class=\"export-meta\">Photos and videos</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading -->\r\n <div class=\"gal-skeleton\" *ngIf=\"loading\" aria-busy=\"true\" aria-label=\"Loading submission\">\r\n <div class=\"sk sk-logo\"></div>\r\n <div class=\"sk sk-facts\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card sk-card--short\"></div>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && loadError\">\r\n <span class=\"gal-state-icon gal-state-icon--error\">\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12.5\"></line>\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\r\n </svg>\r\n </span>\r\n <div class=\"gal-state-title\">{{ loadError }}</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"retry()\">Retry</button>\r\n </div>\r\n\r\n <!-- Nothing submitted -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && !loadError && !hasSubmission\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"gal-state-title\">{{ fName ? 'No submissions found' : (linkMissing ? 'Audit not found' : 'No audits to show') }}</div>\r\n <div class=\"gal-state-sub\" *ngIf=\"fName\">\r\n Nothing was submitted for <strong>{{ fName }}</strong> between {{ rangeLabel }} with the current filters.\r\n Try a wider date range or another store.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && linkMissing\">\r\n The audit you opened was deleted or is not an audit. Pick an audit in the filters to see its submissions.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && !linkMissing\">Create an audit in Manage to see its submissions here.</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"fName || (linkMissing && audits.length)\"\r\n (click)=\"openFilters(fName ? 'date' : 'name')\">{{ fName ? 'Change filters' : 'Pick an audit' }}</button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!loading && hasSubmission\">\r\n <!-- Client brand -->\r\n <div class=\"gal-brand\">\r\n <span class=\"gal-brand-box\" [class.has-logo]=\"clientLogo && !logoFailed\">\r\n <img *ngIf=\"clientLogo && !logoFailed\" [src]=\"clientLogo\" [alt]=\"clientName || 'Client logo'\" (error)=\"logoFailed = true\">\r\n <ng-container *ngIf=\"!clientLogo || logoFailed\">{{ clientName || 'Logo' }}</ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Who / where / when, read row by row across the two columns -->\r\n <dl class=\"gal-facts\">\r\n <div class=\"gal-fact\"><dt>Store Name:</dt><dd>{{ detail.storeName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Duration:</dt><dd>{{ detail.duration }}</dd></div>\r\n <div class=\"gal-fact\"><dt>Audit Name:</dt><dd>{{ detail.auditName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Date:</dt><dd>{{ detail.date }}</dd></div>\r\n <div class=\"gal-fact\"><dt>State & Country:</dt><dd>{{ detail.region }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Time:</dt><dd>{{ detail.time }}</dd></div>\r\n <div class=\"gal-fact\"><dt>No. of Questions:</dt><dd>{{ detail.questionCount }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\">\r\n <dt>Compliance Score:</dt>\r\n <dd *ngIf=\"detail.complianceEnabled\" [title]=\"'Pass mark ' + passThreshold + '%'\">{{ compliancePercent }}% <span class=\"gal-result\" [class.is-fail]=\"!passed\">({{ resultLabel }})</span></dd>\r\n <!-- No question of this audit has compliance scoring on: no score (the flag-based rule would read 100%). -->\r\n <dd *ngIf=\"!detail.complianceEnabled\" title=\"Compliance score is not enabled for this audit\">\u2014</dd>\r\n </div>\r\n <div class=\"gal-fact\"><dt>Submitted By:</dt><dd>{{ detail.submittedBy }}</dd></div>\r\n <!-- v1: shown only when the submitter acknowledged with a name; View Proof also when only a photo exists. -->\r\n <div class=\"gal-fact gal-fact--side\" *ngIf=\"detail.acknowledgedBy || detail.proofImage\">\r\n <dt>Acknowledged By:</dt>\r\n <dd>\r\n {{ detail.acknowledgedBy || '\u2014' }}\r\n <button type=\"button\" class=\"gal-proof-link\" (click)=\"proofOpen = true\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle></svg>\r\n View Proof\r\n </button>\r\n </dd>\r\n </div>\r\n </dl>\r\n\r\n <!-- Answers -->\r\n <div class=\"gal-answers\" id=\"view-all\">\r\n <article class=\"answerbox\" *ngFor=\"let q of visibleQuestions; let i = index; trackBy: trackById\"\r\n [class.is-flagged]=\"q.flagged\" [class.is-editing]=\"isEditing(q)\"\r\n [style.animation-delay.ms]=\"i < 10 ? i * 35 : 0\">\r\n <header class=\"answerbox-head\">\r\n <div class=\"qtext\">\r\n <span class=\"qsection\" *ngIf=\"sections.length > 1\">{{ q.section }}</span>\r\n {{ q.qno }}.{{ q.text }}\r\n <span class=\"qdesc\" *ngIf=\"q.description\">{{ q.description }}</span>\r\n </div>\r\n <span class=\"gal-tag gal-tag--warning\" *ngIf=\"q.revised\">Revised</span>\r\n <span class=\"gal-tag gal-tag--error\" *ngIf=\"q.flagged\">\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 21V4h11l-1.5 4L15 12H4\"></path></svg>\r\n Flagged\r\n </span>\r\n <span class=\"gal-tag gal-tag--gray\" *ngIf=\"q.redo\">Re-do</span>\r\n <span class=\"scorechip\" *ngIf=\"q.score !== null && !q.revised\">Score:{{ q.score }}</span>\r\n <button type=\"button\" class=\"editicon\" *ngIf=\"q.editable && !isEditing(q)\"\r\n [class.is-locked]=\"!!editBlockedReason\" [attr.aria-disabled]=\"!!editBlockedReason\"\r\n [ngbTooltip]=\"editBlockedReason || 'Edit answer'\" tooltipClass=\"av2-tip\" placement=\"top-end\" container=\"body\"\r\n [attr.aria-label]=\"editBlockedReason || 'Edit answer'\" (click)=\"startEdit(q)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 20h9\"></path>\r\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"></path>\r\n </svg>\r\n </button>\r\n </header>\r\n\r\n <!-- As submitted -->\r\n <div class=\"answerbox-body\" *ngIf=\"!q.revised && !isEditing(q)\">\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n\r\n <!-- Actual vs revised -->\r\n <div class=\"revision\" *ngIf=\"q.revised && !isEditing(q)\">\r\n <div class=\"rev-block\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label\">Actual submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.actualScore !== null\">Score:{{ q.actualScore }}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n <div class=\"rev-block rev-block--revised\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label rev-label--warning\">Revised submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.revised.score !== null\">Score:{{ q.revised.score }}</span>\r\n </div>\r\n <div class=\"answertext answertext--strong\">{{ q.revised.answer || '\u2014' }}</div>\r\n <div class=\"rev-reason-label\">Reason for Change:<span *ngIf=\"q.revised.by\"> \u00B7 {{ q.revised.by }}</span></div>\r\n <div class=\"rev-reason\">{{ q.revised.reason || '\u2014' }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Edit -->\r\n <div class=\"editpanel\" *ngIf=\"isEditing(q)\">\r\n <div class=\"edit-title\">Select the revised answer</div>\r\n <div class=\"edit-options\" role=\"radiogroup\" [attr.aria-label]=\"'Answer for question ' + q.qno\">\r\n <button type=\"button\" role=\"radio\" class=\"edit-option\" *ngFor=\"let opt of q.options; trackBy: trackByLabel\"\r\n [class.is-on]=\"isDraft(opt)\" [attr.aria-checked]=\"isDraft(opt)\" (click)=\"pickDraft(opt)\">\r\n <span class=\"edit-radio\">\r\n <svg *ngIf=\"isDraft(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"edit-option-label\">{{ opt.label }}</span>\r\n <span class=\"edit-option-flag\" *ngIf=\"opt.flag\">Flags</span>\r\n <span class=\"edit-option-score\" *ngIf=\"opt.score !== null\">Score {{ opt.score }}</span>\r\n <span class=\"edit-option-actual\" *ngIf=\"isActualOption(q, opt)\">Actual answer</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"edit-reason\" *ngIf=\"draftChanged(q)\">\r\n <div class=\"edit-title\">Reason for change <span class=\"req\">*</span></div>\r\n <lib-audit-v2-select class=\"edit-select\" [(ngModel)]=\"draftReason\" [options]=\"reasonOptions\"\r\n placeholder=\"Select a reason\" ariaLabel=\"Reason for change\"></lib-audit-v2-select>\r\n <input *ngIf=\"draftReason === 'Other'\" type=\"text\" class=\"edit-input\" maxlength=\"300\"\r\n placeholder=\"Enter the reason for change\" [(ngModel)]=\"draftOther\">\r\n </div>\r\n <div class=\"edit-hint\" *ngIf=\"!draftChanged(q) && q.revised\">\r\n Saving keeps the store's actual answer and removes the revision.\r\n </div>\r\n\r\n <div class=\"edit-actions\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"!canSave(q)\" (click)=\"saveEdit(q)\">\r\n {{ saving ? 'Saving\u2026' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n </article>\r\n\r\n <div class=\"gal-nomatch\" *ngIf=\"!visibleQuestions.length\">\r\n No answers match the question selection. <button type=\"button\" class=\"av2-link\" (click)=\"viewAllAnswers()\">View all answers</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n <!-- Approve bar -->\r\n <div class=\"gal-approve-bar\" *ngIf=\"hasSubmission && !loading\">\r\n <div class=\"approve-status\">\r\n <ng-container *ngIf=\"detail.approvalStatus\">\r\n <span class=\"approve-dot approve-dot--success\"></span>\r\n Approved<ng-container *ngIf=\"detail.approvedBy\"> by <strong>{{ detail.approvedBy }}</strong></ng-container><ng-container *ngIf=\"detail.approvedAt\"> \u00B7 {{ detail.approvedAt }}</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalStatus && detail.approvalEnable\">\r\n <span class=\"approve-dot approve-dot--warning\"></span>\r\n Waiting for approval<ng-container *ngIf=\"revisedCount\"> \u00B7 {{ revisedCount }} {{ revisedCount === 1 ? 'answer' : 'answers' }} revised</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalEnable\">\r\n <span class=\"approve-dot\"></span>\r\n No approval step is set for this audit\r\n </ng-container>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <ng-container *ngIf=\"detail.approvalEnable && !detail.approvalStatus && menuAccess.canEdit\">\r\n <button type=\"button\" class=\"av2-btn gal-approve\" *ngIf=\"!approveConfirm\" (click)=\"requestApprove()\">Approve</button>\r\n <ng-container *ngIf=\"approveConfirm\">\r\n <span class=\"approve-warn\">Approval records the final score and locks further edits.</span>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelApprove()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn gal-approve gal-approve--confirm\" [disabled]=\"approving\" (click)=\"confirmApprove()\">\r\n {{ approving ? 'Approving\u2026' : 'Confirm approval' }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- What the store submitted: answer, proof, captures and remarks. Shared by the plain and the revised views. -->\r\n <ng-template #submitted let-q>\r\n <!-- v1 layout: the question's reference image and the answer on the left; validation photos / videos, the\r\n chosen option's reference image and the AI results in a right-hand column (col-md-6 / col-md-6). -->\r\n <div class=\"gal-split\" [class.is-split]=\"hasSide(q)\">\r\n <div class=\"gal-split-main\">\r\n <div class=\"gal-block\" *ngIf=\"q.questionRefs.length\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.questionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <!-- Every chosen answer on a line of its own (a multiple-choice answer is not run together with commas). -->\r\n <ng-container *ngIf=\"actualAnswer(q)\">\r\n <div class=\"answertext\" *ngFor=\"let a of q.answers\" [class.is-flag]=\"q.flagged\">{{ a }}{{ q.unit }}</div>\r\n </ng-container>\r\n <div class=\"answertext\" *ngIf=\"!actualAnswer(q) && !q.media.length && !q.proof.length && !q.validationText\">\u2014</div>\r\n <!-- Typed validation answer under the answer (v1 \"Validation Answer : 88\"); several are listed one per line. -->\r\n <div class=\"prooftext\" *ngIf=\"q.validationTexts.length === 1\" [class.is-flag]=\"q.flagged\">Validation Answer : {{ q.validationTexts[0] }}</div>\r\n <ng-container *ngIf=\"q.validationTexts.length > 1\">\r\n <div class=\"prooftext\" [class.is-flag]=\"q.flagged\">Validation Answer :</div>\r\n <div class=\"prooftext\" *ngFor=\"let v of q.validationTexts\" [class.is-flag]=\"q.flagged\">{{ v }}</div>\r\n </ng-container>\r\n\r\n <!-- Image / video questions: the capture's reference image, then the uploads. -->\r\n <div class=\"gal-block\" *ngIf=\"q.optionRefs.length && !isChoice(q)\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.optionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <div class=\"gal-block\" *ngIf=\"q.media.length\">\r\n <div class=\"gal-block-title\">{{ mediaTitle(q.media) }}</div>\r\n <ng-container *ngTemplateOutlet=\"mediaGrid; context: { $implicit: q.media, title: mediaTitle(q.media) }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"gal-split-side\" *ngIf=\"hasSide(q)\">\r\n <!-- Reference image of the chosen option. -->\r\n <div class=\"gal-block\" *ngIf=\"q.optionRefs.length && isChoice(q)\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.optionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <!-- Photo / video proof the chosen option asked for. -->\r\n <div class=\"gal-block\" *ngIf=\"q.proof.length\">\r\n <div class=\"gal-block-title\">Validation Answer</div>\r\n <ng-container *ngTemplateOutlet=\"mediaGrid; context: { $implicit: q.proof, title: 'Validation Answer' }\"></ng-container>\r\n </div>\r\n\r\n <div class=\"gal-ai\" *ngIf=\"q.aiResults.length\">\r\n <div class=\"gal-ai-line\" *ngFor=\"let r of q.aiResults\"><b>{{ r.label }} :</b> {{ r.value }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Image / video questions keep their AI results under the uploads (v1). -->\r\n <div class=\"gal-ai\" *ngIf=\"q.aiResults.length && !hasSide(q)\">\r\n <div class=\"gal-ai-line\" *ngFor=\"let r of q.aiResults\"><b>{{ r.label }} :</b> {{ r.value }}</div>\r\n </div>\r\n\r\n <div class=\"remarktext\" *ngIf=\"q.remark\">{{ labels.remarks }} : {{ q.remark }}</div>\r\n <div class=\"remarktext\" *ngIf=\"q.extraRemark\">{{ labels.additional }} : {{ q.extraRemark }}</div>\r\n </ng-template>\r\n\r\n <!-- Reference images: v1 collage (1 column for one, 2 for up to four, then 3), click opens the viewer. -->\r\n <ng-template #refGrid let-list let-title=\"title\">\r\n <div class=\"gal-grid\" [ngClass]=\"gridClass(list.length)\">\r\n <button type=\"button\" class=\"gal-tile\" *ngFor=\"let src of list; let i = index\" [title]=\"'Open ' + title\"\r\n (click)=\"openViewer(list, i, title)\">\r\n <img [src]=\"src\" [alt]=\"title + ' ' + (i + 1)\" loading=\"lazy\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Captured photos / videos with the v1 extras: Matched badge, upload time, per-image description. -->\r\n <ng-template #mediaGrid let-list let-title=\"title\">\r\n <div class=\"gal-grid\" [ngClass]=\"gridClass(list.length)\">\r\n <figure class=\"gal-tile-wrap\" *ngFor=\"let m of list; let mi = index\">\r\n <ng-container *ngIf=\"!brokenMedia.has(m.src)\">\r\n <button *ngIf=\"!m.video\" type=\"button\" class=\"gal-tile\" [title]=\"'Open ' + title\" (click)=\"openMediaViewer(list, m, title)\">\r\n <img [src]=\"m.src\" [alt]=\"title + ' ' + (mi + 1)\" loading=\"lazy\" (error)=\"onMediaError(m.src)\">\r\n </button>\r\n <video *ngIf=\"m.video\" [src]=\"m.src\" controls preload=\"metadata\" class=\"gal-tile gal-tile--video\" (error)=\"onMediaError(m.src)\"></video>\r\n </ng-container>\r\n <a *ngIf=\"brokenMedia.has(m.src)\" [href]=\"m.src\" target=\"_blank\" rel=\"noopener\" class=\"gal-tile gal-tile--missing\"\r\n [title]=\"(m.video ? 'Video' : 'Image') + ' could not be loaded - open the file'\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <circle cx=\"9\" cy=\"10\" r=\"1.6\"></circle>\r\n <path d=\"M21 16l-5-5-9 9\"></path>\r\n </svg>\r\n <span>Not available</span>\r\n </a>\r\n <span class=\"gal-detect\" *ngIf=\"m.detection\" [class.is-bad]=\"m.detection === 'notmatched'\">{{ m.detection === 'matched' ? 'Matched' : 'Not Matched' }}</span>\r\n <figcaption>\r\n <span class=\"gal-upload-time\" *ngIf=\"m.uploaded\">{{ m.uploaded }}</span>\r\n <span *ngIf=\"m.caption\">Image {{ mi + 1 }} : {{ m.caption }}</span>\r\n </figcaption>\r\n </figure>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Image viewer -->\r\n <div class=\"gal-viewer\" *ngIf=\"viewer\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"viewer.title\" (click)=\"closeViewer()\">\r\n <div class=\"gal-viewer-box\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"gal-viewer-head\">\r\n <span class=\"gal-viewer-title\">{{ viewer.title }}<span *ngIf=\"viewer.items.length > 1\"> \u00B7 {{ viewer.index + 1 }} / {{ viewer.items.length }}</span></span>\r\n <button type=\"button\" class=\"gal-viewer-close\" (click)=\"closeViewer()\" aria-label=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"gal-viewer-stage\">\r\n <button type=\"button\" class=\"gal-viewer-nav gal-viewer-nav--prev\" *ngIf=\"viewer.items.length > 1\"\r\n [disabled]=\"viewer.index === 0\" (click)=\"stepViewer(-1)\" aria-label=\"Previous image\">\u2039</button>\r\n <img [src]=\"viewer.items[viewer.index]\" [alt]=\"viewer.title\">\r\n <button type=\"button\" class=\"gal-viewer-nav gal-viewer-nav--next\" *ngIf=\"viewer.items.length > 1\"\r\n [disabled]=\"viewer.index === viewer.items.length - 1\" (click)=\"stepViewer(1)\" aria-label=\"Next image\">\u203A</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- View Proof (v1 \"Verification Details\") -->\r\n <div class=\"gal-viewer\" *ngIf=\"proofOpen\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Verification Details\" (click)=\"proofOpen = false\">\r\n <div class=\"gal-viewer-box gal-viewer-box--md\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"gal-viewer-head\">\r\n <span class=\"gal-viewer-title\">Verification Details</span>\r\n <button type=\"button\" class=\"gal-viewer-close\" (click)=\"proofOpen = false\" aria-label=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"gal-proof-body\">\r\n <ng-container *ngIf=\"detail.proofImage\">\r\n <div class=\"gal-block-title\">Captured Photo</div>\r\n <img class=\"gal-proof-img\" [src]=\"detail.proofImage\" alt=\"Captured photo\">\r\n </ng-container>\r\n <div class=\"gal-proof-name\"><b>Name :</b> {{ detail.acknowledgedBy || '\u2014' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Closes the export menu on an outside click -->\r\n <div class=\"menu-backdrop\" *ngIf=\"exportOpen\" (click)=\"exportOpen = false\"></div>\r\n\r\n <!-- Filter drawer -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"countpill\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <!-- Categories -->\r\n <div class=\"drawer-nav\">\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Primary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of primaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Secondary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of secondaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"drawer-pane\">\r\n <div class=\"pane-head\">\r\n <div class=\"panetitle\">{{ activeDef.label }}</div>\r\n <div class=\"panehint\">{{ activeDef.hint }}</div>\r\n </div>\r\n\r\n <!-- Date range -->\r\n <div class=\"pane-scroll pane-fields pane-fields--date\" *ngIf=\"activeDef.kind === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Selected</span>\r\n <span class=\"gal-range-readout\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n {{ rangeLabel }}\r\n </span>\r\n </div>\r\n <!-- Inline calendars: a dropdown inside this scrolling pane opened off to the side and scrolled sideways.\r\n Keyed on fRange so Clear all / reopening rebuilds it on the restored range. -->\r\n <div class=\"av2-datepick av2-datepick--compact gal-inline-picker\" *ngFor=\"let r of [fRange]\">\r\n <ngx-daterangepicker-material *ngIf=\"r\" [startDate]=\"r.startDate\" [endDate]=\"r.endDate\"\r\n [locale]=\"pickerLocale\" [maxDate]=\"today\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\"\r\n [showCancel]=\"false\" (datesUpdated)=\"onRangePicked($event)\"></ngx-daterangepicker-material>\r\n </div>\r\n </div>\r\n\r\n <!-- Score range -->\r\n <div class=\"pane-scroll pane-fields\" *ngIf=\"activeDef.kind === 'score'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">From</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMin\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <span class=\"field-sep\">to</span>\r\n <div class=\"field\">\r\n <span class=\"field-label\">To</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [(ngModel)]=\"fScoreMax\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <span class=\"score-readout\">{{ fScoreMin }}% \u2013 {{ fScoreMax }}%</span>\r\n </div>\r\n\r\n <!-- Option list -->\r\n <div class=\"pane-scroll pane-list\" *ngIf=\"activeDef.kind === 'list'\">\r\n <label class=\"panesearch\" *ngIf=\"activeDef.searchable\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"searchPlaceholder\" [(ngModel)]=\"optionQuery\">\r\n </label>\r\n\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let opt of activeOptions; trackBy: trackByOption\"\r\n [class.option-selected]=\"isSelected(opt)\" (click)=\"pick(opt)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"isSelected(opt)\" [class.mark-multi]=\"activeDef.multi\">\r\n <svg *ngIf=\"isSelected(opt)\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ opt.label }}</span>\r\n <span class=\"optmeta\" *ngIf=\"opt.meta\">{{ opt.meta }}</span>\r\n </span>\r\n </button>\r\n\r\n <div class=\"nomatch\" *ngIf=\"noOptionMatch\">{{ noOptionText }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"clearFilters()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:18px;line-height:26px;font-weight:700;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:13px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat{border-radius:10px;background:linear-gradient(90deg,#f0f7ff,#f8fbff 60%,#fff);box-shadow:inset 0 0 0 1px #d1e9ff;padding:20px 24px;display:flex;align-items:center;gap:16px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:700;color:#101828}.av2-stat-label{font-size:15px;line-height:22px;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #b2ddff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eff8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:15px;line-height:22px;font-weight:600;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:24px;line-height:32px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:40px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:40px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#1570ef;color:#fff}.av2-btn--primary:hover:not(:disabled){background:#175cd3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:40px;padding:0 26px;border:0;border-radius:8px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eff8ff;color:#175cd3;font-weight:600}.av2-badge{display:inline-flex;align-items:center;height:28px;padding:0 12px;border-radius:6px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:600;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#1570ef;font-size:13px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#175cd3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px 8px;font-size:12px;line-height:18px;font-weight:600;color:#475467;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:14px 8px;border:0;border-bottom:1px solid #F2F4F7;font-size:13px;line-height:20px;color:#1d2939;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:14px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eff8ff;color:#175cd3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#1570ef}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.audit-gallery{position:relative}.gal-header{background:#fff;border-radius:12px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:14px 20px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.gal-heading{display:flex;flex-direction:column;min-width:0}.gal-header-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.gal-header-sub{font-size:12px;line-height:18px;color:#667085}.quickchip{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#344054;white-space:nowrap;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.quickchip:hover{background:#f9fafb}.quickchip.chip-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #b2ddff;color:#175cd3;font-weight:600}.quickchip.quickchip--strong{padding:0 14px;font-weight:600}.quickchip.quickchip--name{max-width:300px}.quickchip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chip-chev{flex-shrink:0}.countbadge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9999px;background:#1570ef;color:#fff;font-size:11px;font-weight:700}.gal-body{display:flex;gap:16px;align-items:stretch}.gal-left{position:relative;width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.gal-left.is-collapsed{display:none}.gal-nav-toggle{position:absolute;top:24px;right:-18px;z-index:2;width:36px;height:36px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 2px 6px #1018281f;color:#344054;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-nav-toggle:hover{color:#1570ef}.gal-nav-toggle--open{position:static;flex-shrink:0}.gal-section-points{margin-left:4px;font-weight:500;color:#475467}.gal-left-inner{position:sticky;top:16px;max-height:calc(100vh - 32px);overflow:auto;padding:16px;display:flex;flex-direction:column;gap:12px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.gal-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.gal-audit-sub{font-size:11px;line-height:16px;color:#667085}.view-all{border-radius:8px;background:#eff8ff;padding:10px 12px}.view-all-link{padding:0;border:none;background:none;font-family:inherit;font-size:13px;font-weight:600;color:#1570ef;text-decoration:underline;text-underline-offset:2px;cursor:pointer}.view-all-link:hover{color:#175cd3}.gal-sections{display:flex;flex-direction:column;gap:6px}.gal-section{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0;border:none;background:transparent;font-family:inherit;font-size:13px;line-height:20px;font-weight:500;color:#344054;text-align:left;cursor:pointer}.gal-section.is-open{padding:4px 0;font-weight:600;color:#1d2939}.gal-section-name{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gal-section-count{flex:none;min-width:18px;height:18px;padding:0 6px;border-radius:9px;background:#eff8ff;color:#175cd3;font-size:11px;line-height:18px;font-weight:600;text-align:center}.gal-section-rule{flex:1;border-top:1px solid #EAECF0}.gal-section-chev{display:flex;color:#98a2b3}.gal-section-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.gal-section-chev .rotate{transform:rotate(-90deg)}.gal-nav-item{display:flex;align-items:flex-start;gap:8px;width:100%;padding:3px 4px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:12px;line-height:18px;color:#475467;text-align:left;cursor:pointer}.gal-nav-item:hover{background:#f9fafb}.gal-nav-item.is-picked .gal-nav-text{color:#175cd3;font-weight:500}.gal-check{width:14px;height:14px;flex-shrink:0;margin-top:2px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:inline-flex;align-items:center;justify-content:center;color:#fff}.gal-check.is-on{background:#1570ef;box-shadow:none}.gal-nav-text{flex:1}.gal-dot{display:inline-block;width:8px;height:8px;border-radius:9999px;flex-shrink:0;margin-top:5px;background:#d0d5dd}.gal-dot--flag{background:#f04438}.gal-dot--revised{background:#f79009}.gal-nav-empty{padding:4px;font-size:12px;line-height:18px;color:#667085}.gal-main{flex:1;min-width:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;padding:20px;display:flex;flex-direction:column;gap:16px}.gal-toolbar{display:flex;align-items:center;gap:10px;min-height:36px}.gal-pager{display:inline-flex;align-items:center;gap:4px;height:36px;padding:0 4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd}.gal-pager-btn{width:28px;height:28px;border:none;border-radius:6px;background:transparent;color:#344054;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-pager-btn:hover:not(:disabled){background:#f2f4f7;color:#1570ef}.gal-pager-btn:disabled{opacity:.35;cursor:default}.gal-pager-label{padding:0 6px;font-size:13px;color:#475467;white-space:nowrap}.gal-pager-label strong{font-weight:600;color:#101828}.status-pill{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.status-pill--warning{background:#fffaeb;color:#b54708}.export-wrap{position:relative}.gal-export{padding:0 16px;font-size:14px;font-weight:600;box-shadow:0 1px 2px #1018280d}.export-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:30;width:300px;max-height:min(520px,75vh);overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 24px -6px #10182829;display:flex;flex-direction:column;gap:2px;animation:gal-pop .12s cubic-bezier(.4,0,.2,1)}.export-item{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;border-radius:6px;background:transparent;font-family:inherit;text-align:left;cursor:pointer}.export-item:hover:not(:disabled){background:#f9fafb}.export-item:disabled{opacity:.45;cursor:not-allowed}.export-title{font-size:13px;font-weight:600;color:#101828}.export-meta{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.export-foot{padding:6px 12px 4px;border-top:1px solid #F2F4F7;margin-top:2px;font-size:11px;color:#98a2b3}.export-group{padding:8px 12px 4px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:#98a2b3}.export-group+.export-item{margin-top:0}.export-group:not(:first-child){margin-top:4px;border-top:1px solid #F2F4F7;padding-top:10px}.menu-backdrop{position:fixed;inset:0;z-index:20}.gal-skeleton{display:flex;flex-direction:column;gap:12px}.sk{border-radius:8px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.sk-logo{width:64px;height:64px;align-self:center}.sk-facts{height:116px}.sk-card{height:96px}.sk-card--short{height:64px;opacity:.6}.gal-state{padding:48px 24px;display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}.gal-state-icon{width:56px;height:56px;border-radius:9999px;background:#eff8ff;box-shadow:0 0 0 8px #f5faff;color:#1570ef;display:inline-flex;align-items:center;justify-content:center;margin-bottom:8px}.gal-state-icon--error{background:#fef3f2;box-shadow:0 0 0 8px #fffbfa;color:#d92d20}.gal-state-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.gal-state-sub{max-width:440px;font-size:14px;line-height:20px;color:#667085;margin-bottom:6px}.gal-state-sub strong{font-weight:600;color:#344054}.gal-brand{display:flex;justify-content:center}.gal-brand-box{width:64px;height:64px;padding:4px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;align-items:center;justify-content:center;overflow:hidden;font-size:11px;line-height:14px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;text-align:center;overflow-wrap:anywhere;color:#667085}.gal-brand-box img{max-width:100%;max-height:100%;object-fit:contain;display:block}.gal-facts{margin:0;display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:8px 32px;font-size:17px;line-height:28px}.gal-fact{display:grid;grid-template-columns:180px minmax(0,1fr);column-gap:8px;min-width:0}.gal-fact dt{font-weight:600;color:#101828;white-space:nowrap}.gal-fact dd{margin:0;min-width:0;color:#101828;overflow-wrap:anywhere}.gal-fact--side{grid-template-columns:180px minmax(0,1fr)}.gal-proof-link{display:inline-flex;align-items:center;gap:4px;margin-left:8px;padding:0;border:none;background:none;font-family:inherit;font-size:14px;font-weight:600;line-height:20px;color:#1570ef;cursor:pointer;vertical-align:middle}.gal-proof-link:hover{color:#175cd3}.gal-result{font-weight:600;color:#027a48}.gal-result.is-fail{color:#d92d20}.gal-answers{display:flex;flex-direction:column;gap:12px}.answerbox{position:relative;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px 20px;display:flex;flex-direction:column;gap:12px;background:#fff;animation:gal-rise .22s cubic-bezier(.4,0,.2,1) both;transition:box-shadow .15s cubic-bezier(.4,0,.2,1)}.answerbox.is-flagged:before{content:\"\";position:absolute;left:0;top:14px;bottom:14px;width:3px;border-radius:0 3px 3px 0;background:#f04438}.answerbox.is-editing{box-shadow:inset 0 0 0 1.5px #84caff,0 0 0 4px #eff8ff}.answerbox-head{display:flex;align-items:flex-start;gap:12px}.qtext{flex:1;min-width:0;font-size:18px;line-height:28px;font-weight:700;color:#101828}.qdesc{display:block;margin-top:2px;font-size:14px;line-height:20px;font-weight:400;color:#667085}.qsection{display:block;margin-bottom:2px;font-size:12px;line-height:18px;font-weight:500;color:#667085}.gal-tag{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:16px;font-weight:600;flex-shrink:0;white-space:nowrap}.gal-tag--warning{color:#b54708;background:#fffaeb}.gal-tag--error{color:#d92d20;background:#fef3f2}.gal-tag--gray{color:#475467;background:#f2f4f7}.scorechip{background:#f2f4f7;border-radius:6px;padding:2px 8px;font-size:12px;line-height:18px;font-weight:500;color:#344054;flex-shrink:0;white-space:nowrap;font-variant-numeric:tabular-nums}.editicon{width:28px;height:28px;flex-shrink:0;margin-top:-4px;border:none;border-radius:6px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),color .15s cubic-bezier(.4,0,.2,1)}.editicon:hover{background:#f2f4f7;color:#1570ef}.editicon.is-locked{color:#d0d5dd;cursor:not-allowed}.editicon.is-locked:hover{background:transparent;color:#98a2b3}.answerbox-body{display:flex;flex-direction:column;gap:4px}.answertext{font-size:16px;line-height:24px;font-style:italic;color:#1d2939}.answertext--strong{font-weight:600;color:#101828}.answertext.is-flag{color:#d92d20}.prooftext{font-size:16px;line-height:24px;color:#344054}.prooftext.is-flag{color:#d92d20}.remarktext{margin-top:6px;font-size:18px;line-height:28px;font-style:italic;color:#475467;white-space:pre-line}.gal-split{display:flex;flex-direction:column;gap:4px}.gal-split.is-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:24px;align-items:start}.gal-split-main,.gal-split-side{min-width:0;display:flex;flex-direction:column;gap:4px}.gal-split-side .gal-block-title{font-style:italic}@media (max-width: 900px){.gal-split.is-split{grid-template-columns:minmax(0,1fr);gap:8px}}.gal-block{display:flex;flex-direction:column;gap:8px;margin:8px 0 4px}.gal-block-title{font-size:16px;line-height:24px;font-weight:500;color:#101828}.gal-grid{display:grid;gap:10px;grid-auto-rows:220px;max-height:460px;overflow-y:auto;scrollbar-width:thin}.gal-grid.is-one{grid-template-columns:minmax(0,1fr);grid-auto-rows:400px}.gal-grid.is-two{grid-template-columns:repeat(2,minmax(0,1fr))}.gal-grid.is-tall{grid-auto-rows:400px}.gal-grid.is-three{grid-template-columns:repeat(3,minmax(0,1fr))}.gal-tile-wrap{position:relative;margin:0;min-height:0;display:flex;flex-direction:column;gap:4px}.gal-tile-wrap figcaption{flex:0 0 auto;display:flex;flex-direction:column;gap:2px;font-size:12px;line-height:16px;color:#475467;text-align:center;overflow-wrap:anywhere}.gal-tile-wrap figcaption:empty{display:none}.gal-tile{flex:1 1 auto;min-height:0;width:100%;height:100%;padding:0;border:none;border-radius:8px;overflow:hidden;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;cursor:zoom-in;display:block}.gal-tile img{width:100%;height:100%;object-fit:contain;display:block}.gal-tile:hover{box-shadow:inset 0 0 0 1px #d0d5dd,0 4px 10px -2px #1018281f}.gal-tile--video{background:#f9fafb;object-fit:contain;cursor:default}.gal-tile--missing{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:12px;color:#98a2b3;text-decoration:none;cursor:pointer}.gal-tile--missing:hover{color:#667085}.gal-upload-time{font-size:11px;color:#667085}.gal-detect{position:absolute;top:8px;left:8px;padding:2px 10px;border-radius:16px;font-size:12px;line-height:18px;font-weight:500;color:#027a48;background:#ecfdf3;pointer-events:none}.gal-detect.is-bad{color:#b42318;background:#fef3f2}.gal-ai{display:flex;flex-direction:column;gap:2px;margin-top:4px;font-size:16px;line-height:24px;color:#1d2939}.gal-viewer{position:fixed;inset:0;z-index:1100;display:flex;align-items:center;justify-content:center;padding:24px;background:#101828b8}.gal-viewer-box{width:min(1000px,100%);max-height:100%;display:flex;flex-direction:column;border-radius:12px;background:#fff;box-shadow:0 20px 24px -4px #1018282e;overflow:hidden}.gal-viewer-box--md{width:min(520px,100%)}.gal-viewer-head{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid #EAECF0}.gal-viewer-title{flex:1;min-width:0;font-size:16px;line-height:24px;font-weight:600;color:#101828}.gal-viewer-close{width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.gal-viewer-close:hover{background:#f2f4f7;color:#344054}.gal-viewer-stage{position:relative;display:flex;align-items:center;justify-content:center;min-height:0;padding:12px 56px;background:#f9fafb}.gal-viewer-stage img{max-width:100%;max-height:calc(100vh - 160px);object-fit:contain;display:block}.gal-viewer-nav{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;font-size:26px;line-height:1;color:#344054;cursor:pointer}.gal-viewer-nav--prev{left:8px}.gal-viewer-nav--next{right:8px}.gal-viewer-nav:disabled{opacity:.35;cursor:default}.gal-proof-body{display:flex;flex-direction:column;gap:10px;padding:16px}.gal-proof-img{width:100%;height:350px;object-fit:contain;border-radius:8px;background:#f9fafb}.gal-proof-name{font-size:16px;line-height:24px;color:#101828}.revision{display:flex;flex-direction:column;gap:10px}.rev-block{min-width:0;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:6px}.rev-block--revised{background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89}.rev-head{display:flex;align-items:center;gap:8px}.rev-label{font-size:11px;line-height:16px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#667085}.rev-label--warning{padding:2px 8px;border-radius:9999px;background:#fffaeb;color:#dc6803}.rev-reason-label{font-size:12px;line-height:18px;color:#475467}.rev-reason{border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;padding:10px 12px;font-size:13px;line-height:18px;color:#1570ef}.editpanel{border-radius:8px;background:#fcfcfd;box-shadow:inset 0 0 0 1px #eaecf0;padding:16px;display:flex;flex-direction:column;gap:12px;animation:gal-rise .16s cubic-bezier(.4,0,.2,1) both}.edit-title{font-size:12px;line-height:18px;font-weight:600;color:#475467}.edit-title .req{color:#f04438}.edit-options{display:flex;flex-direction:column;gap:8px}.edit-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;text-align:left;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1),box-shadow .15s cubic-bezier(.4,0,.2,1)}.edit-option:hover{box-shadow:inset 0 0 0 1px #d0d5dd}.edit-option.is-on{background:#eff8ff;box-shadow:inset 0 0 0 1px #84caff}.edit-option.is-on .edit-option-label{font-weight:600;color:#101828}.edit-option.is-on .edit-radio{background:#1570ef;box-shadow:none}.edit-radio{width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1.5px #d0d5dd;color:#fff;display:inline-flex;align-items:center;justify-content:center}.edit-option-label{flex:1;min-width:0;font-size:14px;line-height:20px;color:#344054}.edit-option-flag{font-size:11px;font-weight:600;color:#d92d20}.edit-option-score{font-size:12px;color:#667085;white-space:nowrap}.edit-option-actual{font-size:11px;font-weight:500;color:#667085;background:#f2f4f7;border-radius:9999px;padding:2px 8px;white-space:nowrap;flex-shrink:0}.edit-reason{display:flex;flex-direction:column;gap:6px}.edit-input{height:40px;padding:0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#344054;outline:none}.edit-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.edit-select{display:block}.edit-hint{font-size:12px;color:#667085}.edit-actions{display:flex;justify-content:flex-end;gap:8px}.gal-nomatch{padding:20px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px;color:#667085;text-align:center}.gal-nomatch .av2-link{border:none;background:none;padding:0;font-family:inherit}.gal-approve-bar{position:sticky;bottom:0;z-index:10;background:#fff;box-shadow:0 -4px 10px #0000000a,inset 0 0 0 1px #eaecf0;border-radius:8px;padding:12px 24px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}.approve-status{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:#475467}.approve-status strong{font-weight:600;color:#1d2939}.approve-dot{width:8px;height:8px;border-radius:9999px;background:#d0d5dd}.approve-dot--success{background:#12b76a}.approve-dot--warning{background:#f79009}.approve-warn{font-size:12px;color:#b54708}.gal-approve{height:40px;padding:0 20px;background:#1570ef;color:#fff;box-shadow:0 1px 2px #1018280d}.gal-approve:hover:not(:disabled){background:#175cd3}.gal-approve--confirm{background:#039855}.gal-approve--confirm:hover:not(:disabled){background:#027a48}@keyframes gal-rise{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes gal-pop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.answerbox,.editpanel,.export-menu,.sk{animation:none}}@media (max-width: 1200px){.gal-facts{grid-template-columns:minmax(0,1fr)}.gal-fact--side dt{min-width:130px}}@media (max-width: 900px){.gal-body{flex-direction:column;align-items:stretch}.gal-left{width:100%}.gal-left-inner{position:static;max-height:none}.gal-main{padding:16px}.gal-fact dt,.gal-fact--side dt{min-width:110px}}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:760px;max-width:94vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.countpill{min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eff8ff;color:#175cd3;font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{width:270px;flex-shrink:0;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow:auto;padding:8px;scrollbar-width:thin;scrollbar-color:#D0D5DD transparent}.drawer-nav::-webkit-scrollbar{width:6px}.drawer-nav::-webkit-scrollbar-thumb{border-radius:3px;background:#d0d5dd}.drawer-group{display:flex;flex-direction:column;gap:2px;padding-bottom:10px}.grouplabel{padding:10px 12px 6px;font-size:11px;line-height:16px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#667085}.drawer-navitem{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column}.navtitle{font-size:13px;line-height:18px;font-weight:600;color:#1d2939}.navvalue{font-size:12px;line-height:18px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#175cd3}.dirtydot{width:7px;height:7px;border-radius:9999px;background:#1570ef;flex-shrink:0}.navchev{color:#98a2b3;flex-shrink:0}.drawer-pane{flex:1;min-width:0;display:flex;flex-direction:column}.pane-head{padding:16px 20px 10px;display:flex;flex-direction:column;gap:4px}.panetitle{font-size:15px;line-height:22px;font-weight:700;color:#101828}.panehint{font-size:12px;line-height:18px;color:#667085}.pane-scroll{flex:1;overflow:auto}.pane-fields{padding:6px 20px 16px;display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap}.pane-fields--date{flex-direction:column;align-items:flex-start;align-content:flex-start}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:12px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eff8ff;color:#1570ef;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eff8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.gal-range-readout{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fcfcfd;font-size:14px;font-weight:600;color:#101828}.gal-range-readout svg{color:#667085}.gal-inline-picker{max-width:100%}:host ::ng-deep .gal-inline-picker .md-drppicker.inline{margin-top:0;box-shadow:inset 0 0 0 1px #eaecf0}.field{display:flex;flex-direction:column;gap:6px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-box{display:flex;align-items:center;gap:6px;height:40px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff}.field-box input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.field-box.field-box--num{width:120px}.field-box:focus-within{box-shadow:inset 0 0 0 1px #84caff,0 0 0 4px #eff8ff}.field-unit{font-size:14px;color:#667085}.field-sep{height:40px;display:flex;align-items:center;color:#98a2b3;font-size:14px}.score-readout{height:40px;display:inline-flex;align-items:center;padding:0 12px;border-radius:8px;background:#eff8ff;color:#175cd3;font-size:13px;font-weight:700;white-space:nowrap}.pane-list{padding:0 12px 16px;display:flex;flex-direction:column;gap:2px}.panesearch{display:flex;align-items:center;gap:8px;height:38px;margin:0 0 8px;padding:0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;flex-shrink:0}.panesearch input{flex:1;min-width:0;height:36px;border:none;outline:none;background:transparent;font-family:inherit;font-size:13px;color:#101828}.panesearch input::placeholder{color:#98a2b3}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;cursor:pointer;font-family:inherit}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eff8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-multi{border-radius:5px}.optionmark.mark-on{background:#1570ef;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.nomatch{padding:18px 12px;font-size:13px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #101828;--bs-tooltip-color: #fff;--bs-tooltip-max-width: 260px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#101828!important;color:#fff!important;padding:8px 12px;border-radius:8px;font-size:12px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}\n"] }]
|
|
1814
|
+
}], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i0.ChangeDetectorRef }, { type: i3.ActivatedRoute }, { type: i4.ToastService }, { type: i4.AuthService }, { type: i5.NgbModal }], propDecorators: { onViewerKey: [{
|
|
1815
|
+
type: HostListener,
|
|
1816
|
+
args: ['document:keydown', ['$event']]
|
|
1817
|
+
}] } });
|
|
1818
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2dhbGxlcnkvYXVkaXQtdjItZ2FsbGVyeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2dhbGxlcnkvYXVkaXQtdjItZ2FsbGVyeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlGLE9BQU8sRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBcUIsYUFBYSxFQUFlLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSWhKLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7Ozs7Ozs7O0FBb0t2RixtRkFBbUY7QUFDbkYsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBRXJCLG9FQUFvRTtBQUNwRSxNQUFNLFlBQVksR0FBbUI7SUFDbkMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtJQUMxQyxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxL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QUFXLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFTLEVBQUUsQ0FBa0I7UUFDckMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWEsQ0FBQyxDQUFTLEVBQUUsR0FBaUI7UUFDeEMsT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxDQUFTLEVBQUUsR0FBYztRQUNsQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUFTLEVBQUUsQ0FBb0I7UUFDMUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7d0dBcHREVSx1QkFBdUI7NEZBQXZCLHVCQUF1QixnSUM3T3BDLGkxMUNBcXJCQTs7NEZEeGNhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7MFBBbTNCaEMsV0FBVztzQkFEVixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIG9mLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBdWRpdEFjY2VzcywgYXVkaXRBY2Nlc3MgfSBmcm9tICcuLi9hdWRpdC12Mi1hY2Nlc3MnO1xyXG5pbXBvcnQgeyBJbmxpbmVQaWNrZXJSYW5nZSwgUElDS0VSX0xPQ0FMRSwgUGlja2VkRGF0ZXMsIGZyb21QaWNrZXJSYW5nZSwgaW5saW5lUGlja2VyVG9kYXksIHRvSW5saW5lUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXhwb3J0R2FsbGVyeUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2V4cG9ydC1nYWxsZXJ5L2V4cG9ydC1nYWxsZXJ5LmNvbXBvbmVudCc7XHJcblxyXG4vKiogQSBxdWVzdGlvbiBpbiB0aGUgbGVmdCBwYW5lbCwgZnJvbSAvYXVkaXQvZ2FsbGVyeS9xdWVzdGlvbnMuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRRdWVzdGlvbiB7XHJcbiAgLyoqIHNlY3Rpb24gKyBxdWVzdGlvbiB0ZXh0OyBxbm8gaXMgbm90IHVuaXF1ZSBhY3Jvc3Mgc2VjdGlvbnMuICovXHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgcW5vOiBzdHJpbmc7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIHNlY3Rpb246IHN0cmluZztcclxuICAvKiogU2VudCB3aXRoIHRoZSBzZWxlY3RlZCBxdWVzdGlvbnMgdG8gdGhlIGRvd25sb2FkIHNlcnZpY2UgKGFzIHRoZSB2MSBnYWxsZXJ5IGRvZXMpLiAqL1xyXG4gIGFuc3dlclR5cGU6IHN0cmluZztcclxufVxyXG5cclxuLyoqIE9uZSBsZWZ0LXBhbmVsIGFjY29yZGlvbiBncm91cC4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpdFNlY3Rpb24ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBxdWVzdGlvbnM6IEF1ZGl0UXVlc3Rpb25bXTtcclxufVxyXG5cclxuLyoqIEEgY29uZmlndXJlZCBvcHRpb24gb2YgYSBzaW5nbGUtY2hvaWNlIHF1ZXN0aW9uIC0gd2hhdCBhbiBlZGl0IGNhbiBzd2l0Y2ggdGhlIGFuc3dlciB0by4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBbnN3ZXJPcHRpb24ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoqIG51bGwgZm9yIGEgcXVlc3Rpb24gd2l0aG91dCBjb21wbGlhbmNlIHNjb3JpbmcuICovXHJcbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XHJcbiAgZmxhZzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEEgcGhvdG8gb3IgdmlkZW8gY2FwdHVyZWQgd2l0aCBhbiBhbnN3ZXIuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQW5zd2VyTWVkaWEge1xyXG4gIHNyYzogc3RyaW5nO1xyXG4gIHZpZGVvOiBib29sZWFuO1xyXG4gIC8qKiBQZXItaW1hZ2UgZGVzY3JpcHRpb24gKENhcHR1cmUgTXVsdGlwbGUgSW1hZ2UsIFwiZGVzY3JpcHRpb24gcGVyIGltYWdlXCIpOyAnJyB3aGVuIG5vbmUuICovXHJcbiAgY2FwdGlvbjogc3RyaW5nO1xyXG4gIC8qKiBcIllZWVktTU0tREQgaGg6bW0gQU1cIiByZWFkIGZyb20gdGhlIHVwbG9hZCBrZXkgKHYxIGdldFVwbG9hZFRpbWUpOyAnJyB3aGVuIHRoZSBrZXkgaGFzIG5vIHRpbWUuICovXHJcbiAgdXBsb2FkZWQ6IHN0cmluZztcclxuICAvKiogUnVuIEFJIGRldGVjdGlvbiBvZiB0aGlzIGNhcHR1cmU6ICdtYXRjaGVkJyAvICdub3RtYXRjaGVkJywgJycgd2hlbiBub25lIHdhcyBydW4uICovXHJcbiAgZGV0ZWN0aW9uOiAnJyB8ICdtYXRjaGVkJyB8ICdub3RtYXRjaGVkJztcclxufVxyXG5cclxuLyoqIEEgUnVuIEFJIHJlc3VsdCBsaW5lIChcIkVtcGxveWVlIENvdW50IDogMDNcIiksIGFzIHRoZSB2MSBnYWxsZXJ5IGxpc3RzIHRoZW0gdW5kZXIgdGhlIGFuc3dlci4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBBaVJlc3VsdCB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogT25lIGFuc3dlcmVkIHF1ZXN0aW9uIG9mIHRoZSBzdWJtaXNzaW9uIG9uIHRoZSByaWdodCwgZnJvbSAvYXVkaXQvZ2FsbGVyeS9hbnN3ZXJzLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFuc3dlclJvdyB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgc2VjdGlvbjogc3RyaW5nO1xyXG4gIHFubzogc3RyaW5nO1xyXG4gIHRleHQ6IHN0cmluZztcclxuICBhbnN3ZXJUeXBlOiBzdHJpbmc7XHJcbiAgLyoqIEdyZXkgbGluZSB1bmRlciB0aGUgcXVlc3Rpb24gKHFkZXNjcmlwdGlvbiwgbWludXMgdGhlIGxlZ2FjeSBhdXRvLXRhc2sgY29weSkuICovXHJcbiAgZGVzY3JpcHRpb246IHN0cmluZztcclxuICAvKiogUXVlc3Rpb24tbGV2ZWwgcmVmZXJlbmNlIGltYWdlcyAobXVsdGlRdWVzdGlvblJlZmVyZW5jZUltYWdlW10uaW1hZ2VVUkwsIGVsc2UgcXVlc3Rpb25SZWZlcmVuY2VJbWFnZSkuICovXHJcbiAgcXVlc3Rpb25SZWZzOiBzdHJpbmdbXTtcclxuICAvKiogUmVmZXJlbmNlIGltYWdlcyBvZiB0aGUgY2hvc2VuIG9wdGlvbnMgKGNob2ljZSB0eXBlcykgb3Igb2YgdGhlIGNhcHR1cmUgKGltYWdlIC8gdmlkZW8gdHlwZXMpLiAqL1xyXG4gIG9wdGlvblJlZnM6IHN0cmluZ1tdO1xyXG4gIGFuc3dlcnM6IHN0cmluZ1tdO1xyXG4gIC8qKiBcIiVcIiAvIFwiwrBDXCIgYWZ0ZXIgYSBsaW5lYXIgc2NhbGUgYW5zd2VyOyAnJyBvdGhlcndpc2UuICovXHJcbiAgdW5pdDogc3RyaW5nO1xyXG4gIC8qKiBUaGUgYW5zd2VyJ3Mgb3duIGNhcHR1cmVzIChVcGxvYWRlZCBJbWFnZSAvIFZpZGVvKS4gKi9cclxuICBtZWRpYTogQW5zd2VyTWVkaWFbXTtcclxuICAvKiogVmFsaWRhdGlvbiBwcm9vZiB0aGUgY2hvc2VuIG9wdGlvbiBhc2tlZCBmb3IgKENhcHR1cmUgSW1hZ2UgLyBWaWRlbyAvIE11bHRpcGxlIEltYWdlKS4gKi9cclxuICBwcm9vZjogQW5zd2VyTWVkaWFbXTtcclxuICAvKiogRXZlcnkgcGhvdG8gLyB2aWRlbyBvZiB0aGUgYW5zd2VyIGFuZCBpdHMgcHJvb2YgKEV4Y2VsIGV4cG9ydCkuICovXHJcbiAgaW1hZ2VzOiBzdHJpbmdbXTtcclxuICB2aWRlb3M6IHN0cmluZ1tdO1xyXG4gIC8qKiBUZXh0IHR5cGVkIGFzIHZhbGlkYXRpb24gcHJvb2Ygb2YgdGhlIGNob3NlbiBhbnN3ZXIgKGpvaW5lZCwgZm9yIHRoZSBFeGNlbCBleHBvcnQpLiAqL1xyXG4gIHZhbGlkYXRpb25UZXh0OiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBzYW1lIHZhbGlkYXRpb24gYW5zd2VycyBvbmUgYnkgb25lLCBhcyB0aGUgcGFnZSBsaXN0cyB0aGVtLiAqL1xyXG4gIHZhbGlkYXRpb25UZXh0czogc3RyaW5nW107XHJcbiAgLyoqIFJ1biBBSSByZXN1bHQgbGluZXMgb2YgdGhlIGZpcnN0IGFuc3dlciAoZGV0ZWN0aW9uIHN0YXR1cyBleGNsdWRlZCksIG9yIHRoZSBFbXBsb3llZSBDb3VudCBmYWxsYmFjay4gKi9cclxuICBhaVJlc3VsdHM6IEFpUmVzdWx0W107XHJcbiAgcmVtYXJrOiBzdHJpbmc7XHJcbiAgLyoqIFNlY29uZCByZW1hcmsgZmllbGQgKHN0b3JlTWFuYWdlclJlbWFyaykuICovXHJcbiAgZXh0cmFSZW1hcms6IHN0cmluZztcclxuICAvKiogU2NvcmUgb2YgdGhlIHN1Ym1pdHRlZCBhbnN3ZXI7IG51bGwgZm9yIGEgcXVlc3Rpb24gd2l0aG91dCBjb21wbGlhbmNlIHNjb3JpbmcuICovXHJcbiAgYWN0dWFsU2NvcmU6IG51bWJlciB8IG51bGw7XHJcbiAgLyoqIFNjb3JlIGluIGZvcmNlIC0gdGhlIHJldmlzaW9uJ3Mgd2hlbiB0aGVyZSBpcyBvbmUuICovXHJcbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XHJcbiAgLyoqIFRoZSBhbnN3ZXIgaW4gZm9yY2UgY2FycmllcyBhbiBTT1AgZmxhZyAtIHRoZSBzYW1lIGZsYWcgdGhlIGF1ZGl0IGRhc2hib2FyZCBzY29yZXMgb24uICovXHJcbiAgZmxhZ2dlZDogYm9vbGVhbjtcclxuICByZWRvOiBib29sZWFuO1xyXG4gIC8qKiBTZXQgb25jZSBhIHJldmlld2VyIChvciBhbiBhcHByb3ZlZCBkaXNwdXRlKSBjaGFuZ2VkIHRoZSBzdWJtaXR0ZWQgYW5zd2VyLiAqL1xyXG4gIHJldmlzZWQ6IHsgYW5zd2VyOiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nOyBzY29yZTogbnVtYmVyIHwgbnVsbDsgYnk6IHN0cmluZyB9IHwgbnVsbDtcclxuICBvcHRpb25zOiBBbnN3ZXJPcHRpb25bXTtcclxuICAvKiogU2luZ2xlLWNob2ljZSB3aXRoIGNvbmZpZ3VyZWQgb3B0aW9ucywgc28gYSByZXZpZXdlciBjYW4gcmV2aXNlIGl0LiAqL1xyXG4gIGVkaXRhYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogSGVhZGVyIGZhY3RzIG9mIHRoZSBzdWJtaXNzaW9uIG9uIHRoZSByaWdodC4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXNzaW9uRGV0YWlsIHtcclxuICAvKiogcHJvY2Vzc2VkY2hlY2tsaXN0IGlkIC0gd2hhdCByZXZpc2UgLyBhcHByb3ZlIGFjdCBvbi4gKi9cclxuICBzdWJtaXNzaW9uSWQ6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgc3RvcmVOYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFwiU3RhdGUsIENvdW50cnlcIiBvZiB0aGUgc3RvcmUuICovXHJcbiAgcmVnaW9uOiBzdHJpbmc7XHJcbiAgYXVkaXROYW1lOiBzdHJpbmc7XHJcbiAgc3VidGl0bGU6IHN0cmluZztcclxuICBxdWVzdGlvbkNvdW50OiBudW1iZXI7XHJcbiAgLyoqIEZsYWdnZWQgYW5zd2VycyBhZnRlciByZXZpc2lvbnMuICovXHJcbiAgcXVlc3Rpb25GbGFnOiBudW1iZXI7XHJcbiAgLyoqIEEgcXVlc3Rpb24gaGFzIFwiQ29uZmlndXJlIENvbXBsaWFuY2UgU2NvcmVcIiBvbjsgd2l0aG91dCBvbmUgdGhlIHN1Ym1pc3Npb24gaGFzIG5vIENvbXBsaWFuY2UgU2NvcmUuICovXHJcbiAgY29tcGxpYW5jZUVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogQ29tcGxpYW5jZSBTY29yZSAoMC0xMDApIGZyb20gdGhlIEFQSTogY29tcGxpYW5jZSBwb2ludHMgKG9wdGlvbiBzY29yZXMpIG9mIHRoZSBxdWVzdGlvbnMgd2l0aCBDb25maWd1cmVcclxuICAgKiBDb21wbGlhbmNlIFNjb3JlIG9uLCBhZnRlciByZXZpc2lvbnMgLSB0aGUgc2FtZSBydWxlIGFzIHRoZSBhdWRpdCBkYXNoYm9hcmQuIG51bGwgPSBub25lIHNlbnQuXHJcbiAgICovXHJcbiAgY29tcGxpYW5jZVNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIHN1Ym1pdHRlZEJ5OiBzdHJpbmc7XHJcbiAgZW1haWw6IHN0cmluZztcclxuICBkdXJhdGlvbjogc3RyaW5nO1xyXG4gIGRhdGU6IHN0cmluZztcclxuICAvKiogWVlZWS1NTS1ERCBvZiB0aGUgc3VibWlzc2lvbi4gKi9cclxuICBkYXRlSXNvOiBzdHJpbmc7XHJcbiAgdGltZTogc3RyaW5nO1xyXG4gIHN0YXR1czogc3RyaW5nO1xyXG4gIGFwcHJvdmFsRW5hYmxlOiBib29sZWFuO1xyXG4gIGFwcHJvdmFsU3RhdHVzOiBib29sZWFuO1xyXG4gIGFwcHJvdmVkQnk6IHN0cmluZztcclxuICBhcHByb3ZlZEF0OiBzdHJpbmc7XHJcbiAgLyoqIE5hbWUgdHlwZWQgdG8gYWNrbm93bGVkZ2UgdGhlIHN1Ym1pc3Npb24gKHVzZXJTaWduYXR1cmUpOyAnJyB3aGVuIG5vbmUuICovXHJcbiAgYWNrbm93bGVkZ2VkQnk6IHN0cmluZztcclxuICAvKiogUGhvdG8gY2FwdHVyZWQgd2l0aCB0aGUgYWNrbm93bGVkZ2VtZW50ICh1c2VySW1hZ2UpIGFzIGEgVVJMOyAnJyB3aGVuIG5vbmUuICovXHJcbiAgcHJvb2ZJbWFnZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlck9wdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBtZXRhPzogc3RyaW5nO1xyXG4gIC8qKiBXaGF0IGlzIHN0b3JlZCBhbmQgc2VudCB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgbGFiZWwgKHN0b3JlIGlkLCBhdWRpdCBpZCwgYW5zd2VyIHR5cGUgY29kZSkuICovXHJcbiAgdmFsdWU/OiBzdHJpbmc7XHJcbiAgLyoqIFByZXNlbnQgb24gYSBcInNlbGVjdCBhbGxcIiBvcHRpb247IGhvbGRzIGV2ZXJ5IHZhbHVlIGl0IHN0YW5kcyBmb3IuICovXHJcbiAgYWxsT2Y/OiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJEZWYge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBoaW50OiBzdHJpbmc7XHJcbiAgb3B0aW9uczogRmlsdGVyT3B0aW9uW107XHJcbiAgbXVsdGk6IGJvb2xlYW47XHJcbiAgLyoqIERhdGUgYW5kIHNjb3JlIHBhbmVzIHJlbmRlciB0aGVpciBvd24gY29udHJvbHMuICovXHJcbiAga2luZDogJ2xpc3QnIHwgJ2RhdGUnIHwgJ3Njb3JlJztcclxuICAvKiogRHJhd2VyIGdyb3VwaW5nLiAqL1xyXG4gIGdyb3VwOiAncHJpbWFyeScgfCAnc2Vjb25kYXJ5JztcclxuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcclxuICBoaWRlPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEF1ZGl0IHJvd3MgYXMgL2F1ZGl0L2xpc3QgcmV0dXJucyB0aGVtLiAqL1xyXG5pbnRlcmZhY2UgQXVkaXRPcHRpb24ge1xyXG4gIF9pZDogc3RyaW5nO1xyXG4gIGNoZWNrTGlzdE5hbWU6IHN0cmluZztcclxuICBjaGVja0xpc3REZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBjaGVja0xpc3RUeXBlPzogc3RyaW5nO1xyXG4gIGNvdmVyYWdlPzogc3RyaW5nO1xyXG4gIHBhc3NNYXJrPzogbnVtYmVyIHwgbnVsbDtcclxuICAvKiogU3VibWlzc2lvbnMgaW4gdGhlIGhlYWRlciBwZXJpb2QuICovXHJcbiAgdmlzaXRzPzogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogUGFzcyBtYXJrIHdoZW4gYW4gYXVkaXQgaGFzIG5vbmUgY29uZmlndXJlZCAtIHRoZSBhdWRpdCBkYXNoYm9hcmQncyBkZWZhdWx0LiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuXHJcbi8qKiBEcmF3ZXIgbGFiZWxzIGFuZCB0aGUgYW5zd2VyVHlwZSBjb2RlcyB0aGUgZ2FsbGVyeSBBUEkgdGFrZXMuICovXHJcbmNvbnN0IEFOU1dFUl9UWVBFUzogRmlsdGVyT3B0aW9uW10gPSBbXHJcbiAgeyBsYWJlbDogJ0FsbCBBbnN3ZXIgVHlwZScsIHZhbHVlOiAnYWxsJyB9LFxyXG4gIHsgbGFiZWw6ICdEZXNjcmlwdGl2ZSBBbnN3ZXInLCB2YWx1ZTogJ2Rlc2NyaXB0aXZlJyB9LFxyXG4gIHsgbGFiZWw6ICdBL0IgUXVlc3Rpb24nLCB2YWx1ZTogJ3llcy9ubycgfSxcclxuICB7IGxhYmVsOiAnTXVsdGlwbGUgQ2hvaWNlIFF1ZXN0aW9uIC0gU2luZ2xlIEFuc3dlcicsIHZhbHVlOiAnbXVsdGlwbGVjaG9pY2VzaW5nbGUnIH0sXHJcbiAgeyBsYWJlbDogJ011bHRpcGxlIENob2ljZSBRdWVzdGlvbiAtIE11bHRpcGxlIEFuc3dlcicsIHZhbHVlOiAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZScgfSxcclxuICB7IGxhYmVsOiAnQ2FwdHVyZSBJbWFnZSBhcyBhbnN3ZXInLCB2YWx1ZTogJ2ltYWdlJyB9LFxyXG4gIHsgbGFiZWw6ICdDYXB0dXJlIEltYWdlIHdpdGggRGVzY3JpcHRpb24nLCB2YWx1ZTogJ2Rlc2NyaXB0aXZlSW1hZ2UnIH0sXHJcbiAgeyBsYWJlbDogJ0NhcHR1cmUgdmlkZW8gYXMgYW5zd2VyJywgdmFsdWU6ICd2aWRlbycgfSxcclxuICB7IGxhYmVsOiAnQ2FwdHVyZSBNdWx0aXBsZSBJbWFnZScsIHZhbHVlOiAnbXVsdGlwbGVJbWFnZScgfSxcclxuICB7IGxhYmVsOiAnRGF0ZSBBcyBBbnN3ZXInLCB2YWx1ZTogJ2RhdGUnIH0sXHJcbiAgeyBsYWJlbDogJ1RpbWUgQXMgQW5zd2VyJywgdmFsdWU6ICd0aW1lJyB9LFxyXG4gIHsgbGFiZWw6ICdMaW5lYXIgU2NhbGUnLCB2YWx1ZTogJ2xpbmVhcnNjYWxlJyB9LFxyXG4gIHsgbGFiZWw6ICdEcm9wZG93biBhcyBhbiBhbnN3ZXInLCB2YWx1ZTogJ2Ryb3Bkb3duJyB9LFxyXG4gIHsgbGFiZWw6ICdDYXB0dXJlIEltYWdlL1ZpZGVvIGFzIEFuc3dlcicsIHZhbHVlOiAnaW1hZ2UvdmlkZW8nIH1cclxuXTtcclxuXHJcbmNvbnN0IEFQUFJPVkVfRklMVEVSOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnQWxsJzogJ2FsbCcsICdBcHByb3ZlZCc6ICdBcHByb3ZlZCcsICdOb3QtQXBwcm92ZWQnOiAnbm90YXBwcm92ZWQnIH07XHJcblxyXG4vKiogQW5zd2VyIHR5cGVzIHdob3NlIGFuc3dlciBpcyBhIG1lZGlhIHBhdGggcmF0aGVyIHRoYW4gdGV4dC4gKi9cclxuY29uc3QgSU1BR0VfVFlQRVMgPSBbJ2ltYWdlJywgJ2Rlc2NyaXB0aXZlSW1hZ2UnLCAnbXVsdGlwbGVJbWFnZSddO1xyXG5jb25zdCBWSURFT19UWVBFUyA9IFsndmlkZW8nXTtcclxuY29uc3QgVklERU9fRklMRSA9IC9cXC4obXA0fHdlYm18bW92fG9nZ3xtNHZ8YXZpfHdtdikkL2k7XHJcbi8qKiBPcHRpb24gcXVlc3Rpb25zOiB0aGVpciByZWZlcmVuY2UgaW1hZ2VzIHNpdCBvbiBlYWNoIGNob3NlbiB1c2VyQW5zd2VyICh2MSBnYWxsZXJ5KS4gKi9cclxuY29uc3QgQ0hPSUNFX1RZUEVTID0gWydkcm9wZG93bicsICd5ZXMvbm8nLCAnbXVsdGlwbGVjaG9pY2VzaW5nbGUnLCAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZSddO1xyXG5cclxuLyoqIFJldmlzaW9ucyBhcmUgb25lIGNvbmZpZ3VyZWQgb3B0aW9uLCBzbyBvbmx5IHNpbmdsZS1jaG9pY2UgYW5zd2VycyBjYW4gYmUgZWRpdGVkIChhcyB0aGUgQVBJIGVuZm9yY2VzKS4gKi9cclxuY29uc3QgUkVWSVNBQkxFX1RZUEVTID0gWyd5ZXMvbm8nLCAnbXVsdGlwbGVjaG9pY2VzaW5nbGUnLCAnZHJvcGRvd24nXTtcclxuXHJcbi8qKiBcIlJlYXNvbiBmb3IgY2hhbmdlXCIgY2hvaWNlcywgZnJvbSB0aGUgcHJvdG90eXBlJ3MgZWRpdCBmbG93LiAqL1xyXG5jb25zdCBDSEFOR0VfUkVBU09OUyA9IFtcclxuICAnSW5jb3JyZWN0IFJlc3BvbnNlIFN1Ym1pdHRlZCBCeSBUaGUgQXVkaXRvcicsXHJcbiAgJ0V2aWRlbmNlIERvZXMgTm90IFN1cHBvcnQgVGhlIEFuc3dlcicsXHJcbiAgJ0NvcnJlY3RlZCBBZnRlciBSZS1WZXJpZmljYXRpb24gV2l0aCBTdG9yZScsXHJcbiAgJ090aGVyJ1xyXG5dO1xyXG5cclxuLyoqIEV4cG9ydCBwYWdlcyB0aHJvdWdoIHRoZSBhbnN3ZXJzIEFQSSB0aGlzIG1hbnkgc3VibWlzc2lvbnMgYXQgYSB0aW1lLCB1cCB0byBFWFBPUlRfTUFYLiAqL1xyXG4vKiogdXNlckVtYWlsIGZpbHRlciB2YWx1ZSBubyByZWFsIHVzZXIgaGFzIChzZWUgcmVzb2x2ZVNjb3BlKS4gKi9cclxuY29uc3QgTk9fTUFUQ0hfRU1BSUwgPSAnbm8tdGVhbS11c2VyQGludmFsaWQnO1xyXG5jb25zdCBFWFBPUlRfUEFHRSA9IDEwMDtcclxuY29uc3QgRVhQT1JUX01BWCA9IDMwMDA7XHJcblxyXG5jb25zdCBERUZBVUxUUyA9IHtcclxuICB0eXBlOiAnQXVkaXQnLFxyXG4gIGFuc3dlcjogJ0FsbCBBbnN3ZXIgVHlwZScsXHJcbiAgc2NvcGU6ICdDbHVzdGVycycsXHJcbiAgc3RhdHVzOiAnQWxsJyxcclxuICByZXN1bHQ6ICdBbGwnLFxyXG4gIHNjb3JlTWluOiAwLFxyXG4gIHNjb3JlTWF4OiAxMDBcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWF1ZGl0LXYyLWdhbGxlcnknLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1nYWxsZXJ5LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItZ2FsbGVyeS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGl0VjJHYWxsZXJ5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBMZWZ0IHBhbmVsLCBmcm9tIHRoZSBxdWVzdGlvbnMgQVBJLiAqL1xyXG4gIHF1ZXN0aW9uU2VjdGlvbnM6IEF1ZGl0U2VjdGlvbltdID0gW107XHJcbiAgLyoqIFN1Ym1pc3Npb24gb24gdGhlIHJpZ2h0LCBmcm9tIHRoZSBhbnN3ZXJzIEFQSS4gKi9cclxuICByb3dzOiBBbnN3ZXJSb3dbXSA9IFtdO1xyXG5cclxuICAvKiogSW5kZXggb2YgdGhlIGV4cGFuZGVkIGxlZnQtcGFuZWwgc2VjdGlvbjsgbnVsbCA9IGFsbCBjb2xsYXBzZWQuIEZpcnN0IG9wZW4gYnkgZGVmYXVsdC4gKi9cclxuICBvcGVuU2VjdGlvbjogbnVtYmVyIHwgbnVsbCA9IDA7XHJcblxyXG4gIC8qKiBRdWVzdGlvbiBrZXlzIHRpY2tlZCBpbiB0aGUgbGVmdCBwYW5lbDsgZW1wdHkgPSBzaG93IGV2ZXJ5IGFuc3dlci4gKi9cclxuICBzZWxlY3RlZElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogRHJhd2VyIHN0YXRlLiAqL1xyXG4gIGZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgYWN0aXZlRmlsdGVyID0gJ3R5cGUnO1xyXG4gIG9wdGlvblF1ZXJ5ID0gJyc7XHJcblxyXG4gIC8qKiBGaWx0ZXIgdmFsdWVzLiBmU3RvcmVzIGhvbGRzIHN0b3JlIGlkcywgZkNsdXN0ZXJzIGhvbGRzIGNsdXN0ZXIgb3IgdGVhbSBuYW1lcy4gKi9cclxuICBmU3RhcnQgPSAnJztcclxuICBmRW5kID0gJyc7XHJcbiAgLyoqIERyYXdlcidzIGlubGluZSByYW5nZSBwaWNrZXIgZGF0ZXMgZm9yIGZTdGFydCAvIGZFbmQ7IHNldCB3aGVuIHRoZSBkcmF3ZXIgb3BlbnMgb3IgaXMgY2xlYXJlZC4gKi9cclxuICBmUmFuZ2U6IElubGluZVBpY2tlclJhbmdlIHwgbnVsbCA9IG51bGw7XHJcbiAgcmVhZG9ubHkgcGlja2VyTG9jYWxlID0gUElDS0VSX0xPQ0FMRTtcclxuICByZWFkb25seSB0b2RheSA9IGlubGluZVBpY2tlclRvZGF5KCk7XHJcbiAgZlR5cGUgPSBERUZBVUxUUy50eXBlO1xyXG4gIGZBdWRpdElkID0gJyc7XHJcbiAgZk5hbWUgPSAnJztcclxuICBmQW5zd2VyID0gREVGQVVMVFMuYW5zd2VyO1xyXG4gIGZTY29wZSA9IERFRkFVTFRTLnNjb3BlO1xyXG4gIGZDbHVzdGVyczogc3RyaW5nW10gPSBbXTtcclxuICBmU3RvcmVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZTdGF0dXMgPSBERUZBVUxUUy5zdGF0dXM7XHJcbiAgZlJlc3VsdCA9IERFRkFVTFRTLnJlc3VsdDtcclxuICBmRmxhZ3M6IHN0cmluZ1tdID0gW107XHJcbiAgZlNjb3JlTWluID0gREVGQVVMVFMuc2NvcmVNaW47XHJcbiAgZlNjb3JlTWF4ID0gREVGQVVMVFMuc2NvcmVNYXg7XHJcblxyXG4gIC8qKiBGaWx0ZXIgc291cmNlcy4gKi9cclxuICBhdWRpdHM6IEF1ZGl0T3B0aW9uW10gPSBbXTtcclxuICBzdG9yZU9wdGlvbnM6IEFycmF5PHsgc3RvcmVJZDogc3RyaW5nOyBzdG9yZU5hbWU6IHN0cmluZyB9PiA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyB3aXRoIHN1Ym1pc3Npb25zIG9mIHRoZSBjaG9zZW4gYXVkaXQgaW4gdGhlIGNob3NlbiBkYXRlcyAoYXMgdGhlIHYxIGdhbGxlcnkncyBzdG9yZXNEZXRhaWxzKTpcclxuICAgKiB0aGUgU3RvcmVzIGZpbHRlciBvZmZlcnMgb25seSB0aGVzZS4gbnVsbCA9IG5vIGF1ZGl0IGNob3NlbiB5ZXQsIG9yIG5vdCBsb2FkZWQ6IGV2ZXJ5IHN0b3JlLlxyXG4gICAqL1xyXG4gIGF1ZGl0U3RvcmVJZHM6IFNldDxzdHJpbmc+IHwgbnVsbCA9IG51bGw7XHJcbiAgYXVkaXRTdG9yZXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgLyoqIEF1ZGl0IGFuZCBkYXRlcyBhdWRpdFN0b3JlSWRzIHdhcyBsb2FkZWQgZm9yLiAqL1xyXG4gIHByaXZhdGUgYXVkaXRTdG9yZXNLZXkgPSAnJztcclxuICBjbHVzdGVyTmFtZXM6IHN0cmluZ1tdID0gW107XHJcbiAgdGVhbU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKiogU3VibWlzc2lvbiBzaG93biBvbiB0aGUgcmlnaHQuICovXHJcbiAgZGV0YWlsOiBTdWJtaXNzaW9uRGV0YWlsID0gdGhpcy5lbXB0eURldGFpbCgpO1xyXG5cclxuICAvKiogUGFnaW5nOiBvbmUgc3VibWlzc2lvbiBwZXIgcGFnZSwgcGFnZUluZGV4IGlzIDAtYmFzZWQgYXMgdGhlIGFuc3dlcnMgQVBJIHJlYWRzIG9mZnNldC4gKi9cclxuICBwYWdlSW5kZXggPSAwO1xyXG4gIHRvdGFsID0gMDtcclxuXHJcbiAgLyoqIFN0YXJ0IHRydWU6IHRoZSBmaWx0ZXIgc291cmNlcyBsb2FkIGJlZm9yZSB0aGUgZmlyc3QgYW5zd2VycyBwYWdlLCBhbmQgdGhhdCB3YWl0IHNoaW1tZXJzIHRvby4gKi9cclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuICAvKiogUXVlc3Rpb24gbmF2aWdhdGlvbiBpcyBpbiBmbGlnaHQgKHNvdXJjZXMsIHRoZW4gdGhlIHF1ZXN0aW9ucyBjYWxsKS4gKi9cclxuICBuYXZMb2FkaW5nID0gdHJ1ZTtcclxuICBsb2FkRXJyb3IgPSAnJztcclxuXHJcbiAgLyoqIFBhc3MgbWFyayBhbmQgZWRpdCBwZXJtaXNzaW9uIG9mIHRoZSBhdWRpdCBpbiB2aWV3LCBzZW50IHdpdGggZXZlcnkgYW5zd2VycyBwYWdlLiAqL1xyXG4gIHBhc3NNYXJrOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBhY2Nlc3MgPSB7IGNhbkVkaXQ6IGZhbHNlLCByZWFzb246ICcnIH07XHJcbiAgLyoqIENsaWVudC1sZXZlbCBvdXRjb21lIC8gcmVtYXJrIGxhYmVscyAoTWFuYWdlID4gU2V0dGluZ3MgPiBUcmF4IENvbmZpZ3VyYXRpb24pLiAqL1xyXG4gIGxhYmVscyA9IHsgcGFzczogJ1Bhc3MnLCBmYWlsOiAnRmFpbCcsIHJlbWFya3M6ICdSZW1hcmtzJywgYWRkaXRpb25hbDogJ0FkZGl0aW9uYWwgUmVtYXJrcycgfTtcclxuXHJcbiAgLyoqIENsaWVudCBicmFuZCBzaG93biBhYm92ZSB0aGUgc3VibWlzc2lvbiBmYWN0cy4gKi9cclxuICBjbGllbnRMb2dvID0gJyc7XHJcbiAgY2xpZW50TmFtZSA9ICcnO1xyXG4gIGxvZ29GYWlsZWQgPSBmYWxzZTtcclxuICAvKiogTWVkaWEgVVJMcyB0aGF0IGZhaWxlZCB0byBsb2FkLCBzaG93biBhcyBhbiBcInVuYXZhaWxhYmxlXCIgdGlsZSBpbnN0ZWFkIG9mIGEgYnJva2VuIGltYWdlLiAqL1xyXG4gIGJyb2tlbk1lZGlhID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBBbnN3ZXIgZWRpdCAob25lIHF1ZXN0aW9uIGF0IGEgdGltZSkuICovXHJcbiAgcmVhZG9ubHkgY2hhbmdlUmVhc29ucyA9IENIQU5HRV9SRUFTT05TO1xyXG4gIC8qKiBSZWFzb24gZm9yIGNoYW5nZSBkcm9wZG93biAobGliLWF1ZGl0LXYyLXNlbGVjdCkuICovXHJcbiAgcmVhZG9ubHkgcmVhc29uT3B0aW9ucyA9IENIQU5HRV9SRUFTT05TLm1hcChyID0+ICh7IHZhbHVlOiByLCBsYWJlbDogciB9KSk7XHJcbiAgZWRpdEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgZHJhZnRBbnN3ZXIgPSAnJztcclxuICBkcmFmdFJlYXNvbiA9ICcnO1xyXG4gIGRyYWZ0T3RoZXIgPSAnJztcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuXHJcbiAgLyoqIEFwcHJvdmUgYmFyOiBhIHNlY29uZCBjbGljayBjb25maXJtcywgc2luY2UgYXBwcm92YWwgY2xvc2VzIGVkaXRpbmcuICovXHJcbiAgYXBwcm92ZUNvbmZpcm0gPSBmYWxzZTtcclxuICBhcHByb3ZpbmcgPSBmYWxzZTtcclxuXHJcbiAgZXhwb3J0T3BlbiA9IGZhbHNlO1xyXG4gIC8qKiBFeGNlbCBncm91cCAoVGhpcyBzdWJtaXNzaW9uIC8gQWxsIHN1Ym1pc3Npb25zKSBpbiB0aGUgRXhwb3J0IG1lbnU7IGhpZGRlbiBmb3Igbm93LCBzZXQgdHJ1ZSB0byBicmluZyBpdCBiYWNrLiAqL1xyXG4gIHJlYWRvbmx5IHNob3dFeGNlbEV4cG9ydCA9IGZhbHNlO1xyXG4gIGV4cG9ydGluZyA9IGZhbHNlO1xyXG5cclxuICAvKiogU25hcHNob3QgdGFrZW4gd2hlbiB0aGUgZHJhd2VyIG9wZW5zLCByZXN0b3JlZCBvbiBjYW5jZWwuICovXHJcbiAgcHJpdmF0ZSBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBoZWFkZXJEYXRhOiBhbnk7XHJcbiAgcHJpdmF0ZSBoZWFkZXJTdGFydCA9ICcnO1xyXG4gIHByaXZhdGUgaGVhZGVyRW5kID0gJyc7XHJcbiAgcHJpdmF0ZSBhbnN3ZXJDZG4gPSAnJztcclxuICBwcml2YXRlIHJ1bkFpQ2RuID0gJyc7XHJcbiAgLyoqIFJhdyByZWNvcmQgb24gdGhlIHJpZ2h0LCBmb3IgdGhlIHNpbmdsZS1zdWJtaXNzaW9uIGV4cG9ydC4gKi9cclxuICBwcml2YXRlIHJlY29yZDogYW55ID0gbnVsbDtcclxuICAvKiogU2NvcGUgc2VudCB3aXRoIGV2ZXJ5IGFuc3dlcnMgcGFnZSwgZml4ZWQgd2hlbiBmaWx0ZXJzIGFyZSBhcHBsaWVkLiAqL1xyXG4gIHByaXZhdGUgc2NvcGVQYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgLyoqIERyb3BzIHJlc3BvbnNlcyBmcm9tIGEgbG9hZCB0aGF0IGEgbmV3ZXIgb25lIHJlcGxhY2VkLiAqL1xyXG4gIHByaXZhdGUgbG9hZFNlcSA9IDA7XHJcbiAgLyoqID9hdWRpdD0mc3RvcmU9JmRhdGU9JnN0YXR1cz0gZnJvbSBBY3Rpb24gQ2VudGVyIChWaWV3IC8gYXBwcm92YWwgY2FyZHMpOyBhcHBsaWVkIG9uY2Ugb24gdGhlIGZpcnN0IGxvYWQuICovXHJcbiAgcHJpdmF0ZSBkZWVwTGluazogeyBhdWRpdDogc3RyaW5nOyBzdG9yZTogc3RyaW5nOyBkYXRlOiBzdHJpbmc7IGZyb206IHN0cmluZzsgdG86IHN0cmluZzsgZmxhZzogYm9vbGVhbjsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xyXG4gIC8qKiBBdWRpdCBpZCBmcm9tIHRoYXQgbGluaywgdW50aWwgdGhlIGF1ZGl0IGxpc3QgY29uZmlybXMgaXQ7IGFuIHVua25vd24gaWQgaXMgbm90IHN3YXBwZWQgZm9yIGFub3RoZXIgYXVkaXQuICovXHJcbiAgcHJpdmF0ZSBsaW5rZWRBdWRpdElkID0gJyc7XHJcbiAgLyoqIFRoZSBsaW5rZWQgaWQgaXMgbm90IG9uZSBvZiB0aGlzIGNsaWVudCdzIGxpdmUgYXVkaXRzIChkZWxldGVkLCBvciBub3QgYW4gYXVkaXQpLiAqL1xyXG4gIGxpbmtNaXNzaW5nID0gZmFsc2U7XHJcbiAgLyoqIEFwcHJvdmUgbmVlZHMgdGhlIENoZWNrbGlzdCBlZGl0IHBlcm1pc3Npb24gKFBPU1QgL3RyYXgvYXVkaXQvZ2FsbGVyeS9hcHByb3ZlIGNoZWNrcyBpdCB0b28pLiBBbnN3ZXIgZWRpdGluZ1xyXG4gICAqICBmb2xsb3dzIHRoZSBzZXJ2ZXIncyBvd24gYGFjY2Vzc2AgYmVsb3cuICovXHJcbiAgbWVudUFjY2VzczogQXVkaXRBY2Nlc3MgPSB7IGNhbkFkZDogZmFsc2UsIGNhbkVkaXQ6IGZhbHNlIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0cmF4U2VydmljZTogVHJheFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWw6IE5nYk1vZGFsXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBhdWRpdEFjY2Vzcyh0aGlzLmdzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFjY2VzcyA9PiB7XHJcbiAgICAgIHRoaXMubWVudUFjY2VzcyA9IGFjY2VzcztcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHFwID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwO1xyXG4gICAgaWYgKHFwLmdldCgnYXVkaXQnKSkge1xyXG4gICAgICB0aGlzLmRlZXBMaW5rID0ge1xyXG4gICAgICAgIGF1ZGl0OiBxcC5nZXQoJ2F1ZGl0JykgfHwgJycsIHN0b3JlOiBxcC5nZXQoJ3N0b3JlJykgfHwgJycsIGRhdGU6IHFwLmdldCgnZGF0ZScpIHx8ICcnLFxyXG4gICAgICAgIGZyb206IHFwLmdldCgnZnJvbScpIHx8ICcnLCB0bzogcXAuZ2V0KCd0bycpIHx8ICcnLFxyXG4gICAgICAgIC8vIEZsYWdzIC0+IFZpZXc6IG9ubHkgZmxhZ2dlZCBzdWJtaXNzaW9ucy5cclxuICAgICAgICBmbGFnOiBxcC5nZXQoJ2ZsYWcnKSA9PT0gJzEnLFxyXG4gICAgICAgIC8vIEFjdGlvbiBDZW50ZXIgYXBwcm92YWwgY2FyZHM6IE9wZW4gLT4gTm90LUFwcHJvdmVkLCBBcHByb3ZlZCAtPiBBcHByb3ZlZC5cclxuICAgICAgICBzdGF0dXM6IEFQUFJPVkVfRklMVEVSW3FwLmdldCgnc3RhdHVzJykgfHwgJyddID8gKHFwLmdldCgnc3RhdHVzJykgfHwgJycpIDogJydcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZW52OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5hbnN3ZXJDZG4gPSBlbnY/LlRyYXhBbnN3ZXJDRE4gfHwgJyc7XHJcbiAgICAgIHRoaXMucnVuQWlDZG4gPSBlbnY/LnRyYXhSdW5BaUNETiB8fCB0aGlzLmFuc3dlckNkbjtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWRhdGE/LmNsaWVudCkgeyByZXR1cm47IH1cclxuICAgICAgICBjb25zdCBjbGllbnRDaGFuZ2VkID0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQgIT09IGRhdGEuY2xpZW50O1xyXG4gICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJTdGFydCA9IGRhdGEuZGF0ZT8uc3RhcnREYXRlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMuaGVhZGVyRW5kID0gZGF0YS5kYXRlPy5lbmREYXRlIHx8IHRoaXMuaGVhZGVyU3RhcnQ7XHJcbiAgICAgICAgdGhpcy5mU3RhcnQgPSB0aGlzLmhlYWRlclN0YXJ0O1xyXG4gICAgICAgIHRoaXMuZkVuZCA9IHRoaXMuaGVhZGVyRW5kO1xyXG4gICAgICAgIGlmIChjbGllbnRDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLmZDbHVzdGVycyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5mU3RvcmVzID0gW107XHJcbiAgICAgICAgICB0aGlzLmxvYWRMYWJlbHMoKTtcclxuICAgICAgICAgIHRoaXMubG9hZENsaWVudCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBcnJpdmluZyBmcm9tIEFjdGlvbiBDZW50ZXIgKGF1ZGl0IC8gc3RvcmUgLyBkYXkpIG9yIE1hbmFnZSAoYXVkaXQsIHNjaGVkdWxlIGRhdGUgcmFuZ2UpXHJcbiAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgaGVhZGVyIHJhbmdlLlxyXG4gICAgICAgIGlmICh0aGlzLmRlZXBMaW5rKSB7XHJcbiAgICAgICAgICB0aGlzLmZBdWRpdElkID0gdGhpcy5kZWVwTGluay5hdWRpdDtcclxuICAgICAgICAgIHRoaXMubGlua2VkQXVkaXRJZCA9IHRoaXMuZGVlcExpbmsuYXVkaXQ7XHJcbiAgICAgICAgICBpZiAodGhpcy5kZWVwTGluay5zdG9yZSkgeyB0aGlzLmZTdG9yZXMgPSBbdGhpcy5kZWVwTGluay5zdG9yZV07IH1cclxuICAgICAgICAgIGlmICh0aGlzLmRlZXBMaW5rLmRhdGUpIHsgdGhpcy5mU3RhcnQgPSB0aGlzLmRlZXBMaW5rLmRhdGU7IHRoaXMuZkVuZCA9IHRoaXMuZGVlcExpbmsuZGF0ZTsgfVxyXG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5kZWVwTGluay5mcm9tKSB7IHRoaXMuZlN0YXJ0ID0gdGhpcy5kZWVwTGluay5mcm9tOyB0aGlzLmZFbmQgPSB0aGlzLmRlZXBMaW5rLnRvIHx8IHRoaXMuZGVlcExpbmsuZnJvbTsgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuZGVlcExpbmsuZmxhZyAmJiAhdGhpcy5mRmxhZ3MuaW5jbHVkZXMoJ0ZsYWcnKSkgeyB0aGlzLmZGbGFncyA9IFsuLi50aGlzLmZGbGFncywgJ0ZsYWcnXTsgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuZGVlcExpbmsuc3RhdHVzKSB7IHRoaXMuZlN0YXR1cyA9IHRoaXMuZGVlcExpbmsuc3RhdHVzOyB9XHJcbiAgICAgICAgICB0aGlzLmRlZXBMaW5rID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkU291cmNlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBOZXZlciBsZWF2ZSB0aGUgcGFnZSBzY3JvbGwgbG9ja2VkIGlmIHRoZSByb3V0ZSBjaGFuZ2VzIHdoaWxlIHRoZSBkcmF3ZXIgaXMgb3Blbi4gKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0UGFnZVNjcm9sbExvY2tlZChmYWxzZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkb2N1bWVudCBpcyB0aGUgYXBwJ3Mgc2Nyb2xsZXIsIHNvIHdoaWxlIHRoZSBkcmF3ZXIgaXMgb3BlbiBsb2NrIDxib2R5Pi5cclxuICAgKiBPdGhlcndpc2UgdGhlIHBhZ2Ugc2Nyb2xscyBiZWhpbmQgdGhlIGJhY2tkcm9wIGFuZCBpdHMgc2Nyb2xsYmFyIHN0b3BzIHRoZVxyXG4gICAqIGZpeGVkIGRyYXdlciBzaG9ydCBvZiB0aGUgdmlld3BvcnQncyByaWdodCBlZGdlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0UGFnZVNjcm9sbExvY2tlZChsb2NrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBsb2NrZWQgPyAnaGlkZGVuJyA6ICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgY2xpZW50SWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudDtcclxuICB9XHJcblxyXG4gIC8qKiBQYXNzIC8gRmFpbCBhbmQgcmVtYXJrIGxhYmVscyBmcm9tIFRyYXggQ29uZmlndXJhdGlvbjsgZGVmYXVsdHMgd2hlbiB1bnNldC4gKi9cclxuICBwcml2YXRlIGxvYWRMYWJlbHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U2V0dGluZ3NHZXQodGhpcy5jbGllbnRJZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBkID0gcmVzPy5jb2RlID09PSAyMDAgPyByZXMuZGF0YSA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYWJlbHMgPSB7XHJcbiAgICAgICAgICBwYXNzOiBkPy5wYXNzTGFiZWwgfHwgJ1Bhc3MnLFxyXG4gICAgICAgICAgZmFpbDogZD8uZmFpbExhYmVsIHx8ICdGYWlsJyxcclxuICAgICAgICAgIHJlbWFya3M6IGQ/LnJlbWFya3NMYWJlbCB8fCAnUmVtYXJrcycsXHJcbiAgICAgICAgICBhZGRpdGlvbmFsOiBkPy5hZGRpdGlvbmFsUmVtYXJrc0xhYmVsIHx8ICdBZGRpdGlvbmFsIFJlbWFya3MnXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xpZW50IGxvZ28gYW5kIG5hbWUsIHRoZSBzYW1lIHJlY29yZCB0aGUgaGVhZGVyJ3MgY2xpZW50IGJhZGdlIHJlYWRzLiAqL1xyXG4gIHByaXZhdGUgbG9hZENsaWVudCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xpZW50TG9nbyA9ICcnO1xyXG4gICAgdGhpcy5jbGllbnROYW1lID0gJyc7XHJcbiAgICB0aGlzLmxvZ29GYWlsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuYXV0aC5nZXRDbGllbnRJbmZvKHRoaXMuY2xpZW50SWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2xpZW50ID0gcmVzPy5jb2RlID09PSAyMDAgPyByZXMuZGF0YT8ucmVzdWx0IDogbnVsbDtcclxuICAgICAgICB0aGlzLmNsaWVudExvZ28gPSBjbGllbnQ/LmxvZ28gfHwgJyc7XHJcbiAgICAgICAgdGhpcy5jbGllbnROYW1lID0gY2xpZW50Py5jbGllbnROYW1lIHx8ICcnO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEZpbHRlciBzb3VyY2VzOiBhdWRpdHMsIGNsdXN0ZXJzLCB0ZWFtcywgc3RvcmVzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBMb2FkcyBldmVyeSBkcmF3ZXIgbGlzdCwgdGhlbiB0aGUgZ2FsbGVyeSBmb3IgdGhlIGZpcnN0IChvciBzdGlsbCBzZWxlY3RlZCkgYXVkaXQuICovXHJcbiAgcHJpdmF0ZSBsb2FkU291cmNlcygpOiB2b2lkIHtcclxuICAgIC8vIGxvYWRHYWxsZXJ5ICh2aWEgYXBwbHlGaWx0ZXJzKSBhbHdheXMgcnVucyBuZXh0IGFuZCBjbGVhcnMgYm90aCBmbGFncy5cclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLm5hdkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3Qgc2FmZSA9IChvOiBPYnNlcnZhYmxlPGFueT4pID0+IG8ucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSk7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIGF1ZGl0czogdGhpcy5mZXRjaEF1ZGl0cygpLFxyXG4gICAgICBjbHVzdGVyczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmdldGNsdXN0ZXJzKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIGdyb3VwOiBbXSwgY2l0eTogW10gfSkpLFxyXG4gICAgICB0ZWFtczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmdldEFsbFRlYW1zKHRoaXMuY2xpZW50SWQpKVxyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoeyBhdWRpdHMsIGNsdXN0ZXJzLCB0ZWFtcyB9OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5hdWRpdHMgPSBhdWRpdHM7XHJcbiAgICAgIHRoaXMuY2x1c3Rlck5hbWVzID0gY2x1c3RlcnM/LmNvZGUgPT09IDIwMCA/IChjbHVzdGVycy5kYXRhPy5ncm91cERhdGEgfHwgW10pLm1hcCgoYzogYW55KSA9PiBjLmdyb3VwTmFtZSkuZmlsdGVyKEJvb2xlYW4pIDogW107XHJcbiAgICAgIHRoaXMudGVhbU5hbWVzID0gdGVhbXM/LmNvZGUgPT09IDIwMCA/ICh0ZWFtcy5kYXRhIHx8IFtdKS5tYXAoKHQ6IGFueSkgPT4gdC50ZWFtTmFtZSkuZmlsdGVyKEJvb2xlYW4pIDogW107XHJcblxyXG4gICAgICAvLyBLZWVwIHRoZSBhdWRpdCBpbiB2aWV3OyBvdGhlcndpc2Ugb3BlbiBvbiB0aGUgZmlyc3Qgb25lIHdpdGggc3VibWlzc2lvbnMgaW4gdGhlIHBlcmlvZC5cclxuICAgICAgLy8gQSBsaW5rZWQgYXVkaXQgdGhhdCBpcyBub3QgaW4gdGhlIGxpc3Qgc2hvd3MgXCJub3QgZm91bmRcIiByYXRoZXIgdGhhbiBhbm90aGVyIGF1ZGl0J3MgZGF0YS5cclxuICAgICAgY29uc3QgbGlua2VkID0gdGhpcy5saW5rZWRBdWRpdElkO1xyXG4gICAgICB0aGlzLmxpbmtlZEF1ZGl0SWQgPSAnJztcclxuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuYXVkaXRzLmZpbmQoYSA9PiBhLl9pZCA9PT0gdGhpcy5mQXVkaXRJZClcclxuICAgICAgICB8fCAobGlua2VkID8gdW5kZWZpbmVkIDogdGhpcy5hdWRpdHMuZmluZChhID0+IE51bWJlcihhLnZpc2l0cykgPiAwKSB8fCB0aGlzLmF1ZGl0c1swXSk7XHJcbiAgICAgIHRoaXMubGlua01pc3NpbmcgPSAhIWxpbmtlZCAmJiAhY3VycmVudDtcclxuICAgICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdEF1ZGl0KGN1cnJlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZkF1ZGl0SWQgPSAnJztcclxuICAgICAgICB0aGlzLmZOYW1lID0gJyc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5sb2FkQXVkaXRTdG9yZXMoKTtcclxuICAgICAgdGhpcy5sb2FkU3RvcmVzKCgpID0+IHRoaXMuYXBwbHlGaWx0ZXJzKCkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyB0aGUgc3RvcmVzIHRoZSBjaG9zZW4gYXVkaXQgaGFzIHN1Ym1pc3Npb25zIGF0IGluIHRoZSBjaG9zZW4gZGF0ZXMgKHRoZSBkcmF3ZXIncyBhdWRpdCBhbmRcclxuICAgKiBkYXRlcywgYmVmb3JlIEFwcGx5KS4gV2hpbGUgdGhlIGRyYXdlciBpcyBvcGVuLCBzdG9yZSBwaWNrcyB0aGF0IGFyZSBub3QgaW4gdGhlIG5ldyBsaXN0IGFyZSBkcm9wcGVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZEF1ZGl0U3RvcmVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuZlN0YXJ0O1xyXG4gICAgY29uc3QgdG8gPSB0aGlzLmZFbmQgJiYgdGhpcy5mRW5kID49IHRoaXMuZlN0YXJ0ID8gdGhpcy5mRW5kIDogdGhpcy5mU3RhcnQ7XHJcbiAgICBjb25zdCBrZXkgPSBbdGhpcy5mQXVkaXRJZCwgZnJvbSwgdG9dLmpvaW4oJ3wnKTtcclxuICAgIGlmIChrZXkgPT09IHRoaXMuYXVkaXRTdG9yZXNLZXkpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmF1ZGl0U3RvcmVzS2V5ID0ga2V5O1xyXG4gICAgaWYgKCF0aGlzLmZBdWRpdElkIHx8ICFmcm9tIHx8ICF0aGlzLmNsaWVudElkKSB7XHJcbiAgICAgIHRoaXMuYXVkaXRTdG9yZUlkcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuYXVkaXRTdG9yZXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYXVkaXRTdG9yZXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRHYWxsZXJ5U3RvcmVzKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIGNoZWNrbGlzdElkOiB0aGlzLmZBdWRpdElkLCBmcm9tRGF0ZTogZnJvbSwgdG9EYXRlOiB0byB9KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChrZXkgIT09IHRoaXMuYXVkaXRTdG9yZXNLZXkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgdGhpcy5hdWRpdFN0b3Jlc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyBBIGZhaWxlZCBjYWxsIGtlZXBzIGV2ZXJ5IHN0b3JlIHJhdGhlciB0aGFuIGFuIGVtcHR5IGxpc3QuXHJcbiAgICAgICAgdGhpcy5hdWRpdFN0b3JlSWRzID0gcmVzPy5jb2RlID09PSAyMDBcclxuICAgICAgICAgID8gbmV3IFNldDxzdHJpbmc+KChyZXMuZGF0YT8uc3RvcmVzIHx8IFtdKS5tYXAoKHM6IGFueSkgPT4gU3RyaW5nKHMuc3RvcmVJZCkpKVxyXG4gICAgICAgICAgOiAocmVzID09PSBudWxsID8gbnVsbCA6IG5ldyBTZXQ8c3RyaW5nPigpKTtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJzT3BlbiAmJiB0aGlzLmF1ZGl0U3RvcmVJZHMpIHtcclxuICAgICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuYXVkaXRTdG9yZUlkcztcclxuICAgICAgICAgIHRoaXMuZlN0b3JlcyA9IHRoaXMuZlN0b3Jlcy5maWx0ZXIoaWQgPT4gaWRzLmhhcyhpZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRoZSBTdG9yZXMgZmlsdGVyIGxpc3RzOiB0aGUgY2xpZW50J3Mgc3RvcmVzIGluIHNjb3BlLCBuYXJyb3dlZCB0byB0aGUgYXVkaXQncyBzdG9yZXMgb25jZSBrbm93bi4gKi9cclxuICBnZXQgZmlsdGVyU3RvcmVzKCk6IEFycmF5PHsgc3RvcmVJZDogc3RyaW5nOyBzdG9yZU5hbWU6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBpZHMgPSB0aGlzLmF1ZGl0U3RvcmVJZHM7XHJcbiAgICByZXR1cm4gaWRzID8gdGhpcy5zdG9yZU9wdGlvbnMuZmlsdGVyKHMgPT4gaWRzLmhhcyhzLnN0b3JlSWQpKSA6IHRoaXMuc3RvcmVPcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSB0aGUgb3B0aW9uIHBhbmUgaXMgZW1wdHkuICovXHJcbiAgZ2V0IG5vT3B0aW9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlRGVmLmlkID09PSAnc3RvcmVzJyAmJiAhdGhpcy5vcHRpb25RdWVyeS50cmltKCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXVkaXRTdG9yZXNMb2FkaW5nID8gJ0xvYWRpbmcgc3RvcmVz4oCmJyA6ICdObyBzdG9yZSBoYXMgYSBzdWJtaXNzaW9uIG9mIHRoaXMgYXVkaXQgaW4gdGhlIHNlbGVjdGVkIGRhdGVzLic7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ05vIG1hdGNoIGZvciB0aGlzIHNlYXJjaC4nO1xyXG4gIH1cclxuXHJcbiAgLyoqIEF1ZGl0cyBmb3IgdGhlIE5hbWUgZmlsdGVyOiB0aGUgY2xpZW50J3MgYXVkaXRzIG9ubHkgKFBPU1QgL3RyYXgvYXVkaXQvbGlzdCByZWFkcyBhdWRpdGNoZWNrbGlzdCkuICovXHJcbiAgcHJpdmF0ZSBmZXRjaEF1ZGl0cygpOiBPYnNlcnZhYmxlPEF1ZGl0T3B0aW9uW10+IHtcclxuICAgIHJldHVybiB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0TGlzdCh7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLCBmcm9tRGF0ZTogdGhpcy5oZWFkZXJTdGFydCwgdG9EYXRlOiB0aGlzLmhlYWRlckVuZCxcclxuICAgICAgbGltaXQ6IDUwMCwgb2Zmc2V0OiAxLCBzZWFyY2g6ICcnXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICBtYXAoKHJlczogYW55KSA9PiAocmVzPy5jb2RlID09PSAyMDAgPyByZXMuZGF0YT8ucmVzdWx0IHx8IFtdIDogW10pIGFzIEF1ZGl0T3B0aW9uW10pLFxyXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIEF1ZGl0T3B0aW9uW10pKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgZm9yIHRoZSBTdG9yZXMgZmlsdGVyLCBuYXJyb3dlZCB0byB0aGUgY2hvc2VuIGNsdXN0ZXJzOyBwcnVuZXMgcGlja3MgdGhhdCBmZWxsIG91dCBvZiBzY29wZS4gKi9cclxuICBwcml2YXRlIGxvYWRTdG9yZXMoZG9uZT86ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsdXN0ZXJzID0gdGhpcy5mU2NvcGUgPT09ICdDbHVzdGVycycgPyB0aGlzLmZDbHVzdGVycyA6IFtdO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5nZXRTdG9yZXNsaXN0KHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIGNsdXN0ZXJzLCBjaXR5OiBbXSB9KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGE/LnN0b3Jlc0RhdGEgfHwgW10pIDogW107XHJcbiAgICAgICAgY29uc3QgaWRzID0gbmV3IFNldCh0aGlzLnN0b3JlT3B0aW9ucy5tYXAocyA9PiBzLnN0b3JlSWQpKTtcclxuICAgICAgICB0aGlzLmZTdG9yZXMgPSB0aGlzLmZTdG9yZXMuZmlsdGVyKGlkID0+IGlkcy5oYXMoaWQpKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAoZG9uZSkgeyBkb25lKCk7IH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdEF1ZGl0KGF1ZGl0OiBBdWRpdE9wdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5saW5rTWlzc2luZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5mQXVkaXRJZCA9IGF1ZGl0Ll9pZDtcclxuICAgIHRoaXMuZk5hbWUgPSBhdWRpdC5jaGVja0xpc3ROYW1lO1xyXG4gICAgLy8gU3RvcmUtY292ZXJhZ2UgYXVkaXRzIGFyZSBzY29wZWQgYnkgc3RvcmVzLCB1c2VyLWNvdmVyYWdlIG9uZXMgYnkgdGVhbSB1c2Vycy5cclxuICAgIGNvbnN0IHNjb3BlID0gYXVkaXQuY292ZXJhZ2UgPT09ICd1c2VyJyA/ICdUZWFtcycgOiAnQ2x1c3RlcnMnO1xyXG4gICAgaWYgKHNjb3BlICE9PSB0aGlzLmZTY29wZSkge1xyXG4gICAgICB0aGlzLmZTY29wZSA9IHNjb3BlO1xyXG4gICAgICB0aGlzLmZDbHVzdGVycyA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQXVkaXQoKTogQXVkaXRPcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuYXVkaXRzLmZpbmQoYSA9PiBhLl9pZCA9PT0gdGhpcy5mQXVkaXRJZCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFzc1RocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgbWFyayA9IE51bWJlcih0aGlzLnBhc3NNYXJrID8/IHRoaXMuc2VsZWN0ZWRBdWRpdD8ucGFzc01hcmspO1xyXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShtYXJrKSAmJiBtYXJrID4gMCA/IG1hcmsgOiBQQVNTX01BUks7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBHYWxsZXJ5IGxvYWRcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIFRlYW1zIHNjb3BlIHNlbmRzIHRoZSB0ZWFtcycgdXNlcnM7IENsdXN0ZXJzIHNjb3BlIHNlbmRzIHN0b3JlIGlkcy4gKi9cclxuICBwcml2YXRlIHJlc29sdmVTY29wZSgpOiBPYnNlcnZhYmxlPHsgc3RvcmVJZDogc3RyaW5nW107IHVzZXJFbWFpbDogc3RyaW5nW10gfT4ge1xyXG4gICAgaWYgKHRoaXMuZlNjb3BlID09PSAnVGVhbXMnKSB7XHJcbiAgICAgIC8vIE5vIHRlYW0gcGlja2VkID0gZXZlcnkgc3VibWlzc2lvbiBvZiB0aGUgYXVkaXQuIEV4cGFuZGluZyB0byBcImFsbCB0ZWFtc1wiIHdvdWxkIGhpZGVcclxuICAgICAgLy8gYXVkaXRvcnMgd2hvIGFyZSBub3QgaW4gYW55IHRlYW0uXHJcbiAgICAgIGlmICghdGhpcy5mQ2x1c3RlcnMubGVuZ3RoKSB7IHJldHVybiBvZih7IHN0b3JlSWQ6IFtdLCB1c2VyRW1haWw6IFtdIH0pOyB9XHJcbiAgICAgIGNvbnN0IHRlYW1zID0gdGhpcy5mQ2x1c3RlcnM7XHJcbiAgICAgIHJldHVybiB0aGlzLnRyYXhTZXJ2aWNlLmdldHVzZXJzKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIHRlYW1zIH0pLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZW1haWxzID0gcmVzPy5jb2RlID09PSAyMDAgPyBbLi4ubmV3IFNldDxzdHJpbmc+KChyZXMuZGF0YSB8fCBbXSkubWFwKCh1OiBhbnkpID0+IHUudXNlckVtYWlsKS5maWx0ZXIoQm9vbGVhbikpXSA6IFtdO1xyXG4gICAgICAgICAgLy8gVGhlIEFQSSB0cmVhdHMgYW4gZW1wdHkgbGlzdCBhcyBcIm5vIGZpbHRlclwiLCBzbyBwaWNrZWQgdGVhbXMgd2l0aG91dCB1c2VycyBzZW5kIGFuXHJcbiAgICAgICAgICAvLyBlbWFpbCB0aGF0IG1hdGNoZXMgbm9ib2R5IChzaG93cyBcIk5vIHN1Ym1pc3Npb25zIGZvdW5kXCIsIG5vdCBldmVyeSBzdWJtaXNzaW9uKS5cclxuICAgICAgICAgIHJldHVybiB7IHN0b3JlSWQ6IFtdLCB1c2VyRW1haWw6IGVtYWlscy5sZW5ndGggPyBlbWFpbHMgOiBbTk9fTUFUQ0hfRU1BSUxdIH07XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7IHN0b3JlSWQ6IFtdLCB1c2VyRW1haWw6IFtOT19NQVRDSF9FTUFJTF0gfSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdG9yZUlkID0gdGhpcy5mU3RvcmVzLmxlbmd0aCA/IHRoaXMuZlN0b3JlcyA6IHRoaXMuc3RvcmVPcHRpb25zLm1hcChzID0+IHMuc3RvcmVJZCk7XHJcbiAgICByZXR1cm4gb2YoeyBzdG9yZUlkLCB1c2VyRW1haWw6IFtdIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkR2FsbGVyeSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGF1ZGl0ID0gdGhpcy5zZWxlY3RlZEF1ZGl0O1xyXG4gICAgY29uc3Qgc2VxID0gKyt0aGlzLmxvYWRTZXE7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XHJcbiAgICB0aGlzLnNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICB0aGlzLnBhc3NNYXJrID0gbnVsbDtcclxuICAgIGlmICghYXVkaXQgfHwgIXRoaXMuY2xpZW50SWQpIHtcclxuICAgICAgdGhpcy5zY29wZVBheWxvYWQgPSBudWxsO1xyXG4gICAgICB0aGlzLnF1ZXN0aW9uU2VjdGlvbnMgPSBbXTtcclxuICAgICAgdGhpcy50b3RhbCA9IDA7XHJcbiAgICAgIHRoaXMubmF2TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dTdWJtaXNzaW9uKG51bGwpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5uYXZMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZEVycm9yID0gJyc7XHJcbiAgICB0aGlzLnJlc29sdmVTY29wZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoc2NvcGUgPT4ge1xyXG4gICAgICBpZiAoc2VxICE9PSB0aGlzLmxvYWRTZXEpIHsgcmV0dXJuOyB9XHJcbiAgICAgIHRoaXMuc2NvcGVQYXlsb2FkID0ge1xyXG4gICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgIGZyb21EYXRlOiB0aGlzLmZTdGFydCxcclxuICAgICAgICB0b0RhdGU6IHRoaXMuZkVuZCB8fCB0aGlzLmZTdGFydCxcclxuICAgICAgICBDaGVja2xpc3RUeXBlOiBhdWRpdC5jaGVja0xpc3RUeXBlIHx8ICdjdXN0b20nLFxyXG4gICAgICAgIGNoZWNrbGlzdE5hbWU6IGF1ZGl0LmNoZWNrTGlzdE5hbWUsXHJcbiAgICAgICAgY2hlY2tsaXN0SWQ6IGF1ZGl0Ll9pZCxcclxuICAgICAgICBmaWx0ZXJ0eXBlOiB0aGlzLmZTY29wZSxcclxuICAgICAgICBzdG9yZUlkOiBzY29wZS5zdG9yZUlkLFxyXG4gICAgICAgIHVzZXJFbWFpbDogc2NvcGUudXNlckVtYWlsLFxyXG4gICAgICAgIGFuc3dlclR5cGU6IEFOU1dFUl9UWVBFUy5maW5kKGEgPT4gYS5sYWJlbCA9PT0gdGhpcy5mQW5zd2VyKT8udmFsdWUgfHwgJ2FsbCcsXHJcbiAgICAgICAgdmlld0ZsYWc6IHRoaXMuZkZsYWdzLmluY2x1ZGVzKCdGbGFnJyksXHJcbiAgICAgICAgdmlld1JlZG86IHRoaXMuZkZsYWdzLmluY2x1ZGVzKCdSZS1kbycpLFxyXG4gICAgICAgIGZpbHRlcjogJycsXHJcbiAgICAgICAgYXBwcm92ZUZpbHRlcjogQVBQUk9WRV9GSUxURVJbdGhpcy5mU3RhdHVzXSB8fCAnYWxsJ1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0R2FsbGVyeVF1ZXN0aW9ucyh7IC4uLnRoaXMuc2NvcGVQYXlsb2FkLCBxdWVzdGlvbnM6ICcnIH0pXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHNlcSAhPT0gdGhpcy5sb2FkU2VxKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgdGhpcy5uYXZMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uU2VjdGlvbnMgPSB0aGlzLnRvU2VjdGlvbnMocmVzPy5jb2RlID09PSAyMDAgPyByZXMuZGF0YT8uY2hlY2tsaXN0UXVlc3Rpb25zIDogW10pO1xyXG4gICAgICAgICAgdGhpcy5vcGVuU2VjdGlvbiA9IHRoaXMucXVlc3Rpb25TZWN0aW9ucy5sZW5ndGggPyAwIDogbnVsbDtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB0aGlzLmxvYWRQYWdlKHNlcSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW5zd2Vyc1JlcXVlc3Qob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJheFNlcnZpY2UuYXVkaXRHYWxsZXJ5QW5zd2Vycyh7XHJcbiAgICAgIC4uLnRoaXMuc2NvcGVQYXlsb2FkLFxyXG4gICAgICBzb3VyY2VDaGVja0xpc3RfaWQ6IHRoaXMuc2NvcGVQYXlsb2FkPy5bJ2NoZWNrbGlzdElkJ10sXHJcbiAgICAgIHF1ZXN0aW9uczogW10sXHJcbiAgICAgIG9mZnNldCxcclxuICAgICAgbGltaXRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZldGNoZXMgdGhlIHN1Ym1pc3Npb24gYXQgcGFnZUluZGV4LiAqL1xyXG4gIHByaXZhdGUgbG9hZFBhZ2Uoc2VxID0gdGhpcy5sb2FkU2VxKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NvcGVQYXlsb2FkKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xyXG4gICAgdGhpcy5hcHByb3ZlQ29uZmlybSA9IGZhbHNlO1xyXG4gICAgdGhpcy5hbnN3ZXJzUmVxdWVzdCh0aGlzLnBhZ2VJbmRleCwgMSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzZXEgIT09IHRoaXMubG9hZFNlcSkgeyByZXR1cm47IH1cclxuICAgICAgICAvLyAyMDQgKG5vdGhpbmcgbWF0Y2hlZCkgYXJyaXZlcyBhcyBhbiBlbXB0eSBib2R5LlxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmNvZGUgPT09IDIwMCA/IHJlcy5kYXRhIDogbnVsbDtcclxuICAgICAgICB0aGlzLnRvdGFsID0gTnVtYmVyKGRhdGE/LnRvdGFsX2NvdW50KSB8fCAwO1xyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLnBhc3NNYXJrID0gdGhpcy5udW0oZGF0YS5wYXNzTWFyayk7XHJcbiAgICAgICAgICB0aGlzLmFjY2VzcyA9IHsgY2FuRWRpdDogISFkYXRhLmFjY2Vzcz8uY2FuRWRpdCwgcmVhc29uOiBkYXRhLmFjY2Vzcz8ucmVhc29uIHx8ICcnIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd1N1Ym1pc3Npb24oZGF0YT8uY2hlY2tsaXN0QW5zd2Vycz8uWzBdIHx8IG51bGwpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIGlmIChzZXEgIT09IHRoaXMubG9hZFNlcSkgeyByZXR1cm47IH1cclxuICAgICAgICB0aGlzLnRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLmxvYWRFcnJvciA9ICdDb3VsZCBub3QgbG9hZCB0aGUgZ2FsbGVyeS4gVHJ5IGFnYWluLic7XHJcbiAgICAgICAgdGhpcy5zaG93U3VibWlzc2lvbihudWxsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXRyeSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZEdhbGxlcnkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd1N1Ym1pc3Npb24ocmVjb3JkOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XHJcbiAgICBpZiAoIXJlY29yZCkge1xyXG4gICAgICB0aGlzLnJvd3MgPSBbXTtcclxuICAgICAgdGhpcy5kZXRhaWwgPSB0aGlzLmVtcHR5RGV0YWlsKCk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbmZvID0gcmVjb3JkLmNoZWNrbGlzdEluZm8gfHwge307XHJcbiAgICBjb25zdCBzdG9yZSA9IHJlY29yZC5zdG9yZVByb2ZpbGUgfHwge307XHJcbiAgICB0aGlzLnJvd3MgPSAocmVjb3JkLnF1ZXN0aW9uQW5zd2VyIHx8IFtdKS5mbGF0TWFwKChzZWN0aW9uOiBhbnkpID0+XHJcbiAgICAgIChzZWN0aW9uLnF1ZXN0aW9ucyB8fCBbXSkubWFwKChxOiBhbnkpID0+IHRoaXMudG9Sb3coc2VjdGlvbi5zZWN0aW9uTmFtZSwgcSkpKTtcclxuICAgIGNvbnN0IGZsYWdzID0gdGhpcy5udW0oaW5mby5xdWVzdGlvbkZsYWcpO1xyXG4gICAgdGhpcy5kZXRhaWwgPSB7XHJcbiAgICAgIHN1Ym1pc3Npb25JZDogU3RyaW5nKGluZm8uY2hlY2tsaXN0SWQgfHwgJycpLFxyXG4gICAgICBzdG9yZUlkOiBzdG9yZS5zdG9yZV9pZCB8fCAnJyxcclxuICAgICAgc3RvcmVOYW1lOiBzdG9yZS5zdG9yZU5hbWUgfHwgc3RvcmUuc3RvcmVfaWQgfHwgJ+KAlCcsXHJcbiAgICAgIHJlZ2lvbjogW3N0b3JlLnN0YXRlLCBzdG9yZS5Db3VudHJ5XS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKSB8fCAn4oCUJyxcclxuICAgICAgYXVkaXROYW1lOiBpbmZvLmNoZWNrbGlzdE5hbWUgfHwgdGhpcy5mTmFtZSxcclxuICAgICAgc3VidGl0bGU6IHRoaXMuc2VsZWN0ZWRBdWRpdD8uY2hlY2tMaXN0RGVzY3JpcHRpb24gfHwgJycsXHJcbiAgICAgIHF1ZXN0aW9uQ291bnQ6IE51bWJlcihpbmZvLm5vb2ZRdWVzdGlvbnMpIHx8IHRoaXMucm93cy5sZW5ndGgsXHJcbiAgICAgIHF1ZXN0aW9uRmxhZzogZmxhZ3MgPz8gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuZmxhZ2dlZCkubGVuZ3RoLFxyXG4gICAgICBjb21wbGlhbmNlRW5hYmxlZDogdGhpcy5jb21wbGlhbmNlT24ocmVjb3JkKSxcclxuICAgICAgY29tcGxpYW5jZVNjb3JlOiB0aGlzLm51bShpbmZvLmNvbXBsaWFuY2VTY29yZSksXHJcbiAgICAgIHN1Ym1pdHRlZEJ5OiBpbmZvLnN1Ym1pdHRlZEJ5IHx8IHN0b3JlLnVzZXJOYW1lIHx8ICfigJQnLFxyXG4gICAgICBlbWFpbDogaW5mby51c2VyRW1haWwgfHwgc3RvcmUudXNlckVtYWlsIHx8ICcnLFxyXG4gICAgICBkdXJhdGlvbjogaW5mby5kdXJhdGlvbiB8fCAn4oCUJyxcclxuICAgICAgZGF0ZTogU3RyaW5nKGluZm8uZGF0ZSB8fCAnJykudHJpbSgpIHx8ICfigJQnLFxyXG4gICAgICBkYXRlSXNvOiBpbmZvLmRhdGVfc3RyaW5nIHx8ICcnLFxyXG4gICAgICB0aW1lOiBpbmZvLnRpbWUgfHwgJ+KAlCcsXHJcbiAgICAgIHN0YXR1czogaW5mby5jaGVja2xpc3RTdGF0dXMgfHwgJ3N1Ym1pdCcsXHJcbiAgICAgIGFwcHJvdmFsRW5hYmxlOiAhIWluZm8uYXBwcm92YWxFbmFibGUsXHJcbiAgICAgIGFwcHJvdmFsU3RhdHVzOiAhIWluZm8uYXBwcm92YWxTdGF0dXMsXHJcbiAgICAgIGFwcHJvdmVkQnk6IGluZm8uYXBwcm92YWxCeU5hbWUgfHwgJycsXHJcbiAgICAgIGFwcHJvdmVkQXQ6IGluZm8uYXBwcm92YWxUaW1lX3N0cmluZyB8fCAnJyxcclxuICAgICAgYWNrbm93bGVkZ2VkQnk6IFN0cmluZyhpbmZvLnVzZXJTaWduYXR1cmUgfHwgJycpLnRyaW0oKSxcclxuICAgICAgcHJvb2ZJbWFnZTogdGhpcy5tZWRpYVVybChpbmZvLnVzZXJJbWFnZSwgdGhpcy5hbnN3ZXJDZG4pXHJcbiAgICB9O1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtcHR5RGV0YWlsKCk6IFN1Ym1pc3Npb25EZXRhaWwge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3VibWlzc2lvbklkOiAnJywgc3RvcmVJZDogJycsIHN0b3JlTmFtZTogJ+KAlCcsIHJlZ2lvbjogJ+KAlCcsIGF1ZGl0TmFtZTogdGhpcy5mTmFtZSB8fCAn4oCUJyxcclxuICAgICAgc3VidGl0bGU6IHRoaXMuc2VsZWN0ZWRBdWRpdD8uY2hlY2tMaXN0RGVzY3JpcHRpb24gfHwgJycsIHF1ZXN0aW9uQ291bnQ6IDAsIHF1ZXN0aW9uRmxhZzogMCwgY29tcGxpYW5jZUVuYWJsZWQ6IGZhbHNlLCBjb21wbGlhbmNlU2NvcmU6IG51bGwsXHJcbiAgICAgIHN1Ym1pdHRlZEJ5OiAn4oCUJywgZW1haWw6ICcnLCBkdXJhdGlvbjogJ+KAlCcsIGRhdGU6ICfigJQnLCBkYXRlSXNvOiAnJywgdGltZTogJ+KAlCcsIHN0YXR1czogJycsXHJcbiAgICAgIGFwcHJvdmFsRW5hYmxlOiBmYWxzZSwgYXBwcm92YWxTdGF0dXM6IGZhbHNlLCBhcHByb3ZlZEJ5OiAnJywgYXBwcm92ZWRBdDogJycsIGFja25vd2xlZGdlZEJ5OiAnJywgcHJvb2ZJbWFnZTogJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSBzdWJtaXNzaW9uIGhhcyBhIENvbXBsaWFuY2UgU2NvcmUgYXQgYWxsOiB0aGUgQVBJJ3MgY2hlY2tsaXN0SW5mby5jb21wbGlhbmNlRW5hYmxlZCAocmVhZCBvdmVyIGV2ZXJ5XHJcbiAgICogc2VjdGlvbiksIGVsc2UgYW55IHF1ZXN0aW9uIGluIHRoZSByZWNvcmQgd2l0aCBjb21wbGlhbmNlIHNjb3Jpbmcgb24uIFdpdGhvdXQgaXQgdGhlIGZsYWctYmFzZWQgc2NvcmUgd291bGRcclxuICAgKiBhbHdheXMgcmVhZCAxMDAlLCBzbyB0aGUgcGFnZSBzaG93cyBubyBzY29yZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbXBsaWFuY2VPbihyZWNvcmQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZmxhZyA9IHJlY29yZD8uY2hlY2tsaXN0SW5mbz8uY29tcGxpYW5jZUVuYWJsZWQ7XHJcbiAgICBpZiAodHlwZW9mIGZsYWcgPT09ICdib29sZWFuJykgeyByZXR1cm4gZmxhZzsgfVxyXG4gICAgcmV0dXJuIChyZWNvcmQ/LnF1ZXN0aW9uQW5zd2VyIHx8IFtdKS5zb21lKChzOiBhbnkpID0+IChzPy5xdWVzdGlvbnMgfHwgW10pLnNvbWUoKHE6IGFueSkgPT4gcT8uY29tcGxpYW5jZSA9PT0gdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1NlY3Rpb25zKGxpc3Q6IGFueVtdKTogQXVkaXRTZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIChsaXN0IHx8IFtdKS5tYXAoKHM6IGFueSkgPT4gKHtcclxuICAgICAgbmFtZTogcy5zZWN0aW9uTmFtZSxcclxuICAgICAgcXVlc3Rpb25zOiAocy5xdWVzdGlvbnMgfHwgW10pLm1hcCgocTogYW55KSA9PiAoe1xyXG4gICAgICAgIGtleTogdGhpcy5xdWVzdGlvbktleShzLnNlY3Rpb25OYW1lLCBxLnFuYW1lKSxcclxuICAgICAgICBxbm86IFN0cmluZyhxLnFubyA/PyAnJyksXHJcbiAgICAgICAgdGV4dDogdGhpcy5jbGVhbihxLnFuYW1lKSxcclxuICAgICAgICBzZWN0aW9uOiBzLnNlY3Rpb25OYW1lLFxyXG4gICAgICAgIGFuc3dlclR5cGU6IFN0cmluZyhxLmFuc3dlclR5cGUgfHwgJycpXHJcbiAgICAgIH0pKVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1JvdyhzZWN0aW9uOiBzdHJpbmcsIHE6IGFueSk6IEFuc3dlclJvdyB7XHJcbiAgICBjb25zdCBnaXZlbjogYW55W10gPSBxLnVzZXJBbnN3ZXIgfHwgW107XHJcbiAgICBjb25zdCBhbnN3ZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgbWVkaWE6IEFuc3dlck1lZGlhW10gPSBbXTtcclxuICAgIGNvbnN0IHByb29mOiBBbnN3ZXJNZWRpYVtdID0gW107XHJcbiAgICBjb25zdCBwcm9vZlRleHQ6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBkYXRlTGFiZWwgPSB0aGlzLnJlY29yZD8uY2hlY2tsaXN0SW5mbz8uZGF0ZTtcclxuICAgIC8vIFJ1biBBSSBrZWVwcyBhbiBhbm5vdGF0ZWQgY29weSBvZiBhIHBob3RvOyBpdCByZXBsYWNlcyB0aGUgb3JpZ2luYWwsIGFzIGluIHRoZSBjaGVja2xpc3QgZ2FsbGVyeS5cclxuICAgIGNvbnN0IGFkZCA9IChpbnRvOiBBbnN3ZXJNZWRpYVtdLCBwYXRoOiBhbnksIHZpZGVvOiBib29sZWFuLCBhaVBhdGg/OiBhbnksIGNhcHRpb24/OiBhbnksIGFpPzogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHNyYyA9ICF2aWRlbyAmJiBhaVBhdGggPyB0aGlzLm1lZGlhVXJsKGFpUGF0aCwgdGhpcy5ydW5BaUNkbikgOiB0aGlzLm1lZGlhVXJsKHBhdGgsIHRoaXMuYW5zd2VyQ2RuKTtcclxuICAgICAgaWYgKCFzcmMpIHsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZGV0ZWN0aW9uU3RhdHVzKGFpKTtcclxuICAgICAgaW50by5wdXNoKHtcclxuICAgICAgICBzcmMsIHZpZGVvLCBjYXB0aW9uOiB0aGlzLmNsZWFuKGNhcHRpb24pLCB1cGxvYWRlZDogdGhpcy51cGxvYWRUaW1lKHBhdGgsIGRhdGVMYWJlbCksXHJcbiAgICAgICAgZGV0ZWN0aW9uOiBzdGF0dXMgPT09IG51bGwgPyAnJyA6IHN0YXR1cyA/ICdtYXRjaGVkJyA6ICdub3RtYXRjaGVkJ1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICBnaXZlbi5mb3JFYWNoKChhOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qga2luZCA9IHEuYW5zd2VyVHlwZSA9PT0gJ2ltYWdlL3ZpZGVvJyA/ICh0aGlzLmlzVmlkZW9BbnN3ZXIoYSkgPyAndmlkZW8nIDogJ2ltYWdlJykgOiBxLmFuc3dlclR5cGU7XHJcbiAgICAgIGNvbnN0IGNhcHR1cmVkID0gSU1BR0VfVFlQRVMuaW5jbHVkZXMoa2luZCkgfHwgVklERU9fVFlQRVMuaW5jbHVkZXMoa2luZCk7XHJcbiAgICAgIGlmIChjYXB0dXJlZCkge1xyXG4gICAgICAgIC8vIHYxOiBlYWNoIG11bHRpcGxlSW1hZ2UgdGlsZSBoYXMgaXRzIG93biBiYWRnZTsgc2luZ2xlIGNhcHR1cmVzIGZhbGwgYmFjayB0byBkZXRlY3Rpb25TdGF0dXMgb25jZSBBSSByYW4uXHJcbiAgICAgICAgY29uc3QgYWlEYXRhID0gYS5ydW5BSURhdGE/Lmxlbmd0aCA/IGEucnVuQUlEYXRhXHJcbiAgICAgICAgICA6IChhLnJ1bkFJQW5zd2VyICYmIGEuZGV0ZWN0aW9uU3RhdHVzICE9PSB1bmRlZmluZWQgPyBbeyBsYWJsZU5hbWU6ICdkZXRlY3Rpb25TdGF0dXMnLCB2YWx1ZTogYS5kZXRlY3Rpb25TdGF0dXMgfV0gOiBudWxsKTtcclxuICAgICAgICBhZGQobWVkaWEsIGEuYW5zd2VyLCBWSURFT19UWVBFUy5pbmNsdWRlcyhraW5kKSwgYS5ydW5BSUFuc3dlciwgYS5kZXNjcmlwdGlvbiwgYWlEYXRhKTtcclxuICAgICAgfSBlbHNlIGlmIChhLmFuc3dlciAhPT0gdW5kZWZpbmVkICYmIGEuYW5zd2VyICE9PSBudWxsICYmIGEuYW5zd2VyICE9PSAnJykge1xyXG4gICAgICAgIGFuc3dlcnMucHVzaChTdHJpbmcoYS5hbnN3ZXIpKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBQcm9vZiB0aGUgY2hvc2VuIG9wdGlvbiBhc2tlZCBmb3IgKGFuc3dlciB2YWxpZGF0aW9uKTogYSBwaG90bywgYSB2aWRlbywgdGV4dCwgb3Igc2V2ZXJhbCBwaG90b3MuXHJcbiAgICAgIGlmIChhLnZhbGlkYXRpb25BbnN3ZXIpIHtcclxuICAgICAgICBpZiAoYS52YWxpZGF0aW9uVHlwZSA9PT0gJ0NhcHR1cmUgSW1hZ2UnKSB7XHJcbiAgICAgICAgICBhZGQocHJvb2YsIGEudmFsaWRhdGlvbkFuc3dlciwgZmFsc2UsIGNhcHR1cmVkID8gJycgOiBhLnJ1bkFJQW5zd2VyLCAnJywgY2FwdHVyZWQgPyBudWxsIDogKGEucnVuQUlEYXRhIHx8IGdpdmVuWzBdPy5ydW5BSURhdGEpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGEudmFsaWRhdGlvblR5cGUgPT09ICdDYXB0dXJlIFZpZGVvJykge1xyXG4gICAgICAgICAgYWRkKHByb29mLCBhLnZhbGlkYXRpb25BbnN3ZXIsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwcm9vZlRleHQucHVzaChTdHJpbmcoYS52YWxpZGF0aW9uQW5zd2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIChhLnZhbGlkYXRpb25JbWFnZSB8fCBbXSkuZm9yRWFjaCgocDogc3RyaW5nLCBpOiBudW1iZXIpID0+XHJcbiAgICAgICAgYWRkKHByb29mLCBwLCBmYWxzZSwgYS5ydW5BSURhdGE/LltpXT8uYW5zd2VySW1hZ2UsICcnLCBhLnJ1bkFJRGF0YT8uW2ldPy5yZXN1bHRzKSk7XHJcbiAgICAgIChhLnZhbGlkYXRpb25WaWRlbyB8fCBbXSkuZm9yRWFjaCgocDogc3RyaW5nKSA9PiBhZGQocHJvb2YsIHAsIHRydWUpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFJlZmVyZW5jZSBpbWFnZXMsIGFzIHRoZSB2MSBnYWxsZXJ5IHBpY2tzIHRoZW06IHRoZSBxdWVzdGlvbidzIG93biwgdGhlbiB0aGUgY2hvc2VuIG9wdGlvbnMnIChjaG9pY2VcclxuICAgIC8vIHR5cGVzLCBvbiBlYWNoIHVzZXJBbnN3ZXIpIG9yIHRoZSBjYXB0dXJlJ3MgKGltYWdlIC8gdmlkZW8gdHlwZXMsIG9uIHRoZSBjb25maWd1cmVkIGFuc3dlcnMpLlxyXG4gICAgY29uc3QgcXVlc3Rpb25SZWZzID0gdGhpcy5yZWZVcmxzKHEubXVsdGlRdWVzdGlvblJlZmVyZW5jZUltYWdlPy5sZW5ndGggPyBxLm11bHRpUXVlc3Rpb25SZWZlcmVuY2VJbWFnZSA6IHEucXVlc3Rpb25SZWZlcmVuY2VJbWFnZSk7XHJcbiAgICBjb25zdCByZWZzT2YgPSAobGlzdDogYW55W10pOiBzdHJpbmdbXSA9PiB7XHJcbiAgICAgIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcclxuICAgICAgKGxpc3QgfHwgW10pLmZvckVhY2goKHg6IGFueSkgPT4gb3V0LnB1c2goLi4udGhpcy5yZWZVcmxzKHg/Lm11bHRpUmVmZXJlbmNlSW1hZ2U/Lmxlbmd0aCA/IHgubXVsdGlSZWZlcmVuY2VJbWFnZSA6IHg/LnJlZmVyZW5jZUltYWdlKSkpO1xyXG4gICAgICByZXR1cm4gb3V0O1xyXG4gICAgfTtcclxuICAgIGNvbnN0IG9wdGlvblJlZnMgPSBDSE9JQ0VfVFlQRVMuaW5jbHVkZXMocS5hbnN3ZXJUeXBlKVxyXG4gICAgICA/IHJlZnNPZihnaXZlbilcclxuICAgICAgOiAoSU1BR0VfVFlQRVMuaW5jbHVkZXMocS5hbnN3ZXJUeXBlKSB8fCBWSURFT19UWVBFUy5pbmNsdWRlcyhxLmFuc3dlclR5cGUpIHx8IHEuYW5zd2VyVHlwZSA9PT0gJ2ltYWdlL3ZpZGVvJylcclxuICAgICAgICA/IHJlZnNPZihxLmFuc3dlcnMpXHJcbiAgICAgICAgOiBbXTtcclxuICAgIGNvbnN0IGxpbmVhciA9IHEuYW5zd2Vycz8uWzBdPy5saW5lYXJUeXBlO1xyXG4gICAgY29uc3QgdW5pdCA9IHEuYW5zd2VyVHlwZSA9PT0gJ2xpbmVhcnNjYWxlJyA/IChsaW5lYXIgPT09ICdwZXJjZW50YWdlJyA/ICclJyA6IGxpbmVhciA9PT0gJ2RlZ3JlZScgPyAnwrBDJyA6ICcnKSA6ICcnO1xyXG5cclxuICAgIGNvbnN0IHNjb3JlZCA9ICEhcS5jb21wbGlhbmNlO1xyXG4gICAgY29uc3Qgb3B0aW9uczogQW5zd2VyT3B0aW9uW10gPSAocS5hbnN3ZXJzIHx8IFtdKVxyXG4gICAgICAubWFwKChvOiBhbnkpID0+ICh7IGxhYmVsOiBTdHJpbmcobz8uYW5zd2VyID8/ICcnKSwgc2NvcmU6IHNjb3JlZCA/IChOdW1iZXIobz8uY29tcGxpYW5jZVNjb3JlKSB8fCAwKSA6IG51bGwsIGZsYWc6ICEhbz8uc29wRmxhZyB9KSlcclxuICAgICAgLmZpbHRlcigobzogQW5zd2VyT3B0aW9uKSA9PiBvLmxhYmVsKTtcclxuICAgIGNvbnN0IG9wdGlvbkZvciA9IChsYWJlbDogc3RyaW5nKSA9PiBvcHRpb25zLmZpbmQobyA9PiBvLmxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBsYWJlbC50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcblxyXG4gICAgY29uc3QgaGFzUmV2aXNpb24gPSAhIShxLnJldmlzZWRBbnN3ZXIgfHwgcS5yZXZpc2VkUmVhc29uKSB8fCAocS5yZXZpc2VkU2NvcmUgIT09IHVuZGVmaW5lZCAmJiBxLnJldmlzZWRTY29yZSAhPT0gbnVsbCk7XHJcbiAgICBjb25zdCByZXZpc2VkQW5zd2VyID0gU3RyaW5nKHEucmV2aXNlZEFuc3dlciB8fCAnJyk7XHJcbiAgICBjb25zdCByZXZpc2VkID0gaGFzUmV2aXNpb25cclxuICAgICAgPyB7XHJcbiAgICAgICAgYW5zd2VyOiByZXZpc2VkQW5zd2VyLFxyXG4gICAgICAgIHJlYXNvbjogU3RyaW5nKHEucmV2aXNlZFJlYXNvbiB8fCAnJyksXHJcbiAgICAgICAgc2NvcmU6IHRoaXMubnVtKHEucmV2aXNlZFNjb3JlKSA/PyAocmV2aXNlZEFuc3dlciA/IG9wdGlvbkZvcihyZXZpc2VkQW5zd2VyKT8uc2NvcmUgPz8gbnVsbCA6IG51bGwpLFxyXG4gICAgICAgIGJ5OiBTdHJpbmcocS5yZXZpc2VkQnk/Lm5hbWUgfHwgJycpXHJcbiAgICAgIH1cclxuICAgICAgOiBudWxsO1xyXG4gICAgLy8gQSByZXZpc2VkIGFuc3dlciBpcyBiYXJlIG9wdGlvbiB0ZXh0OyBpdHMgZmxhZyBjb21lcyBmcm9tIHRoZSBtYXRjaGluZyBjb25maWd1cmVkIG9wdGlvbi5cclxuICAgIGNvbnN0IGZsYWdnZWQgPSByZXZpc2VkPy5hbnN3ZXIgPyAhIW9wdGlvbkZvcihyZXZpc2VkLmFuc3dlcik/LmZsYWcgOiBnaXZlbi5zb21lKChhOiBhbnkpID0+IGEuc29wRmxhZyk7XHJcbiAgICAvLyBUaGUgc3VibWl0dGVkIGFuc3dlcidzIG93biBjb21wbGlhbmNlU2NvcmUsIGVsc2UgdGhlIGNvbmZpZ3VyZWQgb3B0aW9uJ3MgKHNvbWUgc3VibWlzc2lvbnNcclxuICAgIC8vIGNhcnJ5IG9ubHkgdGhlIGFuc3dlciB0ZXh0KS5cclxuICAgIGNvbnN0IHNjb3JlcyA9IGdpdmVuLm1hcCgoYTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG93biA9IHRoaXMubnVtKGEuY29tcGxpYW5jZVNjb3JlKTtcclxuICAgICAgcmV0dXJuIG93biA/PyAob3B0aW9uRm9yKFN0cmluZyhhPy5hbnN3ZXIgPz8gJycpKT8uc2NvcmUgPz8gMCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGFjdHVhbFNjb3JlID0gc2NvcmVkID8gKHNjb3Jlcy5sZW5ndGggPyBNYXRoLm1heCguLi5zY29yZXMpIDogMCkgOiBudWxsO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogdGhpcy5xdWVzdGlvbktleShzZWN0aW9uLCBxLnFuYW1lKSxcclxuICAgICAgc2VjdGlvbixcclxuICAgICAgcW5vOiBTdHJpbmcocS5xbm8gPz8gJycpLFxyXG4gICAgICB0ZXh0OiB0aGlzLmNsZWFuKHEucW5hbWUpLFxyXG4gICAgICBhbnN3ZXJUeXBlOiBxLmFuc3dlclR5cGUgfHwgJycsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2libGVRZGVzY3JpcHRpb24ocSksXHJcbiAgICAgIHF1ZXN0aW9uUmVmcyxcclxuICAgICAgb3B0aW9uUmVmcyxcclxuICAgICAgYW5zd2VycyxcclxuICAgICAgdW5pdCxcclxuICAgICAgbWVkaWEsXHJcbiAgICAgIHByb29mLFxyXG4gICAgICBpbWFnZXM6IFsuLi5tZWRpYSwgLi4ucHJvb2ZdLmZpbHRlcihtID0+ICFtLnZpZGVvKS5tYXAobSA9PiBtLnNyYyksXHJcbiAgICAgIHZpZGVvczogWy4uLm1lZGlhLCAuLi5wcm9vZl0uZmlsdGVyKG0gPT4gbS52aWRlbykubWFwKG0gPT4gbS5zcmMpLFxyXG4gICAgICB2YWxpZGF0aW9uVGV4dDogcHJvb2ZUZXh0LmpvaW4oJywgJyksXHJcbiAgICAgIHZhbGlkYXRpb25UZXh0czogcHJvb2ZUZXh0LFxyXG4gICAgICBhaVJlc3VsdHM6IHRoaXMuYWlSZXN1bHRzKHEpLFxyXG4gICAgICByZW1hcms6IHEucmVtYXJrcyB8fCAnJyxcclxuICAgICAgZXh0cmFSZW1hcms6IHEuc3RvcmVNYW5hZ2VyUmVtYXJrIHx8ICcnLFxyXG4gICAgICBhY3R1YWxTY29yZSxcclxuICAgICAgc2NvcmU6IHNjb3JlZCA/IChyZXZpc2VkPy5zY29yZSA/PyBhY3R1YWxTY29yZSkgOiBudWxsLFxyXG4gICAgICBmbGFnZ2VkLFxyXG4gICAgICByZWRvOiAhIXEucmVkbyxcclxuICAgICAgcmV2aXNlZCxcclxuICAgICAgb3B0aW9ucyxcclxuICAgICAgZWRpdGFibGU6IFJFVklTQUJMRV9UWVBFUy5pbmNsdWRlcyhxLmFuc3dlclR5cGUpICYmIG9wdGlvbnMubGVuZ3RoID4gMVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZWQgbWVkaWEgaXMgYSBidWNrZXQga2V5OyBhIGZldyBvbGRlciByZWNvcmRzIGFscmVhZHkgaG9sZCBhIGZ1bGwgVVJMLiAqL1xyXG4gIHByaXZhdGUgbWVkaWFVcmwocGF0aDogYW55LCBjZG46IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwID0gU3RyaW5nKHBhdGggPz8gJycpLnRyaW0oKTtcclxuICAgIGlmICghcCkgeyByZXR1cm4gJyc7IH1cclxuICAgIHJldHVybiAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHApID8gcCA6IGNkbiArIHAucmVwbGFjZSgvXlxcLysvLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVmZXJlbmNlIGltYWdlIGZpZWxkIGFzIFVSTHM6IGEga2V5LCBhIGxpc3Qgb2Yga2V5cyAodGFza3MpLCBvciBbeyBpbWFnZVVSTCB9XSAobXVsdGkgcmVmZXJlbmNlIGltYWdlcykuICovXHJcbiAgcHJpdmF0ZSByZWZVcmxzKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XHJcbiAgICByZXR1cm4gbGlzdFxyXG4gICAgICAubWFwKCh2OiBhbnkpID0+IHRoaXMubWVkaWFVcmwodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IHY/LmltYWdlVVJMLCB0aGlzLmFuc3dlckNkbikpXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSdW4gQUkgZGV0ZWN0aW9uU3RhdHVzICgndHJ1ZScgLyAnZmFsc2UnKSBhdCB0aGUgdG9wIGxldmVsIG9mIHJ1bkFJRGF0YSBvciBpbnNpZGUgYW4gZW50cnkncyByZXN1bHRzXHJcbiAgICogKHYxIGNoZWNrRGV0ZWN0aW9uU3RhdHVzKTsgbnVsbCB3aGVuIG5vIGRldGVjdGlvbiB3YXMgcnVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGV0ZWN0aW9uU3RhdHVzKHJ1bkFJRGF0YTogYW55KTogYm9vbGVhbiB8IG51bGwge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bkFJRGF0YSkpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcnVuQUlEYXRhKSB7XHJcbiAgICAgIGNvbnN0IGhpdCA9IGVudHJ5Py5sYWJsZU5hbWUgPT09ICdkZXRlY3Rpb25TdGF0dXMnID8gZW50cnlcclxuICAgICAgICA6IChlbnRyeT8ucmVzdWx0cyB8fCBbXSkuZmluZCgocjogYW55KSA9PiByPy5sYWJsZU5hbWUgPT09ICdkZXRlY3Rpb25TdGF0dXMnKTtcclxuICAgICAgaWYgKGhpdCkgeyByZXR1cm4gU3RyaW5nKGhpdC52YWx1ZSkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwbG9hZCB0aW1lIGZyb20gdGhlIGNhcHR1cmUga2V5ICjigKYvWVlZWS1NTS1ERC/igKYvSEg6bW06c3MvZmlsZSkgYXMgXCJZWVlZLU1NLUREIGhoOm1tIEFNXCIsIHRoZSB2MSBsYWJlbDsgdGhlXHJcbiAgICogc3VibWlzc2lvbiBkYXRlIHN0YW5kcyBpbiBmb3Iga2V5cyB3aXRob3V0IGEgZGF0ZSBzZWdtZW50LCBhbmQga2V5cyB3aXRob3V0IGEgdGltZSBnaXZlICcnLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBsb2FkVGltZShwYXRoOiBhbnksIHN1Ym1pc3Npb25EYXRlPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHsgcmV0dXJuICcnOyB9XHJcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKTtcclxuICAgIGNvbnN0IGNsb2NrID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMl0gfHwgJyc7XHJcbiAgICBpZiAoIS9eXFxkezEsMn06XFxkezJ9OlxcZHsyfSQvLnRlc3QoY2xvY2spKSB7IHJldHVybiAnJzsgfVxyXG4gICAgY29uc3QgW2gsIG1dID0gY2xvY2suc3BsaXQoJzonKTtcclxuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChoLCAxMCk7XHJcbiAgICBjb25zdCB0aW1lID0gYCR7U3RyaW5nKGhvdXIgJSAxMiB8fCAxMikucGFkU3RhcnQoMiwgJzAnKX06JHttfSAke2hvdXIgPj0gMTIgPyAnUE0nIDogJ0FNJ31gO1xyXG4gICAgY29uc3QgZGF5ID0gcGFydHMuZmluZChwID0+IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHApKTtcclxuICAgIGlmIChkYXkpIHsgcmV0dXJuIGAke2RheX0gJHt0aW1lfWA7IH1cclxuICAgIC8vIGNoZWNrbGlzdEluZm8uZGF0ZSBpcyBcIkREIE1NTSBZWVlZXCIsIHdoaWNoIERhdGUgcGFyc2VzIHdpdGhvdXQgdGhlIGN1c3RvbVBhcnNlRm9ybWF0IHBsdWdpbi5cclxuICAgIGNvbnN0IGQgPSBzdWJtaXNzaW9uRGF0ZSA/IGRheWpzKG5ldyBEYXRlKHN1Ym1pc3Npb25EYXRlKSkgOiBudWxsO1xyXG4gICAgcmV0dXJuIGQgJiYgZC5pc1ZhbGlkKCkgPyBgJHtkLmZvcm1hdCgnWVlZWS1NTS1ERCcpfSAke3RpbWV9YCA6IHRpbWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSdW4gQUkgcmVzdWx0IGxpbmVzIG9mIHRoZSBmaXJzdCBhbnN3ZXIsIGFzIHRoZSB2MSBnYWxsZXJ5IGxpc3RzIHRoZW06IGVhY2ggbGFiZWxsZWQgZW50cnkgKG9yIGVhY2ggZW50cnknc1xyXG4gICAqIHJlc3VsdHMpIGV4Y2VwdCBkZXRlY3Rpb25TdGF0dXMsIHZhbHVlcyBwYWRkZWQgdG8gdHdvIGRpZ2l0czsgYW4gaW1hZ2UgYW5zd2VyIHdpdGhvdXQgQUkgZGF0YSBzaG93cyBpdHNcclxuICAgKiBFbXBsb3llZSBDb3VudCB3aGVuIGl0IGhhcyBvbmUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhaVJlc3VsdHMocTogYW55KTogQWlSZXN1bHRbXSB7XHJcbiAgICBjb25zdCBmaXJzdCA9IHE/LnVzZXJBbnN3ZXI/LlswXTtcclxuICAgIGNvbnN0IGRhdGE6IGFueVtdID0gQXJyYXkuaXNBcnJheShmaXJzdD8ucnVuQUlEYXRhKSA/IGZpcnN0LnJ1bkFJRGF0YSA6IFtdO1xyXG4gICAgY29uc3Qgb3V0OiBBaVJlc3VsdFtdID0gW107XHJcbiAgICBjb25zdCBwdXNoID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZT8ubGFibGVOYW1lICYmIGUubGFibGVOYW1lICE9PSAnZGV0ZWN0aW9uU3RhdHVzJyAmJiBlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgZS52YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIG91dC5wdXNoKHsgbGFiZWw6IFN0cmluZyhlLmxhYmxlTmFtZSksIHZhbHVlOiBTdHJpbmcoZS52YWx1ZSkucGFkU3RhcnQoMiwgJzAnKSB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGRhdGEuZm9yRWFjaCgoZTogYW55KSA9PiBlPy5sYWJsZU5hbWUgPyBwdXNoKGUpIDogKGU/LnJlc3VsdHMgfHwgW10pLmZvckVhY2gocHVzaCkpO1xyXG4gICAgaWYgKCFkYXRhLmxlbmd0aCAmJiBxPy5hbnN3ZXJUeXBlID09PSAnaW1hZ2UnICYmIGZpcnN0Py5lbXBsb3llZUNvdW50ICE9PSB1bmRlZmluZWQgJiYgZmlyc3Q/LmVtcGxveWVlQ291bnQgIT09IG51bGwpIHtcclxuICAgICAgb3V0LnB1c2goeyBsYWJlbDogJ0VtcGxveWVlIENvdW50JywgdmFsdWU6IFN0cmluZyhmaXJzdC5lbXBsb3llZUNvdW50KSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBxZGVzY3JpcHRpb24sIGV4Y2VwdCB0aGUgY29weSBhbiBvbGQgYXV0by10YXNrIHNhdmUgbGVmdCBpbiBpdCAoYW4gYW5zd2VyJ3MgYXV0b1Rhc2sudGFza0Rlc2NyaXB0aW9uKSwgd2hpY2hcclxuICAgKiB0aGUgdjEgZ2FsbGVyeSBhbmQgdGhlIHF1ZXN0aW9uIGJ1aWxkZXIgZG8gbm90IHNob3cgZWl0aGVyLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdmlzaWJsZVFkZXNjcmlwdGlvbihxOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGV4dCA9IFN0cmluZyhxPy5xZGVzY3JpcHRpb24gfHwgJycpLnRyaW0oKTtcclxuICAgIGlmICghdGV4dCkgeyByZXR1cm4gJyc7IH1cclxuICAgIGNvbnN0IHRhc2tDb3B5ID0gKHE/LmFuc3dlcnMgfHwgW10pLnNvbWUoKG86IGFueSkgPT4gbz8uYXV0b1Rhc2s/LmVuYWJsZWQgJiYgby5hdXRvVGFzay50YXNrRGVzY3JpcHRpb24gPT09IHEucWRlc2NyaXB0aW9uKTtcclxuICAgIHJldHVybiB0YXNrQ29weSA/ICcnIDogdGV4dDtcclxuICB9XHJcblxyXG4gIC8qKiBDYXB0dXJlIEltYWdlL1ZpZGVvIGFuc3dlcnM6IHRoZSBlbnRyeSdzIG93biB0eXBlLCBlbHNlIHRoZSBmaWxlIGV4dGVuc2lvbiAoY2hlY2tsaXN0IGdhbGxlcnkgcnVsZSkuICovXHJcbiAgcHJpdmF0ZSBpc1ZpZGVvQW5zd2VyKGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGE/LmFuc3dlclR5cGUgPT09ICd2aWRlbycgfHwgYT8ubWVkaWFUeXBlID09PSAndmlkZW8nIHx8IGE/LnR5cGUgPT09ICd2aWRlbycpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHJldHVybiBWSURFT19GSUxFLnRlc3QoU3RyaW5nKGE/LmFuc3dlciB8fCAnJykuc3BsaXQoJz8nKVswXSk7XHJcbiAgfVxyXG5cclxuICBvbk1lZGlhRXJyb3Ioc3JjOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYnJva2VuTWVkaWEgPSBuZXcgU2V0KHRoaXMuYnJva2VuTWVkaWEpLmFkZChzcmMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBxdWVzdGlvbktleShzZWN0aW9uOiBzdHJpbmcsIHFuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHNlY3Rpb24gKyAnfCcgKyB0aGlzLmNsZWFuKHFuYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYW4odGV4dDogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTdHJpbmcodGV4dCA/PyAnJykucmVwbGFjZSgvXFxuL2csICcgJykudHJpbSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBudW0odjogYW55KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gJycgfHwgIU51bWJlci5pc0Zpbml0ZShOdW1iZXIodikpID8gbnVsbCA6IE51bWJlcih2KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIFBhZ2luZ1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBnZXQgcGFnZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b3RhbCA/ICh0aGlzLnBhZ2VJbmRleCArIDEpICsgJyBvZiAnICsgdGhpcy50b3RhbCA6ICcwIG9mIDAnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhblByZXYoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZyAmJiB0aGlzLnBhZ2VJbmRleCA+IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuTmV4dCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5sb2FkaW5nICYmIHRoaXMucGFnZUluZGV4ICsgMSA8IHRoaXMudG90YWw7XHJcbiAgfVxyXG5cclxuICBwcmV2UGFnZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jYW5QcmV2KSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5wYWdlSW5kZXgtLTtcclxuICAgIHRoaXMubG9hZFBhZ2UoKTtcclxuICB9XHJcblxyXG4gIG5leHRQYWdlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbk5leHQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnBhZ2VJbmRleCsrO1xyXG4gICAgdGhpcy5sb2FkUGFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gTGVmdCBwYW5lbFxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBnZXQgc2VjdGlvbnMoKTogQXVkaXRTZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25TZWN0aW9ucztcclxuICB9XHJcblxyXG4gIC8qKiDCqyAvIMK7IGhpZGVzIHRoZSBxdWVzdGlvbiBwYW5lbCBzbyB0aGUgYW5zd2VycyB0YWtlIHRoZSBmdWxsIHdpZHRoICh2MSBzaWRlbmF2IHRvZ2dsZSkuICovXHJcbiAgbmF2Q29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gIHRvZ2dsZU5hdigpOiB2b2lkIHtcclxuICAgIHRoaXMubmF2Q29sbGFwc2VkID0gIXRoaXMubmF2Q29sbGFwc2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogXCIoZWFybmVkL21heClcIiBjb21wbGlhbmNlIHBvaW50cyBvZiBhIHNlY3Rpb24gaW4gdGhlIHN1Ym1pc3Npb24gb24gdGhlIHJpZ2h0LCBhcyB0aGUgdjEgZ2FsbGVyeSBzaG93cyBuZXh0IHRvXHJcbiAgICogdGhlIHNlY3Rpb24gbmFtZTsgJycgd2hlbiB0aGUgc2VjdGlvbiBzY29yZXMgbm90aGluZy5cclxuICAgKi9cclxuICBzZWN0aW9uUG9pbnRzKHM6IEF1ZGl0U2VjdGlvbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmb3VuZCA9ICh0aGlzLnJlY29yZD8ucXVlc3Rpb25BbnN3ZXIgfHwgW10pLmZpbmQoKHg6IGFueSkgPT4geD8uc2VjdGlvbk5hbWUgPT09IHMubmFtZSk7XHJcbiAgICBjb25zdCBtYXggPSBOdW1iZXIoZm91bmQ/LmFuc3dlcnNfY29tcGxpYW5jZVNjb3JlKSB8fCAwO1xyXG4gICAgcmV0dXJuIG1heCA/IGAoJHtOdW1iZXIoZm91bmQudXNlckFuc3dlcl9jb21wbGlhbmNlU2NvcmUpIHx8IDB9LyR7bWF4fSlgIDogJyc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBJbWFnZSB2aWV3ZXIgKHYxICNpbWFnZU1vZGFsOiBvbmUgaW1hZ2UgYXQgYSB0aW1lLCDigLkg4oC6IHRocm91Z2ggdGhlIHNldCBpdCB3YXMgb3BlbmVkIGZyb20pXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHZpZXdlcjogeyBpdGVtczogc3RyaW5nW107IGluZGV4OiBudW1iZXI7IHRpdGxlOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogT3B0aW9uIHF1ZXN0aW9uICh5ZXMvbm8sIGRyb3Bkb3duLCBzaW5nbGUgLyBtdWx0aXBsZSBjaG9pY2UpLiAqL1xyXG4gIGlzQ2hvaWNlKHE6IEFuc3dlclJvdyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIENIT0lDRV9UWVBFUy5pbmNsdWRlcyhxLmFuc3dlclR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGFuc3dlciBnZXRzIGEgcmlnaHQtaGFuZCBjb2x1bW4gKHYxIGNvbC1tZC02KTogdmFsaWRhdGlvbiBwaG90b3MgLyB2aWRlb3MsIG9yIGFuIG9wdGlvbiBxdWVzdGlvbidzIHJlZmVyZW5jZVxyXG4gICAqIGltYWdlLiBBIHR5cGVkIHZhbGlkYXRpb24gYW5zd2VyIHN0YXlzIG9uIHRoZSBsZWZ0IHVuZGVyIHRoZSBhbnN3ZXIuXHJcbiAgICovXHJcbiAgaGFzU2lkZShxOiBBbnN3ZXJSb3cpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIShxLnByb29mLmxlbmd0aCB8fCAodGhpcy5pc0Nob2ljZShxKSAmJiBxLm9wdGlvblJlZnMubGVuZ3RoKSk7XHJcbiAgfVxyXG5cclxuICAvKiogdjEgYmxvY2sgdGl0bGVzOiBcIlVwbG9hZGVkIEltYWdlXCIsIFwiVXBsb2FkZWQgVmlkZW9cIiwgb3IgYm90aCBraW5kcyB0b2dldGhlci4gKi9cclxuICBtZWRpYVRpdGxlKGxpc3Q6IEFuc3dlck1lZGlhW10pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmlkZW9zID0gbGlzdC5maWx0ZXIobSA9PiBtLnZpZGVvKS5sZW5ndGg7XHJcbiAgICByZXR1cm4gIXZpZGVvcyA/ICdVcGxvYWRlZCBJbWFnZScgOiB2aWRlb3MgPT09IGxpc3QubGVuZ3RoID8gJ1VwbG9hZGVkIFZpZGVvJyA6ICdVcGxvYWRlZCBJbWFnZSAvIFZpZGVvJztcclxuICB9XHJcblxyXG4gIC8qKiB2MSBjb2xsYWdlOiBvbmUgaW1hZ2UgZnVsbCB3aWR0aCwgdXAgdG8gZm91ciBpbiB0d28gY29sdW1ucywgbW9yZSBpbiB0aHJlZTsgdGFsbCByb3dzIGZvciBvbmUgb3IgdHdvLiAqL1xyXG4gIGdyaWRDbGFzcyhjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjb3VudCA8PSAxID8gJ2lzLW9uZScgOiBjb3VudCA9PT0gMiA/ICdpcy10d28gaXMtdGFsbCcgOiBjb3VudCA8PSA0ID8gJ2lzLXR3bycgOiAnaXMtdGhyZWUnO1xyXG4gIH1cclxuXHJcbiAgb3BlblZpZXdlcihpdGVtczogc3RyaW5nW10sIGluZGV4OiBudW1iZXIsIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy52aWV3ZXIgPSB7IGl0ZW1zLCBpbmRleDogTWF0aC5taW4oTWF0aC5tYXgoaW5kZXgsIDApLCBpdGVtcy5sZW5ndGggLSAxKSwgdGl0bGUgfTtcclxuICAgIHRoaXMuc2V0UGFnZVNjcm9sbExvY2tlZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVucyB0aGUgdmlld2VyIG9uIG9uZSBjYXB0dXJlIHRpbGU6IHRoZSBpbWFnZSB0aWxlcyBvZiB0aGF0IGdyb3VwLCBhdCB0aGUgY2xpY2tlZCBvbmUuICovXHJcbiAgb3Blbk1lZGlhVmlld2VyKGxpc3Q6IEFuc3dlck1lZGlhW10sIG06IEFuc3dlck1lZGlhLCB0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbWFnZXMgPSBsaXN0LmZpbHRlcih4ID0+ICF4LnZpZGVvICYmICF0aGlzLmJyb2tlbk1lZGlhLmhhcyh4LnNyYykpLm1hcCh4ID0+IHguc3JjKTtcclxuICAgIHRoaXMub3BlblZpZXdlcihpbWFnZXMsIGltYWdlcy5pbmRleE9mKG0uc3JjKSwgdGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VWaWV3ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdlciA9IG51bGw7XHJcbiAgICB0aGlzLnNldFBhZ2VTY3JvbGxMb2NrZWQodGhpcy5maWx0ZXJzT3Blbik7XHJcbiAgfVxyXG5cclxuICBzdGVwVmlld2VyKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy52aWV3ZXIpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMudmlld2VyLmluZGV4ICsgZGVsdGE7XHJcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMudmlld2VyLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnZpZXdlciA9IHsgLi4udGhpcy52aWV3ZXIsIGluZGV4IH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvblZpZXdlcktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucHJvb2ZPcGVuICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHsgdGhpcy5wcm9vZk9wZW4gPSBmYWxzZTsgcmV0dXJuOyB9XHJcbiAgICBpZiAoIXRoaXMudmlld2VyKSB7IHJldHVybjsgfVxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHsgdGhpcy5jbG9zZVZpZXdlcigpOyB9XHJcbiAgICBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnKSB7IHRoaXMuc3RlcFZpZXdlcigtMSk7IH1cclxuICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7IHRoaXMuc3RlcFZpZXdlcigxKTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFwiVmlldyBQcm9vZlwiIG5leHQgdG8gQWNrbm93bGVkZ2VkIEJ5OiB0aGUgbmFtZSBhbmQgdGhlIHBob3RvIGNhcHR1cmVkIGF0IHN1Ym1pdCAodjEgVmVyaWZpY2F0aW9uIERldGFpbHMpLiAqL1xyXG4gIHByb29mT3BlbiA9IGZhbHNlO1xyXG5cclxuICB0b2dnbGVTZWN0aW9uKGk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuU2VjdGlvbiA9IHRoaXMub3BlblNlY3Rpb24gPT09IGkgPyBudWxsIDogaTtcclxuICB9XHJcblxyXG4gIGlzUXVlc3Rpb25TZWxlY3RlZChxOiBBdWRpdFF1ZXN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcy5oYXMocS5rZXkpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUXVlc3Rpb24ocTogQXVkaXRRdWVzdGlvbik6IHZvaWQge1xyXG4gICAgLy8gUmUtY3JlYXRlIHRoZSBTZXQgc28gdGhlIGdldHRlci1kcml2ZW4gdGVtcGxhdGUgcGlja3MgdXAgdGhlIGNoYW5nZS5cclxuICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRJZHMpO1xyXG4gICAgbmV4dC5oYXMocS5rZXkpID8gbmV4dC5kZWxldGUocS5rZXkpIDogbmV4dC5hZGQocS5rZXkpO1xyXG4gICAgdGhpcy5zZWxlY3RlZElkcyA9IG5leHQ7XHJcbiAgfVxyXG5cclxuICAvKiogVGlja2VkIHF1ZXN0aW9ucyBpbiBvbmUgc2VjdGlvbiAoMCA9IG5vbmUpLiAqL1xyXG4gIHNlY3Rpb25QaWNrZWQoczogQXVkaXRTZWN0aW9uKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSWRzLnNpemUgPyBzLnF1ZXN0aW9ucy5maWx0ZXIocSA9PiB0aGlzLnNlbGVjdGVkSWRzLmhhcyhxLmtleSkpLmxlbmd0aCA6IDA7XHJcbiAgfVxyXG5cclxuICAvKiogXCJWaWV3IEFsbCBBbnN3ZXJzXCI6IGRyb3AgYW55IHF1ZXN0aW9uIHNlbGVjdGlvbi4gKi9cclxuICB2aWV3QWxsQW5zd2VycygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICB9XHJcblxyXG4gIGdldCBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcy5zaXplID4gMDtcclxuICB9XHJcblxyXG4gIC8qKiBMZWZ0LXBhbmVsIGRvdHMgZm9yIHRoZSBzdWJtaXNzaW9uIGluIHZpZXcuICovXHJcbiAgaXNSZXZpc2VkKHE6IEF1ZGl0UXVlc3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3Muc29tZShyID0+IHIua2V5ID09PSBxLmtleSAmJiByLnJldmlzZWQgIT09IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgaXNGbGFnZ2VkKHE6IEF1ZGl0UXVlc3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3Muc29tZShyID0+IHIua2V5ID09PSBxLmtleSAmJiByLmZsYWdnZWQpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVNlY3Rpb24oXzogbnVtYmVyLCBzOiBBdWRpdFNlY3Rpb24pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHMubmFtZTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEZpbHRlciBkcmF3ZXJcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIEV2ZXJ5IGZpbHRlciBjYXRlZ29yeSwgaW4gdGhlIG9yZGVyIHRoZSBkcmF3ZXIgbGlzdHMgdGhlbS4gKi9cclxuICBnZXQgZmlsdGVyRGVmcygpOiBGaWx0ZXJEZWZbXSB7XHJcbiAgICBjb25zdCBzdG9yZXMgPSB0aGlzLmZpbHRlclN0b3JlcztcclxuICAgIGNvbnN0IHN0b3JlSWRzID0gc3RvcmVzLm1hcChzID0+IHMuc3RvcmVJZCk7XHJcbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmZTY29wZSA9PT0gJ0NsdXN0ZXJzJyA/IHRoaXMuY2x1c3Rlck5hbWVzIDogdGhpcy50ZWFtTmFtZXM7XHJcbiAgICBjb25zdCBkZWZzOiBGaWx0ZXJEZWZbXSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAndHlwZScsIGxhYmVsOiAnVHlwZScsIGhpbnQ6ICdQaWNrIHdoYXQga2luZCBvZiByZWNvcmRzIHRoZSBnYWxsZXJ5IHNob3VsZCBsaXN0LicsXHJcbiAgICAgICAgbXVsdGk6IGZhbHNlLCBraW5kOiAnbGlzdCcsIGdyb3VwOiAncHJpbWFyeScsIHNlYXJjaGFibGU6IHRydWUsXHJcbiAgICAgICAgb3B0aW9uczogW3sgbGFiZWw6ICdBdWRpdCcsIG1ldGE6ICdTdWJtaXR0ZWQgYXVkaXRzJyB9XVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdzdG9yZXMnLCBsYWJlbDogJ1N0b3JlcycsIGhpbnQ6ICdTZWxlY3QgYWxsIHN0b3Jlcywgb3IgcGljayB0aGVtIGluZGl2aWR1YWxseS4gU2VhcmNoIHNldmVyYWwgc3RvcmUgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4nLFxyXG4gICAgICAgIG11bHRpOiB0cnVlLCBraW5kOiAnbGlzdCcsIGdyb3VwOiAncHJpbWFyeScsIHNlYXJjaGFibGU6IHRydWUsXHJcbiAgICAgICAgLy8gVXNlci1jb3ZlcmFnZSBhdWRpdHMgYXJlIHNjb3BlZCBieSB0ZWFtIHVzZXJzLCBub3Qgc3RvcmVzLlxyXG4gICAgICAgIGhpZGU6IHRoaXMuZlNjb3BlID09PSAnVGVhbXMnLFxyXG4gICAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICAgIC4uLihzdG9yZUlkcy5sZW5ndGggPyBbeyBsYWJlbDogJ0FsbCBzdG9yZXMnLCBtZXRhOiB0aGlzLmF1ZGl0U3RvcmVJZHMgPyAnRXZlcnkgc3RvcmUgd2l0aCBhIHN1Ym1pc3Npb24gb2YgdGhpcyBhdWRpdCcgOiAnU2VsZWN0IGV2ZXJ5IHN0b3JlIGluIHNjb3BlJywgYWxsT2Y6IHN0b3JlSWRzIH1dIDogW10pLFxyXG4gICAgICAgICAgLy8gU3RvcmUgbmFtZSBvbmx5OiB0aGUgc3RvcmUgaWQgaXMgbmV2ZXIgc2hvd24uXHJcbiAgICAgICAgICAuLi5zdG9yZXMubWFwKHMgPT4gKHsgbGFiZWw6IHMuc3RvcmVOYW1lIHx8IHMuc3RvcmVJZCwgdmFsdWU6IHMuc3RvcmVJZCB9KSlcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ2Fuc3dlcicsIGxhYmVsOiAnQW5zd2VyIFR5cGUnLCBoaW50OiAnRmlsdGVyIHF1ZXN0aW9ucyBieSB0aGUgYW5zd2VyIGNhcHR1cmVkLicsXHJcbiAgICAgICAgbXVsdGk6IGZhbHNlLCBraW5kOiAnbGlzdCcsIGdyb3VwOiAncHJpbWFyeScsIHNlYXJjaGFibGU6IHRydWUsXHJcbiAgICAgICAgb3B0aW9uczogQU5TV0VSX1RZUEVTLm1hcChhID0+ICh7IGxhYmVsOiBhLmxhYmVsIH0pKVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgLy8gVGhlIGdhbGxlcnkgQVBJIGNhbm5vdCBmaWx0ZXIgb24gdGhlIGZpbmFsIHNjb3JlIHlldC5cclxuICAgICAgICBpZDogJ3Jlc3VsdCcsIGxhYmVsOiAnUGFzcyAvIEZhaWwgUmVzdWx0JywgaGlkZTogdHJ1ZSxcclxuICAgICAgICBoaW50OiAnRXZhbHVhdGVkIG9uIHRoZSBmaW5hbCBzY29yZSBhZnRlciBhcHByb3ZlZCBkaXNwdXRlcy4gUGFzcyBtYXJrICcgKyB0aGlzLnBhc3NUaHJlc2hvbGQgKyAnJS4nLFxyXG4gICAgICAgIG11bHRpOiBmYWxzZSwga2luZDogJ2xpc3QnLCBncm91cDogJ3ByaW1hcnknLFxyXG4gICAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICAgIHsgbGFiZWw6ICdBbGwnLCBtZXRhOiAnRXZlcnkgc3VibWl0dGVkIGF1ZGl0JyB9LFxyXG4gICAgICAgICAgeyBsYWJlbDogJ1Bhc3MnLCBtZXRhOiAnRmluYWwgc2NvcmUgYXQgb3IgYWJvdmUgdGhlIHBhc3MgbWFyaycgfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdGYWlsJywgbWV0YTogJ0ZpbmFsIHNjb3JlIGJlbG93IHRoZSBwYXNzIG1hcmsnIH1cclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ3Njb3JlJywgbGFiZWw6ICdDb21wbGlhbmNlIFNjb3JlJywgaGlkZTogdHJ1ZSxcclxuICAgICAgICBoaW50OiAnU2hvdyBzdWJtaXNzaW9ucyB3aG9zZSBmaW5hbCBjb21wbGlhbmNlIHNjb3JlIGZhbGxzIGluc2lkZSB0aGlzIHJhbmdlLicsXHJcbiAgICAgICAgbXVsdGk6IGZhbHNlLCBraW5kOiAnc2NvcmUnLCBncm91cDogJ3ByaW1hcnknLCBvcHRpb25zOiBbXVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdkYXRlJywgbGFiZWw6ICdEYXRlIFJhbmdlJywgaGludDogJ1BpY2sgYSBzaW5nbGUgZGF0ZSBvciBhIHN0YXJ0IGFuZCBlbmQgZGF0ZSBmb3IgYSByYW5nZS4nLFxyXG4gICAgICAgIG11bHRpOiBmYWxzZSwga2luZDogJ2RhdGUnLCBncm91cDogJ3ByaW1hcnknLCBvcHRpb25zOiBbXVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICduYW1lJywgbGFiZWw6IHRoaXMuZlR5cGUgKyAnIE5hbWUnLCBoaW50OiAnQXVkaXRzIGNvbmZpZ3VyZWQgd2l0aCBhdWRpdCBtb2RlIG9uLicsXHJcbiAgICAgICAgbXVsdGk6IGZhbHNlLCBraW5kOiAnbGlzdCcsIGdyb3VwOiAnc2Vjb25kYXJ5Jywgc2VhcmNoYWJsZTogdHJ1ZSxcclxuICAgICAgICBvcHRpb25zOiB0aGlzLmF1ZGl0cy5tYXAoYSA9PiAoe1xyXG4gICAgICAgICAgbGFiZWw6IGEuY2hlY2tMaXN0TmFtZSxcclxuICAgICAgICAgIHZhbHVlOiBhLl9pZCxcclxuICAgICAgICAgIG1ldGE6IChhLmNvdmVyYWdlID09PSAndXNlcicgPyAnVXNlciBjb3ZlcmFnZScgOiAnU3RvcmUgY292ZXJhZ2UnKSArXHJcbiAgICAgICAgICAgIChhLnBhc3NNYXJrID8gJyDCtyBQYXNzIG1hcmsgJyArIGEucGFzc01hcmsgKyAnJScgOiAnJylcclxuICAgICAgICB9KSlcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnc2NvcGUnLCBsYWJlbDogJ0NsdXN0ZXJzIC8gVGVhbXMnLCBoaW50OiAnU2V0IGJ5IHRoZSBzZWxlY3RlZCBhdWRpdFxcJ3MgY292ZXJhZ2UuJyxcclxuICAgICAgICBtdWx0aTogZmFsc2UsIGtpbmQ6ICdsaXN0JywgZ3JvdXA6ICdzZWNvbmRhcnknLFxyXG4gICAgICAgIG9wdGlvbnM6IHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnXHJcbiAgICAgICAgICA/IFt7IGxhYmVsOiAnQ2x1c3RlcnMnLCBtZXRhOiAnU3RvcmUgY292ZXJhZ2UgLSBncm91cCBzdG9yZXMgYnkgY2x1c3RlcicgfV1cclxuICAgICAgICAgIDogW3sgbGFiZWw6ICdUZWFtcycsIG1ldGE6ICdVc2VyIGNvdmVyYWdlIC0gZ3JvdXAgdXNlcnMgYnkgdGVhbScgfV1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnY2x1c3RlcicsIGxhYmVsOiB0aGlzLmZTY29wZSA9PT0gJ0NsdXN0ZXJzJyA/ICdTZWxlY3QgQ2x1c3RlcnMnIDogJ1NlbGVjdCBUZWFtcycsXHJcbiAgICAgICAgaGludDogJ1NlbGVjdCBvbmUgb3IgbW9yZSwgb3IgcGljayBhbGwuJywgbXVsdGk6IHRydWUsIGtpbmQ6ICdsaXN0JyxcclxuICAgICAgICBncm91cDogJ3NlY29uZGFyeScsIHNlYXJjaGFibGU6IHRydWUsXHJcbiAgICAgICAgb3B0aW9uczogW1xyXG4gICAgICAgICAgeyBsYWJlbDogdGhpcy5mU2NvcGUgPT09ICdDbHVzdGVycycgPyAnQWxsIGNsdXN0ZXJzJyA6ICdBbGwgdGVhbXMnLCBtZXRhOiAnU2VsZWN0IGV2ZXJ5IG9uZScsIGFsbE9mOiBncm91cHMgfSxcclxuICAgICAgICAgIC4uLmdyb3Vwcy5tYXAoZyA9PiAoeyBsYWJlbDogZyB9KSlcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ3N0YXR1cycsIGxhYmVsOiAnQXBwcm92YWwgU3RhdHVzJywgaGludDogJ0FwcHJvdmFsIHN0YXRlIG9mIHRoZSBzdWJtaXNzaW9uLicsXHJcbiAgICAgICAgbXVsdGk6IGZhbHNlLCBraW5kOiAnbGlzdCcsIGdyb3VwOiAnc2Vjb25kYXJ5JyxcclxuICAgICAgICBvcHRpb25zOiBbeyBsYWJlbDogJ0FsbCcgfSwgeyBsYWJlbDogJ0FwcHJvdmVkJyB9LCB7IGxhYmVsOiAnTm90LUFwcHJvdmVkJyB9XVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdmbGFncycsIGxhYmVsOiAnU3VibWlzc2lvbiBGbGFncycsIGhpbnQ6ICdTaG93IG9ubHkgc3VibWlzc2lvbnMgd2l0aCB0aGVzZSBtYXJrZXJzLicsXHJcbiAgICAgICAgbXVsdGk6IHRydWUsIGtpbmQ6ICdsaXN0JywgZ3JvdXA6ICdzZWNvbmRhcnknLFxyXG4gICAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICAgIHsgbGFiZWw6ICdEaXNwdXRlZCBTdWJtaXNzaW9ucycsIG1ldGE6ICdIYXMgb25lIG9yIG1vcmUgZGlzcHV0ZXMnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnUmUtZG8nLCBtZXRhOiAnUmUtZG8gd2FzIHJlcXVlc3RlZCcgfSxcclxuICAgICAgICAgIHsgbGFiZWw6ICdGbGFnJywgbWV0YTogJ0ZsYWdnZWQgYW5zd2VycycgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHJldHVybiBkZWZzLmZpbHRlcihmID0+ICFmLmhpZGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByaW1hcnlEZWZzKCk6IEZpbHRlckRlZltdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckRlZnMuZmlsdGVyKGYgPT4gZi5ncm91cCA9PT0gJ3ByaW1hcnknKTtcclxuICB9XHJcblxyXG4gIGdldCBzZWNvbmRhcnlEZWZzKCk6IEZpbHRlckRlZltdIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckRlZnMuZmlsdGVyKGYgPT4gZi5ncm91cCA9PT0gJ3NlY29uZGFyeScpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFjdGl2ZURlZigpOiBGaWx0ZXJEZWYge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRGVmcy5maW5kKGYgPT4gZi5pZCA9PT0gdGhpcy5hY3RpdmVGaWx0ZXIpIHx8IHRoaXMuZmlsdGVyRGVmc1swXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbnMgaW4gdGhlIGFjdGl2ZSBjYXRlZ29yeSwgbmFycm93ZWQgYnkgdGhlIHBhbmUgc2VhcmNoIGJveC4gU3RvcmVzIHNlYXJjaCBieSBuYW1lIGFzIGluXHJcbiAgICogdGhlIHYxIGdhbGxlcnk6IFwiYSwgYiwgY1wiIGxpc3RzIHRoZSBzdG9yZXMgbmFtZWQgZXhhY3RseSBhLCBiIGFuZCBjOyBvbmUgdGVybSBsaXN0cyB0aGUgbmFtZXNcclxuICAgKiBjb250YWluaW5nIGl0LiBXaGlsZSBhIHN0b3JlIHNlYXJjaCBpcyBvbiwgXCJBbGwgc3RvcmVzXCIgYmVjb21lcyBcIkFsbCBtYXRjaGluZyBzdG9yZXNcIiBhbmRcclxuICAgKiBwaWNrcyBqdXN0IHRoZSBzdG9yZXMgbGlzdGVkLlxyXG4gICAqL1xyXG4gIGdldCBhY3RpdmVPcHRpb25zKCk6IEZpbHRlck9wdGlvbltdIHtcclxuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmO1xyXG4gICAgY29uc3QgcSA9IHRoaXMub3B0aW9uUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoIXEpIHsgcmV0dXJuIGRlZi5vcHRpb25zOyB9XHJcbiAgICBpZiAoZGVmLmlkID09PSAnc3RvcmVzJykge1xyXG4gICAgICBjb25zdCB0ZXJtcyA9IHEuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgICBjb25zdCBoaXQgPSAobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbiA9IG5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHEuaW5jbHVkZXMoJywnKSA/IHRlcm1zLmluY2x1ZGVzKG4pIDogbi5pbmNsdWRlcyhxKTtcclxuICAgICAgfTtcclxuICAgICAgY29uc3Qgc3RvcmVzID0gZGVmLm9wdGlvbnMuZmlsdGVyKG8gPT4gIW8uYWxsT2YgJiYgaGl0KG8ubGFiZWwpKTtcclxuICAgICAgcmV0dXJuIHN0b3Jlcy5sZW5ndGhcclxuICAgICAgICA/IFt7IGxhYmVsOiAnQWxsIG1hdGNoaW5nIHN0b3JlcycsIG1ldGE6IHN0b3Jlcy5sZW5ndGggKyAoc3RvcmVzLmxlbmd0aCA9PT0gMSA/ICcgc3RvcmUnIDogJyBzdG9yZXMnKSwgYWxsT2Y6IHN0b3Jlcy5tYXAobyA9PiB0aGlzLnZhbHVlT2YobykpIH0sIC4uLnN0b3Jlc11cclxuICAgICAgICA6IFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlZi5vcHRpb25zLmZpbHRlcihvID0+XHJcbiAgICAgIChvLmxhYmVsICsgJyAnICsgKG8ubWV0YSB8fCAnJykpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vT3B0aW9uTWF0Y2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVEZWYua2luZCA9PT0gJ2xpc3QnICYmICF0aGlzLmFjdGl2ZU9wdGlvbnMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ1NlYXJjaCAnICsgdGhpcy5hY3RpdmVEZWYubGFiZWwudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBjdXJyZW50IHZhbHVlIGZvciBhIGNhdGVnb3J5LiAqL1xyXG4gIHN1bW1hcnlGb3IoaWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgIGNhc2UgJ3R5cGUnOiByZXR1cm4gdGhpcy5mVHlwZTtcclxuICAgICAgY2FzZSAnbmFtZSc6IHJldHVybiB0aGlzLmZOYW1lIHx8ICdObyBhdWRpdHMnO1xyXG4gICAgICBjYXNlICdhbnN3ZXInOiByZXR1cm4gdGhpcy5mQW5zd2VyO1xyXG4gICAgICBjYXNlICdkYXRlJzogcmV0dXJuIHRoaXMucmFuZ2VMYWJlbDtcclxuICAgICAgY2FzZSAnc2NvcGUnOiByZXR1cm4gdGhpcy5mU2NvcGU7XHJcbiAgICAgIGNhc2UgJ2NsdXN0ZXInOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmZDbHVzdGVycy5sZW5ndGhcclxuICAgICAgICAgID8gdGhpcy5mQ2x1c3RlcnMubGVuZ3RoICsgJyBzZWxlY3RlZCdcclxuICAgICAgICAgIDogKHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnID8gJ0FsbCBjbHVzdGVycycgOiAnQWxsIHRlYW1zJyk7XHJcbiAgICAgIGNhc2UgJ3N0b3Jlcyc6IHJldHVybiB0aGlzLmZTdG9yZXMubGVuZ3RoID8gdGhpcy5mU3RvcmVzLmxlbmd0aCArICcgc2VsZWN0ZWQnIDogJ0FsbCBzdG9yZXMnO1xyXG4gICAgICBjYXNlICdzdGF0dXMnOiByZXR1cm4gdGhpcy5mU3RhdHVzO1xyXG4gICAgICBjYXNlICdyZXN1bHQnOiByZXR1cm4gdGhpcy5mUmVzdWx0O1xyXG4gICAgICBjYXNlICdzY29yZSc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZlNjb3JlTWluID09PSAwICYmIHRoaXMuZlNjb3JlTWF4ID09PSAxMDBcclxuICAgICAgICAgID8gJ0FsbCBzY29yZXMnXHJcbiAgICAgICAgICA6IHRoaXMuZlNjb3JlTWluICsgJyUg4oCTICcgKyB0aGlzLmZTY29yZU1heCArICclJztcclxuICAgICAgY2FzZSAnZmxhZ3MnOiByZXR1cm4gdGhpcy5mRmxhZ3MubGVuZ3RoID8gdGhpcy5mRmxhZ3Muam9pbignLCAnKSA6ICdOb25lJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRydWUgd2hlbiBhIGNhdGVnb3J5IGRpZmZlcnMgZnJvbSBpdHMgZGVmYXVsdC4gKi9cclxuICBpc0RpcnR5KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgY2FzZSAndHlwZSc6IHJldHVybiB0aGlzLmZUeXBlICE9PSBERUZBVUxUUy50eXBlO1xyXG4gICAgICBjYXNlICdhbnN3ZXInOiByZXR1cm4gdGhpcy5mQW5zd2VyICE9PSBERUZBVUxUUy5hbnN3ZXI7XHJcbiAgICAgIGNhc2UgJ2RhdGUnOiByZXR1cm4gdGhpcy5kYXRlUGlja2VkO1xyXG4gICAgICBjYXNlICdjbHVzdGVyJzogcmV0dXJuIHRoaXMuZkNsdXN0ZXJzLmxlbmd0aCA+IDA7XHJcbiAgICAgIGNhc2UgJ3N0b3Jlcyc6IHJldHVybiB0aGlzLmZTdG9yZXMubGVuZ3RoID4gMDtcclxuICAgICAgY2FzZSAnc3RhdHVzJzogcmV0dXJuIHRoaXMuZlN0YXR1cyAhPT0gREVGQVVMVFMuc3RhdHVzO1xyXG4gICAgICBjYXNlICdyZXN1bHQnOiByZXR1cm4gdGhpcy5mUmVzdWx0ICE9PSBERUZBVUxUUy5yZXN1bHQ7XHJcbiAgICAgIGNhc2UgJ3Njb3JlJzogcmV0dXJuIHRoaXMuZlNjb3JlTWluICE9PSAwIHx8IHRoaXMuZlNjb3JlTWF4ICE9PSAxMDA7XHJcbiAgICAgIGNhc2UgJ2ZsYWdzJzogcmV0dXJuIHRoaXMuZkZsYWdzLmxlbmd0aCA+IDA7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVGaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRGVmcy5maWx0ZXIoZiA9PiB0aGlzLmlzRGlydHkoZi5pZCkpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGdldCByYW5nZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmbXQgPSAoaXNvOiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgcCA9IChpc28gfHwgJycpLnNwbGl0KCctJyk7XHJcbiAgICAgIHJldHVybiBwLmxlbmd0aCA9PT0gMyA/IHBbMl0gKyAnLScgKyBwWzFdICsgJy0nICsgcFswXSA6IGlzbztcclxuICAgIH07XHJcbiAgICByZXR1cm4gZm10KHRoaXMuZlN0YXJ0KSArICcgLSAnICsgZm10KHRoaXMuZkVuZCB8fCB0aGlzLmZTdGFydCk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGRyYXdlciBkYXRlIGRpZmZlcnMgZnJvbSB0aGUgaGVhZGVyIHJhbmdlLiAqL1xyXG4gIGdldCBkYXRlUGlja2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZlN0YXJ0ICE9PSB0aGlzLmhlYWRlclN0YXJ0IHx8IHRoaXMuZkVuZCAhPT0gdGhpcy5oZWFkZXJFbmQ7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmUgY2hpcCBsYWJlbCBpbiB0aGUgaGVhZGVyIGJhci4gKi9cclxuICBnZXQgc3RvcmVTdW1tYXJ5KCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5mU2NvcGUgPT09ICdUZWFtcycpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZkNsdXN0ZXJzLmxlbmd0aCA/IHRoaXMuZkNsdXN0ZXJzWzBdICsgKHRoaXMuZkNsdXN0ZXJzLmxlbmd0aCA+IDEgPyAnICsnICsgKHRoaXMuZkNsdXN0ZXJzLmxlbmd0aCAtIDEpIDogJycpIDogJ0FsbCB0ZWFtcyc7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZlN0b3Jlcy5sZW5ndGgpIHsgcmV0dXJuICdBbGwgc3RvcmVzJzsgfVxyXG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLnN0b3JlT3B0aW9ucy5maW5kKHMgPT4gcy5zdG9yZUlkID09PSB0aGlzLmZTdG9yZXNbMF0pO1xyXG4gICAgcmV0dXJuIChmaXJzdD8uc3RvcmVOYW1lIHx8IHRoaXMuZlN0b3Jlc1swXSkgKyAodGhpcy5mU3RvcmVzLmxlbmd0aCA+IDEgPyAnICsnICsgKHRoaXMuZlN0b3Jlcy5sZW5ndGggLSAxKSA6ICcnKTtcclxuICB9XHJcblxyXG4gIG9wZW5GaWx0ZXJzKGlkPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cG9ydE9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuc25hcHNob3QgPSB0aGlzLmNhcHR1cmUoKTtcclxuICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gaWQgfHwgdGhpcy5hY3RpdmVGaWx0ZXI7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyRGVmcy5zb21lKGYgPT4gZi5pZCA9PT0gdGhpcy5hY3RpdmVGaWx0ZXIpKSB7IHRoaXMuYWN0aXZlRmlsdGVyID0gJ3R5cGUnOyB9XHJcbiAgICB0aGlzLm9wdGlvblF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLmZSYW5nZSA9IHRvSW5saW5lUGlja2VyUmFuZ2UodGhpcy5mU3RhcnQsIHRoaXMuZkVuZCB8fCB0aGlzLmZTdGFydCk7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuc2V0UGFnZVNjcm9sbExvY2tlZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBIZWFkZXIgXCJTdG9yZXNcIiBjaGlwIG9wZW5zIHRoZSBUZWFtcyBsaXN0IGZvciBhIHVzZXItY292ZXJhZ2UgYXVkaXQuICovXHJcbiAgb3BlblNjb3BlRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuRmlsdGVycyh0aGlzLmZTY29wZSA9PT0gJ1RlYW1zJyA/ICdjbHVzdGVyJyA6ICdzdG9yZXMnKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gaWQ7XHJcbiAgICB0aGlzLm9wdGlvblF1ZXJ5ID0gJyc7XHJcbiAgfVxyXG5cclxuICAvKiogRHJhd2VyIHJhbmdlIHBpY2tlcjogYSBzaW5nbGUgZGF5IGNvbWVzIGJhY2sgYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZC4gKi9cclxuICBvblJhbmdlUGlja2VkKGU6IFBpY2tlZERhdGVzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGlja2VkID0gZnJvbVBpY2tlclJhbmdlKGUpO1xyXG4gICAgaWYgKCFwaWNrZWQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmZTdGFydCA9IHBpY2tlZC5mcm9tO1xyXG4gICAgdGhpcy5mRW5kID0gcGlja2VkLnRvO1xyXG4gICAgdGhpcy5sb2FkQXVkaXRTdG9yZXMoKTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuc25hcHNob3QgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZXRQYWdlU2Nyb2xsTG9ja2VkKGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5mRW5kIHx8IHRoaXMuZkVuZCA8IHRoaXMuZlN0YXJ0KSB7IHRoaXMuZkVuZCA9IHRoaXMuZlN0YXJ0OyB9XHJcbiAgICB0aGlzLmxvYWRHYWxsZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2x1c3RlcnNCZWZvcmUgPSB0aGlzLmZDbHVzdGVycy5qb2luKCd8Jyk7XHJcbiAgICBpZiAodGhpcy5zbmFwc2hvdCkgeyB0aGlzLnJlc3RvcmUodGhpcy5zbmFwc2hvdCk7IH1cclxuICAgIHRoaXMuc25hcHNob3QgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZXRQYWdlU2Nyb2xsTG9ja2VkKGZhbHNlKTtcclxuICAgIC8vIENsdXN0ZXIgcGlja3MgcmVsb2FkIHRoZSBzdG9yZSBsaXN0LCBzbyBwdXQgaXQgYmFjayBpbiBzdGVwIHdpdGggdGhlIHJlc3RvcmVkIGNsdXN0ZXJzLlxyXG4gICAgaWYgKHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnICYmIGNsdXN0ZXJzQmVmb3JlICE9PSB0aGlzLmZDbHVzdGVycy5qb2luKCd8JykpIHsgdGhpcy5sb2FkU3RvcmVzKCk7IH1cclxuICAgIHRoaXMubG9hZEF1ZGl0U3RvcmVzKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZTdGFydCA9IHRoaXMuaGVhZGVyU3RhcnQ7XHJcbiAgICB0aGlzLmZFbmQgPSB0aGlzLmhlYWRlckVuZDtcclxuICAgIHRoaXMuZlJhbmdlID0gdG9JbmxpbmVQaWNrZXJSYW5nZSh0aGlzLmZTdGFydCwgdGhpcy5mRW5kIHx8IHRoaXMuZlN0YXJ0KTtcclxuICAgIHRoaXMuZlR5cGUgPSBERUZBVUxUUy50eXBlO1xyXG4gICAgdGhpcy5mQW5zd2VyID0gREVGQVVMVFMuYW5zd2VyO1xyXG4gICAgdGhpcy5mQ2x1c3RlcnMgPSBbXTtcclxuICAgIHRoaXMuZlN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5mU3RhdHVzID0gREVGQVVMVFMuc3RhdHVzO1xyXG4gICAgdGhpcy5mUmVzdWx0ID0gREVGQVVMVFMucmVzdWx0O1xyXG4gICAgdGhpcy5mRmxhZ3MgPSBbXTtcclxuICAgIHRoaXMuZlNjb3JlTWluID0gREVGQVVMVFMuc2NvcmVNaW47XHJcbiAgICB0aGlzLmZTY29yZU1heCA9IERFRkFVTFRTLnNjb3JlTWF4O1xyXG4gICAgaWYgKHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnKSB7IHRoaXMubG9hZFN0b3JlcygpOyB9XHJcbiAgICB0aGlzLmxvYWRBdWRpdFN0b3JlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXB0dXJlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZTdGFydDogdGhpcy5mU3RhcnQsIGZFbmQ6IHRoaXMuZkVuZCwgZlR5cGU6IHRoaXMuZlR5cGUsIGZBdWRpdElkOiB0aGlzLmZBdWRpdElkLCBmTmFtZTogdGhpcy5mTmFtZSxcclxuICAgICAgZkFuc3dlcjogdGhpcy5mQW5zd2VyLCBmU2NvcGU6IHRoaXMuZlNjb3BlLCBmQ2x1c3RlcnM6IFsuLi50aGlzLmZDbHVzdGVyc10sXHJcbiAgICAgIGZTdG9yZXM6IFsuLi50aGlzLmZTdG9yZXNdLCBmU3RhdHVzOiB0aGlzLmZTdGF0dXMsIGZSZXN1bHQ6IHRoaXMuZlJlc3VsdCxcclxuICAgICAgZkZsYWdzOiBbLi4udGhpcy5mRmxhZ3NdLCBmU2NvcmVNaW46IHRoaXMuZlNjb3JlTWluLCBmU2NvcmVNYXg6IHRoaXMuZlNjb3JlTWF4XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXN0b3JlKHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XHJcbiAgICB0aGlzLmZTdGFydCA9IHNbJ2ZTdGFydCddIGFzIHN0cmluZztcclxuICAgIHRoaXMuZkVuZCA9IHNbJ2ZFbmQnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZUeXBlID0gc1snZlR5cGUnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZBdWRpdElkID0gc1snZkF1ZGl0SWQnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZOYW1lID0gc1snZk5hbWUnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZBbnN3ZXIgPSBzWydmQW5zd2VyJ10gYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mU2NvcGUgPSBzWydmU2NvcGUnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZDbHVzdGVycyA9IHNbJ2ZDbHVzdGVycyddIGFzIHN0cmluZ1tdO1xyXG4gICAgdGhpcy5mU3RvcmVzID0gc1snZlN0b3JlcyddIGFzIHN0cmluZ1tdO1xyXG4gICAgdGhpcy5mU3RhdHVzID0gc1snZlN0YXR1cyddIGFzIHN0cmluZztcclxuICAgIHRoaXMuZlJlc3VsdCA9IHNbJ2ZSZXN1bHQnXSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZGbGFncyA9IHNbJ2ZGbGFncyddIGFzIHN0cmluZ1tdO1xyXG4gICAgdGhpcy5mU2NvcmVNaW4gPSBzWydmU2NvcmVNaW4nXSBhcyBudW1iZXI7XHJcbiAgICB0aGlzLmZTY29yZU1heCA9IHNbJ2ZTY29yZU1heCddIGFzIG51bWJlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsdWVPZihvcHQ6IEZpbHRlck9wdGlvbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gb3B0LnZhbHVlID8/IG9wdC5sYWJlbDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIGFuIG9wdGlvbiBpbiB0aGUgYWN0aXZlIGNhdGVnb3J5IGlzIGN1cnJlbnRseSBjaG9zZW4uICovXHJcbiAgaXNTZWxlY3RlZChvcHQ6IEZpbHRlck9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLmFjdGl2ZURlZi5pZDtcclxuICAgIGlmIChvcHQuYWxsT2YpIHtcclxuICAgICAgY29uc3QgbGlzdCA9IHRoaXMubGlzdEZvcihpZCk7XHJcbiAgICAgIHJldHVybiAhIW9wdC5hbGxPZi5sZW5ndGggJiYgb3B0LmFsbE9mLmV2ZXJ5KHYgPT4gbGlzdC5pbmNsdWRlcyh2KSk7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgIGNhc2UgJ3R5cGUnOiByZXR1cm4gdGhpcy5mVHlwZSA9PT0gb3B0LmxhYmVsO1xyXG4gICAgICBjYXNlICduYW1lJzogcmV0dXJuIHRoaXMuZkF1ZGl0SWQgPT09IHRoaXMudmFsdWVPZihvcHQpO1xyXG4gICAgICBjYXNlICdhbnN3ZXInOiByZXR1cm4gdGhpcy5mQW5zd2VyID09PSBvcHQubGFiZWw7XHJcbiAgICAgIGNhc2UgJ3Njb3BlJzogcmV0dXJuIHRoaXMuZlNjb3BlID09PSBvcHQubGFiZWw7XHJcbiAgICAgIGNhc2UgJ3N0YXR1cyc6IHJldHVybiB0aGlzLmZTdGF0dXMgPT09IG9wdC5sYWJlbDtcclxuICAgICAgY2FzZSAncmVzdWx0JzogcmV0dXJuIHRoaXMuZlJlc3VsdCA9PT0gb3B0LmxhYmVsO1xyXG4gICAgICBjYXNlICdjbHVzdGVyJzogcmV0dXJuIHRoaXMuZkNsdXN0ZXJzLmluY2x1ZGVzKG9wdC5sYWJlbCk7XHJcbiAgICAgIGNhc2UgJ3N0b3Jlcyc6IHJldHVybiB0aGlzLmZTdG9yZXMuaW5jbHVkZXModGhpcy52YWx1ZU9mKG9wdCkpO1xyXG4gICAgICBjYXNlICdmbGFncyc6IHJldHVybiB0aGlzLmZGbGFncy5pbmNsdWRlcyhvcHQubGFiZWwpO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RGb3IoaWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIGlmIChpZCA9PT0gJ2NsdXN0ZXInKSB7IHJldHVybiB0aGlzLmZDbHVzdGVyczsgfVxyXG4gICAgaWYgKGlkID09PSAnc3RvcmVzJykgeyByZXR1cm4gdGhpcy5mU3RvcmVzOyB9XHJcbiAgICByZXR1cm4gdGhpcy5mRmxhZ3M7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbHkgYSBjbGljayBvbiBhbiBvcHRpb24gaW4gdGhlIGFjdGl2ZSBjYXRlZ29yeS4gKi9cclxuICBwaWNrKG9wdDogRmlsdGVyT3B0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBpZCA9IHRoaXMuYWN0aXZlRGVmLmlkO1xyXG5cclxuICAgIGlmIChvcHQuYWxsT2YpIHtcclxuICAgICAgLy8gQWRkcyBvciByZW1vdmVzIGp1c3QgdGhlIHZhbHVlcyBpdCBzdGFuZHMgZm9yIChldmVyeSBvbmUsIG9yIHRoZSBzdG9yZXMgYSBzZWFyY2ggbGlzdHMpLlxyXG4gICAgICBjb25zdCBhbGwgPSBvcHQuYWxsT2Y7XHJcbiAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmxpc3RGb3IoaWQpO1xyXG4gICAgICBjb25zdCBjaG9zZW4gPSBhbGwuZXZlcnkodiA9PiBsaXN0LmluY2x1ZGVzKHYpKSA/IGxpc3QuZmlsdGVyKHYgPT4gIWFsbC5pbmNsdWRlcyh2KSkgOiBbLi4ubmV3IFNldChbLi4ubGlzdCwgLi4uYWxsXSldO1xyXG4gICAgICBpZiAoaWQgPT09ICdjbHVzdGVyJykge1xyXG4gICAgICAgIHRoaXMuZkNsdXN0ZXJzID0gY2hvc2VuO1xyXG4gICAgICAgIGlmICh0aGlzLmZTY29wZSA9PT0gJ0NsdXN0ZXJzJykgeyB0aGlzLmxvYWRTdG9yZXMoKTsgfVxyXG4gICAgICB9IGVsc2UgaWYgKGlkID09PSAnc3RvcmVzJykge1xyXG4gICAgICAgIHRoaXMuZlN0b3JlcyA9IGNob3NlbjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChpZCkge1xyXG4gICAgICBjYXNlICd0eXBlJzogdGhpcy5mVHlwZSA9IG9wdC5sYWJlbDsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ25hbWUnOiB7XHJcbiAgICAgICAgY29uc3QgYXVkaXQgPSB0aGlzLmF1ZGl0cy5maW5kKGEgPT4gYS5faWQgPT09IHRoaXMudmFsdWVPZihvcHQpKTtcclxuICAgICAgICBpZiAoYXVkaXQpIHtcclxuICAgICAgICAgIGNvbnN0IHNjb3BlQmVmb3JlID0gdGhpcy5mU2NvcGU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdEF1ZGl0KGF1ZGl0KTtcclxuICAgICAgICAgIGlmICh0aGlzLmZTY29wZSAhPT0gc2NvcGVCZWZvcmUgJiYgdGhpcy5mU2NvcGUgPT09ICdDbHVzdGVycycpIHsgdGhpcy5sb2FkU3RvcmVzKCk7IH1cclxuICAgICAgICAgIHRoaXMubG9hZEF1ZGl0U3RvcmVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2Fuc3dlcic6IHRoaXMuZkFuc3dlciA9IG9wdC5sYWJlbDsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3Njb3BlJzogYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3N0YXR1cyc6IHRoaXMuZlN0YXR1cyA9IG9wdC5sYWJlbDsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3Jlc3VsdCc6IHRoaXMuZlJlc3VsdCA9IG9wdC5sYWJlbDsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2NsdXN0ZXInOlxyXG4gICAgICAgIHRoaXMuZkNsdXN0ZXJzID0gdGhpcy50b2dnbGUodGhpcy5mQ2x1c3RlcnMsIG9wdC5sYWJlbCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZlNjb3BlID09PSAnQ2x1c3RlcnMnKSB7IHRoaXMubG9hZFN0b3JlcygpOyB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3N0b3Jlcyc6IHRoaXMuZlN0b3JlcyA9IHRoaXMudG9nZ2xlKHRoaXMuZlN0b3JlcywgdGhpcy52YWx1ZU9mKG9wdCkpOyBicmVhaztcclxuICAgICAgY2FzZSAnZmxhZ3MnOiB0aGlzLmZGbGFncyA9IHRoaXMudG9nZ2xlKHRoaXMuZkZsYWdzLCBvcHQubGFiZWwpOyBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlKGxpc3Q6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIGxpc3QuaW5jbHVkZXModmFsdWUpID8gbGlzdC5maWx0ZXIoeCA9PiB4ICE9PSB2YWx1ZSkgOiBsaXN0LmNvbmNhdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBTY29yZVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogVGhlIHN1Ym1pdHRlZCBhbnN3ZXIsIGFzIHRleHQuICovXHJcbiAgYWN0dWFsQW5zd2VyKHE6IEFuc3dlclJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcS5hbnN3ZXJzLmpvaW4oJywgJyk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEFQSSdzIGNvbXBsaWFuY2Ugc2NvcmUgKHNhbWUgcnVsZSBhcyB0aGUgYXVkaXQgZGFzaGJvYXJkKTsgYW4gb2xkZXIgQVBJIHNlbmRzIG5vbmU6IHNoYXJlIG9mIHVuZmxhZ2dlZCBxdWVzdGlvbnMuICovXHJcbiAgZ2V0IGNvbXBsaWFuY2VQZXJjZW50KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5kZXRhaWwuY29tcGxpYW5jZVNjb3JlICE9PSBudWxsKSB7IHJldHVybiB0aGlzLmRldGFpbC5jb21wbGlhbmNlU2NvcmU7IH1cclxuICAgIHJldHVybiB0aGlzLmZsYWdTY29yZSh0aGlzLmRldGFpbC5xdWVzdGlvbkNvdW50LCB0aGlzLmRldGFpbC5xdWVzdGlvbkZsYWcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmbGFnU2NvcmUoY291bnQ6IG51bWJlciwgZmxhZ3M6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gY291bnQgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIE1hdGgucm91bmQoKGNvdW50IC0gZmxhZ3MpIC8gY291bnQgKiAxMDApKSkgOiAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhc3NlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBsaWFuY2VQZXJjZW50ID49IHRoaXMucGFzc1RocmVzaG9sZDtcclxuICB9XHJcblxyXG4gIGdldCByZXN1bHRMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGFzc2VkID8gdGhpcy5sYWJlbHMucGFzcyA6IHRoaXMubGFiZWxzLmZhaWw7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzU3VibWlzc2lvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMucmVjb3JkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJldmlzZWRDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIociA9PiByLnJldmlzZWQgIT09IG51bGwpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlUXVlc3Rpb25zKCk6IEFuc3dlclJvd1tdIHtcclxuICAgIC8vIExlZnQtcGFuZWwgdGlja3MgbmFycm93IHRoZSBhbnN3ZXJzIGZpcnN0OyB0aGUgRGlzcHV0ZWQgZmxhZyB0aGVuIGFwcGxpZXMgb24gdG9wLlxyXG4gICAgY29uc3QgcGlja2VkID0gdGhpcy5oYXNTZWxlY3Rpb25cclxuICAgICAgPyB0aGlzLnJvd3MuZmlsdGVyKHEgPT4gdGhpcy5zZWxlY3RlZElkcy5oYXMocS5rZXkpKVxyXG4gICAgICA6IHRoaXMucm93cztcclxuICAgIHJldHVybiB0aGlzLmZGbGFncy5pbmNsdWRlcygnRGlzcHV0ZWQgU3VibWlzc2lvbnMnKVxyXG4gICAgICA/IHBpY2tlZC5maWx0ZXIocSA9PiBxLnJldmlzZWQgIT09IG51bGwpXHJcbiAgICAgIDogcGlja2VkO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQW5zd2VyIGVkaXQgKHNjb3JlIHJldmlzaW9uKVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogV2h5IHRoaXMgc3VibWlzc2lvbiBjYW5ub3QgYmUgZWRpdGVkIHJpZ2h0IG5vdzsgJycgd2hlbiBpdCBjYW4uICovXHJcbiAgZ2V0IGVkaXRCbG9ja2VkUmVhc29uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuaGFzU3VibWlzc2lvbikgeyByZXR1cm4gJ05vIHN1Ym1pc3Npb24gc2VsZWN0ZWQnOyB9XHJcbiAgICBpZiAodGhpcy5kZXRhaWwuYXBwcm92YWxTdGF0dXMpIHsgcmV0dXJuICdUaGlzIGF1ZGl0IGlzIGFwcHJvdmVkLCBzbyBpdHMgYW5zd2VycyBjYW4gbm8gbG9uZ2VyIGJlIGVkaXRlZC4nOyB9XHJcbiAgICBpZiAodGhpcy5kZXRhaWwuc3RhdHVzICE9PSAnc3VibWl0JykgeyByZXR1cm4gJ1RoaXMgYXVkaXQgaXMgYmFjayB3aXRoIHRoZSBzdG9yZSBmb3IgYSByZS1kby4nOyB9XHJcbiAgICByZXR1cm4gdGhpcy5hY2Nlc3MuY2FuRWRpdCA/ICcnIDogKHRoaXMuYWNjZXNzLnJlYXNvbiB8fCAnWW91IGNhbm5vdCBlZGl0IHRoaXMgYXVkaXQuJyk7XHJcbiAgfVxyXG5cclxuICBpc0VkaXRpbmcocTogQW5zd2VyUm93KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0S2V5ID09PSBxLmtleTtcclxuICB9XHJcblxyXG4gIHN0YXJ0RWRpdChxOiBBbnN3ZXJSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IGJsb2NrZWQgPSB0aGlzLmVkaXRCbG9ja2VkUmVhc29uO1xyXG4gICAgaWYgKGJsb2NrZWQpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGJsb2NrZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmVkaXRLZXkgPSBxLmtleTtcclxuICAgIHRoaXMuZHJhZnRBbnN3ZXIgPSBxLnJldmlzZWQ/LmFuc3dlciB8fCB0aGlzLmFjdHVhbEFuc3dlcihxKTtcclxuICAgIGNvbnN0IHJlYXNvbiA9IHEucmV2aXNlZD8ucmVhc29uIHx8ICcnO1xyXG4gICAgY29uc3Qga25vd24gPSBDSEFOR0VfUkVBU09OUy5pbmNsdWRlcyhyZWFzb24pO1xyXG4gICAgdGhpcy5kcmFmdFJlYXNvbiA9ICFyZWFzb24gPyAnJyA6IChrbm93biA/IHJlYXNvbiA6ICdPdGhlcicpO1xyXG4gICAgdGhpcy5kcmFmdE90aGVyID0ga25vd24gPyAnJyA6IHJlYXNvbjtcclxuICB9XHJcblxyXG4gIGNhbmNlbEVkaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRLZXkgPSBudWxsO1xyXG4gICAgdGhpcy5kcmFmdEFuc3dlciA9ICcnO1xyXG4gICAgdGhpcy5kcmFmdFJlYXNvbiA9ICcnO1xyXG4gICAgdGhpcy5kcmFmdE90aGVyID0gJyc7XHJcbiAgfVxyXG5cclxuICBwaWNrRHJhZnQob3B0OiBBbnN3ZXJPcHRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnRBbnN3ZXIgPSBvcHQubGFiZWw7XHJcbiAgfVxyXG5cclxuICBpc0RyYWZ0KG9wdDogQW5zd2VyT3B0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5kcmFmdEFuc3dlci50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gb3B0LmxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3R1YWxPcHRpb24ocTogQW5zd2VyUm93LCBvcHQ6IEFuc3dlck9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0dWFsQW5zd2VyKHEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBvcHQubGFiZWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGRyYWZ0IGRpZmZlcnMgZnJvbSB3aGF0IHRoZSBzdG9yZSBzdWJtaXR0ZWQsIHNvIGEgcmVhc29uIGlzIHJlcXVpcmVkLiAqL1xyXG4gIGRyYWZ0Q2hhbmdlZChxOiBBbnN3ZXJSb3cpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRyYWZ0QW5zd2VyLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLmFjdHVhbEFuc3dlcihxKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGZpbmFsUmVhc29uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kcmFmdFJlYXNvbiA9PT0gJ090aGVyJyA/IHRoaXMuZHJhZnRPdGhlci50cmltKCkgOiB0aGlzLmRyYWZ0UmVhc29uO1xyXG4gIH1cclxuXHJcbiAgY2FuU2F2ZShxOiBBbnN3ZXJSb3cpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLnNhdmluZyB8fCAhdGhpcy5kcmFmdEFuc3dlcikgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIGNvbnN0IGVmZmVjdGl2ZSA9IHEucmV2aXNlZD8uYW5zd2VyIHx8IHRoaXMuYWN0dWFsQW5zd2VyKHEpO1xyXG4gICAgY29uc3QgY2hhbmdlZCA9IHRoaXMuZHJhZnRDaGFuZ2VkKHEpO1xyXG4gICAgLy8gTm90aGluZyB0byBkbyB3aGVuIHRoZSBkcmFmdCBpcyB3aGF0IGlzIGFscmVhZHkgaW4gZm9yY2UgKHNhbWUgYW5zd2VyLCBzYW1lIHJlYXNvbikuXHJcbiAgICBpZiAodGhpcy5kcmFmdEFuc3dlciA9PT0gZWZmZWN0aXZlICYmICghY2hhbmdlZCB8fCB0aGlzLmZpbmFsUmVhc29uID09PSAocS5yZXZpc2VkPy5yZWFzb24gfHwgJycpKSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHJldHVybiAhY2hhbmdlZCB8fCAhIXRoaXMuZmluYWxSZWFzb247XHJcbiAgfVxyXG5cclxuICBzYXZlRWRpdChxOiBBbnN3ZXJSb3cpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jYW5TYXZlKHEpKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgcmVzdG9yaW5nID0gIXRoaXMuZHJhZnRDaGFuZ2VkKHEpO1xyXG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdEdhbGxlcnlSZXZpc2Uoe1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgc3VibWlzc2lvbklkOiB0aGlzLmRldGFpbC5zdWJtaXNzaW9uSWQsXHJcbiAgICAgIHNlY3Rpb25OYW1lOiBxLnNlY3Rpb24sXHJcbiAgICAgIHFubzogcS5xbm8sXHJcbiAgICAgIGFuc3dlcjogdGhpcy5kcmFmdEFuc3dlcixcclxuICAgICAgcmVhc29uOiByZXN0b3JpbmcgPyAnJyA6IHRoaXMuZmluYWxSZWFzb25cclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3Qgc2F2ZSB0aGUgY2hhbmdlJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRvUm93KHEuc2VjdGlvbiwgcmVzLmRhdGEucXVlc3Rpb24pO1xyXG4gICAgICAgIHRoaXMucm93cyA9IHRoaXMucm93cy5tYXAociA9PiByLmtleSA9PT0gcS5rZXkgPyBuZXh0IDogcik7XHJcbiAgICAgICAgdGhpcy5wYXRjaFJlY29yZFF1ZXN0aW9uKHEsIHJlcy5kYXRhLnF1ZXN0aW9uKTtcclxuICAgICAgICB0aGlzLmRldGFpbCA9IHtcclxuICAgICAgICAgIC4uLnRoaXMuZGV0YWlsLFxyXG4gICAgICAgICAgcXVlc3Rpb25GbGFnOiBOdW1iZXIocmVzLmRhdGEucXVlc3Rpb25GbGFnKSB8fCAwLFxyXG4gICAgICAgICAgY29tcGxpYW5jZVNjb3JlOiB0aGlzLm51bShyZXMuZGF0YS5jb21wbGlhbmNlU2NvcmUpID8/IHRoaXMuZGV0YWlsLmNvbXBsaWFuY2VTY29yZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEucmVzdG9yZWQgPyAnUmV2aXNpb24gcmVtb3ZlZCDigJQgYWN0dWFsIGFuc3dlciByZXN0b3JlZCcgOiAnQW5zd2VyIHJldmlzZWQg4oCUIHNjb3JlIHVwZGF0ZWQnKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuZXJyb3JUZXh0KGVyciwgJ0NvdWxkIG5vdCBzYXZlIHRoZSBjaGFuZ2UnKSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEtlZXBzIHRoZSByYXcgcmVjb3JkICh1c2VkIGJ5IHRoZSBzaW5nbGUtc3VibWlzc2lvbiBleHBvcnQpIGluIHN0ZXAgd2l0aCBhIHNhdmVkIHJldmlzaW9uLiAqL1xyXG4gIHByaXZhdGUgcGF0Y2hSZWNvcmRRdWVzdGlvbihxOiBBbnN3ZXJSb3csIHF1ZXN0aW9uOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSAodGhpcy5yZWNvcmQ/LnF1ZXN0aW9uQW5zd2VyIHx8IFtdKS5maW5kKChzOiBhbnkpID0+IHMuc2VjdGlvbk5hbWUgPT09IHEuc2VjdGlvbik7XHJcbiAgICBjb25zdCBsaXN0OiBhbnlbXSA9IHNlY3Rpb24/LnF1ZXN0aW9ucyB8fCBbXTtcclxuICAgIGNvbnN0IGkgPSBsaXN0LmZpbmRJbmRleCgoeDogYW55KSA9PiBTdHJpbmcoeC5xbm8gPz8gJycpID09PSBxLnFubyk7XHJcbiAgICBpZiAoaSA+PSAwKSB7IGxpc3RbaV0gPSBxdWVzdGlvbjsgfVxyXG4gICAgaWYgKHRoaXMucmVjb3JkPy5jaGVja2xpc3RJbmZvKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkLmNoZWNrbGlzdEluZm8ucXVlc3Rpb25GbGFnID0gdGhpcy5kZXRhaWwucXVlc3Rpb25GbGFnO1xyXG4gICAgICB0aGlzLnJlY29yZC5jaGVja2xpc3RJbmZvLmNvbXBsaWFuY2VTY29yZSA9IHRoaXMuZGV0YWlsLmNvbXBsaWFuY2VTY29yZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXJyb3JUZXh0KGVycjogYW55LCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGUgPSBlcnI/LmVycm9yO1xyXG4gICAgY29uc3QgdGV4dCA9IHR5cGVvZiBlPy5lcnJvciA9PT0gJ3N0cmluZycgPyBlLmVycm9yIDogKGU/LmVycm9yPy5tZXNzYWdlIHx8IGU/LmRldGFpbHM/Lm1lc3NhZ2UgfHwgZT8ubWVzc2FnZSk7XHJcbiAgICByZXR1cm4gdGV4dCB8fCBmYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEFwcHJvdmUgKGV4aXN0aW5nIGNoZWNrbGlzdCBhcHByb3ZhbDogYWxsIHN1Ym1pc3Npb25zIG9mIHRoaXMgc3RvcmUgLyB1c2VyIG9uIHRoaXMgZGF5KVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICByZXF1ZXN0QXBwcm92ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5oYXNTdWJtaXNzaW9uIHx8IHRoaXMuZGV0YWlsLmFwcHJvdmFsU3RhdHVzIHx8ICF0aGlzLmRldGFpbC5hcHByb3ZhbEVuYWJsZSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xyXG4gICAgdGhpcy5hcHByb3ZlQ29uZmlybSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBjb25maXJtQXBwcm92ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGF1ZGl0ID0gdGhpcy5zZWxlY3RlZEF1ZGl0O1xyXG4gICAgaWYgKCFhdWRpdCB8fCB0aGlzLmFwcHJvdmluZykgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGJ5VXNlciA9IHRoaXMuZlNjb3BlID09PSAnVGVhbXMnO1xyXG4gICAgdGhpcy5hcHByb3ZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdEdhbGxlcnlBcHByb3ZlKHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmRldGFpbC5kYXRlSXNvLFxyXG4gICAgICB0b0RhdGU6IHRoaXMuZGV0YWlsLmRhdGVJc28sXHJcbiAgICAgIHN0b3JlSWQ6IGJ5VXNlciA/IFtdIDogW3RoaXMuZGV0YWlsLnN0b3JlSWRdLFxyXG4gICAgICB1c2VyRW1haWw6IGJ5VXNlciA/IFt0aGlzLmRldGFpbC5lbWFpbF0gOiBbXSxcclxuICAgICAgc291cmNlQ2hlY2tMaXN0X2lkOiBhdWRpdC5faWQsXHJcbiAgICAgIGZpbHRlcnR5cGU6IHRoaXMuZlNjb3BlXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHByb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFwcHJvdmVDb25maXJtID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSB8fCAnQXVkaXQgYXBwcm92ZWQnKTtcclxuICAgICAgICAgIHRoaXMubG9hZFBhZ2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdOb3RoaW5nIGxlZnQgdG8gYXBwcm92ZSBmb3IgdGhpcyBzdWJtaXNzaW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHByb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QodGhpcy5lcnJvclRleHQoZXJyLCAnQ291bGQgbm90IGFwcHJvdmUgdGhpcyBhdWRpdCcpKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxBcHByb3ZlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHByb3ZlQ29uZmlybSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gRXhwb3J0ICgueGxzeDogYSBTdW1tYXJ5IHNoZWV0IGFuZCBhbiBBbnN3ZXJzIHNoZWV0KVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICB0b2dnbGVFeHBvcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cG9ydE9wZW4gPSAhdGhpcy5leHBvcnRPcGVuO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0Q3VycmVudCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwb3J0T3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKCF0aGlzLnJlY29yZCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGQgPSB0aGlzLmRldGFpbDtcclxuICAgIHRoaXMud3JpdGVFeHBvcnQoW3RoaXMucmVjb3JkXSwgW3RoaXMuZk5hbWUsIGQuc3RvcmVOYW1lLCBkLmRhdGVJc29dLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnRBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cG9ydE9wZW4gPSBmYWxzZTtcclxuICAgIGlmICghdGhpcy5zY29wZVBheWxvYWQgfHwgIXRoaXMudG90YWwgfHwgdGhpcy5leHBvcnRpbmcpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCB3YW50ZWQgPSBNYXRoLm1pbih0aGlzLnRvdGFsLCBFWFBPUlRfTUFYKTtcclxuICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKHdhbnRlZCAvIEVYUE9SVF9QQUdFKTtcclxuICAgIGNvbnN0IHJlY29yZHM6IGFueVtdID0gW107XHJcbiAgICBjb25zdCBzY29wZU5hbWUgPSBbdGhpcy5mTmFtZSwgdGhpcy5mU3RhcnQgKyAnIHRvICcgKyAodGhpcy5mRW5kIHx8IHRoaXMuZlN0YXJ0KV0uam9pbignIC0gJyk7XHJcbiAgICB0aGlzLmV4cG9ydGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBmZXRjaCA9IChwYWdlOiBudW1iZXIpID0+IHtcclxuICAgICAgdGhpcy5hbnN3ZXJzUmVxdWVzdChwYWdlLCBFWFBPUlRfUEFHRSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBiYXRjaCA9IHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGE/LmNoZWNrbGlzdEFuc3dlcnMgfHwgW10gOiBbXTtcclxuICAgICAgICAgIHJlY29yZHMucHVzaCguLi5iYXRjaCk7XHJcbiAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSBFWFBPUlRfUEFHRSAmJiBwYWdlICsgMSA8IHBhZ2VzKSB7XHJcbiAgICAgICAgICAgIGZldGNoKHBhZ2UgKyAxKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5leHBvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghcmVjb3Jkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdObyBzdWJtaXNzaW9ucyB0byBleHBvcnQnKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMud3JpdGVFeHBvcnQocmVjb3Jkcy5zbGljZSgwLCBFWFBPUlRfTUFYKSwgc2NvcGVOYW1lKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMudG90YWwgPiBFWFBPUlRfTUFYKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0V4cG9ydGVkIHRoZSBsYXRlc3QgJyArIEVYUE9SVF9NQVggKyAnIG9mICcgKyB0aGlzLnRvdGFsICsgJyBzdWJtaXNzaW9ucy4gTmFycm93IHRoZSBkYXRlIHJhbmdlIGZvciB0aGUgcmVzdC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5leHBvcnRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRXhwb3J0IGZhaWxlZC4gVHJ5IGFnYWluLicpO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICBmZXRjaCgwKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIENTViAvIFBERiAvIFBQVCAvIFpJUDogUE9TVCAvdHJheC9hdWRpdC9nYWxsZXJ5L2Rvd25sb2FkLCB0aGUgYXVkaXQgY29weSBvZiB0aGUgY2hlY2tsaXN0IGRvd25sb2FkSW5zZXJ0XHJcbiAgLy8gKGNoZWNrcyB0aGUgaWQgaXMgYSBsaXZlIGF1ZGl0IHdpdGggc3VibWlzc2lvbnMgZm9yIHRoZXNlIGZpbHRlcnMsIHRoZW4gcXVldWVzIHRoZSBzYW1lIHJlcG9ydCBqb2IpLlxyXG4gIC8vIFRoZSBmaWxlIGlzIGJ1aWx0IGluIHRoZSBiYWNrZ3JvdW5kIGFuZCBsYW5kcyBpbiBOb3RpZmljYXRpb25zID4gRG93bmxvYWRzLlxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogVGlja2VkIGxlZnQtcGFuZWwgcXVlc3Rpb25zLCBncm91cGVkIGJ5IHNlY3Rpb24gYXMgdGhlIHYxIGdhbGxlcnkgc2VuZHMgdGhlbSAoW10gPSBldmVyeSBxdWVzdGlvbikuICovXHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFF1ZXN0aW9uc1BheWxvYWQoKTogQXJyYXk8eyBzZWN0aW9uTmFtZTogc3RyaW5nOyBxdWVzdGlvbnM6IHN0cmluZ1tdOyBhbnN3ZXJUeXBlOiBzdHJpbmdbXSB9PiB7XHJcbiAgICBjb25zdCBvdXQ6IEFycmF5PHsgc2VjdGlvbk5hbWU6IHN0cmluZzsgcXVlc3Rpb25zOiBzdHJpbmdbXTsgYW5zd2VyVHlwZTogc3RyaW5nW10gfT4gPSBbXTtcclxuICAgIHRoaXMucXVlc3Rpb25TZWN0aW9ucy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICBjb25zdCBwaWNrZWQgPSBzLnF1ZXN0aW9ucy5maWx0ZXIocSA9PiB0aGlzLnNlbGVjdGVkSWRzLmhhcyhxLmtleSkpO1xyXG4gICAgICBpZiAocGlja2VkLmxlbmd0aCkge1xyXG4gICAgICAgIG91dC5wdXNoKHsgc2VjdGlvbk5hbWU6IHMubmFtZSwgcXVlc3Rpb25zOiBwaWNrZWQubWFwKHEgPT4gcS50ZXh0LnJlcGxhY2UoL1xcbi9nLCAnICcpKSwgYW5zd2VyVHlwZTogcGlja2VkLm1hcChxID0+IHEuYW5zd2VyVHlwZSkgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG91dDtcclxuICB9XHJcblxyXG4gIC8qKiBBdWRpdCBleHBvcnQgcmVxdWVzdCBmb3IgdGhpcyBhdWRpdCBhbmQgdGhlIGFwcGxpZWQgZmlsdGVycyAodGhlIGZpZWxkcyBhdWRpdERvd25sb2FkVmFsaWRhdGlvbiBhY2NlcHRzKS4gKi9cclxuICBwcml2YXRlIGRvd25sb2FkUGF5bG9hZChmaWxlVHlwZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCBwID0gdGhpcy5zY29wZVBheWxvYWQgfHwge307XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgc291cmNlQ2hlY2tMaXN0X2lkOiB0aGlzLnNlbGVjdGVkQXVkaXQ/Ll9pZCB8fCAnJyxcclxuICAgICAgZnJvbURhdGU6IHRoaXMuZlN0YXJ0LFxyXG4gICAgICB0b0RhdGU6IHRoaXMuZkVuZCB8fCB0aGlzLmZTdGFydCxcclxuICAgICAgZmlsZVR5cGUsXHJcbiAgICAgIGZpbHRlcnR5cGU6IHRoaXMuZlNjb3BlID09PSAnVGVhbXMnID8gJ1RlYW1zJyA6ICdDbHVzdGVycycsXHJcbiAgICAgIHN0b3JlSWRzOiBwWydzdG9yZUlkJ10gfHwgW10sXHJcbiAgICAgIHVzZXJFbWFpbExpc3Q6IHBbJ3VzZXJFbWFpbCddIHx8IFtdLFxyXG4gICAgICBxdWVzdGlvbnM6IHRoaXMuc2VsZWN0ZWRRdWVzdGlvbnNQYXlsb2FkKCksXHJcbiAgICAgIGFuc3dlclR5cGU6IHBbJ2Fuc3dlclR5cGUnXSB8fCAnYWxsJyxcclxuICAgICAgYXBwcm92ZUZpbHRlcjogcFsnYXBwcm92ZUZpbHRlciddIHx8ICdhbGwnLFxyXG4gICAgICB2aWV3RmxhZzogISFwWyd2aWV3RmxhZyddLFxyXG4gICAgICB2aWV3UmVkbzogISFwWyd2aWV3UmVkbyddLFxyXG4gICAgICBwcmV2aWV3VHlwZTogJ2ltYWdlJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG93bmxvYWRRdWV1ZWRUb2FzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFxyXG4gICAgICAnPGRpdj48c3BhbiBjbGFzcz1cIm1lLThcIj5Eb3dubG9hZGluZyB5b3VyIHJlcG9ydHM8L3NwYW4+PGEgaHJlZj1cIm5vdGlmaWNhdGlvbnMvYWxlcnRzP3RhYj1kb3dubG9hZFwiIHN0eWxlPVwiY29sb3I6Izk5YzNmZjsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsgY3Vyc29yOnBvaW50ZXJcIj5WaWV3PC9hPjwvZGl2PidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogRXhwb3J0cyBuZWVkIGxvYWRlZCByZXN1bHRzOiBzYXkgd2h5IGluc3RlYWQgb2YgZG9pbmcgbm90aGluZy4gKi9cclxuICBwcml2YXRlIGV4cG9ydEJsb2NrZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nIHx8ICF0aGlzLnNjb3BlUGF5bG9hZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QodGhpcy5zZWxlY3RlZEF1ZGl0ID8gJ1N1Ym1pc3Npb25zIGFyZSBzdGlsbCBsb2FkaW5nLCB0cnkgYWdhaW4gaW4gYSBtb21lbnQnIDogJ1BpY2sgYW4gYXVkaXQgdG8gZXhwb3J0Jyk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnRvdGFsKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gc3VibWlzc2lvbnMgdG8gZXhwb3J0IGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVycycpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBDU1YgYW5kIFBERiBhcmUgcXVldWVkIHN0cmFpZ2h0IGF3YXksIGFzIGluIHRoZSB2MSBnYWxsZXJ5LiAqL1xyXG4gIGV4cG9ydEZpbGUoZmlsZVR5cGU6ICdjc3YnIHwgJ3BkZicpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwb3J0T3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZXhwb3J0aW5nKSB7IHJldHVybjsgfVxyXG4gICAgaWYgKHRoaXMuZXhwb3J0QmxvY2tlZCgpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5leHBvcnRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdEdhbGxlcnlEb3dubG9hZCh0aGlzLmRvd25sb2FkUGF5bG9hZChmaWxlVHlwZSkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmV4cG9ydGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkgeyB0aGlzLmRvd25sb2FkUXVldWVkVG9hc3QoKTsgfSBlbHNlIHsgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuZXJyb3JUZXh0KHsgZXJyb3I6IHJlcyB9LCAnQ291bGQgbm90IHN0YXJ0IHRoZSBleHBvcnQnKSk7IH1cclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmV4cG9ydGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmVycm9yVGV4dChlLCAnQ291bGQgbm90IHN0YXJ0IHRoZSBleHBvcnQnKSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUFBUIGFuZCBaSVAgb3BlbiB0aGUgdjEgZXhwb3J0IHBvcHVwIChkYXRlIHJhbmdlIC8gcHJldmlldyB0eXBlKSB0aGF0IHRoZW4gcXVldWVzIHRoZSBqb2IuIFBQVCBrZWVwc1xyXG4gICAqIHRoZSB2MSBsaW1pdHM6IGEgMS0zIGRheSByYW5nZSBhbGxvd3MgYXQgbW9zdCAzIHF1ZXN0aW9ucyAoMSBxdWVzdGlvbiBmb3IgMyBkYXlzKTsgcGljayB0aGVtIG9uIHRoZSBsZWZ0LlxyXG4gICAqL1xyXG4gIGV4cG9ydFdpdGhPcHRpb25zKGZpbGVUeXBlOiAncHB0JyB8ICd6aXBmaWxlcycpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwb3J0T3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZXhwb3J0QmxvY2tlZCgpKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgbGFiZWwgPSBmaWxlVHlwZSA9PT0gJ3BwdCcgPyAnRXhwb3J0IGFzIFBQVCcgOiAnRXhwb3J0IGFzIFpJUCc7XHJcbiAgICBpZiAoZmlsZVR5cGUgPT09ICdwcHQnKSB7XHJcbiAgICAgIGNvbnN0IGRheXMgPSBkYXlqcyh0aGlzLmZFbmQgfHwgdGhpcy5mU3RhcnQpLmRpZmYoZGF5anModGhpcy5mU3RhcnQpLCAnZGF5Jyk7XHJcbiAgICAgIGNvbnN0IHBpY2tlZCA9IHRoaXMuc2VsZWN0ZWRRdWVzdGlvbnNQYXlsb2FkKCkucmVkdWNlKChuLCBzKSA9PiBuICsgcy5xdWVzdGlvbnMubGVuZ3RoLCAwKTtcclxuICAgICAgaWYgKGRheXMgPT09IDIgJiYgcGlja2VkID4gMSkgeyB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BsZWFzZSBzZWxlY3QgbWF4aW11bSBvZiAxIHF1ZXN0aW9uIG9ubHknKTsgcmV0dXJuOyB9XHJcbiAgICAgIGlmIChkYXlzIDw9IDEgJiYgcGlja2VkID4gMykgeyB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BsZWFzZSBzZWxlY3QgbWF4aW11bSBvZiAzIHF1ZXN0aW9uIG9ubHknKTsgcmV0dXJuOyB9XHJcbiAgICB9XHJcbiAgICBjb25zdCByZWYgPSB0aGlzLm1vZGFsLm9wZW4oRXhwb3J0R2FsbGVyeUNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJywgc2Nyb2xsYWJsZTogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnLCB3aW5kb3dDbGFzczogJ2N1c3RvbS1oZWlnaHQtbW9kYWwnXHJcbiAgICB9KTtcclxuICAgIHJlZi5jb21wb25lbnRJbnN0YW5jZS50eXBlID0gbGFiZWw7XHJcbiAgICByZWYuY29tcG9uZW50SW5zdGFuY2UucGF5bG9hZCA9IHRoaXMuZG93bmxvYWRQYXlsb2FkKGZpbGVUeXBlKTtcclxuICAgIHJlZi5jb21wb25lbnRJbnN0YW5jZS5leHBvcnRnYWxsZXJ5UGRmID0gZmFsc2U7XHJcbiAgICByZWYuY29tcG9uZW50SW5zdGFuY2Uuc3VibWl0Rm4gPSAocGF5bG9hZDogYW55KSA9PiB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0R2FsbGVyeURvd25sb2FkKHBheWxvYWQpO1xyXG4gICAgcmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0ID09PSAnc3VjY2VzcycpIHsgdGhpcy5kb3dubG9hZFF1ZXVlZFRvYXN0KCk7IH1cclxuICAgICAgZWxzZSBpZiAocmVzdWx0ID09PSAnZXJyb3InKSB7IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IHN0YXJ0IHRoZSBleHBvcnQnKTsgfVxyXG4gICAgfSwgKCkgPT4geyAvKiBkaXNtaXNzZWQgKi8gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdyaXRlRXhwb3J0KHJlY29yZHM6IGFueVtdLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN1bW1hcnk6IGFueVtdID0gW107XHJcbiAgICBjb25zdCBhbnN3ZXJzOiBhbnlbXSA9IFtdO1xyXG4gICAgcmVjb3Jkcy5mb3JFYWNoKHJlY29yZCA9PiB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSByZWNvcmQuY2hlY2tsaXN0SW5mbyB8fCB7fTtcclxuICAgICAgY29uc3Qgc3RvcmUgPSByZWNvcmQuc3RvcmVQcm9maWxlIHx8IHt9O1xyXG4gICAgICBjb25zdCByb3dzOiBBbnN3ZXJSb3dbXSA9IChyZWNvcmQucXVlc3Rpb25BbnN3ZXIgfHwgW10pLmZsYXRNYXAoKHM6IGFueSkgPT5cclxuICAgICAgICAocy5xdWVzdGlvbnMgfHwgW10pLm1hcCgocTogYW55KSA9PiB0aGlzLnRvUm93KHMuc2VjdGlvbk5hbWUsIHEpKSk7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gTnVtYmVyKGluZm8ubm9vZlF1ZXN0aW9ucykgfHwgcm93cy5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gdGhpcy5udW0oaW5mby5xdWVzdGlvbkZsYWcpID8/IHJvd3MuZmlsdGVyKHIgPT4gci5mbGFnZ2VkKS5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5udW0oaW5mby5jb21wbGlhbmNlU2NvcmUpID8/IHRoaXMuZmxhZ1Njb3JlKGNvdW50LCBmbGFncyk7XHJcbiAgICAgIC8vIE5vIHF1ZXN0aW9uIHdpdGggY29tcGxpYW5jZSBzY29yaW5nOiBubyBzY29yZSBhbmQgbm8gcmVzdWx0IChibGFuayBjZWxscyksIGFzIG9uIHRoZSBwYWdlLlxyXG4gICAgICBjb25zdCBzY29yZWQgPSB0aGlzLmNvbXBsaWFuY2VPbihyZWNvcmQpO1xyXG4gICAgICBjb25zdCBiYXNlID0geyAnU3RvcmUgTmFtZSc6IHN0b3JlLnN0b3JlTmFtZSB8fCBzdG9yZS5zdG9yZV9pZCB8fCAnJywgJ0RhdGUnOiBpbmZvLmRhdGUgfHwgJycgfTtcclxuICAgICAgc3VtbWFyeS5wdXNoKHtcclxuICAgICAgICAuLi5iYXNlLFxyXG4gICAgICAgICdMb2NhdGlvbic6IFtzdG9yZS5jaXR5LCBzdG9yZS5zdGF0ZSwgc3RvcmUuQ291bnRyeV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyksXHJcbiAgICAgICAgJ0F1ZGl0JzogaW5mby5jaGVja2xpc3ROYW1lIHx8IHRoaXMuZk5hbWUsXHJcbiAgICAgICAgJ1RpbWUnOiBpbmZvLnRpbWUgfHwgJycsXHJcbiAgICAgICAgJ0R1cmF0aW9uJzogaW5mby5kdXJhdGlvbiB8fCAnJyxcclxuICAgICAgICAnU3VibWl0dGVkIEJ5JzogaW5mby5zdWJtaXR0ZWRCeSB8fCAnJyxcclxuICAgICAgICAnRW1haWwnOiBpbmZvLnVzZXJFbWFpbCB8fCAnJyxcclxuICAgICAgICAnUXVlc3Rpb25zJzogY291bnQsXHJcbiAgICAgICAgJ0ZsYWdnZWQnOiBmbGFncyxcclxuICAgICAgICAnUmV2aXNlZCc6IHJvd3MuZmlsdGVyKHIgPT4gci5yZXZpc2VkKS5sZW5ndGgsXHJcbiAgICAgICAgJ0NvbXBsaWFuY2UgU2NvcmUgKCUpJzogc2NvcmVkID8gc2NvcmUgOiAnJyxcclxuICAgICAgICAnUmVzdWx0Jzogc2NvcmVkID8gKHNjb3JlID49IHRoaXMucGFzc1RocmVzaG9sZCA/IHRoaXMubGFiZWxzLnBhc3MgOiB0aGlzLmxhYmVscy5mYWlsKSA6ICcnLFxyXG4gICAgICAgICdBcHByb3ZhbCc6IGluZm8uYXBwcm92YWxTdGF0dXMgPyAnQXBwcm92ZWQnICsgKGluZm8uYXBwcm92YWxCeU5hbWUgPyAnIGJ5ICcgKyBpbmZvLmFwcHJvdmFsQnlOYW1lIDogJycpIDogKGluZm8uYXBwcm92YWxFbmFibGUgPyAnUGVuZGluZycgOiAnTm90IHJlcXVpcmVkJylcclxuICAgICAgfSk7XHJcbiAgICAgIHJvd3MuZm9yRWFjaChyID0+IGFuc3dlcnMucHVzaCh7XHJcbiAgICAgICAgLi4uYmFzZSxcclxuICAgICAgICAnU2VjdGlvbic6IHIuc2VjdGlvbixcclxuICAgICAgICAnUS5Obyc6IHIucW5vLFxyXG4gICAgICAgICdRdWVzdGlvbic6IHIudGV4dCxcclxuICAgICAgICAnQW5zd2VyJzogdGhpcy5hY3R1YWxBbnN3ZXIociksXHJcbiAgICAgICAgJ1ZhbGlkYXRpb24gQW5zd2VyJzogci52YWxpZGF0aW9uVGV4dCxcclxuICAgICAgICAnU2NvcmUnOiByLmFjdHVhbFNjb3JlID8/ICcnLFxyXG4gICAgICAgICdGbGFnZ2VkJzogci5mbGFnZ2VkID8gJ1llcycgOiAnTm8nLFxyXG4gICAgICAgICdSZXZpc2VkIEFuc3dlcic6IHIucmV2aXNlZD8uYW5zd2VyIHx8ICcnLFxyXG4gICAgICAgICdSZXZpc2VkIFNjb3JlJzogci5yZXZpc2VkID8gKHIucmV2aXNlZC5zY29yZSA/PyAnJykgOiAnJyxcclxuICAgICAgICAnUmVhc29uIGZvciBDaGFuZ2UnOiByLnJldmlzZWQ/LnJlYXNvbiB8fCAnJyxcclxuICAgICAgICAnUmV2aXNlZCBCeSc6IHIucmV2aXNlZD8uYnkgfHwgJycsXHJcbiAgICAgICAgW3RoaXMubGFiZWxzLnJlbWFya3NdOiByLnJlbWFyayxcclxuICAgICAgICBbdGhpcy5sYWJlbHMuYWRkaXRpb25hbF06IHIuZXh0cmFSZW1hcmssXHJcbiAgICAgICAgJ0ltYWdlcyc6IHIuaW1hZ2VzLmpvaW4oJyAnKSxcclxuICAgICAgICAnVmlkZW9zJzogci52aWRlb3Muam9pbignICcpXHJcbiAgICAgIH0pKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZmlsZSA9IChuYW1lIHx8ICdBdWRpdCBnYWxsZXJ5JykucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxdKy9nLCAnLScpLnNsaWNlKDAsIDEyMCk7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFdvcmtib29rKFt7IG5hbWU6ICdTdW1tYXJ5Jywgcm93czogc3VtbWFyeSB9LCB7IG5hbWU6ICdBbnN3ZXJzJywgcm93czogYW5zd2VycyB9XSwgZmlsZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5SWQoXzogbnVtYmVyLCBxOiB7IGtleTogc3RyaW5nIH0pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHEua2V5O1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeU9wdGlvbihfOiBudW1iZXIsIG9wdDogRmlsdGVyT3B0aW9uKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBvcHQudmFsdWUgPz8gb3B0LmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeURlZihfOiBudW1iZXIsIGRlZjogRmlsdGVyRGVmKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkZWYuaWQ7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5TGFiZWwoXzogbnVtYmVyLCBvOiB7IGxhYmVsOiBzdHJpbmcgfSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gby5sYWJlbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImF2Mi1wYWdlIGF1ZGl0LWdhbGxlcnlcIj5cclxuXHJcbiAgPCEtLSBIZWFkZXIgYmFyIHdpdGggcXVpY2sgc2VsZWN0cyAtLT5cclxuICA8c2VjdGlvbiBjbGFzcz1cImdhbC1oZWFkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJnYWwtaGVhZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWhlYWRlci10aXRsZVwiPkdhbGxlcnk8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImdhbC1oZWFkZXItc3ViXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRvdGFsXCI+e3sgdG90YWwgfX0ge3sgdG90YWwgPT09IDEgPyAnc3VibWlzc2lvbicgOiAnc3VibWlzc2lvbnMnIH19IMK3IDwvbmctY29udGFpbmVyPnt7IHJhbmdlTGFiZWwgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2hldnJvbnMgYXJlIFNWR3MsIG5vdCB0ZXh0IGdseXBocywgc28gdGhleSBzaXQgb24gdGhlIGNoaXAncyBjZW50cmUgbGluZS4gLS0+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrY2hpcCBjaGlwLW9uXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKCd0eXBlJylcIj5cclxuICAgICAge3sgZlR5cGUgfX1cclxuICAgICAgPHN2ZyBjbGFzcz1cImNoaXAtY2hldlwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWlja2NoaXAgcXVpY2tjaGlwLS1uYW1lXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKCduYW1lJylcIiBbdGl0bGVdPVwiZk5hbWVcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJxdWlja2NoaXAtbGFiZWxcIj57eyBmTmFtZSB8fCAnU2VsZWN0IGF1ZGl0JyB9fTwvc3Bhbj5cclxuICAgICAgPHN2ZyBjbGFzcz1cImNoaXAtY2hldlwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWlja2NoaXAgY2hpcC1vblwiICpuZ0lmPVwiZGF0ZVBpY2tlZFwiIChjbGljayk9XCJvcGVuRmlsdGVycygnZGF0ZScpXCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCI1XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE2XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgIDxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT5cclxuICAgICAgICA8bGluZSB4MT1cIjhcIiB5MT1cIjNcIiB4Mj1cIjhcIiB5Mj1cIjZcIj48L2xpbmU+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiM1wiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgICB7eyByYW5nZUxhYmVsIH19XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrY2hpcFwiIChjbGljayk9XCJvcGVuU2NvcGVGaWx0ZXIoKVwiPlxyXG4gICAgICB7eyBzdG9yZVN1bW1hcnkgfX1cclxuICAgICAgPHN2ZyBjbGFzcz1cImNoaXAtY2hldlwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWlja2NoaXAgcXVpY2tjaGlwLS1zdHJvbmdcIiAoY2xpY2spPVwib3BlbkZpbHRlcnMoKVwiPlxyXG4gICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCI0XCIgeTE9XCI3XCIgeDI9XCIyMFwiIHkyPVwiN1wiPjwvbGluZT5cclxuICAgICAgICA8bGluZSB4MT1cIjdcIiB5MT1cIjEyXCIgeDI9XCIxN1wiIHkyPVwiMTJcIj48L2xpbmU+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxMFwiIHkxPVwiMTdcIiB4Mj1cIjE0XCIgeTI9XCIxN1wiPjwvbGluZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIEFsbCBGaWx0ZXJzXHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRiYWRnZVwiICpuZ0lmPVwiYWN0aXZlRmlsdGVyQ291bnRcIj57eyBhY3RpdmVGaWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGF2Mi1idG4tLXNtIGF2Mi1idG4tLXdpZGVcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIj5cclxuICAgICAgQXBwbHlcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvc2VjdGlvbj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImdhbC1ib2R5XCI+XHJcblxyXG4gICAgPCEtLSBRdWVzdGlvbiBuYXZpZ2F0aW9uIC0tPlxyXG4gICAgPCEtLSBUaGUgd2hpdGUgY29sdW1uIHJ1bnMgdGhlIGZ1bGwgaGVpZ2h0IG9mIHRoZSByaWdodCBjYXJkOyBpdHMgY29udGVudCBzdGF5cyBpbiB2aWV3IHdoaWxlIHNjcm9sbGluZy4gLS0+XHJcbiAgICA8YXNpZGUgY2xhc3M9XCJnYWwtbGVmdFwiIFtjbGFzcy5pcy1jb2xsYXBzZWRdPVwibmF2Q29sbGFwc2VkXCI+XHJcbiAgICAgIDwhLS0gwqsgaGlkZXMgdGhlIHBhbmVsICh2MSBzaWRlbmF2KTsgwrsgaW4gdGhlIHRvb2xiYXIgYnJpbmdzIGl0IGJhY2suIC0tPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbC1uYXYtdG9nZ2xlXCIgKm5nSWY9XCIhbmF2Q29sbGFwc2VkXCIgKGNsaWNrKT1cInRvZ2dsZU5hdigpXCJcclxuICAgICAgICB0aXRsZT1cIkhpZGUgcXVlc3Rpb25zXCIgYXJpYS1sYWJlbD1cIkhpZGUgcXVlc3Rpb25zXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTEgMTdMNiAxMkwxMSA3TTE4IDE3TDEzIDEyTDE4IDdcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWxlZnQtaW5uZXJcIiAqbmdJZj1cIiFuYXZDb2xsYXBzZWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImdhbC1sZWZ0LWhlYWRcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXRpdGxlXCIgKm5nSWY9XCJuYXZMb2FkaW5nICYmICFmTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWF1ZGl0LW5hbWVcIiAqbmdJZj1cIiFuYXZMb2FkaW5nIHx8IGZOYW1lXCI+e3sgZk5hbWUgfHwgJ05vIGF1ZGl0IHNlbGVjdGVkJyB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYXVkaXQtc3ViXCIgKm5nSWY9XCJkZXRhaWwuc3VidGl0bGVcIj57eyBkZXRhaWwuc3VidGl0bGUgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE5vIHN1Ym1pc3Npb24gZm9yIHRoZSBmaWx0ZXJzIChlLmcuIHRoZSBsYXN0IG9uZSB3YXMganVzdCBhcHByb3ZlZCB1bmRlciBcIk5vdCBBcHByb3ZlZFwiKTpcclxuICAgICAgICAgICBub3RoaW5nIHRvIG5hdmlnYXRlLCBzbyB0aGUgcXVlc3Rpb24gbGlzdCBnb2VzIHdpdGggaXQuIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLW5hdi1lbXB0eVwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgIWhhc1N1Ym1pc3Npb25cIj5ObyBzdWJtaXNzaW9ucyBmb3IgdGhlIHNlbGVjdGVkIGZpbHRlcnMuPC9kaXY+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyB8fCBoYXNTdWJtaXNzaW9uXCI+XHJcbiAgICAgIDwhLS0gQ2xlYXJzIGFueSBxdWVzdGlvbiBzZWxlY3Rpb24uIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidmlldy1hbGxcIiBbY2xhc3MuaXMtYWN0aXZlXT1cIiFoYXNTZWxlY3Rpb25cIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctYWxsLWxpbmtcIiAoY2xpY2spPVwidmlld0FsbEFuc3dlcnMoKVwiPlZpZXcgQWxsIEFuc3dlcnM8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFNlY3Rpb24gYWNjb3JkaW9uOiBvbmUgb3BlbiBhdCBhIHRpbWUuIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXNlY3Rpb25zXCI+XHJcbiAgICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibmF2TG9hZGluZ1wiIFtyb3dzXT1cIjNcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW5hdkxvYWRpbmdcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIHNlY3Rpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5U2VjdGlvblwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnYWwtc2VjdGlvblwiIFtjbGFzcy5pcy1vcGVuXT1cIm9wZW5TZWN0aW9uID09PSBpXCIgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oaSlcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtc2VjdGlvbi1uYW1lXCI+e3sgcy5uYW1lIH19PHNwYW4gY2xhc3M9XCJnYWwtc2VjdGlvbi1wb2ludHNcIiAqbmdJZj1cInNlY3Rpb25Qb2ludHMocykgYXMgcHRzXCJcclxuICAgICAgICAgICAgICB0aXRsZT1cIkNvbXBsaWFuY2UgcG9pbnRzIGVhcm5lZCAvIHBvc3NpYmxlIGluIHRoaXMgc2VjdGlvblwiPnt7IHB0cyB9fTwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwhLS0gVGlja3Mgc3RheSB3aGVuIGEgc2VjdGlvbiBpcyBjb2xsYXBzZWQ7IHRoZSBjb3VudCBzaG93cyB0aGV5IGFyZSBzdGlsbCBuYXJyb3dpbmcgdGhlIGFuc3dlcnMuIC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1zZWN0aW9uLWNvdW50XCIgKm5nSWY9XCJzZWN0aW9uUGlja2VkKHMpIGFzIG5cIiBbYXR0ci50aXRsZV09XCJuICsgJyBzZWxlY3RlZCBpbiB0aGlzIHNlY3Rpb24nXCI+e3sgbiB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtc2VjdGlvbi1ydWxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1zZWN0aW9uLWNoZXZcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgW2NsYXNzLnJvdGF0ZV09XCJvcGVuU2VjdGlvbiAhPT0gaVwiPlxyXG4gICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZW5TZWN0aW9uID09PSBpXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2FsLW5hdi1pdGVtXCIgKm5nRm9yPVwibGV0IHEgb2Ygcy5xdWVzdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLXBpY2tlZF09XCJpc1F1ZXN0aW9uU2VsZWN0ZWQocSlcIiAoY2xpY2spPVwidG9nZ2xlUXVlc3Rpb24ocSlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1jaGVja1wiIFtjbGFzcy5pcy1vbl09XCJpc1F1ZXN0aW9uU2VsZWN0ZWQocSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1F1ZXN0aW9uU2VsZWN0ZWQocSlcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtbmF2LXRleHRcIj57eyBxLnFubyB9fSAuIHt7IHEudGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1kb3QgZ2FsLWRvdC0tZmxhZ1wiICpuZ0lmPVwiaXNGbGFnZ2VkKHEpXCIgdGl0bGU9XCJGbGFnZ2VkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2FsLWRvdCBnYWwtZG90LS1yZXZpc2VkXCIgKm5nSWY9XCJpc1JldmlzZWQocSlcIiB0aXRsZT1cIlJldmlzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLW5hdi1lbXB0eVwiICpuZ0lmPVwiIXMucXVlc3Rpb25zLmxlbmd0aFwiPk5vIHF1ZXN0aW9ucyBpbiB0aGlzIHNlY3Rpb248L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtbmF2LWVtcHR5XCIgKm5nSWY9XCIhc2VjdGlvbnMubGVuZ3RoXCI+Tm8gcXVlc3Rpb25zIGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVyczwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9hc2lkZT5cclxuXHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImdhbC1tYWluXCI+XHJcbiAgICAgIDwhLS0gUGFnZXIgKyBleHBvcnQgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtdG9vbGJhclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2FsLW5hdi10b2dnbGUgZ2FsLW5hdi10b2dnbGUtLW9wZW5cIiAqbmdJZj1cIm5hdkNvbGxhcHNlZFwiIChjbGljayk9XCJ0b2dnbGVOYXYoKVwiXHJcbiAgICAgICAgICB0aXRsZT1cIlNob3cgcXVlc3Rpb25zXCIgYXJpYS1sYWJlbD1cIlNob3cgcXVlc3Rpb25zXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTEzIDE3TDE4IDEyTDEzIDdNNiAxN0wxMSAxMkw2IDdcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1wYWdlclwiICpuZ0lmPVwidG90YWxcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2FsLXBhZ2VyLWJ0blwiIFtkaXNhYmxlZF09XCIhY2FuUHJldlwiIChjbGljayk9XCJwcmV2UGFnZSgpXCIgdGl0bGU9XCJQcmV2aW91cyBzdWJtaXNzaW9uXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjE1IDE4IDkgMTIgMTUgNlwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC1wYWdlci1sYWJlbFwiPlN1Ym1pc3Npb24gPHN0cm9uZz57eyBwYWdlTGFiZWwgfX08L3N0cm9uZz48L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbC1wYWdlci1idG5cIiBbZGlzYWJsZWRdPVwiIWNhbk5leHRcIiAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIHRpdGxlPVwiTmV4dCBzdWJtaXNzaW9uXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjkgMTggMTUgMTIgOSA2XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1waWxsIHN0YXR1cy1waWxsLS13YXJuaW5nXCIgKm5nSWY9XCIhbG9hZGluZyAmJiBoYXNTdWJtaXNzaW9uICYmIGRldGFpbC5zdGF0dXMgIT09ICdzdWJtaXQnXCI+UmUtZG8gcmVxdWVzdGVkPC9zcGFuPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwb3J0LXdyYXBcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGF2Mi1idG4tLXNtIGdhbC1leHBvcnRcIiBbZGlzYWJsZWRdPVwiZXhwb3J0aW5nIHx8ICF0b3RhbFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFeHBvcnQoKVwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiZXhwb3J0T3BlblwiPlxyXG4gICAgICAgICAgICB7eyBleHBvcnRpbmcgPyAnRXhwb3J0aW5n4oCmJyA6ICdFeHBvcnQnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJleHBvcnQtbWVudVwiICpuZ0lmPVwiZXhwb3J0T3BlblwiIHJvbGU9XCJtZW51XCI+XHJcbiAgICAgICAgICAgIDwhLS0gRXhjZWw6IGJ1aWx0IGhlcmUsIGRvd25sb2FkcyByaWdodCBhd2F5IChoaWRkZW4gZm9yIG5vdywgc2VlIHNob3dFeGNlbEV4cG9ydCkgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RXhjZWxFeHBvcnRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwb3J0LWdyb3VwXCI+RXhjZWwgKC54bHN4KSDCtyBkb3dubG9hZHMgbm93PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJleHBvcnQtaXRlbVwiIHJvbGU9XCJtZW51aXRlbVwiIFtkaXNhYmxlZF09XCIhaGFzU3VibWlzc2lvblwiIChjbGljayk9XCJleHBvcnRDdXJyZW50KClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LXRpdGxlXCI+VGhpcyBzdWJtaXNzaW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBvcnQtbWV0YVwiPnt7IGRldGFpbC5zdG9yZU5hbWUgfX0gwrcge3sgZGV0YWlsLmRhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJleHBvcnQtaXRlbVwiIHJvbGU9XCJtZW51aXRlbVwiIChjbGljayk9XCJleHBvcnRBbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBvcnQtdGl0bGVcIj5BbGwge3sgdG90YWwgfX0ge3sgdG90YWwgPT09IDEgPyAnc3VibWlzc2lvbicgOiAnc3VibWlzc2lvbnMnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBvcnQtbWV0YVwiPkN1cnJlbnQgZmlsdGVycyDCtyBzdW1tYXJ5ICsgZXZlcnkgYW5zd2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSBDU1YgLyBQREYgLyBQUFQgLyBaSVA6IHRoZSB2MSBnYWxsZXJ5J3MgZG93bmxvYWQgc2VydmljZSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4cG9ydC1ncm91cFwiPlJlcG9ydCBmaWxlcyDCtyBOb3RpZmljYXRpb25zIOKAuiBEb3dubG9hZHM8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJleHBvcnQtaXRlbVwiIHJvbGU9XCJtZW51aXRlbVwiIChjbGljayk9XCJleHBvcnRGaWxlKCdjc3YnKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LXRpdGxlXCI+RXhwb3J0IGFzIENTVjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC1tZXRhXCI+Q3VycmVudCBmaWx0ZXJzPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJleHBvcnQtaXRlbVwiIHJvbGU9XCJtZW51aXRlbVwiIChjbGljayk9XCJleHBvcnRGaWxlKCdwZGYnKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LXRpdGxlXCI+RXhwb3J0IGFzIFBERjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC1tZXRhXCI+T25lIHJlcG9ydCBwZXIgc3VibWlzc2lvbjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZXhwb3J0LWl0ZW1cIiByb2xlPVwibWVudWl0ZW1cIiAoY2xpY2spPVwiZXhwb3J0V2l0aE9wdGlvbnMoJ3BwdCcpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJleHBvcnQtdGl0bGVcIj5FeHBvcnQgYXMgUFBUPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LW1ldGFcIj5UaWNrIHVwIHRvIDMgcXVlc3Rpb25zIG9uIHRoZSBsZWZ0PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJleHBvcnQtaXRlbVwiIHJvbGU9XCJtZW51aXRlbVwiIChjbGljayk9XCJleHBvcnRXaXRoT3B0aW9ucygnemlwZmlsZXMnKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXhwb3J0LXRpdGxlXCI+RXhwb3J0IGFzIFpJUDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV4cG9ydC1tZXRhXCI+UGhvdG9zIGFuZCB2aWRlb3M8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBMb2FkaW5nIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXNrZWxldG9uXCIgKm5nSWY9XCJsb2FkaW5nXCIgYXJpYS1idXN5PVwidHJ1ZVwiIGFyaWEtbGFiZWw9XCJMb2FkaW5nIHN1Ym1pc3Npb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2sgc2stbG9nb1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzayBzay1mYWN0c1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzayBzay1jYXJkXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNrIHNrLWNhcmRcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2sgc2stY2FyZCBzay1jYXJkLS1zaG9ydFwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRXJyb3IgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtc3RhdGVcIiAqbmdJZj1cIiFsb2FkaW5nICYmIGxvYWRFcnJvclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZ2FsLXN0YXRlLWljb24gZ2FsLXN0YXRlLWljb24tLWVycm9yXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjhcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyLjVcIj48L2xpbmU+XHJcbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1zdGF0ZS10aXRsZVwiPnt7IGxvYWRFcnJvciB9fTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIChjbGljayk9XCJyZXRyeSgpXCI+UmV0cnk8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE5vdGhpbmcgc3VibWl0dGVkIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXN0YXRlXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhbG9hZEVycm9yICYmICFoYXNTdWJtaXNzaW9uXCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtc3RhdGUtdGl0bGVcIj57eyBmTmFtZSA/ICdObyBzdWJtaXNzaW9ucyBmb3VuZCcgOiAobGlua01pc3NpbmcgPyAnQXVkaXQgbm90IGZvdW5kJyA6ICdObyBhdWRpdHMgdG8gc2hvdycpIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1zdGF0ZS1zdWJcIiAqbmdJZj1cImZOYW1lXCI+XHJcbiAgICAgICAgICBOb3RoaW5nIHdhcyBzdWJtaXR0ZWQgZm9yIDxzdHJvbmc+e3sgZk5hbWUgfX08L3N0cm9uZz4gYmV0d2VlbiB7eyByYW5nZUxhYmVsIH19IHdpdGggdGhlIGN1cnJlbnQgZmlsdGVycy5cclxuICAgICAgICAgIFRyeSBhIHdpZGVyIGRhdGUgcmFuZ2Ugb3IgYW5vdGhlciBzdG9yZS5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXN0YXRlLXN1YlwiICpuZ0lmPVwiIWZOYW1lICYmIGxpbmtNaXNzaW5nXCI+XHJcbiAgICAgICAgICBUaGUgYXVkaXQgeW91IG9wZW5lZCB3YXMgZGVsZXRlZCBvciBpcyBub3QgYW4gYXVkaXQuIFBpY2sgYW4gYXVkaXQgaW4gdGhlIGZpbHRlcnMgdG8gc2VlIGl0cyBzdWJtaXNzaW9ucy5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXN0YXRlLXN1YlwiICpuZ0lmPVwiIWZOYW1lICYmICFsaW5rTWlzc2luZ1wiPkNyZWF0ZSBhbiBhdWRpdCBpbiBNYW5hZ2UgdG8gc2VlIGl0cyBzdWJtaXNzaW9ucyBoZXJlLjwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiICpuZ0lmPVwiZk5hbWUgfHwgKGxpbmtNaXNzaW5nICYmIGF1ZGl0cy5sZW5ndGgpXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVycyhmTmFtZSA/ICdkYXRlJyA6ICduYW1lJylcIj57eyBmTmFtZSA/ICdDaGFuZ2UgZmlsdGVycycgOiAnUGljayBhbiBhdWRpdCcgfX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmcgJiYgaGFzU3VibWlzc2lvblwiPlxyXG4gICAgICAgIDwhLS0gQ2xpZW50IGJyYW5kIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYnJhbmRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2FsLWJyYW5kLWJveFwiIFtjbGFzcy5oYXMtbG9nb109XCJjbGllbnRMb2dvICYmICFsb2dvRmFpbGVkXCI+XHJcbiAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJjbGllbnRMb2dvICYmICFsb2dvRmFpbGVkXCIgW3NyY109XCJjbGllbnRMb2dvXCIgW2FsdF09XCJjbGllbnROYW1lIHx8ICdDbGllbnQgbG9nbydcIiAoZXJyb3IpPVwibG9nb0ZhaWxlZCA9IHRydWVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjbGllbnRMb2dvIHx8IGxvZ29GYWlsZWRcIj57eyBjbGllbnROYW1lIHx8ICdMb2dvJyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFdobyAvIHdoZXJlIC8gd2hlbiwgcmVhZCByb3cgYnkgcm93IGFjcm9zcyB0aGUgdHdvIGNvbHVtbnMgLS0+XHJcbiAgICAgICAgPGRsIGNsYXNzPVwiZ2FsLWZhY3RzXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3RcIj48ZHQ+U3RvcmUgTmFtZTo8L2R0PjxkZD57eyBkZXRhaWwuc3RvcmVOYW1lIH19PC9kZD48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtZmFjdCBnYWwtZmFjdC0tc2lkZVwiPjxkdD5EdXJhdGlvbjo8L2R0PjxkZD57eyBkZXRhaWwuZHVyYXRpb24gfX08L2RkPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1mYWN0XCI+PGR0PkF1ZGl0IE5hbWU6PC9kdD48ZGQ+e3sgZGV0YWlsLmF1ZGl0TmFtZSB9fTwvZGQ+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3QgZ2FsLWZhY3QtLXNpZGVcIj48ZHQ+RGF0ZTo8L2R0PjxkZD57eyBkZXRhaWwuZGF0ZSB9fTwvZGQ+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3RcIj48ZHQ+U3RhdGUgJmFtcDsgQ291bnRyeTo8L2R0PjxkZD57eyBkZXRhaWwucmVnaW9uIH19PC9kZD48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtZmFjdCBnYWwtZmFjdC0tc2lkZVwiPjxkdD5UaW1lOjwvZHQ+PGRkPnt7IGRldGFpbC50aW1lIH19PC9kZD48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtZmFjdFwiPjxkdD5Oby4gb2YgUXVlc3Rpb25zOjwvZHQ+PGRkPnt7IGRldGFpbC5xdWVzdGlvbkNvdW50IH19PC9kZD48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtZmFjdCBnYWwtZmFjdC0tc2lkZVwiPlxyXG4gICAgICAgICAgICA8ZHQ+Q29tcGxpYW5jZSBTY29yZTo8L2R0PlxyXG4gICAgICAgICAgICA8ZGQgKm5nSWY9XCJkZXRhaWwuY29tcGxpYW5jZUVuYWJsZWRcIiBbdGl0bGVdPVwiJ1Bhc3MgbWFyayAnICsgcGFzc1RocmVzaG9sZCArICclJ1wiPnt7IGNvbXBsaWFuY2VQZXJjZW50IH19JSA8c3BhbiBjbGFzcz1cImdhbC1yZXN1bHRcIiBbY2xhc3MuaXMtZmFpbF09XCIhcGFzc2VkXCI+KHt7IHJlc3VsdExhYmVsIH19KTwvc3Bhbj48L2RkPlxyXG4gICAgICAgICAgICA8IS0tIE5vIHF1ZXN0aW9uIG9mIHRoaXMgYXVkaXQgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbjogbm8gc2NvcmUgKHRoZSBmbGFnLWJhc2VkIHJ1bGUgd291bGQgcmVhZCAxMDAlKS4gLS0+XHJcbiAgICAgICAgICAgIDxkZCAqbmdJZj1cIiFkZXRhaWwuY29tcGxpYW5jZUVuYWJsZWRcIiB0aXRsZT1cIkNvbXBsaWFuY2Ugc2NvcmUgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgYXVkaXRcIj7igJQ8L2RkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWZhY3RcIj48ZHQ+U3VibWl0dGVkIEJ5OjwvZHQ+PGRkPnt7IGRldGFpbC5zdWJtaXR0ZWRCeSB9fTwvZGQ+PC9kaXY+XHJcbiAgICAgICAgICA8IS0tIHYxOiBzaG93biBvbmx5IHdoZW4gdGhlIHN1Ym1pdHRlciBhY2tub3dsZWRnZWQgd2l0aCBhIG5hbWU7IFZpZXcgUHJvb2YgYWxzbyB3aGVuIG9ubHkgYSBwaG90byBleGlzdHMuIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1mYWN0IGdhbC1mYWN0LS1zaWRlXCIgKm5nSWY9XCJkZXRhaWwuYWNrbm93bGVkZ2VkQnkgfHwgZGV0YWlsLnByb29mSW1hZ2VcIj5cclxuICAgICAgICAgICAgPGR0PkFja25vd2xlZGdlZCBCeTo8L2R0PlxyXG4gICAgICAgICAgICA8ZGQ+XHJcbiAgICAgICAgICAgICAge3sgZGV0YWlsLmFja25vd2xlZGdlZEJ5IHx8ICfigJQnIH19XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnYWwtcHJvb2YtbGlua1wiIChjbGljayk9XCJwcm9vZk9wZW4gPSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTEgMTJzNC04IDExLTggMTEgOCAxMSA4LTQgOC0xMSA4LTExLTgtMTEtOHpcIj48L3BhdGg+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICBWaWV3IFByb29mXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2RsPlxyXG5cclxuICAgICAgICA8IS0tIEFuc3dlcnMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1hbnN3ZXJzXCIgaWQ9XCJ2aWV3LWFsbFwiPlxyXG4gICAgICAgICAgPGFydGljbGUgY2xhc3M9XCJhbnN3ZXJib3hcIiAqbmdGb3I9XCJsZXQgcSBvZiB2aXNpYmxlUXVlc3Rpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuaXMtZmxhZ2dlZF09XCJxLmZsYWdnZWRcIiBbY2xhc3MuaXMtZWRpdGluZ109XCJpc0VkaXRpbmcocSlcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYW5pbWF0aW9uLWRlbGF5Lm1zXT1cImkgPCAxMCA/IGkgKiAzNSA6IDBcIj5cclxuICAgICAgICAgICAgPGhlYWRlciBjbGFzcz1cImFuc3dlcmJveC1oZWFkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInFzZWN0aW9uXCIgKm5nSWY9XCJzZWN0aW9ucy5sZW5ndGggPiAxXCI+e3sgcS5zZWN0aW9uIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge3sgcS5xbm8gfX0ue3sgcS50ZXh0IH19XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInFkZXNjXCIgKm5nSWY9XCJxLmRlc2NyaXB0aW9uXCI+e3sgcS5kZXNjcmlwdGlvbiB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC10YWcgZ2FsLXRhZy0td2FybmluZ1wiICpuZ0lmPVwicS5yZXZpc2VkXCI+UmV2aXNlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC10YWcgZ2FsLXRhZy0tZXJyb3JcIiAqbmdJZj1cInEuZmxhZ2dlZFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjRcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTQgMjFWNGgxMWwtMS41IDRMMTUgMTJINFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIEZsYWdnZWRcclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtdGFnIGdhbC10YWctLWdyYXlcIiAqbmdJZj1cInEucmVkb1wiPlJlLWRvPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NvcmVjaGlwXCIgKm5nSWY9XCJxLnNjb3JlICE9PSBudWxsICYmICFxLnJldmlzZWRcIj5TY29yZTp7eyBxLnNjb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZWRpdGljb25cIiAqbmdJZj1cInEuZWRpdGFibGUgJiYgIWlzRWRpdGluZyhxKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtbG9ja2VkXT1cIiEhZWRpdEJsb2NrZWRSZWFzb25cIiBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIiEhZWRpdEJsb2NrZWRSZWFzb25cIlxyXG4gICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiZWRpdEJsb2NrZWRSZWFzb24gfHwgJ0VkaXQgYW5zd2VyJ1wiIHRvb2x0aXBDbGFzcz1cImF2Mi10aXBcIiBwbGFjZW1lbnQ9XCJ0b3AtZW5kXCIgY29udGFpbmVyPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImVkaXRCbG9ja2VkUmVhc29uIHx8ICdFZGl0IGFuc3dlcidcIiAoY2xpY2spPVwic3RhcnRFZGl0KHEpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiAyMGg5XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE2LjUgMy41YTIuMTIxIDIuMTIxIDAgMCAxIDMgM0w3IDE5bC00IDEgMS00TDE2LjUgMy41elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2hlYWRlcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQXMgc3VibWl0dGVkIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5zd2VyYm94LWJvZHlcIiAqbmdJZj1cIiFxLnJldmlzZWQgJiYgIWlzRWRpdGluZyhxKVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdWJtaXR0ZWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBxIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEFjdHVhbCB2cyByZXZpc2VkIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aXNpb25cIiAqbmdJZj1cInEucmV2aXNlZCAmJiAhaXNFZGl0aW5nKHEpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldi1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldi1oZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmV2LWxhYmVsXCI+QWN0dWFsIHN1Ym1pc3Npb248L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLWdyb3dcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2NvcmVjaGlwXCIgKm5nSWY9XCJxLmFjdHVhbFNjb3JlICE9PSBudWxsXCI+U2NvcmU6e3sgcS5hY3R1YWxTY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1Ym1pdHRlZDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHEgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXYtYmxvY2sgcmV2LWJsb2NrLS1yZXZpc2VkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2LWhlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXYtbGFiZWwgcmV2LWxhYmVsLS13YXJuaW5nXCI+UmV2aXNlZCBzdWJtaXNzaW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1ncm93XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjb3JlY2hpcFwiICpuZ0lmPVwicS5yZXZpc2VkLnNjb3JlICE9PSBudWxsXCI+U2NvcmU6e3sgcS5yZXZpc2VkLnNjb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5zd2VydGV4dCBhbnN3ZXJ0ZXh0LS1zdHJvbmdcIj57eyBxLnJldmlzZWQuYW5zd2VyIHx8ICfigJQnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmV2LXJlYXNvbi1sYWJlbFwiPlJlYXNvbiBmb3IgQ2hhbmdlOjxzcGFuICpuZ0lmPVwicS5yZXZpc2VkLmJ5XCI+IMK3IHt7IHEucmV2aXNlZC5ieSB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXYtcmVhc29uXCI+e3sgcS5yZXZpc2VkLnJlYXNvbiB8fCAn4oCUJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRWRpdCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXRwYW5lbFwiICpuZ0lmPVwiaXNFZGl0aW5nKHEpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtdGl0bGVcIj5TZWxlY3QgdGhlIHJldmlzZWQgYW5zd2VyPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtb3B0aW9uc1wiIHJvbGU9XCJyYWRpb2dyb3VwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInQW5zd2VyIGZvciBxdWVzdGlvbiAnICsgcS5xbm9cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJyYWRpb1wiIGNsYXNzPVwiZWRpdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0IG9mIHEub3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLW9uXT1cImlzRHJhZnQob3B0KVwiIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc0RyYWZ0KG9wdClcIiAoY2xpY2spPVwicGlja0RyYWZ0KG9wdClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlZGl0LXJhZGlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzRHJhZnQob3B0KVwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVkaXQtb3B0aW9uLWxhYmVsXCI+e3sgb3B0LmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVkaXQtb3B0aW9uLWZsYWdcIiAqbmdJZj1cIm9wdC5mbGFnXCI+RmxhZ3M8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWRpdC1vcHRpb24tc2NvcmVcIiAqbmdJZj1cIm9wdC5zY29yZSAhPT0gbnVsbFwiPlNjb3JlIHt7IG9wdC5zY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlZGl0LW9wdGlvbi1hY3R1YWxcIiAqbmdJZj1cImlzQWN0dWFsT3B0aW9uKHEsIG9wdClcIj5BY3R1YWwgYW5zd2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LXJlYXNvblwiICpuZ0lmPVwiZHJhZnRDaGFuZ2VkKHEpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC10aXRsZVwiPlJlYXNvbiBmb3IgY2hhbmdlIDxzcGFuIGNsYXNzPVwicmVxXCI+Kjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZWRpdC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyYWZ0UmVhc29uXCIgW29wdGlvbnNdPVwicmVhc29uT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGEgcmVhc29uXCIgYXJpYUxhYmVsPVwiUmVhc29uIGZvciBjaGFuZ2VcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJkcmFmdFJlYXNvbiA9PT0gJ090aGVyJ1wiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJlZGl0LWlucHV0XCIgbWF4bGVuZ3RoPVwiMzAwXCJcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0aGUgcmVhc29uIGZvciBjaGFuZ2VcIiBbKG5nTW9kZWwpXT1cImRyYWZ0T3RoZXJcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1oaW50XCIgKm5nSWY9XCIhZHJhZnRDaGFuZ2VkKHEpICYmIHEucmV2aXNlZFwiPlxyXG4gICAgICAgICAgICAgICAgU2F2aW5nIGtlZXBzIHRoZSBzdG9yZSdzIGFjdHVhbCBhbnN3ZXIgYW5kIHJlbW92ZXMgdGhlIHJldmlzaW9uLlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwiY2FuY2VsRWRpdCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCIhY2FuU2F2ZShxKVwiIChjbGljayk9XCJzYXZlRWRpdChxKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzYXZpbmcgPyAnU2F2aW5n4oCmJyA6ICdTYXZlIENoYW5nZXMnIH19XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2FydGljbGU+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1ub21hdGNoXCIgKm5nSWY9XCIhdmlzaWJsZVF1ZXN0aW9ucy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgTm8gYW5zd2VycyBtYXRjaCB0aGUgcXVlc3Rpb24gc2VsZWN0aW9uLiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1saW5rXCIgKGNsaWNrKT1cInZpZXdBbGxBbnN3ZXJzKClcIj5WaWV3IGFsbCBhbnN3ZXJzPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQXBwcm92ZSBiYXIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImdhbC1hcHByb3ZlLWJhclwiICpuZ0lmPVwiaGFzU3VibWlzc2lvbiAmJiAhbG9hZGluZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFwcHJvdmUtc3RhdHVzXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWwuYXBwcm92YWxTdGF0dXNcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFwcHJvdmUtZG90IGFwcHJvdmUtZG90LS1zdWNjZXNzXCI+PC9zcGFuPlxyXG4gICAgICAgIEFwcHJvdmVkPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbC5hcHByb3ZlZEJ5XCI+IGJ5IDxzdHJvbmc+e3sgZGV0YWlsLmFwcHJvdmVkQnkgfX08L3N0cm9uZz48L25nLWNvbnRhaW5lcj48bmctY29udGFpbmVyICpuZ0lmPVwiZGV0YWlsLmFwcHJvdmVkQXRcIj4gwrcge3sgZGV0YWlsLmFwcHJvdmVkQXQgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGV0YWlsLmFwcHJvdmFsU3RhdHVzICYmIGRldGFpbC5hcHByb3ZhbEVuYWJsZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwcm92ZS1kb3QgYXBwcm92ZS1kb3QtLXdhcm5pbmdcIj48L3NwYW4+XHJcbiAgICAgICAgV2FpdGluZyBmb3IgYXBwcm92YWw8bmctY29udGFpbmVyICpuZ0lmPVwicmV2aXNlZENvdW50XCI+IMK3IHt7IHJldmlzZWRDb3VudCB9fSB7eyByZXZpc2VkQ291bnQgPT09IDEgPyAnYW5zd2VyJyA6ICdhbnN3ZXJzJyB9fSByZXZpc2VkPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRldGFpbC5hcHByb3ZhbEVuYWJsZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwcm92ZS1kb3RcIj48L3NwYW4+XHJcbiAgICAgICAgTm8gYXBwcm92YWwgc3RlcCBpcyBzZXQgZm9yIHRoaXMgYXVkaXRcclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbC5hcHByb3ZhbEVuYWJsZSAmJiAhZGV0YWlsLmFwcHJvdmFsU3RhdHVzICYmIG1lbnVBY2Nlc3MuY2FuRWRpdFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gZ2FsLWFwcHJvdmVcIiAqbmdJZj1cIiFhcHByb3ZlQ29uZmlybVwiIChjbGljayk9XCJyZXF1ZXN0QXBwcm92ZSgpXCI+QXBwcm92ZTwvYnV0dG9uPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXBwcm92ZUNvbmZpcm1cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFwcHJvdmUtd2FyblwiPkFwcHJvdmFsIHJlY29yZHMgdGhlIGZpbmFsIHNjb3JlIGFuZCBsb2NrcyBmdXJ0aGVyIGVkaXRzLjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwiY2FuY2VsQXBwcm92ZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGdhbC1hcHByb3ZlIGdhbC1hcHByb3ZlLS1jb25maXJtXCIgW2Rpc2FibGVkXT1cImFwcHJvdmluZ1wiIChjbGljayk9XCJjb25maXJtQXBwcm92ZSgpXCI+XHJcbiAgICAgICAgICB7eyBhcHByb3ZpbmcgPyAnQXBwcm92aW5n4oCmJyA6ICdDb25maXJtIGFwcHJvdmFsJyB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFdoYXQgdGhlIHN0b3JlIHN1Ym1pdHRlZDogYW5zd2VyLCBwcm9vZiwgY2FwdHVyZXMgYW5kIHJlbWFya3MuIFNoYXJlZCBieSB0aGUgcGxhaW4gYW5kIHRoZSByZXZpc2VkIHZpZXdzLiAtLT5cclxuICA8bmctdGVtcGxhdGUgI3N1Ym1pdHRlZCBsZXQtcT5cclxuICAgIDwhLS0gdjEgbGF5b3V0OiB0aGUgcXVlc3Rpb24ncyByZWZlcmVuY2UgaW1hZ2UgYW5kIHRoZSBhbnN3ZXIgb24gdGhlIGxlZnQ7IHZhbGlkYXRpb24gcGhvdG9zIC8gdmlkZW9zLCB0aGVcclxuICAgICAgICAgY2hvc2VuIG9wdGlvbidzIHJlZmVyZW5jZSBpbWFnZSBhbmQgdGhlIEFJIHJlc3VsdHMgaW4gYSByaWdodC1oYW5kIGNvbHVtbiAoY29sLW1kLTYgLyBjb2wtbWQtNikuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImdhbC1zcGxpdFwiIFtjbGFzcy5pcy1zcGxpdF09XCJoYXNTaWRlKHEpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtc3BsaXQtbWFpblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYmxvY2tcIiAqbmdJZj1cInEucXVlc3Rpb25SZWZzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1ibG9jay10aXRsZVwiPlJlZmVyZW5jZSBJbWFnZTwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlZkdyaWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBxLnF1ZXN0aW9uUmVmcywgdGl0bGU6ICdSZWZlcmVuY2UgSW1hZ2UnIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBFdmVyeSBjaG9zZW4gYW5zd2VyIG9uIGEgbGluZSBvZiBpdHMgb3duIChhIG11bHRpcGxlLWNob2ljZSBhbnN3ZXIgaXMgbm90IHJ1biB0b2dldGhlciB3aXRoIGNvbW1hcykuIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3R1YWxBbnN3ZXIocSlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnN3ZXJ0ZXh0XCIgKm5nRm9yPVwibGV0IGEgb2YgcS5hbnN3ZXJzXCIgW2NsYXNzLmlzLWZsYWddPVwicS5mbGFnZ2VkXCI+e3sgYSB9fXt7IHEudW5pdCB9fTwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnN3ZXJ0ZXh0XCIgKm5nSWY9XCIhYWN0dWFsQW5zd2VyKHEpICYmICFxLm1lZGlhLmxlbmd0aCAmJiAhcS5wcm9vZi5sZW5ndGggJiYgIXEudmFsaWRhdGlvblRleHRcIj7igJQ8L2Rpdj5cclxuICAgICAgICA8IS0tIFR5cGVkIHZhbGlkYXRpb24gYW5zd2VyIHVuZGVyIHRoZSBhbnN3ZXIgKHYxIFwiVmFsaWRhdGlvbiBBbnN3ZXIgOiA4OFwiKTsgc2V2ZXJhbCBhcmUgbGlzdGVkIG9uZSBwZXIgbGluZS4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByb29mdGV4dFwiICpuZ0lmPVwicS52YWxpZGF0aW9uVGV4dHMubGVuZ3RoID09PSAxXCIgW2NsYXNzLmlzLWZsYWddPVwicS5mbGFnZ2VkXCI+VmFsaWRhdGlvbiBBbnN3ZXIgOiB7eyBxLnZhbGlkYXRpb25UZXh0c1swXSB9fTwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxLnZhbGlkYXRpb25UZXh0cy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvb2Z0ZXh0XCIgW2NsYXNzLmlzLWZsYWddPVwicS5mbGFnZ2VkXCI+VmFsaWRhdGlvbiBBbnN3ZXIgOjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb29mdGV4dFwiICpuZ0Zvcj1cImxldCB2IG9mIHEudmFsaWRhdGlvblRleHRzXCIgW2NsYXNzLmlzLWZsYWddPVwicS5mbGFnZ2VkXCI+e3sgdiB9fTwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEltYWdlIC8gdmlkZW8gcXVlc3Rpb25zOiB0aGUgY2FwdHVyZSdzIHJlZmVyZW5jZSBpbWFnZSwgdGhlbiB0aGUgdXBsb2Fkcy4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1ibG9ja1wiICpuZ0lmPVwicS5vcHRpb25SZWZzLmxlbmd0aCAmJiAhaXNDaG9pY2UocSlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYmxvY2stdGl0bGVcIj5SZWZlcmVuY2UgSW1hZ2U8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZWZHcmlkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcS5vcHRpb25SZWZzLCB0aXRsZTogJ1JlZmVyZW5jZSBJbWFnZScgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWJsb2NrXCIgKm5nSWY9XCJxLm1lZGlhLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1ibG9jay10aXRsZVwiPnt7IG1lZGlhVGl0bGUocS5tZWRpYSkgfX08L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZWRpYUdyaWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBxLm1lZGlhLCB0aXRsZTogbWVkaWFUaXRsZShxLm1lZGlhKSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImdhbC1zcGxpdC1zaWRlXCIgKm5nSWY9XCJoYXNTaWRlKHEpXCI+XHJcbiAgICAgICAgPCEtLSBSZWZlcmVuY2UgaW1hZ2Ugb2YgdGhlIGNob3NlbiBvcHRpb24uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYmxvY2tcIiAqbmdJZj1cInEub3B0aW9uUmVmcy5sZW5ndGggJiYgaXNDaG9pY2UocSlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYmxvY2stdGl0bGVcIj5SZWZlcmVuY2UgSW1hZ2U8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZWZHcmlkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcS5vcHRpb25SZWZzLCB0aXRsZTogJ1JlZmVyZW5jZSBJbWFnZScgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFBob3RvIC8gdmlkZW8gcHJvb2YgdGhlIGNob3NlbiBvcHRpb24gYXNrZWQgZm9yLiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWJsb2NrXCIgKm5nSWY9XCJxLnByb29mLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdhbC1ibG9jay10aXRsZVwiPlZhbGlkYXRpb24gQW5zd2VyPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWVkaWFHcmlkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcS5wcm9vZiwgdGl0bGU6ICdWYWxpZGF0aW9uIEFuc3dlcicgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLWFpXCIgKm5nSWY9XCJxLmFpUmVzdWx0cy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYWktbGluZVwiICpuZ0Zvcj1cImxldCByIG9mIHEuYWlSZXN1bHRzXCI+PGI+e3sgci5sYWJlbCB9fSA6PC9iPiB7eyByLnZhbHVlIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbWFnZSAvIHZpZGVvIHF1ZXN0aW9ucyBrZWVwIHRoZWlyIEFJIHJlc3VsdHMgdW5kZXIgdGhlIHVwbG9hZHMgKHYxKS4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FsLWFpXCIgKm5nSWY9XCJxLmFpUmVzdWx0cy5sZW5ndGggJiYgIWhhc1NpZGUocSlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImdhbC1haS1saW5lXCIgKm5nRm9yPVwibGV0IHIgb2YgcS5haVJlc3VsdHNcIj48Yj57eyByLmxhYmVsIH19IDo8L2I+IHt7IHIudmFsdWUgfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyZW1hcmt0ZXh0XCIgKm5nSWY9XCJxLnJlbWFya1wiPnt7IGxhYmVscy5yZW1hcmtzIH19IDoge3sgcS5yZW1hcmsgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJyZW1hcmt0ZXh0XCIgKm5nSWY9XCJxLmV4dHJhUmVtYXJrXCI+e3sgbGFiZWxzLmFkZGl0aW9uYWwgfX0gOiB7eyBxLmV4dHJhUmVtYXJrIH19PC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBSZWZlcmVuY2UgaW1hZ2VzOiB2MSBjb2xsYWdlICgxIGNvbHVtbiBmb3Igb25lLCAyIGZvciB1cCB0byBmb3VyLCB0aGVuIDMpLCBjbGljayBvcGVucyB0aGUgdmlld2VyLiAtLT5cclxuICA8bmctdGVtcGxhdGUgI3JlZkdyaWQgbGV0LWxpc3QgbGV0LXRpdGxlPVwidGl0bGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJnYWwtZ3JpZFwiIFtuZ0NsYXNzXT1cImdyaWRDbGFzcyhsaXN0Lmxlbmd0aClcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnYWwtdGlsZVwiICpuZ0Zvcj1cImxldCBzcmMgb2YgbGlzdDsgbGV0IGkgPSBpbmRleFwiIFt0aXRsZV09XCInT3BlbiAnICsgdGl0bGVcIlxyXG4gICAgICAgIChjbGljayk9XCJvcGVuVmlld2VyKGxpc3QsIGksIHRpdGxlKVwiPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJzcmNcIiBbYWx0XT1cInRpdGxlICsgJyAnICsgKGkgKyAxKVwiIGxvYWRpbmc9XCJsYXp5XCI+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBDYXB0dXJlZCBwaG90b3MgLyB2aWRlb3Mgd2l0aCB0aGUgdjEgZXh0cmFzOiBNYXRjaGVkIGJhZGdlLCB1cGxvYWQgdGltZSwgcGVyLWltYWdlIGRlc2NyaXB0aW9uLiAtLT5cclxuICA8bmctdGVtcGxhdGUgI21lZGlhR3JpZCBsZXQtbGlzdCBsZXQtdGl0bGU9XCJ0aXRsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImdhbC1ncmlkXCIgW25nQ2xhc3NdPVwiZ3JpZENsYXNzKGxpc3QubGVuZ3RoKVwiPlxyXG4gICAgICA8ZmlndXJlIGNsYXNzPVwiZ2FsLXRpbGUtd3JhcFwiICpuZ0Zvcj1cImxldCBtIG9mIGxpc3Q7IGxldCBtaSA9IGluZGV4XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFicm9rZW5NZWRpYS5oYXMobS5zcmMpXCI+XHJcbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIW0udmlkZW9cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJnYWwtdGlsZVwiIFt0aXRsZV09XCInT3BlbiAnICsgdGl0bGVcIiAoY2xpY2spPVwib3Blbk1lZGlhVmlld2VyKGxpc3QsIG0sIHRpdGxlKVwiPlxyXG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwibS5zcmNcIiBbYWx0XT1cInRpdGxlICsgJyAnICsgKG1pICsgMSlcIiBsb2FkaW5nPVwibGF6eVwiIChlcnJvcik9XCJvbk1lZGlhRXJyb3IobS5zcmMpXCI+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDx2aWRlbyAqbmdJZj1cIm0udmlkZW9cIiBbc3JjXT1cIm0uc3JjXCIgY29udHJvbHMgcHJlbG9hZD1cIm1ldGFkYXRhXCIgY2xhc3M9XCJnYWwtdGlsZSBnYWwtdGlsZS0tdmlkZW9cIiAoZXJyb3IpPVwib25NZWRpYUVycm9yKG0uc3JjKVwiPjwvdmlkZW8+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPGEgKm5nSWY9XCJicm9rZW5NZWRpYS5oYXMobS5zcmMpXCIgW2hyZWZdPVwibS5zcmNcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiIGNsYXNzPVwiZ2FsLXRpbGUgZ2FsLXRpbGUtLW1pc3NpbmdcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cIihtLnZpZGVvID8gJ1ZpZGVvJyA6ICdJbWFnZScpICsgJyBjb3VsZCBub3QgYmUgbG9hZGVkIC0gb3BlbiB0aGUgZmlsZSdcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMTZcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI5XCIgY3k9XCIxMFwiIHI9XCIxLjZcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0yMSAxNmwtNS01LTkgOVwiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPHNwYW4+Tm90IGF2YWlsYWJsZTwvc3Bhbj5cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtZGV0ZWN0XCIgKm5nSWY9XCJtLmRldGVjdGlvblwiIFtjbGFzcy5pcy1iYWRdPVwibS5kZXRlY3Rpb24gPT09ICdub3RtYXRjaGVkJ1wiPnt7IG0uZGV0ZWN0aW9uID09PSAnbWF0Y2hlZCcgPyAnTWF0Y2hlZCcgOiAnTm90IE1hdGNoZWQnIH19PC9zcGFuPlxyXG4gICAgICAgIDxmaWdjYXB0aW9uPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtdXBsb2FkLXRpbWVcIiAqbmdJZj1cIm0udXBsb2FkZWRcIj57eyBtLnVwbG9hZGVkIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJtLmNhcHRpb25cIj5JbWFnZSB7eyBtaSArIDEgfX0gOiB7eyBtLmNhcHRpb24gfX08L3NwYW4+XHJcbiAgICAgICAgPC9maWdjYXB0aW9uPlxyXG4gICAgICA8L2ZpZ3VyZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDwhLS0gSW1hZ2Ugdmlld2VyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJnYWwtdmlld2VyXCIgKm5nSWY9XCJ2aWV3ZXJcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInZpZXdlci50aXRsZVwiIChjbGljayk9XCJjbG9zZVZpZXdlcigpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FsLXZpZXdlci1ib3hcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJnYWwtdmlld2VyLWhlYWRcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImdhbC12aWV3ZXItdGl0bGVcIj57eyB2aWV3ZXIudGl0bGUgfX08c3BhbiAqbmdJZj1cInZpZXdlci5pdGVtcy5sZW5ndGggPiAxXCI+IMK3IHt7IHZpZXdlci5pbmRleCArIDEgfX0gLyB7eyB2aWV3ZXIuaXRlbXMubGVuZ3RoIH19PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImdhbC12aWV3ZXItY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VWaWV3ZXIoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXZpZXdlci1zdGFnZVwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2FsLXZpZXdlci1uYXYgZ2FsLXZpZXdlci1uYXYtLXByZXZcIiAqbmdJZj1cInZpZXdlci5pdGVtcy5sZW5ndGggPiAxXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ2aWV3ZXIuaW5kZXggPT09IDBcIiAoY2xpY2spPVwic3RlcFZpZXdlcigtMSlcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgaW1hZ2VcIj7igLk8L2J1dHRvbj5cclxuICAgICAgICA8aW1nIFtzcmNdPVwidmlld2VyLml0ZW1zW3ZpZXdlci5pbmRleF1cIiBbYWx0XT1cInZpZXdlci50aXRsZVwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2FsLXZpZXdlci1uYXYgZ2FsLXZpZXdlci1uYXYtLW5leHRcIiAqbmdJZj1cInZpZXdlci5pdGVtcy5sZW5ndGggPiAxXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ2aWV3ZXIuaW5kZXggPT09IHZpZXdlci5pdGVtcy5sZW5ndGggLSAxXCIgKGNsaWNrKT1cInN0ZXBWaWV3ZXIoMSlcIiBhcmlhLWxhYmVsPVwiTmV4dCBpbWFnZVwiPuKAujwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFZpZXcgUHJvb2YgKHYxIFwiVmVyaWZpY2F0aW9uIERldGFpbHNcIikgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImdhbC12aWV3ZXJcIiAqbmdJZj1cInByb29mT3BlblwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWw9XCJWZXJpZmljYXRpb24gRGV0YWlsc1wiIChjbGljayk9XCJwcm9vZk9wZW4gPSBmYWxzZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImdhbC12aWV3ZXItYm94IGdhbC12aWV3ZXItYm94LS1tZFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImdhbC12aWV3ZXItaGVhZFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZ2FsLXZpZXdlci10aXRsZVwiPlZlcmlmaWNhdGlvbiBEZXRhaWxzPC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ2FsLXZpZXdlci1jbG9zZVwiIChjbGljayk9XCJwcm9vZk9wZW4gPSBmYWxzZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXByb29mLWJvZHlcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGV0YWlsLnByb29mSW1hZ2VcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYWwtYmxvY2stdGl0bGVcIj5DYXB0dXJlZCBQaG90bzwvZGl2PlxyXG4gICAgICAgICAgPGltZyBjbGFzcz1cImdhbC1wcm9vZi1pbWdcIiBbc3JjXT1cImRldGFpbC5wcm9vZkltYWdlXCIgYWx0PVwiQ2FwdHVyZWQgcGhvdG9cIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FsLXByb29mLW5hbWVcIj48Yj5OYW1lIDo8L2I+IHt7IGRldGFpbC5hY2tub3dsZWRnZWRCeSB8fCAn4oCUJyB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENsb3NlcyB0aGUgZXhwb3J0IG1lbnUgb24gYW4gb3V0c2lkZSBjbGljayAtLT5cclxuICA8ZGl2IGNsYXNzPVwibWVudS1iYWNrZHJvcFwiICpuZ0lmPVwiZXhwb3J0T3BlblwiIChjbGljayk9XCJleHBvcnRPcGVuID0gZmFsc2VcIj48L2Rpdj5cclxuXHJcbiAgPCEtLSBGaWx0ZXIgZHJhd2VyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItYmFja2Ryb3BcIiAqbmdJZj1cImZpbHRlcnNPcGVuXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPjwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyYXdlclwiICpuZ0lmPVwiZmlsdGVyc09wZW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItaGVhZFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRyYXdlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRwaWxsXCIgKm5nSWY9XCJhY3RpdmVGaWx0ZXJDb3VudFwiPnt7IGFjdGl2ZUZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZWJ0blwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIiB0aXRsZT1cIkNsb3NlXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XHJcbiAgICAgIDwhLS0gQ2F0ZWdvcmllcyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1uYXZcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWdyb3VwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBsYWJlbFwiPlByaW1hcnk8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgZGVmIG9mIHByaW1hcnlEZWZzOyB0cmFja0J5OiB0cmFja0J5RGVmXCJcclxuICAgICAgICAgICAgW2NsYXNzLm5hdml0ZW0tYWN0aXZlXT1cImFjdGl2ZUZpbHRlciA9PT0gZGVmLmlkXCIgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5KGRlZi5pZClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0aXRsZVwiPnt7IGRlZi5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnZhbHVlXCIgW2NsYXNzLmlzLWRpcnR5XT1cImlzRGlydHkoZGVmLmlkKVwiPnt7IHN1bW1hcnlGb3IoZGVmLmlkKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpcnR5ZG90XCIgKm5nSWY9XCJpc0RpcnR5KGRlZi5pZClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJuYXZjaGV2XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjkgNiAxNSAxMiA5IDE4XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1ncm91cFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwbGFiZWxcIj5TZWNvbmRhcnk8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgZGVmIG9mIHNlY29uZGFyeURlZnM7IHRyYWNrQnk6IHRyYWNrQnlEZWZcIlxyXG4gICAgICAgICAgICBbY2xhc3MubmF2aXRlbS1hY3RpdmVdPVwiYWN0aXZlRmlsdGVyID09PSBkZWYuaWRcIiAoY2xpY2spPVwic2VsZWN0Q2F0ZWdvcnkoZGVmLmlkKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRpdGxlXCI+e3sgZGVmLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dmFsdWVcIiBbY2xhc3MuaXMtZGlydHldPVwiaXNEaXJ0eShkZWYuaWQpXCI+e3sgc3VtbWFyeUZvcihkZWYuaWQpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHlkb3RcIiAqbmdJZj1cImlzRGlydHkoZGVmLmlkKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm5hdmNoZXZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiOSA2IDE1IDEyIDkgMThcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gT3B0aW9ucyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1wYW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtaGVhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmV0aXRsZVwiPnt7IGFjdGl2ZURlZi5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVoaW50XCI+e3sgYWN0aXZlRGVmLmhpbnQgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBEYXRlIHJhbmdlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLXNjcm9sbCBwYW5lLWZpZWxkcyBwYW5lLWZpZWxkcy0tZGF0ZVwiICpuZ0lmPVwiYWN0aXZlRGVmLmtpbmQgPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TZWxlY3RlZDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnYWwtcmFuZ2UtcmVhZG91dFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICB7eyByYW5nZUxhYmVsIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSBJbmxpbmUgY2FsZW5kYXJzOiBhIGRyb3Bkb3duIGluc2lkZSB0aGlzIHNjcm9sbGluZyBwYW5lIG9wZW5lZCBvZmYgdG8gdGhlIHNpZGUgYW5kIHNjcm9sbGVkIHNpZGV3YXlzLlxyXG4gICAgICAgICAgICAgICBLZXllZCBvbiBmUmFuZ2Ugc28gQ2xlYXIgYWxsIC8gcmVvcGVuaW5nIHJlYnVpbGRzIGl0IG9uIHRoZSByZXN0b3JlZCByYW5nZS4gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrIGF2Mi1kYXRlcGljay0tY29tcGFjdCBnYWwtaW5saW5lLXBpY2tlclwiICpuZ0Zvcj1cImxldCByIG9mIFtmUmFuZ2VdXCI+XHJcbiAgICAgICAgICAgIDxuZ3gtZGF0ZXJhbmdlcGlja2VyLW1hdGVyaWFsICpuZ0lmPVwiclwiIFtzdGFydERhdGVdPVwici5zdGFydERhdGVcIiBbZW5kRGF0ZV09XCJyLmVuZERhdGVcIlxyXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwicGlja2VyTG9jYWxlXCIgW21heERhdGVdPVwidG9kYXlcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbYWx3YXlzU2hvd0NhbGVuZGFyc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbc2hvd0NhbmNlbF09XCJmYWxzZVwiIChkYXRlc1VwZGF0ZWQpPVwib25SYW5nZVBpY2tlZCgkZXZlbnQpXCI+PC9uZ3gtZGF0ZXJhbmdlcGlja2VyLW1hdGVyaWFsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2NvcmUgcmFuZ2UgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtc2Nyb2xsIHBhbmUtZmllbGRzXCIgKm5nSWY9XCJhY3RpdmVEZWYua2luZCA9PT0gJ3Njb3JlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5Gcm9tPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1ib3ggZmllbGQtYm94LS1udW1cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cImZTY29yZU1pblwiPjxzcGFuIGNsYXNzPVwiZmllbGQtdW5pdFwiPiU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtc2VwXCI+dG88L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlRvPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1ib3ggZmllbGQtYm94LS1udW1cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cImZTY29yZU1heFwiPjxzcGFuIGNsYXNzPVwiZmllbGQtdW5pdFwiPiU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzY29yZS1yZWFkb3V0XCI+e3sgZlNjb3JlTWluIH19JSDigJMge3sgZlNjb3JlTWF4IH19JTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBPcHRpb24gbGlzdCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1zY3JvbGwgcGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVEZWYua2luZCA9PT0gJ2xpc3QnXCI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwYW5lc2VhcmNoXCIgKm5nSWY9XCJhY3RpdmVEZWYuc2VhcmNoYWJsZVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwib3B0aW9uUXVlcnlcIj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGFjdGl2ZU9wdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlPcHRpb25cIlxyXG4gICAgICAgICAgICBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiIChjbGljayk9XCJwaWNrKG9wdClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiaXNTZWxlY3RlZChvcHQpXCIgW2NsYXNzLm1hcmstbXVsdGldPVwiYWN0aXZlRGVmLm11bHRpXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzU2VsZWN0ZWQob3B0KVwiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0dGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyBvcHQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRtZXRhXCIgKm5nSWY9XCJvcHQubWV0YVwiPnt7IG9wdC5tZXRhIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9tYXRjaFwiICpuZ0lmPVwibm9PcHRpb25NYXRjaFwiPnt7IG5vT3B0aW9uVGV4dCB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItZm9vdFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIj5DbGVhciBhbGw8L2J1dHRvbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGF2Mi1idG4tLXdpZGVcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIj5BcHBseSBmaWx0ZXJzPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
|