@alauda-fe/common
Version:
Alauda frontend team common codes.
376 lines • 42.9 kB
JavaScript
import { BreadcrumbModule, IconComponent } from '@alauda/ui';
import { NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, isDevMode, signal, ViewChild, } from '@angular/core';
import { NavigationEnd, Router, RouterLink } from '@angular/router';
import { filter } from 'rxjs';
import { ImgHeaderPipe, PurePipe, SanitizePipe, } from '../../../core/public-api';
import { GridLayoutModule } from '../../../grid-layout/module';
import { TranslatePipe } from '../../../translate/translate.pipe';
import animDataMap from '../lottie-icons/animation-data';
import { NavLottieIconDirective } from '../lottie-icons/lottie-icon.directive';
import { findNavPath } from '../utils';
import { BreadcrumbService, } from './breadcrumb.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "./breadcrumb.service";
import * as i3 from "@alauda/ui";
const _c0 = ["icon"];
const _forTrack0 = ($index, $item) => $item.key;
const _forTrack1 = ($index, $item) => $item.name;
const _c1 = a0 => ({ item: a0, inLink: true });
const _c2 = a0 => ({ item: a0, inLink: false });
const _c3 = a0 => ({ $implicit: a0 });
function BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 4);
} if (rf & 2) {
const item_r1 = i0.ɵɵnextContext(2).$implicit;
i0.ɵɵnextContext(2);
const icon_r2 = i0.ɵɵreference(3);
i0.ɵɵproperty("ngTemplateOutlet", icon_r2)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, item_r1));
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "a", 2);
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Conditional_1_Template, 1, 4, "ng-container");
i0.ɵɵelementStart(2, "span");
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
const item_r1 = ctx_r2.$implicit;
const ɵ$index_4_r4 = ctx_r2.$index;
i0.ɵɵproperty("routerLink", item_r1.routerLink);
i0.ɵɵadvance();
i0.ɵɵconditional(ɵ$index_4_r4 === 0 ? 1 : -1);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(item_r1.label || i0.ɵɵpipeBind1(4, 3, item_r1.name));
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 4);
} if (rf & 2) {
const item_r1 = i0.ɵɵnextContext(2).$implicit;
i0.ɵɵnextContext(2);
const icon_r2 = i0.ɵɵreference(3);
i0.ɵɵproperty("ngTemplateOutlet", icon_r2)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, item_r1));
} }
function BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 3);
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Conditional_1_Template, 1, 4, "ng-container");
i0.ɵɵelementStart(2, "span");
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
const item_r1 = ctx_r2.$implicit;
const ɵ$index_4_r4 = ctx_r2.$index;
i0.ɵɵadvance();
i0.ɵɵconditional(ɵ$index_4_r4 === 0 ? 1 : -1);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(item_r1.label || i0.ɵɵpipeBind1(4, 2, item_r1.name));
} }
function BreadcrumbComponent_Conditional_1_For_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-breadcrumb-item");
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_For_1_Conditional_1_Template, 5, 5, "a", 2)(2, BreadcrumbComponent_Conditional_1_For_1_Conditional_2_Template, 5, 4, "span", 3);
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r1 = ctx.$implicit;
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵconditional(item_r1.routerLink && !ctx_r4.isSameUrl(item_r1.routerLink) ? 1 : 2);
} }
function BreadcrumbComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0, 1);
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("ngTemplateOutlet", ctx_r4.customTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c3, ctx_r4.rootPath()));
} }
function BreadcrumbComponent_Conditional_1_Conditional_3_For_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "a", 5);
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r6 = i0.ɵɵnextContext().$implicit;
i0.ɵɵproperty("routerLink", item_r6.routerLink);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate(item_r6.translate ? i0.ɵɵpipeBind1(2, 2, item_r6.name) : item_r6.name);
} }
function BreadcrumbComponent_Conditional_1_Conditional_3_For_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span");
i0.ɵɵtext(1);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r6 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance();
i0.ɵɵtextInterpolate(item_r6.translate ? i0.ɵɵpipeBind1(2, 1, item_r6.name) : item_r6.name);
} }
function BreadcrumbComponent_Conditional_1_Conditional_3_For_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-breadcrumb-item");
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_Conditional_3_For_1_Conditional_1_Template, 3, 4, "a", 5)(2, BreadcrumbComponent_Conditional_1_Conditional_3_For_1_Conditional_2_Template, 3, 3, "span");
i0.ɵɵelementEnd();
} if (rf & 2) {
const item_r6 = ctx.$implicit;
i0.ɵɵadvance();
i0.ɵɵconditional(item_r6.routerLink ? 1 : 2);
} }
function BreadcrumbComponent_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵrepeaterCreate(0, BreadcrumbComponent_Conditional_1_Conditional_3_For_1_Template, 3, 1, "aui-breadcrumb-item", null, _forTrack1);
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵrepeater(ctx_r4.subItems());
} }
function BreadcrumbComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵrepeaterCreate(0, BreadcrumbComponent_Conditional_1_For_1_Template, 3, 1, "aui-breadcrumb-item", null, _forTrack0);
i0.ɵɵtemplate(2, BreadcrumbComponent_Conditional_1_Conditional_2_Template, 1, 4, "ng-container", 1)(3, BreadcrumbComponent_Conditional_1_Conditional_3_Template, 2, 0);
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵrepeater(ctx_r4.activatedPath);
i0.ɵɵadvance(2);
i0.ɵɵconditional(ctx_r4.customTemplateState === "ready" ? 2 : -1);
i0.ɵɵadvance();
i0.ɵɵconditional(ctx_r4.customTemplateState !== "initialing" && !ctx_r4.customTemplate ? 3 : -1);
} }
function BreadcrumbComponent_ng_template_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const ctx_r6 = i0.ɵɵnextContext();
const item_r8 = ctx_r6.item;
const inLink_r9 = ctx_r6.inLink;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("frame", inLink_r9 ? -1 : 0)("animData", ctx_r4.animDataMap[item_r8.icon]);
} }
function BreadcrumbComponent_ng_template_2_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const inLink_r9 = i0.ɵɵnextContext(2).inLink;
i0.ɵɵproperty("frame", inLink_r9 ? -1 : 0)("animData", ctx());
} }
function BreadcrumbComponent_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_ng_template_2_Conditional_1_Conditional_0_Template, 1, 2, "acl-nav-lottie-icon", 6);
i0.ɵɵpipe(1, "pure");
} if (rf & 2) {
let tmp_5_0;
const item_r8 = i0.ɵɵnextContext().item;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵconditional((tmp_5_0 = i0.ɵɵpipeBind2(1, 1, item_r8.iconLottieJson, ctx_r4.loadLottieJson)) ? 0 : -1, tmp_5_0);
} }
function BreadcrumbComponent_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "img", 7);
i0.ɵɵpipe(1, "aclSanitize");
} if (rf & 2) {
const item_r8 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("src", i0.ɵɵpipeBind2(1, 1, item_r8.iconImgSrc, "url"), i0.ɵɵsanitizeUrl);
} }
function BreadcrumbComponent_ng_template_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "img", 7);
i0.ɵɵpipe(1, "aclImageHeader");
i0.ɵɵpipe(2, "aclSanitize");
} if (rf & 2) {
const item_r8 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("src", i0.ɵɵpipeBind2(2, 3, i0.ɵɵpipeBind1(1, 1, item_r8.iconImgData || item_r8.iconData), "url"), i0.ɵɵsanitizeUrl);
} }
function BreadcrumbComponent_ng_template_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "aui-icon", 8);
} if (rf & 2) {
const item_r8 = i0.ɵɵnextContext().item;
i0.ɵɵproperty("icon", item_r8.iconStatic);
} }
function BreadcrumbComponent_ng_template_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const inLink_r9 = i0.ɵɵnextContext().inLink;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("frame", inLink_r9 ? -1 : 0)("animData", ctx_r4.animDataMap.product);
} }
function BreadcrumbComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, BreadcrumbComponent_ng_template_2_Conditional_0_Template, 1, 2, "acl-nav-lottie-icon", 6)(1, BreadcrumbComponent_ng_template_2_Conditional_1_Template, 2, 4)(2, BreadcrumbComponent_ng_template_2_Conditional_2_Template, 2, 4, "img", 7)(3, BreadcrumbComponent_ng_template_2_Conditional_3_Template, 3, 6, "img", 7)(4, BreadcrumbComponent_ng_template_2_Conditional_4_Template, 1, 1, "aui-icon", 8)(5, BreadcrumbComponent_ng_template_2_Conditional_5_Template, 1, 2, "acl-nav-lottie-icon", 6);
} if (rf & 2) {
const item_r8 = ctx.item;
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵconditional(item_r8.icon && ctx_r4.animDataMap[item_r8.icon] ? 0 : item_r8.iconLottieJson ? 1 : item_r8.iconImgSrc ? 2 : item_r8.iconImgData || item_r8.iconData ? 3 : item_r8.iconStatic ? 4 : 5);
} }
export class BreadcrumbComponent {
constructor(router, cdr, service) {
this.router = router;
this.cdr = cdr;
this.service = service;
this.animDataMap = animDataMap;
this.internalConfigs = [];
this.url = router.url;
this.router.events
.pipe(filter(event => event instanceof NavigationEnd))
.subscribe((event) => {
this.url = event.urlAfterRedirects;
this.cdr.markForCheck();
});
}
ngOnInit() {
this.service.templateState$.subscribe(state => {
this.customTemplateState = state;
this.customTemplate = this.service.template;
this.cdr.markForCheck();
});
}
ngOnChanges(changes) {
if (changes.configs || changes.groups) {
this.internalConfigs =
this.configs ??
this.groups?.reduce((acc, group) => acc.concat(group.items), []);
}
this.updateActivatedPath();
}
isSameUrl(link) {
const rest = this.restNode(link);
return rest.length === 0 || rest === 'list';
}
subItems() {
if (!this.activatedPath?.length) {
return;
}
const routerLink = this.activatedPath.at(-1).routerLink;
const rest = this.restNode(routerLink)
.split('/')
.filter(v => !!v);
if (this._subItems) {
const result = this._subItems(rest, routerLink);
if (result) {
return result;
}
}
if (rest.length === 0) {
return [];
}
if (rest.length === 1) {
if (rest[0] === 'list') {
return [];
}
if (rest[0] === 'create') {
return [{ name: 'create', translate: true }];
}
}
if (rest.length === 2 && rest[0] === 'update') {
return [
{
name: rest[1],
routerLink: routerLink.concat(['detail', rest[1]]),
},
{ name: 'update', translate: true },
];
}
if (rest.length === 2 && rest[0] === 'detail') {
return [{ name: rest[1] }];
}
if (isDevMode()) {
console.error("URL can't match any default breadcrumb:", this.url);
}
return [];
}
rootPath() {
return this.activatedPath?.at(-1)
? this.linkToUrl(this.activatedPath.at(-1).routerLink)
: '/';
}
loadLottieJson(icon) {
const data = signal(null);
fetch(icon)
.then(res => res.json())
.then(json => {
data.set(json);
});
return data;
}
updateActivatedPath() {
this.activatedPath =
this.activatedKey && this.internalConfigs
? findNavPath(item => item.key === this.activatedKey)(this.internalConfigs)
: [];
}
restNode(link) {
const url = this.linkToUrl(link);
if (!this.url.startsWith(url)) {
return '';
}
const endIndex = findIndex(c => c === '?' || c === '#', this.url);
return this.url.slice(url.length + 1, endIndex === -1 ? this.url.length : endIndex);
}
linkToUrl(link) {
return link.reduceRight((acc, curr) => {
if (typeof curr === 'object') {
return (';' +
Object.entries(curr)
.map(([key, value]) => `${key}=${value}`)
.join('') +
acc);
}
return curr.startsWith('/') ? curr + acc : '/' + curr + acc;
}, '');
}
static { this.ɵfac = function BreadcrumbComponent_Factory(t) { return new (t || BreadcrumbComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.BreadcrumbService)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BreadcrumbComponent, selectors: [["acl-breadcrumb"]], viewQuery: function BreadcrumbComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.iconRef = _t.first);
} }, inputs: { configs: "configs", groups: "groups", activatedKey: "activatedKey", _subItems: [0, "subItems", "_subItems"] }, standalone: true, features: [i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature], decls: 4, vars: 1, consts: [["icon", ""], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "item", 3, "routerLink"], [1, "item"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [3, "routerLink"], [3, "frame", "animData"], [3, "src"], [3, "icon"]], template: function BreadcrumbComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-breadcrumb");
i0.ɵɵtemplate(1, BreadcrumbComponent_Conditional_1_Template, 4, 2);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(2, BreadcrumbComponent_ng_template_2_Template, 6, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
i0.ɵɵadvance();
i0.ɵɵconditional((ctx.activatedPath == null ? null : ctx.activatedPath.length) ? 1 : -1);
} }, dependencies: [BreadcrumbModule, i3.BreadcrumbComponent, i3.BreadcrumbItemComponent, RouterLink,
NavLottieIconDirective,
NgTemplateOutlet,
TranslatePipe,
GridLayoutModule,
SanitizePipe,
ImgHeaderPipe,
IconComponent,
PurePipe], styles: [".item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;vertical-align:bottom}.item[_ngcontent-%COMP%] > acl-nav-lottie-icon[_ngcontent-%COMP%], .item[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{margin-right:4px;width:var(--aui-icon-size-m);height:var(--aui-icon-size-m)}.item[_ngcontent-%COMP%] > aui-icon[_ngcontent-%COMP%]{margin-right:4px;font-size:var(--aui-icon-size-m)}"], changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BreadcrumbComponent, [{
type: Component,
args: [{ selector: 'acl-breadcrumb', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
BreadcrumbModule,
RouterLink,
NavLottieIconDirective,
NgTemplateOutlet,
TranslatePipe,
GridLayoutModule,
SanitizePipe,
ImgHeaderPipe,
IconComponent,
PurePipe,
], template: "<aui-breadcrumb>\n @if (activatedPath?.length) {\n @for (item of activatedPath; track item.key; let index = $index) {\n <aui-breadcrumb-item>\n @if (item.routerLink && !isSameUrl(item.routerLink)) {\n <a\n class=\"item\"\n [routerLink]=\"item.routerLink\"\n >\n @if (index === 0) {\n <ng-container\n *ngTemplateOutlet=\"icon; context: { item, inLink: true }\"\n ></ng-container>\n }\n <span>{{ item.label || (item.name | translate) }}</span>\n </a>\n } @else {\n <span class=\"item\">\n @if (index === 0) {\n <ng-container\n *ngTemplateOutlet=\"icon; context: { item, inLink: false }\"\n ></ng-container>\n }\n <span>{{ item.label || (item.name | translate) }}</span>\n </span>\n }\n </aui-breadcrumb-item>\n }\n @if (customTemplateState === 'ready') {\n <ng-container\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: rootPath() }\"\n ></ng-container>\n }\n @if (customTemplateState !== 'initialing' && !customTemplate) {\n @for (item of subItems(); track item.name) {\n <aui-breadcrumb-item>\n @if (item.routerLink) {\n <a [routerLink]=\"item.routerLink\">{{\n item.translate ? (item.name | translate) : item.name\n }}</a>\n } @else {\n <span>{{\n item.translate ? (item.name | translate) : item.name\n }}</span>\n }\n </aui-breadcrumb-item>\n }\n }\n }\n</aui-breadcrumb>\n\n<ng-template\n #icon\n let-item=\"item\"\n let-inLink=\"inLink\"\n>\n @if (item.icon && animDataMap[item.icon]) {\n <acl-nav-lottie-icon\n [frame]=\"inLink ? -1 : 0\"\n [animData]=\"animDataMap[item.icon]\"\n ></acl-nav-lottie-icon>\n } @else if (item.iconLottieJson) {\n @if (item.iconLottieJson | pure: loadLottieJson; as animData) {\n <acl-nav-lottie-icon\n [frame]=\"inLink ? -1 : 0\"\n [animData]=\"animData()\"\n ></acl-nav-lottie-icon>\n }\n } @else if (item.iconImgSrc) {\n <img [src]=\"item.iconImgSrc | aclSanitize: 'url'\" />\n } @else if (item.iconImgData || item.iconData) {\n <img\n [src]=\"\n item.iconImgData || item.iconData | aclImageHeader | aclSanitize: 'url'\n \"\n />\n } @else if (item.iconStatic) {\n <aui-icon [icon]=\"item.iconStatic\"></aui-icon>\n } @else {\n <acl-nav-lottie-icon\n [frame]=\"inLink ? -1 : 0\"\n [animData]=\"animDataMap.product\"\n ></acl-nav-lottie-icon>\n }\n</ng-template>\n", styles: [".item{display:inline-flex;align-items:center;vertical-align:bottom}.item>acl-nav-lottie-icon,.item>img{margin-right:4px;width:var(--aui-icon-size-m);height:var(--aui-icon-size-m)}.item>aui-icon{margin-right:4px;font-size:var(--aui-icon-size-m)}\n"] }]
}], () => [{ type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i2.BreadcrumbService }], { configs: [{
type: Input
}], groups: [{
type: Input
}], activatedKey: [{
type: Input
}], _subItems: [{
type: Input,
args: ['subItems']
}], iconRef: [{
type: ViewChild,
args: ['icon']
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BreadcrumbComponent, { className: "BreadcrumbComponent" }); })();
function findIndex(compare, value) {
for (let i = 0; i < value.length; i++) {
if (compare(value.charAt(i))) {
return i;
}
}
return -1;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvcGFnZS1zY2FmZm9sZC9uYXZpZ2F0aW9uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvcGFnZS1zY2FmZm9sZC9uYXZpZ2F0aW9uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFHTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QixPQUFPLEVBQ0wsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEdBRWIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxXQUFXLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2QyxPQUFPLEVBQ0ws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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWRjcnVtYk1vZHVsZSwgSWNvbkNvbXBvbmVudCB9IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIGlzRGV2TW9kZSxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIHNpZ25hbCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIEltZ0hlYWRlclBpcGUsXG4gIFB1cmVQaXBlLFxuICBTYW5pdGl6ZVBpcGUsXG4gIFN0cmluZ01hcCxcbn0gZnJvbSAnLi4vLi4vLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEdyaWRMYXlvdXRNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9ncmlkLWxheW91dC9tb2R1bGUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3RyYW5zbGF0ZS90cmFuc2xhdGUucGlwZSc7XG5pbXBvcnQgYW5pbURhdGFNYXAgZnJvbSAnLi4vbG90dGllLWljb25zL2FuaW1hdGlvbi1kYXRhJztcbmltcG9ydCB7IE5hdkxvdHRpZUljb25EaXJlY3RpdmUgfSBmcm9tICcuLi9sb3R0aWUtaWNvbnMvbG90dGllLWljb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IE5hdkdyb3VwQ29uZmlnLCBOYXZJdGVtQ29uZmlnIH0gZnJvbSAnLi4vbmF2LW1lbnUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBmaW5kTmF2UGF0aCB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgQnJlYWRjcnVtYlNlcnZpY2UsXG4gIEJyZWFkY3J1bWJUZW1wbGF0ZVN0YXRlLFxufSBmcm9tICcuL2JyZWFkY3J1bWIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1icmVhZGNydW1iJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JyZWFkY3J1bWIudGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2JyZWFkY3J1bWIuc3R5bGUuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEJyZWFkY3J1bWJNb2R1bGUsXG4gICAgUm91dGVyTGluayxcbiAgICBOYXZMb3R0aWVJY29uRGlyZWN0aXZlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBHcmlkTGF5b3V0TW9kdWxlLFxuICAgIFNhbml0aXplUGlwZSxcbiAgICBJbWdIZWFkZXJQaXBlLFxuICAgIEljb25Db21wb25lbnQsXG4gICAgUHVyZVBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIGFuaW1EYXRhTWFwID0gYW5pbURhdGFNYXA7XG5cbiAgQElucHV0KClcbiAgY29uZmlnczogTmF2SXRlbUNvbmZpZ1tdO1xuXG4gIEBJbnB1dCgpXG4gIGdyb3VwczogTmF2R3JvdXBDb25maWdbXTtcblxuICBASW5wdXQoKVxuICBhY3RpdmF0ZWRLZXk6IHN0cmluZztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ3N1Ykl0ZW1zJylcbiAgX3N1Ykl0ZW1zOiAoXG4gICAgcmVzdDogc3RyaW5nW10sXG4gICAgbGFzdFJvdXRlTGluazogQXJyYXk8c3RyaW5nIHwgU3RyaW5nTWFwPixcbiAgKSA9PiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRyYW5zbGF0ZT86IGJvb2xlYW47XG4gICAgcm91dGVyTGluaz86IE5hdkl0ZW1Db25maWdbJ3JvdXRlckxpbmsnXTtcbiAgfT4gfCB2b2lkO1xuXG4gIEBWaWV3Q2hpbGQoJ2ljb24nKVxuICBpY29uUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBhY3RpdmF0ZWRQYXRoOiBOYXZJdGVtQ29uZmlnW107XG4gIGN1c3RvbVRlbXBsYXRlU3RhdGU6IEJyZWFkY3J1bWJUZW1wbGF0ZVN0YXRlO1xuICBjdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbENvbmZpZ3M6IE5hdkl0ZW1Db25maWdbXSA9IFtdO1xuICBwcml2YXRlIHVybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogQnJlYWRjcnVtYlNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMudXJsID0gcm91dGVyLnVybDtcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE5hdmlnYXRpb25FbmQpID0+IHtcbiAgICAgICAgdGhpcy51cmwgPSBldmVudC51cmxBZnRlclJlZGlyZWN0cztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2VydmljZS50ZW1wbGF0ZVN0YXRlJC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZVN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlID0gdGhpcy5zZXJ2aWNlLnRlbXBsYXRlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuY29uZmlncyB8fCBjaGFuZ2VzLmdyb3Vwcykge1xuICAgICAgdGhpcy5pbnRlcm5hbENvbmZpZ3MgPVxuICAgICAgICB0aGlzLmNvbmZpZ3MgPz9cbiAgICAgICAgdGhpcy5ncm91cHM/LnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBncm91cCkgPT4gYWNjLmNvbmNhdChncm91cC5pdGVtcyksXG4gICAgICAgICAgW10gYXMgTmF2SXRlbUNvbmZpZ1tdLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQWN0aXZhdGVkUGF0aCgpO1xuICB9XG5cbiAgaXNTYW1lVXJsKGxpbms6IE5hdkl0ZW1Db25maWdbJ3JvdXRlckxpbmsnXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3QgPSB0aGlzLnJlc3ROb2RlKGxpbmspO1xuICAgIHJldHVybiByZXN0Lmxlbmd0aCA9PT0gMCB8fCByZXN0ID09PSAnbGlzdCc7XG4gIH1cblxuICBzdWJJdGVtcygpOiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRyYW5zbGF0ZT86IGJvb2xlYW47XG4gICAgcm91dGVyTGluaz86IE5hdkl0ZW1Db25maWdbJ3JvdXRlckxpbmsnXTtcbiAgfT4ge1xuICAgIGlmICghdGhpcy5hY3RpdmF0ZWRQYXRoPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm91dGVyTGluayA9IHRoaXMuYWN0aXZhdGVkUGF0aC5hdCgtMSkucm91dGVyTGluaztcblxuICAgIGNvbnN0IHJlc3QgPSB0aGlzLnJlc3ROb2RlKHJvdXRlckxpbmspXG4gICAgICAuc3BsaXQoJy8nKVxuICAgICAgLmZpbHRlcih2ID0+ICEhdik7XG5cbiAgICBpZiAodGhpcy5fc3ViSXRlbXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3N1Ykl0ZW1zKHJlc3QsIHJvdXRlckxpbmspO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChyZXN0WzBdID09PSAnbGlzdCcpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3RbMF0gPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHJldHVybiBbeyBuYW1lOiAnY3JlYXRlJywgdHJhbnNsYXRlOiB0cnVlIH1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMiAmJiByZXN0WzBdID09PSAndXBkYXRlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHJlc3RbMV0sXG4gICAgICAgICAgcm91dGVyTGluazogcm91dGVyTGluay5jb25jYXQoWydkZXRhaWwnLCByZXN0WzFdXSksXG4gICAgICAgIH0sXG4gICAgICAgIHsgbmFtZTogJ3VwZGF0ZScsIHRyYW5zbGF0ZTogdHJ1ZSB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAyICYmIHJlc3RbMF0gPT09ICdkZXRhaWwnKSB7XG4gICAgICByZXR1cm4gW3sgbmFtZTogcmVzdFsxXSB9XTtcbiAgICB9XG5cbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVUkwgY2FuJ3QgbWF0Y2ggYW55IGRlZmF1bHQgYnJlYWRjcnVtYjpcIiwgdGhpcy51cmwpO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJvb3RQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmFjdGl2YXRlZFBhdGg/LmF0KC0xKVxuICAgICAgPyB0aGlzLmxpbmtUb1VybCh0aGlzLmFjdGl2YXRlZFBhdGguYXQoLTEpLnJvdXRlckxpbmspXG4gICAgICA6ICcvJztcbiAgfVxuXG4gIGxvYWRMb3R0aWVKc29uKGljb246IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGEgPSBzaWduYWw8dW5rbm93bj4obnVsbCk7XG5cbiAgICBmZXRjaChpY29uKVxuICAgICAgLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbihqc29uID0+IHtcbiAgICAgICAgZGF0YS5zZXQoanNvbik7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBY3RpdmF0ZWRQYXRoKCkge1xuICAgIHRoaXMuYWN0aXZhdGVkUGF0aCA9XG4gICAgICB0aGlzLmFjdGl2YXRlZEtleSAmJiB0aGlzLmludGVybmFsQ29uZmlnc1xuICAgICAgICA/IGZpbmROYXZQYXRoPE5hdkl0ZW1Db25maWc+KGl0ZW0gPT4gaXRlbS5rZXkgPT09IHRoaXMuYWN0aXZhdGVkS2V5KShcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxDb25maWdzLFxuICAgICAgICAgIClcbiAgICAgICAgOiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdE5vZGUobGluazogTmF2SXRlbUNvbmZpZ1sncm91dGVyTGluayddKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5saW5rVG9VcmwobGluayk7XG4gICAgaWYgKCF0aGlzLnVybC5zdGFydHNXaXRoKHVybCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgZW5kSW5kZXggPSBmaW5kSW5kZXgoYyA9PiBjID09PSAnPycgfHwgYyA9PT0gJyMnLCB0aGlzLnVybCk7XG4gICAgcmV0dXJuIHRoaXMudXJsLnNsaWNlKFxuICAgICAgdXJsLmxlbmd0aCArIDEsXG4gICAgICBlbmRJbmRleCA9PT0gLTEgPyB0aGlzLnVybC5sZW5ndGggOiBlbmRJbmRleCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsaW5rVG9VcmwobGluazogTmF2SXRlbUNvbmZpZ1sncm91dGVyTGluayddKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGluay5yZWR1Y2VSaWdodDxzdHJpbmc+KChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAnOycgK1xuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGN1cnIgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWApXG4gICAgICAgICAgICAuam9pbignJykgK1xuICAgICAgICAgIGFjY1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnIuc3RhcnRzV2l0aCgnLycpID8gY3VyciArIGFjYyA6ICcvJyArIGN1cnIgKyBhY2M7XG4gICAgfSwgJycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRJbmRleChjb21wYXJlOiAodjogc3RyaW5nKSA9PiBib29sZWFuLCB2YWx1ZTogc3RyaW5nKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29tcGFyZSh2YWx1ZS5jaGFyQXQoaSkpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG4iLCI8YXVpLWJyZWFkY3J1bWI+XG4gIEBpZiAoYWN0aXZhdGVkUGF0aD8ubGVuZ3RoKSB7XG4gICAgQGZvciAoaXRlbSBvZiBhY3RpdmF0ZWRQYXRoOyB0cmFjayBpdGVtLmtleTsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICA8YXVpLWJyZWFkY3J1bWItaXRlbT5cbiAgICAgICAgQGlmIChpdGVtLnJvdXRlckxpbmsgJiYgIWlzU2FtZVVybChpdGVtLnJvdXRlckxpbmspKSB7XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnJvdXRlckxpbmtcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaWNvbjsgY29udGV4dDogeyBpdGVtLCBpbkxpbms6IHRydWUgfVwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ubGFiZWwgfHwgKGl0ZW0ubmFtZSB8IHRyYW5zbGF0ZSkgfX08L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW1cIj5cbiAgICAgICAgICAgIEBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaWNvbjsgY29udGV4dDogeyBpdGVtLCBpbkxpbms6IGZhbHNlIH1cIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmxhYmVsIHx8IChpdGVtLm5hbWUgfCB0cmFuc2xhdGUpIH19PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9hdWktYnJlYWRjcnVtYi1pdGVtPlxuICAgIH1cbiAgICBAaWYgKGN1c3RvbVRlbXBsYXRlU3RhdGUgPT09ICdyZWFkeScpIHtcbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvb3RQYXRoKCkgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIEBpZiAoY3VzdG9tVGVtcGxhdGVTdGF0ZSAhPT0gJ2luaXRpYWxpbmcnICYmICFjdXN0b21UZW1wbGF0ZSkge1xuICAgICAgQGZvciAoaXRlbSBvZiBzdWJJdGVtcygpOyB0cmFjayBpdGVtLm5hbWUpIHtcbiAgICAgICAgPGF1aS1icmVhZGNydW1iLWl0ZW0+XG4gICAgICAgICAgQGlmIChpdGVtLnJvdXRlckxpbmspIHtcbiAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiPnt7XG4gICAgICAgICAgICAgIGl0ZW0udHJhbnNsYXRlID8gKGl0ZW0ubmFtZSB8IHRyYW5zbGF0ZSkgOiBpdGVtLm5hbWVcbiAgICAgICAgICAgIH19PC9hPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgaXRlbS50cmFuc2xhdGUgPyAoaXRlbS5uYW1lIHwgdHJhbnNsYXRlKSA6IGl0ZW0ubmFtZVxuICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2F1aS1icmVhZGNydW1iLWl0ZW0+XG4gICAgICB9XG4gICAgfVxuICB9XG48L2F1aS1icmVhZGNydW1iPlxuXG48bmctdGVtcGxhdGVcbiAgI2ljb25cbiAgbGV0LWl0ZW09XCJpdGVtXCJcbiAgbGV0LWluTGluaz1cImluTGlua1wiXG4+XG4gIEBpZiAoaXRlbS5pY29uICYmIGFuaW1EYXRhTWFwW2l0ZW0uaWNvbl0pIHtcbiAgICA8YWNsLW5hdi1sb3R0aWUtaWNvblxuICAgICAgW2ZyYW1lXT1cImluTGluayA/IC0xIDogMFwiXG4gICAgICBbYW5pbURhdGFdPVwiYW5pbURhdGFNYXBbaXRlbS5pY29uXVwiXG4gICAgPjwvYWNsLW5hdi1sb3R0aWUtaWNvbj5cbiAgfSBAZWxzZSBpZiAoaXRlbS5pY29uTG90dGllSnNvbikge1xuICAgIEBpZiAoaXRlbS5pY29uTG90dGllSnNvbiB8IHB1cmU6IGxvYWRMb3R0aWVKc29uOyBhcyBhbmltRGF0YSkge1xuICAgICAgPGFjbC1uYXYtbG90dGllLWljb25cbiAgICAgICAgW2ZyYW1lXT1cImluTGluayA/IC0xIDogMFwiXG4gICAgICAgIFthbmltRGF0YV09XCJhbmltRGF0YSgpXCJcbiAgICAgID48L2FjbC1uYXYtbG90dGllLWljb24+XG4gICAgfVxuICB9IEBlbHNlIGlmIChpdGVtLmljb25JbWdTcmMpIHtcbiAgICA8aW1nIFtzcmNdPVwiaXRlbS5pY29uSW1nU3JjIHwgYWNsU2FuaXRpemU6ICd1cmwnXCIgLz5cbiAgfSBAZWxzZSBpZiAoaXRlbS5pY29uSW1nRGF0YSB8fCBpdGVtLmljb25EYXRhKSB7XG4gICAgPGltZ1xuICAgICAgW3NyY109XCJcbiAgICAgICAgaXRlbS5pY29uSW1nRGF0YSB8fCBpdGVtLmljb25EYXRhIHwgYWNsSW1hZ2VIZWFkZXIgfCBhY2xTYW5pdGl6ZTogJ3VybCdcbiAgICAgIFwiXG4gICAgLz5cbiAgfSBAZWxzZSBpZiAoaXRlbS5pY29uU3RhdGljKSB7XG4gICAgPGF1aS1pY29uIFtpY29uXT1cIml0ZW0uaWNvblN0YXRpY1wiPjwvYXVpLWljb24+XG4gIH0gQGVsc2Uge1xuICAgIDxhY2wtbmF2LWxvdHRpZS1pY29uXG4gICAgICBbZnJhbWVdPVwiaW5MaW5rID8gLTEgOiAwXCJcbiAgICAgIFthbmltRGF0YV09XCJhbmltRGF0YU1hcC5wcm9kdWN0XCJcbiAgICA+PC9hY2wtbmF2LWxvdHRpZS1pY29uPlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19