tango-app-ui-store-ticket-infra 3.7.9 → 3.7.11

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.
@@ -1,6 +1,7 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { Subject, takeUntil } from 'rxjs';
3
3
  import { RemoteTerminalComponent } from '../ticket-infra-v2/remote-terminal/remote-terminal.component';
4
+ import { StoreCallComponent } from '../ticket-infra-v2/store-call/store-call.component';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "tango-app-ui-global";
6
7
  import * as i2 from "@angular/router";
@@ -190,22 +191,34 @@ export class TangoStoreInfraComponent {
190
191
  // Open / close time from the store profile, as the store header shows them.
191
192
  storeOpen = '';
192
193
  storeClose = '';
194
+ // The card reloads on every header Apply. While a load runs its part of the
195
+ // card shimmers; each load is numbered so only the latest reply is applied -
196
+ // an older, slower one can never overwrite it.
197
+ storeLoading = false;
198
+ liveLoading = false;
199
+ storeReq = 0;
200
+ liveReq = 0;
193
201
  loadStoreName(storeId) {
202
+ const req = ++this.storeReq;
194
203
  this.storeNameFromApi = '';
195
204
  this.storeOpen = '';
196
205
  this.storeClose = '';
197
- if (!storeId)
206
+ if (!storeId) {
207
+ this.storeLoading = false;
198
208
  return;
209
+ }
210
+ this.storeLoading = true;
199
211
  this.ticketsService.getStoreDetails(storeId).pipe(takeUntil(this.detach)).subscribe({
200
212
  next: (res) => {
201
- // Ignore a late reply for a store that is no longer selected.
202
- if (storeId !== this.storeId)
213
+ if (req !== this.storeReq)
203
214
  return;
204
215
  this.storeNameFromApi = res?.data?.storeName || '';
205
216
  this.storeOpen = res?.data?.storeProfile?.open || '';
206
217
  this.storeClose = res?.data?.storeProfile?.close || '';
218
+ this.storeLoading = false;
207
219
  },
208
- error: () => { },
220
+ error: () => { if (req === this.storeReq)
221
+ this.storeLoading = false; },
209
222
  });
210
223
  }
211
224
  // The store-card buttons (Terminal access, File access, Call) are for Tango users only.
@@ -229,28 +242,40 @@ export class TangoStoreInfraComponent {
229
242
  error: () => { },
230
243
  });
231
244
  }
232
- // Live / Not Live beside the name, by the same rule as the Summary card's tiles.
233
- // Empty - and hidden - while loading, for a non-V2 client, or for a store V2
234
- // does not count (inactive, or no first file yet).
245
+ // Live / Not Live beside the name, as of NOW - not the header's date range:
246
+ // Not Live while the store has any ticket that is open or inprogress, Live when
247
+ // all its tickets are closed or it has none. The API counts a ticket that is not
248
+ // closed and was raised by the end of toDate, so sending today's date makes it
249
+ // count every ticket raised up to now, in its current status.
250
+ // Empty - and hidden - for a non-V2 client, or for a store V2 does not count
251
+ // (inactive, or no first file yet).
235
252
  liveStatus = '';
236
253
  loadLiveStatus(storeId, header) {
254
+ const req = ++this.liveReq;
237
255
  this.liveStatus = '';
238
256
  const clientId = header?.client || String(storeId || '').split('-')[0];
239
- if (!storeId || !clientId || !header?.date?.endDate)
257
+ if (!storeId || !clientId) {
258
+ this.liveLoading = false;
240
259
  return;
260
+ }
261
+ // Today's date in the viewer's local time, as YYYY-MM-DD.
262
+ const today = new Date().toLocaleDateString('en-CA');
241
263
  const body = {
242
- clientId: [clientId], fromDate: header.date.startDate || header.date.endDate, toDate: header.date.endDate,
264
+ clientId: [clientId], fromDate: today, toDate: today,
243
265
  search: storeId, offset: 1, limit: 50,
244
266
  };
267
+ this.liveLoading = true;
245
268
  this.ticketsService.storeLiveStatus(body).pipe(takeUntil(this.detach)).subscribe({
246
269
  next: (res) => {
247
- if (storeId !== this.storeId)
270
+ if (req !== this.liveReq)
248
271
  return;
249
272
  // search is a partial match (406-1 also finds 406-10), so pick the exact store.
250
273
  const row = (res?.data?.rows ?? []).find((r) => r.storeId === storeId);
251
274
  this.liveStatus = row?.status === 'Live' || row?.status === 'Not Live' ? row.status : '';
275
+ this.liveLoading = false;
252
276
  },
253
- error: () => { },
277
+ error: () => { if (req === this.liveReq)
278
+ this.liveLoading = false; },
254
279
  });
255
280
  }
256
281
  selectedTabs(value) {
@@ -295,11 +320,23 @@ export class TangoStoreInfraComponent {
295
320
  });
296
321
  ref.componentInstance.session = this.session;
297
322
  }
323
+ // Call: a confirmation first; nothing is requested until Call is pressed.
324
+ openCall(tpl) {
325
+ this.modal.open(tpl, { centered: true });
326
+ }
327
+ // Call pressed: swap the confirmation for the call pop-up, which starts the
328
+ // call. Static backdrop and no Esc, so a stray click cannot drop the call.
329
+ startCall(confirmRef) {
330
+ confirmRef.close();
331
+ const ref = this.modal.open(StoreCallComponent, { centered: true, backdrop: 'static', keyboard: false });
332
+ ref.componentInstance.storeId = String(this.storeId || '');
333
+ ref.componentInstance.storeName = this.storeNameFromApi;
334
+ }
298
335
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TangoStoreInfraComponent, deps: [{ token: i1.PageInfoService }, { token: i2.Router }, { token: i1.GlobalStateService }, { token: i2.ActivatedRoute }, { token: i3.TicketsService }, { token: i4.NgbModal }, { token: i5.AuthService }], target: i0.ɵɵFactoryTarget.Component });
299
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TangoStoreInfraComponent, selector: "lib-tango-store-infra", ngImport: i0, template: "<!-- Store card: name and timings from get-store, Live status from the V2 store list. -->\r\n<div class=\"card mb-5 py-4 px-5\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-3\"><svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#D1FADF\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#ECFDF3\" stroke-width=\"6\"/>\r\n <path d=\"M15.6799 18.8039L15.6267 18.8871C15.0686 19.8741 15.6644 21.1215 16.7361 21.2646C16.8331 21.2765 16.9235 21.2828 17.0118 21.2828C17.5899 21.2828 18.1011 21.0348 18.4574 20.648L19.0107 20.0474L19.5621 20.6498C19.9141 21.0342 20.4241 21.2828 21.0061 21.2828C21.5856 21.2828 22.0985 21.0338 22.4502 20.6498L23.0033 20.0455L23.5565 20.6498C23.9081 21.0338 24.4211 21.2828 25.0005 21.2828C25.58 21.2828 26.0929 21.0338 26.4445 20.6498L26.9977 20.0455L27.5509 20.6498C27.9025 21.0338 28.4155 21.2828 28.9949 21.2828C29.0803 21.2828 29.1733 21.2765 29.2697 21.2647C30.3649 21.1154 30.9627 19.8012 30.324 18.8044C30.324 18.8043 30.324 18.8043 30.3239 18.8042L28.5658 16.0628L28.5658 16.0628L28.5648 16.0614C28.5496 16.0375 28.5121 16.012 28.465 16.012H17.5356C17.4884 16.012 17.4509 16.0375 17.4357 16.0614L17.4351 16.0623L15.6799 18.8039ZM28.6514 23.7372V26.8691V27.6191H27.9014H18.0992H17.3492V26.8691V23.7376C17.239 23.7458 17.1274 23.7501 17.0148 23.7501C16.9725 23.7501 16.9305 23.7494 16.8888 23.7482V26.8691V28.8036C16.8888 29.4471 17.4227 29.9882 18.0992 29.9882H27.9014C28.5779 29.9882 29.1118 29.4471 29.1118 28.8036V26.8691V23.7484C29.072 23.7495 29.032 23.7501 28.9918 23.7501C28.8774 23.7501 28.7639 23.7457 28.6514 23.7372Z\" stroke=\"#027A48\" stroke-width=\"1.5\"/>\r\n </svg></span>\r\n <div>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"store-card-name\">{{ storeName }}</span>\r\n <span *ngIf=\"liveStatus\" class=\"live-status ms-4\" [class.down]=\"liveStatus === 'Not Live'\">\r\n <span class=\"live-dot\"></span>{{ liveStatus }}\r\n </span>\r\n </div>\r\n <div class=\"store-card-meta d-flex align-items-center mt-1\">\r\n <span>{{ storeId || '--' }}</span>\r\n <span class=\"mx-2\">\u00B7</span>\r\n <svg class=\"me-1\" width=\"14\" height=\"14\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 4.5V9L12 10.5M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ storeOpen || '--' }} - {{ storeClose || '--' }}</span>\r\n </div>\r\n </div>\r\n <!-- Tango users of Infra V2 clients only. The hovered button expands; Terminal access is expanded while none is. -->\r\n <div *ngIf=\"showStoreActions\" class=\"store-actions ms-auto d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"store-act is-default\" (click)=\"openTerminal(terminalTpl)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Terminal access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M3 7.5C3 6.4 3.9 5.5 5 5.5H9.2L11.2 7.5H19C20.1 7.5 21 8.4 21 9.5V17C21 18.1 20.1 19 19 19H5C3.9 19 3 18.1 3 17V7.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">File access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8.6 4.5L6.4 3.6C5.8 3.4 5.1 3.6 4.7 4.1L3.5 5.6C3.1 6.1 3 6.8 3.2 7.4C4.9 12.7 9.3 17.1 14.6 18.8C15.2 19 15.9 18.9 16.4 18.5L17.9 17.3C18.4 16.9 18.6 16.2 18.4 15.6L17.5 13.4C17.3 12.8 16.6 12.5 16 12.6L13.6 13.1C11.9 12.2 10.8 11.1 9.9 9.4L10.4 7C10.5 6.4 10.2 5.7 9.6 5.5L8.6 4.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Call</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"card mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\" (click)=\"selectedTabs('infra')\"><a [ngClass]=\"selectedTab ==='infra' ? 'active' :''\"\r\n class=\"nav-link cursor-pointer no-border me-6 \">Infra</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('dataMismatch')\">\r\n <a [ngClass]=\"selectedTab ==='dataMismatch' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Data Mismatch</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('cameraAngleChange')\">\r\n <a [ngClass]=\"selectedTab ==='cameraAngleChange' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Camera Angle</a>\r\n </li>\r\n <!-- File logs, at the right end of the row: its own page at ?type=fileLogs. Tango only. -->\r\n <li *ngIf=\"isTango\" class=\"nav-item ms-auto\" (click)=\"selectedTabs('fileLogs')\">\r\n <a [ngClass]=\"selectedTab ==='fileLogs' ? 'active' :''\" class=\"nav-link cursor-pointer file-logs-link\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M14 3H7C5.9 3 5 3.9 5 5V19C5 20.1 5.9 21 7 21H17C18.1 21 19 20.1 19 19V8L14 3Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n <path d=\"M14 3V8H19M9 13H15M9 17H13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n File logs\r\n </a>\r\n </li>\r\n\r\n <!-- <li *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || clientData?.isVMS\" class=\"nav-item\" (click)=\"selectedTabs('footfall')\">\r\n <a [ngClass]=\"selectedTab ==='footfall' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Footfall Directory</a>\r\n </li> -->\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra'\" class=\"mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('summary')\"><a [ngClass]=\"selectedTab1 ==='summary' ? 'active' :''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border me-6 \">Summary</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('tickets')\">\r\n <a [ngClass]=\"selectedTab1 ==='tickets' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V1</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('ticketsV2')\">\r\n <a [ngClass]=\"selectedTab1 ==='ticketsV2' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V2</a>\r\n </li>\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='summary'\">\r\n <lib-summary-infra [selectedTab]=\"selectedTab\"></lib-summary-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='tickets'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='ticketsV2'\">\r\n <lib-ticket-infra-v2 [selectedTab]=\"selectedTab\"></lib-ticket-infra-v2>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='dataMismatch'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n\r\n<div *ngIf=\"selectedTab ==='cameraAngleChange'\">\r\n <lib-ticket-camera-angle [selectedTab]=\"selectedTab\"></lib-ticket-camera-angle>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='footfall'\">\r\n <lib-footfall-directory [selectedTab]=\"selectedTab\"></lib-footfall-directory>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='fileLogs' && isTango\">\r\n <lib-file-logs [storeId]=\"storeId\" [clientId]=\"headerFilters?.client\" [date]=\"headerFilters?.date?.endDate\"></lib-file-logs>\r\n</div>\r\n<router-outlet></router-outlet>\r\n\r\n<!-- Terminal access confirmation. Filled from /infra/v2/remote/session; Client name from the client record. -->\r\n<ng-template #terminalTpl let-modal>\r\n <div class=\"access-modal\">\r\n <div class=\"access-head\">\r\n <span class=\"access-icon\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span class=\"access-title fs-4 text-gray-800 fw-bold\">Open terminal access?</span>\r\n </div>\r\n <div class=\"access-body\">\r\n <p class=\"access-text\">This opens a command window on the store system. Commands run on the live system.</p>\r\n <div class=\"access-box\">\r\n <!-- Loading: shimmering placeholder rows (see .skel). -->\r\n <ng-container *ngIf=\"sessionState === 'loading'\">\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n </ng-container>\r\n <div *ngIf=\"sessionState === 'error'\" class=\"access-note error\">{{ sessionError || \"Couldn't open the session.\" }}</div>\r\n <ng-container *ngIf=\"sessionState === 'ready'\">\r\n <div class=\"access-row\"><span class=\"access-label\">Client name</span><span class=\"access-value\">{{ clientDisplayName || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store ID</span><span class=\"access-value\">{{ session?.storeId || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store name</span><span class=\"access-value\">{{ session?.storeName || '--' }}</span></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"access-foot\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"sessionState !== 'ready'\" (click)=\"connect(modal)\">Connect</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:8px 12px}.nav-item1 .nav-link1:hover{border:none}.nav-item .nav-link.file-logs-link{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border-radius:6px}.nav-item .nav-link.file-logs-link:hover{border-bottom:1px solid transparent}.store-card-name{font-size:18px;line-height:28px;font-weight:600;color:var(--Gray-900, #101828)}.store-act{display:inline-flex;align-items:center;height:44px;padding:0 12px;border:0;border-radius:12px;background:var(--Primary-700, #009BF3);color:#fff;font-size:15px;font-weight:700;transition:background-color .3s ease,color .3s ease,padding .3s ease}.store-act svg{flex-shrink:0}.store-act .act-label{max-width:0;opacity:0;margin-left:0;overflow:hidden;white-space:nowrap;transition:max-width .3s ease,opacity .2s ease,margin-left .3s ease}.store-actions:not(:has(.store-act:hover)) .store-act.is-default,.store-act:hover{background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);padding:0 18px}.store-actions:not(:has(.store-act:hover)) .store-act.is-default .act-label,.store-act:hover .act-label{max-width:160px;opacity:1;margin-left:8px}.store-card-meta{font-size:12px;line-height:18px;font-weight:500;color:var(--Gray-500, #667085)}.live-status{display:inline-flex;align-items:center;padding:2px 8px;border-radius:16px;font-size:12px;line-height:18px;font-weight:500;background:#ecfdf3;border:1px solid #ABEFC6;color:#067647}.live-status .live-dot{width:6px;height:6px;border-radius:50%;background:#17b26a;margin-right:6px}.live-status.down{background:#fef3f2;border-color:#fecdca;color:#b42318}.live-status.down .live-dot{background:#d92d20}.access-modal{background:#fff;border-radius:16px;overflow:hidden}.access-head{display:flex;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.access-icon{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;flex-shrink:0;border-radius:12px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)}.access-title{flex:1}.access-body{padding:20px 24px 0}.access-text{margin:0 0 20px;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-box{padding:16px 20px;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;background:var(--Gray-50, #F9FAFB)}.access-row{display:flex;align-items:center;padding:8px 0}.access-label{width:180px;flex-shrink:0;font-size:12px;line-height:18px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--Gray-500, #667085)}.access-value{font-size:14px;line-height:20px;font-weight:500;color:var(--Gray-900, #101828)}.skel{display:inline-block;height:14px;margin:3px 0;border-radius:6px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:skel-shimmer 1.5s linear infinite}@keyframes skel-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.skel-label{width:110px;margin-right:70px}.skel-value{width:160px}.access-note{padding:8px 0;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-note.error{color:var(--Error-700, #B42318)}.access-foot{display:flex;justify-content:flex-end;gap:12px;padding:24px}.access-foot .btn{font-size:14px!important;line-height:20px!important;padding:8px 16px!important}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i7.TicketInfraComponent, selector: "lib-ticket-infra", inputs: ["selectedTab"] }, { kind: "component", type: i8.SummaryInfraComponent, selector: "lib-summary-infra", inputs: ["selectedTab"] }, { kind: "component", type: i9.FootfallDirectoryComponent, selector: "lib-footfall-directory", inputs: ["selectedTab"] }, { kind: "component", type: i10.TicketCameraAngleComponent, selector: "lib-ticket-camera-angle", inputs: ["selectedTab"] }, { kind: "component", type: i11.TicketInfraV2Component, selector: "lib-ticket-infra-v2", inputs: ["selectedTab"] }, { kind: "component", type: i12.FileLogsComponent, selector: "lib-file-logs", inputs: ["storeId", "clientId", "date"] }] });
336
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TangoStoreInfraComponent, selector: "lib-tango-store-infra", ngImport: i0, template: "<!-- Store card: name and timings from get-store, Live status from the V2 store list. -->\r\n<div class=\"card mb-5 py-4 px-5\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-3\"><svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#D1FADF\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#ECFDF3\" stroke-width=\"6\"/>\r\n <path d=\"M15.6799 18.8039L15.6267 18.8871C15.0686 19.8741 15.6644 21.1215 16.7361 21.2646C16.8331 21.2765 16.9235 21.2828 17.0118 21.2828C17.5899 21.2828 18.1011 21.0348 18.4574 20.648L19.0107 20.0474L19.5621 20.6498C19.9141 21.0342 20.4241 21.2828 21.0061 21.2828C21.5856 21.2828 22.0985 21.0338 22.4502 20.6498L23.0033 20.0455L23.5565 20.6498C23.9081 21.0338 24.4211 21.2828 25.0005 21.2828C25.58 21.2828 26.0929 21.0338 26.4445 20.6498L26.9977 20.0455L27.5509 20.6498C27.9025 21.0338 28.4155 21.2828 28.9949 21.2828C29.0803 21.2828 29.1733 21.2765 29.2697 21.2647C30.3649 21.1154 30.9627 19.8012 30.324 18.8044C30.324 18.8043 30.324 18.8043 30.3239 18.8042L28.5658 16.0628L28.5658 16.0628L28.5648 16.0614C28.5496 16.0375 28.5121 16.012 28.465 16.012H17.5356C17.4884 16.012 17.4509 16.0375 17.4357 16.0614L17.4351 16.0623L15.6799 18.8039ZM28.6514 23.7372V26.8691V27.6191H27.9014H18.0992H17.3492V26.8691V23.7376C17.239 23.7458 17.1274 23.7501 17.0148 23.7501C16.9725 23.7501 16.9305 23.7494 16.8888 23.7482V26.8691V28.8036C16.8888 29.4471 17.4227 29.9882 18.0992 29.9882H27.9014C28.5779 29.9882 29.1118 29.4471 29.1118 28.8036V26.8691V23.7484C29.072 23.7495 29.032 23.7501 28.9918 23.7501C28.8774 23.7501 28.7639 23.7457 28.6514 23.7372Z\" stroke=\"#027A48\" stroke-width=\"1.5\"/>\r\n </svg></span>\r\n <div>\r\n <!-- Reloads on every Apply; each part shimmers while its own call runs. -->\r\n <div class=\"d-flex align-items-center\">\r\n <span *ngIf=\"storeLoading\" class=\"skel skel-name\"></span>\r\n <span *ngIf=\"!storeLoading\" class=\"store-card-name\">{{ storeName }}</span>\r\n <span *ngIf=\"liveLoading\" class=\"skel skel-pill ms-4\"></span>\r\n <span *ngIf=\"!liveLoading && liveStatus\" class=\"live-status ms-4\" [class.down]=\"liveStatus === 'Not Live'\">\r\n <span class=\"live-dot\"></span>{{ liveStatus }}\r\n </span>\r\n </div>\r\n <div *ngIf=\"storeLoading\" class=\"mt-1\"><span class=\"skel skel-meta\"></span></div>\r\n <div *ngIf=\"!storeLoading\" class=\"store-card-meta d-flex align-items-center mt-1\">\r\n <span>{{ storeId || '--' }}</span>\r\n <span class=\"mx-2\">\u00B7</span>\r\n <svg class=\"me-1\" width=\"14\" height=\"14\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 4.5V9L12 10.5M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ storeOpen || '--' }} - {{ storeClose || '--' }}</span>\r\n </div>\r\n </div>\r\n <!-- Tango users of Infra V2 clients only. The hovered button expands; Terminal access is expanded while none is. -->\r\n <div *ngIf=\"showStoreActions\" class=\"store-actions ms-auto d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"store-act is-default\" (click)=\"openTerminal(terminalTpl)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Terminal access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M3 7.5C3 6.4 3.9 5.5 5 5.5H9.2L11.2 7.5H19C20.1 7.5 21 8.4 21 9.5V17C21 18.1 20.1 19 19 19H5C3.9 19 3 18.1 3 17V7.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">File access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\" (click)=\"openCall(callConfirmTpl)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8.6 4.5L6.4 3.6C5.8 3.4 5.1 3.6 4.7 4.1L3.5 5.6C3.1 6.1 3 6.8 3.2 7.4C4.9 12.7 9.3 17.1 14.6 18.8C15.2 19 15.9 18.9 16.4 18.5L17.9 17.3C18.4 16.9 18.6 16.2 18.4 15.6L17.5 13.4C17.3 12.8 16.6 12.5 16 12.6L13.6 13.1C11.9 12.2 10.8 11.1 9.9 9.4L10.4 7C10.5 6.4 10.2 5.7 9.6 5.5L8.6 4.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Call</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"card mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\" (click)=\"selectedTabs('infra')\"><a [ngClass]=\"selectedTab ==='infra' ? 'active' :''\"\r\n class=\"nav-link cursor-pointer no-border me-6 \">Infra</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('dataMismatch')\">\r\n <a [ngClass]=\"selectedTab ==='dataMismatch' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Data Mismatch</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('cameraAngleChange')\">\r\n <a [ngClass]=\"selectedTab ==='cameraAngleChange' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Camera Angle</a>\r\n </li>\r\n <!-- File logs, at the right end of the row: its own page at ?type=fileLogs. Tango only. -->\r\n <li *ngIf=\"isTango\" class=\"nav-item ms-auto\" (click)=\"selectedTabs('fileLogs')\">\r\n <a [ngClass]=\"selectedTab ==='fileLogs' ? 'active' :''\" class=\"nav-link cursor-pointer file-logs-link\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M14 3H7C5.9 3 5 3.9 5 5V19C5 20.1 5.9 21 7 21H17C18.1 21 19 20.1 19 19V8L14 3Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n <path d=\"M14 3V8H19M9 13H15M9 17H13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n File logs\r\n </a>\r\n </li>\r\n\r\n <!-- <li *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || clientData?.isVMS\" class=\"nav-item\" (click)=\"selectedTabs('footfall')\">\r\n <a [ngClass]=\"selectedTab ==='footfall' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Footfall Directory</a>\r\n </li> -->\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra'\" class=\"mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('summary')\"><a [ngClass]=\"selectedTab1 ==='summary' ? 'active' :''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border me-6 \">Summary</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('tickets')\">\r\n <a [ngClass]=\"selectedTab1 ==='tickets' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V1</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('ticketsV2')\">\r\n <a [ngClass]=\"selectedTab1 ==='ticketsV2' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V2</a>\r\n </li>\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='summary'\">\r\n <lib-summary-infra [selectedTab]=\"selectedTab\"></lib-summary-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='tickets'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='ticketsV2'\">\r\n <lib-ticket-infra-v2 [selectedTab]=\"selectedTab\"></lib-ticket-infra-v2>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='dataMismatch'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n\r\n<div *ngIf=\"selectedTab ==='cameraAngleChange'\">\r\n <lib-ticket-camera-angle [selectedTab]=\"selectedTab\"></lib-ticket-camera-angle>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='footfall'\">\r\n <lib-footfall-directory [selectedTab]=\"selectedTab\"></lib-footfall-directory>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='fileLogs' && isTango\">\r\n <lib-file-logs [storeId]=\"storeId\" [clientId]=\"headerFilters?.client\" [date]=\"headerFilters?.date?.endDate\"></lib-file-logs>\r\n</div>\r\n<router-outlet></router-outlet>\r\n\r\n<!-- Terminal access confirmation. Filled from /infra/v2/remote/session; Client name from the client record. -->\r\n<ng-template #terminalTpl let-modal>\r\n <div class=\"access-modal\">\r\n <div class=\"access-head\">\r\n <span class=\"access-icon\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span class=\"access-title fs-4 text-gray-800 fw-bold\">Open terminal access?</span>\r\n </div>\r\n <div class=\"access-body\">\r\n <p class=\"access-text\">This opens a command window on the store system. Commands run on the live system.</p>\r\n <div class=\"access-box\">\r\n <!-- Loading: shimmering placeholder rows (see .skel). -->\r\n <ng-container *ngIf=\"sessionState === 'loading'\">\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n </ng-container>\r\n <div *ngIf=\"sessionState === 'error'\" class=\"access-note error\">{{ sessionError || \"Couldn't open the session.\" }}</div>\r\n <ng-container *ngIf=\"sessionState === 'ready'\">\r\n <div class=\"access-row\"><span class=\"access-label\">Client name</span><span class=\"access-value\">{{ clientDisplayName || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store ID</span><span class=\"access-value\">{{ session?.storeId || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store name</span><span class=\"access-value\">{{ session?.storeName || '--' }}</span></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"access-foot\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"sessionState !== 'ready'\" (click)=\"connect(modal)\">Connect</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Call confirmation. Nothing is requested and nothing rings until Call. -->\r\n<ng-template #callConfirmTpl let-modal>\r\n <div class=\"access-modal\">\r\n <div class=\"access-head\">\r\n <span class=\"access-icon\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8.6 4.5L6.4 3.6C5.8 3.4 5.1 3.6 4.7 4.1L3.5 5.6C3.1 6.1 3 6.8 3.2 7.4C4.9 12.7 9.3 17.1 14.6 18.8C15.2 19 15.9 18.9 16.4 18.5L17.9 17.3C18.4 16.9 18.6 16.2 18.4 15.6L17.5 13.4C17.3 12.8 16.6 12.5 16 12.6L13.6 13.1C11.9 12.2 10.8 11.1 9.9 9.4L10.4 7C10.5 6.4 10.2 5.7 9.6 5.5L8.6 4.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span class=\"access-title fs-4 text-gray-800 fw-bold\">Call this store?</span>\r\n </div>\r\n <div class=\"access-body\">\r\n <p class=\"access-text\">The store manager's Trax app will ring.</p>\r\n <div class=\"access-box\">\r\n <div class=\"access-row\"><span class=\"access-label\">Client name</span><span class=\"access-value\">{{ clientDisplayName || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store ID</span><span class=\"access-value\">{{ storeId || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store name</span><span class=\"access-value\">{{ storeName }}</span></div>\r\n </div>\r\n </div>\r\n <div class=\"access-foot\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"startCall(modal)\">Call</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:8px 12px}.nav-item1 .nav-link1:hover{border:none}.nav-item .nav-link.file-logs-link{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border-radius:6px}.nav-item .nav-link.file-logs-link:hover{border-bottom:1px solid transparent}.store-card-name{font-size:18px;line-height:28px;font-weight:600;color:var(--Gray-900, #101828)}.store-act{display:inline-flex;align-items:center;height:44px;padding:0 12px;border:0;border-radius:12px;background:var(--Primary-700, #009BF3);color:#fff;font-size:15px;font-weight:700;transition:background-color .3s ease,color .3s ease,padding .3s ease}.store-act svg{flex-shrink:0}.store-act .act-label{max-width:0;opacity:0;margin-left:0;overflow:hidden;white-space:nowrap;transition:max-width .3s ease,opacity .2s ease,margin-left .3s ease}.store-actions:not(:has(.store-act:hover)) .store-act.is-default,.store-act:hover{background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);padding:0 18px}.store-actions:not(:has(.store-act:hover)) .store-act.is-default .act-label,.store-act:hover .act-label{max-width:160px;opacity:1;margin-left:8px}.store-card-meta{font-size:12px;line-height:18px;font-weight:500;color:var(--Gray-500, #667085)}.live-status{display:inline-flex;align-items:center;padding:2px 8px;border-radius:16px;font-size:12px;line-height:18px;font-weight:500;background:#ecfdf3;border:1px solid #ABEFC6;color:#067647}.live-status .live-dot{width:6px;height:6px;border-radius:50%;background:#17b26a;margin-right:6px}.live-status.down{background:#fef3f2;border-color:#fecdca;color:#b42318}.live-status.down .live-dot{background:#d92d20}.access-modal{background:#fff;border-radius:16px;overflow:hidden}.access-head{display:flex;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.access-icon{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;flex-shrink:0;border-radius:12px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)}.access-title{flex:1}.access-body{padding:20px 24px 0}.access-text{margin:0 0 20px;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-box{padding:16px 20px;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;background:var(--Gray-50, #F9FAFB)}.access-row{display:flex;align-items:center;padding:8px 0}.access-label{width:180px;flex-shrink:0;font-size:12px;line-height:18px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--Gray-500, #667085)}.access-value{font-size:14px;line-height:20px;font-weight:500;color:var(--Gray-900, #101828)}.skel{display:inline-block;height:14px;margin:3px 0;border-radius:6px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:skel-shimmer 1.5s linear infinite}@keyframes skel-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.skel-label{width:110px;margin-right:70px}.skel-value{width:160px}.skel-name{width:180px;height:20px;margin:4px 0}.skel-meta{width:210px;height:12px;margin:3px 0}.skel-pill{width:64px;height:20px;border-radius:16px}.access-note{padding:8px 0;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-note.error{color:var(--Error-700, #B42318)}.access-foot{display:flex;justify-content:flex-end;gap:12px;padding:24px}.access-foot .btn{font-size:14px!important;line-height:20px!important;padding:8px 16px!important}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i7.TicketInfraComponent, selector: "lib-ticket-infra", inputs: ["selectedTab"] }, { kind: "component", type: i8.SummaryInfraComponent, selector: "lib-summary-infra", inputs: ["selectedTab"] }, { kind: "component", type: i9.FootfallDirectoryComponent, selector: "lib-footfall-directory", inputs: ["selectedTab"] }, { kind: "component", type: i10.TicketCameraAngleComponent, selector: "lib-ticket-camera-angle", inputs: ["selectedTab"] }, { kind: "component", type: i11.TicketInfraV2Component, selector: "lib-ticket-infra-v2", inputs: ["selectedTab"] }, { kind: "component", type: i12.FileLogsComponent, selector: "lib-file-logs", inputs: ["storeId", "clientId", "date"] }] });
300
337
  }
