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

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.
@@ -190,22 +190,34 @@ export class TangoStoreInfraComponent {
190
190
  // Open / close time from the store profile, as the store header shows them.
191
191
  storeOpen = '';
192
192
  storeClose = '';
193
+ // The card reloads on every header Apply. While a load runs its part of the
194
+ // card shimmers; each load is numbered so only the latest reply is applied -
195
+ // an older, slower one can never overwrite it.
196
+ storeLoading = false;
197
+ liveLoading = false;
198
+ storeReq = 0;
199
+ liveReq = 0;
193
200
  loadStoreName(storeId) {
201
+ const req = ++this.storeReq;
194
202
  this.storeNameFromApi = '';
195
203
  this.storeOpen = '';
196
204
  this.storeClose = '';
197
- if (!storeId)
205
+ if (!storeId) {
206
+ this.storeLoading = false;
198
207
  return;
208
+ }
209
+ this.storeLoading = true;
199
210
  this.ticketsService.getStoreDetails(storeId).pipe(takeUntil(this.detach)).subscribe({
200
211
  next: (res) => {
201
- // Ignore a late reply for a store that is no longer selected.
202
- if (storeId !== this.storeId)
212
+ if (req !== this.storeReq)
203
213
  return;
204
214
  this.storeNameFromApi = res?.data?.storeName || '';
205
215
  this.storeOpen = res?.data?.storeProfile?.open || '';
206
216
  this.storeClose = res?.data?.storeProfile?.close || '';
217
+ this.storeLoading = false;
207
218
  },
208
- error: () => { },
219
+ error: () => { if (req === this.storeReq)
220
+ this.storeLoading = false; },
209
221
  });
210
222
  }
211
223
  // The store-card buttons (Terminal access, File access, Call) are for Tango users only.
@@ -229,28 +241,40 @@ export class TangoStoreInfraComponent {
229
241
  error: () => { },
230
242
  });
231
243
  }
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).
244
+ // Live / Not Live beside the name, as of NOW - not the header's date range:
245
+ // Not Live while the store has any ticket that is open or inprogress, Live when
246
+ // all its tickets are closed or it has none. The API counts a ticket that is not
247
+ // closed and was raised by the end of toDate, so sending today's date makes it
248
+ // count every ticket raised up to now, in its current status.
249
+ // Empty - and hidden - for a non-V2 client, or for a store V2 does not count
250
+ // (inactive, or no first file yet).
235
251
  liveStatus = '';
236
252
  loadLiveStatus(storeId, header) {
253
+ const req = ++this.liveReq;
237
254
  this.liveStatus = '';
238
255
  const clientId = header?.client || String(storeId || '').split('-')[0];
239
- if (!storeId || !clientId || !header?.date?.endDate)
256
+ if (!storeId || !clientId) {
257
+ this.liveLoading = false;
240
258
  return;
259
+ }
260
+ // Today's date in the viewer's local time, as YYYY-MM-DD.
261
+ const today = new Date().toLocaleDateString('en-CA');
241
262
  const body = {
242
- clientId: [clientId], fromDate: header.date.startDate || header.date.endDate, toDate: header.date.endDate,
263
+ clientId: [clientId], fromDate: today, toDate: today,
243
264
  search: storeId, offset: 1, limit: 50,
244
265
  };
266
+ this.liveLoading = true;
245
267
  this.ticketsService.storeLiveStatus(body).pipe(takeUntil(this.detach)).subscribe({
246
268
  next: (res) => {
247
- if (storeId !== this.storeId)
269
+ if (req !== this.liveReq)
248
270
  return;
249
271
  // search is a partial match (406-1 also finds 406-10), so pick the exact store.
250
272
  const row = (res?.data?.rows ?? []).find((r) => r.storeId === storeId);
251
273
  this.liveStatus = row?.status === 'Live' || row?.status === 'Not Live' ? row.status : '';
274
+ this.liveLoading = false;
252
275
  },
253
- error: () => { },
276
+ error: () => { if (req === this.liveReq)
277
+ this.liveLoading = false; },
254
278
  });
255
279
  }
256
280
  selectedTabs(value) {
@@ -296,10 +320,10 @@ export class TangoStoreInfraComponent {
296
320
  ref.componentInstance.session = this.session;
297
321
  }
298
322
  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"] }] });
323
+ 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\">\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}.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
324
  }
