@pecb-ui/components 1.1.2

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 (56) hide show
  1. package/README.md +556 -0
  2. package/esm2022/lib/components/button/button.component.mjs +171 -0
  3. package/esm2022/lib/components/card/card.component.mjs +182 -0
  4. package/esm2022/lib/components/checkbox/checkbox.component.mjs +126 -0
  5. package/esm2022/lib/components/datepicker/datepicker.component.mjs +349 -0
  6. package/esm2022/lib/components/dropdown/dropdown.component.mjs +329 -0
  7. package/esm2022/lib/components/input/input.component.mjs +321 -0
  8. package/esm2022/lib/components/pagination/pagination.component.mjs +197 -0
  9. package/esm2022/lib/components/radio/radio.component.mjs +147 -0
  10. package/esm2022/lib/components/right-modal/right-modal.component.mjs +234 -0
  11. package/esm2022/lib/components/sidebar/sidebar.component.mjs +155 -0
  12. package/esm2022/lib/components/status/status.component.mjs +50 -0
  13. package/esm2022/lib/components/tab/tab.component.mjs +151 -0
  14. package/esm2022/lib/components/table/table.component.mjs +503 -0
  15. package/esm2022/lib/components/toggle/toggle.component.mjs +126 -0
  16. package/esm2022/lib/pecb-components.module.mjs +118 -0
  17. package/esm2022/lib/services/loading.service.mjs +182 -0
  18. package/esm2022/lib/services/notification.service.mjs +144 -0
  19. package/esm2022/lib/services/theme.service.mjs +232 -0
  20. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +2 -0
  21. package/esm2022/lib/shared/types/common.types.mjs +6 -0
  22. package/esm2022/lib/shared/utils/accessibility.utils.mjs +223 -0
  23. package/esm2022/lib/shared/utils/dom.utils.mjs +240 -0
  24. package/esm2022/lib/shared/utils/error.utils.mjs +277 -0
  25. package/esm2022/lib/shared/utils/string.utils.mjs +204 -0
  26. package/esm2022/pecb-ui-components.mjs +5 -0
  27. package/esm2022/public-api.mjs +53 -0
  28. package/fesm2022/pecb-ui-components.mjs +4587 -0
  29. package/fesm2022/pecb-ui-components.mjs.map +1 -0
  30. package/index.d.ts +5 -0
  31. package/lib/components/button/button.component.d.ts +130 -0
  32. package/lib/components/card/card.component.d.ts +140 -0
  33. package/lib/components/checkbox/checkbox.component.d.ts +74 -0
  34. package/lib/components/datepicker/datepicker.component.d.ts +155 -0
  35. package/lib/components/dropdown/dropdown.component.d.ts +144 -0
  36. package/lib/components/input/input.component.d.ts +215 -0
  37. package/lib/components/pagination/pagination.component.d.ts +53 -0
  38. package/lib/components/radio/radio.component.d.ts +93 -0
  39. package/lib/components/right-modal/right-modal.component.d.ts +137 -0
  40. package/lib/components/sidebar/sidebar.component.d.ts +97 -0
  41. package/lib/components/status/status.component.d.ts +19 -0
  42. package/lib/components/tab/tab.component.d.ts +102 -0
  43. package/lib/components/table/table.component.d.ts +403 -0
  44. package/lib/components/toggle/toggle.component.d.ts +74 -0
  45. package/lib/pecb-components.module.d.ts +37 -0
  46. package/lib/services/loading.service.d.ts +129 -0
  47. package/lib/services/notification.service.d.ts +136 -0
  48. package/lib/services/theme.service.d.ts +142 -0
  49. package/lib/shared/interfaces/component.interfaces.d.ts +283 -0
  50. package/lib/shared/types/common.types.d.ts +86 -0
  51. package/lib/shared/utils/accessibility.utils.d.ts +167 -0
  52. package/lib/shared/utils/dom.utils.d.ts +108 -0
  53. package/lib/shared/utils/error.utils.d.ts +191 -0
  54. package/lib/shared/utils/string.utils.d.ts +144 -0
  55. package/package.json +61 -0
  56. package/public-api.d.ts +24 -0
