@posiwise/resource-contact-us 0.0.3 → 0.0.4

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.
Files changed (23) hide show
  1. package/esm2022/index.mjs +5 -6
  2. package/esm2022/lib/resource-contact-us/resource-contact-us.component.mjs +511 -0
  3. package/esm2022/lib/resource-contact-us/shared-contact-us.module.mjs +28 -0
  4. package/esm2022/lib/resource-header/resource-header.component.mjs +3 -4
  5. package/esm2022/lib/resource-header/shared-header.module.mjs +34 -0
  6. package/fesm2022/{posiwise-resource-contact-us-edit-navbar-modal.component-C59Q3971.mjs → posiwise-resource-contact-us-edit-navbar-modal.component-jSKqyC6g.mjs} +4 -4
  7. package/fesm2022/{posiwise-resource-contact-us-edit-navbar-modal.component-C59Q3971.mjs.map → posiwise-resource-contact-us-edit-navbar-modal.component-jSKqyC6g.mjs.map} +1 -1
  8. package/fesm2022/posiwise-resource-contact-us.mjs +397 -813
  9. package/fesm2022/posiwise-resource-contact-us.mjs.map +1 -1
  10. package/index.d.ts +4 -5
  11. package/{resource-contact-us → lib/resource-contact-us}/resource-contact-us.component.d.ts +18 -5
  12. package/lib/resource-contact-us/shared-contact-us.module.d.ts +17 -0
  13. package/lib/resource-header/shared-header.module.d.ts +15 -0
  14. package/package.json +1 -1
  15. package/esm2022/lib/edit-footer-links-modal/edit-footer-links-modal.component.mjs +0 -198
  16. package/esm2022/lib/edit-questions-modal/edit-questions-modal.component.mjs +0 -156
  17. package/esm2022/lib/resource-header/resource-header.module.mjs +0 -63
  18. package/esm2022/resource-contact-us/resource-contact-us.component.mjs +0 -504
  19. package/esm2022/resource-contact-us/resource-contact-us.module.mjs +0 -79
  20. package/lib/edit-footer-links-modal/edit-footer-links-modal.component.d.ts +0 -22
  21. package/lib/edit-questions-modal/edit-questions-modal.component.d.ts +0 -21
  22. package/lib/resource-header/resource-header.module.d.ts +0 -21
  23. package/resource-contact-us/resource-contact-us.module.d.ts +0 -25