301
325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TangoStoreInfraComponent, decorators: [{
302
326
  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"] }]
327
+ 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\">\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}.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
328
  }], 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==
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuZ28tc3RvcmUtaW5mcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtdGlja2V0LWluZnJhL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1zdG9yZS1pbmZyYS90YW5nby1zdG9yZS1pbmZyYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS10aWNrZXQtaW5mcmEvc3JjL2xpYi9jb21wb25lbnRzL3RhbmdvLXN0b3JlLWluZnJhL3RhbmdvLXN0b3JlLWluZnJhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWtDLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQU92RyxNQUFNLE9BQU8sd0JBQXdCO0lBUWY7SUFBaUM7SUFBcUI7SUFBOEI7SUFBNkI7SUFBc0M7SUFBdUI7SUFQbE0sV0FBVyxDQUFNO0lBQ1QsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDL0IsT0FBTyxDQUFNO0lBQ2IsSUFBSSxDQUFNO0lBQ1YsWUFBWSxDQUFNO0lBQ1Ysb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLFVBQVUsQ0FBTTtJQUNoQixZQUFvQixRQUF3QixFQUFTLE1BQWEsRUFBUSxFQUFxQixFQUFTLEtBQW9CLEVBQVMsY0FBNkIsRUFBUyxLQUFjLEVBQVMsV0FBdUI7UUFBck0sYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQVEsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFlO1FBQVMsbUJBQWMs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Q3RGLGtGQUFrRjtZQUNsRixLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ25HLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsMEVBQTBFO0lBQzFFLE9BQU8sQ0FBQyxVQUFlO1FBQ3JCLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNuRCxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QjtTQUMzRyxDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsaUJBQWlCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDL0MsQ0FBQzt3R0F2U1ksd0JBQXdCOzRGQUF4Qix3QkFBd0IsNkRDZHJDLDR3WUFvSmM7OzRGRHRJRCx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgVGlja2V0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aWNrZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZW1vdGVUZXJtaW5hbENvbXBvbmVudCB9IGZyb20gJy4uL3RpY2tldC1pbmZyYS12Mi9yZW1vdGUtdGVybWluYWwvcmVtb3RlLXRlcm1pbmFsLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10YW5nby1zdG9yZS1pbmZyYScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhbmdvLXN0b3JlLWluZnJhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdGFuZ28tc3RvcmUtaW5mcmEuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYW5nb1N0b3JlSW5mcmFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsT25EZXN0cm95IHtcclxuICBzZWxlY3RlZFRhYjogYW55O1xyXG4gIHByaXZhdGUgZGV0YWNoID0gbmV3IFN1YmplY3QoKTtcclxuICBzdG9yZUlkOiBhbnk7XHJcbiAgdHlwZTogYW55O1xyXG4gIHNlbGVjdGVkVGFiMTogYW55O1xyXG4gIHByaXZhdGUgc3ViVGFiRnJvbVVybEFwcGxpZWQgPSBmYWxzZTtcclxuICBjbGllbnROYW1lOiBhbnk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYWdlSW5mbzpQYWdlSW5mb1NlcnZpY2UscHJpdmF0ZSByb3V0ZXI6Um91dGVyLHB1YmxpYyBnczpHbG9iYWxTdGF0ZVNlcnZpY2UscHJpdmF0ZSByb3V0ZTpBY3RpdmF0ZWRSb3V0ZSxwcml2YXRlIHRpY2tldHNTZXJ2aWNlOlRpY2tldHNTZXJ2aWNlLHByaXZhdGUgbW9kYWw6TmdiTW9kYWwscHJpdmF0ZSBhdXRoU2VydmljZTpBdXRoU2VydmljZSl7XHJcblxyXG4gIH1cclxuICBoZWFkZXJGaWx0ZXJzOmFueTtcclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGV0YWNoLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRldGFjaC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuICBjbGllbnREYXRhOmFueTtcclxuICAgdXNlclR5cGU6YW55O1xyXG5wcml2YXRlIGlzU3RvcmVJZFZhbGlkRm9yQ2xpZW50KHN0b3JlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIGlmICghc3RvcmVJZCB8fCAhdGhpcy51c2VyVHlwZT8uY2xpZW50SWQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgLy8gLy8gVGFuZ28gdXNlcnMgY2FuIGFjY2VzcyBhbGxcclxuICAvLyBpZiAodGhpcy5ncy51c2VyQWNjZXNzLnZhbHVlPy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gIC8vICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gfVxyXG5cclxuICBjb25zdCBzdG9yZUNsaWVudElkID0gc3RvcmVJZC5zcGxpdCgnLScpWzBdO1xyXG4gIHJldHVybiBzdG9yZUNsaWVudElkID09PSBTdHJpbmcodGhpcy51c2VyVHlwZS5jbGllbnRJZCk7XHJcbn1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgIHRoaXMudXNlclR5cGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlci1pbmZvXCIpIHx8ICd7fScpO1xyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcclxuICAgICAgY29uc3QgdHlwZSA9IHBhcmFtc1sndHlwZSddID8gcGFyYW1zWyd0eXBlJ10gOiAnaW5mcmEnO1xyXG4gICAgICBpZih0eXBlID09PSdpbmZyYXYyJyl7XHJcbiAgICAgICAgLy8gRXZlcnkgSW5mcmEgYmxvY2sgaXMgZ2F0ZWQgb24gc2VsZWN0ZWRUYWIgPT09ICdpbmZyYScsIHNvIHRoaXMgcmVhZHNcclxuICAgICAgICAvLyBhcyBcInRoZSBJbmZyYSB0YWIsIG9wZW5lZCBvbiBUaWNrZXRzIFYyXCIgcmF0aGVyIHRoYW4gYSB0YWIgb2YgaXRzIG93bi5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2luZnJhJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSB0eXBlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIE9ubHkgb24gdGhlIGZpcnN0IGVtaXNzaW9uOiBzZWxlY3RlZFRhYnMxKCkgcmV3cml0ZXMgYHR5cGVgLCB3aGljaFxyXG4gICAgICAvLyBmaXJlcyB0aGlzIHN1YnNjcmlwdGlvbiBhZ2FpbiwgYW5kIHdpdGhvdXQgdGhlIGd1YXJkIHRoYXQgd291bGQgdW5kb1xyXG4gICAgICAvLyB0aGUgY2xpY2sgLSBTdW1tYXJ5IGluIHBhcnRpY3VsYXIgd291bGQgYm91bmNlIHRvIFRpY2tldHMgVjEuXHJcbiAgICAgIGlmKCF0aGlzLnN1YlRhYkZyb21VcmxBcHBsaWVkKXtcclxuICAgICAgICB0aGlzLnN1YlRhYkZyb21VcmxBcHBsaWVkID0gdHJ1ZTtcclxuICAgICAgICBpZih0eXBlID09PSdpbmZyYXYyJyl7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiMSA9ICd0aWNrZXRzVjInXHJcbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuc2VsZWN0ZWRUYWIgPT09J2luZnJhJyl7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiMSA9J3RpY2tldHMnXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgICAgICAgICBjb25zdCBjbGllbnREYXRhOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2xpZW50LWRldGFpbHNcIikgfHwgXCJ7fVwiKTtcclxuICAgIHRoaXMuY2xpZW50RGF0YSA9IGNsaWVudERhdGE7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLmhlYWRlckZpbHRlcnMgPSB7IC4uLmRhdGEgfTtcclxuICAgICAgICAgIHRoaXMuc3RvcmVJZCA9XHJcbiAgICAgICAgICAgIGRhdGEgJiYgZGF0YS5zdG9yZSA/IGRhdGEuc3RvcmUgOiB0aGlzLnJvdXRlci51cmwuc3BsaXQoXCIvXCIpWzNdO1xyXG4gICAgICAgICAgICB0aGlzLmNsaWVudE5hbWUgPSBkYXRhPy5jbGllbnROYW1lID8gZGF0YT8uY2xpZW50TmFtZTonJztcclxuICAgICAgICAgICAgIGlmICh0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlICE9PSAndGFuZ28nKSB7XHJcbiAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTdG9yZUlkVmFsaWRGb3JDbGllbnQodGhpcy5zdG9yZUlkKSkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvZXJyb3IvNDA0J10pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAgICAgdGhpcy51cGRhdGVTdG9yZUlkUXVlcnlQYXJhbSh0aGlzLnN0b3JlSWQpO1xyXG4gICAgICAgICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkU3RvcmVOYW1lKHRoaXMuc3RvcmVJZCk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRMaXZlU3RhdHVzKHRoaXMuc3RvcmVJZCwgZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRDbGllbnQoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVTdG9yZUlkUXVlcnlQYXJhbShzdG9yZUlkOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5ncy51c2VyQWNjZXNzLnZhbHVlPy51c2VyVHlwZSAhPT0gJ3RhbmdvJykge1xyXG4gICAgICAgaWYgKCF0aGlzLmlzU3RvcmVJZFZhbGlkRm9yQ2xpZW50KHN0b3JlSWQpKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9lcnJvci80MDQnXSk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG59XHJcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0geyAuLi50aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zIH07XHJcbiAgICAgIC8vIFVwZGF0ZSBzdG9yZUlkIGluIHF1ZXJ5UGFyYW1zXHJcbiAgICAgIHF1ZXJ5UGFyYW1zLnN0b3JlSWQgPSBzdG9yZUlkO1xyXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgc2FtZSByb3V0ZSB3aXRoIHVwZGF0ZWQgcXVlcnlQYXJhbXNcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHsgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnIH0pO1xyXG4gICAgfVxyXG4gIHNldFBhZ2VEYXRhKCl7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiVGlja2V0c1wiKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0RGVzY3JpcHRpb24oXHJcbiAgICAgIFwiVmlldywgc2hhcmUsIGRvd25sb2FkIGFuZCBiZW5jaG1hcmsgdGhlIHN0b3JlcyBwZXJmb3JtYW5jZSBpbiBvbmUgc2NyZWVuXCJcclxuICAgICk7XHJcbiAgICBsZXQgYnJlYWRjcnVtYnM6IGFueVtdID0gW107XHJcbiAgICBjb25zdCBjb21tb25CcmVhZGNydW1icyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmNsaWVudE5hbWUsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3N0b3Jlc1wiLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jbGllbnROYW1lLFxyXG4gICAgICAgIHBhdGg6IFwiL21hbmFnZS9zdG9yZXNcIixcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5zdG9yZUlkLFxyXG4gICAgICAgIHBhdGg6IGAvbWFuYWdlL3N0b3Jlcy9jYW1lcmFzP3N0b3JlSWQ9JHt0aGlzLnN0b3JlSWR9YCxcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuc3RvcmVJZCxcclxuICAgICAgICBwYXRoOiBgL21hbmFnZS9zdG9yZXMvY2FtZXJhcz9zdG9yZUlkPSR7dGhpcy5zdG9yZUlkfWAsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICAgIFxyXG4gICAgaWYgKHRoaXMuZ3MudXNlckFjY2Vzcy52YWx1ZT8udXNlclR5cGUgPT09IFwidGFuZ29cIikge1xyXG4gICAgICBicmVhZGNydW1icyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogXCJNYW5hZ2VcIixcclxuICAgICAgICAgIHBhdGg6IFwiL21hbmFnZS9icmFuZHNcIixcclxuICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIk1hbmFnZVwiLFxyXG4gICAgICAgICAgcGF0aDogXCIvbWFuYWdlL2JyYW5kc1wiLFxyXG4gICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgaXNTZXBhcmF0b3I6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi5jb21tb25CcmVhZGNydW1icyxcclxuICAgICAgXTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncy51c2VyQWNjZXNzLnZhbHVlPy51c2VyVHlwZSA9PT0gXCJjbGllbnRcIikge1xyXG4gICAgICBicmVhZGNydW1icyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogXCJNYW5hZ2VcIixcclxuICAgICAgICAgIHBhdGg6IFwiL21hbmFnZS9zdW1tYXJ5XCIsXHJcbiAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogXCJNYW5hZ2VcIixcclxuICAgICAgICAgIHBhdGg6IFwiL21hbmFnZS9zdW1tYXJ5XCIsXHJcbiAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICBpc1NlcGFyYXRvcjogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC4uLmNvbW1vbkJyZWFkY3J1bWJzLFxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKGJyZWFkY3J1bWJzKTtcclxuICB9XHJcbi8vIFN0b3JlIG5hbWUgZm9yIHRoZSBjYXJkIGFib3ZlIHRoZSB0YWJzLiBUaGUgaGVhZGVyIGZpbHRlciBkb2Vzbid0IGNhcnJ5IGl0IG9uXHJcbi8vIHRoaXMgcGFnZSwgc28gaXQgY29tZXMgZnJvbSBnZXQtc3RvcmUuICctLScgd2hpbGUgbG9hZGluZyBvciBvbiBmYWlsdXJlLlxyXG5wcml2YXRlIHN0b3JlTmFtZUZyb21BcGkgPSAnJztcclxuZ2V0IHN0b3JlTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdG9yZU5hbWVGcm9tQXBpIHx8ICctLSc7IH1cclxuLy8gT3BlbiAvIGNsb3NlIHRpbWUgZnJvbSB0aGUgc3RvcmUgcHJvZmlsZSwgYXMgdGhlIHN0b3JlIGhlYWRlciBzaG93cyB0aGVtLlxyXG5zdG9yZU9wZW4gPSAnJztcclxuc3RvcmVDbG9zZSA9ICcnO1xyXG5cclxuLy8gVGhlIGNhcmQgcmVsb2FkcyBvbiBldmVyeSBoZWFkZXIgQXBwbHkuIFdoaWxlIGEgbG9hZCBydW5zIGl0cyBwYXJ0IG9mIHRoZVxyXG4vLyBjYXJkIHNoaW1tZXJzOyBlYWNoIGxvYWQgaXMgbnVtYmVyZWQgc28gb25seSB0aGUgbGF0ZXN0IHJlcGx5IGlzIGFwcGxpZWQgLVxyXG4vLyBhbiBvbGRlciwgc2xvd2VyIG9uZSBjYW4gbmV2ZXIgb3ZlcndyaXRlIGl0LlxyXG5zdG9yZUxvYWRpbmcgPSBmYWxzZTtcclxubGl2ZUxvYWRpbmcgPSBmYWxzZTtcclxucHJpdmF0ZSBzdG9yZVJlcSA9IDA7XHJcbnByaXZhdGUgbGl2ZVJlcSA9IDA7XHJcblxyXG5wcml2YXRlIGxvYWRTdG9yZU5hbWUoc3RvcmVJZDogYW55KTogdm9pZCB7XHJcbiAgY29uc3QgcmVxID0gKyt0aGlzLnN0b3JlUmVxO1xyXG4gIHRoaXMuc3RvcmVOYW1lRnJvbUFwaSA9ICcnO1xyXG4gIHRoaXMuc3RvcmVPcGVuID0gJyc7XHJcbiAgdGhpcy5zdG9yZUNsb3NlID0gJyc7XHJcbiAgaWYgKCFzdG9yZUlkKSB7IHRoaXMuc3RvcmVMb2FkaW5nID0gZmFsc2U7IHJldHVybjsgfVxyXG4gIHRoaXMuc3RvcmVMb2FkaW5nID0gdHJ1ZTtcclxuICB0aGlzLnRpY2tldHNTZXJ2aWNlLmdldFN0b3JlRGV0YWlscyhzdG9yZUlkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRldGFjaCkpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcSAhPT0gdGhpcy5zdG9yZVJlcSkgcmV0dXJuO1xyXG4gICAgICB0aGlzLnN0b3JlTmFtZUZyb21BcGkgPSByZXM/LmRhdGE/LnN0b3JlTmFtZSB8fCAnJztcclxuICAgICAgdGhpcy5zdG9yZU9wZW4gPSByZXM/LmRhdGE/LnN0b3JlUHJvZmlsZT8ub3BlbiB8fCAnJztcclxuICAgICAgdGhpcy5zdG9yZUNsb3NlID0gcmVzPy5kYXRhPy5zdG9yZVByb2ZpbGU/LmNsb3NlIHx8ICcnO1xyXG4gICAgICB0aGlzLnN0b3JlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoKSA9PiB7IGlmIChyZXEgPT09IHRoaXMuc3RvcmVSZXEpIHRoaXMuc3RvcmVMb2FkaW5nID0gZmFsc2U7IH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8vIFRoZSBzdG9yZS1jYXJkIGJ1dHRvbnMgKFRlcm1pbmFsIGFjY2VzcywgRmlsZSBhY2Nlc3MsIENhbGwpIGFyZSBmb3IgVGFuZ28gdXNlcnMgb25seS5cclxuZ2V0IGlzVGFuZ28oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmdzLnVzZXJBY2Nlc3MudmFsdWU/LnVzZXJUeXBlID09PSAndGFuZ28nOyB9XHJcblxyXG4vLyAuLi5hbmQgb25seSBmb3IgSW5mcmEgVjIgY2xpZW50cy4gU2FtZSBjYWxsIGFuZCBmaWVsZCB0aGUgVGlja2V0cyBwYWdlIHVzZXMgZm9yXHJcbi8vIGl0cyBJbmZyYSBWMiB0YWIuIEhpZGRlbiB3aGlsZSBsb2FkaW5nIG9yIG9uIGVycm9yLlxyXG5pbmZyYVRpY2tldFR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5jbGllbnREaXNwbGF5TmFtZSA9ICcnO1xyXG5nZXQgc2hvd1N0b3JlQWN0aW9ucygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaXNUYW5nbyAmJiB0aGlzLmluZnJhVGlja2V0VHlwZSA9PT0gJ1YyJzsgfVxyXG5cclxucHJpdmF0ZSBsb2FkQ2xpZW50KGhlYWRlcjogYW55KTogdm9pZCB7XHJcbiAgdGhpcy5pbmZyYVRpY2tldFR5cGUgPSBudWxsO1xyXG4gIHRoaXMuY2xpZW50RGlzcGxheU5hbWUgPSAnJztcclxuICBjb25zdCBjbGllbnRJZCA9IGhlYWRlcj8uY2xpZW50IHx8IFN0cmluZyh0aGlzLnN0b3JlSWQgfHwgJycpLnNwbGl0KCctJylbMF07XHJcbiAgaWYgKCFjbGllbnRJZCkgcmV0dXJuO1xyXG4gIHRoaXMuYXV0aFNlcnZpY2UuZ2V0QnJhbmREZXRhaWxzKGNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRldGFjaCkpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5pbmZyYVRpY2tldFR5cGUgPSByZXM/LmRhdGE/LnRpY2tldENvbmZpZ3M/LmluZnJhVGlja2V0VHlwZSA/PyBudWxsO1xyXG4gICAgICB0aGlzLmNsaWVudERpc3BsYXlOYW1lID0gcmVzPy5kYXRhPy5jbGllbnROYW1lIHx8ICcnO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoKSA9PiB7fSxcclxuICB9KTtcclxufVxyXG5cclxuLy8gTGl2ZSAvIE5vdCBMaXZlIGJlc2lkZSB0aGUgbmFtZSwgYXMgb2YgTk9XIC0gbm90IHRoZSBoZWFkZXIncyBkYXRlIHJhbmdlOlxyXG4vLyBOb3QgTGl2ZSB3aGlsZSB0aGUgc3RvcmUgaGFzIGFueSB0aWNrZXQgdGhhdCBpcyBvcGVuIG9yIGlucHJvZ3Jlc3MsIExpdmUgd2hlblxyXG4vLyBhbGwgaXRzIHRpY2tldHMgYXJlIGNsb3NlZCBvciBpdCBoYXMgbm9uZS4gVGhlIEFQSSBjb3VudHMgYSB0aWNrZXQgdGhhdCBpcyBub3RcclxuLy8gY2xvc2VkIGFuZCB3YXMgcmFpc2VkIGJ5IHRoZSBlbmQgb2YgdG9EYXRlLCBzbyBzZW5kaW5nIHRvZGF5J3MgZGF0ZSBtYWtlcyBpdFxyXG4vLyBjb3VudCBldmVyeSB0aWNrZXQgcmFpc2VkIHVwIHRvIG5vdywgaW4gaXRzIGN1cnJlbnQgc3RhdHVzLlxyXG4vLyBFbXB0eSAtIGFuZCBoaWRkZW4gLSBmb3IgYSBub24tVjIgY2xpZW50LCBvciBmb3IgYSBzdG9yZSBWMiBkb2VzIG5vdCBjb3VudFxyXG4vLyAoaW5hY3RpdmUsIG9yIG5vIGZpcnN0IGZpbGUgeWV0KS5cclxubGl2ZVN0YXR1czogJycgfCAnTGl2ZScgfCAnTm90IExpdmUnID0gJyc7XHJcblxyXG5wcml2YXRlIGxvYWRMaXZlU3RhdHVzKHN0b3JlSWQ6IGFueSwgaGVhZGVyOiBhbnkpOiB2b2lkIHtcclxuICBjb25zdCByZXEgPSArK3RoaXMubGl2ZVJlcTtcclxuICB0aGlzLmxpdmVTdGF0dXMgPSAnJztcclxuICBjb25zdCBjbGllbnRJZCA9IGhlYWRlcj8uY2xpZW50IHx8IFN0cmluZyhzdG9yZUlkIHx8ICcnKS5zcGxpdCgnLScpWzBdO1xyXG4gIGlmICghc3RvcmVJZCB8fCAhY2xpZW50SWQpIHsgdGhpcy5saXZlTG9hZGluZyA9IGZhbHNlOyByZXR1cm47IH1cclxuICAvLyBUb2RheSdzIGRhdGUgaW4gdGhlIHZpZXdlcidzIGxvY2FsIHRpbWUsIGFzIFlZWVktTU0tREQuXHJcbiAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tQ0EnKTtcclxuICBjb25zdCBib2R5ID0ge1xyXG4gICAgY2xpZW50SWQ6IFtjbGllbnRJZF0sIGZyb21EYXRlOiB0b2RheSwgdG9EYXRlOiB0b2RheSxcclxuICAgIHNlYXJjaDogc3RvcmVJZCwgb2Zmc2V0OiAxLCBsaW1pdDogNTAsXHJcbiAgfTtcclxuICB0aGlzLmxpdmVMb2FkaW5nID0gdHJ1ZTtcclxuICB0aGlzLnRpY2tldHNTZXJ2aWNlLnN0b3JlTGl2ZVN0YXR1cyhib2R5KS5waXBlKHRha2VVbnRpbCh0aGlzLmRldGFjaCkpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcSAhPT0gdGhpcy5saXZlUmVxKSByZXR1cm47XHJcbiAgICAgIC8vIHNlYXJjaCBpcyBhIHBhcnRpYWwgbWF0Y2ggKDQwNi0xIGFsc28gZmluZHMgNDA2LTEwKSwgc28gcGljayB0aGUgZXhhY3Qgc3RvcmUuXHJcbiAgICAgIGNvbnN0IHJvdyA9IChyZXM/LmRhdGE/LnJvd3MgPz8gW10pLmZpbmQoKHI6IGFueSkgPT4gci5zdG9yZUlkID09PSBzdG9yZUlkKTtcclxuICAgICAgdGhpcy5saXZlU3RhdHVzID0gcm93Py5zdGF0dXMgPT09ICdMaXZlJyB8fCByb3c/LnN0YXR1cyA9PT0gJ05vdCBMaXZlJyA/IHJvdy5zdGF0dXMgOiAnJztcclxuICAgICAgdGhpcy5saXZlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoKSA9PiB7IGlmIChyZXEgPT09IHRoaXMubGl2ZVJlcSkgdGhpcy5saXZlTG9hZGluZyA9IGZhbHNlOyB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG5zZWxlY3RlZFRhYnModmFsdWU6YW55KXtcclxuICB0aGlzLnNlbGVjdGVkVGFiID0gdmFsdWU7XHJcbiAgaWYodGhpcy5zZWxlY3RlZFRhYiA9PT0naW5mcmEnKXtcclxuICAgIHRoaXMuc2VsZWN0ZWRUYWIxID0ndGlja2V0cydcclxuICB9XHJcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSB7IC4uLnRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfTtcclxuICAgICAgcXVlcnlQYXJhbXNbJ3R5cGUnXSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyByZWxhdGl2ZVRvOnRoaXMucm91dGUsIHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtc30pO1xyXG59XHJcblxyXG5zZWxlY3RlZFRhYnMxKHR5cGU6YW55KXtcclxuICB0aGlzLnNlbGVjdGVkVGFiMSA9IHR5cGU7XHJcbiAgLy8gS2VlcCB0aGUgVVJMIGluIHN0ZXAsIHRoZSBzYW1lIHdheSBzZWxlY3RlZFRhYnMoKSBkb2VzIGZvciB0aGUgdG9wIHRhYnMuXHJcbiAgLy8gU3VtbWFyeSBoYXMgbm8gYHR5cGVgIG9mIGl0cyBvd24sIHNvIGl0IHNoYXJlcyAnaW5mcmEnIHdpdGggVGlja2V0cyBWMS5cclxuICBjb25zdCBxdWVyeVBhcmFtcyA9IHsgLi4udGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyB9O1xyXG4gICAgICBxdWVyeVBhcmFtc1sndHlwZSddID0gdHlwZSA9PT0gJ3RpY2tldHNWMicgPyAnaW5mcmF2MicgOiAnaW5mcmEnO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyByZWxhdGl2ZVRvOnRoaXMucm91dGUsIHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtc30pO1xyXG59XHJcblxyXG4vLyBUZXJtaW5hbCBhY2Nlc3MgcG9wLXVwOiBvcGVucyBhdCBvbmNlLCB0aGVuIGZpbGxzIGZyb20gL3JlbW90ZS9zZXNzaW9uLlxyXG4vLyBFdmVyeSBjYWxsIGlzIGF1ZGl0LWxvZ2dlZCBhcyBhIHNlc3Npb24gb3BlbmVkLCBDYW5jZWwgaW5jbHVkZWQuXHJcbnNlc3Npb246IGFueSA9IG51bGw7XHJcbnNlc3Npb25TdGF0ZTogJ2xvYWRpbmcnIHwgJ3JlYWR5JyB8ICdlcnJvcicgPSAnbG9hZGluZyc7XHJcbnNlc3Npb25FcnJvciA9ICcnO1xyXG5cclxub3BlblRlcm1pbmFsKHRwbDogVGVtcGxhdGVSZWY8YW55Pik6IHZvaWQge1xyXG4gIHRoaXMuc2Vzc2lvbiA9IG51bGw7XHJcbiAgdGhpcy5zZXNzaW9uRXJyb3IgPSAnJztcclxuICB0aGlzLnNlc3Npb25TdGF0ZSA9ICdsb2FkaW5nJztcclxuICB0aGlzLm1vZGFsLm9wZW4odHBsLCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gIHRoaXMudGlja2V0c1NlcnZpY2UucmVtb3RlU2Vzc2lvbih0aGlzLnN0b3JlSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4geyB0aGlzLnNlc3Npb24gPSByZXM/LmRhdGEgPz8gbnVsbDsgdGhpcy5zZXNzaW9uU3RhdGUgPSAncmVhZHknOyB9LFxyXG4gICAgLy8gVGhlIEFQSSdzIG93biBtZXNzYWdlOiBcIlN0b3JlIG5vdCBmb3VuZFwiLCBcIk5vIGVkZ2UgYWdlbnQuLi5cIiwgXCJub3QgY29uZmlndXJlZFwiLlxyXG4gICAgZXJyb3I6IChlcnI6IGFueSkgPT4geyB0aGlzLnNlc3Npb25FcnJvciA9IGVycj8uZXJyb3I/LmVycm9yIHx8ICcnOyB0aGlzLnNlc3Npb25TdGF0ZSA9ICdlcnJvcic7IH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8vIENvbm5lY3Q6IHN3YXAgdGhlIGNvbmZpcm1hdGlvbiBmb3IgdGhlIHRlcm1pbmFsIHBvcC11cC4gU3RhdGljIGJhY2tkcm9wIGFuZFxyXG4vLyBubyBFc2MsIHNvIGEgc3RyYXkgY2xpY2sgY2Fubm90IGRyb3AgYSBsaXZlIHNoZWxsOyBpdCBjbG9zZXMgdmlhIENsb3NlLlxyXG5jb25uZWN0KGNvbmZpcm1SZWY6IGFueSk6IHZvaWQge1xyXG4gIGNvbmZpcm1SZWYuY2xvc2UoKTtcclxuICBjb25zdCByZWYgPSB0aGlzLm1vZGFsLm9wZW4oUmVtb3RlVGVybWluYWxDb21wb25lbnQsIHtcclxuICAgIHNpemU6ICd4bCcsIGNlbnRlcmVkOiB0cnVlLCBiYWNrZHJvcDogJ3N0YXRpYycsIGtleWJvYXJkOiBmYWxzZSwgbW9kYWxEaWFsb2dDbGFzczogJ3JlbW90ZS10ZXJtaW5hbC1tb2RhbCcsXHJcbiAgfSk7XHJcbiAgcmVmLmNvbXBvbmVudEluc3RhbmNlLnNlc3Npb24gPSB0aGlzLnNlc3Npb247XHJcbn1cclxuXHJcbn1cclxuIiwiPCEtLSBTdG9yZSBjYXJkOiBuYW1lIGFuZCB0aW1pbmdzIGZyb20gZ2V0LXN0b3JlLCBMaXZlIHN0YXR1cyBmcm9tIHRoZSBWMiBzdG9yZSBsaXN0LiAtLT5cclxuPGRpdiBjbGFzcz1cImNhcmQgbWItNSBweS00IHB4LTVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+PHN2ZyB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgZmlsbD1cIiNEMUZBREZcIi8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgc3Ryb2tlPVwiI0VDRkRGM1wiIHN0cm9rZS13aWR0aD1cIjZcIi8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNjc5OSAxOC44MDM5TDE1LjYyNjcgMTguODg3MUMxNS4wNjg2IDE5Ljg3NDEgMTUuNjY0NCAyMS4xMjE1IDE2LjczNjEgMjEuMjY0NkMxNi44MzMxIDIxLjI3NjUgMTYuOTIzNSAyMS4yODI4IDE3LjAxMTggMjEuMjgyOEMxNy41ODk5IDIxLjI4MjggMTguMTAxMSAyMS4wMzQ4IDE4LjQ1NzQgMjAuNjQ4TDE5LjAxMDcgMjAuMDQ3NEwxOS41NjIxIDIwLjY0OThDMTkuOTE0MSAyMS4wMzQyIDIwLjQyNDEgMjEuMjgyOCAyMS4wMDYxIDIxLjI4MjhDMjEuNTg1NiAyMS4yODI4IDIyLjA5ODUgMjEuMDMzOCAyMi40NTAyIDIwLjY0OThMMjMuMDAzMyAyMC4wNDU1TDIzLjU1NjUgMjAuNjQ5OEMyMy45MDgxIDIxLjAzMzggMjQuNDIxMSAyMS4yODI4IDI1LjAwMDUgMjEuMjgyOEMyNS41OCAyMS4yODI4IDI2LjA5MjkgMjEuMDMzOCAyNi40NDQ1IDIwLjY0OThMMjYuOTk3NyAyMC4wNDU1TDI3LjU1MDkgMjAuNjQ5OEMyNy45MDI1IDIxLjAzMzggMjguNDE1NSAyMS4yODI4IDI4Ljk5NDkgMjEuMjgyOEMyOS4wODAzIDIxLjI4MjggMjkuMTczMyAyMS4yNzY1IDI5LjI2OTcgMjEuMjY0N0MzMC4zNjQ5IDIxLjExNTQgMzAuOTYyNyAxOS44MDEyIDMwLjMyNCAxOC44MDQ0QzMwLjMyNCAxOC44MDQzIDMwLjMyNCAxOC44MDQzIDMwLjMyMzkgMTguODA0MkwyOC41NjU4IDE2LjA2MjhMMjguNTY1OCAxNi4wNjI4TDI4LjU2NDggMTYuMDYxNEMyOC41NDk2IDE2LjAzNzUgMjguNTEyMSAxNi4wMTIgMjguNDY1IDE2LjAxMkgxNy41MzU2QzE3LjQ4ODQgMTYuMDEyIDE3LjQ1MDkgMTYuMDM3NSAxNy40MzU3IDE2LjA2MTRMMTcuNDM1MSAxNi4wNjIzTDE1LjY3OTkgMTguODAzOVpNMjguNjUxNCAyMy43MzcyVjI2Ljg2OTFWMjcuNjE5MUgyNy45MDE0SDE4LjA5OTJIMTcuMzQ5MlYyNi44NjkxVjIzLjczNzZDMTcuMjM5IDIzLjc0NTggMTcuMTI3NCAyMy43NTAxIDE3LjAxNDggMjMuNzUwMUMxNi45NzI1IDIzLjc1MDEgMTYuOTMwNSAyMy43NDk0IDE2Ljg4ODggMjMuNzQ4MlYyNi44NjkxVjI4LjgwMzZDMTYuODg4OCAyOS40NDcxIDE3LjQyMjcgMjkuOTg4MiAxOC4wOTkyIDI5Ljk4ODJIMjcuOTAxNEMyOC41Nzc5IDI5Ljk4ODIgMjkuMTExOCAyOS40NDcxIDI5LjExMTggMjguODAzNlYyNi44NjkxVjIzLjc0ODRDMjkuMDcyIDIzLjc0OTUgMjkuMDMyIDIzLjc1MDEgMjguOTkxOCAyMy43NTAxQzI4Ljg3NzQgMjMuNzUwMSAyOC43NjM5IDIzLjc0NTcgMjguNjUxNCAyMy43MzcyWlwiIHN0cm9rZT1cIiMwMjdBNDhcIiBzdHJva2Utd2lkdGg9XCIxLjVcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gUmVsb2FkcyBvbiBldmVyeSBBcHBseTsgZWFjaCBwYXJ0IHNoaW1tZXJzIHdoaWxlIGl0cyBvd24gY2FsbCBydW5zLiAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3RvcmVMb2FkaW5nXCIgY2xhc3M9XCJza2VsIHNrZWwtbmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXN0b3JlTG9hZGluZ1wiIGNsYXNzPVwic3RvcmUtY2FyZC1uYW1lXCI+e3sgc3RvcmVOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsaXZlTG9hZGluZ1wiIGNsYXNzPVwic2tlbCBza2VsLXBpbGwgbXMtNFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxpdmVMb2FkaW5nICYmIGxpdmVTdGF0dXNcIiBjbGFzcz1cImxpdmUtc3RhdHVzIG1zLTRcIiBbY2xhc3MuZG93bl09XCJsaXZlU3RhdHVzID09PSAnTm90IExpdmUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaXZlLWRvdFwiPjwvc3Bhbj57eyBsaXZlU3RhdHVzIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3RvcmVMb2FkaW5nXCIgY2xhc3M9XCJtdC0xXCI+PHNwYW4gY2xhc3M9XCJza2VsIHNrZWwtbWV0YVwiPjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzdG9yZUxvYWRpbmdcIiBjbGFzcz1cInN0b3JlLWNhcmQtbWV0YSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTFcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0b3JlSWQgfHwgJy0tJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMlwiPsK3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm1lLTFcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+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==