@@ -0,0 +1,151 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { generateUniqueId } from '../../shared/utils/dom.utils';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /**
7
+ * A professional tab component with multiple styles and sizes.
8
+ * Fully accessible with WCAG 2.1 AA compliance.
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <pecb-tab
13
+ * label="Tab Name"
14
+ * [active]="true"
15
+ * style="rounded"
16
+ * size="md"
17
+ * (clicked)="handleClick()"
18
+ * ></pecb-tab>
19
+ *
20
+ * <!-- With badge number and close button -->
21
+ * <pecb-tab
22
+ * label="Tab Name"
23
+ * [icon]="10"
24
+ * [closable]="true"
25
+ * [active]="true"
26
+ * (closed)="handleClose()"
27
+ * ></pecb-tab>
28
+ * ```
29
+ *
30
+ * @publicApi
31
+ */
32
+ export class TabComponent {
33
+ constructor() {
34
+ /**
35
+ * Unique ID for the tab element
36
+ */
37
+ this.id = generateUniqueId('tab');
38
+ /**
39
+ * The visual style of the tab
40
+ */
41
+ this.style = 'rounded';
42
+ /**
43
+ * The size of the tab
44
+ */
45
+ this.size = 'md';
46
+ /**
47
+ * Label text to display
48
+ */
49
+ this.label = 'Tab Name';
50
+ /**
51
+ * Whether the tab is in active state
52
+ */
53
+ this.active = false;
54
+ /**
55
+ * Whether the tab is disabled
56
+ */
57
+ this.disabled = false;
58
+ /**
59
+ * Whether to show close button
60
+ */
61
+ this.closable = true;
62
+ /**
63
+ * Event emitted when the tab is clicked
64
+ */
65
+ this.clicked = new EventEmitter();
66
+ /**
67
+ * Event emitted when the close button is clicked
68
+ */
69
+ this.closed = new EventEmitter();
70
+ }
71
+ /**
72
+ * Get CSS classes for the tab
73
+ */
74
+ get tabClasses() {
75
+ return [
76
+ 'pecb-tab',
77
+ `pecb-tab--${this.style}`,
78
+ `pecb-tab--${this.size}`,
79
+ this.active ? 'pecb-tab--active' : '',
80
+ this.disabled ? 'pecb-tab--disabled' : ''
81
+ ].filter(Boolean);
82
+ }
83
+ /**
84
+ * Handle tab click
85
+ */
86
+ onClick(event) {
87
+ if (!this.disabled) {
88
+ event.stopPropagation();
89
+ this.clicked.emit(this.id);
90
+ }
91
+ }
92
+ /**
93
+ * Handle close button click
94
+ */
95
+ onClose(event) {
96
+ if (!this.disabled) {
97
+ event.stopPropagation();
98
+ this.closed.emit(this.id);
99
+ }
100
+ }
101
+ /**
102
+ * Handle keyboard events for accessibility
103
+ */
104
+ onKeyDown(event) {
105
+ if (this.disabled)
106
+ return;
107
+ // Handle Enter/Space for tab selection
108
+ if (event.key === 'Enter' || event.key === ' ') {
109
+ event.preventDefault();
110
+ this.clicked.emit(this.id);
111
+ }
112
+ // Handle Delete/Backspace for close (if closable)
113
+ if (this.closable && (event.key === 'Delete' || event.key === 'Backspace')) {
114
+ event.preventDefault();
115
+ this.closed.emit(this.id);
116
+ }
117
+ }
118
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
119
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TabComponent, isStandalone: true, selector: "pecb-tab", inputs: { id: "id", style: "style", size: "size", label: "label", icon: "icon", active: "active", disabled: "disabled", closable: "closable", ariaLabel: "ariaLabel", ariaControls: "ariaControls", ariaSelected: "ariaSelected" }, outputs: { clicked: "clicked", closed: "closed" }, ngImport: i0, template: "<div\r\n [id]=\"id\"\r\n [class]=\"tabClasses.join(' ')\"\r\n role=\"tab\"\r\n [attr.aria-label]=\"ariaLabel || label\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-selected]=\"ariaSelected !== undefined ? ariaSelected : active\"\r\n [attr.aria-disabled]=\"disabled\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-tab__content\">\r\n <!-- Label -->\r\n <span class=\"pecb-tab__label\">{{ label }}</span>\r\n\r\n <!-- Icon/Badge -->\r\n <span *ngIf=\"icon\" class=\"pecb-tab__icon\" aria-hidden=\"true\">\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Close button -->\r\n <button\r\n *ngIf=\"closable\"\r\n type=\"button\"\r\n class=\"pecb-tab__close\"\r\n [attr.aria-label]=\"'Close ' + label\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClose($event)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n</div>\r\n", styles: [".pecb-tab{position:relative;display:inline-flex;align-items:center;justify-content:center;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;text-align:center;cursor:pointer;-webkit-user-select:none;user-select:none;background-color:#ececec;color:#616161;border:1px solid transparent;transition-property:background-color,border-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-tab--sm{padding:6px 12px;font-size:12px;gap:6px;border-radius:6px}.pecb-tab--sm .pecb-tab__content{gap:6px}.pecb-tab--sm .pecb-tab__icon{width:14px;height:14px;font-size:12px}.pecb-tab--sm .pecb-tab__close{width:14px;height:14px;font-size:14px;margin-left:6px}.pecb-tab--md{padding:8px 16px;font-size:14px;gap:8px;border-radius:8px}.pecb-tab--md .pecb-tab__content{gap:8px}.pecb-tab--md .pecb-tab__icon{width:16px;height:16px;font-size:14px}.pecb-tab--md .pecb-tab__close{width:16px;height:16px;font-size:16px;margin-left:8px}.pecb-tab--rounded{border-radius:80px;background-color:#ececec;color:#616161;border-color:transparent}.pecb-tab--rounded.pecb-tab--sm{border-radius:80px}.pecb-tab--rounded:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){background-color:#e4e4e4;color:#313131}.pecb-tab--rounded.pecb-tab--active{background-color:#c2c2c2;color:#212427;border-color:transparent;font-weight:500}.pecb-tab--rounded.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--rounded.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--rounded.pecb-tab--disabled{background-color:#ececec;color:#919191;cursor:not-allowed}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab--line{border-radius:0;background-color:transparent!important;border:none;border-bottom:2px solid transparent;padding-bottom:8px;color:#616161}.pecb-tab--line.pecb-tab--sm{padding-bottom:6px;border-bottom-width:2px}.pecb-tab--line:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){color:#313131;border-bottom-color:#c2c2c2;background-color:transparent!important}.pecb-tab--line.pecb-tab--active{color:#a11e29;border-bottom-color:#a11e29;font-weight:500;background-color:transparent!important}.pecb-tab--line.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--line.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--line.pecb-tab--disabled{color:#919191;cursor:not-allowed;background-color:transparent!important;border-bottom-color:#c2c2c2}.pecb-tab--line.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--line.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab__content{display:inline-flex;align-items:center;justify-content:center;gap:8px}.pecb-tab__icon{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 6px;border-radius:10px;background-color:#a11e29;color:#fff;font-size:12px;font-weight:700;line-height:1;flex-shrink:0;white-space:nowrap}.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab__label{white-space:nowrap;line-height:1.2}.pecb-tab__close{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background-color:transparent;color:#313131;cursor:pointer;border-radius:50%;font-size:16px;line-height:1;flex-shrink:0;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab__close:hover:not(:disabled){background-color:#3131311a;color:#313131}.pecb-tab__close:active:not(:disabled){background-color:#31313133}.pecb-tab__close:disabled{cursor:not-allowed;opacity:.5}.pecb-tab__close:focus-visible{outline:2px solid #a11e29;outline-offset:1px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
120
+ }
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'pecb-tab', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n [id]=\"id\"\r\n [class]=\"tabClasses.join(' ')\"\r\n role=\"tab\"\r\n [attr.aria-label]=\"ariaLabel || label\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-selected]=\"ariaSelected !== undefined ? ariaSelected : active\"\r\n [attr.aria-disabled]=\"disabled\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-tab__content\">\r\n <!-- Label -->\r\n <span class=\"pecb-tab__label\">{{ label }}</span>\r\n\r\n <!-- Icon/Badge -->\r\n <span *ngIf=\"icon\" class=\"pecb-tab__icon\" aria-hidden=\"true\">\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Close button -->\r\n <button\r\n *ngIf=\"closable\"\r\n type=\"button\"\r\n class=\"pecb-tab__close\"\r\n [attr.aria-label]=\"'Close ' + label\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClose($event)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n</div>\r\n", styles: [".pecb-tab{position:relative;display:inline-flex;align-items:center;justify-content:center;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;text-align:center;cursor:pointer;-webkit-user-select:none;user-select:none;background-color:#ececec;color:#616161;border:1px solid transparent;transition-property:background-color,border-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-tab--sm{padding:6px 12px;font-size:12px;gap:6px;border-radius:6px}.pecb-tab--sm .pecb-tab__content{gap:6px}.pecb-tab--sm .pecb-tab__icon{width:14px;height:14px;font-size:12px}.pecb-tab--sm .pecb-tab__close{width:14px;height:14px;font-size:14px;margin-left:6px}.pecb-tab--md{padding:8px 16px;font-size:14px;gap:8px;border-radius:8px}.pecb-tab--md .pecb-tab__content{gap:8px}.pecb-tab--md .pecb-tab__icon{width:16px;height:16px;font-size:14px}.pecb-tab--md .pecb-tab__close{width:16px;height:16px;font-size:16px;margin-left:8px}.pecb-tab--rounded{border-radius:80px;background-color:#ececec;color:#616161;border-color:transparent}.pecb-tab--rounded.pecb-tab--sm{border-radius:80px}.pecb-tab--rounded:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){background-color:#e4e4e4;color:#313131}.pecb-tab--rounded.pecb-tab--active{background-color:#c2c2c2;color:#212427;border-color:transparent;font-weight:500}.pecb-tab--rounded.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--rounded.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--rounded.pecb-tab--disabled{background-color:#ececec;color:#919191;cursor:not-allowed}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--rounded.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab--line{border-radius:0;background-color:transparent!important;border:none;border-bottom:2px solid transparent;padding-bottom:8px;color:#616161}.pecb-tab--line.pecb-tab--sm{padding-bottom:6px;border-bottom-width:2px}.pecb-tab--line:hover:not(.pecb-tab--disabled):not(.pecb-tab--active){color:#313131;border-bottom-color:#c2c2c2;background-color:transparent!important}.pecb-tab--line.pecb-tab--active{color:#a11e29;border-bottom-color:#a11e29;font-weight:500;background-color:transparent!important}.pecb-tab--line.pecb-tab--active .pecb-tab__icon{background-color:#a11e29;color:#fff}.pecb-tab--line.pecb-tab--active .pecb-tab__close{color:#313131}.pecb-tab--line.pecb-tab--disabled{color:#919191;cursor:not-allowed;background-color:transparent!important;border-bottom-color:#c2c2c2}.pecb-tab--line.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab--line.pecb-tab--disabled .pecb-tab__close{color:#919191}.pecb-tab__content{display:inline-flex;align-items:center;justify-content:center;gap:8px}.pecb-tab__icon{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 6px;border-radius:10px;background-color:#a11e29;color:#fff;font-size:12px;font-weight:700;line-height:1;flex-shrink:0;white-space:nowrap}.pecb-tab--disabled .pecb-tab__icon{background-color:#919191;color:#fff}.pecb-tab__label{white-space:nowrap;line-height:1.2}.pecb-tab__close{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background-color:transparent;color:#313131;cursor:pointer;border-radius:50%;font-size:16px;line-height:1;flex-shrink:0;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-tab__close:hover:not(:disabled){background-color:#3131311a;color:#313131}.pecb-tab__close:active:not(:disabled){background-color:#31313133}.pecb-tab__close:disabled{cursor:not-allowed;opacity:.5}.pecb-tab__close:focus-visible{outline:2px solid #a11e29;outline-offset:1px}\n"] }]
124
+ }], propDecorators: { id: [{
125
+ type: Input
126
+ }], style: [{
127
+ type: Input
128
+ }], size: [{
129
+ type: Input
130
+ }], label: [{
131
+ type: Input
132
+ }], icon: [{
133
+ type: Input
134
+ }], active: [{
135
+ type: Input
136
+ }], disabled: [{
137
+ type: Input
138
+ }], closable: [{
139
+ type: Input
140
+ }], ariaLabel: [{
141
+ type: Input
142
+ }], ariaControls: [{
143
+ type: Input
144
+ }], ariaSelected: [{
145
+ type: Input
146
+ }], clicked: [{
147
+ type: Output
148
+ }], closed: [{
149
+ type: Output
150
+ }] } });
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdGFiL3RhYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBS2hFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBU0gsTUFBTSxPQUFPLFlBQVk7SUFSekI7UUFTRTs7V0FFRztRQUNNLE9BQUUsR0FBVyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5Qzs7V0FFRztRQUNNLFVBQUssR0FBYSxTQUFTLENBQUM7UUFFckM7O1dBRUc7UUFDTSxTQUFJLEdBQVksSUFBSSxDQUFDO1FBRTlCOztXQUVHO1FBQ00sVUFBSyxHQUFHLFVBQVUsQ0FBQztRQU81Qjs7V0FFRztRQUNNLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFeEI7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sYUFBUSxHQUFHLElBQUksQ0FBQztRQW1CekI7O1dBRUc7UUFDTyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUvQzs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0tBcUQvQztJQW5EQzs7T0FFRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU87WUFDTCxVQUFVO1lBQ1YsYUFBYSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3pCLGFBQWEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUMxQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsS0FBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsS0FBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsS0FBb0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUIsdUNBQXVDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7K0dBdEhVLFlBQVk7bUdBQVosWUFBWSwyVkN6Q3pCLGlnQ0FrQ0EsZzRIREVZLFlBQVk7OzRGQUtYLFlBQVk7a0JBUnhCLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNOzhCQU10QyxFQUFFO3NCQUFWLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0ksT0FBTztzQkFBaEIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kb20udXRpbHMnO1xyXG5cclxuZXhwb3J0IHR5cGUgVGFiU3R5bGUgPSAncm91bmRlZCcgfCAnbGluZSc7XHJcbmV4cG9ydCB0eXBlIFRhYlNpemUgPSAnc20nIHwgJ21kJztcclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCB0YWIgY29tcG9uZW50IHdpdGggbXVsdGlwbGUgc3R5bGVzIGFuZCBzaXplcy5cclxuICogRnVsbHkgYWNjZXNzaWJsZSB3aXRoIFdDQUcgMi4xIEFBIGNvbXBsaWFuY2UuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHBlY2ItdGFiXHJcbiAqICAgbGFiZWw9XCJUYWIgTmFtZVwiXHJcbiAqICAgW2FjdGl2ZV09XCJ0cnVlXCJcclxuICogICBzdHlsZT1cInJvdW5kZWRcIlxyXG4gKiAgIHNpemU9XCJtZFwiXHJcbiAqICAgKGNsaWNrZWQpPVwiaGFuZGxlQ2xpY2soKVwiXHJcbiAqID48L3BlY2ItdGFiPlxyXG4gKlxyXG4gKiA8IS0tIFdpdGggYmFkZ2UgbnVtYmVyIGFuZCBjbG9zZSBidXR0b24gLS0+XHJcbiAqIDxwZWNiLXRhYlxyXG4gKiAgIGxhYmVsPVwiVGFiIE5hbWVcIlxyXG4gKiAgIFtpY29uXT1cIjEwXCJcclxuICogICBbY2xvc2FibGVdPVwidHJ1ZVwiXHJcbiAqICAgW2FjdGl2ZV09XCJ0cnVlXCJcclxuICogICAoY2xvc2VkKT1cImhhbmRsZUNsb3NlKClcIlxyXG4gKiA+PC9wZWNiLXRhYj5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNBcGlcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGVjYi10YWInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFiLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYkNvbXBvbmVudCB7XHJcbiAgLyoqXHJcbiAgICogVW5pcXVlIElEIGZvciB0aGUgdGFiIGVsZW1lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gZ2VuZXJhdGVVbmlxdWVJZCgndGFiJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHRhYlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHN0eWxlOiBUYWJTdHlsZSA9ICdyb3VuZGVkJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIHRhYlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNpemU6IFRhYlNpemUgPSAnbWQnO1xyXG5cclxuICAvKipcclxuICAgKiBMYWJlbCB0ZXh0IHRvIGRpc3BsYXlcclxuICAgKi9cclxuICBASW5wdXQoKSBsYWJlbCA9ICdUYWIgTmFtZSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGJhZGdlIG51bWJlciB0byBkaXNwbGF5IGFmdGVyIHRoZSBsYWJlbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGljb24/OiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHRhYiBpcyBpbiBhY3RpdmUgc3RhdGVcclxuICAgKi9cclxuICBASW5wdXQoKSBhY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgdGFiIGlzIGRpc2FibGVkXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBzaG93IGNsb3NlIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNsb3NhYmxlID0gdHJ1ZTtcclxuXHJcbiAgLy8gLS0tIEFSSUEgQWNjZXNzaWJpbGl0eSBQcm9wZXJ0aWVzIC0tLVxyXG5cclxuICAvKipcclxuICAgKiBBY2Nlc3NpYmxlIGxhYmVsIGZvciB0aGUgdGFiXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXJpYUxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJRCBvZiB0aGUgdGFiIHBhbmVsIHRoaXMgdGFiIGNvbnRyb2xzXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXJpYUNvbnRyb2xzPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRhYiBwYW5lbCBpcyBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFyaWFTZWxlY3RlZD86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdGFiIGlzIGNsaWNrZWRcclxuICAgKi9cclxuICBAT3V0cHV0KCkgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGNsb3NlIGJ1dHRvbiBpcyBjbGlja2VkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBHZXQgQ1NTIGNsYXNzZXMgZm9yIHRoZSB0YWJcclxuICAgKi9cclxuICBnZXQgdGFiQ2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAncGVjYi10YWInLFxyXG4gICAgICBgcGVjYi10YWItLSR7dGhpcy5zdHlsZX1gLFxyXG4gICAgICBgcGVjYi10YWItLSR7dGhpcy5zaXplfWAsXHJcbiAgICAgIHRoaXMuYWN0aXZlID8gJ3BlY2ItdGFiLS1hY3RpdmUnIDogJycsXHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPyAncGVjYi10YWItLWRpc2FibGVkJyA6ICcnXHJcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0YWIgY2xpY2tcclxuICAgKi9cclxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KHRoaXMuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGNsb3NlIGJ1dHRvbiBjbGlja1xyXG4gICAqL1xyXG4gIG9uQ2xvc2UoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5jbG9zZWQuZW1pdCh0aGlzLmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHMgZm9yIGFjY2Vzc2liaWxpdHlcclxuICAgKi9cclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgLy8gSGFuZGxlIEVudGVyL1NwYWNlIGZvciB0YWIgc2VsZWN0aW9uXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KHRoaXMuaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBEZWxldGUvQmFja3NwYWNlIGZvciBjbG9zZSAoaWYgY2xvc2FibGUpXHJcbiAgICBpZiAodGhpcy5jbG9zYWJsZSAmJiAoZXZlbnQua2V5ID09PSAnRGVsZXRlJyB8fCBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmNsb3NlZC5lbWl0KHRoaXMuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgW2lkXT1cImlkXCJcclxuICBbY2xhc3NdPVwidGFiQ2xhc3Nlcy5qb2luKCcgJylcIlxyXG4gIHJvbGU9XCJ0YWJcIlxyXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsIHx8IGxhYmVsXCJcclxuICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImFyaWFDb250cm9sc1wiXHJcbiAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhcmlhU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCA/IGFyaWFTZWxlY3RlZCA6IGFjdGl2ZVwiXHJcbiAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IDBcIlxyXG4gIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxyXG4gIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcclxuPlxyXG4gIDxzcGFuIGNsYXNzPVwicGVjYi10YWJfX2NvbnRlbnRcIj5cclxuICAgIDwhLS0gTGFiZWwgLS0+XHJcbiAgICA8c3BhbiBjbGFzcz1cInBlY2ItdGFiX19sYWJlbFwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG5cclxuICAgIDwhLS0gSWNvbi9CYWRnZSAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwiaWNvblwiIGNsYXNzPVwicGVjYi10YWJfX2ljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAge3sgaWNvbiB9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDwhLS0gQ2xvc2UgYnV0dG9uIC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cImNsb3NhYmxlXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNsYXNzPVwicGVjYi10YWJfX2Nsb3NlXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ2xvc2UgJyArIGxhYmVsXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L3NwYW4+XHJcbjwvZGl2PlxyXG4iXX0=