@magmonium/one 0.4.97 → 0.4.99

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.
Files changed (25) hide show
  1. package/fesm2022/{magmonium-one-base-dropdown-2hgXcmhE.mjs → magmonium-one-base-dropdown-CmUfiOAb.mjs} +3 -3
  2. package/fesm2022/{magmonium-one-base-dropdown-2hgXcmhE.mjs.map → magmonium-one-base-dropdown-CmUfiOAb.mjs.map} +1 -1
  3. package/fesm2022/{magmonium-one-checkbox-a3Dwmu2X.mjs → magmonium-one-checkbox-BXNvtkzo.mjs} +2 -2
  4. package/fesm2022/{magmonium-one-checkbox-a3Dwmu2X.mjs.map → magmonium-one-checkbox-BXNvtkzo.mjs.map} +1 -1
  5. package/fesm2022/{magmonium-one-image-editor-BLqlV2ki.mjs → magmonium-one-image-editor-BV0x-SA3.mjs} +2 -2
  6. package/fesm2022/{magmonium-one-image-editor-BLqlV2ki.mjs.map → magmonium-one-image-editor-BV0x-SA3.mjs.map} +1 -1
  7. package/fesm2022/{magmonium-one-label-Dkis_mGP.mjs → magmonium-one-label-D-wnA_Fl.mjs} +3 -3
  8. package/fesm2022/magmonium-one-label-D-wnA_Fl.mjs.map +1 -0
  9. package/fesm2022/{magmonium-one-multi-range-DL_JlKVL.mjs → magmonium-one-multi-range-C0S7udf5.mjs} +2 -2
  10. package/fesm2022/{magmonium-one-multi-range-DL_JlKVL.mjs.map → magmonium-one-multi-range-C0S7udf5.mjs.map} +1 -1
  11. package/fesm2022/{magmonium-one-otp-COE0X33y.mjs → magmonium-one-otp-CeSz8ZZ2.mjs} +2 -2
  12. package/fesm2022/{magmonium-one-otp-COE0X33y.mjs.map → magmonium-one-otp-CeSz8ZZ2.mjs.map} +1 -1
  13. package/fesm2022/{magmonium-one-password-CvgWZkAX.mjs → magmonium-one-password-BKdXAZ_p.mjs} +2 -2
  14. package/fesm2022/{magmonium-one-password-CvgWZkAX.mjs.map → magmonium-one-password-BKdXAZ_p.mjs.map} +1 -1
  15. package/fesm2022/{magmonium-one-radio-DPz4-SAJ.mjs → magmonium-one-radio-DlS31qJG.mjs} +2 -2
  16. package/fesm2022/{magmonium-one-radio-DPz4-SAJ.mjs.map → magmonium-one-radio-DlS31qJG.mjs.map} +1 -1
  17. package/fesm2022/{magmonium-one-range-DlQfnl9p.mjs → magmonium-one-range-CR8go24u.mjs} +2 -2
  18. package/fesm2022/{magmonium-one-range-DlQfnl9p.mjs.map → magmonium-one-range-CR8go24u.mjs.map} +1 -1
  19. package/fesm2022/{magmonium-one-text-vDPAhn74.mjs → magmonium-one-text-4zWYsKpH.mjs} +2 -2
  20. package/fesm2022/{magmonium-one-text-vDPAhn74.mjs.map → magmonium-one-text-4zWYsKpH.mjs.map} +1 -1
  21. package/fesm2022/magmonium-one.mjs +28 -27
  22. package/fesm2022/magmonium-one.mjs.map +1 -1
  23. package/package.json +1 -1
  24. package/types/magmonium-one.d.ts +21 -21
  25. package/fesm2022/magmonium-one-label-Dkis_mGP.mjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmonium/one",
3
- "version": "0.4.97",
3
+ "version": "0.4.99",
4
4
  "description": "Magmonium One — Angular design-system primitives for mm Apps",
5
5
  "author": "magmonium",
6
6
  "license": "MIT",