301
338
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TangoStoreInfraComponent, decorators: [{
302
339
  type: Component,
303
- args: [{ selector: 'lib-tango-store-infra', template: "<!-- Store card: name and timings from get-store, Live status from the V2 store list. -->\r\n<div class=\"card mb-5 py-4 px-5\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-3\"><svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#D1FADF\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#ECFDF3\" stroke-width=\"6\"/>\r\n <path d=\"M15.6799 18.8039L15.6267 18.8871C15.0686 19.8741 15.6644 21.1215 16.7361 21.2646C16.8331 21.2765 16.9235 21.2828 17.0118 21.2828C17.5899 21.2828 18.1011 21.0348 18.4574 20.648L19.0107 20.0474L19.5621 20.6498C19.9141 21.0342 20.4241 21.2828 21.0061 21.2828C21.5856 21.2828 22.0985 21.0338 22.4502 20.6498L23.0033 20.0455L23.5565 20.6498C23.9081 21.0338 24.4211 21.2828 25.0005 21.2828C25.58 21.2828 26.0929 21.0338 26.4445 20.6498L26.9977 20.0455L27.5509 20.6498C27.9025 21.0338 28.4155 21.2828 28.9949 21.2828C29.0803 21.2828 29.1733 21.2765 29.2697 21.2647C30.3649 21.1154 30.9627 19.8012 30.324 18.8044C30.324 18.8043 30.324 18.8043 30.3239 18.8042L28.5658 16.0628L28.5658 16.0628L28.5648 16.0614C28.5496 16.0375 28.5121 16.012 28.465 16.012H17.5356C17.4884 16.012 17.4509 16.0375 17.4357 16.0614L17.4351 16.0623L15.6799 18.8039ZM28.6514 23.7372V26.8691V27.6191H27.9014H18.0992H17.3492V26.8691V23.7376C17.239 23.7458 17.1274 23.7501 17.0148 23.7501C16.9725 23.7501 16.9305 23.7494 16.8888 23.7482V26.8691V28.8036C16.8888 29.4471 17.4227 29.9882 18.0992 29.9882H27.9014C28.5779 29.9882 29.1118 29.4471 29.1118 28.8036V26.8691V23.7484C29.072 23.7495 29.032 23.7501 28.9918 23.7501C28.8774 23.7501 28.7639 23.7457 28.6514 23.7372Z\" stroke=\"#027A48\" stroke-width=\"1.5\"/>\r\n </svg></span>\r\n <div>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"store-card-name\">{{ storeName }}</span>\r\n <span *ngIf=\"liveStatus\" class=\"live-status ms-4\" [class.down]=\"liveStatus === 'Not Live'\">\r\n <span class=\"live-dot\"></span>{{ liveStatus }}\r\n </span>\r\n </div>\r\n <div class=\"store-card-meta d-flex align-items-center mt-1\">\r\n <span>{{ storeId || '--' }}</span>\r\n <span class=\"mx-2\">\u00B7</span>\r\n <svg class=\"me-1\" width=\"14\" height=\"14\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 4.5V9L12 10.5M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ storeOpen || '--' }} - {{ storeClose || '--' }}</span>\r\n </div>\r\n </div>\r\n <!-- Tango users of Infra V2 clients only. The hovered button expands; Terminal access is expanded while none is. -->\r\n <div *ngIf=\"showStoreActions\" class=\"store-actions ms-auto d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"store-act is-default\" (click)=\"openTerminal(terminalTpl)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Terminal access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M3 7.5C3 6.4 3.9 5.5 5 5.5H9.2L11.2 7.5H19C20.1 7.5 21 8.4 21 9.5V17C21 18.1 20.1 19 19 19H5C3.9 19 3 18.1 3 17V7.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">File access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8.6 4.5L6.4 3.6C5.8 3.4 5.1 3.6 4.7 4.1L3.5 5.6C3.1 6.1 3 6.8 3.2 7.4C4.9 12.7 9.3 17.1 14.6 18.8C15.2 19 15.9 18.9 16.4 18.5L17.9 17.3C18.4 16.9 18.6 16.2 18.4 15.6L17.5 13.4C17.3 12.8 16.6 12.5 16 12.6L13.6 13.1C11.9 12.2 10.8 11.1 9.9 9.4L10.4 7C10.5 6.4 10.2 5.7 9.6 5.5L8.6 4.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Call</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"card mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\" (click)=\"selectedTabs('infra')\"><a [ngClass]=\"selectedTab ==='infra' ? 'active' :''\"\r\n class=\"nav-link cursor-pointer no-border me-6 \">Infra</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('dataMismatch')\">\r\n <a [ngClass]=\"selectedTab ==='dataMismatch' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Data Mismatch</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('cameraAngleChange')\">\r\n <a [ngClass]=\"selectedTab ==='cameraAngleChange' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Camera Angle</a>\r\n </li>\r\n <!-- File logs, at the right end of the row: its own page at ?type=fileLogs. Tango only. -->\r\n <li *ngIf=\"isTango\" class=\"nav-item ms-auto\" (click)=\"selectedTabs('fileLogs')\">\r\n <a [ngClass]=\"selectedTab ==='fileLogs' ? 'active' :''\" class=\"nav-link cursor-pointer file-logs-link\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M14 3H7C5.9 3 5 3.9 5 5V19C5 20.1 5.9 21 7 21H17C18.1 21 19 20.1 19 19V8L14 3Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n <path d=\"M14 3V8H19M9 13H15M9 17H13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n File logs\r\n </a>\r\n </li>\r\n\r\n <!-- <li *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || clientData?.isVMS\" class=\"nav-item\" (click)=\"selectedTabs('footfall')\">\r\n <a [ngClass]=\"selectedTab ==='footfall' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Footfall Directory</a>\r\n </li> -->\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra'\" class=\"mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('summary')\"><a [ngClass]=\"selectedTab1 ==='summary' ? 'active' :''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border me-6 \">Summary</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('tickets')\">\r\n <a [ngClass]=\"selectedTab1 ==='tickets' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V1</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('ticketsV2')\">\r\n <a [ngClass]=\"selectedTab1 ==='ticketsV2' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V2</a>\r\n </li>\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='summary'\">\r\n <lib-summary-infra [selectedTab]=\"selectedTab\"></lib-summary-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='tickets'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='ticketsV2'\">\r\n <lib-ticket-infra-v2 [selectedTab]=\"selectedTab\"></lib-ticket-infra-v2>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='dataMismatch'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n\r\n<div *ngIf=\"selectedTab ==='cameraAngleChange'\">\r\n <lib-ticket-camera-angle [selectedTab]=\"selectedTab\"></lib-ticket-camera-angle>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='footfall'\">\r\n <lib-footfall-directory [selectedTab]=\"selectedTab\"></lib-footfall-directory>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='fileLogs' && isTango\">\r\n <lib-file-logs [storeId]=\"storeId\" [clientId]=\"headerFilters?.client\" [date]=\"headerFilters?.date?.endDate\"></lib-file-logs>\r\n</div>\r\n<router-outlet></router-outlet>\r\n\r\n<!-- Terminal access confirmation. Filled from /infra/v2/remote/session; Client name from the client record. -->\r\n<ng-template #terminalTpl let-modal>\r\n <div class=\"access-modal\">\r\n <div class=\"access-head\">\r\n <span class=\"access-icon\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span class=\"access-title fs-4 text-gray-800 fw-bold\">Open terminal access?</span>\r\n </div>\r\n <div class=\"access-body\">\r\n <p class=\"access-text\">This opens a command window on the store system. Commands run on the live system.</p>\r\n <div class=\"access-box\">\r\n <!-- Loading: shimmering placeholder rows (see .skel). -->\r\n <ng-container *ngIf=\"sessionState === 'loading'\">\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n </ng-container>\r\n <div *ngIf=\"sessionState === 'error'\" class=\"access-note error\">{{ sessionError || \"Couldn't open the session.\" }}</div>\r\n <ng-container *ngIf=\"sessionState === 'ready'\">\r\n <div class=\"access-row\"><span class=\"access-label\">Client name</span><span class=\"access-value\">{{ clientDisplayName || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store ID</span><span class=\"access-value\">{{ session?.storeId || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store name</span><span class=\"access-value\">{{ session?.storeName || '--' }}</span></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"access-foot\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"sessionState !== 'ready'\" (click)=\"connect(modal)\">Connect</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:8px 12px}.nav-item1 .nav-link1:hover{border:none}.nav-item .nav-link.file-logs-link{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border-radius:6px}.nav-item .nav-link.file-logs-link:hover{border-bottom:1px solid transparent}.store-card-name{font-size:18px;line-height:28px;font-weight:600;color:var(--Gray-900, #101828)}.store-act{display:inline-flex;align-items:center;height:44px;padding:0 12px;border:0;border-radius:12px;background:var(--Primary-700, #009BF3);color:#fff;font-size:15px;font-weight:700;transition:background-color .3s ease,color .3s ease,padding .3s ease}.store-act svg{flex-shrink:0}.store-act .act-label{max-width:0;opacity:0;margin-left:0;overflow:hidden;white-space:nowrap;transition:max-width .3s ease,opacity .2s ease,margin-left .3s ease}.store-actions:not(:has(.store-act:hover)) .store-act.is-default,.store-act:hover{background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);padding:0 18px}.store-actions:not(:has(.store-act:hover)) .store-act.is-default .act-label,.store-act:hover .act-label{max-width:160px;opacity:1;margin-left:8px}.store-card-meta{font-size:12px;line-height:18px;font-weight:500;color:var(--Gray-500, #667085)}.live-status{display:inline-flex;align-items:center;padding:2px 8px;border-radius:16px;font-size:12px;line-height:18px;font-weight:500;background:#ecfdf3;border:1px solid #ABEFC6;color:#067647}.live-status .live-dot{width:6px;height:6px;border-radius:50%;background:#17b26a;margin-right:6px}.live-status.down{background:#fef3f2;border-color:#fecdca;color:#b42318}.live-status.down .live-dot{background:#d92d20}.access-modal{background:#fff;border-radius:16px;overflow:hidden}.access-head{display:flex;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.access-icon{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;flex-shrink:0;border-radius:12px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)}.access-title{flex:1}.access-body{padding:20px 24px 0}.access-text{margin:0 0 20px;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-box{padding:16px 20px;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;background:var(--Gray-50, #F9FAFB)}.access-row{display:flex;align-items:center;padding:8px 0}.access-label{width:180px;flex-shrink:0;font-size:12px;line-height:18px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--Gray-500, #667085)}.access-value{font-size:14px;line-height:20px;font-weight:500;color:var(--Gray-900, #101828)}.skel{display:inline-block;height:14px;margin:3px 0;border-radius:6px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:skel-shimmer 1.5s linear infinite}@keyframes skel-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.skel-label{width:110px;margin-right:70px}.skel-value{width:160px}.access-note{padding:8px 0;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-note.error{color:var(--Error-700, #B42318)}.access-foot{display:flex;justify-content:flex-end;gap:12px;padding:24px}.access-foot .btn{font-size:14px!important;line-height:20px!important;padding:8px 16px!important}\n"] }]
340
+ args: [{ selector: 'lib-tango-store-infra', template: "<!-- Store card: name and timings from get-store, Live status from the V2 store list. -->\r\n<div class=\"card mb-5 py-4 px-5\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"me-3\"><svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#D1FADF\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#ECFDF3\" stroke-width=\"6\"/>\r\n <path d=\"M15.6799 18.8039L15.6267 18.8871C15.0686 19.8741 15.6644 21.1215 16.7361 21.2646C16.8331 21.2765 16.9235 21.2828 17.0118 21.2828C17.5899 21.2828 18.1011 21.0348 18.4574 20.648L19.0107 20.0474L19.5621 20.6498C19.9141 21.0342 20.4241 21.2828 21.0061 21.2828C21.5856 21.2828 22.0985 21.0338 22.4502 20.6498L23.0033 20.0455L23.5565 20.6498C23.9081 21.0338 24.4211 21.2828 25.0005 21.2828C25.58 21.2828 26.0929 21.0338 26.4445 20.6498L26.9977 20.0455L27.5509 20.6498C27.9025 21.0338 28.4155 21.2828 28.9949 21.2828C29.0803 21.2828 29.1733 21.2765 29.2697 21.2647C30.3649 21.1154 30.9627 19.8012 30.324 18.8044C30.324 18.8043 30.324 18.8043 30.3239 18.8042L28.5658 16.0628L28.5658 16.0628L28.5648 16.0614C28.5496 16.0375 28.5121 16.012 28.465 16.012H17.5356C17.4884 16.012 17.4509 16.0375 17.4357 16.0614L17.4351 16.0623L15.6799 18.8039ZM28.6514 23.7372V26.8691V27.6191H27.9014H18.0992H17.3492V26.8691V23.7376C17.239 23.7458 17.1274 23.7501 17.0148 23.7501C16.9725 23.7501 16.9305 23.7494 16.8888 23.7482V26.8691V28.8036C16.8888 29.4471 17.4227 29.9882 18.0992 29.9882H27.9014C28.5779 29.9882 29.1118 29.4471 29.1118 28.8036V26.8691V23.7484C29.072 23.7495 29.032 23.7501 28.9918 23.7501C28.8774 23.7501 28.7639 23.7457 28.6514 23.7372Z\" stroke=\"#027A48\" stroke-width=\"1.5\"/>\r\n </svg></span>\r\n <div>\r\n <!-- Reloads on every Apply; each part shimmers while its own call runs. -->\r\n <div class=\"d-flex align-items-center\">\r\n <span *ngIf=\"storeLoading\" class=\"skel skel-name\"></span>\r\n <span *ngIf=\"!storeLoading\" class=\"store-card-name\">{{ storeName }}</span>\r\n <span *ngIf=\"liveLoading\" class=\"skel skel-pill ms-4\"></span>\r\n <span *ngIf=\"!liveLoading && liveStatus\" class=\"live-status ms-4\" [class.down]=\"liveStatus === 'Not Live'\">\r\n <span class=\"live-dot\"></span>{{ liveStatus }}\r\n </span>\r\n </div>\r\n <div *ngIf=\"storeLoading\" class=\"mt-1\"><span class=\"skel skel-meta\"></span></div>\r\n <div *ngIf=\"!storeLoading\" class=\"store-card-meta d-flex align-items-center mt-1\">\r\n <span>{{ storeId || '--' }}</span>\r\n <span class=\"mx-2\">\u00B7</span>\r\n <svg class=\"me-1\" width=\"14\" height=\"14\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 4.5V9L12 10.5M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ storeOpen || '--' }} - {{ storeClose || '--' }}</span>\r\n </div>\r\n </div>\r\n <!-- Tango users of Infra V2 clients only. The hovered button expands; Terminal access is expanded while none is. -->\r\n <div *ngIf=\"showStoreActions\" class=\"store-actions ms-auto d-flex align-items-center gap-3\">\r\n <button type=\"button\" class=\"store-act is-default\" (click)=\"openTerminal(terminalTpl)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Terminal access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M3 7.5C3 6.4 3.9 5.5 5 5.5H9.2L11.2 7.5H19C20.1 7.5 21 8.4 21 9.5V17C21 18.1 20.1 19 19 19H5C3.9 19 3 18.1 3 17V7.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">File access</span>\r\n </button>\r\n <button type=\"button\" class=\"store-act\" (click)=\"openCall(callConfirmTpl)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8.6 4.5L6.4 3.6C5.8 3.4 5.1 3.6 4.7 4.1L3.5 5.6C3.1 6.1 3 6.8 3.2 7.4C4.9 12.7 9.3 17.1 14.6 18.8C15.2 19 15.9 18.9 16.4 18.5L17.9 17.3C18.4 16.9 18.6 16.2 18.4 15.6L17.5 13.4C17.3 12.8 16.6 12.5 16 12.6L13.6 13.1C11.9 12.2 10.8 11.1 9.9 9.4L10.4 7C10.5 6.4 10.2 5.7 9.6 5.5L8.6 4.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"act-label\">Call</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"card mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\" (click)=\"selectedTabs('infra')\"><a [ngClass]=\"selectedTab ==='infra' ? 'active' :''\"\r\n class=\"nav-link cursor-pointer no-border me-6 \">Infra</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('dataMismatch')\">\r\n <a [ngClass]=\"selectedTab ==='dataMismatch' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Data Mismatch</a>\r\n </li>\r\n <li class=\"nav-item\" (click)=\"selectedTabs('cameraAngleChange')\">\r\n <a [ngClass]=\"selectedTab ==='cameraAngleChange' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Camera Angle</a>\r\n </li>\r\n <!-- File logs, at the right end of the row: its own page at ?type=fileLogs. Tango only. -->\r\n <li *ngIf=\"isTango\" class=\"nav-item ms-auto\" (click)=\"selectedTabs('fileLogs')\">\r\n <a [ngClass]=\"selectedTab ==='fileLogs' ? 'active' :''\" class=\"nav-link cursor-pointer file-logs-link\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M14 3H7C5.9 3 5 3.9 5 5V19C5 20.1 5.9 21 7 21H17C18.1 21 19 20.1 19 19V8L14 3Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n <path d=\"M14 3V8H19M9 13H15M9 17H13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n File logs\r\n </a>\r\n </li>\r\n\r\n <!-- <li *ngIf=\"(gs.userAccess | async)?.userType === 'tango' || clientData?.isVMS\" class=\"nav-item\" (click)=\"selectedTabs('footfall')\">\r\n <a [ngClass]=\"selectedTab ==='footfall' ? 'active' :''\" class=\"nav-link cursor-pointer me-6\">Footfall Directory</a>\r\n </li> -->\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra'\" class=\"mb-5 py-3 px-5\">\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('summary')\"><a [ngClass]=\"selectedTab1 ==='summary' ? 'active' :''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border me-6 \">Summary</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('tickets')\">\r\n <a [ngClass]=\"selectedTab1 ==='tickets' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V1</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"selectedTabs1('ticketsV2')\">\r\n <a [ngClass]=\"selectedTab1 ==='ticketsV2' ? 'active' :''\" class=\"nav-link nav-link1 cursor-pointer me-6\">Tickets V2</a>\r\n </li>\r\n </ul>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='summary'\">\r\n <lib-summary-infra [selectedTab]=\"selectedTab\"></lib-summary-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='tickets'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='infra' && selectedTab1 ==='ticketsV2'\">\r\n <lib-ticket-infra-v2 [selectedTab]=\"selectedTab\"></lib-ticket-infra-v2>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='dataMismatch'\">\r\n <lib-ticket-infra [selectedTab]=\"selectedTab\"></lib-ticket-infra>\r\n</div>\r\n\r\n<div *ngIf=\"selectedTab ==='cameraAngleChange'\">\r\n <lib-ticket-camera-angle [selectedTab]=\"selectedTab\"></lib-ticket-camera-angle>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='footfall'\">\r\n <lib-footfall-directory [selectedTab]=\"selectedTab\"></lib-footfall-directory>\r\n</div>\r\n<div *ngIf=\"selectedTab ==='fileLogs' && isTango\">\r\n <lib-file-logs [storeId]=\"storeId\" [clientId]=\"headerFilters?.client\" [date]=\"headerFilters?.date?.endDate\"></lib-file-logs>\r\n</div>\r\n<router-outlet></router-outlet>\r\n\r\n<!-- Terminal access confirmation. Filled from /infra/v2/remote/session; Client name from the client record. -->\r\n<ng-template #terminalTpl let-modal>\r\n <div class=\"access-modal\">\r\n <div class=\"access-head\">\r\n <span class=\"access-icon\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2.5\" y=\"3.5\" width=\"19\" height=\"13\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\r\n <path d=\"M8 21H16M12 16.5V21M6.5 8L9 10L6.5 12M11 12H14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span class=\"access-title fs-4 text-gray-800 fw-bold\">Open terminal access?</span>\r\n </div>\r\n <div class=\"access-body\">\r\n <p class=\"access-text\">This opens a command window on the store system. Commands run on the live system.</p>\r\n <div class=\"access-box\">\r\n <!-- Loading: shimmering placeholder rows (see .skel). -->\r\n <ng-container *ngIf=\"sessionState === 'loading'\">\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n <div class=\"access-row\"><span class=\"skel skel-label\"></span><span class=\"skel skel-value\"></span></div>\r\n </ng-container>\r\n <div *ngIf=\"sessionState === 'error'\" class=\"access-note error\">{{ sessionError || \"Couldn't open the session.\" }}</div>\r\n <ng-container *ngIf=\"sessionState === 'ready'\">\r\n <div class=\"access-row\"><span class=\"access-label\">Client name</span><span class=\"access-value\">{{ clientDisplayName || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store ID</span><span class=\"access-value\">{{ session?.storeId || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store name</span><span class=\"access-value\">{{ session?.storeName || '--' }}</span></div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"access-foot\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"sessionState !== 'ready'\" (click)=\"connect(modal)\">Connect</button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Call confirmation. Nothing is requested and nothing rings until Call. -->\r\n<ng-template #callConfirmTpl let-modal>\r\n <div class=\"access-modal\">\r\n <div class=\"access-head\">\r\n <span class=\"access-icon\">\r\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M8.6 4.5L6.4 3.6C5.8 3.4 5.1 3.6 4.7 4.1L3.5 5.6C3.1 6.1 3 6.8 3.2 7.4C4.9 12.7 9.3 17.1 14.6 18.8C15.2 19 15.9 18.9 16.4 18.5L17.9 17.3C18.4 16.9 18.6 16.2 18.4 15.6L17.5 13.4C17.3 12.8 16.6 12.5 16 12.6L13.6 13.1C11.9 12.2 10.8 11.1 9.9 9.4L10.4 7C10.5 6.4 10.2 5.7 9.6 5.5L8.6 4.5Z\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span class=\"access-title fs-4 text-gray-800 fw-bold\">Call this store?</span>\r\n </div>\r\n <div class=\"access-body\">\r\n <p class=\"access-text\">The store manager's Trax app will ring.</p>\r\n <div class=\"access-box\">\r\n <div class=\"access-row\"><span class=\"access-label\">Client name</span><span class=\"access-value\">{{ clientDisplayName || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store ID</span><span class=\"access-value\">{{ storeId || '--' }}</span></div>\r\n <div class=\"access-row\"><span class=\"access-label\">Store name</span><span class=\"access-value\">{{ storeName }}</span></div>\r\n </div>\r\n </div>\r\n <div class=\"access-foot\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"startCall(modal)\">Call</button>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.nav-item .nav-link:hover{border:none}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:8px 12px}.nav-item1 .nav-link1:hover{border:none}.nav-item .nav-link.file-logs-link{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border-radius:6px}.nav-item .nav-link.file-logs-link:hover{border-bottom:1px solid transparent}.store-card-name{font-size:18px;line-height:28px;font-weight:600;color:var(--Gray-900, #101828)}.store-act{display:inline-flex;align-items:center;height:44px;padding:0 12px;border:0;border-radius:12px;background:var(--Primary-700, #009BF3);color:#fff;font-size:15px;font-weight:700;transition:background-color .3s ease,color .3s ease,padding .3s ease}.store-act svg{flex-shrink:0}.store-act .act-label{max-width:0;opacity:0;margin-left:0;overflow:hidden;white-space:nowrap;transition:max-width .3s ease,opacity .2s ease,margin-left .3s ease}.store-actions:not(:has(.store-act:hover)) .store-act.is-default,.store-act:hover{background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);padding:0 18px}.store-actions:not(:has(.store-act:hover)) .store-act.is-default .act-label,.store-act:hover .act-label{max-width:160px;opacity:1;margin-left:8px}.store-card-meta{font-size:12px;line-height:18px;font-weight:500;color:var(--Gray-500, #667085)}.live-status{display:inline-flex;align-items:center;padding:2px 8px;border-radius:16px;font-size:12px;line-height:18px;font-weight:500;background:#ecfdf3;border:1px solid #ABEFC6;color:#067647}.live-status .live-dot{width:6px;height:6px;border-radius:50%;background:#17b26a;margin-right:6px}.live-status.down{background:#fef3f2;border-color:#fecdca;color:#b42318}.live-status.down .live-dot{background:#d92d20}.access-modal{background:#fff;border-radius:16px;overflow:hidden}.access-head{display:flex;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--Gray-200, #EAECF0)}.access-icon{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;flex-shrink:0;border-radius:12px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3)}.access-title{flex:1}.access-body{padding:20px 24px 0}.access-text{margin:0 0 20px;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-box{padding:16px 20px;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;background:var(--Gray-50, #F9FAFB)}.access-row{display:flex;align-items:center;padding:8px 0}.access-label{width:180px;flex-shrink:0;font-size:12px;line-height:18px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--Gray-500, #667085)}.access-value{font-size:14px;line-height:20px;font-weight:500;color:var(--Gray-900, #101828)}.skel{display:inline-block;height:14px;margin:3px 0;border-radius:6px;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:skel-shimmer 1.5s linear infinite}@keyframes skel-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.skel-label{width:110px;margin-right:70px}.skel-value{width:160px}.skel-name{width:180px;height:20px;margin:4px 0}.skel-meta{width:210px;height:12px;margin:3px 0}.skel-pill{width:64px;height:20px;border-radius:16px}.access-note{padding:8px 0;font-size:14px;line-height:20px;color:var(--Gray-500, #667085)}.access-note.error{color:var(--Error-700, #B42318)}.access-foot{display:flex;justify-content:flex-end;gap:12px;padding:24px}.access-foot .btn{font-size:14px!important;line-height:20px!important;padding:8px 16px!important}\n"] }]
304
341
  }], ctorParameters: () => [{ type: i1.PageInfoService }, { type: i2.Router }, { type: i1.GlobalStateService }, { type: i2.ActivatedRoute }, { type: i3.TicketsService }, { type: i4.NgbModal }, { type: i5.AuthService }] });
