@sumaris-net/ngx-components 18.19.7 → 18.20.0

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.
@@ -6,7 +6,7 @@ import { accountToString } from '../services/model/account.model';
6
6
  import { APP_LOCALES } from '../services/model/settings.model';
7
7
  import { debounceTime, distinctUntilChanged, map, startWith } from 'rxjs/operators';
8
8
  import { AppAuthModal } from '../auth/auth.modal';
9
- import { MenuItems } from '../menu/menu.model';
9
+ import { MenuItem, MenuItems } from '../menu/menu.model';
10
10
  import { Toasts } from '../../shared/toast/toasts';
11
11
  import { fadeInAnimation, slideInAnimation, slideUpDownAnimation } from '../../shared/material/material.animations';
12
12
  import { isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrBlank } from '../../shared/functions';
@@ -63,7 +63,6 @@ export class HomePage extends RxState {
63
63
  settings;
64
64
  environment;
65
65
  locales;
66
- buttons;
67
66
  config;
68
67
  _subscription = new Subscription();
69
68
  _config;
@@ -89,6 +88,7 @@ export class HomePage extends RxState {
89
88
  feedMaxAgeInMonths;
90
89
  feedMaxContentLength;
91
90
  hasScrollbar = false;
91
+ buttons;
92
92
  loading$ = this.select('loading');
93
93
  $partners = new BehaviorSubject(null);
94
94
  $filteredButtons = new BehaviorSubject(undefined);
@@ -157,7 +157,6 @@ export class HomePage extends RxState {
157
157
  this.settings = settings;
158
158
  this.environment = environment;
159
159
  this.locales = locales;
160
- this.buttons = buttons;
161
160
  this.config = config;
162
161
  this.set({
163
162
  loading: true,
@@ -165,6 +164,7 @@ export class HomePage extends RxState {
165
164
  showSpinner: !this.platform.started,
166
165
  darkMode: this.settings.isDarkMode,
167
166
  });
167
+ this.buttons = (buttons || [])?.map(item => MenuItem.fromObject(item));
168
168
  this.mobile = this.platform.is('mobile');
169
169
  this.platform.ready().then(() => this.start());
170
170
  this.showAccountButton = environment.account?.showAccountButton ?? true;
@@ -361,9 +361,12 @@ export class HomePage extends RxState {
361
361
  .map((item) => {
362
362
  // Replace title using properties
363
363
  if (isNotNilOrBlank(item.titleProperty) && this._config) {
364
- const title = this._config.properties[item.titleProperty];
365
- if (title)
366
- return { ...item, title }; // Create a copy, to keep the original item.title
364
+ const title = this._config.properties[item.titleProperty] ?? item.title;
365
+ if (item.title !== title) {
366
+ // Clone before changing, to be able to restore the original title (e.g. if config property changed)
367
+ item.clone();
368
+ item.title = title;
369
+ }
367
370
  }
368
371
  return item;
369
372
  });
@@ -416,11 +419,11 @@ export class HomePage extends RxState {
416
419
  this.cd.markForCheck();
417
420
  }
418
421
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HomePage, deps: [{ token: i1.AccountService }, { token: i2.ModalController }, { token: i3.TranslateService }, { token: i2.ToastController }, { token: i4.ConfigService }, { token: i5.PlatformService }, { token: i0.ChangeDetectorRef }, { token: i6.NetworkService }, { token: i7.LocalSettingsService }, { token: ENVIRONMENT }, { token: APP_LOCALES }, { token: APP_HOME_BUTTONS, optional: true }, { token: APP_HOME_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
419
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HomePage, selector: "app-page-home", viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"'HOME.BTN_DARK_MODE' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"'SETTINGS.LOCALE' | translate\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n <ion-button\n *ngIf=\"item.path\"\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-text>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-text>\n </ion-button>\n\n <!-- divider -->\n <div *ngIf=\"!item.path && !item.action\" [class]=\"item.cssClass\">\n <ion-label translate>{{ item.title }}&nbsp;</ion-label>\n </div>\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text class=\"ion-float-end\" [title]=\"page.time | dateFormat: { time: true }\">\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n &nbsp;{{ page.time | dateFromNow }}\n </small>\n &nbsp;\n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img class=\"logo\" src=\"{{ item.logo }}\" alt=\"{{ item.label }}\" [title]=\"item.label\" />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome button{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonMenuToggle, selector: "ion-menu-toggle", inputs: ["autoHide", "menu"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i9.RxIf, selector: "[rxIf]", inputs: ["rxIf", "rxIfStrategy", "rxIfElse", "rxIfThen", "rxIfSuspense", "rxIfComplete", "rxIfError", "rxIfContextTrigger", "rxIfNextTrigger", "rxIfSuspenseTrigger", "rxIfErrorTrigger", "rxIfCompleteTrigger", "rxIfParent", "rxIfPatchZone", "rxIfRenderCallback"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "component", type: i14.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "id", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "directive", type: i15.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i16.AppInstallUpgradeCard, selector: "app-install-upgrade-card", inputs: ["isLogin", "showUpgradeWarning", "showOfflineWarning", "showInstallButton", "debug"] }, { kind: "component", type: i17.UserEventNotificationIcon, selector: "app-user-event-notification-icon", inputs: ["titleI18n", "disabled", "filter", "autoHide", "headerActions", "footerActions", "style", "color", "unreadColor", "fill", "mobile", "listStyle", "debug"], outputs: ["showList"] }, { kind: "component", type: i18.FeedsComponent, selector: "app-feed", inputs: ["debug", "mobile", "showHeader", "showReadMoreButton", "headerColor", "cardColor", "shape", "class", "itemId", "filterItem", "feeds", "urls", "maxAgeInMonths", "maxContentLength"], outputs: ["editItem", "deleteItem"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i19.RxPush, name: "push" }, { kind: "pipe", type: i20.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i21.DateFromNowPipe, name: "dateFromNow" }, { kind: "pipe", type: i22.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i22.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i23.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }], animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
422
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HomePage, selector: "app-page-home", viewQueries: [{ propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"'HOME.BTN_DARK_MODE' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"'SETTINGS.LOCALE' | translate\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n @if (item.path) {\n <ion-button\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-label>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-label>\n <ion-badge *rxIf=\"item.$badge; let badge\"\n slot=\"end\"\n [color]=\"(item.$badgeColor | push) || 'accent'\">\n {{badge}}\n </ion-badge>\n </ion-button>\n } @else {\n <!-- divider -->\n <div *ngIf=\"!item.action\" [class]=\"item.cssClass\" class=\"button-divider\">\n <ion-label translate>{{ item.title }}&nbsp;</ion-label>\n </div>\n }\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text class=\"ion-float-end\" [title]=\"page.time | dateFormat: { time: true }\">\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n &nbsp;{{ page.time | dateFromNow }}\n </small>\n &nbsp;\n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img class=\"logo\" src=\"{{ item.logo }}\" alt=\"{{ item.label }}\" [title]=\"item.label\" />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome .button-divider{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i2.IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonListHeader, selector: "ion-list-header", inputs: ["color", "lines", "mode"] }, { kind: "component", type: i2.IonMenuToggle, selector: "ion-menu-toggle", inputs: ["autoHide", "menu"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i2.RouterLinkDelegate, selector: ":not(a):not(area)[routerLink]" }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i9.RxIf, selector: "[rxIf]", inputs: ["rxIf", "rxIfStrategy", "rxIfElse", "rxIfThen", "rxIfSuspense", "rxIfComplete", "rxIfError", "rxIfContextTrigger", "rxIfNextTrigger", "rxIfSuspenseTrigger", "rxIfErrorTrigger", "rxIfCompleteTrigger", "rxIfParent", "rxIfPatchZone", "rxIfRenderCallback"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "component", type: i14.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "id", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "directive", type: i15.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i16.AppInstallUpgradeCard, selector: "app-install-upgrade-card", inputs: ["isLogin", "showUpgradeWarning", "showOfflineWarning", "showInstallButton", "debug"] }, { kind: "component", type: i17.UserEventNotificationIcon, selector: "app-user-event-notification-icon", inputs: ["titleI18n", "disabled", "filter", "autoHide", "headerActions", "footerActions", "style", "color", "unreadColor", "fill", "mobile", "listStyle", "debug"], outputs: ["showList"] }, { kind: "component", type: i18.FeedsComponent, selector: "app-feed", inputs: ["debug", "mobile", "showHeader", "showReadMoreButton", "headerColor", "cardColor", "shape", "class", "itemId", "filterItem", "feeds", "urls", "maxAgeInMonths", "maxContentLength"], outputs: ["editItem", "deleteItem"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i19.RxPush, name: "push" }, { kind: "pipe", type: i20.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i21.DateFromNowPipe, name: "dateFromNow" }, { kind: "pipe", type: i22.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i22.EmptyArrayPipe, name: "isEmptyArray" }, { kind: "pipe", type: i23.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }], animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
420
423
  }
421
424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HomePage, decorators: [{
422
425
  type: Component,
423
- args: [{ selector: 'app-page-home', changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"'HOME.BTN_DARK_MODE' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"'SETTINGS.LOCALE' | translate\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n <ion-button\n *ngIf=\"item.path\"\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-text>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-text>\n </ion-button>\n\n <!-- divider -->\n <div *ngIf=\"!item.path && !item.action\" [class]=\"item.cssClass\">\n <ion-label translate>{{ item.title }}&nbsp;</ion-label>\n </div>\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text class=\"ion-float-end\" [title]=\"page.time | dateFormat: { time: true }\">\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n &nbsp;{{ page.time | dateFromNow }}\n </small>\n &nbsp;\n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img class=\"logo\" src=\"{{ item.logo }}\" alt=\"{{ item.label }}\" [title]=\"item.label\" />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome button{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"] }]
426
+ args: [{ selector: 'app-page-home', changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation], template: "<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button (click)=\"toggleDarkMode()\">\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n </ion-button>\n }\n\n <!-- Change locale button -->\n <ion-button [matMenuTriggerFor]=\"localeMenu\">\n <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n <ng-template matMenuContent>\n @for (item of locales; track item.key) {\n <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n <ion-label>{{ item.value }}</ion-label>\n </button>\n }\n </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n <!-- loading spinner -->\n <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n @if (showSpinner) {\n <div class=\"spinner\">\n <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n <div class=\"sk-cube1 sk-cube\"></div>\n <div class=\"sk-cube2 sk-cube\"></div>\n <div class=\"sk-cube4 sk-cube\"></div>\n <div class=\"sk-cube3 sk-cube\"></div>\n </div>\n }\n </div>\n\n <!-- Desktop: translucent top toolbar -->\n @if (!mobile) {\n <div class=\"hidden-xs hidden-sm\">\n <ion-toolbar color=\"traansparent\" translucent>\n <ion-buttons slot=\"start\">\n <ion-menu-toggle>\n <ion-button color=\"light\" fill=\"clear\">\n <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n </ion-button>\n </ion-menu-toggle>\n </ion-buttons>\n\n <ion-buttons slot=\"end\">\n @if (showNotificationIcon) {\n <app-user-event-notification-icon\n [style]=\"'ion-button'\"\n color=\"secondary\"\n unreadColor=\"tertiary\"\n fill=\"solid\"\n [autoHide]=\"autoHideNotificationIcon\"\n ></app-user-event-notification-icon>\n }\n\n <!-- dark mode (if allow by the environment token) -->\n @if (settings.allowDarkMode) {\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n (click)=\"toggleDarkMode()\"\n [title]=\"'HOME.BTN_DARK_MODE' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n </ion-button>\n }\n <!-- change locale button -->\n <ion-button\n color=\"secondary\"\n fill=\"solid\"\n [matMenuTriggerFor]=\"localeMenu\"\n [title]=\"'SETTINGS.LOCALE' | translate\"\n >\n <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </div>\n }\n\n <!-- Install (and upgrade) card -->\n <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n @if (!(loading$ | push)) {\n @let hasFeed = hasFeed$ | async;\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n <ion-col>\n <!-- Welcome card -->\n <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n <ion-card-header>\n <ion-card-title class=\"ion-text-center\">\n <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n </ion-card-title>\n <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n </ion-card-header>\n <ion-card-content class=\"ion-no-padding\">\n <ion-text color=\"primary\">\n <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n </ion-text>\n <!-- register help text -->\n <ion-text *ngIf=\"!isLogin && canRegister\">\n <br />\n <span translate>HOME.REGISTER_HELP</span>\n </ion-text>\n <div class=\"ion-padding-top\">\n <!-- If NOT login -->\n <ng-container *ngIf=\"!isLogin; else loginButtons\">\n <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n <span translate>HOME.BTN_REGISTER</span>\n </ion-button>\n <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n <span translate>AUTH.BTN_LOGIN</span>\n </ion-button>\n </ng-container>\n\n <!-- If user login -->\n <ng-template #loginButtons>\n <!-- Feature buttons -->\n <ng-container *rxIf=\"$filteredButtons; let buttons\">\n <ng-container *ngFor=\"let item of buttons\">\n @if (item.path) {\n <ion-button\n expand=\"block\"\n color=\"tertiary\"\n [class]=\"item.cssClass\"\n [routerLink]=\"item.path\"\n routerDirection=\"root\"\n >\n <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n {{ item.matIcon }}\n </mat-icon>\n <ion-label>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-label>\n <ion-badge *rxIf=\"item.$badge; let badge\"\n slot=\"end\"\n [color]=\"(item.$badgeColor | push) || 'accent'\">\n {{badge}}\n </ion-badge>\n </ion-button>\n } @else {\n <!-- divider -->\n <div *ngIf=\"!item.action\" [class]=\"item.cssClass\" class=\"button-divider\">\n <ion-label translate>{{ item.title }}&nbsp;</ion-label>\n </div>\n }\n </ng-container>\n\n <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n </ng-container>\n\n <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n </ion-button>\n\n <p hidden-xs hidden-sm hidden-mobile>\n <ion-text\n [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n ></ion-text>\n <br />\n <ion-text>\n <a href=\"#\" (click)=\"logout($event)\">\n <span translate>HOME.BTN_DISCONNECT</span>\n </a>\n </ion-text>\n </p>\n </ng-template>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n @if (showFeed) {\n @if (mobile) {\n <app-feed\n #feed\n shape=\"round\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @fadeInAnimation\n ></app-feed>\n } @else {\n <app-feed\n #feed\n shape=\"round\"\n [debug]=\"false\"\n [urls]=\"feedUrls\"\n [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n [maxContentLength]=\"feedMaxContentLength\"\n (ngInit)=\"initFeed(feed)\"\n @slideInAnimation\n @fadeInAnimation\n ></app-feed>\n }\n }\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Page history -->\n @let pageHistory = isLogin && (pageHistory$ | push);\n @if (pageHistory | isNotEmptyArray) {\n <ion-grid class=\"history-container ion-align-self-center\">\n <ion-row>\n @for (page of pageHistory; track page.path) {\n <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n <ion-card-header class=\"ion-no-padding\">\n <!-- top bar -->\n <ion-card-subtitle>\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"removePageHistory(page.path)\"\n mat-icon-button\n class=\"ion-float-start ion-no-margin close-button\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n <ion-text class=\"ion-float-end\" [title]=\"page.time | dateFormat: { time: true }\">\n <small>\n <ion-icon name=\"time-outline\"></ion-icon>\n &nbsp;{{ page.time | dateFromNow }}\n </small>\n &nbsp;\n </ion-text>\n </ion-card-subtitle>\n\n <!-- main page -->\n <ion-card-title class=\"ion-no-margin ion-no-padding\">\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"page.path\"\n routerDirection=\"root\"\n lines=\"none\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n </ion-item>\n </ion-card-title>\n </ion-card-header>\n\n <!-- children pages -->\n @if (page.children | isNotEmptyArray) {\n <ion-card-content class=\"ion-no-padding ion-padding-start\">\n <ion-list class=\"ion-no-padding\">\n @for (childPage of page.children; track childPage.path) {\n <ion-item\n detail=\"true\"\n tappable\n class=\"text-1x\"\n [routerLink]=\"childPage.path\"\n routerDirection=\"root\"\n >\n <!-- page icon-->\n <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n {{ childPage.matIcon }}\n </mat-icon>\n\n <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-card-content>\n }\n </ion-card>\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n }\n\n <!-- Bottom banner -->\n @if (showPartnerBanner || showLegalInformation) {\n <ion-grid\n class=\"bottom-banner ion-text-center\"\n [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n @fadeInAnimation\n >\n <ion-row>\n <!-- partners logos -->\n @if (showPartnerBanner) {\n <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n @if (showLegalInformation) {\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n </ion-list>\n }\n <!-- partners -->\n @for (item of $partners | async; track $index) {\n <a href=\"{{ item.siteUrl }}\">\n <img class=\"logo\" src=\"{{ item.logo }}\" alt=\"{{ item.label }}\" [title]=\"item.label\" />\n </a>\n }\n </ion-col>\n }\n\n <!-- legal information -->\n @if (showLegalInformation) {\n <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n @for (item of legalInformation; track item.path) {\n <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n <ion-label>\n <p>\n {{ item.title | translate: item.titleArgs }}\n </p>\n </ion-label>\n </ion-item>\n }\n </ion-list>\n </ion-col>\n @if (showInstallLinks) {\n <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n <ion-list class=\"legal-info\">\n <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n <!-- TODO -->\n </ion-list>\n </ion-col>\n }\n }\n </ion-row>\n </ion-grid>\n }\n }\n\n <!-- image credits -->\n @if (contentCredits | isNotNilOrBlank) {\n <div class=\"content-credits\" [class.floating]=\"!mobile\">\n <ion-text>{{ contentCredits }}</ion-text>\n </div>\n }\n</ion-content>\n", styles: [":host{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .7);--scrollbar-width: 0;--bottom-banner-height: 122px}h1,h2,h3,h4,h5{white-space:normal}.center,ion-content ion-card.welcome img{text-align:center;display:inline-block}ion-content{--background: transparent;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-color:var(--ion-background-color);display:inline-block;padding:15px}ion-content.has-scrollbar{--scrollbar-width: 8px}ion-content .loading-page{display:block;height:100%;width:100%;position:absolute;background-color:transparent;z-index:5;transition:background .5s linear;-webkit-transition:background 1.5s linear}ion-content .loading-page.hidden{background-color:rgba(var(--ion-color-primary),0)}ion-content ion-card{z-index:9;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content ion-card ion-card-header{display:block}ion-content ion-card ion-card-header ion-card-subtitle,ion-content ion-card ion-card-header ion-card-title{display:block;width:100%}ion-content ion-card.main{min-width:240px;max-width:400px;margin-left:auto;margin-right:auto}ion-content ion-card.welcome{background-color:var(--ion-card-background-color)}ion-content ion-card.welcome .button-divider{margin-top:16px}ion-content ion-card.welcome img{max-width:250px}ion-content .history-container{margin-left:auto;margin-right:auto}ion-content .history-container ion-card{display:inline-block;box-sizing:border-box;z-index:8;min-width:240px;max-width:400px;width:100%;margin-left:auto;margin-right:auto;background-color:var(--ion-card-background-color);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}ion-content .history-container ion-card ion-card-header ion-card-subtitle{height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle button[float-start]{--mdc-icon-button-state-layer-size: 40px;padding:8px;z-index:99;margin:0}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label{line-height:40px}ion-content .history-container ion-card ion-card-header ion-card-subtitle ion-label[float-end]{padding-right:16px;font-weight:400}ion-content .history-container ion-card ion-card-header ion-card-title ion-item{width:100%;--ion-item-background: $transparent;--ion-item-icon-color: var(--ion-color-primary);--ion-item-text-color: var(--ion-color-primary)}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-header ion-card-title ion-item mat-icon[slot=start]{margin-right:unset;margin-inline-end:16px!important;color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor}ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-text,ion-content .history-container ion-card ion-card-header ion-card-title ion-item ion-label{color:var(--ion-item-text-color)!important;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}ion-content .history-container ion-card ion-card-content ion-list{--ion-item-background: var(--ion-color-transparent)}ion-content .history-container ion-card ion-card-content ion-list ion-item{--ion-item-icon-color: var(--ion-color-dark);--ion-item-text-color: var(--ion-color-dark)}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-icon[slot=start],ion-content .history-container ion-card ion-card-content ion-list ion-item mat-icon[slot=start]{color:var(--ion-item-icon-color)!important;fill:currentColor;stroke:currentColor;margin-right:unset;margin-inline-end:16px!important}ion-content .history-container ion-card ion-card-content ion-list ion-item ion-text,ion-content .history-container ion-card ion-card-content ion-list ion-item ion-label{color:var(--ion-item-text-color)!important}ion-content .bottom-banner{--ion-card-background-color: rgba(var(--ion-background-color-rgb), .5);background-color:var(--ion-card-background-color);min-width:240px;z-index:0;border-radius:4px;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);margin:16px}ion-content .bottom-banner img.logo{max-height:50px;margin-left:8px}ion-content .bottom-banner ion-list-header{min-height:30px}ion-content .bottom-banner ion-item{--min-height: 28px}ion-content .bottom-banner ion-item ion-label{margin-top:3px!important;margin-bottom:3px!important}ion-content ion-text{text-align:center}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:calc(100% - 20px);max-width:100%;margin-left:10px;margin-right:10px}ion-content ion-card h1{margin-top:0;font-size:20px}ion-content ion-card ion-card-content ion-button{margin-top:8px}ion-content .bottom-banner.floating{display:block;position:unset}ion-content .bottom-banner img.logo{max-height:30px}}@media screen and (max-width: 767px) and (min-width: 576px){ion-content{min-height:555px}ion-content .bottom-banner img.logo{max-height:40px}}@media screen and (min-width: 768px){ion-content{min-height:calc(100% - var(--bottom-banner-height))}}@media screen and (min-width: 1200px){ion-content ion-col.feed{height:fit-content;max-height:calc(100vh - var(--ion-toolbar-height) - var(--bottom-banner-height) - var(--ion-padding) * 2);padding-inline-end:calc(var(--ion-padding) - 10px);overflow:hidden}ion-content .bottom-banner.floating{position:fixed;left:0;right:0;bottom:0;overflow-y:auto;max-height:var(--bottom-banner-height);margin-top:0}}.content-credits{float:right}.content-credits.floating{float:unset;position:fixed;bottom:0;right:var(--scrollbar-width, 0)}.content-credits ion-text{padding-inline-start:4px;padding-inline-end:4px;font-size:.7rem;background-color:rgba(var(--ion-background-color-rgb),.5);color:rgba(var(--ion-text-color-rgb),.7)}@media screen and (min-width: 992px){.left-border{border-left:1px solid var(--ion-color-medium)}}\n"] }]
424
427
  }], ctorParameters: () => [{ type: i1.AccountService }, { type: i2.ModalController }, { type: i3.TranslateService }, { type: i2.ToastController }, { type: i4.ConfigService }, { type: i5.PlatformService }, { type: i0.ChangeDetectorRef }, { type: i6.NetworkService }, { type: i7.LocalSettingsService }, { type: i24.Environment, decorators: [{
425
428
  type: Inject,
426
429
  args: [ENVIRONMENT]
@@ -441,4 +444,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
441
444
  type: ViewChild,
442
445
  args: [IonContent, { static: true }]
443
446
  }] } });
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9ob21lL2hvbWUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaG9tZS9ob21lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLGNBQWMsRUFHZCxRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQW9DLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQVcsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHM0UsT0FBTyxFQUFFLFdBQVcsRUFBK0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUs1RixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFhLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBb0IsTUFBTSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3BILE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRyxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFbkYsT0FB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OzswQkFBSSxNQUFNOzJCQUFDLGVBQWU7eUNBZkksT0FBTztzQkFBL0MsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbkNvbnRlbnQsIE1vZGFsQ29udHJvbGxlciwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUmVnaXN0ZXJNb2RhbCB9IGZyb20gJy4uL3JlZ2lzdGVyL3JlZ2lzdGVyLm1vZGFsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IEFjY291bnQsIGFjY291bnRUb1N0cmluZyB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2FjY291bnQubW9kZWwnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBEZXBhcnRtZW50IH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZGVwYXJ0bWVudC5tb2RlbCc7XG5pbXBvcnQgeyBBUFBfTE9DQUxFUywgTG9jYWxlQ29uZmlnLCBMb2NhbFNldHRpbmdzIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvc2V0dGluZ3MubW9kZWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXRmb3JtU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BsYXRmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXBwQXV0aE1vZGFsIH0gZnJvbSAnLi4vYXV0aC9hdXRoLm1vZGFsJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW1zIH0gZnJvbSAnLi4vbWVudS9tZW51Lm1vZGVsJztcbmltcG9ydCB7IFNob3dUb2FzdE9wdGlvbnMsIFRvYXN0cyB9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdC90b2FzdHMnO1xuaW1wb3J0IHsgZmFkZUluQW5pbWF0aW9uLCBzbGlkZUluQW5pbWF0aW9uLCBzbGlkZVVwRG93bkFuaW1hdGlvbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcbmltcG9ydCB7IGlzTmlsT3JCbGFuaywgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgSGlzdG9yeVBhZ2VSZWZlcmVuY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9oaXN0b3J5Lm1vZGVsJztcbmltcG9ydCB7IENPUkVfQ09ORklHX09QVElPTlMgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHsgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IEltYWdlc1V0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvaW1hZ2VzLnV0aWxzJztcbmltcG9ydCB7IFVyaVV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvdXJpLnV0aWxzJztcbmltcG9ydCB7IFBlZXIgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9wZWVyLm1vZGVsJztcbmltcG9ydCB7IEFwcE1hcmtkb3duTW9kYWwgfSBmcm9tICcuLi8uLi9zaGFyZWQvbWFya2Rvd24vbWFya2Rvd24ubW9kYWwnO1xuaW1wb3J0IHsgU09DSUFMX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vLi4vc29jaWFsL2NvbmZpZy9zb2NpYWwuY29uZmlnJztcbmltcG9ydCB7IEZlZWRzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc29jaWFsL2ZlZWQvZmVlZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIEBwYXJhbSBmaWxlc1xuICogQGRlcHJlY2F0ZWQgdXNlIGBnZXRSYW5kb21JbWFnZVdpdGhDcmVkaXQoKWAgaW5zdGVhZFxuICoqL1xuZXhwb3J0IGNvbnN0IGdldFJhbmRvbUltYWdlID0gSW1hZ2VzVXRpbHMuZ2V0UmFuZG9tSW1hZ2U7XG5leHBvcnQgY29uc3QgZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0ID0gSW1hZ2VzVXRpbHMuZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0O1xuXG5leHBvcnQgY29uc3QgQVBQX0hPTUVfQlVUVE9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJTWVudUl0ZW1bXT4oJ2hvbWVCdXR0b24nKTtcblxuZXhwb3J0IGNvbnN0IEFQUF9IT01FX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJSG9tZVBhZ2VDb25maWc+KCdob21lQ29uZmlnJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhvbWVQYWdlQ29uZmlnIHtcbiAgc2hvd05vdGlmaWNhdGlvbkljb24/OiBib29sZWFuIHwgJ21vYmlsZScgfCAnZGVza3RvcCc7XG4gIGF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbj86IGJvb2xlYW4gfCAnbW9iaWxlJyB8ICdkZXNrdG9wJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb21lUGFnZVN0YXRlIHtcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgc2hvd1NwaW5uZXI6IGJvb2xlYW47XG4gIHNob3dQYXJ0bmVyQmFubmVyOiBib29sZWFuO1xuICBzaG93TGVnYWxJbmZvcm1hdGlvbjogYm9vbGVhbjtcbiAgc2hvd0luc3RhbGxMaW5rczogYm9vbGVhbjtcbiAgcGFnZUhpc3Rvcnk6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW107XG4gIGRhcmtNb2RlOiBib29sZWFuO1xuICBoYXNGZWVkOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcGFnZS1ob21lJyxcbiAgdGVtcGxhdGVVcmw6ICdob21lLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ob21lLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIHNsaWRlVXBEb3duQW5pbWF0aW9uLCBzbGlkZUluQW5pbWF0aW9uXSxcbn0pXG5leHBvcnQgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBSeFN0YXRlPEhvbWVQYWdlU3RhdGU+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2NvbmZpZzogQ29uZmlndXJhdGlvbjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVidWc6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2JpbGU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93QWNjb3VudEJ1dHRvbjogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWNjb3VudE5hbWUgPSAnJztcbiAgcHJvdGVjdGVkIGlzTG9naW46IGJvb2xlYW47XG4gIHByb3RlY3RlZCBsb2dvOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYXBwTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgaXNXZWI6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjYW5SZWdpc3RlcjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnRlbnRTdHlsZTogYW55O1xuICBwcm90ZWN0ZWQgY29udGVudENyZWRpdHM6IHN0cmluZztcbiAgcHJvdGVjdGVkIGxlZ2FsSW5mb3JtYXRpb246IElNZW51SXRlbVtdO1xuICBwcm90ZWN0ZWQgd2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9mZmxpbmU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBzaG93Tm90aWZpY2F0aW9uSWNvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHNob3dGZWVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBmZWVkVXJsczogc3RyaW5nW107XG4gIHByb3RlY3RlZCBmZWVkTWF4QWdlSW5Nb250aHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGZlZWRNYXhDb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gIHByb3RlY3RlZCBoYXNTY3JvbGxiYXIgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgbG9hZGluZyQgPSB0aGlzLnNlbGVjdCgnbG9hZGluZycpO1xuICBwcm90ZWN0ZWQgJHBhcnRuZXJzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEZXBhcnRtZW50W10+KG51bGwpO1xuICBwcm90ZWN0ZWQgJGZpbHRlcmVkQnV0dG9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SU1lbnVJdGVtW10+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBkYXJrTW9kZSQgPSB0aGlzLnNlbGVjdCgnZGFya01vZGUnKTtcbiAgcHJvdGVjdGVkIHBhZ2VIaXN0b3J5JCA9IHRoaXMuc2VsZWN0KCdwYWdlSGlzdG9yeScpO1xuICBwcm90ZWN0ZWQgaGFzRmVlZCQgPSB0aGlzLnNlbGVjdCgnaGFzRmVlZCcpO1xuXG4gIHNldCBwYWdlSGlzdG9yeSh2YWx1ZTogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXSkge1xuICAgIHRoaXMuc2V0KCdwYWdlSGlzdG9yeScsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBwYWdlSGlzdG9yeSgpOiBIaXN0b3J5UGFnZVJlZmVyZW5jZVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3BhZ2VIaXN0b3J5Jyk7XG4gIH1cblxuICBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdsb2FkaW5nJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdsb2FkaW5nJyk7XG4gIH1cblxuICBzZXQgc2hvd1NwaW5uZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd1NwaW5uZXInLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd1NwaW5uZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzaG93U3Bpbm5lcicpO1xuICB9XG5cbiAgc2V0IHNob3dQYXJ0bmVyQmFubmVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ3Nob3dQYXJ0bmVyQmFubmVyJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dQYXJ0bmVyQmFubmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2hvd1BhcnRuZXJCYW5uZXInKTtcbiAgfVxuXG4gIHNldCBzaG93TGVnYWxJbmZvcm1hdGlvbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdzaG93TGVnYWxJbmZvcm1hdGlvbicsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93TGVnYWxJbmZvcm1hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Nob3dMZWdhbEluZm9ybWF0aW9uJyk7XG4gIH1cblxuICBzZXQgc2hvd0luc3RhbGxMaW5rcyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdzaG93SW5zdGFsbExpbmtzJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dJbnN0YWxsTGlua3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzaG93SW5zdGFsbExpbmtzJyk7XG4gIH1cblxuICBzZXQgZGFya01vZGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnZGFya01vZGUnLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgZGFya01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdkYXJrTW9kZScpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdGhpcy50cmFuc2xhdGUuZGVmYXVsdExhbmcgfHwgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlO1xuICB9XG5cbiAgZ2V0IHBhcnRuZXJCYW5uZXJTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0xlZ2FsSW5mb3JtYXRpb24gPyA4IDogMTI7XG4gIH1cblxuICBAVmlld0NoaWxkKElvbkNvbnRlbnQsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRlbnQ6IElvbkNvbnRlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHB1YmxpYyBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBASW5qZWN0KEFQUF9MT0NBTEVTKSBwcm90ZWN0ZWQgbG9jYWxlczogTG9jYWxlQ29uZmlnW10sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfSE9NRV9CVVRUT05TKSBwcm90ZWN0ZWQgYnV0dG9uczogSU1lbnVJdGVtW10sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfSE9NRV9DT05GSUcpIHByb3RlY3RlZCBjb25maWc6IElIb21lUGFnZUNvbmZpZ1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2V0KDxQYXJ0aWFsPEhvbWVQYWdlU3RhdGU+PntcbiAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICBzaG93UGFydG5lckJhbm5lcjogZmFsc2UsXG4gICAgICBzaG93U3Bpbm5lcjogIXRoaXMucGxhdGZvcm0uc3RhcnRlZCxcbiAgICAgIGRhcmtNb2RlOiB0aGlzLnNldHRpbmdzLmlzRGFya01vZGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZScpO1xuICAgIHRoaXMucGxhdGZvcm0ucmVhZHkoKS50aGVuKCgpID0+IHRoaXMuc3RhcnQoKSk7XG4gICAgdGhpcy5zaG93QWNjb3VudEJ1dHRvbiA9IGVudmlyb25tZW50LmFjY291bnQ/LnNob3dBY2NvdW50QnV0dG9uID8/IHRydWU7XG5cbiAgICB0aGlzLmNvbm5lY3QoJ2RhcmtNb2RlJywgdGhpcy5zZXR0aW5ncy5kYXJrTW9kZSQpO1xuXG4gICAgLy8gREVWXG4gICAgdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkgLy8gw4l2aXRlIGxlcyBhcHBlbHMgdHJvcCBmcsOpcXVlbnRzXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hlY2tTY3JvbGxiYXIoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYXN5bmMgbG9naW4oKSB7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBBcHBBdXRoTW9kYWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyKCkge1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbEN0cmwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogUmVnaXN0ZXJNb2RhbCxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIGxvZ291dChldmVudDogYW55KSB7XG4gICAgYXdhaXQgdGhpcy5hY2NvdW50U2VydmljZS5sb2dvdXQoKTtcblxuICAgIC8vIElmIHdhcyBvZmZsaW5lLCB0cnkgdG8gcmVjb25uZWN0IChiZWNhdXNlIGNhbiBiZSBhIGZvcmNlZCBvZmZsaW5lIG1vZGUpXG4gICAgaWYgKHRoaXMub2ZmbGluZSkge1xuICAgICAgYXdhaXQgdGhpcy50cnlPbmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VMYW5ndWFnZShsb2NhbGU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0dGluZ3MuYXBwbHkoeyBsb2NhbGUgfSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFnZVBhdGgoaW5kZXg6IG51bWJlciwgcGFnZTogSGlzdG9yeVBhZ2VSZWZlcmVuY2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYWdlPy5wYXRoO1xuICB9XG5cbiAgdHJ5T25saW5lKCkge1xuICAgIHRoaXMud2FpdGluZ05ldHdvcmsgPSB0cnVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLm5ldHdvcmtcbiAgICAgIC50cnlPbmxpbmUoe1xuICAgICAgICBzaG93TG9hZGluZ1RvYXN0OiBmYWxzZSxcbiAgICAgICAgc2hvd09ubGluZVRvYXN0OiB0cnVlLFxuICAgICAgICBzaG93T2ZmbGluZVRvYXN0OiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMud2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgc3RhcnQoKSB7XG4gICAgYXdhaXQgdGhpcy5hY2NvdW50U2VydmljZS5yZWFkeSgpO1xuXG4gICAgdGhpcy5pc0xvZ2luID0gdGhpcy5hY2NvdW50U2VydmljZS5pc0xvZ2luKCk7XG4gICAgaWYgKHRoaXMuaXNMb2dpbikge1xuICAgICAgdGhpcy5vbkxvZ2luKHRoaXMuYWNjb3VudFNlcnZpY2UuYWNjb3VudCk7XG4gICAgfVxuXG4gICAgdGhpcy5vZmZsaW5lID0gdGhpcy5uZXR3b3JrLm9mZmxpbmU7XG5cbiAgICAvLyBMaXN0ZW4gbG9naW4vbG9nb3V0IGV2ZW50c1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnN1YnNjcmliZSgoYWNjb3VudCkgPT4gdGhpcy5vbkxvZ2luKGFjY291bnQpKSk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9nb3V0LnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uTG9nb3V0KCkpKTtcblxuICAgIC8vIExpc3RlbiBwb2QgY29uZmlnXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YnNjcmliZSgoY29uZmlnKSA9PiB0aGlzLm9uQ29uZmlnTG9hZGVkKGNvbmZpZykpKTtcblxuICAgIC8vIExpc3RlbiBzZXR0aW5ncyBjaGFuZ2VzXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gQWRkIGEgZGVsYXksIHRvIGF2b2lkIHRvIGFwcGx5IGNoYW5nZXMgdG8gb2Z0ZW5cbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgICAvLyBTdGFydCB3aXRoIGN1cnJlbnQgc2V0dGluZ3NcbiAgICAgICAgICBzdGFydFdpdGgoYXdhaXQgdGhpcy5zZXR0aW5ncy5yZWFkeSgpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlcykgPT4gdGhpcy5vblNldHRpbmdzQ2hhbmdlZChyZXMpKVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gbmV0d29yayBjaGFuZ2VzXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubmV0d29yay5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIC8vZGVib3VuY2VUaW1lKDQ1MCksXG4gICAgICAgICAgLy90YXAoKCkgPT4gdGhpcy53YWl0aW5nTmV0d29yayA9IGZhbHNlKSxcbiAgICAgICAgICBtYXAoKGNvbm5lY3Rpb25UeXBlKSA9PiBjb25uZWN0aW9uVHlwZSA9PT0gJ25vbmUnKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgob2ZmbGluZSkgPT4ge1xuICAgICAgICAgIHRoaXMub2ZmbGluZSA9IG9mZmxpbmU7XG4gICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKSB7XG4gICAgYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNvbmZpZ0xvYWRlZChjb25maWc6IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbaG9tZV0gQXBwbHlpbmcgY29uZmlndXJhdGlvbicsIGNvbmZpZyk7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuXG4gICAgdGhpcy5hcHBOYW1lID0gY29uZmlnLmxhYmVsIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEFwcE5hbWUgfHwgJ1NVTUFSaVMnO1xuICAgIHRoaXMubG9nbyA9IGNvbmZpZy5sYXJnZUxvZ28gfHwgY29uZmlnLnNtYWxsTG9nbyB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMuaXNXZWIgPSB0aGlzLnBsYXRmb3JtLmlzV2ViKCk7XG4gICAgdGhpcy5jYW5SZWdpc3RlciA9IGNvbmZpZy5nZXRQcm9wZXJ0eUFzQm9vbGVhbihDT1JFX0NPTkZJR19PUFRJT05TLlJFR0lTVFJBVElPTl9FTkFCTEUpO1xuXG4gICAgY29uc3Qgc2hvd05vdGlmaWNhdGlvbkljb25CeUNvbmZpZyA9XG4gICAgICB0aGlzLmNvbmZpZz8uc2hvd05vdGlmaWNhdGlvbkljb24gPT09IHRydWUgfHxcbiAgICAgICh0aGlzLmNvbmZpZz8uc2hvd05vdGlmaWNhdGlvbkljb24gPT09ICdtb2JpbGUnICYmIHRoaXMubW9iaWxlKSB8fFxuICAgICAgKHRoaXMuY29uZmlnPy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9PT0gJ2Rlc2t0b3AnICYmICF0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9IHNob3dOb3RpZmljYXRpb25JY29uQnlDb25maWcgJiYgdGhpcy5fY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKFNPQ0lBTF9DT05GSUdfT1BUSU9OUy5FTkFCTEVfTk9USUZJQ0FUSU9OX0lDT05TKTtcbiAgICB0aGlzLmF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbiA9XG4gICAgICB0aGlzLmNvbmZpZz8uYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5jb25maWc/LmF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbiA9PT0gJ21vYmlsZScgJiYgdGhpcy5tb2JpbGUpIHx8XG4gICAgICAodGhpcy5jb25maWc/LmF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbiA9PT0gJ2Rlc2t0b3AnICYmICF0aGlzLm1vYmlsZSkgfHxcbiAgICAgIGZhbHNlO1xuXG4gICAgLy8gRmVlZFxuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuY3VycmVudExvY2FsZTtcbiAgICB0aGlzLnNob3dGZWVkID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX0VOQUJMRSkgfHwgISF0aGlzLmVudmlyb25tZW50Py5mZWVkPy5qc29uRmVlZDtcbiAgICB0aGlzLmZlZWRVcmxzID0gY29uZmlnLmdldFByb3BlcnR5QXNTdHJpbmdzKENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX1VSTFMpID8/IHRoaXMuZW52aXJvbm1lbnQ/LmZlZWQ/Lmpzb25GZWVkPy5bbG9jYWxlXTtcbiAgICB0aGlzLmZlZWRNYXhBZ2VJbk1vbnRocyA9XG4gICAgICBjb25maWcuZ2V0UHJvcGVydHlBc0ludChDT1JFX0NPTkZJR19PUFRJT05TLkhPTUVfRkVFRF9NQVhfQUdFX0lOX01PTlRIUykgPz8gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8ubWF4QWdlSW5Nb250aHMgPz8gLTE7XG4gICAgdGhpcy5mZWVkTWF4Q29udGVudExlbmd0aCA9XG4gICAgICBjb25maWcuZ2V0UHJvcGVydHlBc0ludChDT1JFX0NPTkZJR19PUFRJT05TLkhPTUVfRkVFRF9NQVhfQ09OVEVOVF9MRU5HVEgpID8/IHRoaXMuZW52aXJvbm1lbnQ/LmZlZWQ/Lm1heENvbnRlbnRMZW5ndGggPz8gLTE7XG5cbiAgICAvLyBMZWdhbCBpbmZvcm1hdGlvblxuICAgIHRoaXMubGVnYWxJbmZvcm1hdGlvbiA9IFtcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6ICdIT01FLlBSSVZBQ1lfUE9MSUNZJyxcbiAgICAgICAgcGF0aDogdGhpcy5fY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuUFJJVkFDWV9QT0xJQ1lfVVJMKSA/PyAodGhpcy5lbnZpcm9ubWVudC5wcml2YWN5UG9saWN5VXJsIGFzIHN0cmluZyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0aXRsZTogJ0hPTUUuVEVSTVNfT0ZfVVNFJyxcbiAgICAgICAgcGF0aDogdGhpcy5fY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuVEVSTVNfT0ZfVVNFX1VSTCkgPz8gKHRoaXMuZW52aXJvbm1lbnQudGVybXNPZlVzZVVybCBhcyBzdHJpbmcpLFxuICAgICAgfSxcbiAgICBdLmZpbHRlcigoaXRlbSkgPT4gaXNOb3ROaWxPckJsYW5rKGl0ZW0ucGF0aCkpO1xuICAgIHRoaXMuc2hvd0xlZ2FsSW5mb3JtYXRpb24gPSBpc05vdEVtcHR5QXJyYXkodGhpcy5sZWdhbEluZm9ybWF0aW9uKTtcblxuICAgIGNvbnN0IHBhcnRuZXJzID0gKHRoaXMuX2NvbmZpZy5wYXJ0bmVycyB8fCBbXSkuZmlsdGVyKChwKSA9PiBwICYmIHAubG9nbyk7XG4gICAgdGhpcy4kcGFydG5lcnMubmV4dChwYXJ0bmVycyk7XG4gICAgdGhpcy5zaG93UGFydG5lckJhbm5lciA9IHBhcnRuZXJzLmxlbmd0aCA+IDA7XG4gICAgLy8gVE9ETyBsb2FkIGluc3RhbGwgbGlua3NcblxuICAgIC8vIElmIG5vdCBhbHJlYWR5IHNldCwgY29tcHV0ZSB0aGUgYmFja2dyb3VuZCBpbWFnZVxuICAgIGlmICghdGhpcy5jb250ZW50U3R5bGUpIHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZXMgPSAoY29uZmlnLmJhY2tncm91bmRJbWFnZXMgfHwgW10pXG4gICAgICAgIC8vIEZpbHRlciBvbiBub3QgbmlsLCBiZWNhdXNlIGNhbiBvY2N1ciBpZiBkZXRlY3RlZCBoYXMgbm90IGV4aXN0cyAoc2VlIGNvbmZpZy1zZXJ2aWNlLmpzKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChpbWcpID0+XG4gICAgICAgICAgICBpc05vdE5pbChpbWcpICYmXG4gICAgICAgICAgICAvLyBJZiBvZmZsaW5lLCBmaWx0ZXIgb24gbG9jYWwgZGF0YVVSTCBpbWFnZVxuICAgICAgICAgICAgKCF0aGlzLm9mZmxpbmUgfHwgIWltZy5zdGFydHNXaXRoKCdodHRwJykpXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEJhY2tncm91bmQgaW1hZ2UgZm91bmQ6IHNlbGVjdCBvbmUgcmFuZG9tbHlcbiAgICAgIGlmIChiYWNrZ3JvdW5kSW1hZ2VzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB7IGltYWdlLCBjcmVkaXRzIH0gPSBnZXRSYW5kb21JbWFnZVdpdGhDcmVkaXQoYmFja2dyb3VuZEltYWdlcyk7XG4gICAgICAgIHRoaXMuY29udGVudFN0eWxlID0gaW1hZ2UgPyB7ICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke2ltYWdlfSlgIH0gOiB7fTtcbiAgICAgICAgdGhpcy5jb250ZW50Q3JlZGl0cyA9IGNyZWRpdHMgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJpbWFyeUNvbG9yID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQ09MT1JfUFJJTUFSWSkgfHwgJ3ZhcigtLWlvbi1jb2xvci1wcmltYXJ5KSc7XG4gICAgICAgIHRoaXMuY29udGVudFN0eWxlID0gKHByaW1hcnlDb2xvciAmJiB7ICdiYWNrZ3JvdW5kLWNvbG9yJzogcHJpbWFyeUNvbG9yIH0pIHx8IHt9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hlY2tTY3JvbGxiYXIoKTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIElmIGZpcnN0IGxvYWQsIGhpZGUgdGhlIGxvYWRpbmcgaW5kaWNhdG9yXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZXR0aW5nc0NoYW5nZWQoc2V0dGluZ3M6IExvY2FsU2V0dGluZ3MpIHtcbiAgICBpZiAoc2V0dGluZ3MucGFnZUhpc3RvcnkgIT09IHRoaXMucGFnZUhpc3RvcnkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tob21lXSBQYWdlIGhpc3RvcnkgbG9hZGVkJyk7XG4gICAgICB0aGlzLnBhZ2VIaXN0b3J5ID0gc2V0dGluZ3MucGFnZUhpc3RvcnkgfHwgW107XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uTG9naW4oYWNjb3VudDogQWNjb3VudCkge1xuICAgIGlmICghYWNjb3VudCkgcmV0dXJuOyAvLyBTa2lwXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbaG9tZV0gTG9nZ2VkIGFjY291bnQ6ICcsIGFjY291bnQpO1xuICAgIHRoaXMuaXNMb2dpbiA9IHRydWU7XG4gICAgdGhpcy5hY2NvdW50TmFtZSA9IGFjY291bnRUb1N0cmluZyhhY2NvdW50KTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKGFjY291bnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Mb2dvdXQoKSB7XG4gICAgdGhpcy5pc0xvZ2luID0gZmFsc2U7XG4gICAgdGhpcy5hY2NvdW50TmFtZSA9ICcnO1xuICAgIHRoaXMucGFnZUhpc3RvcnkgPSBbXTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoQnV0dG9ucyhhY2NvdW50PzogQWNjb3VudCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnKSByZXR1cm47IC8vIFNraXAgKHdhaXRpbmcgY29uZmlnIHRvIGJlIGxvYWRlZClcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2hvbWVdIFJlZnJlc2hpbmcgYnV0dG9ucy4uLicpO1xuXG4gICAgYWNjb3VudCA9IGFjY291bnQgfHwgdGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50O1xuICAgIGNvbnN0IGZpbHRlcmVkQnV0dG9ucyA9ICh0aGlzLmJ1dHRvbnMgfHwgW10pXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICBNZW51SXRlbXMuY2hlY2tJZlZpc2libGUoaXRlbSwgYWNjb3VudCwgdGhpcy5fY29uZmlnLCB7XG4gICAgICAgICAgaXNMb2dpbjogdGhpcy5pc0xvZ2luLFxuICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgICAgIGxvZ1ByZWZpeDogJ1tob21lXScsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIFJlcGxhY2UgdGl0bGUgdXNpbmcgcHJvcGVydGllc1xuICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGl0ZW0udGl0bGVQcm9wZXJ0eSkgJiYgdGhpcy5fY29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9jb25maWcucHJvcGVydGllc1tpdGVtLnRpdGxlUHJvcGVydHldO1xuICAgICAgICAgIGlmICh0aXRsZSkgcmV0dXJuIHsgLi4uaXRlbSwgdGl0bGUgfTsgLy8gQ3JlYXRlIGEgY29weSwgdG8ga2VlcCB0aGUgb3JpZ2luYWwgaXRlbS50aXRsZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLiRmaWx0ZXJlZEJ1dHRvbnMubmV4dChmaWx0ZXJlZEJ1dHRvbnMpO1xuICB9XG5cbiAgYXN5bmMgb3Blbk1hcmtkb3duTW9kYWwoZXZlbnQ/OiBFdmVudCwgaXRlbTogSU1lbnVJdGVtID0gbnVsbCkge1xuICAgIGlmIChpc05pbE9yQmxhbmsoaXRlbT8ucGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlc29sdmUgcmVsYXRpdmUgcGF0aFxuICAgIGxldCB1cmwgPSBpdGVtLnBhdGg7XG4gICAgaWYgKHRoaXMubmV0d29yay5wZWVyICYmICh1cmwuc3RhcnRzV2l0aCgnLi8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnLycpKSkge1xuICAgICAgdXJsID0gUGVlci5wYXRoKHRoaXMubmV0d29yay5wZWVyLCB1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhGaWxlbmFtZSA9IFVyaVV0aWxzLmdldEZpbGVuYW1lKHVybCk7XG4gICAgY29uc3QgaXNNYXJrZG93bkZpbGUgPSBwYXRoRmlsZW5hbWUuZW5kc1dpdGgoJy5tZCcpO1xuXG4gICAgLy8gT3BlbiBhcyBtYXJrZG93blxuICAgIGlmIChpc01hcmtkb3duRmlsZSkge1xuICAgICAgYXdhaXQgQXBwTWFya2Rvd25Nb2RhbC5zaG93KHRoaXMubW9kYWxDdHJsLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGl0ZW0udGl0bGUsIGl0ZW0udGl0bGVBcmdzKSxcbiAgICAgICAgc3JjOiB1cmwsXG4gICAgICAgIGVuYWJsZU5hdmlnYXRpb25IaXN0b3J5OiBmYWxzZSxcbiAgICAgICAgY2FuUHJpbnQ6ICF0aGlzLm1vYmlsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPcGVuIGFzIGV4dGVybmFsIGxpbmtcbiAgICAgIGF3YWl0IHRoaXMucGxhdGZvcm0ub3Blbih1cmwpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB0b2dnbGVEYXJrTW9kZSgpIHtcbiAgICBjb25zdCBlbmFibGUgPSAhdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlO1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoeyBkYXJrTW9kZTogZW5hYmxlLCBhdXRvRGFya01vZGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZVBhZ2VIaXN0b3J5KHBhdGg6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MucmVtb3ZlUGFnZUhpc3RvcnkocGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tTY3JvbGxiYXIoKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWwgPSBhd2FpdCB0aGlzLmNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIHRoaXMuaGFzU2Nyb2xsYmFyID0gc2Nyb2xsRWwuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgLy8gREVCVUdcbiAgICBjb25zb2xlLmRlYnVnKCdbaG9tZV0gQ2hlY2sgc2Nyb2xsYmFyJywgdGhpcy5oYXNTY3JvbGxiYXIpO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0RmVlZChmZWVkOiBGZWVkc0NvbXBvbmVudCkge1xuICAgIGlmICghZmVlZCkgcmV0dXJuO1xuICAgIHRoaXMuY29ubmVjdCgnaGFzRmVlZCcsIGZlZWQuaGFzRmVlZHMkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFwcC10b29sYmFyIFtjYW5Hb0JhY2tdPVwiZmFsc2VcIiB2aXNpYmxlLXhzIHZpc2libGUtc20gdmlzaWJsZS1tb2JpbGU+XG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgQGlmIChzaG93Tm90aWZpY2F0aW9uSWNvbikge1xuICAgICAgPGFwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uIFthdXRvSGlkZV09XCJhdXRvSGlkZU5vdGlmaWNhdGlvbkljb25cIj48L2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uPlxuICAgIH1cblxuICAgIDwhLS0gZGFyayBtb2RlIChpZiBhbGxvdyBieSB0aGUgZW52aXJvbm1lbnQgdG9rZW4pIC0tPlxuICAgIEBpZiAoc2V0dGluZ3MuYWxsb3dEYXJrTW9kZSkge1xuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZURhcmtNb2RlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBbbmFtZV09XCIoZGFya01vZGUkIHwgcHVzaCkgPyAnc3VubnknIDogJ21vb24nXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG5cbiAgICA8IS0tIENoYW5nZSBsb2NhbGUgYnV0dG9uIC0tPlxuICAgIDxpb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJsb2NhbGVNZW51XCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImxhbmd1YWdlXCI+PC9pb24taWNvbj5cbiAgICA8L2lvbi1idXR0b24+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2FwcC10b29sYmFyPlxuXG48IS0tIENoYW5nZSBsb2NhbGUgbWVudSAtLT5cbjxtYXQtbWVudSAjbG9jYWxlTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50PlxuICAgIEBmb3IgKGl0ZW0gb2YgbG9jYWxlczsgdHJhY2sgaXRlbS5rZXkpIHtcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hhbmdlTGFuZ3VhZ2UoaXRlbS5rZXkpXCI+XG4gICAgICAgIDwhLS08bWF0LWljb24+e3sgY3VycmVudExvY2FsZSA9PT0gaXRlbS5rZXkgPyAnY2hlY2ttYXJrJyA6IHVuZGVmaW5lZCB9fTwvbWF0LWljb24+LS0+XG4gICAgICAgIDxpb24tbGFiZWw+e3sgaXRlbS52YWx1ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPGlvbi1jb250ZW50IFtuZ1N0eWxlXT1cImNvbnRlbnRTdHlsZVwiIFtjbGFzcy5oYXMtc2Nyb2xsYmFyXT1cImhhc1Njcm9sbGJhclwiIG5vLXBhZGRpbmcteHM+XG4gIDwhLS0gbG9hZGluZyBzcGlubmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1wYWdlXCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIShsb2FkaW5nJCB8IHB1c2gpXCI+XG4gICAgQGlmIChzaG93U3Bpbm5lcikge1xuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj5cbiAgICAgICAgPHAgW2lubmVySFRNTF09XCInQ09NTU9OLkxPQURJTkdfRE9UUycgfCB0cmFuc2xhdGVcIj48L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMSBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMiBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlNCBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMyBzay1jdWJlXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGVza3RvcDogdHJhbnNsdWNlbnQgdG9wIHRvb2xiYXIgLS0+XG4gIEBpZiAoIW1vYmlsZSkge1xuICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICA8aW9uLXRvb2xiYXIgY29sb3I9XCJ0cmFhbnNwYXJlbnRcIiB0cmFuc2x1Y2VudD5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24tbWVudS10b2dnbGU+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgZmlsbD1cImNsZWFyXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cIm1lbnVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLW1lbnUtdG9nZ2xlPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuXG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgQGlmIChzaG93Tm90aWZpY2F0aW9uSWNvbikge1xuICAgICAgICAgICAgPGFwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uXG4gICAgICAgICAgICAgIFtzdHlsZV09XCInaW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIHVucmVhZENvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAgICAgICBbYXV0b0hpZGVdPVwiYXV0b0hpZGVOb3RpZmljYXRpb25JY29uXCJcbiAgICAgICAgICAgID48L2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gZGFyayBtb2RlIChpZiBhbGxvdyBieSB0aGUgZW52aXJvbm1lbnQgdG9rZW4pIC0tPlxuICAgICAgICAgIEBpZiAoc2V0dGluZ3MuYWxsb3dEYXJrTW9kZSkge1xuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGFya01vZGUoKVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInSE9NRS5CVE5fREFSS19NT0RFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgW25hbWVdPVwiKGRhcmtNb2RlJCB8IHB1c2gpID8gJ21vb24nIDogJ3N1bm55J1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gY2hhbmdlIGxvY2FsZSBidXR0b24gLS0+XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibG9jYWxlTWVudVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ1NFVFRJTkdTLkxPQ0FMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImxhbmd1YWdlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBJbnN0YWxsIChhbmQgdXBncmFkZSkgY2FyZCAtLT5cbiAgPGFwcC1pbnN0YWxsLXVwZ3JhZGUtY2FyZCBbaXNMb2dpbl09XCJpc0xvZ2luXCIgW3Nob3dJbnN0YWxsQnV0dG9uXT1cInRydWVcIj48L2FwcC1pbnN0YWxsLXVwZ3JhZGUtY2FyZD5cblxuICBAaWYgKCEobG9hZGluZyQgfCBwdXNoKSkge1xuICAgIEBsZXQgaGFzRmVlZCA9IGhhc0ZlZWQkIHwgYXN5bmM7XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiMFwiIFtzaXplWGxdPVwiaGFzRmVlZCA/IDMgOiAwXCI+PC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8IS0tIFdlbGNvbWUgY2FyZCAtLT5cbiAgICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJtYWluIHdlbGNvbWUgaW9uLXBhZGRpbmcgaW9uLXRleHQtY2VudGVyIGlvbi1hbGlnbi1zZWxmLWNlbnRlclwiIEBmYWRlSW5BbmltYXRpb24+XG4gICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGUgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzV2ViXCIgW2lubmVySFRNTF09XCInSE9NRS5XRUxDT01FX1dFQicgfCB0cmFuc2xhdGU6IHsgYXBwTmFtZTogYXBwTmFtZSB9XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzV2ViXCIgW2lubmVySFRNTF09XCInSE9NRS5XRUxDT01FX0FQUCcgfCB0cmFuc2xhdGU6IHsgYXBwTmFtZTogYXBwTmFtZSB9XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGUgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvblwiPjwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJsb2dvXCIgW2F0dHIuc3JjXT1cImxvZ29cIiBhbHQ9XCJMb2dvXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgPCEtLSByZWdpc3RlciBoZWxwIHRleHQgLS0+XG4gICAgICAgICAgICAgIDxpb24tdGV4dCAqbmdJZj1cIiFpc0xvZ2luICYmIGNhblJlZ2lzdGVyXCI+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkhPTUUuUkVHSVNURVJfSEVMUDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlvbi1wYWRkaW5nLXRvcFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gSWYgTk9UIGxvZ2luIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2dpbjsgZWxzZSBsb2dpbkJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwiY2FuUmVnaXN0ZXJcIiBleHBhbmQ9XCJibG9ja1wiIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwicmVnaXN0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SE9NRS5CVE5fUkVHSVNURVI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGNvbG9yPVwibGlnaHRcIiBbcm91dGVyTGlua109XCJbJy8nXVwiIChjbGljayk9XCJsb2dpbigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5BVVRILkJUTl9MT0dJTjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gSWYgdXNlciBsb2dpbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvZ2luQnV0dG9ucz5cbiAgICAgICAgICAgICAgICAgIDwhLS0gRmVhdHVyZSBidXR0b25zIC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcnhJZj1cIiRmaWx0ZXJlZEJ1dHRvbnM7IGxldCBidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0ucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQ9XCJibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInRlcnRpYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJEaXJlY3Rpb249XCJyb290XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpb24tZmxvYXQtc3RhcnRcIiAqbmdJZj1cIml0ZW0uaWNvblwiIFtuYW1lXT1cIml0ZW0uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpb24tZmxvYXQtc3RhcnRcIiAqbmdJZj1cIml0ZW0ubWF0SWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+e3sgJ0hPTUUuQlROX0RBVEFfRU5UUlknIHwgdHJhbnNsYXRlOiB7IG5hbWU6IChpdGVtLnRpdGxlIHwgdHJhbnNsYXRlKSB9IH19PC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpdmlkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLnBhdGggJiYgIWl0ZW0uYWN0aW9uXCIgW2NsYXNzXT1cIml0ZW0uY3NzQ2xhc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPnt7IGl0ZW0udGl0bGUgfX0mbmJzcDs8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLTxwICpuZ0lmPVwiYnV0dG9ucy5sZW5ndGhcIiBjbGFzcz1cInZpc2libGUtbW9iaWxlXCI+Jm5ic3A7PC9wPi0tPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwic2hvd0FjY291bnRCdXR0b25cIiBleHBhbmQ9XCJibG9ja1wiIGNvbG9yPVwic2Vjb25kYXJ5XCIgW3JvdXRlckxpbmtdPVwiWycvYWNjb3VudCddXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImlvbi1mbG9hdC1zdGFydFwiIG5hbWU9XCJwZXJzb24tY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IHRyYW5zbGF0ZT5IT01FLkJUTl9NWV9BQ0NPVU5UPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgPHAgaGlkZGVuLXhzIGhpZGRlbi1zbSBoaWRkZW4tbW9iaWxlPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHRcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIidIT01FLk5PVF9USElTX0FDQ09VTlRfUVVFU1RJT04nIHwgdHJhbnNsYXRlOiB7IGRpc3BsYXlOYW1lOiBhY2NvdW50TmFtZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwibG9nb3V0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5IT01FLkJUTl9ESVNDT05ORUNUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIwXCIgW3NpemVYbF09XCJoYXNGZWVkID8gMSA6IDBcIj48L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIFtjbGFzcy5mZWVkXT1cImhhc0ZlZWRcIiBbc2l6ZV09XCJoYXNGZWVkID8gMTIgOiAwXCIgW3NpemVYbF09XCJoYXNGZWVkID8gNCA6IDBcIj5cbiAgICAgICAgICBAaWYgKHNob3dGZWVkKSB7XG4gICAgICAgICAgICBAaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgICA8YXBwLWZlZWRcbiAgICAgICAgICAgICAgICAjZmVlZFxuICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIFt1cmxzXT1cImZlZWRVcmxzXCJcbiAgICAgICAgICAgICAgICBbbWF4QWdlSW5Nb250aHNdPVwiZmVlZE1heEFnZUluTW9udGhzXCJcbiAgICAgICAgICAgICAgICBbbWF4Q29udGVudExlbmd0aF09XCJmZWVkTWF4Q29udGVudExlbmd0aFwiXG4gICAgICAgICAgICAgICAgKG5nSW5pdCk9XCJpbml0RmVlZChmZWVkKVwiXG4gICAgICAgICAgICAgICAgQGZhZGVJbkFuaW1hdGlvblxuICAgICAgICAgICAgICA+PC9hcHAtZmVlZD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8YXBwLWZlZWRcbiAgICAgICAgICAgICAgICAjZmVlZFxuICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIFtkZWJ1Z109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3VybHNdPVwiZmVlZFVybHNcIlxuICAgICAgICAgICAgICAgIFttYXhBZ2VJbk1vbnRoc109XCJmZWVkTWF4QWdlSW5Nb250aHNcIlxuICAgICAgICAgICAgICAgIFttYXhDb250ZW50TGVuZ3RoXT1cImZlZWRNYXhDb250ZW50TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAobmdJbml0KT1cImluaXRGZWVkKGZlZWQpXCJcbiAgICAgICAgICAgICAgICBAc2xpZGVJbkFuaW1hdGlvblxuICAgICAgICAgICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgICAgICAgICAgPjwvYXBwLWZlZWQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgPC9pb24tZ3JpZD5cblxuICAgIDwhLS0gUGFnZSBoaXN0b3J5IC0tPlxuICAgIEBsZXQgcGFnZUhpc3RvcnkgPSBpc0xvZ2luICYmIChwYWdlSGlzdG9yeSQgfCBwdXNoKTtcbiAgICBAaWYgKHBhZ2VIaXN0b3J5IHwgaXNOb3RFbXB0eUFycmF5KSB7XG4gICAgICA8aW9uLWdyaWQgY2xhc3M9XCJoaXN0b3J5LWNvbnRhaW5lciBpb24tYWxpZ24tc2VsZi1jZW50ZXJcIj5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgQGZvciAocGFnZSBvZiBwYWdlSGlzdG9yeTsgdHJhY2sgcGFnZS5wYXRoKSB7XG4gICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLXhsPVwiXCIgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkIGNsYXNzPVwiaW9uLWFsaWduLXNlbGYtc3RhcnQgaW9uLXRleHQtc3RhcnRcIiBAZmFkZUluQW5pbWF0aW9uPlxuICAgICAgICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPCEtLSB0b3AgYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhZ2VIaXN0b3J5KHBhZ2UucGF0aClcIlxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0IGlvbi1uby1tYXJnaW4gY2xvc2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtpbm5lckhUTUxdPVwicGFnZS5zdWJ0aXRsZSB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tZmxvYXQtZW5kXCIgW3RpdGxlXT1cInBhZ2UudGltZSB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7e3sgcGFnZS50aW1lIHwgZGF0ZUZyb21Ob3cgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2FyZC1zdWJ0aXRsZT5cblxuICAgICAgICAgICAgICAgICAgPCEtLSBtYWluIHBhZ2UgLS0+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGUgY2xhc3M9XCJpb24tbm8tbWFyZ2luIGlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGRldGFpbD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcHBhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTF4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJwYWdlLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckRpcmVjdGlvbj1cInJvb3RcIlxuICAgICAgICAgICAgICAgICAgICAgIGxpbmVzPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIHBhZ2UgaWNvbi0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cInBhZ2UuaWNvblwiIHNsb3Q9XCJzdGFydFwiIFtuYW1lXT1cInBhZ2UuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwicGFnZS5tYXRJY29uXCIgc2xvdD1cInN0YXJ0XCI+e3sgcGFnZS5tYXRJY29uIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJwcmltYXJ5XCIgW2lubmVySFRNTF09XCJwYWdlLnRpdGxlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBjaGlsZHJlbiBwYWdlcyAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKHBhZ2UuY2hpbGRyZW4gfCBpc05vdEVtcHR5QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcgaW9uLXBhZGRpbmctc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjaGlsZFBhZ2Ugb2YgcGFnZS5jaGlsZHJlbjsgdHJhY2sgY2hpbGRQYWdlLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiY2hpbGRQYWdlLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXJEaXJlY3Rpb249XCJyb290XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBwYWdlIGljb24tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiY2hpbGRQYWdlLmljb25cIiBzbG90PVwic3RhcnRcIiBjb2xvcj1cImRhcmtcIiBbbmFtZV09XCJjaGlsZFBhZ2UuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNoaWxkUGFnZS5tYXRJY29uXCIgc2xvdD1cInN0YXJ0XCIgY29sb3I9XCJkYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hpbGRQYWdlLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFya1wiIFtpbm5lckhUTUxdPVwiY2hpbGRQYWdlLnRpdGxlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1ncmlkPlxuICAgIH1cblxuICAgIDwhLS0gQm90dG9tIGJhbm5lciAtLT5cbiAgICBAaWYgKHNob3dQYXJ0bmVyQmFubmVyIHx8IHNob3dMZWdhbEluZm9ybWF0aW9uKSB7XG4gICAgICA8aW9uLWdyaWRcbiAgICAgICAgY2xhc3M9XCJib3R0b20tYmFubmVyIGlvbi10ZXh0LWNlbnRlclwiXG4gICAgICAgIFtjbGFzcy5mbG9hdGluZ109XCIhbW9iaWxlICYmIChwYWdlSGlzdG9yeSB8IGlzRW1wdHlBcnJheSlcIlxuICAgICAgICBAZmFkZUluQW5pbWF0aW9uXG4gICAgICA+XG4gICAgICAgIDxpb24tcm93PlxuICAgICAgICAgIDwhLS0gcGFydG5lcnMgbG9nb3MgLS0+XG4gICAgICAgICAgQGlmIChzaG93UGFydG5lckJhbm5lcikge1xuICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgW3NpemVMZ109XCJwYXJ0bmVyQmFubmVyU2l6ZVwiIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgIEBpZiAoc2hvd0xlZ2FsSW5mb3JtYXRpb24pIHtcbiAgICAgICAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJsZWdhbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxpc3QtaGVhZGVyPnt7ICdIT01FLlBBUlRORVJTJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPCEtLSBwYXJ0bmVycyAtLT5cbiAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiAkcGFydG5lcnMgfCBhc3luYzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IGl0ZW0uc2l0ZVVybCB9fVwiPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImxvZ29cIiBzcmM9XCJ7eyBpdGVtLmxvZ28gfX1cIiBhbHQ9XCJ7eyBpdGVtLmxhYmVsIH19XCIgW3RpdGxlXT1cIml0ZW0ubGFiZWxcIiAvPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gbGVnYWwgaW5mb3JtYXRpb24gLS0+XG4gICAgICAgICAgQGlmIChzaG93TGVnYWxJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS1zbT1cIjZcIiBzaXplLWxnPVwiNFwiIFtjbGFzcy5sZWZ0LWJvcmRlcl09XCJzaG93UGFydG5lckJhbm5lclwiPlxuICAgICAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJsZWdhbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1saXN0LWhlYWRlciBjbGFzcz1cImlvbi10ZXh0LWxlZnRcIj57eyAnSE9NRS5MRUdBTF9JTkZPUk1BVElPTicgfCB0cmFuc2xhdGUgfX08L2lvbi1saXN0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGxlZ2FsSW5mb3JtYXRpb247IHRyYWNrIGl0ZW0ucGF0aCkge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtIChjbGljayk9XCJvcGVuTWFya2Rvd25Nb2RhbCgkZXZlbnQsIGl0ZW0pXCIgbGluZXM9XCJub25lXCIgW2J1dHRvbl09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIHwgdHJhbnNsYXRlOiBpdGVtLnRpdGxlQXJncyB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgIEBpZiAoc2hvd0luc3RhbGxMaW5rcykge1xuICAgICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLWxnPVwiM1wiIG9mZnNldC1sZz1cIjlcIiBbY2xhc3MubGVmdC1ib3JkZXJdPVwic2hvd1BhcnRuZXJCYW5uZXJcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJsZWdhbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWxpc3QtaGVhZGVyPnt7ICdIT01FLklOU1RBTExfQVBQJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPIC0tPlxuICAgICAgICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWdyaWQ+XG4gICAgfVxuICB9XG5cbiAgPCEtLSBpbWFnZSBjcmVkaXRzIC0tPlxuICBAaWYgKGNvbnRlbnRDcmVkaXRzIHwgaXNOb3ROaWxPckJsYW5rKSB7XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY3JlZGl0c1wiIFtjbGFzcy5mbG9hdGluZ109XCIhbW9iaWxlXCI+XG4gICAgICA8aW9uLXRleHQ+e3sgY29udGVudENyZWRpdHMgfX08L2lvbi10ZXh0PlxuICAgIDwvZGl2PlxuICB9XG48L2lvbi1jb250ZW50PlxuIl19
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9ob21lL2hvbWUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvaG9tZS9ob21lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLGNBQWMsRUFHZCxRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQW9DLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQVcsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHM0UsT0FBTyxFQUFFLFdBQVcsRUFBK0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUs1RixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFhLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRSxPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNwSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEcsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHMUU7OztJQUdJO0FBQ0osTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7QUFDekQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsV0FBVyxDQUFDLHdCQUF3QixDQUFDO0FBRTdFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFjLFlBQVksQ0FBQyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBa0IsWUFBWSxDQUFDLENBQUM7QUF5QmpGLE1BQU0sT0FBTyxRQUFTLFNBQVEsT0FBc0I7SUF1R3hDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0Q7SUFDQTtJQUN3QjtJQUNBO0lBRWdCO0lBbEh6QyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNuQyxPQUFPLENBQWdCO0lBRVosS0FBSyxDQUFVO0lBQ2YsTUFBTSxDQUFVO0lBQ2hCLGlCQUFpQixDQUFVO0lBRXBDLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsT0FBTyxDQUFVO0lBQ2pCLElBQUksQ0FBUztJQUNiLFdBQVcsQ0FBUztJQUNwQixPQUFPLENBQVM7SUFDaEIsS0FBSyxDQUFVO0lBQ2YsV0FBVyxDQUFVO0lBQ3JCLFlBQVksQ0FBTTtJQUNsQixjQUFjLENBQVM7SUFDdkIsZ0JBQWdCLENBQWM7SUFDOUIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixPQUFPLENBQVU7SUFDakIsb0JBQW9CLENBQVU7SUFDOUIsd0JBQXdCLENBQVU7SUFDbEMsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixRQUFRLENBQVc7SUFDbkIsa0JBQWtCLENBQVM7SUFDM0Isb0JBQW9CLENBQVM7SUFDN0IsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUVaLE9BQU8sQ0FBYTtJQUM3QixRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7SUFDcEQsZ0JBQWdCLEdBQUcsSUFBSSxlQUFlLENBQWEsU0FBUyxDQUFDLENBQUM7SUFDOUQsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFNUMsSUFBSSxXQUFXLENBQUMsS0FBNkI7UUFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBYztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxLQUFjO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksaUJBQWlCLENBQUMsS0FBYztRQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxLQUFjO1FBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLGdCQUFnQixDQUFDLEtBQWM7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQWM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztJQUNwRyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFd0MsT0FBTyxDQUFhO0lBRTdELFlBQ1UsY0FBOEIsRUFDOUIsU0FBMEIsRUFDMUIsU0FBMkIsRUFDM0IsZUFBZ0MsRUFDaEMsYUFBNEIsRUFDNUIsUUFBeUIsRUFDekIsRUFBcUIsRUFDdEIsT0FBdUIsRUFDdkIsUUFBOEIsRUFDTixXQUF3QixFQUN4QixPQUF1QixFQUNoQixPQUFvQixFQUNYLE1BQXVCO1FBRXRFLEtBQUssRUFBRSxDQUFDO1FBZEEsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzFCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUNOLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBRVAsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFHdEUsSUFBSSxDQUFDLEdBQUcsQ0FBeUI7WUFDL0IsT0FBTyxFQUFFLElBQUk7WUFDYixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVO1NBQ25DLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksSUFBSSxDQUFDO1FBRXhFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQsTUFBTTtRQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxRQUFRO1FBQ04sU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7YUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtDQUFrQzthQUMxRCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELFdBQVc7UUFDVCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxZQUFZO1NBQ3hCLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDeEMsU0FBUyxFQUFFLGFBQWE7WUFDeEIsZUFBZSxFQUFFLEtBQUs7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBVTtRQUNyQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFbkMsMEVBQTBFO1FBQzFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsSUFBMEI7UUFDbkQsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxPQUFPO2FBQ1QsU0FBUyxDQUFDO1lBQ1QsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixlQUFlLEVBQUUsSUFBSTtZQUNyQixnQkFBZ0IsRUFBRSxLQUFLO1NBQ3hCLENBQUM7YUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDZCQUE2QjtJQUVuQixLQUFLLENBQUMsS0FBSztRQUNuQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUVwQyw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RixvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUTthQUNuQixJQUFJO1FBQ0gsa0RBQWtEO1FBQ2xELFlBQVksQ0FBQyxHQUFHLENBQUM7UUFDakIsOEJBQThCO1FBQzlCLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FDdkM7YUFDQSxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNuRCxDQUFDO1FBRUYseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQjthQUNoQyxJQUFJO1FBQ0gsb0JBQW9CO1FBQ3BCLHlDQUF5QztRQUN6QyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsS0FBSyxNQUFNLENBQUMsRUFDbEQsb0JBQW9CLEVBQUUsQ0FDdkI7YUFDQSxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFUyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQXNCO1FBQzlDLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVTLGNBQWMsQ0FBQyxNQUFxQjtRQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXRCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUM7UUFDNUUsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDO1FBQzlELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV4RixNQUFNLDRCQUE0QixHQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixLQUFLLElBQUk7WUFDMUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQy9ELENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLDRCQUE0QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMvSSxJQUFJLENBQUMsd0JBQXdCO1lBQzNCLElBQUksQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLEtBQUssSUFBSTtnQkFDOUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHdCQUF3QixLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNuRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDckUsS0FBSyxDQUFDO1FBRVIsT0FBTztRQUNQLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDO1FBQ3hILElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlILElBQUksQ0FBQyxrQkFBa0I7WUFDckIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLDJCQUEyQixDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNILElBQUksQ0FBQyxvQkFBb0I7WUFDdkIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLDRCQUE0QixDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFOUgsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRztZQUN0QjtnQkFDRSxLQUFLLEVBQUUscUJBQXFCO2dCQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsSUFBSyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUEyQjthQUN4SDtZQUNEO2dCQUNFLEtBQUssRUFBRSxtQkFBbUI7Z0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBd0I7YUFDbkg7U0FDRixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbkUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLDBCQUEwQjtRQUUxQixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztnQkFDdEQsMEZBQTBGO2lCQUN6RixNQUFNLENBQ0wsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNOLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ2IsNENBQTRDO2dCQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDN0MsQ0FBQztZQUVKLDhDQUE4QztZQUM5QyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6RSxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDdEMsQ0FBQztZQUVELHVCQUF1QjtpQkFDbEIsQ0FBQztnQkFDSixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLDBCQUEwQixDQUFDO2dCQUN6RyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkYsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQXVCO1FBQ2pELElBQUksUUFBUSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFFUyxPQUFPLENBQUMsT0FBZ0I7UUFDaEMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsT0FBTztRQUM3QixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFFBQVE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRVMsY0FBYyxDQUFDLE9BQWlCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sQ0FBQyxxQ0FBcUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUU5RCxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ2pELE1BQU0sZUFBZSxHQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7YUFDckQsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDZixTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFNBQVMsRUFBRSxRQUFRO1NBQ3BCLENBQUMsQ0FDSDthQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1osaUNBQWlDO1lBQ2pDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN4RSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ3pCLG9HQUFvRztvQkFDcEcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLE9BQWtCLElBQUk7UUFDM0QsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU87UUFFckMsd0JBQXdCO1FBQ3hCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkUsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwRCxtQkFBbUI7UUFDbkIsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUN6RCxHQUFHLEVBQUUsR0FBRztnQkFDUix1QkFBdUIsRUFBRSxLQUFLO2dCQUM5QixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTTthQUN2QixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLHdCQUF3QjtZQUN4QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRVMsS0FBSyxDQUFDLGNBQWM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUN6QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRVMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQVk7UUFDNUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFUyxLQUFLLENBQUMsY0FBYztRQUM1QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUUvRCxRQUFRO1FBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFUyxRQUFRLENBQUMsSUFBb0I7UUFDckMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRVMsWUFBWTtRQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBbGJVLFFBQVEsNlNBZ0hULFdBQVcsYUFDWCxXQUFXLGFBQ0MsZ0JBQWdCLDZCQUNoQixlQUFlOzRGQW5IMUIsUUFBUSw4RkFvR1IsVUFBVSxxRkMvS3ZCLDhvZUF5V0EsK3dZRGhTYyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsQ0FBQzs7NEZBRTFELFFBQVE7a0JBUHBCLFNBQVM7K0JBQ0UsZUFBZSxtQkFHUix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLENBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDOzswQkFrSGxFLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDbkMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlO3lDQWZJLE9BQU87c0JBQS9DLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJb25Db250ZW50LCBNb2RhbENvbnRyb2xsZXIsIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFJlZ2lzdGVyTW9kYWwgfSBmcm9tICcuLi9yZWdpc3Rlci9yZWdpc3Rlci5tb2RhbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY2NvdW50LCBhY2NvdW50VG9TdHJpbmcgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9hY2NvdW50Lm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRGVwYXJ0bWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2RlcGFydG1lbnQubW9kZWwnO1xuaW1wb3J0IHsgQVBQX0xPQ0FMRVMsIExvY2FsZUNvbmZpZywgTG9jYWxTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3NldHRpbmdzLm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFwcEF1dGhNb2RhbCB9IGZyb20gJy4uL2F1dGgvYXV0aC5tb2RhbCc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBJTWVudUl0ZW0sIE1lbnVJdGVtLCBNZW51SXRlbXMgfSBmcm9tICcuLi9tZW51L21lbnUubW9kZWwnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBmYWRlSW5BbmltYXRpb24sIHNsaWRlSW5BbmltYXRpb24sIHNsaWRlVXBEb3duQW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgaXNOaWxPckJsYW5rLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBIaXN0b3J5UGFnZVJlZmVyZW5jZSB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2hpc3RvcnkubW9kZWwnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBSeFN0YXRlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgSW1hZ2VzVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9pbWFnZXMudXRpbHMnO1xuaW1wb3J0IHsgVXJpVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS91cmkudXRpbHMnO1xuaW1wb3J0IHsgUGVlciB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3BlZXIubW9kZWwnO1xuaW1wb3J0IHsgQXBwTWFya2Rvd25Nb2RhbCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXJrZG93bi9tYXJrZG93bi5tb2RhbCc7XG5pbXBvcnQgeyBTT0NJQUxfQ09ORklHX09QVElPTlMgfSBmcm9tICcuLi8uLi9zb2NpYWwvY29uZmlnL3NvY2lhbC5jb25maWcnO1xuaW1wb3J0IHsgRmVlZHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zb2NpYWwvZmVlZC9mZWVkLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQHBhcmFtIGZpbGVzXG4gKiBAZGVwcmVjYXRlZCB1c2UgYGdldFJhbmRvbUltYWdlV2l0aENyZWRpdCgpYCBpbnN0ZWFkXG4gKiovXG5leHBvcnQgY29uc3QgZ2V0UmFuZG9tSW1hZ2UgPSBJbWFnZXNVdGlscy5nZXRSYW5kb21JbWFnZTtcbmV4cG9ydCBjb25zdCBnZXRSYW5kb21JbWFnZVdpdGhDcmVkaXQgPSBJbWFnZXNVdGlscy5nZXRSYW5kb21JbWFnZVdpdGhDcmVkaXQ7XG5cbmV4cG9ydCBjb25zdCBBUFBfSE9NRV9CVVRUT05TID0gbmV3IEluamVjdGlvblRva2VuPElNZW51SXRlbVtdPignaG9tZUJ1dHRvbicpO1xuXG5leHBvcnQgY29uc3QgQVBQX0hPTUVfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPElIb21lUGFnZUNvbmZpZz4oJ2hvbWVDb25maWcnKTtcblxuZXhwb3J0IGludGVyZmFjZSBJSG9tZVBhZ2VDb25maWcge1xuICBzaG93Tm90aWZpY2F0aW9uSWNvbj86IGJvb2xlYW4gfCAnbW9iaWxlJyB8ICdkZXNrdG9wJztcbiAgYXV0b0hpZGVOb3RpZmljYXRpb25JY29uPzogYm9vbGVhbiB8ICdtb2JpbGUnIHwgJ2Rlc2t0b3AnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvbWVQYWdlU3RhdGUge1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBzaG93U3Bpbm5lcjogYm9vbGVhbjtcbiAgc2hvd1BhcnRuZXJCYW5uZXI6IGJvb2xlYW47XG4gIHNob3dMZWdhbEluZm9ybWF0aW9uOiBib29sZWFuO1xuICBzaG93SW5zdGFsbExpbmtzOiBib29sZWFuO1xuICBwYWdlSGlzdG9yeTogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXTtcbiAgZGFya01vZGU6IGJvb2xlYW47XG4gIGhhc0ZlZWQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wYWdlLWhvbWUnLFxuICB0ZW1wbGF0ZVVybDogJ2hvbWUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hvbWUuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW2ZhZGVJbkFuaW1hdGlvbiwgc2xpZGVVcERvd25BbmltYXRpb24sIHNsaWRlSW5BbmltYXRpb25dLFxufSlcbmV4cG9ydCBjbGFzcyBIb21lUGFnZSBleHRlbmRzIFJ4U3RhdGU8SG9tZVBhZ2VTdGF0ZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBDb25maWd1cmF0aW9uO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWJ1ZzogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vYmlsZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dBY2NvdW50QnV0dG9uOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhY2NvdW50TmFtZSA9ICcnO1xuICBwcm90ZWN0ZWQgaXNMb2dpbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGxvZ286IHN0cmluZztcbiAgcHJvdGVjdGVkIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBhcHBOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBpc1dlYjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNhblJlZ2lzdGVyOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY29udGVudFN0eWxlOiBhbnk7XG4gIHByb3RlY3RlZCBjb250ZW50Q3JlZGl0czogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbGVnYWxJbmZvcm1hdGlvbjogSU1lbnVJdGVtW107XG4gIHByb3RlY3RlZCB3YWl0aW5nTmV0d29yayA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgb2ZmbGluZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHNob3dOb3RpZmljYXRpb25JY29uOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgYXV0b0hpZGVOb3RpZmljYXRpb25JY29uOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgc2hvd0ZlZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGZlZWRVcmxzOiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIGZlZWRNYXhBZ2VJbk1vbnRoczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZmVlZE1heENvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGhhc1Njcm9sbGJhciA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBidXR0b25zOiBNZW51SXRlbVtdO1xuICBwcm90ZWN0ZWQgbG9hZGluZyQgPSB0aGlzLnNlbGVjdCgnbG9hZGluZycpO1xuICBwcm90ZWN0ZWQgJHBhcnRuZXJzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEZXBhcnRtZW50W10+KG51bGwpO1xuICBwcm90ZWN0ZWQgJGZpbHRlcmVkQnV0dG9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGRhcmtNb2RlJCA9IHRoaXMuc2VsZWN0KCdkYXJrTW9kZScpO1xuICBwcm90ZWN0ZWQgcGFnZUhpc3RvcnkkID0gdGhpcy5zZWxlY3QoJ3BhZ2VIaXN0b3J5Jyk7XG4gIHByb3RlY3RlZCBoYXNGZWVkJCA9IHRoaXMuc2VsZWN0KCdoYXNGZWVkJyk7XG5cbiAgc2V0IHBhZ2VIaXN0b3J5KHZhbHVlOiBIaXN0b3J5UGFnZVJlZmVyZW5jZVtdKSB7XG4gICAgdGhpcy5zZXQoJ3BhZ2VIaXN0b3J5JywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IHBhZ2VIaXN0b3J5KCk6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW10ge1xuICAgIHJldHVybiB0aGlzLmdldCgncGFnZUhpc3RvcnknKTtcbiAgfVxuXG4gIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ2xvYWRpbmcnLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2xvYWRpbmcnKTtcbiAgfVxuXG4gIHNldCBzaG93U3Bpbm5lcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdzaG93U3Bpbm5lcicsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG93U3Bpbm5lcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Nob3dTcGlubmVyJyk7XG4gIH1cblxuICBzZXQgc2hvd1BhcnRuZXJCYW5uZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldCgnc2hvd1BhcnRuZXJCYW5uZXInLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd1BhcnRuZXJCYW5uZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzaG93UGFydG5lckJhbm5lcicpO1xuICB9XG5cbiAgc2V0IHNob3dMZWdhbEluZm9ybWF0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ3Nob3dMZWdhbEluZm9ybWF0aW9uJywgKCkgPT4gdmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNob3dMZWdhbEluZm9ybWF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldCgnc2hvd0xlZ2FsSW5mb3JtYXRpb24nKTtcbiAgfVxuXG4gIHNldCBzaG93SW5zdGFsbExpbmtzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXQoJ3Nob3dJbnN0YWxsTGlua3MnLCAoKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd0luc3RhbGxMaW5rcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Nob3dJbnN0YWxsTGlua3MnKTtcbiAgfVxuXG4gIHNldCBkYXJrTW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0KCdkYXJrTW9kZScsICgpID0+IHZhbHVlKTtcbiAgfVxuXG4gIGdldCBkYXJrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2RhcmtNb2RlJyk7XG4gIH1cblxuICBnZXQgY3VycmVudExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyB8fCB0aGlzLnRyYW5zbGF0ZS5kZWZhdWx0TGFuZyB8fCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGU7XG4gIH1cblxuICBnZXQgcGFydG5lckJhbm5lclNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaG93TGVnYWxJbmZvcm1hdGlvbiA/IDggOiAxMjtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoSW9uQ29udGVudCwgeyBzdGF0aWM6IHRydWUgfSkgY29udGVudDogSW9uQ29udGVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtU2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHVibGljIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBJbmplY3QoQVBQX0xPQ0FMRVMpIHByb3RlY3RlZCBsb2NhbGVzOiBMb2NhbGVDb25maWdbXSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9IT01FX0JVVFRPTlMpIGJ1dHRvbnM6IElNZW51SXRlbVtdLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0hPTUVfQ09ORklHKSBwcm90ZWN0ZWQgY29uZmlnOiBJSG9tZVBhZ2VDb25maWdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNldCg8UGFydGlhbDxIb21lUGFnZVN0YXRlPj57XG4gICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgc2hvd1BhcnRuZXJCYW5uZXI6IGZhbHNlLFxuICAgICAgc2hvd1NwaW5uZXI6ICF0aGlzLnBsYXRmb3JtLnN0YXJ0ZWQsXG4gICAgICBkYXJrTW9kZTogdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5idXR0b25zID0gKGJ1dHRvbnMgfHwgW10pPy5tYXAoaXRlbSA9PiBNZW51SXRlbS5mcm9tT2JqZWN0KGl0ZW0pKTtcbiAgICB0aGlzLm1vYmlsZSA9IHRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZScpO1xuICAgIHRoaXMucGxhdGZvcm0ucmVhZHkoKS50aGVuKCgpID0+IHRoaXMuc3RhcnQoKSk7XG4gICAgdGhpcy5zaG93QWNjb3VudEJ1dHRvbiA9IGVudmlyb25tZW50LmFjY291bnQ/LnNob3dBY2NvdW50QnV0dG9uID8/IHRydWU7XG5cbiAgICB0aGlzLmNvbm5lY3QoJ2RhcmtNb2RlJywgdGhpcy5zZXR0aW5ncy5kYXJrTW9kZSQpO1xuXG4gICAgLy8gREVWXG4gICAgdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkgLy8gw4l2aXRlIGxlcyBhcHBlbHMgdHJvcCBmcsOpcXVlbnRzXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hlY2tTY3JvbGxiYXIoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYXN5bmMgbG9naW4oKSB7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBBcHBBdXRoTW9kYWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyKCkge1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbEN0cmwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogUmVnaXN0ZXJNb2RhbCxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIGFzeW5jIGxvZ291dChldmVudDogYW55KSB7XG4gICAgYXdhaXQgdGhpcy5hY2NvdW50U2VydmljZS5sb2dvdXQoKTtcblxuICAgIC8vIElmIHdhcyBvZmZsaW5lLCB0cnkgdG8gcmVjb25uZWN0IChiZWNhdXNlIGNhbiBiZSBhIGZvcmNlZCBvZmZsaW5lIG1vZGUpXG4gICAgaWYgKHRoaXMub2ZmbGluZSkge1xuICAgICAgYXdhaXQgdGhpcy50cnlPbmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VMYW5ndWFnZShsb2NhbGU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0dGluZ3MuYXBwbHkoeyBsb2NhbGUgfSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFnZVBhdGgoaW5kZXg6IG51bWJlciwgcGFnZTogSGlzdG9yeVBhZ2VSZWZlcmVuY2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYWdlPy5wYXRoO1xuICB9XG5cbiAgdHJ5T25saW5lKCkge1xuICAgIHRoaXMud2FpdGluZ05ldHdvcmsgPSB0cnVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLm5ldHdvcmtcbiAgICAgIC50cnlPbmxpbmUoe1xuICAgICAgICBzaG93TG9hZGluZ1RvYXN0OiBmYWxzZSxcbiAgICAgICAgc2hvd09ubGluZVRvYXN0OiB0cnVlLFxuICAgICAgICBzaG93T2ZmbGluZVRvYXN0OiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMud2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgc3RhcnQoKSB7XG4gICAgYXdhaXQgdGhpcy5hY2NvdW50U2VydmljZS5yZWFkeSgpO1xuXG4gICAgdGhpcy5pc0xvZ2luID0gdGhpcy5hY2NvdW50U2VydmljZS5pc0xvZ2luKCk7XG4gICAgaWYgKHRoaXMuaXNMb2dpbikge1xuICAgICAgdGhpcy5vbkxvZ2luKHRoaXMuYWNjb3VudFNlcnZpY2UuYWNjb3VudCk7XG4gICAgfVxuXG4gICAgdGhpcy5vZmZsaW5lID0gdGhpcy5uZXR3b3JrLm9mZmxpbmU7XG5cbiAgICAvLyBMaXN0ZW4gbG9naW4vbG9nb3V0IGV2ZW50c1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnN1YnNjcmliZSgoYWNjb3VudCkgPT4gdGhpcy5vbkxvZ2luKGFjY291bnQpKSk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9nb3V0LnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uTG9nb3V0KCkpKTtcblxuICAgIC8vIExpc3RlbiBwb2QgY29uZmlnXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YnNjcmliZSgoY29uZmlnKSA9PiB0aGlzLm9uQ29uZmlnTG9hZGVkKGNvbmZpZykpKTtcblxuICAgIC8vIExpc3RlbiBzZXR0aW5ncyBjaGFuZ2VzXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gQWRkIGEgZGVsYXksIHRvIGF2b2lkIHRvIGFwcGx5IGNoYW5nZXMgdG8gb2Z0ZW5cbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgICAvLyBTdGFydCB3aXRoIGN1cnJlbnQgc2V0dGluZ3NcbiAgICAgICAgICBzdGFydFdpdGgoYXdhaXQgdGhpcy5zZXR0aW5ncy5yZWFkeSgpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlcykgPT4gdGhpcy5vblNldHRpbmdzQ2hhbmdlZChyZXMpKVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gbmV0d29yayBjaGFuZ2VzXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubmV0d29yay5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIC8vZGVib3VuY2VUaW1lKDQ1MCksXG4gICAgICAgICAgLy90YXAoKCkgPT4gdGhpcy53YWl0aW5nTmV0d29yayA9IGZhbHNlKSxcbiAgICAgICAgICBtYXAoKGNvbm5lY3Rpb25UeXBlKSA9PiBjb25uZWN0aW9uVHlwZSA9PT0gJ25vbmUnKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgob2ZmbGluZSkgPT4ge1xuICAgICAgICAgIHRoaXMub2ZmbGluZSA9IG9mZmxpbmU7XG4gICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKSB7XG4gICAgYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNvbmZpZ0xvYWRlZChjb25maWc6IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbaG9tZV0gQXBwbHlpbmcgY29uZmlndXJhdGlvbicsIGNvbmZpZyk7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuXG4gICAgdGhpcy5hcHBOYW1lID0gY29uZmlnLmxhYmVsIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEFwcE5hbWUgfHwgJ1NVTUFSaVMnO1xuICAgIHRoaXMubG9nbyA9IGNvbmZpZy5sYXJnZUxvZ28gfHwgY29uZmlnLnNtYWxsTG9nbyB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMuaXNXZWIgPSB0aGlzLnBsYXRmb3JtLmlzV2ViKCk7XG4gICAgdGhpcy5jYW5SZWdpc3RlciA9IGNvbmZpZy5nZXRQcm9wZXJ0eUFzQm9vbGVhbihDT1JFX0NPTkZJR19PUFRJT05TLlJFR0lTVFJBVElPTl9FTkFCTEUpO1xuXG4gICAgY29uc3Qgc2hvd05vdGlmaWNhdGlvbkljb25CeUNvbmZpZyA9XG4gICAgICB0aGlzLmNvbmZpZz8uc2hvd05vdGlmaWNhdGlvbkljb24gPT09IHRydWUgfHxcbiAgICAgICh0aGlzLmNvbmZpZz8uc2hvd05vdGlmaWNhdGlvbkljb24gPT09ICdtb2JpbGUnICYmIHRoaXMubW9iaWxlKSB8fFxuICAgICAgKHRoaXMuY29uZmlnPy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9PT0gJ2Rlc2t0b3AnICYmICF0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uSWNvbiA9IHNob3dOb3RpZmljYXRpb25JY29uQnlDb25maWcgJiYgdGhpcy5fY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKFNPQ0lBTF9DT05GSUdfT1BUSU9OUy5FTkFCTEVfTk9USUZJQ0FUSU9OX0lDT05TKTtcbiAgICB0aGlzLmF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbiA9XG4gICAgICB0aGlzLmNvbmZpZz8uYXV0b0hpZGVOb3RpZmljYXRpb25JY29uID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5jb25maWc/LmF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbiA9PT0gJ21vYmlsZScgJiYgdGhpcy5tb2JpbGUpIHx8XG4gICAgICAodGhpcy5jb25maWc/LmF1dG9IaWRlTm90aWZpY2F0aW9uSWNvbiA9PT0gJ2Rlc2t0b3AnICYmICF0aGlzLm1vYmlsZSkgfHxcbiAgICAgIGZhbHNlO1xuXG4gICAgLy8gRmVlZFxuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuY3VycmVudExvY2FsZTtcbiAgICB0aGlzLnNob3dGZWVkID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX0VOQUJMRSkgfHwgISF0aGlzLmVudmlyb25tZW50Py5mZWVkPy5qc29uRmVlZDtcbiAgICB0aGlzLmZlZWRVcmxzID0gY29uZmlnLmdldFByb3BlcnR5QXNTdHJpbmdzKENPUkVfQ09ORklHX09QVElPTlMuSE9NRV9GRUVEX1VSTFMpID8/IHRoaXMuZW52aXJvbm1lbnQ/LmZlZWQ/Lmpzb25GZWVkPy5bbG9jYWxlXTtcbiAgICB0aGlzLmZlZWRNYXhBZ2VJbk1vbnRocyA9XG4gICAgICBjb25maWcuZ2V0UHJvcGVydHlBc0ludChDT1JFX0NPTkZJR19PUFRJT05TLkhPTUVfRkVFRF9NQVhfQUdFX0lOX01PTlRIUykgPz8gdGhpcy5lbnZpcm9ubWVudD8uZmVlZD8ubWF4QWdlSW5Nb250aHMgPz8gLTE7XG4gICAgdGhpcy5mZWVkTWF4Q29udGVudExlbmd0aCA9XG4gICAgICBjb25maWcuZ2V0UHJvcGVydHlBc0ludChDT1JFX0NPTkZJR19PUFRJT05TLkhPTUVfRkVFRF9NQVhfQ09OVEVOVF9MRU5HVEgpID8/IHRoaXMuZW52aXJvbm1lbnQ/LmZlZWQ/Lm1heENvbnRlbnRMZW5ndGggPz8gLTE7XG5cbiAgICAvLyBMZWdhbCBpbmZvcm1hdGlvblxuICAgIHRoaXMubGVnYWxJbmZvcm1hdGlvbiA9IFtcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6ICdIT01FLlBSSVZBQ1lfUE9MSUNZJyxcbiAgICAgICAgcGF0aDogdGhpcy5fY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuUFJJVkFDWV9QT0xJQ1lfVVJMKSA/PyAodGhpcy5lbnZpcm9ubWVudC5wcml2YWN5UG9saWN5VXJsIGFzIHN0cmluZyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0aXRsZTogJ0hPTUUuVEVSTVNfT0ZfVVNFJyxcbiAgICAgICAgcGF0aDogdGhpcy5fY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuVEVSTVNfT0ZfVVNFX1VSTCkgPz8gKHRoaXMuZW52aXJvbm1lbnQudGVybXNPZlVzZVVybCBhcyBzdHJpbmcpLFxuICAgICAgfSxcbiAgICBdLmZpbHRlcigoaXRlbSkgPT4gaXNOb3ROaWxPckJsYW5rKGl0ZW0ucGF0aCkpO1xuICAgIHRoaXMuc2hvd0xlZ2FsSW5mb3JtYXRpb24gPSBpc05vdEVtcHR5QXJyYXkodGhpcy5sZWdhbEluZm9ybWF0aW9uKTtcblxuICAgIGNvbnN0IHBhcnRuZXJzID0gKHRoaXMuX2NvbmZpZy5wYXJ0bmVycyB8fCBbXSkuZmlsdGVyKChwKSA9PiBwICYmIHAubG9nbyk7XG4gICAgdGhpcy4kcGFydG5lcnMubmV4dChwYXJ0bmVycyk7XG4gICAgdGhpcy5zaG93UGFydG5lckJhbm5lciA9IHBhcnRuZXJzLmxlbmd0aCA+IDA7XG4gICAgLy8gVE9ETyBsb2FkIGluc3RhbGwgbGlua3NcblxuICAgIC8vIElmIG5vdCBhbHJlYWR5IHNldCwgY29tcHV0ZSB0aGUgYmFja2dyb3VuZCBpbWFnZVxuICAgIGlmICghdGhpcy5jb250ZW50U3R5bGUpIHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZXMgPSAoY29uZmlnLmJhY2tncm91bmRJbWFnZXMgfHwgW10pXG4gICAgICAgIC8vIEZpbHRlciBvbiBub3QgbmlsLCBiZWNhdXNlIGNhbiBvY2N1ciBpZiBkZXRlY3RlZCBoYXMgbm90IGV4aXN0cyAoc2VlIGNvbmZpZy1zZXJ2aWNlLmpzKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChpbWcpID0+XG4gICAgICAgICAgICBpc05vdE5pbChpbWcpICYmXG4gICAgICAgICAgICAvLyBJZiBvZmZsaW5lLCBmaWx0ZXIgb24gbG9jYWwgZGF0YVVSTCBpbWFnZVxuICAgICAgICAgICAgKCF0aGlzLm9mZmxpbmUgfHwgIWltZy5zdGFydHNXaXRoKCdodHRwJykpXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEJhY2tncm91bmQgaW1hZ2UgZm91bmQ6IHNlbGVjdCBvbmUgcmFuZG9tbHlcbiAgICAgIGlmIChiYWNrZ3JvdW5kSW1hZ2VzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB7IGltYWdlLCBjcmVkaXRzIH0gPSBnZXRSYW5kb21JbWFnZVdpdGhDcmVkaXQoYmFja2dyb3VuZEltYWdlcyk7XG4gICAgICAgIHRoaXMuY29udGVudFN0eWxlID0gaW1hZ2UgPyB7ICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke2ltYWdlfSlgIH0gOiB7fTtcbiAgICAgICAgdGhpcy5jb250ZW50Q3JlZGl0cyA9IGNyZWRpdHMgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJpbWFyeUNvbG9yID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQ09MT1JfUFJJTUFSWSkgfHwgJ3ZhcigtLWlvbi1jb2xvci1wcmltYXJ5KSc7XG4gICAgICAgIHRoaXMuY29udGVudFN0eWxlID0gKHByaW1hcnlDb2xvciAmJiB7ICdiYWNrZ3JvdW5kLWNvbG9yJzogcHJpbWFyeUNvbG9yIH0pIHx8IHt9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hlY2tTY3JvbGxiYXIoKTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIElmIGZpcnN0IGxvYWQsIGhpZGUgdGhlIGxvYWRpbmcgaW5kaWNhdG9yXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZXR0aW5nc0NoYW5nZWQoc2V0dGluZ3M6IExvY2FsU2V0dGluZ3MpIHtcbiAgICBpZiAoc2V0dGluZ3MucGFnZUhpc3RvcnkgIT09IHRoaXMucGFnZUhpc3RvcnkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tob21lXSBQYWdlIGhpc3RvcnkgbG9hZGVkJyk7XG4gICAgICB0aGlzLnBhZ2VIaXN0b3J5ID0gc2V0dGluZ3MucGFnZUhpc3RvcnkgfHwgW107XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uTG9naW4oYWNjb3VudDogQWNjb3VudCkge1xuICAgIGlmICghYWNjb3VudCkgcmV0dXJuOyAvLyBTa2lwXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbaG9tZV0gTG9nZ2VkIGFjY291bnQ6ICcsIGFjY291bnQpO1xuICAgIHRoaXMuaXNMb2dpbiA9IHRydWU7XG4gICAgdGhpcy5hY2NvdW50TmFtZSA9IGFjY291bnRUb1N0cmluZyhhY2NvdW50KTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKGFjY291bnQpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Mb2dvdXQoKSB7XG4gICAgdGhpcy5pc0xvZ2luID0gZmFsc2U7XG4gICAgdGhpcy5hY2NvdW50TmFtZSA9ICcnO1xuICAgIHRoaXMucGFnZUhpc3RvcnkgPSBbXTtcbiAgICB0aGlzLnJlZnJlc2hCdXR0b25zKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoQnV0dG9ucyhhY2NvdW50PzogQWNjb3VudCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnKSByZXR1cm47IC8vIFNraXAgKHdhaXRpbmcgY29uZmlnIHRvIGJlIGxvYWRlZClcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2hvbWVdIFJlZnJlc2hpbmcgYnV0dG9ucy4uLicpO1xuXG4gICAgYWNjb3VudCA9IGFjY291bnQgfHwgdGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50O1xuICAgIGNvbnN0IGZpbHRlcmVkQnV0dG9uczogTWVudUl0ZW1bXSA9ICh0aGlzLmJ1dHRvbnMgfHwgW10pXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICBNZW51SXRlbXMuY2hlY2tJZlZpc2libGUoaXRlbSwgYWNjb3VudCwgdGhpcy5fY29uZmlnLCB7XG4gICAgICAgICAgaXNMb2dpbjogdGhpcy5pc0xvZ2luLFxuICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgICAgIGxvZ1ByZWZpeDogJ1tob21lXScsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIFJlcGxhY2UgdGl0bGUgdXNpbmcgcHJvcGVydGllc1xuICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGl0ZW0udGl0bGVQcm9wZXJ0eSkgJiYgdGhpcy5fY29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9jb25maWcucHJvcGVydGllc1tpdGVtLnRpdGxlUHJvcGVydHldID8/IGl0ZW0udGl0bGU7XG4gICAgICAgICAgaWYgKGl0ZW0udGl0bGUgIT09IHRpdGxlKSB7XG4gICAgICAgICAgICAvLyBDbG9uZSBiZWZvcmUgY2hhbmdpbmcsIHRvIGJlIGFibGUgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdGl0bGUgKGUuZy4gaWYgY29uZmlnIHByb3BlcnR5IGNoYW5nZWQpXG4gICAgICAgICAgICBpdGVtLmNsb25lKCk7XG4gICAgICAgICAgICBpdGVtLnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLiRmaWx0ZXJlZEJ1dHRvbnMubmV4dChmaWx0ZXJlZEJ1dHRvbnMpO1xuICB9XG5cbiAgYXN5bmMgb3Blbk1hcmtkb3duTW9kYWwoZXZlbnQ/OiBFdmVudCwgaXRlbTogSU1lbnVJdGVtID0gbnVsbCkge1xuICAgIGlmIChpc05pbE9yQmxhbmsoaXRlbT8ucGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlc29sdmUgcmVsYXRpdmUgcGF0aFxuICAgIGxldCB1cmwgPSBpdGVtLnBhdGg7XG4gICAgaWYgKHRoaXMubmV0d29yay5wZWVyICYmICh1cmwuc3RhcnRzV2l0aCgnLi8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnLycpKSkge1xuICAgICAgdXJsID0gUGVlci5wYXRoKHRoaXMubmV0d29yay5wZWVyLCB1cmwpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhGaWxlbmFtZSA9IFVyaVV0aWxzLmdldEZpbGVuYW1lKHVybCk7XG4gICAgY29uc3QgaXNNYXJrZG93bkZpbGUgPSBwYXRoRmlsZW5hbWUuZW5kc1dpdGgoJy5tZCcpO1xuXG4gICAgLy8gT3BlbiBhcyBtYXJrZG93blxuICAgIGlmIChpc01hcmtkb3duRmlsZSkge1xuICAgICAgYXdhaXQgQXBwTWFya2Rvd25Nb2RhbC5zaG93KHRoaXMubW9kYWxDdHJsLCB7XG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGl0ZW0udGl0bGUsIGl0ZW0udGl0bGVBcmdzKSxcbiAgICAgICAgc3JjOiB1cmwsXG4gICAgICAgIGVuYWJsZU5hdmlnYXRpb25IaXN0b3J5OiBmYWxzZSxcbiAgICAgICAgY2FuUHJpbnQ6ICF0aGlzLm1vYmlsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPcGVuIGFzIGV4dGVybmFsIGxpbmtcbiAgICAgIGF3YWl0IHRoaXMucGxhdGZvcm0ub3Blbih1cmwpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB0b2dnbGVEYXJrTW9kZSgpIHtcbiAgICBjb25zdCBlbmFibGUgPSAhdGhpcy5zZXR0aW5ncy5pc0RhcmtNb2RlO1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoeyBkYXJrTW9kZTogZW5hYmxlLCBhdXRvRGFya01vZGU6IGZhbHNlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZVBhZ2VIaXN0b3J5KHBhdGg6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MucmVtb3ZlUGFnZUhpc3RvcnkocGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tTY3JvbGxiYXIoKSB7XG4gICAgY29uc3Qgc2Nyb2xsRWwgPSBhd2FpdCB0aGlzLmNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpO1xuICAgIHRoaXMuaGFzU2Nyb2xsYmFyID0gc2Nyb2xsRWwuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgLy8gREVCVUdcbiAgICBjb25zb2xlLmRlYnVnKCdbaG9tZV0gQ2hlY2sgc2Nyb2xsYmFyJywgdGhpcy5oYXNTY3JvbGxiYXIpO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0RmVlZChmZWVkOiBGZWVkc0NvbXBvbmVudCkge1xuICAgIGlmICghZmVlZCkgcmV0dXJuO1xuICAgIHRoaXMuY29ubmVjdCgnaGFzRmVlZCcsIGZlZWQuaGFzRmVlZHMkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFwcC10b29sYmFyIFtjYW5Hb0JhY2tdPVwiZmFsc2VcIiB2aXNpYmxlLXhzIHZpc2libGUtc20gdmlzaWJsZS1tb2JpbGU+XG4gIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgQGlmIChzaG93Tm90aWZpY2F0aW9uSWNvbikge1xuICAgICAgPGFwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uIFthdXRvSGlkZV09XCJhdXRvSGlkZU5vdGlmaWNhdGlvbkljb25cIj48L2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uPlxuICAgIH1cblxuICAgIDwhLS0gZGFyayBtb2RlIChpZiBhbGxvdyBieSB0aGUgZW52aXJvbm1lbnQgdG9rZW4pIC0tPlxuICAgIEBpZiAoc2V0dGluZ3MuYWxsb3dEYXJrTW9kZSkge1xuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInRvZ2dsZURhcmtNb2RlKClcIj5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBbbmFtZV09XCIoZGFya01vZGUkIHwgcHVzaCkgPyAnc3VubnknIDogJ21vb24nXCI+PC9pb24taWNvbj5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICB9XG5cbiAgICA8IS0tIENoYW5nZSBsb2NhbGUgYnV0dG9uIC0tPlxuICAgIDxpb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJsb2NhbGVNZW51XCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImxhbmd1YWdlXCI+PC9pb24taWNvbj5cbiAgICA8L2lvbi1idXR0b24+XG4gIDwvaW9uLWJ1dHRvbnM+XG48L2FwcC10b29sYmFyPlxuXG48IS0tIENoYW5nZSBsb2NhbGUgbWVudSAtLT5cbjxtYXQtbWVudSAjbG9jYWxlTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50PlxuICAgIEBmb3IgKGl0ZW0gb2YgbG9jYWxlczsgdHJhY2sgaXRlbS5rZXkpIHtcbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2hhbmdlTGFuZ3VhZ2UoaXRlbS5rZXkpXCI+XG4gICAgICAgIDwhLS08bWF0LWljb24+e3sgY3VycmVudExvY2FsZSA9PT0gaXRlbS5rZXkgPyAnY2hlY2ttYXJrJyA6IHVuZGVmaW5lZCB9fTwvbWF0LWljb24+LS0+XG4gICAgICAgIDxpb24tbGFiZWw+e3sgaXRlbS52YWx1ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPGlvbi1jb250ZW50IFtuZ1N0eWxlXT1cImNvbnRlbnRTdHlsZVwiIFtjbGFzcy5oYXMtc2Nyb2xsYmFyXT1cImhhc1Njcm9sbGJhclwiIG5vLXBhZGRpbmcteHM+XG4gIDwhLS0gbG9hZGluZyBzcGlubmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1wYWdlXCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIShsb2FkaW5nJCB8IHB1c2gpXCI+XG4gICAgQGlmIChzaG93U3Bpbm5lcikge1xuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj5cbiAgICAgICAgPHAgW2lubmVySFRNTF09XCInQ09NTU9OLkxPQURJTkdfRE9UUycgfCB0cmFuc2xhdGVcIj48L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMSBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMiBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlNCBzay1jdWJlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzay1jdWJlMyBzay1jdWJlXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDwhLS0gRGVza3RvcDogdHJhbnNsdWNlbnQgdG9wIHRvb2xiYXIgLS0+XG4gIEBpZiAoIW1vYmlsZSkge1xuICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICA8aW9uLXRvb2xiYXIgY29sb3I9XCJ0cmFhbnNwYXJlbnRcIiB0cmFuc2x1Y2VudD5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24tbWVudS10b2dnbGU+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgZmlsbD1cImNsZWFyXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cIm1lbnVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLW1lbnUtdG9nZ2xlPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuXG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgQGlmIChzaG93Tm90aWZpY2F0aW9uSWNvbikge1xuICAgICAgICAgICAgPGFwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uXG4gICAgICAgICAgICAgIFtzdHlsZV09XCInaW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIHVucmVhZENvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAgICAgICBbYXV0b0hpZGVdPVwiYXV0b0hpZGVOb3RpZmljYXRpb25JY29uXCJcbiAgICAgICAgICAgID48L2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gZGFyayBtb2RlIChpZiBhbGxvdyBieSB0aGUgZW52aXJvbm1lbnQgdG9rZW4pIC0tPlxuICAgICAgICAgIEBpZiAoc2V0dGluZ3MuYWxsb3dEYXJrTW9kZSkge1xuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGFya01vZGUoKVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInSE9NRS5CVE5fREFSS19NT0RFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgW25hbWVdPVwiKGRhcmtNb2RlJCB8IHB1c2gpID8gJ21vb24nIDogJ3N1bm55J1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gY2hhbmdlIGxvY2FsZSBidXR0b24gLS0+XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibG9jYWxlTWVudVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ1NFVFRJTkdTLkxPQ0FMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImxhbmd1YWdlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBJbnN0YWxsIChhbmQgdXBncmFkZSkgY2FyZCAtLT5cbiAgPGFwcC1pbnN0YWxsLXVwZ3JhZGUtY2FyZCBbaXNMb2dpbl09XCJpc0xvZ2luXCIgW3Nob3dJbnN0YWxsQnV0dG9uXT1cInRydWVcIj48L2FwcC1pbnN0YWxsLXVwZ3JhZGUtY2FyZD5cblxuICBAaWYgKCEobG9hZGluZyQgfCBwdXNoKSkge1xuICAgIEBsZXQgaGFzRmVlZCA9IGhhc0ZlZWQkIHwgYXN5bmM7XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiMFwiIFtzaXplWGxdPVwiaGFzRmVlZCA/IDMgOiAwXCI+PC9pb24tY29sPlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8IS0tIFdlbGNvbWUgY2FyZCAtLT5cbiAgICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJtYWluIHdlbGNvbWUgaW9uLXBhZGRpbmcgaW9uLXRleHQtY2VudGVyIGlvbi1hbGlnbi1zZWxmLWNlbnRlclwiIEBmYWRlSW5BbmltYXRpb24+XG4gICAgICAgICAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGUgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzV2ViXCIgW2lubmVySFRNTF09XCInSE9NRS5XRUxDT01FX1dFQicgfCB0cmFuc2xhdGU6IHsgYXBwTmFtZTogYXBwTmFtZSB9XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzV2ViXCIgW2lubmVySFRNTF09XCInSE9NRS5XRUxDT01FX0FQUCcgfCB0cmFuc2xhdGU6IHsgYXBwTmFtZTogYXBwTmFtZSB9XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGUgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvblwiPjwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJsb2dvXCIgW2F0dHIuc3JjXT1cImxvZ29cIiBhbHQ9XCJMb2dvXCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgPCEtLSByZWdpc3RlciBoZWxwIHRleHQgLS0+XG4gICAgICAgICAgICAgIDxpb24tdGV4dCAqbmdJZj1cIiFpc0xvZ2luICYmIGNhblJlZ2lzdGVyXCI+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkhPTUUuUkVHSVNURVJfSEVMUDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlvbi1wYWRkaW5nLXRvcFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gSWYgTk9UIGxvZ2luIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2dpbjsgZWxzZSBsb2dpbkJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwiY2FuUmVnaXN0ZXJcIiBleHBhbmQ9XCJibG9ja1wiIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwicmVnaXN0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SE9NRS5CVE5fUkVHSVNURVI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIGNvbG9yPVwibGlnaHRcIiBbcm91dGVyTGlua109XCJbJy8nXVwiIChjbGljayk9XCJsb2dpbigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5BVVRILkJUTl9MT0dJTjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gSWYgdXNlciBsb2dpbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvZ2luQnV0dG9ucz5cbiAgICAgICAgICAgICAgICAgIDwhLS0gRmVhdHVyZSBidXR0b25zIC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcnhJZj1cIiRmaWx0ZXJlZEJ1dHRvbnM7IGxldCBidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQ9XCJibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaXRlbS5jc3NDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckRpcmVjdGlvbj1cInJvb3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpb24tZmxvYXQtc3RhcnRcIiAqbmdJZj1cIml0ZW0uaWNvblwiIFtuYW1lXT1cIml0ZW0uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIiBjbGFzcz1cImlvbi1mbG9hdC1zdGFydFwiICpuZ0lmPVwiaXRlbS5tYXRJY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5tYXRJY29uIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+e3sgJ0hPTUUuQlROX0RBVEFfRU5UUlknIHwgdHJhbnNsYXRlOiB7IG5hbWU6IChpdGVtLnRpdGxlIHwgdHJhbnNsYXRlKSB9IH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tYmFkZ2UgKnJ4SWY9XCJpdGVtLiRiYWRnZTsgbGV0IGJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiKGl0ZW0uJGJhZGdlQ29sb3IgfCBwdXNoKSB8fCAnYWNjZW50J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YmFkZ2V9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi1iYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGl2aWRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbS5hY3Rpb25cIiBbY2xhc3NdPVwiaXRlbS5jc3NDbGFzc1wiIGNsYXNzPVwiYnV0dG9uLWRpdmlkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+e3sgaXRlbS50aXRsZSB9fSZuYnNwOzwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tPHAgKm5nSWY9XCJidXR0b25zLmxlbmd0aFwiIGNsYXNzPVwidmlzaWJsZS1tb2JpbGVcIj4mbmJzcDs8L3A+LS0+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKm5nSWY9XCJzaG93QWNjb3VudEJ1dHRvblwiIGV4cGFuZD1cImJsb2NrXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBbcm91dGVyTGlua109XCJbJy9hY2NvdW50J11cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIGNsYXNzPVwiaW9uLWZsb2F0LXN0YXJ0XCIgbmFtZT1cInBlcnNvbi1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkhPTUUuQlROX01ZX0FDQ09VTlQ8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICA8cCBoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tb2JpbGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dFxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiJ0hPTUUuTk9UX1RISVNfQUNDT1VOVF9RVUVTVElPTicgfCB0cmFuc2xhdGU6IHsgZGlzcGxheU5hbWU6IGFjY291bnROYW1lIH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJsb2dvdXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkhPTUUuQlROX0RJU0NPTk5FQ1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjBcIiBbc2l6ZVhsXT1cImhhc0ZlZWQgPyAxIDogMFwiPjwvaW9uLWNvbD5cbiAgICAgICAgPGlvbi1jb2wgW2NsYXNzLmZlZWRdPVwiaGFzRmVlZFwiIFtzaXplXT1cImhhc0ZlZWQgPyAxMiA6IDBcIiBbc2l6ZVhsXT1cImhhc0ZlZWQgPyA0IDogMFwiPlxuICAgICAgICAgIEBpZiAoc2hvd0ZlZWQpIHtcbiAgICAgICAgICAgIEBpZiAobW9iaWxlKSB7XG4gICAgICAgICAgICAgIDxhcHAtZmVlZFxuICAgICAgICAgICAgICAgICNmZWVkXG4gICAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgW3VybHNdPVwiZmVlZFVybHNcIlxuICAgICAgICAgICAgICAgIFttYXhBZ2VJbk1vbnRoc109XCJmZWVkTWF4QWdlSW5Nb250aHNcIlxuICAgICAgICAgICAgICAgIFttYXhDb250ZW50TGVuZ3RoXT1cImZlZWRNYXhDb250ZW50TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAobmdJbml0KT1cImluaXRGZWVkKGZlZWQpXCJcbiAgICAgICAgICAgICAgICBAZmFkZUluQW5pbWF0aW9uXG4gICAgICAgICAgICAgID48L2FwcC1mZWVkPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxhcHAtZmVlZFxuICAgICAgICAgICAgICAgICNmZWVkXG4gICAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgW2RlYnVnXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbdXJsc109XCJmZWVkVXJsc1wiXG4gICAgICAgICAgICAgICAgW21heEFnZUluTW9udGhzXT1cImZlZWRNYXhBZ2VJbk1vbnRoc1wiXG4gICAgICAgICAgICAgICAgW21heENvbnRlbnRMZW5ndGhdPVwiZmVlZE1heENvbnRlbnRMZW5ndGhcIlxuICAgICAgICAgICAgICAgIChuZ0luaXQpPVwiaW5pdEZlZWQoZmVlZClcIlxuICAgICAgICAgICAgICAgIEBzbGlkZUluQW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgQGZhZGVJbkFuaW1hdGlvblxuICAgICAgICAgICAgICA+PC9hcHAtZmVlZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICA8L2lvbi1ncmlkPlxuXG4gICAgPCEtLSBQYWdlIGhpc3RvcnkgLS0+XG4gICAgQGxldCBwYWdlSGlzdG9yeSA9IGlzTG9naW4gJiYgKHBhZ2VIaXN0b3J5JCB8IHB1c2gpO1xuICAgIEBpZiAocGFnZUhpc3RvcnkgfCBpc05vdEVtcHR5QXJyYXkpIHtcbiAgICAgIDxpb24tZ3JpZCBjbGFzcz1cImhpc3RvcnktY29udGFpbmVyIGlvbi1hbGlnbi1zZWxmLWNlbnRlclwiPlxuICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICBAZm9yIChwYWdlIG9mIHBhZ2VIaXN0b3J5OyB0cmFjayBwYWdlLnBhdGgpIHtcbiAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIHNpemUteGw9XCJcIiBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJpb24tYWxpZ24tc2VsZi1zdGFydCBpb24tdGV4dC1zdGFydFwiIEBmYWRlSW5BbmltYXRpb24+XG4gICAgICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlciBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8IS0tIHRvcCBiYXIgLS0+XG4gICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUGFnZUhpc3RvcnkocGFnZS5wYXRoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpb24tZmxvYXQtc3RhcnQgaW9uLW5vLW1hcmdpbiBjbG9zZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgW2lubmVySFRNTF09XCJwYWdlLnN1YnRpdGxlIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIiBbdGl0bGVdPVwicGFnZS50aW1lIHwgZGF0ZUZvcm1hdDogeyB0aW1lOiB0cnVlIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRpbWUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDt7eyBwYWdlLnRpbWUgfCBkYXRlRnJvbU5vdyB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgICA8L2lvbi1jYXJkLXN1YnRpdGxlPlxuXG4gICAgICAgICAgICAgICAgICA8IS0tIG1haW4gcGFnZSAtLT5cbiAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZSBjbGFzcz1cImlvbi1uby1tYXJnaW4gaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgZGV0YWlsPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMXhcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInBhZ2UucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgcm91dGVyRGlyZWN0aW9uPVwicm9vdFwiXG4gICAgICAgICAgICAgICAgICAgICAgbGluZXM9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gcGFnZSBpY29uLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwicGFnZS5pY29uXCIgc2xvdD1cInN0YXJ0XCIgW25hbWVdPVwicGFnZS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJwYWdlLm1hdEljb25cIiBzbG90PVwic3RhcnRcIj57eyBwYWdlLm1hdEljb24gfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cInByaW1hcnlcIiBbaW5uZXJIVE1MXT1cInBhZ2UudGl0bGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIGNoaWxkcmVuIHBhZ2VzIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAocGFnZS5jaGlsZHJlbiB8IGlzTm90RW1wdHlBcnJheSkge1xuICAgICAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tcGFkZGluZy1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkUGFnZSBvZiBwYWdlLmNoaWxkcmVuOyB0cmFjayBjaGlsZFBhZ2UucGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJjaGlsZFBhZ2UucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlckRpcmVjdGlvbj1cInJvb3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHBhZ2UgaWNvbi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb24gKm5nSWY9XCJjaGlsZFBhZ2UuaWNvblwiIHNsb3Q9XCJzdGFydFwiIGNvbG9yPVwiZGFya1wiIFtuYW1lXT1cImNoaWxkUGFnZS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY2hpbGRQYWdlLm1hdEljb25cIiBzbG90PVwic3RhcnRcIiBjb2xvcj1cImRhcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjaGlsZFBhZ2UubWF0SWNvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYXJrXCIgW2lubmVySFRNTF09XCJjaGlsZFBhZ2UudGl0bGVcIj48L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICAgICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWdyaWQ+XG4gICAgfVxuXG4gICAgPCEtLSBCb3R0b20gYmFubmVyIC0tPlxuICAgIEBpZiAoc2hvd1BhcnRuZXJCYW5uZXIgfHwgc2hvd0xlZ2FsSW5mb3JtYXRpb24pIHtcbiAgICAgIDxpb24tZ3JpZFxuICAgICAgICBjbGFzcz1cImJvdHRvbS1iYW5uZXIgaW9uLXRleHQtY2VudGVyXCJcbiAgICAgICAgW2NsYXNzLmZsb2F0aW5nXT1cIiFtb2JpbGUgJiYgKHBhZ2VIaXN0b3J5IHwgaXNFbXB0eUFycmF5KVwiXG4gICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgID5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgPCEtLSBwYXJ0bmVycyBsb2dvcyAtLT5cbiAgICAgICAgICBAaWYgKHNob3dQYXJ0bmVyQmFubmVyKSB7XG4gICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBbc2l6ZUxnXT1cInBhcnRuZXJCYW5uZXJTaXplXCIgY2xhc3M9XCJpb24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgQGlmIChzaG93TGVnYWxJbmZvcm1hdGlvbikge1xuICAgICAgICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImxlZ2FsLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXI+e3sgJ0hPTUUuUEFSVE5FUlMnIHwgdHJhbnNsYXRlIH19PC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8IS0tIHBhcnRuZXJzIC0tPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mICRwYXJ0bmVycyB8IGFzeW5jOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwie3sgaXRlbS5zaXRlVXJsIH19XCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibG9nb1wiIHNyYz1cInt7IGl0ZW0ubG9nbyB9fVwiIGFsdD1cInt7IGl0ZW0ubGFiZWwgfX1cIiBbdGl0bGVdPVwiaXRlbS5sYWJlbFwiIC8+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBsZWdhbCBpbmZvcm1hdGlvbiAtLT5cbiAgICAgICAgICBAaWYgKHNob3dMZWdhbEluZm9ybWF0aW9uKSB7XG4gICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiMTJcIiBzaXplLXNtPVwiNlwiIHNpemUtbGc9XCI0XCIgW2NsYXNzLmxlZnQtYm9yZGVyXT1cInNob3dQYXJ0bmVyQmFubmVyXCI+XG4gICAgICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImxlZ2FsLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8aW9uLWxpc3QtaGVhZGVyIGNsYXNzPVwiaW9uLXRleHQtbGVmdFwiPnt7ICdIT01FLkxFR0FMX0lORk9STUFUSU9OJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxpc3QtaGVhZGVyPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgbGVnYWxJbmZvcm1hdGlvbjsgdHJhY2sgaXRlbS5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWl0ZW0gKGNsaWNrKT1cIm9wZW5NYXJrZG93bk1vZGFsKCRldmVudCwgaXRlbSlcIiBsaW5lcz1cIm5vbmVcIiBbYnV0dG9uXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfCB0cmFuc2xhdGU6IGl0ZW0udGl0bGVBcmdzIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgQGlmIChzaG93SW5zdGFsbExpbmtzKSB7XG4gICAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIHNpemUtbGc9XCIzXCIgb2Zmc2V0LWxnPVwiOVwiIFtjbGFzcy5sZWZ0LWJvcmRlcl09XCJzaG93UGFydG5lckJhbm5lclwiPlxuICAgICAgICAgICAgICAgIDxpb24tbGlzdCBjbGFzcz1cImxlZ2FsLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgIDxpb24tbGlzdC1oZWFkZXI+e3sgJ0hPTUUuSU5TVEFMTF9BUFAnIHwgdHJhbnNsYXRlIH19PC9pb24tbGlzdC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8IS0tIFRPRE8gLS0+XG4gICAgICAgICAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tZ3JpZD5cbiAgICB9XG4gIH1cblxuICA8IS0tIGltYWdlIGNyZWRpdHMgLS0+XG4gIEBpZiAoY29udGVudENyZWRpdHMgfCBpc05vdE5pbE9yQmxhbmspIHtcbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jcmVkaXRzXCIgW2NsYXNzLmZsb2F0aW5nXT1cIiFtb2JpbGVcIj5cbiAgICAgIDxpb24tdGV4dD57eyBjb250ZW50Q3JlZGl0cyB9fTwvaW9uLXRleHQ+XG4gICAgPC9kaXY+XG4gIH1cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=