@@ -489,7 +489,7 @@ interface MoneyResult {
489
489
  declare const formatMoney: (value: number, system: MoneySystem) => MoneyResult;
490
490
  export declare class MoneyPipe implements PipeTransform {
491
491
  private readonly translateService;
492
- transform(value: number | undefined | null, system?: MoneySystem, symbol?: string, forceSign?: boolean): string;
492
+ transform(value: number | undefined | null, system?: MoneySystem, symbol?: string, forceSign?: boolean, mod?: boolean): string;
493
493
  static ɵfac: i0.ɵɵFactoryDeclaration<MoneyPipe, never>;
494
494
  static ɵpipe: i0.ɵɵPipeDeclaration<MoneyPipe, "money", true>;
495
495
  }
@@ -4968,7 +4968,7 @@ export declare class SectionFilterGroupComponent {
4968
4968
  readonly paddingX: import("@angular/core").InputSignal<boolean | undefined>;
4969
4969
  readonly paddingY: import("@angular/core").InputSignal<boolean | undefined>;
4970
4970
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
4971
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center" | undefined>;
4971
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
4972
4972
  readonly config: import("@angular/core").InputSignal<SectionFilterGroupConfig | undefined>;
4973
4973
  /**
4974
4974
  * The whole group's selection, keyed by each Filter's `name` — one key per
@@ -4986,7 +4986,7 @@ export declare class SectionFilterGroupComponent {
4986
4986
  protected readonly resolvedPadding: import("@angular/core").Signal<boolean>;
4987
4987
  protected readonly resolvedPaddingX: import("@angular/core").Signal<boolean>;
4988
4988
  protected readonly resolvedPaddingY: import("@angular/core").Signal<boolean>;
4989
- protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "right" | "center">;
4989
+ protected readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right">;
4990
4990
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
4991
4991
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
4992
4992
  /**
@@ -5165,7 +5165,7 @@ export declare class SectionStepperComponent implements OnDestroy {
5165
5165
  export declare class SectionBadgesComponent {
5166
5166
  readonly wrap: import("@angular/core").InputSignal<boolean>;
5167
5167
  readonly border: import("@angular/core").InputSignal<boolean>;
5168
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center">;
5168
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
5169
5169
  private readonly sectionContext;
5170
5170
  protected readonly hasBorder: import("@angular/core").Signal<boolean>;
5171
5171
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionBadgesComponent, never>;
@@ -5313,7 +5313,7 @@ export declare class SectionPaginationComponent {
5313
5313
  * Entries that are not positive numbers drop rather than throw.
5314
5314
  */
5315
5315
  readonly perPageOptions: import("@angular/core").InputSignal<string | undefined>;
5316
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center">;
5316
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
5317
5317
  readonly showPerPage: import("@angular/core").InputSignal<boolean>;
5318
5318
  /** Hides the band outright once everything fits one page. */
5319
5319
  readonly hideOnSinglePage: import("@angular/core").InputSignal<boolean>;
@@ -5651,7 +5651,7 @@ export declare class SectionComponent extends ConfigComponent<SectionConfig> {
5651
5651
  readonly align: import("@angular/core").InputSignal<SectionAlign | undefined>;
5652
5652
  readonly alignX: import("@angular/core").InputSignal<GridAlignX | undefined>;
5653
5653
  readonly alignY: import("@angular/core").InputSignal<GridAlignY | undefined>;
5654
- readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
5654
+ readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | Size | undefined>;
5655
5655
  private readonly parentSize;
5656
5656
  readonly resolvedSize: import("@angular/core").Signal<Size>;
5657
5657
  protected readonly sizeLength: import("@angular/core").Signal<string>;
@@ -5822,8 +5822,8 @@ export declare class SectionHeaderComponent {
5822
5822
  readonly visibilityRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
5823
5823
  readonly disableRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
5824
5824
  readonly extraData: import("@angular/core").InputSignal<unknown>;
5825
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center" | undefined>;
5826
- readonly alignment: import("@angular/core").Signal<"left" | "right" | "center">;
5825
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
5826
+ readonly alignment: import("@angular/core").Signal<"center" | "left" | "right">;
5827
5827
  readonly badge: import("@angular/core").InputSignal<BadgeCount | undefined>;
5828
5828
  readonly showBack: import("@angular/core").InputSignal<boolean>;
5829
5829
  readonly actionButton: import("@angular/core").InputSignal<string | undefined>;
@@ -5842,7 +5842,7 @@ export declare class SectionHeaderComponent {
5842
5842
  protected readonly sidepanel: import("@angular/core").Signal<boolean>;
5843
5843
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
5844
5844
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
5845
- protected readonly boxAlign: import("@angular/core").Signal<"left" | "right" | "center">;
5845
+ protected readonly boxAlign: import("@angular/core").Signal<"center" | "left" | "right">;
5846
5846
  protected readonly iconBox: import("@angular/core").Signal<string>;
5847
5847
  protected readonly stickyOn: import("@angular/core").Signal<boolean>;
5848
5848
  protected readonly isSticky: import("@angular/core").Signal<boolean>;
@@ -5990,7 +5990,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
5990
5990
  readonly vertical: import("@angular/core").InputSignal<boolean | undefined>;
5991
5991
  readonly align: import("@angular/core").InputSignal<ConfigAlign>;
5992
5992
  readonly variant: import("@angular/core").InputSignal<"spaced" | "joined" | undefined>;
5993
- readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
5993
+ readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | Size | undefined>;
5994
5994
  readonly fullWidth: import("@angular/core").InputSignal<boolean | undefined>;
5995
5995
  private readonly parentSize;
5996
5996
  readonly resolvedSize: import("@angular/core").Signal<Size>;
@@ -5998,7 +5998,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
5998
5998
  protected readonly resolvedFullWidth: import("@angular/core").Signal<boolean>;
5999
5999
  protected readonly resolvedVertical: import("@angular/core").Signal<boolean>;
6000
6000
  protected readonly resolvedVariant: import("@angular/core").Signal<"spaced" | "joined">;
6001
- protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "right" | "center" | "top" | "bottom">;
6001
+ protected readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right" | "bottom" | "top">;
6002
6002
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionButtonGroupComponent, never>;
6003
6003
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionButtonGroupComponent, "m-section-button-group", never, {
6004
6004
  "vertical": {
@@ -6030,7 +6030,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
6030
6030
  }
6031
6031
  export declare class SectionFooterComponent {
6032
6032
  readonly sticky: import("@angular/core").InputSignal<boolean>;
6033
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center">;
6033
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
6034
6034
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
6035
6035
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
6036
6036
  private readonly isDesignMode;
@@ -6041,7 +6041,7 @@ export declare class SectionFooterComponent {
6041
6041
  protected readonly sidepanel: import("@angular/core").Signal<boolean>;
6042
6042
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
6043
6043
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
6044
- protected readonly boxAlign: import("@angular/core").Signal<"left" | "right" | "center">;
6044
+ protected readonly boxAlign: import("@angular/core").Signal<"center" | "left" | "right">;
6045
6045
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionFooterComponent, never>;
6046
6046
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionFooterComponent, "m-section-footer", never, {
6047
6047
  "sticky": {
@@ -8590,7 +8590,7 @@ declare class ColorPickerBoxComponent implements AfterViewInit, OnDestroy {
8590
8590
  protected readonly _eyedropperConfig: import("@magmonium/one").Button;
8591
8591
  protected readonly _headerContextMenu: ContextMenu;
8592
8592
  protected readonly themeSwatches: import("@angular/core").Signal<{
8593
- key: "error" | "background" | "border" | "text" | "textSecondary" | "mm" | "mmLite" | "mmDark" | "focus" | "errorLight" | "warning" | "successLite" | "success" | "highlight" | "wealth";
8593
+ key: "text" | "error" | "focus" | "mm" | "mmLite" | "mmDark" | "background" | "border" | "textSecondary" | "errorLight" | "warning" | "successLite" | "success" | "highlight" | "wealth";
8594
8594
  color: string;
8595
8595
  }[]>;
8596
8596
  hue: import("@angular/core").WritableSignal<number>;
@@ -9789,17 +9789,17 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9789
9789
  protected readonly resolvesConfigAsset = false;
9790
9790
  readonly variant: import("@angular/core").InputSignal<string | undefined>;
9791
9791
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
9792
- readonly heightMode: import("@angular/core").InputSignal<"full" | "fixed" | undefined>;
9792
+ readonly heightMode: import("@angular/core").InputSignal<"fixed" | "full" | undefined>;
9793
9793
  readonly maxHeight: import("@angular/core").InputSignal<string | number | undefined>;
9794
9794
  readonly height: import("@angular/core").InputSignal<string | number | undefined>;
9795
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center" | undefined>;
9795
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
9796
9796
  readonly padding: import("@angular/core").InputSignal<string | number | undefined>;
9797
9797
  readonly paddingX: import("@angular/core").InputSignal<string | number | undefined>;
9798
9798
  readonly paddingY: import("@angular/core").InputSignal<string | number | undefined>;
9799
9799
  readonly margin: import("@angular/core").InputSignal<string | number | undefined>;
9800
9800
  readonly marginX: import("@angular/core").InputSignal<string | number | undefined>;
9801
9801
  readonly marginY: import("@angular/core").InputSignal<string | number | undefined>;
9802
- readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
9802
+ readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | Size | undefined>;
9803
9803
  readonly autofocus: import("@angular/core").InputSignal<boolean>;
9804
9804
  data: import("@angular/core").InputSignal<T | undefined>;
9805
9805
  readonly dataChange: import("@angular/core").OutputEmitterRef<T>;
@@ -9844,7 +9844,7 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9844
9844
  protected readonly handleSubmit: (event: Event) => void;
9845
9845
  readonly resolvedSize: import("@angular/core").Signal<Size>;
9846
9846
  protected readonly sizeLength: import("@angular/core").Signal<string | null>;
9847
- readonly resolvedAlign: import("@angular/core").Signal<"left" | "right" | "center">;
9847
+ readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right">;
9848
9848
  readonly resolvedVariant: import("@angular/core").Signal<string | undefined>;
9849
9849
  readonly resolvedMaxWidth: import("@angular/core").Signal<string | number | undefined>;
9850
9850
  private readonly resolvedPadding;
@@ -9856,7 +9856,7 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9856
9856
  readonly resolvedMinHeight: import("@angular/core").Signal<string | undefined>;
9857
9857
  readonly resolvedMinWidth: import("@angular/core").Signal<string | undefined>;
9858
9858
  readonly resolvedMaxHeight: import("@angular/core").Signal<string | number | undefined>;
9859
- readonly resolvedHeightMode: import("@angular/core").Signal<"full" | "fixed" | undefined>;
9859
+ readonly resolvedHeightMode: import("@angular/core").Signal<"fixed" | "full" | undefined>;
9860
9860
  readonly isFullHeight: import("@angular/core").Signal<boolean>;
9861
9861
  readonly cssMaxHeight: import("@angular/core").Signal<string | undefined>;
9862
9862
  constructor();
@@ -12449,7 +12449,7 @@ export declare class PriceLadderComponent {
12449
12449
  protected readonly current: import("@angular/core").Signal<number | null>;
12450
12450
  /** The forecast point: a `forecast` mark, else the `target` input. */
12451
12451
  private readonly targetPoint;
12452
- protected readonly shownAs: import("@angular/core").Signal<"list" | "line">;
12452
+ protected readonly shownAs: import("@angular/core").Signal<"line" | "list">;
12453
12453
  /** Every drawable mark, the `current` and `forecast` stand-ins included. */
12454
12454
  private readonly everyMark;
12455
12455
  /** The reference levels drawn as ticks and labels. */
@@ -13543,7 +13543,7 @@ export type DocAiPhase = 'idle' | 'asking' | 'question' | 'outline' | 'writing'
13543
13543
  */
13544
13544
  export declare class DocEditorComponent implements ControlValueAccessor {
13545
13545
  protected readonly groups: readonly import("@magmonium/one").DocToolbarGroup[];
13546
- protected readonly icons: Record<"list" | "code" | "link" | "table" | "strike" | "bold" | "heading" | "italic" | "quote", string>;
13546
+ protected readonly icons: Record<"code" | "link" | "table" | "strike" | "list" | "bold" | "heading" | "italic" | "quote", string>;
13547
13547
  protected readonly docActionKey: typeof docActionKey;
13548
13548
  private readonly translate;
13549
13549
  protected readonly value: import("@angular/core").WritableSignal<string>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-label-Dkis_mGP.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/pipe/time-ago.ts","../../../../libs/one/src/lib/shared/pipe/money.fn.ts","../../../../libs/one/src/lib/shared/pipe/money.ts","../../../../libs/one/src/lib/shared/pipe/percentage.ts","../../../../libs/one/src/lib/shared/pipe/sign-color.ts","../../../../libs/one/src/lib/shared/pipe/compact-number.ts","../../../../libs/one/src/lib/shared/pipe/asset-url.ts","../../../../libs/one/src/lib/shared/ui/section/type/section-table.ts","../../../../libs/one/src/lib/shared/ui/section/lib/functions/section-table.ts","../../../../libs/one/src/lib/shared/pipe/section-table-sort.ts","../../../../libs/one/src/lib/shared/pipe/to-list.ts","../../../../libs/one/src/lib/shared/ui/input/ui/label.ts"],"sourcesContent":["import { ChangeDetectorRef, inject, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { interval, Subscription } from 'rxjs';\n\nconst SECONDS_IN_MINUTE = 60;\nconst SECONDS_IN_HOUR = 3600;\nconst SECONDS_IN_DAY = 86400;\nconst SECONDS_IN_MONTH = 2592000;\nconst SECONDS_IN_YEAR = 31536000;\n\n@Pipe({\n name: 'timeAgo',\n pure: false,\n})\nexport class TimeAgoPipe implements PipeTransform, OnDestroy {\n private readonly translateService = inject(TranslateService);\n private readonly cdr = inject(ChangeDetectorRef);\n private timerSubscription: Subscription | null = null;\n private lastValue: string | Date | undefined = undefined;\n\n transform(value: string | Date | undefined): string {\n if (!value) return '';\n\n if (value !== this.lastValue) {\n this.lastValue = value;\n this.setupTimer();\n }\n\n const date = typeof value === 'string' ? new Date(value) : value;\n const now = new Date();\n const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (seconds < SECONDS_IN_MINUTE) {\n return this.translateService.translate('just-now');\n }\n\n let count: number;\n let unit: string;\n\n if (seconds < SECONDS_IN_HOUR) {\n count = Math.floor(seconds / SECONDS_IN_MINUTE);\n unit = count === 1 ? 'minute' : 'minutes';\n } else if (seconds < SECONDS_IN_DAY) {\n count = Math.floor(seconds / SECONDS_IN_HOUR);\n unit = count === 1 ? 'hour' : 'hours';\n } else if (seconds < SECONDS_IN_MONTH) {\n count = Math.floor(seconds / SECONDS_IN_DAY);\n unit = count === 1 ? 'day' : 'days';\n } else if (seconds < SECONDS_IN_YEAR) {\n count = Math.floor(seconds / SECONDS_IN_MONTH);\n unit = count === 1 ? 'month' : 'months';\n } else {\n count = Math.floor(seconds / SECONDS_IN_YEAR);\n unit = count === 1 ? 'year' : 'years';\n }\n\n return this.translateService.translate(\n `time-ago?count=${count}&unit=${unit}`\n );\n }\n\n private setupTimer(): void {\n this.clearTimer();\n // Update every 30 seconds to keep the display fresh without overloading change detection.\n this.timerSubscription = interval(30000).subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n private clearTimer(): void {\n if (this.timerSubscription) {\n this.timerSubscription.unsubscribe();\n this.timerSubscription = null;\n }\n }\n\n ngOnDestroy(): void {\n this.clearTimer();\n }\n}\n","export type MoneySystem = 'IN' | 'INTL';\n\nexport interface MoneyResult {\n amount: string;\n labelKey: string;\n}\n\ninterface Threshold {\n min: number;\n labelKey: string;\n overflowAt: number;\n}\n\nconst IN_THRESHOLDS: Threshold[] = [\n { min: 1_00_00_000, labelKey: 'cr', overflowAt: Infinity },\n { min: 1_00_000, labelKey: 'l', overflowAt: 100 },\n { min: 1_000, labelKey: 'k', overflowAt: 100 },\n];\n\nconst INTL_THRESHOLDS: Threshold[] = [\n { min: 1_000_000_000_000, labelKey: 't', overflowAt: Infinity },\n { min: 1_000_000_000, labelKey: 'b', overflowAt: 1_000 },\n { min: 1_000_000, labelKey: 'm', overflowAt: 1_000 },\n { min: 1_000, labelKey: 'k', overflowAt: 1_000 },\n];\n\n/**\n * Formats a non-negative finite number into a compact denomination result.\n * @param value Must be a non-negative finite number. Negative values and NaN\n * should be handled by the caller before invoking this function.\n */\nexport const formatMoney = (\n value: number,\n system: MoneySystem\n): MoneyResult => {\n const thresholds = system === 'IN' ? IN_THRESHOLDS : INTL_THRESHOLDS;\n\n for (let i = 0; i < thresholds.length; i++) {\n const { min, labelKey, overflowAt } = thresholds[i];\n if (value >= min) {\n const rounded = parseFloat((value / min).toFixed(1));\n if (rounded >= overflowAt && i > 0) {\n const higher = thresholds[i - 1];\n return {\n amount: parseFloat((value / higher.min).toFixed(1)).toString(),\n labelKey: higher.labelKey,\n };\n }\n return { amount: rounded.toString(), labelKey };\n }\n }\n\n return { amount: parseFloat(value.toFixed(2)).toString(), labelKey: '' };\n};\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { formatMoney, MoneySystem } from './money.fn';\n\n@Pipe({\n name: 'money',\n pure: false,\n})\nexport class MoneyPipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n transform(\n value: number | undefined | null,\n system: MoneySystem = 'IN',\n symbol = '₹',\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n if (value === 0) return `${symbol}0`;\n\n const isNegative = value < 0;\n const absValue = Math.abs(value);\n const { amount, labelKey } = formatMoney(absValue, system);\n const label = labelKey\n ? ` ${this.translateService.translate(labelKey)}`\n : '';\n\n const sign = isNegative ? '-' : forceSign ? '+' : '';\n return `${sign}${symbol}${amount}${label}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Renders a number already expressed in percent units as a `%` reading —\n * `42` becomes `42.00%`, never `4200%`. A ratio is the caller's to multiply,\n * the way `MoneyPipe` takes an amount rather than a currency object.\n *\n * Two decimals by default: a percentage carries the fraction that separates\n * two near-equal readings, and a caller wanting the whole number asks for\n * `decimals: 0`.\n *\n * Pure, unlike the other three: it reads no language and no clock, so its\n * output depends on its arguments alone.\n */\n@Pipe({\n name: 'percentage',\n})\nexport class PercentagePipe implements PipeTransform {\n transform(\n value: number | undefined | null,\n decimals = 2,\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n\n const digits = Math.max(0, Math.trunc(decimals));\n const rendered = Math.abs(value).toFixed(digits);\n // A rounded-to-zero negative would otherwise print `-0%`.\n const isNegative = value < 0 && Number(rendered) !== 0;\n\n const sign = isNegative\n ? '-'\n : forceSign && Number(rendered) !== 0\n ? '+'\n : '';\n return `${sign}${rendered}%`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Reads a number's sign as a colour — `success` above zero, `error` below — for\n * the `color` input `m-text-output` resolves against the active theme, so a\n * gain and a loss follow the theme rather than freezing one theme's hex.\n *\n * Zero, `null`, `undefined` and `NaN` answer `undefined`: no colour is the\n * component's own default, and a flat reading is neither a gain nor a loss.\n *\n * Pure, like `PercentagePipe`: its output depends on its arguments alone.\n */\n@Pipe({\n name: 'signColor',\n})\nexport class SignColorPipe implements PipeTransform {\n transform(\n value: number | undefined | null,\n positive = 'success',\n negative = 'error'\n ): string | undefined {\n if (value == null || isNaN(value) || value === 0) return undefined;\n return value > 0 ? positive : negative;\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { formatMoney, MoneySystem } from './money.fn';\n\n/**\n * Renders a large number as a compact denominated reading — `12500` becomes\n * `12.5 k`, `1250000` becomes `12.5 l` (or `1.3 m` on the `INTL` ladder).\n * `MoneyPipe` without the currency symbol: a count of views, rows or users is\n * no amount of money, but it climbs the same thresholds.\n *\n * Named `compactNumber` rather than `number` so it never collides with\n * Angular's own `DecimalPipe` in a template that imports both.\n *\n * Impure for `MoneyPipe`'s reason: the denomination label is a translation key\n * resolved in the active language.\n */\n@Pipe({\n name: 'compactNumber',\n pure: false,\n})\nexport class CompactNumberPipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n transform(\n value: number | undefined | null,\n system: MoneySystem = 'IN',\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n if (value === 0) return '0';\n\n const { amount, labelKey } = formatMoney(Math.abs(value), system);\n // Below the first threshold a tiny value can still round to `0`.\n if (Number(amount) === 0) return '0';\n\n const label = labelKey\n ? ` ${this.translateService.translate(labelKey)}`\n : '';\n const sign = value < 0 ? '-' : forceSign ? '+' : '';\n return `${sign}${amount}${label}`;\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { HttpService } from '../services/http';\n\n@Pipe({\n name: 'assetUrl',\n})\nexport class AssetUrlPipe implements PipeTransform {\n private readonly http = inject(HttpService);\n\n transform(value: string | null | undefined): string {\n return this.http.getAssetUrl(value);\n }\n}\n","import { Config } from '../../../type/config/config-type';\n\nexport type SectionTableAlign = 'left' | 'center' | 'right';\n\n/** What a sorting column compares its values as. */\nexport type SectionTableDataType = 'text' | 'number' | 'date';\n\n/**\n * Which way a SectionTable sorts. An enum rather than a union so a generated\n * Screen keeping the direction keeps it as this vocabulary, the way it keeps\n * the column as its SortEnum (m-one-ui ADR 0203). Its values are the words the\n * union always held, so a stored or compared `'asc'` still reads the same.\n */\nexport enum SectionTableSortDirection {\n Asc = 'asc',\n Desc = 'desc',\n}\n\n/**\n * A SectionTable's look. It never draws a panel border: `zebra` shades every\n * other row, `compact` and `spacious` tighten or loosen the cell padding,\n * `border` draws a thick rule along its top and a thinner one along its\n * bottom.\n */\nexport type SectionTableVariant =\n | 'default'\n | 'zebra'\n | 'compact'\n | 'spacious'\n | 'border';\n\nexport const SECTION_TABLE_VARIANTS: readonly SectionTableVariant[] = [\n 'default',\n 'zebra',\n 'compact',\n 'spacious',\n 'border',\n];\n\n/**\n * One entry in a SectionTable's configured heading (GLOSSARY.md\n * SectionTableColumn). The cells beneath it line up by position, so nothing\n * here says how a cell renders — a cell renders what was put in it.\n *\n * `Id` is the vocabulary of column ids — `string` unless a caller narrows it.\n * A generated Screen narrows it to the enum of its sorting columns' ids, so\n * the `sortChange` it binds already carries that enum (m-one-ui ADR 0203).\n */\nexport type SectionTableColumn<Id extends string = string> = {\n /**\n * The column's position when unset. A sorting column's `id` is the key of\n * the row it sorts by, and must be written (m-one-ui ADR 0148).\n */\n id?: Id;\n /** A translation key. */\n label?: string;\n align?: SectionTableAlign;\n /** 1–12: its share of the table's width. Unset columns divide what is left. */\n span?: number;\n sortable?: boolean;\n dataType?: SectionTableDataType;\n /**\n * The rows start sorted by this column. Needs a written `id`, as `sortable`\n * does; the first such column wins.\n */\n defaultSort?: boolean;\n /** The default sort's direction: ascending when set, descending when not. */\n ascending?: boolean;\n /** Freezes this column and every column before it to the left edge. */\n freeze?: boolean;\n /** Starts folded, with a toggle in its heading (GLOSSARY.md Squeeze). */\n squeeze?: boolean;\n};\n\n/** The sort in force: which column, and which way. */\nexport type SectionTableSort<Id extends string = string> = {\n id: Id;\n direction: SectionTableSortDirection;\n dataType?: SectionTableDataType;\n};\n\nexport type SectionTableConfig<Id extends string = string> = Config & {\n columns?: SectionTableColumn<Id>[];\n sticky?: boolean;\n /** 1em outside the table, above and below — beyond a `border` rule. */\n margin?: boolean;\n variant?: SectionTableVariant;\n};\n","import {\n SectionTableColumn,\n SectionTableSort,\n SectionTableSortDirection,\n} from '../../type/section-table';\n\n/** A column's id, falling back to its position (m-one-ui ADR 0148). */\nexport const sectionTableColumnId = <Id extends string>(\n column: SectionTableColumn<Id>,\n index: number\n): Id | string => column.id || String(index);\n\n/**\n * Each column's width as a CSS length: a `span` is its twelfth-share of the\n * table, and a column without one gets `undefined` so the `<table>` divides\n * what the spanned columns left.\n */\nexport const sectionTableColumnWidths = (\n columns: readonly SectionTableColumn[]\n): (string | undefined)[] =>\n columns.map(({ span }) => {\n if (span == null || !Number.isFinite(span)) return undefined;\n const clamped = Math.min(12, Math.max(1, Math.round(span)));\n return `${(clamped * 100) / 12}%`;\n });\n\n/**\n * How many leading columns are frozen: freezing a column freezes every column\n * before it, because a frozen column pinned past an unfrozen one would slide\n * over it.\n */\nexport const sectionTableFrozenCount = (\n columns: readonly SectionTableColumn[]\n): number => {\n let last = -1;\n columns.forEach((column, i) => {\n if (column.freeze) last = i;\n });\n return last + 1;\n};\n\n/** The next sort after a click on the column with `id`. */\nexport const nextSectionTableSort = <Id extends string>(\n current: SectionTableSort<Id> | null,\n id: Id,\n dataType: SectionTableSort['dataType']\n): SectionTableSort<Id> =>\n current?.id === id\n ? {\n id,\n dataType,\n direction:\n current.direction === SectionTableSortDirection.Asc\n ? SectionTableSortDirection.Desc\n : SectionTableSortDirection.Asc,\n }\n : { id, dataType, direction: SectionTableSortDirection.Asc };\n\n/** The sort a table starts with: its first `defaultSort` column's, if any. */\nexport const defaultSectionTableSort = <Id extends string>(\n columns: readonly SectionTableColumn<Id>[]\n): SectionTableSort<Id> | null => {\n const column = columns.find((one) => one.defaultSort);\n // A default sort needs a written id, as a sorting column does (ADR 0148):\n // one left positional names no key of the row, and sorts by nothing.\n if (!column?.id) return null;\n return {\n id: column.id,\n dataType: column.dataType,\n direction: column.ascending\n ? SectionTableSortDirection.Asc\n : SectionTableSortDirection.Desc,\n };\n};\n\nconst readPath =(row: unknown, path: string): unknown =>\n path\n .split('.')\n .reduce<unknown>(\n (value, key) =>\n value != null && typeof value === 'object'\n ? (value as Record<string, unknown>)[key]\n : undefined,\n row\n );\n\nconst comparable = (\n value: unknown,\n dataType: SectionTableSort['dataType']\n): number | string | undefined => {\n if (value == null || value === '') return undefined;\n if (dataType === 'number') {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isNaN(n) ? undefined : n;\n }\n if (dataType === 'date') {\n const t =\n value instanceof Date ? value.getTime() : new Date(String(value)).getTime();\n return Number.isNaN(t) ? undefined : t;\n }\n return String(value).toLocaleLowerCase();\n};\n\n/**\n * A copy of `rows` ordered by `sort`, the input untouched. Missing values sink\n * to the end in either direction — an empty cell is not the smallest value.\n */\nexport const sortSectionTableRows = <T>(\n rows: readonly T[] | null | undefined,\n sort: SectionTableSort | null | undefined\n): T[] => {\n const list = [...(rows ?? [])];\n if (!sort) return list;\n const sign = sort.direction === SectionTableSortDirection.Asc ? 1 : -1;\n return list\n .map((row, i) => ({ row, i, key: comparable(readPath(row, sort.id), sort.dataType) }))\n .sort((a, b) => {\n if (a.key === undefined || b.key === undefined) {\n if (a.key === b.key) return a.i - b.i;\n return a.key === undefined ? 1 : -1;\n }\n const diff =\n typeof a.key === 'number' && typeof b.key === 'number'\n ? a.key - b.key\n : String(a.key).localeCompare(String(b.key));\n return diff === 0 ? a.i - b.i : diff * sign;\n })\n .map(({ row }) => row);\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport type { SectionTableSort } from '../ui/section/type/section-table';\nimport { sortSectionTableRows } from '../ui/section/lib/functions/section-table';\n\n/**\n * A SectionTable's sort applied to a Repeat's collection:\n * `@for (row of (rows | sectionTableSort: table.sort()); …)`. The `@for` is the\n * Repeat's, not the table's, so the table reorders a collection it does not\n * own through this and nothing else (m-one-ui ADR 0148).\n *\n * Pure: a new order needs a new sort or a new collection, never a mutated one.\n */\n@Pipe({\n name: 'sectionTableSort',\n})\nexport class SectionTableSortPipe implements PipeTransform {\n transform<T>(\n rows: readonly T[] | null | undefined,\n sort: SectionTableSort | null | undefined\n ): T[] {\n return sortSectionTableRows(rows, sort);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * One value as the one-item list a collection input holds — `id | toList`\n * hands `[id]` to an input typed `string[]`. An absent value is an empty list,\n * never `[undefined]`.\n *\n * A pipe rather than an inline `[id]`: an array literal in a template binding\n * is what `no-inline-config-template` rejects (ADR 0010). Pure, so the list is\n * rebuilt only when the value changes and the input sees a stable reference.\n */\n@Pipe({\n name: 'toList',\n})\nexport class ToListPipe implements PipeTransform {\n transform<T>(value: T | undefined | null): T[] {\n return value == null ? [] : [value];\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { TranslatePipe } from '../../../pipe';\n\n@Component({\n selector: 'm-label',\n template: `\n <label\n [class.required]=\"required()\"\n [class.disabled]=\"disabled()\"\n [attr.for]=\"for() || null\"\n >\n @if (color()) {\n <span class=\"label__swatch\" [style.background]=\"color()\"></span>\n }\n @if (noTranslate()) {\n {{ placeholder() }}\n } @else {\n {{ placeholder() | translate: params() }}\n }\n </label>\n `,\n imports: [TranslatePipe],\n styleUrl: './label.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LabelComponent {\n for = input<string>();\n placeholder = input<string>();\n // The label's [MessageVariable] values — a Field whose label is a sentence\n // with a datum in it (m-one-ui ADR 0066).\n params = input<Record<string, string> | undefined>();\n required = input<boolean>();\n disabled = input<boolean>();\n color = input<string>();\n // Authored text rather than an i18n key — an option label mapped from a row\n // the app holds, which the dictionary has never heard of.\n noTranslate = input<boolean>();\n}\n\n"],"mappings":";;;;AAIA,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AAMxB,IAAa,cAAb,MAAa,YAAW;CACL,mBAAmB,OAAO,gBAAgB;CAC1C,MAAM,OAAO,iBAAiB;CACvC,oBAAyC;CACzC,YAAuC;CAE/C,UAAU,OAAgC;EACxC,IAAI,CAAC,OAAO,OAAO;EAEnB,IAAI,UAAU,KAAK,WAAW;GAC5B,KAAK,YAAY;GACjB,KAAK,WAAU;EACjB;EAEA,MAAM,OAAO,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI;EAE3D,MAAM,UAAU,KAAK,wBAAO,IADZ,KACY,EAAA,CAAI,QAAO,IAAK,KAAK,QAAO,KAAM,GAAI;EAElE,IAAI,UAAU,mBACZ,OAAO,KAAK,iBAAiB,UAAU,UAAU;EAGnD,IAAI;EACJ,IAAI;EAEJ,IAAI,UAAU,iBAAiB;GAC7B,QAAQ,KAAK,MAAM,UAAU,iBAAiB;GAC9C,OAAO,UAAU,IAAI,WAAW;EAClC,OAAO,IAAI,UAAU,gBAAgB;GACnC,QAAQ,KAAK,MAAM,UAAU,eAAe;GAC5C,OAAO,UAAU,IAAI,SAAS;EAChC,OAAO,IAAI,UAAU,kBAAkB;GACrC,QAAQ,KAAK,MAAM,UAAU,cAAc;GAC3C,OAAO,UAAU,IAAI,QAAQ;EAC/B,OAAO,IAAI,UAAU,iBAAiB;GACpC,QAAQ,KAAK,MAAM,UAAU,gBAAgB;GAC7C,OAAO,UAAU,IAAI,UAAU;EACjC,OAAO;GACL,QAAQ,KAAK,MAAM,UAAU,eAAe;GAC5C,OAAO,UAAU,IAAI,SAAS;EAChC;EAEA,OAAO,KAAK,iBAAiB,UAC3B,kBAAkB,MAAK,QAAS,MAAM;CAE1C;CAEQ,aAAU;EAChB,KAAK,WAAU;EAEf,KAAK,oBAAoB,SAAS,GAAK,CAAC,CAAC,gBAAe;GACtD,KAAK,IAAI,cAAa;EACxB,CAAC;CACH;CAEQ,aAAU;EAChB,IAAI,KAAK,mBAAmB;GAC1B,KAAK,kBAAkB,YAAW;GAClC,KAAK,oBAAoB;EAC3B;CACF;CAEA,cAAW;EACT,KAAK,WAAU;CACjB;CAhEW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAX,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,cAAA;EAAA,MAAA;EAAA,MAAA;CAAA,CAAA;;AAAX,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAW,YAAA,CAAA;EAJvB,MAAA;EAAK,MAAA,CAAA;GACJ,MAAM;GACN,MAAM;EACP,CAAA;;;ACAD,MAAM,gBAA6B;CACjC;EAAE,KAAK;EAAa,UAAU;EAAM,YAAY;CAAQ;CACxD;EAAE,KAAK;EAAU,UAAU;EAAK,YAAY;CAAG;CAC/C;EAAE,KAAK;EAAO,UAAU;EAAK,YAAY;CAAG;AAC7C;AAED,MAAM,kBAA+B;CACnC;EAAE,KAAK;EAAmB,UAAU;EAAK,YAAY;CAAQ;CAC7D;EAAE,KAAK;EAAe,UAAU;EAAK,YAAY;CAAK;CACtD;EAAE,KAAK;EAAW,UAAU;EAAK,YAAY;CAAK;CAClD;EAAE,KAAK;EAAO,UAAU;EAAK,YAAY;CAAK;AAC/C;AAOD,MAAa,eACX,OACA,WACe;CACf,MAAM,aAAa,WAAW,OAAO,gBAAgB;CAErD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,MAAM,EAAE,KAAK,UAAU,eAAe,WAAW;EACjD,IAAI,SAAS,KAAK;GAChB,MAAM,UAAU,YAAY,QAAQ,IAAA,CAAK,QAAQ,CAAC,CAAC;GACnD,IAAI,WAAW,cAAc,IAAI,GAAG;IAClC,MAAM,SAAS,WAAW,IAAI;IAC9B,OAAO;KACL,QAAQ,YAAY,QAAQ,OAAO,IAAA,CAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAQ;KAC5D,UAAU,OAAO;IAClB;GACH;GACA,OAAO;IAAE,QAAQ,QAAQ,SAAQ;IAAI;GAAQ;EAC/C;CACF;CAEA,OAAO;EAAE,QAAQ,WAAW,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAQ;EAAI,UAAU;CAAE;AACxE;AC7CA,IAAa,YAAb,MAAa,UAAS;CACH,mBAAmB,OAAO,gBAAgB;CAE3D,UACE,OACA,SAAsB,MACtB,SAAS,KACT,YAAY,OAAK;EAEjB,IAAI,SAAS,QAAQ,MAAM,KAAK,GAAG,OAAO;EAC1C,IAAI,UAAU,GAAG,OAAO,GAAG,OAAM;EAEjC,MAAM,aAAa,QAAQ;EAE3B,MAAM,EAAE,QAAQ,aAAa,YADZ,KAAK,IAAI,KACe,GAAU,MAAM;EACzD,MAAM,QAAQ,WACV,IAAI,KAAK,iBAAiB,UAAU,QAAQ,MAC5C;EAGJ,OAAO,GADM,aAAa,MAAM,YAAY,MAAM,KACjC,SAAS,SAAS;CACrC;CArBW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAS,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAT,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAS,cAAA;EAAA,MAAA;EAAA,MAAA;CAAA,CAAA;;AAAT,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EAJrB,MAAA;EAAK,MAAA,CAAA;GACJ,MAAM;GACN,MAAM;EACP,CAAA;;;ACUD,IAAa,iBAAb,MAAa,eAAc;CACzB,UACE,OACA,WAAW,GACX,YAAY,OAAK;EAEjB,IAAI,SAAS,QAAQ,MAAM,KAAK,GAAG,OAAO;EAE1C,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC;EAC/C,MAAM,WAAW,KAAK,IAAI,KAAK,CAAC,CAAC,QAAQ,MAAM;EAS/C,OAAO,GAPY,QAAQ,KAAK,OAAO,QAAQ,MAAM,IAGjD,MACA,aAAa,OAAO,QAAQ,MAAM,IAChC,MACA,KACW,SAAQ;CAC3B;CAnBW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,cAAA;EAAA,MAAA;CAAA,CAAA;;AAAd,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAH1B,MAAA;EAAK,MAAA,CAAA,EACJ,MAAM,aACP,CAAA;;;ACDD,IAAa,gBAAb,MAAa,cAAa;CACxB,UACE,OACA,WAAW,WACX,WAAW,SAAO;EAElB,IAAI,SAAS,QAAQ,MAAM,KAAK,KAAK,UAAU,GAAG,OAAO;EACzD,OAAO,QAAQ,IAAI,WAAW;CAChC;CARW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAa,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAb,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAa,cAAA;EAAA,MAAA;CAAA,CAAA;;AAAb,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAa,YAAA,CAAA;EAHzB,MAAA;EAAK,MAAA,CAAA,EACJ,MAAM,YACP,CAAA;;;ACMD,IAAa,oBAAb,MAAa,kBAAiB;CACX,mBAAmB,OAAO,gBAAgB;CAE3D,UACE,OACA,SAAsB,MACtB,YAAY,OAAK;EAEjB,IAAI,SAAS,QAAQ,MAAM,KAAK,GAAG,OAAO;EAC1C,IAAI,UAAU,GAAG,OAAO;EAExB,MAAM,EAAE,QAAQ,aAAa,YAAY,KAAK,IAAI,KAAK,GAAG,MAAM;EAEhE,IAAI,OAAO,MAAM,MAAM,GAAG,OAAO;EAEjC,MAAM,QAAQ,WACV,IAAI,KAAK,iBAAiB,UAAU,QAAQ,MAC5C;EAEJ,OAAO,GADM,QAAQ,IAAI,MAAM,YAAY,MAAM,KAChC,SAAS;CAC5B;CApBW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,MAAA;EAAA,MAAA;CAAA,CAAA;;AAAjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAJ7B,MAAA;EAAK,MAAA,CAAA;GACJ,MAAM;GACN,MAAM;EACP,CAAA;;;ACbD,IAAa,eAAb,MAAa,aAAY;CACN,OAAO,OAAO,WAAW;CAE1C,UAAU,OAAgC;EACxC,OAAO,KAAK,KAAK,YAAY,KAAK;CACpC;CALW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAZ,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,cAAA;EAAA,MAAA;CAAA,CAAA;;AAAZ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAY,YAAA,CAAA;EAHxB,MAAA;EAAK,MAAA,CAAA,EACJ,MAAM,WACP,CAAA;;;ACQD,IAAY;CAAZ,SAAY,2BAAyB;CACnC,0BAAA,SAAA;CACA,0BAAA,UAAA;AACF,EAAA,CAHY,8BAAA,4BAAyB,CAAA,EAAA;AAkBrC,MAAa,yBAAyD;CACpE;CACA;CACA;CACA;CACA;AACD;AC9BD,MAAa,wBACX,QACA,UACgB,OAAO,MAAM,OAAO,KAAK;AAO3C,MAAa,4BACX,YAEA,QAAQ,KAAK,EAAE,WAAU;CACvB,IAAI,QAAQ,QAAQ,CAAC,OAAO,SAAS,IAAI,GAAG,OAAO;CAEnD,OAAO,GADS,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,CAC9C,IAAU,MAAO,GAAE;AAChC,CAAC;AAOH,MAAa,2BACX,YACU;CACV,IAAI,OAAO;CACX,QAAQ,SAAS,QAAQ,MAAK;EAC5B,IAAI,OAAO,QAAQ,OAAO;CAC5B,CAAC;CACD,OAAO,OAAO;AAChB;AAGA,MAAa,wBACX,SACA,IACA,aAEA,SAAS,OAAO,KACZ;CACE;CACA;CACA,WACE,QAAQ,cAAc,0BAA0B,MAC5C,0BAA0B,OAC1B,0BAA0B;AACjC,IACD;CAAE;CAAI;CAAU,WAAW,0BAA0B;AAAG;AAG9D,MAAa,2BACX,YAC+B;CAC/B,MAAM,SAAS,QAAQ,MAAM,QAAQ,IAAI,WAAW;CAGpD,IAAI,CAAC,QAAQ,IAAI,OAAO;CACxB,OAAO;EACL,IAAI,OAAO;EACX,UAAU,OAAO;EACjB,WAAW,OAAO,YACd,0BAA0B,MAC1B,0BAA0B;CAC/B;AACH;AAEA,MAAM,YAAW,KAAc,SAC7B,KACG,MAAM,GAAG,CAAC,CACV,QACE,OAAO,QACN,SAAS,QAAQ,OAAO,UAAU,WAC7B,MAAkC,OACnC,QACN,GAAG;AAGT,MAAM,cACJ,OACA,aAC+B;CAC/B,IAAI,SAAS,QAAQ,UAAU,IAAI,OAAO;CAC1C,IAAI,aAAa,UAAU;EACzB,MAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;EAC1D,OAAO,OAAO,MAAM,CAAC,IAAI,SAAY;CACvC;CACA,IAAI,aAAa,QAAQ;EACvB,MAAM,IACJ,iBAAiB,OAAO,MAAM,QAAO,IAAK,IAAI,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,QAAO;EAC3E,OAAO,OAAO,MAAM,CAAC,IAAI,SAAY;CACvC;CACA,OAAO,OAAO,KAAK,CAAC,CAAC,kBAAiB;AACxC;AAMA,MAAa,wBACX,MACA,SACO;CACP,MAAM,OAAO,CAAC,GAAI,QAAQ,CAAA,CAAG;CAC7B,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,OAAO,KAAK,cAAc,0BAA0B,MAAM,IAAI;CACpE,OAAO,KACJ,KAAK,KAAK,OAAO;EAAE;EAAK;EAAG,KAAK,WAAW,SAAS,KAAK,KAAK,EAAE,GAAG,KAAK,QAAQ;CAAC,EAAG,CAAC,CACrF,MAAM,GAAG,MAAK;EACb,IAAI,EAAE,QAAQ,UAAa,EAAE,QAAQ,QAAW;GAC9C,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,IAAI,EAAE;GACpC,OAAO,EAAE,QAAQ,SAAY,IAAI;EACnC;EACA,MAAM,OACJ,OAAO,EAAE,QAAQ,YAAY,OAAO,EAAE,QAAQ,WAC1C,EAAE,MAAM,EAAE,MACV,OAAO,EAAE,GAAG,CAAC,CAAC,cAAc,OAAO,EAAE,GAAG,CAAC;EAC/C,OAAO,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO;CACzC,CAAC,CAAC,CACD,KAAK,EAAE,UAAU,GAAG;AACzB;ACjHA,IAAa,uBAAb,MAAa,qBAAoB;CAC/B,UACE,MACA,MAAyC;EAEzC,OAAO,qBAAqB,MAAM,IAAI;CACxC;CANW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,MAAA;CAAA,CAAA;;AAApB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EAHhC,MAAA;EAAK,MAAA,CAAA,EACJ,MAAM,mBACP,CAAA;;;ACAD,IAAa,aAAb,MAAa,WAAU;CACrB,UAAa,OAA2B;EACtC,OAAO,SAAS,OAAO,CAAA,IAAK,CAAC,KAAK;CACpC;CAHW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,QAAA,GAAA,gBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,cAAA;EAAA,MAAA;CAAA,CAAA;;AAAV,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EAHtB,MAAA;EAAK,MAAA,CAAA,EACJ,MAAM,SACP,CAAA;;;ACYD,IAAa,iBAAb,MAAa,eAAc;CACzB,MAAM,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CACrB,cAAc,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAG7B,SAAS,MAA2C,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACpD,WAAW,MAAgB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,WAAW,MAAgB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,QAAQ,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAGvB,cAAc,MAAgB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAXnB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UApBf;;;;;;;;;;;;;;;;EAeT,UAAA;EAAA,QAAA,CAAA,w8CAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MACS;GAAa,MAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAIZ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAtB1B,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAS,UACT;;;;;;;;;;;;;;;;GAeT,SACQ,CAAC,aAAa;GAAC,iBAEP,wBAAwB;GAAM,QAAA,CAAA,w8CAAA;EAAA,CAAA"}