xng-breadcrumb
Version:
A declarative and reactive breadcrumb approach for Angular 6 and beyond https://www.npmjs.com/package/xng-breadcrumb
1 lines • 33.7 kB
Source Map (JSON)
{"version":3,"file":"xng-breadcrumb.mjs","sources":["../../../xng-breadcrumb/src/lib/breadcrumb-item.directive.ts","../../../xng-breadcrumb/src/lib/breadcrumb.service.ts","../../../xng-breadcrumb/src/lib/breadcrumb.component.ts","../../../xng-breadcrumb/src/lib/breadcrumb.component.html","../../../xng-breadcrumb/src/xng-breadcrumb.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * This directive is used to customize the breadcrumb label behavior\n * *xngBreadcrumbItem directive can be used in the child element of xng-breadcrumb\n * Usage: refer to the demo - app.component.html\n */\n@Directive({\n selector: '[xngBreadcrumbItem]',\n standalone: true,\n})\nexport class BreadcrumbItemDirective {}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, GuardsCheckEnd, Router } from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { BreadcrumbDefinition, Breadcrumb, BreadcrumbConfig, BreadcrumbObject } from './types';\n\ntype StoreMatcherKey = 'routeLink' | 'routeRegex' | 'alias';\n\nconst PATH_PARAM = {\n PREFIX: ':',\n REGEX_IDENTIFIER: '/:[^/]+',\n REGEX_REPLACER: '/[^/]+',\n};\nconst ALIAS_PREFIX = '@';\nconst isNonEmpty = (obj: unknown): boolean => {\n return !!obj && Object.keys(obj).length > 0;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BreadcrumbService {\n private baseHref = '/';\n\n /**\n * dynamicBreadcrumbStore holds information about dynamically updated breadcrumbs.\n * Breadcrumbs can be set from anywhere (component, service) in the app.\n * On every breadcrumb update check this store and use the info if available.\n */\n private dynamicBreadcrumbStore: BreadcrumbDefinition[] = [];\n\n /**\n * breadcrumbList for the current route\n * When breadcrumb info is changed dynamically, check if the currentBreadcrumbs is effected\n * If effected, update the change and emit a new stream\n */\n private currentBreadcrumbs: BreadcrumbDefinition[] = [];\n private previousBreadcrumbs: BreadcrumbDefinition[] = [];\n\n /**\n * Breadcrumbs observable to be subscribed by BreadcrumbComponent\n * Emits on every route change OR dynamic update of breadcrumb\n */\n private breadcrumbs = new BehaviorSubject<BreadcrumbDefinition[]>([]);\n public breadcrumbs$ = this.breadcrumbs.asObservable();\n\n constructor(private activatedRoute: ActivatedRoute, private router: Router) {\n this.detectRouteChanges();\n }\n\n /**\n * Whenever route changes build breadcrumb list again\n */\n private detectRouteChanges() {\n // Special case where breadcrumb service & component instantiates after a route is navigated.\n // Ex: put breadcrumbs within *ngIf and this.router.events would be empty\n // This check is also required where { initialNavigation: 'enabledBlocking' } is applied to routes\n this.setupBreadcrumbs(this.activatedRoute.snapshot);\n\n this.router.events.pipe(filter((event): event is GuardsCheckEnd => event instanceof GuardsCheckEnd)).subscribe((event) => {\n // activatedRoute doesn't carry data when shouldReuseRoute returns false\n // use the event data with GuardsCheckEnd as workaround\n // Check for shouldActivate in case where the authGuard returns false the breadcrumbs shouldn't be changed\n if (event.shouldActivate) {\n this.setupBreadcrumbs(event.state.root);\n }\n });\n }\n\n private setupBreadcrumbs(activatedRouteSnapshot: ActivatedRouteSnapshot) {\n this.previousBreadcrumbs = this.currentBreadcrumbs;\n // breadcrumb label for base OR root path. Usually, this can be set as 'Home'\n const rootBreadcrumb = this.getRootBreadcrumb();\n this.currentBreadcrumbs = rootBreadcrumb ? [rootBreadcrumb] : [];\n this.prepareBreadcrumbList(activatedRouteSnapshot, this.baseHref);\n }\n\n private getRootBreadcrumb(): Breadcrumb | void {\n const rootConfig = this.router.config.find((config) => config.path === '');\n const rootBreadcrumb = this.extractObject(rootConfig?.data?.['breadcrumb']);\n const storeItem = this.getFromStore(rootBreadcrumb.alias, '/');\n\n if (isNonEmpty(rootBreadcrumb) || isNonEmpty(storeItem)) {\n return {\n ...storeItem,\n ...rootBreadcrumb,\n routeLink: this.baseHref,\n ...this.getQueryParamsFromPreviousList('/'),\n };\n }\n }\n\n private prepareBreadcrumbItem(activatedRouteSnapshot: ActivatedRouteSnapshot, routeLinkPrefix: string): BreadcrumbDefinition {\n const { path, breadcrumb } = this.parseRouteData(activatedRouteSnapshot.routeConfig);\n const resolvedSegment = this.resolvePathSegment(path, activatedRouteSnapshot);\n const routeLink = `${routeLinkPrefix}${resolvedSegment}`;\n const storeItem = this.getFromStore(breadcrumb.alias, routeLink);\n\n const label = this.extractLabel(storeItem?.label || breadcrumb?.label, resolvedSegment);\n let isAutoGeneratedLabel = false;\n let autoGeneratedLabel = '';\n if (!label) {\n isAutoGeneratedLabel = true;\n autoGeneratedLabel = resolvedSegment;\n }\n\n return {\n ...storeItem,\n ...breadcrumb,\n label: isAutoGeneratedLabel ? autoGeneratedLabel : label,\n routeLink,\n isAutoGeneratedLabel,\n ...this.getQueryParamsFromPreviousList(routeLink),\n };\n }\n\n private prepareBreadcrumbList(activatedRouteSnapshot: ActivatedRouteSnapshot, routeLinkPrefix: string): Breadcrumb[] | void {\n if (activatedRouteSnapshot.routeConfig?.path) {\n const breadcrumbItem = this.prepareBreadcrumbItem(activatedRouteSnapshot, routeLinkPrefix);\n this.currentBreadcrumbs.push(breadcrumbItem);\n\n if (activatedRouteSnapshot.firstChild) {\n return this.prepareBreadcrumbList(activatedRouteSnapshot.firstChild, breadcrumbItem.routeLink + '/');\n }\n } else if (activatedRouteSnapshot.firstChild) {\n return this.prepareBreadcrumbList(activatedRouteSnapshot.firstChild, routeLinkPrefix);\n }\n const lastCrumb = this.currentBreadcrumbs[this.currentBreadcrumbs.length - 1];\n this.setQueryParamsForActiveBreadcrumb(lastCrumb, activatedRouteSnapshot);\n\n // remove breadcrumb items that needs to be hidden\n const breadcrumbsToShow = this.currentBreadcrumbs.filter((item) => !item.skip);\n\n this.breadcrumbs.next(breadcrumbsToShow);\n }\n\n private getFromStore(alias: string, routeLink: string): BreadcrumbDefinition {\n return this.dynamicBreadcrumbStore.find((item) => {\n return (alias && alias === item.alias) || (routeLink && routeLink === item.routeLink) || this.matchRegex(routeLink, item.routeRegex);\n });\n }\n\n /**\n * use exact match instead of regexp.test\n * for /mentor/[^/]+ we should match '/mentor/12' but not '/mentor/12/abc'\n */\n private matchRegex(routeLink: string, routeRegex: string) {\n const match = routeLink.match(new RegExp(routeRegex));\n return match?.[0] === routeLink;\n }\n\n /**\n * if the path segment has route params, read the param value from url\n * for each segment of route this gets called\n *\n * for mentor/:id/view - it gets called with mentor, :id, view 3 times\n */\n private resolvePathSegment(segment: string, activatedRouteSnapshot: ActivatedRouteSnapshot) {\n //quirk -segment can be defined as view/:id in route config in which case you need to make it view/<resolved-param>\n if (segment.includes(PATH_PARAM.PREFIX)) {\n Object.entries(activatedRouteSnapshot.params).forEach(([key, value]) => {\n segment = segment.replace(`:${key}`, `${value}`);\n });\n }\n return segment;\n }\n\n /**\n * queryParams & fragments for previous breadcrumb path are copied over to new list\n */\n private getQueryParamsFromPreviousList(routeLink: string): Breadcrumb {\n const { queryParams, fragment } = this.previousBreadcrumbs.find((item) => item.routeLink === routeLink) || {};\n return { queryParams, fragment };\n }\n\n /**\n * set current activated route query params to the last breadcrumb item\n */\n private setQueryParamsForActiveBreadcrumb(lastItem: Breadcrumb, activatedRouteSnapshot: ActivatedRouteSnapshot) {\n if (lastItem) {\n const { queryParams, fragment } = activatedRouteSnapshot;\n lastItem.queryParams = queryParams ? { ...queryParams } : undefined;\n lastItem.fragment = fragment;\n }\n }\n\n /**\n * For a specific route, breadcrumb can be defined either on parent OR it's child(which has empty path)\n * When both are defined, child takes precedence\n *\n * Ex: Below we are setting breadcrumb on both parent and child.\n * So, child takes precedence and \"Defined On Child\" is displayed for the route 'home'\n * { path: 'home', loadChildren: () => import('./home/home.module').then((m) => m.HomeModule) , data: {breadcrumb: \"Defined On Module\"}}\n * AND\n * children: [\n * { path: '', component: ShowUserComponent, data: {breadcrumb: \"Defined On Child\" }\n * ]\n */\n private parseRouteData(routeConfig) {\n const { path, data } = routeConfig;\n const breadcrumb = this.mergeWithBaseChildData(routeConfig, data?.breadcrumb);\n\n return { path, breadcrumb };\n }\n\n /**\n * get empty children of a module or Component. Empty child is the one with path: ''\n * When parent and it's children (that has empty route path) define data merge them both with child taking precedence\n */\n private mergeWithBaseChildData(\n routeConfig: any, // TODO: add proper type\n config: BreadcrumbConfig\n ): BreadcrumbObject {\n if (!routeConfig) {\n return this.extractObject(config);\n }\n\n let baseChild;\n if (routeConfig.loadChildren) {\n // To handle a module with empty child route\n baseChild = routeConfig._loadedRoutes.find((route) => route.path === '');\n } else if (routeConfig.children) {\n // To handle a component with empty child route\n baseChild = routeConfig.children.find((route) => route.path === '');\n }\n\n const childConfig = baseChild?.data?.breadcrumb;\n return childConfig\n ? this.mergeWithBaseChildData(baseChild, {\n ...this.extractObject(config),\n ...this.extractObject(childConfig),\n })\n : this.extractObject(config);\n }\n\n /**\n * Update breadcrumb dynamically\n *\n * key can be a path | alias\n *\n * 1) Using complete route path. route can be passed the same way you define angular routes\n * - path can be passed as 'exact path(routeLink)' or 'path with params(routeRegex)'\n * - update label Ex: set('/mentor', 'Mentor'), set('/mentor/:id', 'Mentor Details')\n * - change visibility Ex: set('/mentor/:id/edit', { skip: true })\n * ------------------------------------------ OR ------------------------------------------\n * 2) Using route alias (prefixed with '@'). alias should be unique for a route\n * - update label Ex: set('@mentor', 'Enabler')\n * - change visibility Ex: set('@mentorEdit', { skip: true })\n *\n *\n * value can be string | BreadcrumbObject | BreadcrumbFunction\n */\n set(key: string, breadcrumb: string | BreadcrumbObject) {\n const breadcrumbObject = this.extractObject(breadcrumb);\n let updateArgs: [StoreMatcherKey, BreadcrumbDefinition];\n\n if (key.startsWith(ALIAS_PREFIX)) {\n updateArgs = ['alias', { ...breadcrumbObject, alias: key.slice(1) }];\n } else if (key.includes(PATH_PARAM.PREFIX)) {\n updateArgs = ['routeRegex', { ...breadcrumbObject, routeRegex: this.buildRegex(key) }];\n } else {\n updateArgs = ['routeLink', { ...breadcrumbObject, routeLink: this.ensureLeadingSlash(key) }];\n }\n\n // For this route if previously a breadcrumb is not defined that sets isAutoGeneratedLabel: true\n // change it to false since this is user supplied value\n updateArgs[1].isAutoGeneratedLabel = false;\n\n this.updateStore(...updateArgs);\n this.updateCurrentBreadcrumbs(...updateArgs);\n }\n\n /**\n * Update the store to reuse for dynamic declarations\n * If the store already has this route definition update it, else add\n */\n private updateStore(key: string, breadcrumb: BreadcrumbDefinition) {\n const storeItemIndex = this.dynamicBreadcrumbStore.findIndex((item) => {\n return breadcrumb[key] === item[key];\n });\n if (storeItemIndex > -1) {\n this.dynamicBreadcrumbStore[storeItemIndex] = {\n ...this.dynamicBreadcrumbStore[storeItemIndex],\n ...breadcrumb,\n };\n } else {\n this.dynamicBreadcrumbStore.push({ ...breadcrumb });\n }\n }\n\n /**\n * If breadcrumb is present in current breadcrumbs update it and emit new stream\n */\n private updateCurrentBreadcrumbs(key: string, breadcrumb: BreadcrumbDefinition) {\n const itemIndex = this.currentBreadcrumbs.findIndex((item) => {\n return key === 'routeRegex' ? this.matchRegex(item.routeLink, breadcrumb[key]) : breadcrumb[key] === item[key];\n });\n if (itemIndex > -1) {\n this.currentBreadcrumbs[itemIndex] = {\n ...this.currentBreadcrumbs[itemIndex],\n ...breadcrumb,\n };\n const breadcrumbsToShow = this.currentBreadcrumbs.filter((item) => !item.skip);\n this.breadcrumbs.next([...breadcrumbsToShow]);\n }\n }\n\n /**\n * For a route with path param, we create regex dynamically from angular route syntax\n * '/mentor/:id' becomes '/mentor/[^/]',\n * breadcrumbService.set('/mentor/:id', 'Uday') should update 'Uday' as label for '/mentor/2' OR 'mentor/ada'\n */\n private buildRegex(path: string) {\n return this.ensureLeadingSlash(path).replace(new RegExp(PATH_PARAM.REGEX_IDENTIFIER, 'g'), PATH_PARAM.REGEX_REPLACER);\n }\n\n private ensureLeadingSlash(path: string) {\n return path.startsWith('/') ? path : `/${path}`;\n }\n\n /**\n * In App's RouteConfig, breadcrumb can be defined as a string OR a function OR an object\n *\n * string: simple static breadcrumb label for a path\n * function: callback that gets invoked with resolved path param\n * object: additional data defined along with breadcrumb label that gets passed to *xngBreadcrumbItem directive\n */\n private extractLabel(config: BreadcrumbConfig, resolvedParam?: string) {\n const label = typeof config === 'object' ? config.label : config;\n if (typeof label === 'function') {\n return label(resolvedParam);\n }\n return label;\n }\n\n private extractObject(config: BreadcrumbConfig): BreadcrumbObject {\n // don't include {label} if config is undefined. This is important since we merge the configs\n if (config && (typeof config === 'string' || typeof config === 'function')) {\n return { label: config };\n }\n return (config as BreadcrumbObject) || {};\n }\n}\n","import { Component, ContentChild, Input, OnInit, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Observable, map } from 'rxjs';\nimport { BreadcrumbItemDirective } from './breadcrumb-item.directive';\nimport { BreadcrumbService } from './breadcrumb.service';\nimport { BreadcrumbDefinition } from './types';\n\n@Component({\n selector: 'xng-breadcrumb',\n imports: [CommonModule, RouterModule],\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.css',\n encapsulation: ViewEncapsulation.None\n})\nexport class BreadcrumbComponent implements OnInit {\n breadcrumbs$: Observable<BreadcrumbDefinition[]>;\n separatorTemplate: TemplateRef<void>;\n private _separator = '/';\n\n /**\n * Breadcrumb item can be customized with this template\n * Template context is provided label, additional info, first and last indexes\n * Use cases:\n * 1) Add an icon along with label\n * 2) i18n. {{breadcrumb | translate}} or {{breadcrumb | transloco}}\n * 3) Change text case {{breadcrumb | titlecase}}\n */\n @ContentChild(BreadcrumbItemDirective, { static: false, read: TemplateRef })\n itemTemplate;\n\n /**\n * If true, breadcrumb is auto generated even without any mapping label\n * Default label is same as route segment\n */\n @Input() autoGenerate = true;\n\n /**\n * By default query params will be preserved with breadcrumbs\n */\n @Input() preserveQueryParams = true;\n\n /**\n * By default query fragments will be preserved with breadcrumbs\n */\n @Input() preserveFragment = true;\n\n /**\n * custom class provided by consumer to increase specificity\n * This will benefit to override styles that are conflicting\n */\n @Input() class = '';\n\n /**\n * anchorTarget = \"_blank\" makes the breadcrumb link open in a new tab\n */\n @Input() anchorTarget: '_blank' | undefined;\n\n /**\n * separator between breadcrumbs, defaults to '/'.\n * User can customize separator either by passing a String or Template\n *\n * String --> Ex: <xng-breadcrumb separator=\"-\"> </xng-breadcrumb>\n *\n * Template --> Ex: <xng-breadcrumb [separator]=\"separatorTemplate\"> </xng-breadcrumb>\n * <ng-template #separatorTemplate><mat-icon>arrow_right</mat-icon></ng-template>\n */\n @Input()\n set separator(value: string | TemplateRef<void>) {\n if (value instanceof TemplateRef) {\n this.separatorTemplate = value;\n this._separator = undefined;\n } else {\n this.separatorTemplate = undefined;\n this._separator = value || '/';\n }\n }\n get separator() {\n return this._separator;\n }\n\n setupMessage = 'not set up yet';\n someParameterValue = null;\n\n constructor(private breadcrumbService: BreadcrumbService, activateRoute: ActivatedRoute) {\n // breadcrumb inside ngIf works only this way\n activateRoute.params.subscribe((params) => {\n this.setupComponent(params['someParam']);\n });\n }\n\n setupComponent(someParam) {\n this.setupMessage = 'set up at ' + new Date();\n this.someParameterValue = someParam;\n }\n\n ngOnInit() {\n this.breadcrumbs$ = this.breadcrumbService.breadcrumbs$.pipe(\n map((breadcrumbs: BreadcrumbDefinition[]) => {\n return breadcrumbs\n .filter((breadcrumb: BreadcrumbDefinition) => {\n // Usually, breadcrumb list can contain a combination of auto generated and user specified labels\n // this filters autogenerated labels in case of \"[autoGenerate]: false\"\n if (this.autoGenerate) {\n return true;\n }\n return !breadcrumb.isAutoGeneratedLabel;\n })\n .map((breadcrumb: BreadcrumbDefinition) => {\n // Do not mutate breadcrumb as its source of truth.\n // There can be scenarios where we can have multiple xng-breadcrumb instances in page\n const { routeInterceptor, routeLink } = breadcrumb;\n return {\n ...breadcrumb,\n routeLink: routeInterceptor?.(routeLink, breadcrumb) || routeLink,\n };\n });\n })\n );\n }\n}\n","<nav aria-label=\"breadcrumb\" class=\"xng-breadcrumb-root\" [ngClass]=\"class\">\n <ol class=\"xng-breadcrumb-list\">\n <ng-container *ngFor=\"let breadcrumb of breadcrumbs$ | async; last as isLast; first as isFirst; index as index; count as count\">\n <li class=\"xng-breadcrumb-item\">\n <a\n *ngIf=\"!isLast\"\n class=\"xng-breadcrumb-link\"\n [ngClass]=\"{ 'xng-breadcrumb-link-disabled': breadcrumb.disable }\"\n [attr.aria-disabled]=\"breadcrumb.disable\"\n [attr.tabIndex]=\"breadcrumb.disable ? -1 : 0\"\n rel=\"noopener noreferrer\"\n [routerLink]=\"breadcrumb.routeInterceptor ? breadcrumb.routeInterceptor(breadcrumb.routeLink, breadcrumb) : breadcrumb.routeLink\"\n [queryParams]=\"preserveQueryParams ? breadcrumb.queryParams : undefined\"\n [fragment]=\"preserveFragment ? breadcrumb.fragment : undefined\"\n [target]=\"anchorTarget ? anchorTarget : '_self'\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate;\n context: {\n $implicit: breadcrumb.label,\n info: breadcrumb.info,\n last: isLast,\n first: isFirst,\n index: index,\n count: count\n }\n \"\n ></ng-container>\n <ng-container *ngIf=\"!itemTemplate\">{{ breadcrumb.label }}</ng-container>\n </a>\n\n <span *ngIf=\"isLast\" class=\"xng-breadcrumb-trail\">\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate;\n context: {\n $implicit: breadcrumb.label,\n info: breadcrumb.info,\n last: isLast,\n first: isFirst,\n index: index,\n count: count\n }\n \"\n ></ng-container>\n <ng-container *ngIf=\"!itemTemplate\">{{ breadcrumb.label }}</ng-container>\n </span>\n </li>\n\n <li *ngIf=\"!isLast\" class=\"xng-breadcrumb-separator\" aria-hidden=\"true\">\n <ng-container *ngTemplateOutlet=\"separatorTemplate\"></ng-container>\n <ng-container *ngIf=\"!separatorTemplate\">{{ separator }}</ng-container>\n </li>\n </ng-container>\n </ol>\n</nav>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.BreadcrumbService","i2"],"mappings":";;;;;;;;;AAEA;;;;AAIG;MAKU,uBAAuB,CAAA;8GAAvB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACFD,MAAM,UAAU,GAAG;AACjB,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,gBAAgB,EAAE,SAAS;AAC3B,IAAA,cAAc,EAAE,QAAQ;CACzB;AACD,MAAM,YAAY,GAAG,GAAG;AACxB,MAAM,UAAU,GAAG,CAAC,GAAY,KAAa;AAC3C,IAAA,OAAO,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;AAC7C,CAAC;MAKY,iBAAiB,CAAA;IAyB5B,WAAoB,CAAA,cAA8B,EAAU,MAAc,EAAA;QAAtD,IAAc,CAAA,cAAA,GAAd,cAAc;QAA0B,IAAM,CAAA,MAAA,GAAN,MAAM;QAxB1D,IAAQ,CAAA,QAAA,GAAG,GAAG;AAEtB;;;;AAIG;QACK,IAAsB,CAAA,sBAAA,GAA2B,EAAE;AAE3D;;;;AAIG;QACK,IAAkB,CAAA,kBAAA,GAA2B,EAAE;QAC/C,IAAmB,CAAA,mBAAA,GAA2B,EAAE;AAExD;;;AAGG;AACK,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,eAAe,CAAyB,EAAE,CAAC;AAC9D,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;QAGnD,IAAI,CAAC,kBAAkB,EAAE;;AAG3B;;AAEG;IACK,kBAAkB,GAAA;;;;QAIxB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;QAEnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAA8B,KAAK,YAAY,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;;;;AAIvH,YAAA,IAAI,KAAK,CAAC,cAAc,EAAE;gBACxB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;;AAE3C,SAAC,CAAC;;AAGI,IAAA,gBAAgB,CAAC,sBAA8C,EAAA;AACrE,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB;;AAElD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC/C,QAAA,IAAI,CAAC,kBAAkB,GAAG,cAAc,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE;QAChE,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC;;IAG3D,iBAAiB,GAAA;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;AAC1E,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC;AAC3E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;QAE9D,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE;YACvD,OAAO;AACL,gBAAA,GAAG,SAAS;AACZ,gBAAA,GAAG,cAAc;gBACjB,SAAS,EAAE,IAAI,CAAC,QAAQ;AACxB,gBAAA,GAAG,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC;aAC5C;;;IAIG,qBAAqB,CAAC,sBAA8C,EAAE,eAAuB,EAAA;AACnG,QAAA,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,WAAW,CAAC;QACpF,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,CAAC;AAC7E,QAAA,MAAM,SAAS,GAAG,CAAA,EAAG,eAAe,CAAG,EAAA,eAAe,EAAE;AACxD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;AAEhE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,IAAI,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC;QACvF,IAAI,oBAAoB,GAAG,KAAK;QAChC,IAAI,kBAAkB,GAAG,EAAE;QAC3B,IAAI,CAAC,KAAK,EAAE;YACV,oBAAoB,GAAG,IAAI;YAC3B,kBAAkB,GAAG,eAAe;;QAGtC,OAAO;AACL,YAAA,GAAG,SAAS;AACZ,YAAA,GAAG,UAAU;YACb,KAAK,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,KAAK;YACxD,SAAS;YACT,oBAAoB;AACpB,YAAA,GAAG,IAAI,CAAC,8BAA8B,CAAC,SAAS,CAAC;SAClD;;IAGK,qBAAqB,CAAC,sBAA8C,EAAE,eAAuB,EAAA;AACnG,QAAA,IAAI,sBAAsB,CAAC,WAAW,EAAE,IAAI,EAAE;YAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,eAAe,CAAC;AAC1F,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC;AAE5C,YAAA,IAAI,sBAAsB,CAAC,UAAU,EAAE;AACrC,gBAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,CAAC,UAAU,EAAE,cAAc,CAAC,SAAS,GAAG,GAAG,CAAC;;;AAEjG,aAAA,IAAI,sBAAsB,CAAC,UAAU,EAAE;YAC5C,OAAO,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,CAAC,UAAU,EAAE,eAAe,CAAC;;AAEvF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7E,QAAA,IAAI,CAAC,iCAAiC,CAAC,SAAS,EAAE,sBAAsB,CAAC;;AAGzE,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAE9E,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC;;IAGlC,YAAY,CAAC,KAAa,EAAE,SAAiB,EAAA;QACnD,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;AAC/C,YAAA,OAAO,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,MAAM,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;AACtI,SAAC,CAAC;;AAGJ;;;AAGG;IACK,UAAU,CAAC,SAAiB,EAAE,UAAkB,EAAA;AACtD,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;AACrD,QAAA,OAAO,KAAK,GAAG,CAAC,CAAC,KAAK,SAAS;;AAGjC;;;;;AAKG;IACK,kBAAkB,CAAC,OAAe,EAAE,sBAA8C,EAAA;;QAExF,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACvC,YAAA,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACrE,gBAAA,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC;AAClD,aAAC,CAAC;;AAEJ,QAAA,OAAO,OAAO;;AAGhB;;AAEG;AACK,IAAA,8BAA8B,CAAC,SAAiB,EAAA;QACtD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE;AAC7G,QAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE;;AAGlC;;AAEG;IACK,iCAAiC,CAAC,QAAoB,EAAE,sBAA8C,EAAA;QAC5G,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,sBAAsB;AACxD,YAAA,QAAQ,CAAC,WAAW,GAAG,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS;AACnE,YAAA,QAAQ,CAAC,QAAQ,GAAG,QAAQ;;;AAIhC;;;;;;;;;;;AAWG;AACK,IAAA,cAAc,CAAC,WAAW,EAAA;AAChC,QAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC;AAE7E,QAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE;;AAG7B;;;AAGG;IACK,sBAAsB,CAC5B,WAAgB;IAChB,MAAwB,EAAA;QAExB,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;;AAGnC,QAAA,IAAI,SAAS;AACb,QAAA,IAAI,WAAW,CAAC,YAAY,EAAE;;AAE5B,YAAA,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;;AACnE,aAAA,IAAI,WAAW,CAAC,QAAQ,EAAE;;AAE/B,YAAA,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;;AAGrE,QAAA,MAAM,WAAW,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU;AAC/C,QAAA,OAAO;AACL,cAAE,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE;AACrC,gBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC7B,gBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;aACnC;AACH,cAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;;AAGhC;;;;;;;;;;;;;;;;AAgBG;IACH,GAAG,CAAC,GAAW,EAAE,UAAqC,EAAA;QACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AACvD,QAAA,IAAI,UAAmD;AAEvD,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,YAAA,UAAU,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,gBAAgB,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;;aAC/D,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAC1C,YAAA,UAAU,GAAG,CAAC,YAAY,EAAE,EAAE,GAAG,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;;aACjF;AACL,YAAA,UAAU,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;;;;AAK9F,QAAA,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,GAAG,KAAK;AAE1C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC;AAC/B,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,UAAU,CAAC;;AAG9C;;;AAGG;IACK,WAAW,CAAC,GAAW,EAAE,UAAgC,EAAA;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;YACpE,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC;AACtC,SAAC,CAAC;AACF,QAAA,IAAI,cAAc,GAAG,CAAC,CAAC,EAAE;AACvB,YAAA,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,GAAG;AAC5C,gBAAA,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC;AAC9C,gBAAA,GAAG,UAAU;aACd;;aACI;YACL,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;;;AAIvD;;AAEG;IACK,wBAAwB,CAAC,GAAW,EAAE,UAAgC,EAAA;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC3D,YAAA,OAAO,GAAG,KAAK,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC;AAChH,SAAC,CAAC;AACF,QAAA,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG;AACnC,gBAAA,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;AACrC,gBAAA,GAAG,UAAU;aACd;AACD,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC;;;AAIjD;;;;AAIG;AACK,IAAA,UAAU,CAAC,IAAY,EAAA;QAC7B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC;;AAG/G,IAAA,kBAAkB,CAAC,IAAY,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAI,CAAA,EAAA,IAAI,EAAE;;AAGjD;;;;;;AAMG;IACK,YAAY,CAAC,MAAwB,EAAE,aAAsB,EAAA;AACnE,QAAA,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM;AAChE,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,YAAA,OAAO,KAAK,CAAC,aAAa,CAAC;;AAE7B,QAAA,OAAO,KAAK;;AAGN,IAAA,aAAa,CAAC,MAAwB,EAAA;;AAE5C,QAAA,IAAI,MAAM,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,UAAU,CAAC,EAAE;AAC1E,YAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;;QAE1B,OAAQ,MAA2B,IAAI,EAAE;;8GA/ThC,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCLY,mBAAmB,CAAA;AA2C9B;;;;;;;;AAQG;IACH,IACI,SAAS,CAAC,KAAiC,EAAA;AAC7C,QAAA,IAAI,KAAK,YAAY,WAAW,EAAE;AAChC,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;aACtB;AACL,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;AAClC,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK,IAAI,GAAG;;;AAGlC,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU;;IAMxB,WAAoB,CAAA,iBAAoC,EAAE,aAA6B,EAAA;QAAnE,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QAlE7B,IAAU,CAAA,UAAA,GAAG,GAAG;AAaxB;;;AAGG;QACM,IAAY,CAAA,YAAA,GAAG,IAAI;AAE5B;;AAEG;QACM,IAAmB,CAAA,mBAAA,GAAG,IAAI;AAEnC;;AAEG;QACM,IAAgB,CAAA,gBAAA,GAAG,IAAI;AAEhC;;;AAGG;QACM,IAAK,CAAA,KAAA,GAAG,EAAE;QA8BnB,IAAY,CAAA,YAAA,GAAG,gBAAgB;QAC/B,IAAkB,CAAA,kBAAA,GAAG,IAAI;;QAIvB,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;YACxC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC1C,SAAC,CAAC;;AAGJ,IAAA,cAAc,CAAC,SAAS,EAAA;QACtB,IAAI,CAAC,YAAY,GAAG,YAAY,GAAG,IAAI,IAAI,EAAE;AAC7C,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;;IAGrC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAC1D,GAAG,CAAC,CAAC,WAAmC,KAAI;AAC1C,YAAA,OAAO;AACJ,iBAAA,MAAM,CAAC,CAAC,UAAgC,KAAI;;;AAG3C,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,oBAAA,OAAO,IAAI;;AAEb,gBAAA,OAAO,CAAC,UAAU,CAAC,oBAAoB;AACzC,aAAC;AACA,iBAAA,GAAG,CAAC,CAAC,UAAgC,KAAI;;;AAGxC,gBAAA,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,UAAU;gBAClD,OAAO;AACL,oBAAA,GAAG,UAAU;oBACb,SAAS,EAAE,gBAAgB,GAAG,SAAS,EAAE,UAAU,CAAC,IAAI,SAAS;iBAClE;AACH,aAAC,CAAC;SACL,CAAC,CACH;;8GAvGQ,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAahB,uBAAuB,EAAyB,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,6BC5B3E,gzEAyDA,EAAA,MAAA,EAAA,CAAA,slBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/Cc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAK3B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACI,gBAAgB,EAAA,OAAA,EACjB,CAAC,YAAY,EAAE,YAAY,CAAC,EAAA,aAAA,EAGtB,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,gzEAAA,EAAA,MAAA,EAAA,CAAA,slBAAA,CAAA,EAAA;gHAgBvC,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;gBAOlE,YAAY,EAAA,CAAA;sBAApB;gBAKQ,mBAAmB,EAAA,CAAA;sBAA3B;gBAKQ,gBAAgB,EAAA,CAAA;sBAAxB;gBAMQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAYG,SAAS,EAAA,CAAA;sBADZ;;;AEnEH;;AAEG;;;;"}