305
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuZ28tc3RvcmUtaW5mcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtdGlja2V0LWluZnJhL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1zdG9yZS1pbmZyYS90YW5nby1zdG9yZS1pbmZyYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS10aWNrZXQtaW5mcmEvc3JjL2xpYi9jb21wb25lbnRzL3RhbmdvLXN0b3JlLWluZnJhL3RhbmdvLXN0b3JlLWluZnJhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWtDLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU92RyxNQUFNLE9BQU8sd0JBQXdCO0lBUWY7SUFBaUM7SUFBcUI7SUFBOEI7SUFBNkI7SUFBc0M7SUFBdUI7SUFQbE0sV0FBVyxDQUFNO0lBQ1QsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDL0IsT0FBTyxDQUFNO0lBQ2IsSUFBSSxDQUFNO0lBQ1YsWUFBWSxDQUFNO0lBQ1Ysb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLFVBQVUsQ0FBTTtJQUNoQixZQUFvQixRQUF3QixFQUFTLE1BQWEsRUFBUSxFQUFxQixFQUFTLEtBQW9CLEVBQVMsY0FBNkIsRUFBUyxLQUFjLEVBQVMsV0FBdUI7UUFBck0sYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQVEsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFlO1FBQVMsbUJBQWMs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b21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBUaWNrZXRzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpY2tldHMuc2VydmljZSc7XHJcbmltcG9ydCB7IFJlbW90ZVRlcm1pbmFsQ29tcG9uZW50IH0gZnJvbSAnLi4vdGlja2V0LWluZnJhLXYyL3JlbW90ZS10ZXJtaW5hbC9yZW1vdGUtdGVybWluYWwuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRhbmdvLXN0b3JlLWluZnJhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFuZ28tc3RvcmUtaW5mcmEuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90YW5nby1zdG9yZS1pbmZyYS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhbmdvU3RvcmVJbmZyYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxPbkRlc3Ryb3kge1xyXG4gIHNlbGVjdGVkVGFiOiBhbnk7XHJcbiAgcHJpdmF0ZSBkZXRhY2ggPSBuZXcgU3ViamVjdCgpO1xyXG4gIHN0b3JlSWQ6IGFueTtcclxuICB0eXBlOiBhbnk7XHJcbiAgc2VsZWN0ZWRUYWIxOiBhbnk7XHJcbiAgcHJpdmF0ZSBzdWJUYWJGcm9tVXJsQXBwbGllZCA9IGZhbHNlO1xyXG4gIGNsaWVudE5hbWU6IGFueTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhZ2VJbmZvOlBhZ2VJbmZvU2VydmljZSxwcml2YXRlIHJvdXRlcjpSb3V0ZXIscHVibGljIGdzOkdsb2JhbFN0YXRlU2VydmljZSxwcml2YXRlIHJvdXRlOkFjdGl2YXRlZFJvdXRlLHByaXZhdGUgdGlja2V0c1NlcnZpY2U6VGlja2V0c1NlcnZpY2UscHJpdmF0ZSBtb2RhbDpOZ2JNb2RhbCxwcml2YXRlIGF1dGhTZXJ2aWNlOkF1dGhTZXJ2aWNlKXtcclxuXHJcbiAgfVxyXG4gIGhlYWRlckZpbHRlcnM6YW55O1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXRhY2gubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGV0YWNoLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG4gIGNsaWVudERhdGE6YW55O1xyXG4gICB1c2VyVHlwZTphbnk7XHJcbnByaXZhdGUgaXNTdG9yZUlkVmFsaWRGb3JDbGllbnQoc3RvcmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgaWYgKCFzdG9yZUlkIHx8ICF0aGlzLnVzZXJUeXBlPy5jbGllbnRJZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAvLyAvLyBUYW5nbyB1c2VycyBjYW4gYWNjZXNzIGFsbFxyXG4gIC8vIGlmICh0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgLy8gICByZXR1cm4gdHJ1ZTtcclxuICAvLyB9XHJcblxyXG4gIGNvbnN0IHN0b3JlQ2xpZW50SWQgPSBzdG9yZUlkLnNwbGl0KCctJylbMF07XHJcbiAgcmV0dXJuIHN0b3JlQ2xpZW50SWQgPT09IFN0cmluZyh0aGlzLnVzZXJUeXBlLmNsaWVudElkKTtcclxufVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgdGhpcy51c2VyVHlwZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1c2VyLWluZm9cIikgfHwgJ3t9Jyk7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgICBjb25zdCB0eXBlID0gcGFyYW1zWyd0eXBlJ10gPyBwYXJhbXNbJ3R5cGUnXSA6ICdpbmZyYSc7XHJcbiAgICAgIGlmKHR5cGUgPT09J2luZnJhdjInKXtcclxuICAgICAgICAvLyBFdmVyeSBJbmZyYSBibG9jayBpcyBnYXRlZCBvbiBzZWxlY3RlZFRhYiA9PT0gJ2luZnJhJywgc28gdGhpcyByZWFkc1xyXG4gICAgICAgIC8vIGFzIFwidGhlIEluZnJhIHRhYiwgb3BlbmVkIG9uIFRpY2tldHMgVjJcIiByYXRoZXIgdGhhbiBhIHRhYiBvZiBpdHMgb3duLlxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnaW5mcmEnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9IHR5cGU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gT25seSBvbiB0aGUgZmlyc3QgZW1pc3Npb246IHNlbGVjdGVkVGFiczEoKSByZXdyaXRlcyBgdHlwZWAsIHdoaWNoXHJcbiAgICAgIC8vIGZpcmVzIHRoaXMgc3Vic2NyaXB0aW9uIGFnYWluLCBhbmQgd2l0aG91dCB0aGUgZ3VhcmQgdGhhdCB3b3VsZCB1bmRvXHJcbiAgICAgIC8vIHRoZSBjbGljayAtIFN1bW1hcnkgaW4gcGFydGljdWxhciB3b3VsZCBib3VuY2UgdG8gVGlja2V0cyBWMS5cclxuICAgICAgaWYoIXRoaXMuc3ViVGFiRnJvbVVybEFwcGxpZWQpe1xyXG4gICAgICAgIHRoaXMuc3ViVGFiRnJvbVVybEFwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmKHR5cGUgPT09J2luZnJhdjInKXtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIxID0gJ3RpY2tldHNWMidcclxuICAgICAgICB9IGVsc2UgaWYodGhpcy5zZWxlY3RlZFRhYiA9PT0naW5mcmEnKXtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIxID0ndGlja2V0cydcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgICAgICAgIGNvbnN0IGNsaWVudERhdGE6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjbGllbnQtZGV0YWlsc1wiKSB8fCBcInt9XCIpO1xyXG4gICAgdGhpcy5jbGllbnREYXRhID0gY2xpZW50RGF0YTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5kZXRhY2gpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyRmlsdGVycyA9IHsgLi4uZGF0YSB9O1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUlkID1cclxuICAgICAgICAgICAgZGF0YSAmJiBkYXRhLnN0b3JlID8gZGF0YS5zdG9yZSA6IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIilbM107XHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50TmFtZSA9IGRhdGE/LmNsaWVudE5hbWUgPyBkYXRhPy5jbGllbnROYW1lOicnO1xyXG4gICAgICAgICAgICAgaWYgKHRoaXMuZ3MudXNlckFjY2Vzcy52YWx1ZT8udXNlclR5cGUgIT09ICd0YW5nbycpIHtcclxuICAgICAgICAgICAgIGlmICghdGhpcy5pc1N0b3JlSWRWYWxpZEZvckNsaWVudCh0aGlzLnN0b3JlSWQpKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9lcnJvci80MDQnXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0b3JlSWRRdWVyeVBhcmFtKHRoaXMuc3RvcmVJZCk7XHJcbiAgICAgICAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRTdG9yZU5hbWUodGhpcy5zdG9yZUlkKTtcclxuICAgICAgICAgIHRoaXMubG9hZExpdmVTdGF0dXModGhpcy5zdG9yZUlkLCBkYXRhKTtcclxuICAgICAgICAgIHRoaXMubG9hZENsaWVudChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIH1cclxuICAgIHVwZGF0ZVN0b3JlSWRRdWVyeVBhcmFtKHN0b3JlSWQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlICE9PSAndGFuZ28nKSB7XHJcbiAgICAgICBpZiAoIXRoaXMuaXNTdG9yZUlkVmFsaWRGb3JDbGllbnQoc3RvcmVJZCkpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yLzQwNCddKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbn1cclxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7IC4uLnRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfTtcclxuICAgICAgLy8gVXBkYXRlIHN0b3JlSWQgaW4gcXVlcnlQYXJhbXNcclxuICAgICAgcXVlcnlQYXJhbXMuc3RvcmVJZCA9IHN0b3JlSWQ7XHJcbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBzYW1lIHJvdXRlIHdpdGggdXBkYXRlZCBxdWVyeVBhcmFtc1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XHJcbiAgICB9XHJcbiAgc2V0UGFnZURhdGEoKXtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoXCJUaWNrZXRzXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXREZXNjcmlwdGlvbihcclxuICAgICAgXCJWaWV3LCBzaGFyZSwgZG93bmxvYWQgYW5kIGJlbmNobWFyayB0aGUgc3RvcmVzIHBlcmZvcm1hbmNlIGluIG9uZSBzY3JlZW5cIlxyXG4gICAgKTtcclxuICAgIGxldCBicmVhZGNydW1iczogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGNvbW1vbkJyZWFkY3J1bWJzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY2xpZW50TmFtZSxcclxuICAgICAgICBwYXRoOiBcIi9tYW5hZ2Uvc3RvcmVzXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmNsaWVudE5hbWUsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3N0b3Jlc1wiLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLnN0b3JlSWQsXHJcbiAgICAgICAgcGF0aDogYC9tYW5hZ2Uvc3RvcmVzL2NhbWVyYXM/c3RvcmVJZD0ke3RoaXMuc3RvcmVJZH1gLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5zdG9yZUlkLFxyXG4gICAgICAgIHBhdGg6IGAvbWFuYWdlL3N0b3Jlcy9jYW1lcmFzP3N0b3JlSWQ9JHt0aGlzLnN0b3JlSWR9YCxcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5ncy51c2VyQWNjZXNzLnZhbHVlPy51c2VyVHlwZSA9PT0gXCJ0YW5nb1wiKSB7XHJcbiAgICAgIGJyZWFkY3J1bWJzID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIk1hbmFnZVwiLFxyXG4gICAgICAgICAgcGF0aDogXCIvbWFuYWdlL2JyYW5kc1wiLFxyXG4gICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6IFwiTWFuYWdlXCIsXHJcbiAgICAgICAgICBwYXRoOiBcIi9tYW5hZ2UvYnJhbmRzXCIsXHJcbiAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc1NlcGFyYXRvcjogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC4uLmNvbW1vbkJyZWFkY3J1bWJzLFxyXG4gICAgICBdO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlID09PSBcImNsaWVudFwiKSB7XHJcbiAgICAgIGJyZWFkY3J1bWJzID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIk1hbmFnZVwiLFxyXG4gICAgICAgICAgcGF0aDogXCIvbWFuYWdlL3N1bW1hcnlcIixcclxuICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIk1hbmFnZVwiLFxyXG4gICAgICAgICAgcGF0aDogXCIvbWFuYWdlL3N1bW1hcnlcIixcclxuICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgIGlzU2VwYXJhdG9yOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uY29tbW9uQnJlYWRjcnVtYnMsXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoYnJlYWRjcnVtYnMpO1xyXG4gIH1cclxuLy8gU3RvcmUgbmFtZSBmb3IgdGhlIGNhcmQgYWJvdmUgdGhlIHRhYnMuIFRoZSBoZWFkZXIgZmlsdGVyIGRvZXNuJ3QgY2FycnkgaXQgb25cclxuLy8gdGhpcyBwYWdlLCBzbyBpdCBjb21lcyBmcm9tIGdldC1zdG9yZS4gJy0tJyB3aGlsZSBsb2FkaW5nIG9yIG9uIGZhaWx1cmUuXHJcbnByaXZhdGUgc3RvcmVOYW1lRnJvbUFwaSA9ICcnO1xyXG5nZXQgc3RvcmVOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnN0b3JlTmFtZUZyb21BcGkgfHwgJy0tJzsgfVxyXG4vLyBPcGVuIC8gY2xvc2UgdGltZSBmcm9tIHRoZSBzdG9yZSBwcm9maWxlLCBhcyB0aGUgc3RvcmUgaGVhZGVyIHNob3dzIHRoZW0uXHJcbnN0b3JlT3BlbiA9ICcnO1xyXG5zdG9yZUNsb3NlID0gJyc7XHJcblxyXG5wcml2YXRlIGxvYWRTdG9yZU5hbWUoc3RvcmVJZDogYW55KTogdm9pZCB7XHJcbiAgdGhpcy5zdG9yZU5hbWVGcm9tQXBpID0gJyc7XHJcbiAgdGhpcy5zdG9yZU9wZW4gPSAnJztcclxuICB0aGlzLnN0b3JlQ2xvc2UgPSAnJztcclxuICBpZiAoIXN0b3JlSWQpIHJldHVybjtcclxuICB0aGlzLnRpY2tldHNTZXJ2aWNlLmdldFN0b3JlRGV0YWlscyhzdG9yZUlkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRldGFjaCkpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgLy8gSWdub3JlIGEgbGF0ZSByZXBseSBmb3IgYSBzdG9yZSB0aGF0IGlzIG5vIGxvbmdlciBzZWxlY3RlZC5cclxuICAgICAgaWYgKHN0b3JlSWQgIT09IHRoaXMuc3RvcmVJZCkgcmV0dXJuO1xyXG4gICAgICB0aGlzLnN0b3JlTmFtZUZyb21BcGkgPSByZXM/LmRhdGE/LnN0b3JlTmFtZSB8fCAnJztcclxuICAgICAgdGhpcy5zdG9yZU9wZW4gPSByZXM/LmRhdGE/LnN0b3JlUHJvZmlsZT8ub3BlbiB8fCAnJztcclxuICAgICAgdGhpcy5zdG9yZUNsb3NlID0gcmVzPy5kYXRhPy5zdG9yZVByb2ZpbGU/LmNsb3NlIHx8ICcnO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoKSA9PiB7fSxcclxuICB9KTtcclxufVxyXG5cclxuLy8gVGhlIHN0b3JlLWNhcmQgYnV0dG9ucyAoVGVybWluYWwgYWNjZXNzLCBGaWxlIGFjY2VzcywgQ2FsbCkgYXJlIGZvciBUYW5nbyB1c2VycyBvbmx5LlxyXG5nZXQgaXNUYW5nbygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ3MudXNlckFjY2Vzcy52YWx1ZT8udXNlclR5cGUgPT09ICd0YW5nbyc7IH1cclxuXHJcbi8vIC4uLmFuZCBvbmx5IGZvciBJbmZyYSBWMiBjbGllbnRzLiBTYW1lIGNhbGwgYW5kIGZpZWxkIHRoZSBUaWNrZXRzIHBhZ2UgdXNlcyBmb3JcclxuLy8gaXRzIEluZnJhIFYyIHRhYi4gSGlkZGVuIHdoaWxlIGxvYWRpbmcgb3Igb24gZXJyb3IuXHJcbmluZnJhVGlja2V0VHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbmNsaWVudERpc3BsYXlOYW1lID0gJyc7XHJcbmdldCBzaG93U3RvcmVBY3Rpb25zKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5pc1RhbmdvICYmIHRoaXMuaW5mcmFUaWNrZXRUeXBlID09PSAnVjInOyB9XHJcblxyXG5wcml2YXRlIGxvYWRDbGllbnQoaGVhZGVyOiBhbnkpOiB2b2lkIHtcclxuICB0aGlzLmluZnJhVGlja2V0VHlwZSA9IG51bGw7XHJcbiAgdGhpcy5jbGllbnREaXNwbGF5TmFtZSA9ICcnO1xyXG4gIGNvbnN0IGNsaWVudElkID0gaGVhZGVyPy5jbGllbnQgfHwgU3RyaW5nKHRoaXMuc3RvcmVJZCB8fCAnJykuc3BsaXQoJy0nKVswXTtcclxuICBpZiAoIWNsaWVudElkKSByZXR1cm47XHJcbiAgdGhpcy5hdXRoU2VydmljZS5nZXRCcmFuZERldGFpbHMoY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmluZnJhVGlja2V0VHlwZSA9IHJlcz8uZGF0YT8udGlja2V0Q29uZmlncz8uaW5mcmFUaWNrZXRUeXBlID8/IG51bGw7XHJcbiAgICAgIHRoaXMuY2xpZW50RGlzcGxheU5hbWUgPSByZXM/LmRhdGE/LmNsaWVudE5hbWUgfHwgJyc7XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6ICgpID0+IHt9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vLyBMaXZlIC8gTm90IExpdmUgYmVzaWRlIHRoZSBuYW1lLCBieSB0aGUgc2FtZSBydWxlIGFzIHRoZSBTdW1tYXJ5IGNhcmQncyB0aWxlcy5cclxuLy8gRW1wdHkgLSBhbmQgaGlkZGVuIC0gd2hpbGUgbG9hZGluZywgZm9yIGEgbm9uLVYyIGNsaWVudCwgb3IgZm9yIGEgc3RvcmUgVjJcclxuLy8gZG9lcyBub3QgY291bnQgKGluYWN0aXZlLCBvciBubyBmaXJzdCBmaWxlIHlldCkuXHJcbmxpdmVTdGF0dXM6ICcnIHwgJ0xpdmUnIHwgJ05vdCBMaXZlJyA9ICcnO1xyXG5cclxucHJpdmF0ZSBsb2FkTGl2ZVN0YXR1cyhzdG9yZUlkOiBhbnksIGhlYWRlcjogYW55KTogdm9pZCB7XHJcbiAgdGhpcy5saXZlU3RhdHVzID0gJyc7XHJcbiAgY29uc3QgY2xpZW50SWQgPSBoZWFkZXI/LmNsaWVudCB8fCBTdHJpbmcoc3RvcmVJZCB8fCAnJykuc3BsaXQoJy0nKVswXTtcclxuICBpZiAoIXN0b3JlSWQgfHwgIWNsaWVudElkIHx8ICFoZWFkZXI/LmRhdGU/LmVuZERhdGUpIHJldHVybjtcclxuICBjb25zdCBib2R5ID0ge1xyXG4gICAgY2xpZW50SWQ6IFtjbGllbnRJZF0sIGZyb21EYXRlOiBoZWFkZXIuZGF0ZS5zdGFydERhdGUgfHwgaGVhZGVyLmRhdGUuZW5kRGF0ZSwgdG9EYXRlOiBoZWFkZXIuZGF0ZS5lbmREYXRlLFxyXG4gICAgc2VhcmNoOiBzdG9yZUlkLCBvZmZzZXQ6IDEsIGxpbWl0OiA1MCxcclxuICB9O1xyXG4gIHRoaXMudGlja2V0c1NlcnZpY2Uuc3RvcmVMaXZlU3RhdHVzKGJvZHkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoc3RvcmVJZCAhPT0gdGhpcy5zdG9yZUlkKSByZXR1cm47XHJcbiAgICAgIC8vIHNlYXJjaCBpcyBhIHBhcnRpYWwgbWF0Y2ggKDQwNi0xIGFsc28gZmluZHMgNDA2LTEwKSwgc28gcGljayB0aGUgZXhhY3Qgc3RvcmUuXHJcbiAgICAgIGNvbnN0IHJvdyA9IChyZXM/LmRhdGE/LnJvd3MgPz8gW10pLmZpbmQoKHI6IGFueSkgPT4gci5zdG9yZUlkID09PSBzdG9yZUlkKTtcclxuICAgICAgdGhpcy5saXZlU3RhdHVzID0gcm93Py5zdGF0dXMgPT09ICdMaXZlJyB8fCByb3c/LnN0YXR1cyA9PT0gJ05vdCBMaXZlJyA/IHJvdy5zdGF0dXMgOiAnJztcclxuICAgIH0sXHJcbiAgICBlcnJvcjogKCkgPT4ge30sXHJcbiAgfSk7XHJcbn1cclxuXHJcbnNlbGVjdGVkVGFicyh2YWx1ZTphbnkpe1xyXG4gIHRoaXMuc2VsZWN0ZWRUYWIgPSB2YWx1ZTtcclxuICBpZih0aGlzLnNlbGVjdGVkVGFiID09PSdpbmZyYScpe1xyXG4gICAgdGhpcy5zZWxlY3RlZFRhYjEgPSd0aWNrZXRzJ1xyXG4gIH1cclxuICBjb25zdCBxdWVyeVBhcmFtcyA9IHsgLi4udGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyB9O1xyXG4gICAgICBxdWVyeVBhcmFtc1sndHlwZSddID0gdmFsdWU7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7IHJlbGF0aXZlVG86dGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zfSk7XHJcbn1cclxuXHJcbnNlbGVjdGVkVGFiczEodHlwZTphbnkpe1xyXG4gIHRoaXMuc2VsZWN0ZWRUYWIxID0gdHlwZTtcclxuICAvLyBLZWVwIHRoZSBVUkwgaW4gc3RlcCwgdGhlIHNhbWUgd2F5IHNlbGVjdGVkVGFicygpIGRvZXMgZm9yIHRoZSB0b3AgdGFicy5cclxuICAvLyBTdW1tYXJ5IGhhcyBubyBgdHlwZWAgb2YgaXRzIG93biwgc28gaXQgc2hhcmVzICdpbmZyYScgd2l0aCBUaWNrZXRzIFYxLlxyXG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0geyAuLi50aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zIH07XHJcbiAgICAgIHF1ZXJ5UGFyYW1zWyd0eXBlJ10gPSB0eXBlID09PSAndGlja2V0c1YyJyA/ICdpbmZyYXYyJyA6ICdpbmZyYSc7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7IHJlbGF0aXZlVG86dGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zfSk7XHJcbn1cclxuXHJcbi8vIFRlcm1pbmFsIGFjY2VzcyBwb3AtdXA6IG9wZW5zIGF0IG9uY2UsIHRoZW4gZmlsbHMgZnJvbSAvcmVtb3RlL3Nlc3Npb24uXHJcbi8vIEV2ZXJ5IGNhbGwgaXMgYXVkaXQtbG9nZ2VkIGFzIGEgc2Vzc2lvbiBvcGVuZWQsIENhbmNlbCBpbmNsdWRlZC5cclxuc2Vzc2lvbjogYW55ID0gbnVsbDtcclxuc2Vzc2lvblN0YXRlOiAnbG9hZGluZycgfCAncmVhZHknIHwgJ2Vycm9yJyA9ICdsb2FkaW5nJztcclxuc2Vzc2lvbkVycm9yID0gJyc7XHJcblxyXG5vcGVuVGVybWluYWwodHBsOiBUZW1wbGF0ZVJlZjxhbnk+KTogdm9pZCB7XHJcbiAgdGhpcy5zZXNzaW9uID0gbnVsbDtcclxuICB0aGlzLnNlc3Npb25FcnJvciA9ICcnO1xyXG4gIHRoaXMuc2Vzc2lvblN0YXRlID0gJ2xvYWRpbmcnO1xyXG4gIHRoaXMubW9kYWwub3Blbih0cGwsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgdGhpcy50aWNrZXRzU2VydmljZS5yZW1vdGVTZXNzaW9uKHRoaXMuc3RvcmVJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXRhY2gpKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogKHJlczogYW55KSA9PiB7IHRoaXMuc2Vzc2lvbiA9IHJlcz8uZGF0YSA/PyBudWxsOyB0aGlzLnNlc3Npb25TdGF0ZSA9ICdyZWFkeSc7IH0sXHJcbiAgICAvLyBUaGUgQVBJJ3Mgb3duIG1lc3NhZ2U6IFwiU3RvcmUgbm90IGZvdW5kXCIsIFwiTm8gZWRnZSBhZ2VudC4uLlwiLCBcIm5vdCBjb25maWd1cmVkXCIuXHJcbiAgICBlcnJvcjogKGVycjogYW55KSA9PiB7IHRoaXMuc2Vzc2lvbkVycm9yID0gZXJyPy5lcnJvcj8uZXJyb3IgfHwgJyc7IHRoaXMuc2Vzc2lvblN0YXRlID0gJ2Vycm9yJzsgfSxcclxuICB9KTtcclxufVxyXG5cclxuLy8gQ29ubmVjdDogc3dhcCB0aGUgY29uZmlybWF0aW9uIGZvciB0aGUgdGVybWluYWwgcG9wLXVwLiBTdGF0aWMgYmFja2Ryb3AgYW5kXHJcbi8vIG5vIEVzYywgc28gYSBzdHJheSBjbGljayBjYW5ub3QgZHJvcCBhIGxpdmUgc2hlbGw7IGl0IGNsb3NlcyB2aWEgQ2xvc2UuXHJcbmNvbm5lY3QoY29uZmlybVJlZjogYW55KTogdm9pZCB7XHJcbiAgY29uZmlybVJlZi5jbG9zZSgpO1xyXG4gIGNvbnN0IHJlZiA9IHRoaXMubW9kYWwub3BlbihSZW1vdGVUZXJtaW5hbENvbXBvbmVudCwge1xyXG4gICAgc2l6ZTogJ3hsJywgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJywga2V5Ym9hcmQ6IGZhbHNlLCBtb2RhbERpYWxvZ0NsYXNzOiAncmVtb3RlLXRlcm1pbmFsLW1vZGFsJyxcclxuICB9KTtcclxuICByZWYuY29tcG9uZW50SW5zdGFuY2Uuc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbjtcclxufVxyXG5cclxufVxyXG4iLCI8IS0tIFN0b3JlIGNhcmQ6IG5hbWUgYW5kIHRpbWluZ3MgZnJvbSBnZXQtc3RvcmUsIExpdmUgc3RhdHVzIGZyb20gdGhlIFYyIHN0b3JlIGxpc3QuIC0tPlxyXG48ZGl2IGNsYXNzPVwiY2FyZCBtYi01IHB5LTQgcHgtNVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj48c3ZnIHdpZHRoPVwiNDZcIiBoZWlnaHQ9XCI0NlwiIHZpZXdCb3g9XCIwIDAgNDYgNDZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0QxRkFERlwiLz5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBzdHJva2U9XCIjRUNGREYzXCIgc3Ryb2tlLXdpZHRoPVwiNlwiLz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNS42Nzk5IDE4LjgwMzlMMTUuNjI2NyAxOC44ODcxQzE1LjA2ODYgMTkuODc0MSAxNS42NjQ0IDIxLjEyMTUgMTYuNzM2MSAyMS4yNjQ2QzE2LjgzMzEgMjEuMjc2NSAxNi45MjM1IDIxLjI4MjggMTcuMDExOCAyMS4yODI4QzE3LjU4OTkgMjEuMjgyOCAxOC4xMDExIDIxLjAzNDggMTguNDU3NCAyMC42NDhMMTkuMDEwNyAyMC4wNDc0TDE5LjU2MjEgMjAuNjQ5OEMxOS45MTQxIDIxLjAzNDIgMjAuNDI0MSAyMS4yODI4IDIxLjAwNjEgMjEuMjgyOEMyMS41ODU2IDIxLjI4MjggMjIuMDk4NSAyMS4wMzM4IDIyLjQ1MDIgMjAuNjQ5OEwyMy4wMDMzIDIwLjA0NTVMMjMuNTU2NSAyMC42NDk4QzIzLjkwODEgMjEuMDMzOCAyNC40MjExIDIxLjI4MjggMjUuMDAwNSAyMS4yODI4QzI1LjU4IDIxLjI4MjggMjYuMDkyOSAyMS4wMzM4IDI2LjQ0NDUgMjAuNjQ5OEwyNi45OTc3IDIwLjA0NTVMMjcuNTUwOSAyMC42NDk4QzI3LjkwMjUgMjEuMDMzOCAyOC40MTU1IDIxLjI4MjggMjguOTk0OSAyMS4yODI4QzI5LjA4MDMgMjEuMjgyOCAyOS4xNzMzIDIxLjI3NjUgMjkuMjY5NyAyMS4yNjQ3QzMwLjM2NDkgMjEuMTE1NCAzMC45NjI3IDE5LjgwMTIgMzAuMzI0IDE4LjgwNDRDMzAuMzI0IDE4LjgwNDMgMzAuMzI0IDE4LjgwNDMgMzAuMzIzOSAxOC44MDQyTDI4LjU2NTggMTYuMDYyOEwyOC41NjU4IDE2LjA2MjhMMjguNTY0OCAxNi4wNjE0QzI4LjU0OTYgMTYuMDM3NSAyOC41MTIxIDE2LjAxMiAyOC40NjUgMTYuMDEySDE3LjUzNTZDMTcuNDg4NCAxNi4wMTIgMTcuNDUwOSAxNi4wMzc1IDE3LjQzNTcgMTYuMDYxNEwxNy40MzUxIDE2LjA2MjNMMTUuNjc5OSAxOC44MDM5Wk0yOC42NTE0IDIzLjczNzJWMjYuODY5MVYyNy42MTkxSDI3LjkwMTRIMTguMDk5MkgxNy4zNDkyVjI2Ljg2OTFWMjMuNzM3NkMxNy4yMzkgMjMuNzQ1OCAxNy4xMjc0IDIzLjc1MDEgMTcuMDE0OCAyMy43NTAxQzE2Ljk3MjUgMjMuNzUwMSAxNi45MzA1IDIzLjc0OTQgMTYuODg4OCAyMy43NDgyVjI2Ljg2OTFWMjguODAzNkMxNi44ODg4IDI5LjQ0NzEgMTcuNDIyNyAyOS45ODgyIDE4LjA5OTIgMjkuOTg4MkgyNy45MDE0QzI4LjU3NzkgMjkuOTg4MiAyOS4xMTE4IDI5LjQ0NzEgMjkuMTExOCAyOC44MDM2VjI2Ljg2OTFWMjMuNzQ4NEMyOS4wNzIgMjMuNzQ5NSAyOS4wMzIgMjMuNzUwMSAyOC45OTE4IDIzLjc1MDFDMjguODc3NCAyMy43NTAxIDI4Ljc2MzkgMjMuNzQ1NyAyOC42NTE0IDIzLjczNzJaXCIgc3Ryb2tlPVwiIzAyN0E0OFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiLz5cclxuICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RvcmUtY2FyZC1uYW1lXCI+e3sgc3RvcmVOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsaXZlU3RhdHVzXCIgY2xhc3M9XCJsaXZlLXN0YXR1cyBtcy00XCIgW2NsYXNzLmRvd25dPVwibGl2ZVN0YXR1cyA9PT0gJ05vdCBMaXZlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGl2ZS1kb3RcIj48L3NwYW4+e3sgbGl2ZVN0YXR1cyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLWNhcmQtbWV0YSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0b3JlSWQgfHwgJy0tJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMlwiPsK3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1lLTFcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDQuNVY5TDEyIDEwLjVNMTYuNSA5QzE2LjUgMTMuMTQyMSAxMy4xNDIxIDE2LjUgOSAxNi41QzQuODU3ODYgMTYuNSAxLjUgMTMuMTQyMSAxLjUgOUMxLjUgNC44NTc4NiA0Ljg1Nzg2IDEuNSA5IDEuNUMxMy4xNDIxIDEuNSAxNi41IDQuODU3ODYgMTYuNSA5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdG9yZU9wZW4gfHwgJy0tJyB9fSAtIHt7IHN0b3JlQ2xvc2UgfHwgJy0tJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBUYW5nbyB1c2VycyBvZiBJbmZyYSBWMiBjbGllbnRzIG9ubHkuIFRoZSBob3ZlcmVkIGJ1dHRvbiBleHBhbmRzOyBUZXJtaW5hbCBhY2Nlc3MgaXMgZXhwYW5kZWQgd2hpbGUgbm9uZSBpcy4gLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTdG9yZUFjdGlvbnNcIiBjbGFzcz1cInN0b3JlLWFjdGlvbnMgbXMtYXV0byBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic3RvcmUtYWN0IGlzLWRlZmF1bHRcIiAoY2xpY2spPVwib3BlblRlcm1pbmFsKHRlcm1pbmFsVHBsKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIzLjVcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTNcIiByeD1cIjJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDIxSDE2TTEyIDE2LjVWMjFNNi41IDhMOSAxMEw2LjUgMTJNMTEgMTJIMTRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz48c3BhbiBjbGFzcz1cImFjdC1sYWJlbFwiPlRlcm1pbmFsIGFjY2Vzczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic3RvcmUtYWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNy41QzMgNi40IDMuOSA1LjUgNSA1LjVIOS4yTDExLjIgNy41SDE5QzIwLjEgNy41IDIxIDguNCAyMSA5LjVWMTdDMjEgMTguMSAyMC4xIDE5IDE5IDE5SDVDMy45IDE5IDMgMTguMSAzIDE3VjcuNVpcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjxzcGFuIGNsYXNzPVwiYWN0LWxhYmVsXCI+RmlsZSBhY2Nlc3M8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0b3JlLWFjdFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjYgNC41TDYuNCAzLjZDNS44IDMuNCA1LjEgMy42IDQuNyA0LjFMMy41IDUuNkMzLjEgNi4xIDMgNi44IDMuMiA3LjRDNC45IDEyLjcgOS4zIDE3LjEgMTQuNiAxOC44QzE1LjIgMTkgMTUuOSAxOC45IDE2LjQgMTguNUwxNy45IDE3LjNDMTguNCAxNi45IDE4LjYgMTYuMiAxOC40IDE1LjZMMTcuNSAxMy40QzE3LjMgMTIuOCAxNi42IDEyLjUgMTYgMTIuNkwxMy42IDEzLjFDMTEuOSAxMi4yIDEwLjggMTEuMSA5LjkgOS40TDEwLjQgN0MxMC41IDYuNCAxMC4yIDUuNyA5LjYgNS41TDguNiA0LjVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz48c3BhbiBjbGFzcz1cImFjdC1sYWJlbFwiPkNhbGw8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwiY2FyZCBtYi01IHB5LTMgcHgtNVwiPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtc3RyZXRjaCBuYXYtbGluZS10YWJzMSBuYXYtbGluZS10YWJzIGJvcmRlci10cmFuc3BhcmVudCBmbGV4LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIChjbGljayk9XCJzZWxlY3RlZFRhYnMoJ2luZnJhJylcIj48YSBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0naW5mcmEnID8gJ2FjdGl2ZScgOicnXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIG5vLWJvcmRlciBtZS02IFwiPkluZnJhPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIChjbGljayk9XCJzZWxlY3RlZFRhYnMoJ2RhdGFNaXNtYXRjaCcpXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0nZGF0YU1pc21hdGNoJyA/ICdhY3RpdmUnIDonJ1wiIGNsYXNzPVwibmF2LWxpbmsgY3Vyc29yLXBvaW50ZXIgbWUtNlwiPkRhdGEgTWlzbWF0Y2g8L2E+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdGVkVGFicygnY2FtZXJhQW5nbGVDaGFuZ2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09J2NhbWVyYUFuZ2xlQ2hhbmdlJyA/ICdhY3RpdmUnIDonJ1wiIGNsYXNzPVwibmF2LWxpbmsgY3Vyc29yLXBvaW50ZXIgbWUtNlwiPkNhbWVyYSBBbmdsZTwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPCEtLSBGaWxlIGxvZ3MsIGF0IHRoZSByaWdodCBlbmQgb2YgdGhlIHJvdzogaXRzIG93biBwYWdlIGF0ID90eXBlPWZpbGVMb2dzLiBUYW5nbyBvbmx5LiAtLT5cclxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiaXNUYW5nb1wiIGNsYXNzPVwibmF2LWl0ZW0gbXMtYXV0b1wiIChjbGljayk9XCJzZWxlY3RlZFRhYnMoJ2ZpbGVMb2dzJylcIj5cclxuICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSdmaWxlTG9ncycgPyAnYWN0aXZlJyA6JydcIiBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIGZpbGUtbG9ncy1saW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQgM0g3QzUuOSAzIDUgMy45IDUgNVYxOUM1IDIwLjEgNS45IDIxIDcgMjFIMTdDMTguMSAyMSAxOSAyMC4xIDE5IDE5VjhMMTQgM1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzVjhIMTlNOSAxM0gxNU05IDE3SDEzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIEZpbGUgbG9nc1xyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG5cclxuICAgICAgICAgICAgIDwhLS0gPGxpICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nIHx8IGNsaWVudERhdGE/LmlzVk1TXCIgY2xhc3M9XCJuYXYtaXRlbVwiIChjbGljayk9XCJzZWxlY3RlZFRhYnMoJ2Zvb3RmYWxsJylcIj5cclxuICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSdmb290ZmFsbCcgPyAnYWN0aXZlJyA6JydcIiBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIG1lLTZcIj5Gb290ZmFsbCBEaXJlY3Rvcnk8L2E+XHJcbiAgICAgICAgICAgIDwvbGk+IC0tPlxyXG4gICAgICAgIDwvdWw+XHJcbjwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09J2luZnJhJ1wiIGNsYXNzPVwibWItNSBweS0zIHB4LTVcIj5cclxuICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtc3RyZXRjaCBuYXYtbGluZS10YWJzMSBuYXYtbGluZS10YWJzIGJvcmRlci10cmFuc3BhcmVudCBmbGV4LW5vd3JhcFwiPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIG5hdi1pdGVtMVwiIChjbGljayk9XCJzZWxlY3RlZFRhYnMxKCdzdW1tYXJ5JylcIj48YSBbbmdDbGFzc109XCJzZWxlY3RlZFRhYjEgPT09J3N1bW1hcnknID8gJ2FjdGl2ZScgOicnXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgbmF2LWxpbmsxIGN1cnNvci1wb2ludGVyIG5vLWJvcmRlciBtZS02IFwiPlN1bW1hcnk8L2E+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbTFcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWJzMSgndGlja2V0cycpXCI+XHJcbiAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiMSA9PT0ndGlja2V0cycgPyAnYWN0aXZlJyA6JydcIiBjbGFzcz1cIm5hdi1saW5rIG5hdi1saW5rMSBjdXJzb3ItcG9pbnRlciBtZS02XCI+VGlja2V0cyBWMTwvYT5cclxuICAgICAgICA8L2xpPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIG5hdi1pdGVtMVwiIChjbGljayk9XCJzZWxlY3RlZFRhYnMxKCd0aWNrZXRzVjInKVwiPlxyXG4gICAgICAgICAgICA8YSBbbmdDbGFzc109XCJzZWxlY3RlZFRhYjEgPT09J3RpY2tldHNWMicgPyAnYWN0aXZlJyA6JydcIiBjbGFzcz1cIm5hdi1saW5rIG5hdi1saW5rMSBjdXJzb3ItcG9pbnRlciBtZS02XCI+VGlja2V0cyBWMjwvYT5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0naW5mcmEnICYmIHNlbGVjdGVkVGFiMSA9PT0nc3VtbWFyeSdcIj5cclxuICAgIDxsaWItc3VtbWFyeS1pbmZyYSBbc2VsZWN0ZWRUYWJdPVwic2VsZWN0ZWRUYWJcIj48L2xpYi1zdW1tYXJ5LWluZnJhPlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSdpbmZyYScgJiYgc2VsZWN0ZWRUYWIxID09PSd0aWNrZXRzJ1wiPlxyXG4gICAgPGxpYi10aWNrZXQtaW5mcmEgW3NlbGVjdGVkVGFiXT1cInNlbGVjdGVkVGFiXCI+PC9saWItdGlja2V0LWluZnJhPlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSdpbmZyYScgJiYgc2VsZWN0ZWRUYWIxID09PSd0aWNrZXRzVjInXCI+XHJcbiAgICA8bGliLXRpY2tldC1pbmZyYS12MiBbc2VsZWN0ZWRUYWJdPVwic2VsZWN0ZWRUYWJcIj48L2xpYi10aWNrZXQtaW5mcmEtdjI+XHJcbjwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09J2RhdGFNaXNtYXRjaCdcIj5cclxuICAgIDxsaWItdGlja2V0LWluZnJhIFtzZWxlY3RlZFRhYl09XCJzZWxlY3RlZFRhYlwiPjwvbGliLXRpY2tldC1pbmZyYT5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09J2NhbWVyYUFuZ2xlQ2hhbmdlJ1wiPlxyXG4gICAgPGxpYi10aWNrZXQtY2FtZXJhLWFuZ2xlIFtzZWxlY3RlZFRhYl09XCJzZWxlY3RlZFRhYlwiPjwvbGliLXRpY2tldC1jYW1lcmEtYW5nbGU+XHJcbjwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09J2Zvb3RmYWxsJ1wiPlxyXG4gICAgPGxpYi1mb290ZmFsbC1kaXJlY3RvcnkgW3NlbGVjdGVkVGFiXT1cInNlbGVjdGVkVGFiXCI+PC9saWItZm9vdGZhbGwtZGlyZWN0b3J5PlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSdmaWxlTG9ncycgJiYgaXNUYW5nb1wiPlxyXG4gICAgPGxpYi1maWxlLWxvZ3MgW3N0b3JlSWRdPVwic3RvcmVJZFwiIFtjbGllbnRJZF09XCJoZWFkZXJGaWx0ZXJzPy5jbGllbnRcIiBbZGF0ZV09XCJoZWFkZXJGaWx0ZXJzPy5kYXRlPy5lbmREYXRlXCI+PC9saWItZmlsZS1sb2dzPlxyXG48L2Rpdj5cclxuPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxyXG5cclxuPCEtLSBUZXJtaW5hbCBhY2Nlc3MgY29uZmlybWF0aW9uLiBGaWxsZWQgZnJvbSAvaW5mcmEvdjIvcmVtb3RlL3Nlc3Npb247IENsaWVudCBuYW1lIGZyb20gdGhlIGNsaWVudCByZWNvcmQuIC0tPlxyXG48bmctdGVtcGxhdGUgI3Rlcm1pbmFsVHBsIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtbW9kYWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLWhlYWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIzLjVcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTNcIiByeD1cIjJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDIxSDE2TTEyIDE2LjVWMjFNNi41IDhMOSAxMEw2LjUgMTJNMTEgMTJIMTRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzcy10aXRsZSBmcy00IHRleHQtZ3JheS04MDAgZnctYm9sZFwiPk9wZW4gdGVybWluYWwgYWNjZXNzPzwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLWJvZHlcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJhY2Nlc3MtdGV4dFwiPlRoaXMgb3BlbnMgYSBjb21tYW5kIHdpbmRvdyBvbiB0aGUgc3RvcmUgc3lzdGVtLiBDb21tYW5kcyBydW4gb24gdGhlIGxpdmUgc3lzdGVtLjwvcD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1ib3hcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gTG9hZGluZzogc2hpbW1lcmluZyBwbGFjZWhvbGRlciByb3dzIChzZWUgLnNrZWwpLiAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZXNzaW9uU3RhdGUgPT09ICdsb2FkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3Mtcm93XCI+PHNwYW4gY2xhc3M9XCJza2VsIHNrZWwtbGFiZWxcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJza2VsIHNrZWwtdmFsdWVcIj48L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1yb3dcIj48c3BhbiBjbGFzcz1cInNrZWwgc2tlbC1sYWJlbFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInNrZWwgc2tlbC12YWx1ZVwiPjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLXJvd1wiPjxzcGFuIGNsYXNzPVwic2tlbCBza2VsLWxhYmVsXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwic2tlbCBza2VsLXZhbHVlXCI+PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2Vzc2lvblN0YXRlID09PSAnZXJyb3InXCIgY2xhc3M9XCJhY2Nlc3Mtbm90ZSBlcnJvclwiPnt7IHNlc3Npb25FcnJvciB8fCBcIkNvdWxkbid0IG9wZW4gdGhlIHNlc3Npb24uXCIgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZXNzaW9uU3RhdGUgPT09ICdyZWFkeSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLXJvd1wiPjxzcGFuIGNsYXNzPVwiYWNjZXNzLWxhYmVsXCI+Q2xpZW50IG5hbWU8L3NwYW4+PHNwYW4gY2xhc3M9XCJhY2Nlc3MtdmFsdWVcIj57eyBjbGllbnREaXNwbGF5TmFtZSB8fCAnLS0nIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3Mtcm93XCI+PHNwYW4gY2xhc3M9XCJhY2Nlc3MtbGFiZWxcIj5TdG9yZSBJRDwvc3Bhbj48c3BhbiBjbGFzcz1cImFjY2Vzcy12YWx1ZVwiPnt7IHNlc3Npb24/LnN0b3JlSWQgfHwgJy0tJyB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLXJvd1wiPjxzcGFuIGNsYXNzPVwiYWNjZXNzLWxhYmVsXCI+U3RvcmUgbmFtZTwvc3Bhbj48c3BhbiBjbGFzcz1cImFjY2Vzcy12YWx1ZVwiPnt7IHNlc3Npb24/LnN0b3JlTmFtZSB8fCAnLS0nIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtZm9vdFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cInNlc3Npb25TdGF0ZSAhPT0gJ3JlYWR5J1wiIChjbGljayk9XCJjb25uZWN0KG1vZGFsKVwiPkNvbm5lY3Q8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuZ28tc3RvcmUtaW5mcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtdGlja2V0LWluZnJhL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1zdG9yZS1pbmZyYS90YW5nby1zdG9yZS1pbmZyYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS10aWNrZXQtaW5mcmEvc3JjL2xpYi9jb21wb25lbnRzL3RhbmdvLXN0b3JlLWluZnJhL3RhbmdvLXN0b3JlLWluZnJhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWtDLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU94RixNQUFNLE9BQU8sd0JBQXdCO0lBUWY7SUFBaUM7SUFBcUI7SUFBOEI7SUFBNkI7SUFBc0M7SUFBdUI7SUFQbE0sV0FBVyxDQUFNO0lBQ1QsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDL0IsT0FBTyxDQUFNO0lBQ2IsSUFBSSxDQUFNO0lBQ1YsWUFBWSxDQUFNO0lBQ1Ysb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLFVBQVUsQ0FBTTtJQUNoQixZQUFvQixRQUF3QixFQUFTLE1BQWEsRUFBUSxFQUFxQixFQUFTLEtBQW9CLEVBQVMsY0FBNkIsRUFBUyxLQUFjLEVBQVMsV0FBdUI7UUFBck0sYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQVEsT0FBRSxHQUFGLEVB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Q3pHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0QsR0FBRyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDMUQsQ0FBQzt3R0FyVFksd0JBQXdCOzRGQUF4Qix3QkFBd0IsNkRDZnJDLGtxY0E4S2M7OzRGRC9KRCx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgVGlja2V0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aWNrZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZW1vdGVUZXJtaW5hbENvbXBvbmVudCB9IGZyb20gJy4uL3RpY2tldC1pbmZyYS12Mi9yZW1vdGUtdGVybWluYWwvcmVtb3RlLXRlcm1pbmFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN0b3JlQ2FsbENvbXBvbmVudCB9IGZyb20gJy4uL3RpY2tldC1pbmZyYS12Mi9zdG9yZS1jYWxsL3N0b3JlLWNhbGwuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRhbmdvLXN0b3JlLWluZnJhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFuZ28tc3RvcmUtaW5mcmEuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90YW5nby1zdG9yZS1pbmZyYS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhbmdvU3RvcmVJbmZyYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxPbkRlc3Ryb3kge1xyXG4gIHNlbGVjdGVkVGFiOiBhbnk7XHJcbiAgcHJpdmF0ZSBkZXRhY2ggPSBuZXcgU3ViamVjdCgpO1xyXG4gIHN0b3JlSWQ6IGFueTtcclxuICB0eXBlOiBhbnk7XHJcbiAgc2VsZWN0ZWRUYWIxOiBhbnk7XHJcbiAgcHJpdmF0ZSBzdWJUYWJGcm9tVXJsQXBwbGllZCA9IGZhbHNlO1xyXG4gIGNsaWVudE5hbWU6IGFueTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhZ2VJbmZvOlBhZ2VJbmZvU2VydmljZSxwcml2YXRlIHJvdXRlcjpSb3V0ZXIscHVibGljIGdzOkdsb2JhbFN0YXRlU2VydmljZSxwcml2YXRlIHJvdXRlOkFjdGl2YXRlZFJvdXRlLHByaXZhdGUgdGlja2V0c1NlcnZpY2U6VGlja2V0c1NlcnZpY2UscHJpdmF0ZSBtb2RhbDpOZ2JNb2RhbCxwcml2YXRlIGF1dGhTZXJ2aWNlOkF1dGhTZXJ2aWNlKXtcclxuXHJcbiAgfVxyXG4gIGhlYWRlckZpbHRlcnM6YW55O1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXRhY2gubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGV0YWNoLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG4gIGNsaWVudERhdGE6YW55O1xyXG4gICB1c2VyVHlwZTphbnk7XHJcbnByaXZhdGUgaXNTdG9yZUlkVmFsaWRGb3JDbGllbnQoc3RvcmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgaWYgKCFzdG9yZUlkIHx8ICF0aGlzLnVzZXJUeXBlPy5jbGllbnRJZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAvLyAvLyBUYW5nbyB1c2VycyBjYW4gYWNjZXNzIGFsbFxyXG4gIC8vIGlmICh0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgLy8gICByZXR1cm4gdHJ1ZTtcclxuICAvLyB9XHJcblxyXG4gIGNvbnN0IHN0b3JlQ2xpZW50SWQgPSBzdG9yZUlkLnNwbGl0KCctJylbMF07XHJcbiAgcmV0dXJuIHN0b3JlQ2xpZW50SWQgPT09IFN0cmluZyh0aGlzLnVzZXJUeXBlLmNsaWVudElkKTtcclxufVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgdGhpcy51c2VyVHlwZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1c2VyLWluZm9cIikgfHwgJ3t9Jyk7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgICBjb25zdCB0eXBlID0gcGFyYW1zWyd0eXBlJ10gPyBwYXJhbXNbJ3R5cGUnXSA6ICdpbmZyYSc7XHJcbiAgICAgIGlmKHR5cGUgPT09J2luZnJhdjInKXtcclxuICAgICAgICAvLyBFdmVyeSBJbmZyYSBibG9jayBpcyBnYXRlZCBvbiBzZWxlY3RlZFRhYiA9PT0gJ2luZnJhJywgc28gdGhpcyByZWFkc1xyXG4gICAgICAgIC8vIGFzIFwidGhlIEluZnJhIHRhYiwgb3BlbmVkIG9uIFRpY2tldHMgVjJcIiByYXRoZXIgdGhhbiBhIHRhYiBvZiBpdHMgb3duLlxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnaW5mcmEnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9IHR5cGU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gT25seSBvbiB0aGUgZmlyc3QgZW1pc3Npb246IHNlbGVjdGVkVGFiczEoKSByZXdyaXRlcyBgdHlwZWAsIHdoaWNoXHJcbiAgICAgIC8vIGZpcmVzIHRoaXMgc3Vic2NyaXB0aW9uIGFnYWluLCBhbmQgd2l0aG91dCB0aGUgZ3VhcmQgdGhhdCB3b3VsZCB1bmRvXHJcbiAgICAgIC8vIHRoZSBjbGljayAtIFN1bW1hcnkgaW4gcGFydGljdWxhciB3b3VsZCBib3VuY2UgdG8gVGlja2V0cyBWMS5cclxuICAgICAgaWYoIXRoaXMuc3ViVGFiRnJvbVVybEFwcGxpZWQpe1xyXG4gICAgICAgIHRoaXMuc3ViVGFiRnJvbVVybEFwcGxpZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmKHR5cGUgPT09J2luZnJhdjInKXtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIxID0gJ3RpY2tldHNWMidcclxuICAgICAgICB9IGVsc2UgaWYodGhpcy5zZWxlY3RlZFRhYiA9PT0naW5mcmEnKXtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIxID0ndGlja2V0cydcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgICAgICAgIGNvbnN0IGNsaWVudERhdGE6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjbGllbnQtZGV0YWlsc1wiKSB8fCBcInt9XCIpO1xyXG4gICAgdGhpcy5jbGllbnREYXRhID0gY2xpZW50RGF0YTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5kZXRhY2gpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyRmlsdGVycyA9IHsgLi4uZGF0YSB9O1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUlkID1cclxuICAgICAgICAgICAgZGF0YSAmJiBkYXRhLnN0b3JlID8gZGF0YS5zdG9yZSA6IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIilbM107XHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50TmFtZSA9IGRhdGE/LmNsaWVudE5hbWUgPyBkYXRhPy5jbGllbnROYW1lOicnO1xyXG4gICAgICAgICAgICAgaWYgKHRoaXMuZ3MudXNlckFjY2Vzcy52YWx1ZT8udXNlclR5cGUgIT09ICd0YW5nbycpIHtcclxuICAgICAgICAgICAgIGlmICghdGhpcy5pc1N0b3JlSWRWYWxpZEZvckNsaWVudCh0aGlzLnN0b3JlSWQpKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9lcnJvci80MDQnXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0b3JlSWRRdWVyeVBhcmFtKHRoaXMuc3RvcmVJZCk7XHJcbiAgICAgICAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRTdG9yZU5hbWUodGhpcy5zdG9yZUlkKTtcclxuICAgICAgICAgIHRoaXMubG9hZExpdmVTdGF0dXModGhpcy5zdG9yZUlkLCBkYXRhKTtcclxuICAgICAgICAgIHRoaXMubG9hZENsaWVudChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIH1cclxuICAgIHVwZGF0ZVN0b3JlSWRRdWVyeVBhcmFtKHN0b3JlSWQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlICE9PSAndGFuZ28nKSB7XHJcbiAgICAgICBpZiAoIXRoaXMuaXNTdG9yZUlkVmFsaWRGb3JDbGllbnQoc3RvcmVJZCkpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yLzQwNCddKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbn1cclxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7IC4uLnRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfTtcclxuICAgICAgLy8gVXBkYXRlIHN0b3JlSWQgaW4gcXVlcnlQYXJhbXNcclxuICAgICAgcXVlcnlQYXJhbXMuc3RvcmVJZCA9IHN0b3JlSWQ7XHJcbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBzYW1lIHJvdXRlIHdpdGggdXBkYXRlZCBxdWVyeVBhcmFtc1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XHJcbiAgICB9XHJcbiAgc2V0UGFnZURhdGEoKXtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoXCJUaWNrZXRzXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXREZXNjcmlwdGlvbihcclxuICAgICAgXCJWaWV3LCBzaGFyZSwgZG93bmxvYWQgYW5kIGJlbmNobWFyayB0aGUgc3RvcmVzIHBlcmZvcm1hbmNlIGluIG9uZSBzY3JlZW5cIlxyXG4gICAgKTtcclxuICAgIGxldCBicmVhZGNydW1iczogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGNvbW1vbkJyZWFkY3J1bWJzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY2xpZW50TmFtZSxcclxuICAgICAgICBwYXRoOiBcIi9tYW5hZ2Uvc3RvcmVzXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmNsaWVudE5hbWUsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3N0b3Jlc1wiLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogdHJ1ZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLnN0b3JlSWQsXHJcbiAgICAgICAgcGF0aDogYC9tYW5hZ2Uvc3RvcmVzL2NhbWVyYXM/c3RvcmVJZD0ke3RoaXMuc3RvcmVJZH1gLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5zdG9yZUlkLFxyXG4gICAgICAgIHBhdGg6IGAvbWFuYWdlL3N0b3Jlcy9jYW1lcmFzP3N0b3JlSWQ9JHt0aGlzLnN0b3JlSWR9YCxcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5ncy51c2VyQWNjZXNzLnZhbHVlPy51c2VyVHlwZSA9PT0gXCJ0YW5nb1wiKSB7XHJcbiAgICAgIGJyZWFkY3J1bWJzID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIk1hbmFnZVwiLFxyXG4gICAgICAgICAgcGF0aDogXCIvbWFuYWdlL2JyYW5kc1wiLFxyXG4gICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6IFwiTWFuYWdlXCIsXHJcbiAgICAgICAgICBwYXRoOiBcIi9tYW5hZ2UvYnJhbmRzXCIsXHJcbiAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc1NlcGFyYXRvcjogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC4uLmNvbW1vbkJyZWFkY3J1bWJzLFxyXG4gICAgICBdO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlID09PSBcImNsaWVudFwiKSB7XHJcbiAgICAgIGJyZWFkY3J1bWJzID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIk1hbmFnZVwiLFxyXG4gICAgICAgICAgcGF0aDogXCIvbWFuYWdlL3N1bW1hcnlcIixcclxuICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIk1hbmFnZVwiLFxyXG4gICAgICAgICAgcGF0aDogXCIvbWFuYWdlL3N1bW1hcnlcIixcclxuICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgIGlzU2VwYXJhdG9yOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uY29tbW9uQnJlYWRjcnVtYnMsXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoYnJlYWRjcnVtYnMpO1xyXG4gIH1cclxuLy8gU3RvcmUgbmFtZSBmb3IgdGhlIGNhcmQgYWJvdmUgdGhlIHRhYnMuIFRoZSBoZWFkZXIgZmlsdGVyIGRvZXNuJ3QgY2FycnkgaXQgb25cclxuLy8gdGhpcyBwYWdlLCBzbyBpdCBjb21lcyBmcm9tIGdldC1zdG9yZS4gJy0tJyB3aGlsZSBsb2FkaW5nIG9yIG9uIGZhaWx1cmUuXHJcbnByaXZhdGUgc3RvcmVOYW1lRnJvbUFwaSA9ICcnO1xyXG5nZXQgc3RvcmVOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnN0b3JlTmFtZUZyb21BcGkgfHwgJy0tJzsgfVxyXG4vLyBPcGVuIC8gY2xvc2UgdGltZSBmcm9tIHRoZSBzdG9yZSBwcm9maWxlLCBhcyB0aGUgc3RvcmUgaGVhZGVyIHNob3dzIHRoZW0uXHJcbnN0b3JlT3BlbiA9ICcnO1xyXG5zdG9yZUNsb3NlID0gJyc7XHJcblxyXG4vLyBUaGUgY2FyZCByZWxvYWRzIG9uIGV2ZXJ5IGhlYWRlciBBcHBseS4gV2hpbGUgYSBsb2FkIHJ1bnMgaXRzIHBhcnQgb2YgdGhlXHJcbi8vIGNhcmQgc2hpbW1lcnM7IGVhY2ggbG9hZCBpcyBudW1iZXJlZCBzbyBvbmx5IHRoZSBsYXRlc3QgcmVwbHkgaXMgYXBwbGllZCAtXHJcbi8vIGFuIG9sZGVyLCBzbG93ZXIgb25lIGNhbiBuZXZlciBvdmVyd3JpdGUgaXQuXHJcbnN0b3JlTG9hZGluZyA9IGZhbHNlO1xyXG5saXZlTG9hZGluZyA9IGZhbHNlO1xyXG5wcml2YXRlIHN0b3JlUmVxID0gMDtcclxucHJpdmF0ZSBsaXZlUmVxID0gMDtcclxuXHJcbnByaXZhdGUgbG9hZFN0b3JlTmFtZShzdG9yZUlkOiBhbnkpOiB2b2lkIHtcclxuICBjb25zdCByZXEgPSArK3RoaXMuc3RvcmVSZXE7XHJcbiAgdGhpcy5zdG9yZU5hbWVGcm9tQXBpID0gJyc7XHJcbiAgdGhpcy5zdG9yZU9wZW4gPSAnJztcclxuICB0aGlzLnN0b3JlQ2xvc2UgPSAnJztcclxuICBpZiAoIXN0b3JlSWQpIHsgdGhpcy5zdG9yZUxvYWRpbmcgPSBmYWxzZTsgcmV0dXJuOyB9XHJcbiAgdGhpcy5zdG9yZUxvYWRpbmcgPSB0cnVlO1xyXG4gIHRoaXMudGlja2V0c1NlcnZpY2UuZ2V0U3RvcmVEZXRhaWxzKHN0b3JlSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVxICE9PSB0aGlzLnN0b3JlUmVxKSByZXR1cm47XHJcbiAgICAgIHRoaXMuc3RvcmVOYW1lRnJvbUFwaSA9IHJlcz8uZGF0YT8uc3RvcmVOYW1lIHx8ICcnO1xyXG4gICAgICB0aGlzLnN0b3JlT3BlbiA9IHJlcz8uZGF0YT8uc3RvcmVQcm9maWxlPy5vcGVuIHx8ICcnO1xyXG4gICAgICB0aGlzLnN0b3JlQ2xvc2UgPSByZXM/LmRhdGE/LnN0b3JlUHJvZmlsZT8uY2xvc2UgfHwgJyc7XHJcbiAgICAgIHRoaXMuc3RvcmVMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6ICgpID0+IHsgaWYgKHJlcSA9PT0gdGhpcy5zdG9yZVJlcSkgdGhpcy5zdG9yZUxvYWRpbmcgPSBmYWxzZTsgfSxcclxuICB9KTtcclxufVxyXG5cclxuLy8gVGhlIHN0b3JlLWNhcmQgYnV0dG9ucyAoVGVybWluYWwgYWNjZXNzLCBGaWxlIGFjY2VzcywgQ2FsbCkgYXJlIGZvciBUYW5nbyB1c2VycyBvbmx5LlxyXG5nZXQgaXNUYW5nbygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZ3MudXNlckFjY2Vzcy52YWx1ZT8udXNlclR5cGUgPT09ICd0YW5nbyc7IH1cclxuXHJcbi8vIC4uLmFuZCBvbmx5IGZvciBJbmZyYSBWMiBjbGllbnRzLiBTYW1lIGNhbGwgYW5kIGZpZWxkIHRoZSBUaWNrZXRzIHBhZ2UgdXNlcyBmb3JcclxuLy8gaXRzIEluZnJhIFYyIHRhYi4gSGlkZGVuIHdoaWxlIGxvYWRpbmcgb3Igb24gZXJyb3IuXHJcbmluZnJhVGlja2V0VHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbmNsaWVudERpc3BsYXlOYW1lID0gJyc7XHJcbmdldCBzaG93U3RvcmVBY3Rpb25zKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5pc1RhbmdvICYmIHRoaXMuaW5mcmFUaWNrZXRUeXBlID09PSAnVjInOyB9XHJcblxyXG5wcml2YXRlIGxvYWRDbGllbnQoaGVhZGVyOiBhbnkpOiB2b2lkIHtcclxuICB0aGlzLmluZnJhVGlja2V0VHlwZSA9IG51bGw7XHJcbiAgdGhpcy5jbGllbnREaXNwbGF5TmFtZSA9ICcnO1xyXG4gIGNvbnN0IGNsaWVudElkID0gaGVhZGVyPy5jbGllbnQgfHwgU3RyaW5nKHRoaXMuc3RvcmVJZCB8fCAnJykuc3BsaXQoJy0nKVswXTtcclxuICBpZiAoIWNsaWVudElkKSByZXR1cm47XHJcbiAgdGhpcy5hdXRoU2VydmljZS5nZXRCcmFuZERldGFpbHMoY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmluZnJhVGlja2V0VHlwZSA9IHJlcz8uZGF0YT8udGlja2V0Q29uZmlncz8uaW5mcmFUaWNrZXRUeXBlID8/IG51bGw7XHJcbiAgICAgIHRoaXMuY2xpZW50RGlzcGxheU5hbWUgPSByZXM/LmRhdGE/LmNsaWVudE5hbWUgfHwgJyc7XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6ICgpID0+IHt9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vLyBMaXZlIC8gTm90IExpdmUgYmVzaWRlIHRoZSBuYW1lLCBhcyBvZiBOT1cgLSBub3QgdGhlIGhlYWRlcidzIGRhdGUgcmFuZ2U6XHJcbi8vIE5vdCBMaXZlIHdoaWxlIHRoZSBzdG9yZSBoYXMgYW55IHRpY2tldCB0aGF0IGlzIG9wZW4gb3IgaW5wcm9ncmVzcywgTGl2ZSB3aGVuXHJcbi8vIGFsbCBpdHMgdGlja2V0cyBhcmUgY2xvc2VkIG9yIGl0IGhhcyBub25lLiBUaGUgQVBJIGNvdW50cyBhIHRpY2tldCB0aGF0IGlzIG5vdFxyXG4vLyBjbG9zZWQgYW5kIHdhcyByYWlzZWQgYnkgdGhlIGVuZCBvZiB0b0RhdGUsIHNvIHNlbmRpbmcgdG9kYXkncyBkYXRlIG1ha2VzIGl0XHJcbi8vIGNvdW50IGV2ZXJ5IHRpY2tldCByYWlzZWQgdXAgdG8gbm93LCBpbiBpdHMgY3VycmVudCBzdGF0dXMuXHJcbi8vIEVtcHR5IC0gYW5kIGhpZGRlbiAtIGZvciBhIG5vbi1WMiBjbGllbnQsIG9yIGZvciBhIHN0b3JlIFYyIGRvZXMgbm90IGNvdW50XHJcbi8vIChpbmFjdGl2ZSwgb3Igbm8gZmlyc3QgZmlsZSB5ZXQpLlxyXG5saXZlU3RhdHVzOiAnJyB8ICdMaXZlJyB8ICdOb3QgTGl2ZScgPSAnJztcclxuXHJcbnByaXZhdGUgbG9hZExpdmVTdGF0dXMoc3RvcmVJZDogYW55LCBoZWFkZXI6IGFueSk6IHZvaWQge1xyXG4gIGNvbnN0IHJlcSA9ICsrdGhpcy5saXZlUmVxO1xyXG4gIHRoaXMubGl2ZVN0YXR1cyA9ICcnO1xyXG4gIGNvbnN0IGNsaWVudElkID0gaGVhZGVyPy5jbGllbnQgfHwgU3RyaW5nKHN0b3JlSWQgfHwgJycpLnNwbGl0KCctJylbMF07XHJcbiAgaWYgKCFzdG9yZUlkIHx8ICFjbGllbnRJZCkgeyB0aGlzLmxpdmVMb2FkaW5nID0gZmFsc2U7IHJldHVybjsgfVxyXG4gIC8vIFRvZGF5J3MgZGF0ZSBpbiB0aGUgdmlld2VyJ3MgbG9jYWwgdGltZSwgYXMgWVlZWS1NTS1ERC5cclxuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1DQScpO1xyXG4gIGNvbnN0IGJvZHkgPSB7XHJcbiAgICBjbGllbnRJZDogW2NsaWVudElkXSwgZnJvbURhdGU6IHRvZGF5LCB0b0RhdGU6IHRvZGF5LFxyXG4gICAgc2VhcmNoOiBzdG9yZUlkLCBvZmZzZXQ6IDEsIGxpbWl0OiA1MCxcclxuICB9O1xyXG4gIHRoaXMubGl2ZUxvYWRpbmcgPSB0cnVlO1xyXG4gIHRoaXMudGlja2V0c1NlcnZpY2Uuc3RvcmVMaXZlU3RhdHVzKGJvZHkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVxICE9PSB0aGlzLmxpdmVSZXEpIHJldHVybjtcclxuICAgICAgLy8gc2VhcmNoIGlzIGEgcGFydGlhbCBtYXRjaCAoNDA2LTEgYWxzbyBmaW5kcyA0MDYtMTApLCBzbyBwaWNrIHRoZSBleGFjdCBzdG9yZS5cclxuICAgICAgY29uc3Qgcm93ID0gKHJlcz8uZGF0YT8ucm93cyA/PyBbXSkuZmluZCgocjogYW55KSA9PiByLnN0b3JlSWQgPT09IHN0b3JlSWQpO1xyXG4gICAgICB0aGlzLmxpdmVTdGF0dXMgPSByb3c/LnN0YXR1cyA9PT0gJ0xpdmUnIHx8IHJvdz8uc3RhdHVzID09PSAnTm90IExpdmUnID8gcm93LnN0YXR1cyA6ICcnO1xyXG4gICAgICB0aGlzLmxpdmVMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6ICgpID0+IHsgaWYgKHJlcSA9PT0gdGhpcy5saXZlUmVxKSB0aGlzLmxpdmVMb2FkaW5nID0gZmFsc2U7IH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbnNlbGVjdGVkVGFicyh2YWx1ZTphbnkpe1xyXG4gIHRoaXMuc2VsZWN0ZWRUYWIgPSB2YWx1ZTtcclxuICBpZih0aGlzLnNlbGVjdGVkVGFiID09PSdpbmZyYScpe1xyXG4gICAgdGhpcy5zZWxlY3RlZFRhYjEgPSd0aWNrZXRzJ1xyXG4gIH1cclxuICBjb25zdCBxdWVyeVBhcmFtcyA9IHsgLi4udGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyB9O1xyXG4gICAgICBxdWVyeVBhcmFtc1sndHlwZSddID0gdmFsdWU7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7IHJlbGF0aXZlVG86dGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zfSk7XHJcbn1cclxuXHJcbnNlbGVjdGVkVGFiczEodHlwZTphbnkpe1xyXG4gIHRoaXMuc2VsZWN0ZWRUYWIxID0gdHlwZTtcclxuICAvLyBLZWVwIHRoZSBVUkwgaW4gc3RlcCwgdGhlIHNhbWUgd2F5IHNlbGVjdGVkVGFicygpIGRvZXMgZm9yIHRoZSB0b3AgdGFicy5cclxuICAvLyBTdW1tYXJ5IGhhcyBubyBgdHlwZWAgb2YgaXRzIG93biwgc28gaXQgc2hhcmVzICdpbmZyYScgd2l0aCBUaWNrZXRzIFYxLlxyXG4gIGNvbnN0IHF1ZXJ5UGFyYW1zID0geyAuLi50aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zIH07XHJcbiAgICAgIHF1ZXJ5UGFyYW1zWyd0eXBlJ10gPSB0eXBlID09PSAndGlja2V0c1YyJyA/ICdpbmZyYXYyJyA6ICdpbmZyYSc7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7IHJlbGF0aXZlVG86dGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zfSk7XHJcbn1cclxuXHJcbi8vIFRlcm1pbmFsIGFjY2VzcyBwb3AtdXA6IG9wZW5zIGF0IG9uY2UsIHRoZW4gZmlsbHMgZnJvbSAvcmVtb3RlL3Nlc3Npb24uXHJcbi8vIEV2ZXJ5IGNhbGwgaXMgYXVkaXQtbG9nZ2VkIGFzIGEgc2Vzc2lvbiBvcGVuZWQsIENhbmNlbCBpbmNsdWRlZC5cclxuc2Vzc2lvbjogYW55ID0gbnVsbDtcclxuc2Vzc2lvblN0YXRlOiAnbG9hZGluZycgfCAncmVhZHknIHwgJ2Vycm9yJyA9ICdsb2FkaW5nJztcclxuc2Vzc2lvbkVycm9yID0gJyc7XHJcblxyXG5vcGVuVGVybWluYWwodHBsOiBUZW1wbGF0ZVJlZjxhbnk+KTogdm9pZCB7XHJcbiAgdGhpcy5zZXNzaW9uID0gbnVsbDtcclxuICB0aGlzLnNlc3Npb25FcnJvciA9ICcnO1xyXG4gIHRoaXMuc2Vzc2lvblN0YXRlID0gJ2xvYWRpbmcnO1xyXG4gIHRoaXMubW9kYWwub3Blbih0cGwsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgdGhpcy50aWNrZXRzU2VydmljZS5yZW1vdGVTZXNzaW9uKHRoaXMuc3RvcmVJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXRhY2gpKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogKHJlczogYW55KSA9PiB7IHRoaXMuc2Vzc2lvbiA9IHJlcz8uZGF0YSA/PyBudWxsOyB0aGlzLnNlc3Npb25TdGF0ZSA9ICdyZWFkeSc7IH0sXHJcbiAgICAvLyBUaGUgQVBJJ3Mgb3duIG1lc3NhZ2U6IFwiU3RvcmUgbm90IGZvdW5kXCIsIFwiTm8gZWRnZSBhZ2VudC4uLlwiLCBcIm5vdCBjb25maWd1cmVkXCIuXHJcbiAgICBlcnJvcjogKGVycjogYW55KSA9PiB7IHRoaXMuc2Vzc2lvbkVycm9yID0gZXJyPy5lcnJvcj8uZXJyb3IgfHwgJyc7IHRoaXMuc2Vzc2lvblN0YXRlID0gJ2Vycm9yJzsgfSxcclxuICB9KTtcclxufVxyXG5cclxuLy8gQ29ubmVjdDogc3dhcCB0aGUgY29uZmlybWF0aW9uIGZvciB0aGUgdGVybWluYWwgcG9wLXVwLiBTdGF0aWMgYmFja2Ryb3AgYW5kXHJcbi8vIG5vIEVzYywgc28gYSBzdHJheSBjbGljayBjYW5ub3QgZHJvcCBhIGxpdmUgc2hlbGw7IGl0IGNsb3NlcyB2aWEgQ2xvc2UuXHJcbmNvbm5lY3QoY29uZmlybVJlZjogYW55KTogdm9pZCB7XHJcbiAgY29uZmlybVJlZi5jbG9zZSgpO1xyXG4gIGNvbnN0IHJlZiA9IHRoaXMubW9kYWwub3BlbihSZW1vdGVUZXJtaW5hbENvbXBvbmVudCwge1xyXG4gICAgc2l6ZTogJ3hsJywgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJywga2V5Ym9hcmQ6IGZhbHNlLCBtb2RhbERpYWxvZ0NsYXNzOiAncmVtb3RlLXRlcm1pbmFsLW1vZGFsJyxcclxuICB9KTtcclxuICByZWYuY29tcG9uZW50SW5zdGFuY2Uuc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbjtcclxufVxyXG5cclxuLy8gQ2FsbDogYSBjb25maXJtYXRpb24gZmlyc3Q7IG5vdGhpbmcgaXMgcmVxdWVzdGVkIHVudGlsIENhbGwgaXMgcHJlc3NlZC5cclxub3BlbkNhbGwodHBsOiBUZW1wbGF0ZVJlZjxhbnk+KTogdm9pZCB7XHJcbiAgdGhpcy5tb2RhbC5vcGVuKHRwbCwgeyBjZW50ZXJlZDogdHJ1ZSB9KTtcclxufVxyXG5cclxuLy8gQ2FsbCBwcmVzc2VkOiBzd2FwIHRoZSBjb25maXJtYXRpb24gZm9yIHRoZSBjYWxsIHBvcC11cCwgd2hpY2ggc3RhcnRzIHRoZVxyXG4vLyBjYWxsLiBTdGF0aWMgYmFja2Ryb3AgYW5kIG5vIEVzYywgc28gYSBzdHJheSBjbGljayBjYW5ub3QgZHJvcCB0aGUgY2FsbC5cclxuc3RhcnRDYWxsKGNvbmZpcm1SZWY6IGFueSk6IHZvaWQge1xyXG4gIGNvbmZpcm1SZWYuY2xvc2UoKTtcclxuICBjb25zdCByZWYgPSB0aGlzLm1vZGFsLm9wZW4oU3RvcmVDYWxsQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlLCBiYWNrZHJvcDogJ3N0YXRpYycsIGtleWJvYXJkOiBmYWxzZSB9KTtcclxuICByZWYuY29tcG9uZW50SW5zdGFuY2Uuc3RvcmVJZCA9IFN0cmluZyh0aGlzLnN0b3JlSWQgfHwgJycpO1xyXG4gIHJlZi5jb21wb25lbnRJbnN0YW5jZS5zdG9yZU5hbWUgPSB0aGlzLnN0b3JlTmFtZUZyb21BcGk7XHJcbn1cclxuXHJcbn1cclxuIiwiPCEtLSBTdG9yZSBjYXJkOiBuYW1lIGFuZCB0aW1pbmdzIGZyb20gZ2V0LXN0b3JlLCBMaXZlIHN0YXR1cyBmcm9tIHRoZSBWMiBzdG9yZSBsaXN0LiAtLT5cclxuPGRpdiBjbGFzcz1cImNhcmQgbWItNSBweS00IHB4LTVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+PHN2ZyB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgZmlsbD1cIiNEMUZBREZcIi8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgc3Ryb2tlPVwiI0VDRkRGM1wiIHN0cm9rZS13aWR0aD1cIjZcIi8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNjc5OSAxOC44MDM5TDE1LjYyNjcgMTguODg3MUMxNS4wNjg2IDE5Ljg3NDEgMTUuNjY0NCAyMS4xMjE1IDE2LjczNjEgMjEuMjY0NkMxNi44MzMxIDIxLjI3NjUgMTYuOTIzNSAyMS4yODI4IDE3LjAxMTggMjEuMjgyOEMxNy41ODk5IDIxLjI4MjggMTguMTAxMSAyMS4wMzQ4IDE4LjQ1NzQgMjAuNjQ4TDE5LjAxMDcgMjAuMDQ3NEwxOS41NjIxIDIwLjY0OThDMTkuOTE0MSAyMS4wMzQyIDIwLjQyNDEgMjEuMjgyOCAyMS4wMDYxIDIxLjI4MjhDMjEuNTg1NiAyMS4yODI4IDIyLjA5ODUgMjEuMDMzOCAyMi40NTAyIDIwLjY0OThMMjMuMDAzMyAyMC4wNDU1TDIzLjU1NjUgMjAuNjQ5OEMyMy45MDgxIDIxLjAzMzggMjQuNDIxMSAyMS4yODI4IDI1LjAwMDUgMjEuMjgyOEMyNS41OCAyMS4yODI4IDI2LjA5MjkgMjEuMDMzOCAyNi40NDQ1IDIwLjY0OThMMjYuOTk3NyAyMC4wNDU1TDI3LjU1MDkgMjAuNjQ5OEMyNy45MDI1IDIxLjAzMzggMjguNDE1NSAyMS4yODI4IDI4Ljk5NDkgMjEuMjgyOEMyOS4wODAzIDIxLjI4MjggMjkuMTczMyAyMS4yNzY1IDI5LjI2OTcgMjEuMjY0N0MzMC4zNjQ5IDIxLjExNTQgMzAuOTYyNyAxOS44MDEyIDMwLjMyNCAxOC44MDQ0QzMwLjMyNCAxOC44MDQzIDMwLjMyNCAxOC44MDQzIDMwLjMyMzkgMTguODA0MkwyOC41NjU4IDE2LjA2MjhMMjguNTY1OCAxNi4wNjI4TDI4LjU2NDggMTYuMDYxNEMyOC41NDk2IDE2LjAzNzUgMjguNTEyMSAxNi4wMTIgMjguNDY1IDE2LjAxMkgxNy41MzU2QzE3LjQ4ODQgMTYuMDEyIDE3LjQ1MDkgMTYuMDM3NSAxNy40MzU3IDE2LjA2MTRMMTcuNDM1MSAxNi4wNjIzTDE1LjY3OTkgMTguODAzOVpNMjguNjUxNCAyMy43MzcyVjI2Ljg2OTFWMjcuNjE5MUgyNy45MDE0SDE4LjA5OTJIMTcuMzQ5MlYyNi44NjkxVjIzLjczNzZDMTcuMjM5IDIzLjc0NTggMTcuMTI3NCAyMy43NTAxIDE3LjAxNDggMjMuNzUwMUMxNi45NzI1IDIzLjc1MDEgMTYuOTMwNSAyMy43NDk0IDE2Ljg4ODggMjMuNzQ4MlYyNi44NjkxVjI4LjgwMzZDMTYuODg4OCAyOS40NDcxIDE3LjQyMjcgMjkuOTg4MiAxOC4wOTkyIDI5Ljk4ODJIMjcuOTAxNEMyOC41Nzc5IDI5Ljk4ODIgMjkuMTExOCAyOS40NDcxIDI5LjExMTggMjguODAzNlYyNi44NjkxVjIzLjc0ODRDMjkuMDcyIDIzLjc0OTUgMjkuMDMyIDIzLjc1MDEgMjguOTkxOCAyMy43NTAxQzI4Ljg3NzQgMjMuNzUwMSAyOC43NjM5IDIzLjc0NTcgMjguNjUxNCAyMy43MzcyWlwiIHN0cm9rZT1cIiMwMjdBNDhcIiBzdHJva2Utd2lkdGg9XCIxLjVcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gUmVsb2FkcyBvbiBldmVyeSBBcHBseTsgZWFjaCBwYXJ0IHNoaW1tZXJzIHdoaWxlIGl0cyBvd24gY2FsbCBydW5zLiAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3RvcmVMb2FkaW5nXCIgY2xhc3M9XCJza2VsIHNrZWwtbmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXN0b3JlTG9hZGluZ1wiIGNsYXNzPVwic3RvcmUtY2FyZC1uYW1lXCI+e3sgc3RvcmVOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsaXZlTG9hZGluZ1wiIGNsYXNzPVwic2tlbCBza2VsLXBpbGwgbXMtNFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxpdmVMb2FkaW5nICYmIGxpdmVTdGF0dXNcIiBjbGFzcz1cImxpdmUtc3RhdHVzIG1zLTRcIiBbY2xhc3MuZG93bl09XCJsaXZlU3RhdHVzID09PSAnTm90IExpdmUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaXZlLWRvdFwiPjwvc3Bhbj57eyBsaXZlU3RhdHVzIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3RvcmVMb2FkaW5nXCIgY2xhc3M9XCJtdC0xXCI+PHNwYW4gY2xhc3M9XCJza2VsIHNrZWwtbWV0YVwiPjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzdG9yZUxvYWRpbmdcIiBjbGFzcz1cInN0b3JlLWNhcmQtbWV0YSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0b3JlSWQgfHwgJy0tJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMlwiPsK3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1lLTFcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDQuNVY5TDEyIDEwLjVNMTYuNSA5QzE2LjUgMTMuMTQyMSAxMy4xNDIxIDE2LjUgOSAxNi41QzQuODU3ODYgMTYuNSAxLjUgMTMuMTQyMSAxLjUgOUMxLjUgNC44NTc4NiA0Ljg1Nzg2IDEuNSA5IDEuNUMxMy4xNDIxIDEuNSAxNi41IDQuODU3ODYgMTYuNSA5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdG9yZU9wZW4gfHwgJy0tJyB9fSAtIHt7IHN0b3JlQ2xvc2UgfHwgJy0tJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBUYW5nbyB1c2VycyBvZiBJbmZyYSBWMiBjbGllbnRzIG9ubHkuIFRoZSBob3ZlcmVkIGJ1dHRvbiBleHBhbmRzOyBUZXJtaW5hbCBhY2Nlc3MgaXMgZXhwYW5kZWQgd2hpbGUgbm9uZSBpcy4gLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTdG9yZUFjdGlvbnNcIiBjbGFzcz1cInN0b3JlLWFjdGlvbnMgbXMtYXV0byBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic3RvcmUtYWN0IGlzLWRlZmF1bHRcIiAoY2xpY2spPVwib3BlblRlcm1pbmFsKHRlcm1pbmFsVHBsKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIzLjVcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTNcIiByeD1cIjJcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDIxSDE2TTEyIDE2LjVWMjFNNi41IDhMOSAxMEw2LjUgMTJNMTEgMTJIMTRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz48c3BhbiBjbGFzcz1cImFjdC1sYWJlbFwiPlRlcm1pbmFsIGFjY2Vzczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic3RvcmUtYWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNy41QzMgNi40IDMuOSA1LjUgNSA1LjVIOS4yTDExLjIgNy41SDE5QzIwLjEgNy41IDIxIDguNCAyMSA5LjVWMTdDMjEgMTguMSAyMC4xIDE5IDE5IDE5SDVDMy45IDE5IDMgMTguMSAzIDE3VjcuNVpcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjxzcGFuIGNsYXNzPVwiYWN0LWxhYmVsXCI+RmlsZSBhY2Nlc3M8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInN0b3JlLWFjdFwiIChjbGljayk9XCJvcGVuQ2FsbChjYWxsQ29uZmlybVRwbClcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC42IDQuNUw2LjQgMy42QzUuOCAzLjQgNS4xIDMuNiA0LjcgNC4xTDMuNSA1LjZDMy4xIDYuMSAzIDYuOCAzLjIgNy40QzQuOSAxMi43IDkuMyAxNy4xIDE0LjYgMTguOEMxNS4yIDE5IDE1LjkgMTguOSAxNi40IDE4LjVMMTcuOSAxNy4zQzE4LjQgMTYuOSAxOC42IDE2LjIgMTguNCAxNS42TDE3LjUgMTMuNEMxNy4zIDEyLjggMTYuNiAxMi41IDE2IDEyLjZMMTMuNiAxMy4xQzExLjkgMTIuMiAxMC44IDExLjEgOS45IDkuNEwxMC40IDdDMTAuNSA2LjQgMTAuMiA1LjcgOS42IDUuNUw4LjYgNC41WlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+PHNwYW4gY2xhc3M9XCJhY3QtbGFiZWxcIj5DYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImNhcmQgbWItNSBweS0zIHB4LTVcIj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFiczEgbmF2LWxpbmUtdGFicyBib3JkZXItdHJhbnNwYXJlbnQgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0ZWRUYWJzKCdpbmZyYScpXCI+PGEgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09J2luZnJhJyA/ICdhY3RpdmUnIDonJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgbWUtNiBcIj5JbmZyYTwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0ZWRUYWJzKCdkYXRhTWlzbWF0Y2gnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09J2RhdGFNaXNtYXRjaCcgPyAnYWN0aXZlJyA6JydcIiBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIG1lLTZcIj5EYXRhIE1pc21hdGNoPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIChjbGljayk9XCJzZWxlY3RlZFRhYnMoJ2NhbWVyYUFuZ2xlQ2hhbmdlJylcIj5cclxuICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSdjYW1lcmFBbmdsZUNoYW5nZScgPyAnYWN0aXZlJyA6JydcIiBjbGFzcz1cIm5hdi1saW5rIGN1cnNvci1wb2ludGVyIG1lLTZcIj5DYW1lcmEgQW5nbGU8L2E+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwhLS0gRmlsZSBsb2dzLCBhdCB0aGUgcmlnaHQgZW5kIG9mIHRoZSByb3c6IGl0cyBvd24gcGFnZSBhdCA/dHlwZT1maWxlTG9ncy4gVGFuZ28gb25seS4gLS0+XHJcbiAgICAgICAgICAgIDxsaSAqbmdJZj1cImlzVGFuZ29cIiBjbGFzcz1cIm5hdi1pdGVtIG1zLWF1dG9cIiAoY2xpY2spPVwic2VsZWN0ZWRUYWJzKCdmaWxlTG9ncycpXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0nZmlsZUxvZ3MnID8gJ2FjdGl2ZScgOicnXCIgY2xhc3M9XCJuYXYtbGluayBjdXJzb3ItcG9pbnRlciBmaWxlLWxvZ3MtbGlua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDNIN0M1LjkgMyA1IDMuOSA1IDVWMTlDNSAyMC4xIDUuOSAyMSA3IDIxSDE3QzE4LjEgMjEgMTkgMjAuMSAxOSAxOVY4TDE0IDNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQgM1Y4SDE5TTkgMTNIMTVNOSAxN0gxM1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBGaWxlIGxvZ3NcclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICAgICA8IS0tIDxsaSAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJyB8fCBjbGllbnREYXRhPy5pc1ZNU1wiIGNsYXNzPVwibmF2LWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0ZWRUYWJzKCdmb290ZmFsbCcpXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0nZm9vdGZhbGwnID8gJ2FjdGl2ZScgOicnXCIgY2xhc3M9XCJuYXYtbGluayBjdXJzb3ItcG9pbnRlciBtZS02XCI+Rm9vdGZhbGwgRGlyZWN0b3J5PC9hPlxyXG4gICAgICAgICAgICA8L2xpPiAtLT5cclxuICAgICAgICA8L3VsPlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSdpbmZyYSdcIiBjbGFzcz1cIm1iLTUgcHktMyBweC01XCI+XHJcbiAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFiczEgbmF2LWxpbmUtdGFicyBib3JkZXItdHJhbnNwYXJlbnQgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbTFcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWJzMSgnc3VtbWFyeScpXCI+PGEgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIxID09PSdzdW1tYXJ5JyA/ICdhY3RpdmUnIDonJ1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIG5hdi1saW5rMSBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgbWUtNiBcIj5TdW1tYXJ5PC9hPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gbmF2LWl0ZW0xXCIgKGNsaWNrKT1cInNlbGVjdGVkVGFiczEoJ3RpY2tldHMnKVwiPlxyXG4gICAgICAgICAgICA8YSBbbmdDbGFzc109XCJzZWxlY3RlZFRhYjEgPT09J3RpY2tldHMnID8gJ2FjdGl2ZScgOicnXCIgY2xhc3M9XCJuYXYtbGluayBuYXYtbGluazEgY3Vyc29yLXBvaW50ZXIgbWUtNlwiPlRpY2tldHMgVjE8L2E+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbTFcIiAoY2xpY2spPVwic2VsZWN0ZWRUYWJzMSgndGlja2V0c1YyJylcIj5cclxuICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIxID09PSd0aWNrZXRzVjInID8gJ2FjdGl2ZScgOicnXCIgY2xhc3M9XCJuYXYtbGluayBuYXYtbGluazEgY3Vyc29yLXBvaW50ZXIgbWUtNlwiPlRpY2tldHMgVjI8L2E+XHJcbiAgICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbjwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09J2luZnJhJyAmJiBzZWxlY3RlZFRhYjEgPT09J3N1bW1hcnknXCI+XHJcbiAgICA8bGliLXN1bW1hcnktaW5mcmEgW3NlbGVjdGVkVGFiXT1cInNlbGVjdGVkVGFiXCI+PC9saWItc3VtbWFyeS1pbmZyYT5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0naW5mcmEnICYmIHNlbGVjdGVkVGFiMSA9PT0ndGlja2V0cydcIj5cclxuICAgIDxsaWItdGlja2V0LWluZnJhIFtzZWxlY3RlZFRhYl09XCJzZWxlY3RlZFRhYlwiPjwvbGliLXRpY2tldC1pbmZyYT5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0naW5mcmEnICYmIHNlbGVjdGVkVGFiMSA9PT0ndGlja2V0c1YyJ1wiPlxyXG4gICAgPGxpYi10aWNrZXQtaW5mcmEtdjIgW3NlbGVjdGVkVGFiXT1cInNlbGVjdGVkVGFiXCI+PC9saWItdGlja2V0LWluZnJhLXYyPlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSdkYXRhTWlzbWF0Y2gnXCI+XHJcbiAgICA8bGliLXRpY2tldC1pbmZyYSBbc2VsZWN0ZWRUYWJdPVwic2VsZWN0ZWRUYWJcIj48L2xpYi10aWNrZXQtaW5mcmE+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSdjYW1lcmFBbmdsZUNoYW5nZSdcIj5cclxuICAgIDxsaWItdGlja2V0LWNhbWVyYS1hbmdsZSBbc2VsZWN0ZWRUYWJdPVwic2VsZWN0ZWRUYWJcIj48L2xpYi10aWNrZXQtY2FtZXJhLWFuZ2xlPlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSdmb290ZmFsbCdcIj5cclxuICAgIDxsaWItZm9vdGZhbGwtZGlyZWN0b3J5IFtzZWxlY3RlZFRhYl09XCJzZWxlY3RlZFRhYlwiPjwvbGliLWZvb3RmYWxsLWRpcmVjdG9yeT5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0nZmlsZUxvZ3MnICYmIGlzVGFuZ29cIj5cclxuICAgIDxsaWItZmlsZS1sb2dzIFtzdG9yZUlkXT1cInN0b3JlSWRcIiBbY2xpZW50SWRdPVwiaGVhZGVyRmlsdGVycz8uY2xpZW50XCIgW2RhdGVdPVwiaGVhZGVyRmlsdGVycz8uZGF0ZT8uZW5kRGF0ZVwiPjwvbGliLWZpbGUtbG9ncz5cclxuPC9kaXY+XHJcbjxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cclxuXHJcbjwhLS0gVGVybWluYWwgYWNjZXNzIGNvbmZpcm1hdGlvbi4gRmlsbGVkIGZyb20gL2luZnJhL3YyL3JlbW90ZS9zZXNzaW9uOyBDbGllbnQgbmFtZSBmcm9tIHRoZSBjbGllbnQgcmVjb3JkLiAtLT5cclxuPG5nLXRlbXBsYXRlICN0ZXJtaW5hbFRwbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLW1vZGFsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1oZWFkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWNjZXNzLWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMy41XCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjEzXCIgcng9XCIyXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCAyMUgxNk0xMiAxNi41VjIxTTYuNSA4TDkgMTBMNi41IDEyTTExIDEySDE0XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtdGl0bGUgZnMtNCB0ZXh0LWdyYXktODAwIGZ3LWJvbGRcIj5PcGVuIHRlcm1pbmFsIGFjY2Vzcz88L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYWNjZXNzLXRleHRcIj5UaGlzIG9wZW5zIGEgY29tbWFuZCB3aW5kb3cgb24gdGhlIHN0b3JlIHN5c3RlbS4gQ29tbWFuZHMgcnVuIG9uIHRoZSBsaXZlIHN5c3RlbS48L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIExvYWRpbmc6IHNoaW1tZXJpbmcgcGxhY2Vob2xkZXIgcm93cyAoc2VlIC5za2VsKS4gLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2Vzc2lvblN0YXRlID09PSAnbG9hZGluZydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLXJvd1wiPjxzcGFuIGNsYXNzPVwic2tlbCBza2VsLWxhYmVsXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwic2tlbCBza2VsLXZhbHVlXCI+PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3Mtcm93XCI+PHNwYW4gY2xhc3M9XCJza2VsIHNrZWwtbGFiZWxcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJza2VsIHNrZWwtdmFsdWVcIj48L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1yb3dcIj48c3BhbiBjbGFzcz1cInNrZWwgc2tlbC1sYWJlbFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInNrZWwgc2tlbC12YWx1ZVwiPjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlc3Npb25TdGF0ZSA9PT0gJ2Vycm9yJ1wiIGNsYXNzPVwiYWNjZXNzLW5vdGUgZXJyb3JcIj57eyBzZXNzaW9uRXJyb3IgfHwgXCJDb3VsZG4ndCBvcGVuIHRoZSBzZXNzaW9uLlwiIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2Vzc2lvblN0YXRlID09PSAncmVhZHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1yb3dcIj48c3BhbiBjbGFzcz1cImFjY2Vzcy1sYWJlbFwiPkNsaWVudCBuYW1lPC9zcGFuPjxzcGFuIGNsYXNzPVwiYWNjZXNzLXZhbHVlXCI+e3sgY2xpZW50RGlzcGxheU5hbWUgfHwgJy0tJyB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLXJvd1wiPjxzcGFuIGNsYXNzPVwiYWNjZXNzLWxhYmVsXCI+U3RvcmUgSUQ8L3NwYW4+PHNwYW4gY2xhc3M9XCJhY2Nlc3MtdmFsdWVcIj57eyBzZXNzaW9uPy5zdG9yZUlkIHx8ICctLScgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1yb3dcIj48c3BhbiBjbGFzcz1cImFjY2Vzcy1sYWJlbFwiPlN0b3JlIG5hbWU8L3NwYW4+PHNwYW4gY2xhc3M9XCJhY2Nlc3MtdmFsdWVcIj57eyBzZXNzaW9uPy5zdG9yZU5hbWUgfHwgJy0tJyB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLWZvb3RcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwibW9kYWwuY2xvc2UoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIFtkaXNhYmxlZF09XCJzZXNzaW9uU3RhdGUgIT09ICdyZWFkeSdcIiAoY2xpY2spPVwiY29ubmVjdChtb2RhbClcIj5Db25uZWN0PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gQ2FsbCBjb25maXJtYXRpb24uIE5vdGhpbmcgaXMgcmVxdWVzdGVkIGFuZCBub3RoaW5nIHJpbmdzIHVudGlsIENhbGwuIC0tPlxyXG48bmctdGVtcGxhdGUgI2NhbGxDb25maXJtVHBsIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtbW9kYWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLWhlYWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjYgNC41TDYuNCAzLjZDNS44IDMuNCA1LjEgMy42IDQuNyA0LjFMMy41IDUuNkMzLjEgNi4xIDMgNi44IDMuMiA3LjRDNC45IDEyLjcgOS4zIDE3LjEgMTQuNiAxOC44QzE1LjIgMTkgMTUuOSAxOC45IDE2LjQgMTguNUwxNy45IDE3LjNDMTguNCAxNi45IDE4LjYgMTYuMiAxOC40IDE1LjZMMTcuNSAxMy40QzE3LjMgMTIuOCAxNi42IDEyLjUgMTYgMTIuNkwxMy42IDEzLjFDMTEuOSAxMi4yIDEwLjggMTEuMSA5LjkgOS40TDEwLjQgN0MxMC41IDYuNCAxMC4yIDUuNyA5LjYgNS41TDguNiA0LjVaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFjY2Vzcy10aXRsZSBmcy00IHRleHQtZ3JheS04MDAgZnctYm9sZFwiPkNhbGwgdGhpcyBzdG9yZT88L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYWNjZXNzLXRleHRcIj5UaGUgc3RvcmUgbWFuYWdlcidzIFRyYXggYXBwIHdpbGwgcmluZy48L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXNzLXJvd1wiPjxzcGFuIGNsYXNzPVwiYWNjZXNzLWxhYmVsXCI+Q2xpZW50IG5hbWU8L3NwYW4+PHNwYW4gY2xhc3M9XCJhY2Nlc3MtdmFsdWVcIj57eyBjbGllbnREaXNwbGF5TmFtZSB8fCAnLS0nIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1yb3dcIj48c3BhbiBjbGFzcz1cImFjY2Vzcy1sYWJlbFwiPlN0b3JlIElEPC9zcGFuPjxzcGFuIGNsYXNzPVwiYWNjZXNzLXZhbHVlXCI+e3sgc3RvcmVJZCB8fCAnLS0nIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2Vzcy1yb3dcIj48c3BhbiBjbGFzcz1cImFjY2Vzcy1sYWJlbFwiPlN0b3JlIG5hbWU8L3NwYW4+PHNwYW4gY2xhc3M9XCJhY2Nlc3MtdmFsdWVcIj57eyBzdG9yZU5hbWUgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtZm9vdFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInN0YXJ0Q2FsbChtb2RhbClcIj5DYWxsPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=