@@ -1,504 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Injector, Input, TemplateRef, ViewChild } from '@angular/core';
3
- import { UntypedFormBuilder, Validators } from '@angular/forms';
4
- import { DomSanitizer } from '@angular/platform-browser';
5
- import { AdminService } from '@posiwise/admin-module-utils';
6
- import { AppBaseComponent } from '@posiwise/app-base-component';
7
- import { AbTestService, AuthService, ValidationService } from '@posiwise/common-services';
8
- import { HelperService } from '@posiwise/helper-service';
9
- import { CustomUploaderComponent } from '@posiwise/utils';
10
- import { CrmService } from '@posiwise/smart-crm-shared';
11
- import { StatusCodes } from 'http-status-codes';
12
- import Swal from 'sweetalert2';
13
- import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@angular/forms";
16
- import * as i2 from "@posiwise/common-services";
17
- import * as i3 from "@posiwise/smart-crm-shared";
18
- import * as i4 from "@angular/platform-browser";
19
- import * as i5 from "@posiwise/admin-module-utils";
20
- import * as i6 from "@ng-bootstrap/ng-bootstrap";
21
- import * as i7 from "@angular/common";
22
- import * as i8 from "@angular/router";
23
- import * as i9 from "@posiwise/directives";
24
- import * as i10 from "ngx-captcha";
25
- import * as i11 from "primeng/dropdown";
26
- import * as i12 from "@posiwise/utils";
27
- import * as i13 from "@jsverse/transloco";
28
- export class Trial4ContactUsComponent extends AppBaseComponent {
29
- async openQuestionsEditModal() {
30
- this.editingQuestions = JSON.parse(JSON.stringify(this.questions ?? []));
31
- try {
32
- // Dynamically import EditQuestionsModalComponent (includes DragDropModule)
33
- // This only loads when the edit modal is opened (user is logged in with edit permissions)
34
- // Reduces bundle size for landing pages where users aren't logged in
35
- const { EditQuestionsModalComponent } = await import('../lib/edit-questions-modal/edit-questions-modal.component');
36
- const modalRef = this.modalService.open(EditQuestionsModalComponent, {
37
- size: 'lg',
38
- centered: true,
39
- windowClass: 'modal-holder'
40
- });
41
- modalRef.componentInstance.editingQuestions = this.editingQuestions;
42
- modalRef.componentInstance.save.subscribe((updatedQuestions) => {
43
- this.saveQuestions(modalRef, updatedQuestions);
44
- });
45
- modalRef.componentInstance.close.subscribe(() => {
46
- modalRef.close();
47
- });
48
- }
49
- catch (error) {
50
- console.error('Failed to load edit questions modal:', error);
51
- this.toast.error('Failed to open edit modal. Please try again.');
52
- }
53
- }
54
- constructor(fb, authService, crmService, sanitizer, adminService, injector, abTestService, modalService, cdr, document) {
55
- super(injector);
56
- this.fb = fb;
57
- this.authService = authService;
58
- this.crmService = crmService;
59
- this.sanitizer = sanitizer;
60
- this.adminService = adminService;
61
- this.abTestService = abTestService;
62
- this.modalService = modalService;
63
- this.cdr = cdr;
64
- this.document = document;
65
- this.editingQuestions = [];
66
- this.isFooterVisible = false;
67
- this.recaptcha = null;
68
- this.subscriptionId = this.appConfig.crm.subscription_id;
69
- this.sourceId = this.appConfig.crm.source_id;
70
- this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;
71
- this.canEditResourcesValue = false;
72
- this.logo = this.appConfig?.company?.logos?.main_contrast?.url;
73
- this.trialBgImage2 = this.appConfig?.signup_config.trial?.image_bg2?.url;
74
- this.tosId = this.appConfig?.main_tos_id;
75
- this.description = this.appConfig.company.description;
76
- this.email = this.appConfig.company.email;
77
- this.companyName = this.appConfig.company.name;
78
- this.street = this.appConfig.company.street;
79
- this.questions = this.appConfig?.pages_config?.contact_us?.questions;
80
- this.hubspot = this.appConfig?.pages_config?.contact_us?.hubspot;
81
- this.footerLinks = this.appConfig?.pages_config?.footer_links?.items;
82
- this.footerLinksData = this.appConfig?.pages_config?.footer_links;
83
- this.youtubeUrl = this.appConfig.social?.youtube_url;
84
- this.linkedInUrl = this.appConfig.social?.linkedin_url;
85
- this.domainId = this.appConfig.domain_id;
86
- this.editingEmail = this.email;
87
- this.isEditingEmail = false;
88
- this.submitted = false;
89
- this.isCaptchaVerified = false;
90
- this.isEmailValid = true;
91
- this.isEditingStreet = false;
92
- this.editingFooterLinks = {
93
- items: []
94
- };
95
- this.captchaKeyV2 = this.appConfig.integrations.captcha_key_V2;
96
- this.contactUsForm();
97
- }
98
- ngOnInit() {
99
- setTimeout(() => (this.isHubspotReady = true), 2000);
100
- if (this.userLoggedIn) {
101
- this.localStorage.getItem$('product').subscribe(res => {
102
- const data = res ? JSON.parse(res) : null;
103
- this.id = data?.subscriptionId;
104
- });
105
- }
106
- this.previewData = {
107
- url: this.logo,
108
- name: 'logo_main_contrast.png'
109
- };
110
- this.editingStreet = this.street;
111
- if (Array.isArray(this.appConfig.pages_config?.ab_tests)) {
112
- this.abTests = this.appConfig.pages_config.ab_tests.find(test => test.description === 'contact-us');
113
- this.microserviceName = this.abTests?.microservice_name;
114
- this.experimentName = this.abTests?.experiment_name;
115
- this.shardName = this.abTests?.db_shard;
116
- }
117
- const footerItem = this.getFooterHubspotForm();
118
- if (footerItem?.div) {
119
- // NOSONAR: Trusted HTML content is handled safely here
120
- this.hubspotHtml = this.sanitizer.bypassSecurityTrustHtml(footerItem.div); // NOSONAR
121
- }
122
- this.editingQuestions = this.questions;
123
- this.question = this.questions?.[0]?.question;
124
- this.psaOptions = [
125
- { label: 'Select PSA', value: '' },
126
- ...(this.questions?.[0]?.options ?? [])
127
- .filter(q => q.option?.trim())
128
- .map(q => ({
129
- label: q.option,
130
- value: q.option
131
- }))
132
- ];
133
- }
134
- ngOnChanges(changes) {
135
- if (changes['user'] || changes['userLoggedIn']) {
136
- if (this.userLoggedIn && this.user) {
137
- this.updateCanEditResourcesValue();
138
- }
139
- }
140
- }
141
- openLogoEditModal() {
142
- this.modalService.open(this.logoModal, {
143
- centered: true,
144
- size: 'md'
145
- });
146
- }
147
- onSaveFile(event) {
148
- const formData = new FormData();
149
- const data = { subscription_id: this.subscriptionId };
150
- if (event.file instanceof File) {
151
- data[event.name] = event.file;
152
- }
153
- else if (event.file === null) {
154
- data[`remove_${event.name}`] = true;
155
- }
156
- for (const key in data) {
157
- formData.append(key, data[key]);
158
- }
159
- this.adminService.updateDomainConfig(this.domainId, formData).subscribe(() => {
160
- if (event.file) {
161
- this.logo = URL.createObjectURL(event.file);
162
- this.modalService.dismissAll();
163
- }
164
- this.toast.success(event.file ? 'Logo updated' : 'Logo removed');
165
- });
166
- }
167
- saveQuestions(modal, updatedQuestions) {
168
- const questionsToSave = updatedQuestions || this.editingQuestions;
169
- const updateData = {
170
- contact_us: {
171
- ...this.appConfig.pages_config?.contact_us,
172
- questions: questionsToSave
173
- },
174
- subscription_id: this.id
175
- };
176
- this.adminService.updateDomainConfig(this.domainId, updateData).subscribe(() => {
177
- this.questions = questionsToSave;
178
- this.toast.success('Questions updated');
179
- this.question = questionsToSave?.[0]?.question;
180
- if (questionsToSave?.[0]?.options?.length > 0) {
181
- this.psaOptions = [
182
- { label: 'Select PSA', value: '' },
183
- ...(questionsToSave?.[0]?.options ?? [])
184
- .filter(q => q.option?.trim())
185
- .map(q => ({
186
- label: q.option,
187
- value: q.option
188
- }))
189
- ];
190
- }
191
- else {
192
- this.psaOptions = [];
193
- }
194
- modal.close();
195
- });
196
- }
197
- openSocialEditModal() {
198
- this.editingYoutubeUrl = this.youtubeUrl;
199
- this.editingLinkedInUrl = this.linkedInUrl;
200
- this.editingCompanyName = this.companyName;
201
- this.modalService.open(this.socialEditModal, { centered: true, size: 'lg' });
202
- }
203
- saveSocialLinks(modal) {
204
- const updateData = {
205
- youtube_url: this.editingYoutubeUrl,
206
- linkedin_url: this.editingLinkedInUrl,
207
- company_name: this.editingCompanyName,
208
- subscription_id: this.id
209
- };
210
- this.adminService.updateDomainConfig(this.domainId, updateData).subscribe(() => {
211
- this.youtubeUrl = this.editingYoutubeUrl;
212
- this.linkedInUrl = this.editingLinkedInUrl;
213
- this.companyName = this.editingCompanyName;
214
- this.toast.success('Social links and company name updated');
215
- modal.close();
216
- });
217
- }
218
- hasValidOptions() {
219
- return this.questions?.[0]?.options?.some(opt => opt.option?.trim());
220
- }
221
- ngAfterViewInit() {
222
- this.watchIframeHeightChange();
223
- this.observer = new IntersectionObserver(([entry]) => {
224
- if (entry.isIntersecting) {
225
- this.isFooterVisible = true;
226
- this.cdr.detectChanges();
227
- this.observer?.disconnect();
228
- }
229
- }, { threshold: 0.1 });
230
- this.observer.observe(this.footerSection.nativeElement);
231
- }
232
- async openEditFooterLinksModal() {
233
- this.footerLinksData = this.footerLinksData ?? {};
234
- this.footerLinksData.items = this.footerLinksData.items ?? [];
235
- this.editingFooterLinks = JSON.parse(JSON.stringify(this.footerLinksData));
236
- try {
237
- // Dynamically import EditFooterLinksModalComponent (includes DragDropModule)
238
- // This only loads when the edit modal is opened (user is logged in with edit permissions)
239
- // Reduces bundle size for landing pages where users aren't logged in
240
- const { EditFooterLinksModalComponent } = await import('../lib/edit-footer-links-modal/edit-footer-links-modal.component');
241
- const modalRef = this.modalService.open(EditFooterLinksModalComponent, {
242
- size: 'lg',
243
- centered: true,
244
- windowClass: 'modal-holder'
245
- });
246
- modalRef.componentInstance.editingFooterLinks = this.editingFooterLinks;
247
- modalRef.componentInstance.save.subscribe((updatedFooterLinks) => {
248
- this.saveFooterLinks(modalRef, updatedFooterLinks);
249
- });
250
- modalRef.componentInstance.close.subscribe(() => {
251
- modalRef.close();
252
- });
253
- }
254
- catch (error) {
255
- console.error('Failed to load edit footer links modal:', error);
256
- this.toast.error('Failed to open edit modal. Please try again.');
257
- }
258
- }
259
- watchIframeHeightChange() {
260
- const iframe = this.document.querySelector('.hubspot-container');
261
- if (!iframe)
262
- return;
263
- const interval = setInterval(() => {
264
- const newHeight = iframe['offsetHeight'];
265
- if (newHeight === 250) {
266
- clearInterval(interval);
267
- this.callAbTestFinish();
268
- }
269
- }, 300);
270
- }
271
- // New method to handle Hubspot content loading
272
- onHubspotLoad(event) {
273
- const container = event.target;
274
- container.classList.add('content-loaded');
275
- // Optional: Trigger layout recalculation
276
- setTimeout(() => {
277
- window.dispatchEvent(new Event('resize'));
278
- }, 100);
279
- }
280
- callAbTestFinish() {
281
- if (this.experimentName && this.microserviceName) {
282
- this.abTestService
283
- .finishABExperiment(this.experimentName, this.microserviceName)
284
- .subscribe(() => {
285
- this.modalService.open(this.content, {
286
- centered: true,
287
- windowClass: 'modal-holder'
288
- });
289
- });
290
- }
291
- }
292
- contactUsForm() {
293
- this.form = this.fb.group({
294
- first_name: ['', Validators.required],
295
- last_name: [''],
296
- company: [''],
297
- psa: [''],
298
- enquiry: ['', Validators.required],
299
- email: ['', Validators.required]
300
- });
301
- }
302
- onSubmit() {
303
- this.submitted = true;
304
- if (this.form.valid) {
305
- this.isCaptchaVerified = true;
306
- this.submitted = false;
307
- }
308
- }
309
- handleSuccess(token) {
310
- if (token) {
311
- this.authService.validateReCaptcha(token).subscribe((isSuccess) => {
312
- if (isSuccess && this.form.valid) {
313
- const data = { ...this.form.getRawValue() };
314
- const formattedEnquiry = `${data.enquiry}; Question: ${this.question}; Answer: ${data.psa}`;
315
- const postData = {
316
- first_name: `${data.first_name}`,
317
- last_name: `${data.first_name}`,
318
- company: `${data.first_name}`,
319
- email: `${data.email}`,
320
- enquiry: this.psaOptions.length ? formattedEnquiry : `${data.enquiry}`,
321
- psa: data.psa,
322
- subscription_id: this.subscriptionId,
323
- crm_source_id: this.sourceId,
324
- master_subscription_id: this.masterSubscriptionId,
325
- notify_user: false,
326
- is_manual: false
327
- };
328
- this.crmService.postCrmLead(this.subscriptionId, postData).subscribe(resp => {
329
- // example of snippet to close the experiment and track in GA
330
- if (resp?.status === StatusCodes.OK) {
331
- this.googleAnalyticsService.sendEvent('new-lead-registration', // category, eg: videos
332
- 'subscribe-success', // action, eg: Play
333
- 'coming-soon-three', // label, eg: Chappy
334
- 1 // value, eg: 10
335
- );
336
- if (this.experimentName && this.microserviceName) {
337
- this.abTestService
338
- .finishABExperiment(this.experimentName, this.microserviceName)
339
- .subscribe(() => {
340
- this.modalService.open(this.content, {
341
- centered: true,
342
- windowClass: 'modal-holder'
343
- });
344
- });
345
- }
346
- else {
347
- Swal.fire(resp.message);
348
- }
349
- }
350
- this.form.reset();
351
- this.isCaptchaVerified = false;
352
- });
353
- }
354
- });
355
- }
356
- }
357
- scrollToTop() {
358
- this.document.documentElement.scrollTop = 0;
359
- }
360
- getFooterHubspotForm() {
361
- if (!this.hubspot?.length) {
362
- return null;
363
- }
364
- return this.hubspot.find(item => item.position === 'footer') ?? null;
365
- }
366
- navigateToBookMeeting() {
367
- const bookDemoUrl = this.appConfig?.signup_config?.trial?.book_demo_url ??
368
- 'https://calendly.com/cloudolive';
369
- window.open(bookDemoUrl, '_blank', 'noreferrer noopener');
370
- }
371
- validateEmail() {
372
- const email = this.form.get('email').value;
373
- if (email) {
374
- this.isEmailValid = ValidationService.email(email);
375
- }
376
- else {
377
- this.isEmailValid = true;
378
- }
379
- }
380
- saveFooterLinks(modal, updatedFooterLinks) {
381
- const footerLinksToSave = updatedFooterLinks || this.editingFooterLinks;
382
- const updatedConfig = {
383
- footer_links: footerLinksToSave,
384
- subscription_id: this.id
385
- };
386
- this.adminService
387
- .updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
388
- .subscribe(() => {
389
- this.toast.success('Footer links updated');
390
- this.footerLinks = [...footerLinksToSave.items];
391
- this.footerLinksData = { ...footerLinksToSave };
392
- modal.close();
393
- });
394
- }
395
- saveEmail() {
396
- this.email = this.editingEmail;
397
- this.adminService
398
- .updateDomainConfig(this.appConfig?.domain_id, {
399
- company_email: this.editingEmail,
400
- subscription_id: this.id
401
- })
402
- .subscribe(() => {
403
- this.toast.success('Email updated');
404
- this.isEditingEmail = false;
405
- });
406
- }
407
- saveStreet() {
408
- this.adminService
409
- .updateDomainConfig(this.appConfig?.domain_id, {
410
- company_address: this.editingStreet,
411
- subscription_id: this.id
412
- })
413
- .subscribe(() => {
414
- this.toast.success('Street updated');
415
- this.street = this.editingStreet;
416
- this.isEditingStreet = false;
417
- });
418
- }
419
- cancelStreet() {
420
- this.editingStreet = this.street;
421
- this.isEditingStreet = false;
422
- }
423
- openHubspotEditModal(footerItem) {
424
- this.editingHubspotHtml = footerItem.div;
425
- this.editingHubspotId = footerItem.id;
426
- this.modalService.open(this.hubspotEditModal, { centered: true, size: 'lg' });
427
- }
428
- saveHubspotHtml(modal) {
429
- const updatedConfig = {
430
- contact_us: {
431
- ...this.appConfig?.pages_config?.contact_us,
432
- hubspot: [
433
- {
434
- id: '7423639',
435
- position: 'footer',
436
- div: this.editingHubspotHtml
437
- }
438
- ]
439
- },
440
- subscription_id: this.id
441
- };
442
- this.adminService
443
- .updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
444
- .subscribe(() => {
445
- // NOSONAR: Trusted HTML content is handled safely here
446
- this.hubspotHtml = this.sanitizer.bypassSecurityTrustHtml(this.editingHubspotHtml); // NOSONAR
447
- this.toast.success('Hubspot Embed updated');
448
- modal.close();
449
- });
450
- }
451
- updateCanEditResourcesValue() {
452
- this.canEditResourcesValue = HelperService.canEditResources(this.user, this.userLoggedIn, this.permissionService);
453
- }
454
- canEditResources() {
455
- return this.canEditResourcesValue;
456
- }
457
- ngOnDestroy() {
458
- this.observer?.disconnect();
459
- }
460
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.AuthService }, { token: i3.CrmService }, { token: i4.DomSanitizer }, { token: i5.AdminService }, { token: i0.Injector }, { token: i2.AbTestService }, { token: i6.NgbModal }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
461
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: Trial4ContactUsComponent, selector: "pw-trial-4-contact-us", inputs: { subscriptionId: "subscriptionId", sourceId: "sourceId", masterSubscriptionId: "masterSubscriptionId", experimentName: "experimentName", microserviceName: "microserviceName", shardName: "shardName", user: "user", userLoggedIn: "userLoggedIn" }, viewQueries: [{ propertyName: "footerSection", first: true, predicate: ["footerSection"], descendants: true, static: true }, { propertyName: "content", first: true, predicate: ["bookMeeting"], descendants: true, static: true }, { propertyName: "logoModal", first: true, predicate: ["logoModal"], descendants: true }, { propertyName: "logoUploader", first: true, predicate: ["logoUploader"], descendants: true }, { propertyName: "hubspotEditModal", first: true, predicate: ["hubspotEditModal"], descendants: true }, { propertyName: "socialEditModal", first: true, predicate: ["socialEditModal"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal()\" (keydown.enter)=\"openEditFooterLinksModal()\" (keydown.space)=\"openEditFooterLinksModal()\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now &amp; schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i9.EventTrackerDirective, selector: "[eventTracker]", inputs: ["eventTracker"] }, { kind: "directive", type: i9.LazyImgDirective, selector: "img" }, { kind: "component", type: i10.ReCaptcha2Component, selector: "ngx-recaptcha2", inputs: ["theme", "size"] }, { kind: "component", type: i11.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i12.FieldErrorDisplayComponent, selector: "pw-field-error-display", inputs: ["errorMsg", "displayError"] }, { kind: "component", type: i12.CustomUploaderComponent, selector: "pw-custom-uploader", inputs: ["controlName", "previewData", "aspectRatio", "title"], outputs: ["saveEvent"] }, { kind: "pipe", type: i13.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
462
- }
463
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, decorators: [{
464
- type: Component,
465
- args: [{ selector: 'pw-trial-4-contact-us', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal()\" (keydown.enter)=\"openEditFooterLinksModal()\" (keydown.space)=\"openEditFooterLinksModal()\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now &amp; schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"] }]
466
- }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.AuthService }, { type: i3.CrmService }, { type: i4.DomSanitizer }, { type: i5.AdminService }, { type: i0.Injector }, { type: i2.AbTestService }, { type: i6.NgbModal }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
467
- type: Inject,
468
- args: [DOCUMENT]
469
- }] }], propDecorators: { footerSection: [{
470
- type: ViewChild,
471
- args: ['footerSection', { static: true }]
472
- }], content: [{
473
- type: ViewChild,
474
- args: ['bookMeeting', { static: true }]
475
- }], logoModal: [{
476
- type: ViewChild,
477
- args: ['logoModal']
478
- }], logoUploader: [{
479
- type: ViewChild,
480
- args: ['logoUploader']
481
- }], hubspotEditModal: [{
482
- type: ViewChild,
483
- args: ['hubspotEditModal']
484
- }], socialEditModal: [{
485
- type: ViewChild,
486
- args: ['socialEditModal']
487
- }], subscriptionId: [{
488
- type: Input
489
- }], sourceId: [{
490
- type: Input
491
- }], masterSubscriptionId: [{
492
- type: Input
493
- }], experimentName: [{
494
- type: Input
495
- }], microserviceName: [{
496
- type: Input
497
- }], shardName: [{
498
- type: Input
499
- }], user: [{
500
- type: Input
501
- }], userLoggedIn: [{
502
- type: Input
503
- }] } });
504
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3Jlc291cmNlLWNvbnRhY3QtdXMvc3JjL3Jlc291cmNlLWNvbnRhY3QtdXMvcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL3Jlc291cmNlLWNvbnRhY3QtdXMvc3JjL3Jlc291cmNlLWNvbnRhY3QtdXMvcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFLTCxXQUFXLEVBQ1gsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFD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LHdCQUF3QiwrUUF1SHJCLFFBQVE7bUdBdkhYLHdCQUF3QixnOUJDekNyQywyeGVBaVdBOzs0RkR4VGEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNJLHVCQUF1QixtQkFHaEIsdUJBQXVCLENBQUMsTUFBTTs7MEJBeUgxQyxNQUFNOzJCQUFDLFFBQVE7eUNBbkgwQixhQUFhO3NCQUExRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0EsT0FBTztzQkFBbEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNsQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0ssWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNNLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBQ0MsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBOENuQixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IEFkbWluU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9hZG1pbi1tb2R1bGUtdXRpbHMnO1xuaW1wb3J0IHsgQXBwQmFzZUNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9hcHAtYmFzZS1jb21wb25lbnQnO1xuaW1wb3J0IHsgQWJUZXN0U2VydmljZSwgQXV0aFNlcnZpY2UsIFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9oZWxwZXItc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21VcGxvYWRlckNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS91dGlscyc7XG5pbXBvcnQgeyBDcm1TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL3NtYXJ0LWNybS1zaGFyZWQnO1xuXG5pbXBvcnQgeyBTdGF0dXNDb2RlcyB9IGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcblxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbmltcG9ydCB7IFJlc291cmNlTW9kYWxDb250ZXh0IH0gZnJvbSAnLi4vbGliL3NoYXJlZC9yZXNvdXJjZS1tb2RhbC5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3B3LXRyaWFsLTQtY29udGFjdC11cycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Jlc291cmNlLWNvbnRhY3QtdXMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Jlc291cmNlLWNvbnRhY3QtdXMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUcmlhbDRDb250YWN0VXNDb21wb25lbnRcbiAgICBleHRlbmRzIEFwcEJhc2VDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgICBAVmlld0NoaWxkKCdmb290ZXJTZWN0aW9uJywgeyBzdGF0aWM6IHRydWUgfSkgZm9vdGVyU2VjdGlvbiE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnYm9va01lZXRpbmcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250ZW50OiBUZW1wbGF0ZVJlZjxSZXNvdXJjZU1vZGFsQ29udGV4dD47XG4gICAgQFZpZXdDaGlsZCgnbG9nb01vZGFsJykgbG9nb01vZGFsOiBUZW1wbGF0ZVJlZjxDdXN0b21VcGxvYWRlckNvbXBvbmVudD47XG4gICAgQFZpZXdDaGlsZCgnbG9nb1VwbG9hZGVyJykgbG9nb1VwbG9hZGVyOiBDdXN0b21VcGxvYWRlckNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdodWJzcG90RWRpdE1vZGFsJykgaHVic3BvdEVkaXRNb2RhbDogVGVtcGxhdGVSZWY8UmVzb3VyY2VNb2RhbENvbnRleHQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3NvY2lhbEVkaXRNb2RhbCcpIHNvY2lhbEVkaXRNb2RhbDogVGVtcGxhdGVSZWY8Q3VzdG9tVXBsb2FkZXJDb21wb25lbnQ+O1xuXG4gICAgZWRpdGluZ1F1ZXN0aW9ucyA9IFtdO1xuICAgIGlzSHVic3BvdFJlYWR5OiBib29sZWFuO1xuXG4gICAgaXNGb290ZXJWaXNpYmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcj86IEludGVyc2VjdGlvbk9ic2VydmVyO1xuXG4gICAgYXN5bmMgb3BlblF1ZXN0aW9uc0VkaXRNb2RhbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lZGl0aW5nUXVlc3Rpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnF1ZXN0aW9ucyA/PyBbXSkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEeW5hbWljYWxseSBpbXBvcnQgRWRpdFF1ZXN0aW9uc01vZGFsQ29tcG9uZW50IChpbmNsdWRlcyBEcmFnRHJvcE1vZHVsZSlcbiAgICAgICAgICAgIC8vIFRoaXMgb25seSBsb2FkcyB3aGVuIHRoZSBlZGl0IG1vZGFsIGlzIG9wZW5lZCAodXNlciBpcyBsb2dnZWQgaW4gd2l0aCBlZGl0IHBlcm1pc3Npb25zKVxuICAgICAgICAgICAgLy8gUmVkdWNlcyBidW5kbGUgc2l6ZSBmb3IgbGFuZGluZyBwYWdlcyB3aGVyZSB1c2VycyBhcmVuJ3QgbG9nZ2VkIGluXG4gICAgICAgICAgICBjb25zdCB7IEVkaXRRdWVzdGlvbnNNb2RhbENvbXBvbmVudCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9saWIvZWRpdC1xdWVzdGlvbnMtbW9kYWwvZWRpdC1xdWVzdGlvbnMtbW9kYWwuY29tcG9uZW50Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0UXVlc3Rpb25zTW9kYWxDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBzaXplOiAnbGcnLFxuICAgICAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHdpbmRvd0NsYXNzOiAnbW9kYWwtaG9sZGVyJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmVkaXRpbmdRdWVzdGlvbnMgPSB0aGlzLmVkaXRpbmdRdWVzdGlvbnM7XG4gICAgICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5zYXZlLnN1YnNjcmliZSgodXBkYXRlZFF1ZXN0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVF1ZXN0aW9ucyhtb2RhbFJlZiwgdXBkYXRlZFF1ZXN0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbW9kYWxSZWYuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgZWRpdCBxdWVzdGlvbnMgbW9kYWw6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5lcnJvcignRmFpbGVkIHRvIG9wZW4gZWRpdCBtb2RhbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVkaXRpbmdZb3V0dWJlVXJsOiBzdHJpbmc7XG4gICAgZWRpdGluZ0xpbmtlZEluVXJsOiBzdHJpbmc7XG4gICAgZWRpdGluZ0NvbXBhbnlOYW1lOiBzdHJpbmc7XG5cbiAgICBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gICAgcmVjYXB0Y2hhID0gbnVsbDtcblxuICAgIHByZXZpZXdEYXRhO1xuXG4gICAgQElucHV0KCkgc3Vic2NyaXB0aW9uSWQgPSB0aGlzLmFwcENvbmZpZy5jcm0uc3Vic2NyaXB0aW9uX2lkO1xuICAgIEBJbnB1dCgpIHNvdXJjZUlkID0gdGhpcy5hcHBDb25maWcuY3JtLnNvdXJjZV9pZDtcbiAgICBASW5wdXQoKSBtYXN0ZXJTdWJzY3JpcHRpb25JZCA9IHRoaXMuYXBwQ29uZmlnLm1hc3Rlcl9zdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uX2lkO1xuICAgIEBJbnB1dCgpIGV4cGVyaW1lbnROYW1lO1xuICAgIEBJbnB1dCgpIG1pY3Jvc2VydmljZU5hbWU7XG4gICAgQElucHV0KCkgc2hhcmROYW1lO1xuICAgIEBJbnB1dCgpIHVzZXI6IFVzZXI7XG5cbiAgICBjYW5FZGl0UmVzb3VyY2VzVmFsdWUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSB1c2VyTG9nZ2VkSW46IGJvb2xlYW47XG5cbiAgICBpZDtcblxuICAgIGxvZ28gPSB0aGlzLmFwcENvbmZpZz8uY29tcGFueT8ubG9nb3M/Lm1haW5fY29udHJhc3Q/LnVybDtcbiAgICB0cmlhbEJnSW1hZ2UyID0gdGhpcy5hcHBDb25maWc/LnNpZ251cF9jb25maWcudHJpYWw/LmltYWdlX2JnMj8udXJsO1xuICAgIHRvc0lkID0gdGhpcy5hcHBDb25maWc/Lm1haW5fdG9zX2lkO1xuICAgIGRlc2NyaXB0aW9uID0gdGhpcy5hcHBDb25maWcuY29tcGFueS5kZXNjcmlwdGlvbjtcbiAgICBlbWFpbCA9IHRoaXMuYXBwQ29uZmlnLmNvbXBhbnkuZW1haWw7XG4gICAgY29tcGFueU5hbWUgPSB0aGlzLmFwcENvbmZpZy5jb21wYW55Lm5hbWU7XG4gICAgc3RyZWV0ID0gdGhpcy5hcHBDb25maWcuY29tcGFueS5zdHJlZXQ7XG4gICAgcXVlc3Rpb25zID0gdGhpcy5hcHBDb25maWc/LnBhZ2VzX2NvbmZpZz8uY29udGFjdF91cz8ucXVlc3Rpb25zO1xuICAgIGh1YnNwb3QgPSB0aGlzLmFwcENvbmZpZz8ucGFnZXNfY29uZmlnPy5jb250YWN0X3VzPy5odWJzcG90O1xuICAgIGZvb3RlckxpbmtzID0gdGhpcy5hcHBDb25maWc/LnBhZ2VzX2NvbmZpZz8uZm9vdGVyX2xpbmtzPy5pdGVtcztcblxuICAgIGZvb3RlckxpbmtzRGF0YSA9IHRoaXMuYXBwQ29uZmlnPy5wYWdlc19jb25maWc/LmZvb3Rlcl9saW5rcztcblxuICAgIHlvdXR1YmVVcmwgPSB0aGlzLmFwcENvbmZpZy5zb2NpYWw/LnlvdXR1YmVfdXJsO1xuICAgIGxpbmtlZEluVXJsID0gdGhpcy5hcHBDb25maWcuc29jaWFsPy5saW5rZWRpbl91cmw7XG4gICAgZG9tYWluSWQgPSB0aGlzLmFwcENvbmZpZy5kb21haW5faWQ7XG5cbiAgICBlZGl0aW5nRW1haWwgPSB0aGlzLmVtYWlsO1xuICAgIGlzRWRpdGluZ0VtYWlsID0gZmFsc2U7XG5cbiAgICBlZGl0aW5nSHVic3BvdEh0bWw6IHN0cmluZztcbiAgICBlZGl0aW5nSHVic3BvdElkOiBzdHJpbmc7XG4gICAgY2FwdGNoYUtleVYyOiBzdHJpbmc7XG4gICAgaHVic3BvdEh0bWw7XG5cbiAgICBhYlRlc3RzO1xuXG4gICAgc3VibWl0dGVkID0gZmFsc2U7XG4gICAgaXNDYXB0Y2hhVmVyaWZpZWQgPSBmYWxzZTtcbiAgICBpc0VtYWlsVmFsaWQgPSB0cnVlO1xuICAgIGlzRWRpdGluZ1N0cmVldCA9IGZhbHNlO1xuXG4gICAgcHNhT3B0aW9ucztcblxuICAgIHF1ZXN0aW9uO1xuXG4gICAgZWRpdGluZ0Zvb3RlckxpbmtzID0ge1xuICAgICAgICBpdGVtczogW11cbiAgICB9O1xuICAgIGVkaXRpbmdTdHJlZXQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNybVNlcnZpY2U6IENybVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWRtaW5TZXJ2aWNlOiBBZG1pblNlcnZpY2UsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhYlRlc3RTZXJ2aWNlOiBBYlRlc3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLmNhcHRjaGFLZXlWMiA9IHRoaXMuYXBwQ29uZmlnLmludGVncmF0aW9ucy5jYXB0Y2hhX2tleV9WMjtcbiAgICAgICAgdGhpcy5jb250YWN0VXNGb3JtKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuaXNIdWJzcG90UmVhZHkgPSB0cnVlKSwgMjAwMCk7XG4gICAgICAgIGlmICh0aGlzLnVzZXJMb2dnZWRJbikge1xuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSQoJ3Byb2R1Y3QnKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzID8gSlNPTi5wYXJzZShyZXMpIDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gZGF0YT8uc3Vic2NyaXB0aW9uSWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXZpZXdEYXRhID0ge1xuICAgICAgICAgICAgdXJsOiB0aGlzLmxvZ28sXG4gICAgICAgICAgICBuYW1lOiAnbG9nb19tYWluX2NvbnRyYXN0LnBuZydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lZGl0aW5nU3RyZWV0ID0gdGhpcy5zdHJlZXQ7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYXBwQ29uZmlnLnBhZ2VzX2NvbmZpZz8uYWJfdGVzdHMpKSB7XG4gICAgICAgICAgICB0aGlzLmFiVGVzdHMgPSB0aGlzLmFwcENvbmZpZy5wYWdlc19jb25maWcuYWJfdGVzdHMuZmluZChcbiAgICAgICAgICAgICAgICB0ZXN0ID0+IHRlc3QuZGVzY3JpcHRpb24gPT09ICdjb250YWN0LXVzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubWljcm9zZXJ2aWNlTmFtZSA9IHRoaXMuYWJUZXN0cz8ubWljcm9zZXJ2aWNlX25hbWU7XG4gICAgICAgICAgICB0aGlzLmV4cGVyaW1lbnROYW1lID0gdGhpcy5hYlRlc3RzPy5leHBlcmltZW50X25hbWU7XG4gICAgICAgICAgICB0aGlzLnNoYXJkTmFtZSA9IHRoaXMuYWJUZXN0cz8uZGJfc2hhcmQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb290ZXJJdGVtID0gdGhpcy5nZXRGb290ZXJIdWJzcG90Rm9ybSgpO1xuICAgICAgICBpZiAoZm9vdGVySXRlbT8uZGl2KSB7XG4gICAgICAgICAgICAvLyBOT1NPTkFSOiBUcnVzdGVkIEhUTUwgY29udGVudCBpcyBoYW5kbGVkIHNhZmVseSBoZXJlXG4gICAgICAgICAgICB0aGlzLmh1YnNwb3RIdG1sID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoZm9vdGVySXRlbS5kaXYpOyAvLyBOT1NPTkFSXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0aW5nUXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9ucz8uWzBdPy5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy5wc2FPcHRpb25zID0gW1xuICAgICAgICAgICAgeyBsYWJlbDogJ1NlbGVjdCBQU0EnLCB2YWx1ZTogJycgfSxcbiAgICAgICAgICAgIC4uLih0aGlzLnF1ZXN0aW9ucz8uWzBdPy5vcHRpb25zID8/IFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIocSA9PiBxLm9wdGlvbj8udHJpbSgpKVxuICAgICAgICAgICAgICAgIC5tYXAocSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogcS5vcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBxLm9wdGlvblxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICBdO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWyd1c2VyJ10gfHwgY2hhbmdlc1sndXNlckxvZ2dlZEluJ10pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZXJMb2dnZWRJbiAmJiB0aGlzLnVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbkVkaXRSZXNvdXJjZXNWYWx1ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3BlbkxvZ29FZGl0TW9kYWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5sb2dvTW9kYWwsIHtcbiAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgc2l6ZTogJ21kJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblNhdmVGaWxlKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb25JZCB9O1xuXG4gICAgICAgIGlmIChldmVudC5maWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgZGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LmZpbGU7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZmlsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZGF0YVtgcmVtb3ZlXyR7ZXZlbnQubmFtZX1gXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBkYXRhW2tleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2UudXBkYXRlRG9tYWluQ29uZmlnKHRoaXMuZG9tYWluSWQsIGZvcm1EYXRhKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ28gPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmZpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhldmVudC5maWxlID8gJ0xvZ28gdXBkYXRlZCcgOiAnTG9nbyByZW1vdmVkJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNhdmVRdWVzdGlvbnMobW9kYWwsIHVwZGF0ZWRRdWVzdGlvbnM/OiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBxdWVzdGlvbnNUb1NhdmUgPSB1cGRhdGVkUXVlc3Rpb25zIHx8IHRoaXMuZWRpdGluZ1F1ZXN0aW9ucztcbiAgICAgICAgY29uc3QgdXBkYXRlRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRhY3RfdXM6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmFwcENvbmZpZy5wYWdlc19jb25maWc/LmNvbnRhY3RfdXMsXG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zOiBxdWVzdGlvbnNUb1NhdmVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuaWRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZS51cGRhdGVEb21haW5Db25maWcodGhpcy5kb21haW5JZCwgdXBkYXRlRGF0YSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zID0gcXVlc3Rpb25zVG9TYXZlO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdRdWVzdGlvbnMgdXBkYXRlZCcpO1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHF1ZXN0aW9uc1RvU2F2ZT8uWzBdPy5xdWVzdGlvbjtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbnNUb1NhdmU/LlswXT8ub3B0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHNhT3B0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogJ1NlbGVjdCBQU0EnLCB2YWx1ZTogJycgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHF1ZXN0aW9uc1RvU2F2ZT8uWzBdPy5vcHRpb25zID8/IFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihxID0+IHEub3B0aW9uPy50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKHEgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcS5vcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHEub3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBzYU9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBvcGVuU29jaWFsRWRpdE1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdZb3V0dWJlVXJsID0gdGhpcy55b3V0dWJlVXJsO1xuICAgICAgICB0aGlzLmVkaXRpbmdMaW5rZWRJblVybCA9IHRoaXMubGlua2VkSW5Vcmw7XG4gICAgICAgIHRoaXMuZWRpdGluZ0NvbXBhbnlOYW1lID0gdGhpcy5jb21wYW55TmFtZTtcblxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuc29jaWFsRWRpdE1vZGFsLCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbGcnIH0pO1xuICAgIH1cblxuICAgIHNhdmVTb2NpYWxMaW5rcyhtb2RhbCk6IHZvaWQge1xuICAgICAgICBjb25zdCB1cGRhdGVEYXRhID0ge1xuICAgICAgICAgICAgeW91dHViZV91cmw6IHRoaXMuZWRpdGluZ1lvdXR1YmVVcmwsXG4gICAgICAgICAgICBsaW5rZWRpbl91cmw6IHRoaXMuZWRpdGluZ0xpbmtlZEluVXJsLFxuICAgICAgICAgICAgY29tcGFueV9uYW1lOiB0aGlzLmVkaXRpbmdDb21wYW55TmFtZSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmRvbWFpbklkLCB1cGRhdGVEYXRhKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy55b3V0dWJlVXJsID0gdGhpcy5lZGl0aW5nWW91dHViZVVybDtcbiAgICAgICAgICAgIHRoaXMubGlua2VkSW5VcmwgPSB0aGlzLmVkaXRpbmdMaW5rZWRJblVybDtcbiAgICAgICAgICAgIHRoaXMuY29tcGFueU5hbWUgPSB0aGlzLmVkaXRpbmdDb21wYW55TmFtZTtcbiAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnU29jaWFsIGxpbmtzIGFuZCBjb21wYW55IG5hbWUgdXBkYXRlZCcpO1xuICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFzVmFsaWRPcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnM/LlswXT8ub3B0aW9ucz8uc29tZShvcHQgPT4gb3B0Lm9wdGlvbj8udHJpbSgpKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMud2F0Y2hJZnJhbWVIZWlnaHRDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihcbiAgICAgICAgICAgIChbZW50cnldKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGb290ZXJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgdGhyZXNob2xkOiAwLjEgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmZvb3RlclNlY3Rpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3BlbkVkaXRGb290ZXJMaW5rc01vZGFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmZvb3RlckxpbmtzRGF0YSA9IHRoaXMuZm9vdGVyTGlua3NEYXRhID8/IHt9O1xuICAgICAgICB0aGlzLmZvb3RlckxpbmtzRGF0YS5pdGVtcyA9IHRoaXMuZm9vdGVyTGlua3NEYXRhLml0ZW1zID8/IFtdO1xuICAgICAgICB0aGlzLmVkaXRpbmdGb290ZXJMaW5rcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mb290ZXJMaW5rc0RhdGEpKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRHluYW1pY2FsbHkgaW1wb3J0IEVkaXRGb290ZXJMaW5rc01vZGFsQ29tcG9uZW50IChpbmNsdWRlcyBEcmFnRHJvcE1vZHVsZSlcbiAgICAgICAgICAgIC8vIFRoaXMgb25seSBsb2FkcyB3aGVuIHRoZSBlZGl0IG1vZGFsIGlzIG9wZW5lZCAodXNlciBpcyBsb2dnZWQgaW4gd2l0aCBlZGl0IHBlcm1pc3Npb25zKVxuICAgICAgICAgICAgLy8gUmVkdWNlcyBidW5kbGUgc2l6ZSBmb3IgbGFuZGluZyBwYWdlcyB3aGVyZSB1c2VycyBhcmVuJ3QgbG9nZ2VkIGluXG4gICAgICAgICAgICBjb25zdCB7IEVkaXRGb290ZXJMaW5rc01vZGFsQ29tcG9uZW50IH0gPSBhd2FpdCBpbXBvcnQoJy4uL2xpYi9lZGl0LWZvb3Rlci1saW5rcy1tb2RhbC9lZGl0LWZvb3Rlci1saW5rcy1tb2RhbC5jb21wb25lbnQnKTtcblxuICAgICAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRGb290ZXJMaW5rc01vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgc2l6ZTogJ2xnJyxcbiAgICAgICAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcidcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5lZGl0aW5nRm9vdGVyTGlua3MgPSB0aGlzLmVkaXRpbmdGb290ZXJMaW5rcztcbiAgICAgICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNhdmUuc3Vic2NyaWJlKCh1cGRhdGVkRm9vdGVyTGlua3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb290ZXJMaW5rcyhtb2RhbFJlZiwgdXBkYXRlZEZvb3RlckxpbmtzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xvc2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBtb2RhbFJlZi5jbG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBlZGl0IGZvb3RlciBsaW5rcyBtb2RhbDonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmVycm9yKCdGYWlsZWQgdG8gb3BlbiBlZGl0IG1vZGFsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3YXRjaElmcmFtZUhlaWdodENoYW5nZSgpIHtcbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaHVic3BvdC1jb250YWluZXInKTtcbiAgICAgICAgaWYgKCFpZnJhbWUpIHJldHVybjtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBpZnJhbWVbJ29mZnNldEhlaWdodCddO1xuICAgICAgICAgICAgaWYgKG5ld0hlaWdodCA9PT0gMjUwKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsQWJUZXN0RmluaXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDMwMCk7XG4gICAgfVxuXG4gICAgLy8gTmV3IG1ldGhvZCB0byBoYW5kbGUgSHVic3BvdCBjb250ZW50IGxvYWRpbmdcbiAgICBvbkh1YnNwb3RMb2FkKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjb250ZW50LWxvYWRlZCcpO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsOiBUcmlnZ2VyIGxheW91dCByZWNhbGN1bGF0aW9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxsQWJUZXN0RmluaXNoKCkge1xuICAgICAgICBpZiAodGhpcy5leHBlcmltZW50TmFtZSAmJiB0aGlzLm1pY3Jvc2VydmljZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuYWJUZXN0U2VydmljZVxuICAgICAgICAgICAgICAgIC5maW5pc2hBQkV4cGVyaW1lbnQodGhpcy5leHBlcmltZW50TmFtZSwgdGhpcy5taWNyb3NlcnZpY2VOYW1lKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY29udGVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcidcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250YWN0VXNGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGZpcnN0X25hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBsYXN0X25hbWU6IFsnJ10sXG4gICAgICAgICAgICBjb21wYW55OiBbJyddLFxuICAgICAgICAgICAgcHNhOiBbJyddLFxuICAgICAgICAgICAgZW5xdWlyeTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGVtYWlsOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNDYXB0Y2hhVmVyaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVN1Y2Nlc3ModG9rZW46IHN0cmluZykge1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UudmFsaWRhdGVSZUNhcHRjaGEodG9rZW4pLnN1YnNjcmliZSgoaXNTdWNjZXNzOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzU3VjY2VzcyAmJiB0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHsgLi4udGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRW5xdWlyeSA9IGAke2RhdGEuZW5xdWlyeX07IFF1ZXN0aW9uOiAke3RoaXMucXVlc3Rpb259OyBBbnN3ZXI6ICR7ZGF0YS5wc2F9YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zdERhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lOiBgJHtkYXRhLmZpcnN0X25hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbmFtZTogYCR7ZGF0YS5maXJzdF9uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYW55OiBgJHtkYXRhLmZpcnN0X25hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBgJHtkYXRhLmVtYWlsfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnF1aXJ5OiB0aGlzLnBzYU9wdGlvbnMubGVuZ3RoID8gZm9ybWF0dGVkRW5xdWlyeSA6IGAke2RhdGEuZW5xdWlyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHNhOiBkYXRhLnBzYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNybV9zb3VyY2VfaWQ6IHRoaXMuc291cmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfc3Vic2NyaXB0aW9uX2lkOiB0aGlzLm1hc3RlclN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5X3VzZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWFudWFsOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZS5wb3N0Q3JtTGVhZCh0aGlzLnN1YnNjcmlwdGlvbklkLCBwb3N0RGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGV4YW1wbGUgb2Ygc25pcHBldCB0byBjbG9zZSB0aGUgZXhwZXJpbWVudCBhbmQgdHJhY2sgaW4gR0FcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwPy5zdGF0dXMgPT09IFN0YXR1c0NvZGVzLk9LKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nb29nbGVBbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ldy1sZWFkLXJlZ2lzdHJhdGlvbicsIC8vIGNhdGVnb3J5LCBlZzogdmlkZW9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJzY3JpYmUtc3VjY2VzcycsIC8vIGFjdGlvbiwgZWc6IFBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbWluZy1zb29uLXRocmVlJywgLy8gbGFiZWwsIGVnOiBDaGFwcHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvLyB2YWx1ZSwgZWc6IDEwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5leHBlcmltZW50TmFtZSAmJiB0aGlzLm1pY3Jvc2VydmljZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hYlRlc3RTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluaXNoQUJFeHBlcmltZW50KHRoaXMuZXhwZXJpbWVudE5hbWUsIHRoaXMubWljcm9zZXJ2aWNlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5jb250ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZShyZXNwLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NhcHRjaGFWZXJpZmllZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNjcm9sbFRvVG9wKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH1cblxuICAgIGdldEZvb3Rlckh1YnNwb3RGb3JtKCkge1xuICAgICAgICBpZiAoIXRoaXMuaHVic3BvdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh1YnNwb3QuZmluZChpdGVtID0+IGl0ZW0ucG9zaXRpb24gPT09ICdmb290ZXInKSA/PyBudWxsO1xuICAgIH1cblxuICAgIG5hdmlnYXRlVG9Cb29rTWVldGluZygpIHtcbiAgICAgICAgY29uc3QgYm9va0RlbW9VcmwgPVxuICAgICAgICAgICAgdGhpcy5hcHBDb25maWc/LnNpZ251cF9jb25maWc/LnRyaWFsPy5ib29rX2RlbW9fdXJsID8/XG4gICAgICAgICAgICAnaHR0cHM6Ly9jYWxlbmRseS5jb20vY2xvdWRvbGl2ZSc7XG4gICAgICAgIHdpbmRvdy5vcGVuKGJvb2tEZW1vVXJsLCAnX2JsYW5rJywgJ25vcmVmZXJyZXIgbm9vcGVuZXInKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUVtYWlsKCkge1xuICAgICAgICBjb25zdCBlbWFpbCA9IHRoaXMuZm9ybS5nZXQoJ2VtYWlsJykudmFsdWU7XG4gICAgICAgIGlmIChlbWFpbCkge1xuICAgICAgICAgICAgdGhpcy5pc0VtYWlsVmFsaWQgPSBWYWxpZGF0aW9uU2VydmljZS5lbWFpbChlbWFpbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRW1haWxWYWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzYXZlRm9vdGVyTGlua3MobW9kYWwsIHVwZGF0ZWRGb290ZXJMaW5rcz86IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb290ZXJMaW5rc1RvU2F2ZSA9IHVwZGF0ZWRGb290ZXJMaW5rcyB8fCB0aGlzLmVkaXRpbmdGb290ZXJMaW5rcztcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHtcbiAgICAgICAgICAgIGZvb3Rlcl9saW5rczogZm9vdGVyTGlua3NUb1NhdmUsXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuaWRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmFwcENvbmZpZz8uZG9tYWluX2lkLCB1cGRhdGVkQ29uZmlnKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdGb290ZXIgbGlua3MgdXBkYXRlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyTGlua3MgPSBbLi4uZm9vdGVyTGlua3NUb1NhdmUuaXRlbXNdO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyTGlua3NEYXRhID0geyAuLi5mb290ZXJMaW5rc1RvU2F2ZSB9O1xuICAgICAgICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzYXZlRW1haWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW1haWwgPSB0aGlzLmVkaXRpbmdFbWFpbDtcblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmFwcENvbmZpZz8uZG9tYWluX2lkLCB7XG4gICAgICAgICAgICAgICAgY29tcGFueV9lbWFpbDogdGhpcy5lZGl0aW5nRW1haWwsXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLmlkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdFbWFpbCB1cGRhdGVkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0VkaXRpbmdFbWFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2F2ZVN0cmVldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVEb21haW5Db25maWcodGhpcy5hcHBDb25maWc/LmRvbWFpbl9pZCwge1xuICAgICAgICAgICAgICAgIGNvbXBhbnlfYWRkcmVzczogdGhpcy5lZGl0aW5nU3RyZWV0LFxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnU3RyZWV0IHVwZGF0ZWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVldCA9IHRoaXMuZWRpdGluZ1N0cmVldDtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRWRpdGluZ1N0cmVldCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FuY2VsU3RyZWV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdTdHJlZXQgPSB0aGlzLnN0cmVldDtcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdTdHJlZXQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvcGVuSHVic3BvdEVkaXRNb2RhbChmb290ZXJJdGVtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdGluZ0h1YnNwb3RIdG1sID0gZm9vdGVySXRlbS5kaXY7XG4gICAgICAgIHRoaXMuZWRpdGluZ0h1YnNwb3RJZCA9IGZvb3Rlckl0ZW0uaWQ7XG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5odWJzcG90RWRpdE1vZGFsLCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbGcnIH0pO1xuICAgIH1cblxuICAgIHNhdmVIdWJzcG90SHRtbChtb2RhbCk6IHZvaWQge1xuICAgICAgICBjb25zdCB1cGRhdGVkQ29uZmlnID0ge1xuICAgICAgICAgICAgY29udGFjdF91czoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuYXBwQ29uZmlnPy5wYWdlc19jb25maWc/LmNvbnRhY3RfdXMsXG4gICAgICAgICAgICAgICAgaHVic3BvdDogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogJzc0MjM2MzknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdmb290ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2OiB0aGlzLmVkaXRpbmdIdWJzcG90SHRtbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAudXBkYXRlRG9tYWluQ29uZmlnKHRoaXMuYXBwQ29uZmlnPy5kb21haW5faWQsIHVwZGF0ZWRDb25maWcpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBOT1NPTkFSOiBUcnVzdGVkIEhUTUwgY29udGVudCBpcyBoYW5kbGVkIHNhZmVseSBoZXJlXG4gICAgICAgICAgICAgICAgdGhpcy5odWJzcG90SHRtbCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMuZWRpdGluZ0h1YnNwb3RIdG1sKTsgLy8gTk9TT05BUlxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnSHVic3BvdCBFbWJlZCB1cGRhdGVkJyk7XG4gICAgICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIHVwZGF0ZUNhbkVkaXRSZXNvdXJjZXNWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYW5FZGl0UmVzb3VyY2VzVmFsdWUgPSBIZWxwZXJTZXJ2aWNlLmNhbkVkaXRSZXNvdXJjZXMoXG4gICAgICAgICAgICB0aGlzLnVzZXIsXG4gICAgICAgICAgICB0aGlzLnVzZXJMb2dnZWRJbixcbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjYW5FZGl0UmVzb3VyY2VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5FZGl0UmVzb3VyY2VzVmFsdWU7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG4iLCI8c2VjdGlvbiAgI2Zvb3RlclNlY3Rpb24gY2xhc3M9XCJiZy1ibGFjayB0ZXh0LXdoaXRlIHB5LTUgZm9vdGVyLXNlY3Rpb25cIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiICpuZ0lmPVwiaXNGb290ZXJWaXNpYmxlXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuXG4gICAgICA8IS0tIExFRlQgQ09MVU1OIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IG1iLTQgZC1mbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCIgW25nQ2xhc3NdPVwieyAnc2l0ZS1jb2x1bW4nOiBnZXRGb290ZXJIdWJzcG90Rm9ybSgpIH1cIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJtYi00IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMiB0ZXh0LXdoaXRlXCI+U2l0ZSBNYXA6PC9zcGFuPlxuICAgICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIiBjbGFzcz1cImZhIGZhLWVkaXQgaW4tcGFnZS1lZGl0LWljb24gY3Vyc29yLXBvaW50ZXIgdGV4dC13aGl0ZSBtcy0zXCIgKGNsaWNrKT1cIm9wZW5FZGl0Rm9vdGVyTGlua3NNb2RhbCgpXCIgKGtleWRvd24uZW50ZXIpPVwib3BlbkVkaXRGb290ZXJMaW5rc01vZGFsKClcIiAoa2V5ZG93bi5zcGFjZSk9XCJvcGVuRWRpdEZvb3RlckxpbmtzTW9kYWwoKVwiIG5nYlRvb2x0aXA9XCJFZGl0IEZvb3RlciBMaW5rc1wiPjwvaT5cbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDx1bCBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICAgIDxsaSByb3V0ZXJMaW5rPVwiL1wiXG4gICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHVzZXItaW5mby1sYWJlbCBsaW5rLWxhYmVsXCI+IEhvbWUgPC9saT5cbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbGluayBvZiBmb290ZXJMaW5rc1wiIFtyb3V0ZXJMaW5rXT1cImxpbms/LnBhdGhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHVzZXItaW5mby1sYWJlbCBsaW5rLWxhYmVsIG10LTRcIj48c3BhbiAgKm5nSWY9XCJsaW5rPy50aXRsZVwiPnt7bGluaz8udGl0bGV9fTwvc3Bhbj4gPC9saT5cbiAgICAgICAgICAgIDxsaSByb3V0ZXJMaW5rPVwiL2xvZ2luXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB1c2VyLWluZm8tbGFiZWwgbXQtNCBsaW5rLWxhYmVsXCI+IExvZyBpbiA8L2xpPlxuICAgICAgICAgICAgPGxpIFtyb3V0ZXJMaW5rXT1cIicvcHJpdmFjeS1hbmQtdG9zLycgKyB0b3NJZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdXNlci1pbmZvLWxhYmVsIG10LTQgbGluay1sYWJlbFwiPiBQcml2YWN5IHN0YXRlbWVudCA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPHAgY2xhc3M9XCJhZGRyZXNzLXNlY3Rpb24gZW1haWwtc2VjdGlvbiBtYi00XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVzZXItaW5mby1sYWJlbFwiPkVtYWlsOiA8L3NwYW4+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRWRpdGluZ0VtYWlsOyBlbHNlIGVkaXRFbWFpbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVzZXItaW5mb1wiPnt7IGVtYWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cImNhbkVkaXRSZXNvdXJjZXNWYWx1ZVwiIGNsYXNzPVwiZmEgZmEtZWRpdCBpbi1wYWdlLWVkaXQtaWNvbiB0ZXh0LXdoaXRlIGN1cnNvci1wb2ludGVyIG1zLTNcIiAoY2xpY2spPVwiaXNFZGl0aW5nRW1haWwgPSB0cnVlXCIgKGtleWRvd24uZW50ZXIpPVwiaXNFZGl0aW5nRW1haWwgPSB0cnVlXCIgKGtleWRvd24uc3BhY2UpPVwiaXNFZGl0aW5nRW1haWwgPSB0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdEVtYWlsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBkLWlubGluZSB3LWF1dG9cIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZWRpdGluZ0VtYWlsXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXMtMlwiIChjbGljayk9XCJzYXZlRW1haWwoKVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeSBtcy0yXCIgKGNsaWNrKT1cImlzRWRpdGluZ0VtYWlsID0gZmFsc2VcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtYWlsLXNlY3Rpb24gbXQtMyBhZGRyZXNzLXRleHRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidXNlci1pbmZvLWxhYmVsXCI+XG4gICAgICAgICAgICAgIEFkZHJlc3M6XG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGluLXBhZ2UtZWRpdC1pY29uIGN1cnNvci1wb2ludGVyIG1zLTIgdGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgIHRpdGxlPVwiRWRpdCBBZGRyZXNzXCJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzRWRpdGluZ1N0cmVldCA9IHRydWVcIlxuICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJpc0VkaXRpbmdTdHJlZXQgPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiaXNFZGl0aW5nU3RyZWV0ID0gdHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj48YnIvPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRWRpdGluZ1N0cmVldDsgZWxzZSBlZGl0U3RyZWV0QmxvY2tcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGRyZXNzLXRleHQgdXNlci1pbmZvXCI+e3sgc3RyZWV0IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdFN0cmVldEJsb2NrPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIFsobmdNb2RlbCldPVwiZWRpdGluZ1N0cmVldFwiIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXMtMlwiIChjbGljayk9XCJzYXZlU3RyZWV0KClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeSBtcy0yXCIgKGNsaWNrKT1cImNhbmNlbFN0cmVldCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgIDxpbWcgW3NyY109XCJsb2dvXCJcbiAgICAgICAgICAgICAgIGFsdD1cIkNvbXBhbnkgbG9nb1wiXG4gICAgICAgICAgICAgICBjbGFzcz1cImltZy1mbHVpZCBtdC00IGxvZ28taW1hZ2UgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgd2lkdGg9XCIxNjBcIlxuICAgICAgICAgICAgICAgaGVpZ2h0PVwiMzVcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInNjcm9sbFRvVG9wKClcIlxuICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2Nyb2xsVG9Ub3AoKVwiXG4gICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJzY3JvbGxUb1RvcCgpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xpY2sgdG8gZ28gdG8gdG9wIG9mIHBhZ2VcIiAvPlxuICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCJcbiAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWVkaXQgaW4tcGFnZS1lZGl0LWljb24gZmEtc20gbXMtMyBjdXJzb3ItcG9pbnRlciB0ZXh0LXdoaXRlIGFsaWduLXNlbGYtY2VudGVyIG10LTNcIlxuICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTG9nb0VkaXRNb2RhbCgpXCJcbiAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvcGVuTG9nb0VkaXRNb2RhbCgpXCJcbiAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvcGVuTG9nb0VkaXRNb2RhbCgpXCJcbiAgICAgICAgICAgICB0aXRsZT1cIkVkaXQgTG9nb1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSSUdIVCBDT0xVTU4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiAqbmdJZj1cImlzRm9vdGVyVmlzaWJsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Rm9vdGVySHVic3BvdEZvcm0oKSBhcyBmb290ZXJJdGVtOyBlbHNlIGRlZmF1bHRGb3JtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzSHVic3BvdFJlYWR5XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImh1YnNwb3QtY29udGFpbmVyIHctMTAwIGNvbnRlbnQtbG9hZGVkXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImh1YnNwb3RIdG1sXCJcbiAgICAgICAgICAgICAgICAobG9hZCk9XCJvbkh1YnNwb3RMb2FkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGluLXBhZ2UtZWRpdC1pY29uIHRleHQtd2hpdGUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbkh1YnNwb3RFZGl0TW9kYWwoZm9vdGVySXRlbSlcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvcGVuSHVic3BvdEVkaXRNb2RhbChmb290ZXJJdGVtKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9wZW5IdWJzcG90RWRpdE1vZGFsKGZvb3Rlckl0ZW0pXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJFZGl0IEh1YnNwb3QgRW1iZWRcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEZvcm0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtd2hpdGUgbWItNFwiPiA8c3BhbiBjbGFzcz1cInRleHQtd2hpdGVcIj5HZXQgaW4gdG91Y2g6PC9zcGFuPjwvaDM+XG4gICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZWRpdCBpbi1wYWdlLWVkaXQtaWNvbiB0ZXh0LXdoaXRlIGN1cnNvci1wb2ludGVyIG1zLTMgbXQtMlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5RdWVzdGlvbnNFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib3BlblF1ZXN0aW9uc0VkaXRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvcGVuUXVlc3Rpb25zRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRWRpdCBRdWVzdGlvbnNcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWZvcm1cIj5cbiAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbWFpbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbWFpbFwiPkVtYWlsOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHctZmllbGQtZXJyb3ItZGlzcGxheSBbZGlzcGxheUVycm9yXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9ybS5nZXQoJ2VtYWlsJykudmFsaWQgJiYgKGZvcm0uZ2V0KCdlbWFpbCcpLnRvdWNoZWQgfHwgc3VibWl0dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnPVwiRW1haWwgaXMgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1maWVsZC1lcnJvci1kaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlyc3RfbmFtZVwiPkZpcnN0IG5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImZpcnN0X25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3RfbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwdy1maWVsZC1lcnJvci1kaXNwbGF5IFtkaXNwbGF5RXJyb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFmb3JtLmdldCgnZmlyc3RfbmFtZScpLnZhbGlkICYmIChmb3JtLmdldCgnZmlyc3RfbmFtZScpLnRvdWNoZWQgfHwgc3VibWl0dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnPVwiRmlyc3QgbmFtZSBpcyByZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L3B3LWZpZWxkLWVycm9yLWRpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsYXN0X25hbWVcIj5MYXN0IG5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJsYXN0X25hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFzdF9uYW1lXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbXBhbnlcIj5Db21wYW55OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb21wYW55XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCIgKm5nSWY9XCJoYXNWYWxpZE9wdGlvbnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwc2FcIiBjbGFzcz1cInNlbGVjdC1sYWJlbFwiPnt7cXVlc3Rpb259fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBzYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJwc2FPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IFBTQSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cImlucHV0LXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImVucXVpcnlcIiBjbGFzcz1cInNlbGVjdC1sYWJlbFwiPkhvdyBjYW4gd2UgaGVscCB5b3U/PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW5xdWlyeS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhICBpZD1cImVucXVpcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJlbnF1aXJ5XCIgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHB3LWZpZWxkLWVycm9yLWRpc3BsYXkgW2Rpc3BsYXlFcnJvcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWZvcm0uZ2V0KCdlbnF1aXJ5JykudmFsaWQgJiYgKGZvcm0uZ2V0KCdlbnF1aXJ5JykudG91Y2hlZCB8fCBzdWJtaXR0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2c9XCJFbnF1aXJ5IGlzIHJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvcHctZmllbGQtZXJyb3ItZGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXB0Y2hhLXdyYXBwZXItY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNDYXB0Y2hhVmVyaWZpZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxuZ3gtcmVjYXB0Y2hhMiBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgICAgICAgICAgICBbc2l0ZUtleV09XCJjYXB0Y2hhS2V5VjJcIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwibm9ybWFsXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZWNhcHRjaGFcIlxuICAgICAgICAgICAgICAgICAgICAoc3VjY2Vzcyk9XCJoYW5kbGVTdWNjZXNzKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDwvbmd4LXJlY2FwdGNoYTI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TdWJtaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzQ2FwdGNoYVZlcmlmaWVkXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaWduLWJ0biBzaWduLWhlYWRlci1idG4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQnV0dG9uLlN1Ym1pdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb25zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgW2V2ZW50VHJhY2tlcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ3lvdXR1YmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2xpY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdjbG91ZG9saXZlLWxhbmRpbmctcGFnZS1iJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwieW91dHViZVVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltZy9pY29ucy95b3V0dWJlLnBuZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImltZy1mbHVpZCB5b3V0dWJlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI1NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCI1NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtldmVudFRyYWNrZXJdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdsaW5rZWRpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ2Nsb3Vkb2xpdmUtbGFuZGluZy1wYWdlLWInLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDFcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJsaW5rZWRJblVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaW1nL2ljb25zL3NvY2lhbC9saW5rZWRpbi5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWctZmx1aWQgbGlua2VkaW4taWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjQ4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjQ4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWVkaXQgaW4tcGFnZS1lZGl0LWljb24gdGV4dC13aGl0ZSBjdXJzb3ItcG9pbnRlciBtcy0zXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb2NpYWxFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9wZW5Tb2NpYWxFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9wZW5Tb2NpYWxFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRWRpdCBTb2NpYWwgTGlua3MgJiBDb21wYW55IE5hbWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3B5cmlnaHQgdGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAyMDI1IHt7Y29tcGFueU5hbWV9fS5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG5cblxuXG48bmctdGVtcGxhdGUgI2Jvb2tNZWV0aW5nXG4gIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImJ0bi1jbG9zZSBmbG9hdC1lbmRcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgPGgzIGNsYXNzPVwidGV4dC1jZW50ZXIgbW9kYWwtYmFzaWMtdGl0bGVcIj5cbiAgICAgIFRoYW5rcyBmb3IgZ2V0dGluZyBpbiB0b3VjaCEgT3VyIHRlYW0gd2lsbCBiZSBpbiBjb250YWN0IHNob3J0bHksIG9yIHdlXG4gICAgICBjYW4gY29tcGFyZSBjYWxlbmRhcnMgbm93ICZhbXA7IHNjaGVkdWxlIGEgdGltZVxuICAgIDwvaDM+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtldmVudFRyYWNrZXJdPVwie1xuICAgICAgICBjYXRlZ29yeTogJ3JlcXVlc3QtZGVtbycsXG4gICAgICAgIGFjdGlvbjogJ2NsaWNrJyxcbiAgICAgICAgbGFiZWw6ICdjbG91ZG9saXZlLWxhbmRpbmctcGFnZS1iJyxcbiAgICAgICAgdmFsdWU6IDFcbiAgICAgIH1cIlxuICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlVG9Cb29rTWVldGluZygpXCJcbiAgICAgIGNsYXNzPVwic2lnbi1idG4gc2lnbi1oZWFkZXItYnRuIG14LWF1dG8gZC1ibG9jayBtYi0zXCI+XG4gICAgICBMZXQncyBkbyBpdFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuXG5cblxuXG5cbjxuZy10ZW1wbGF0ZSAjbG9nb01vZGFsIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+VXBsb2FkIExvZ288L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8cHctY3VzdG9tLXVwbG9hZGVyXG4gICAgICBbYXNwZWN0UmF0aW9dPVwiJ2Z1bGxMb2dvJ1wiXG4gICAgICBbdGl0bGVdPVwiJ01haW4gQ29udHJhc3QgTG9nbydcIlxuICAgICAgW2NvbnRyb2xOYW1lXT1cIidsb2dvX21haW5fY29udHJhc3QnXCJcbiAgICAgIFtwcmV2aWV3RGF0YV09XCJwcmV2aWV3RGF0YVwiXG4gICAgICAoc2F2ZUV2ZW50KT1cIm9uU2F2ZUZpbGUoJGV2ZW50KVwiPlxuICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuXG48bmctdGVtcGxhdGUgI2h1YnNwb3RFZGl0TW9kYWwgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5FZGl0IEh1YnNwb3QgRW1iZWQ8L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxhYmVsIGZvcj1cImh1YnNwb3RJZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkh1YnNwb3QgSUQ8L2xhYmVsPlxuICAgICAgPGlucHV0IGlkPVwiaHVic3BvdElkXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nSHVic3BvdElkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiaHVic3BvdEVtYmVkRGl2XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RW1iZWQgRElWPC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImh1YnNwb3RFbWJlZERpdlwiIFsobmdNb2RlbCldPVwiZWRpdGluZ0h1YnNwb3RIdG1sXCIgcm93cz1cIjhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlSHVic3BvdEh0bWwobW9kYWwpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy10ZW1wbGF0ZSAjc29jaWFsRWRpdE1vZGFsIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+RWRpdCBTb2NpYWwgTGlua3MgJiBDb21wYW55IE5hbWU8L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxhYmVsIGZvcj1cInlvdXR1YmVVcmxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Zb3VUdWJlIFVSTDwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJ5b3V0dWJlVXJsXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nWW91dHViZVVybFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxhYmVsIGZvcj1cImxpbmtlZGluVXJsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+TGlua2VkSW4gVVJMPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cImxpbmtlZGluVXJsXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nTGlua2VkSW5VcmxcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJjb21wYW55TmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvbXBhbnkgTmFtZTwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJjb21wYW55TmFtZVwiIFsobmdNb2RlbCldPVwiZWRpdGluZ0NvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic2F2ZVNvY2lhbExpbmtzKG1vZGFsKVwiPlNhdmU8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+Q2FuY2VsPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG5cblxuXG5cbiJdfQ==