cloud-ide-element 1.0.4 → 1.0.5

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 (54) hide show
  1. package/README.md +63 -271
  2. package/fesm2022/cloud-ide-element.mjs +614 -618
  3. package/fesm2022/cloud-ide-element.mjs.map +1 -1
  4. package/index.d.ts +1362 -3
  5. package/package.json +3 -30
  6. package/esm2022/cloud-ide-element.mjs +0 -5
  7. package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +0 -182
  8. package/esm2022/lib/components/data-grid/data-grid.component.mjs +0 -1363
  9. package/esm2022/lib/components/data-grid/data-grid.types.mjs +0 -37
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -396
  11. package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +0 -30
  12. package/esm2022/lib/components/json-editor/json-editor.component.mjs +0 -521
  13. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +0 -33
  14. package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +0 -152
  15. package/esm2022/lib/elements/button/cide-ele-button.component.mjs +0 -249
  16. package/esm2022/lib/elements/file-input/file-input.component.mjs +0 -83
  17. package/esm2022/lib/elements/icon/icon.component.mjs +0 -26
  18. package/esm2022/lib/elements/input/input.component.mjs +0 -467
  19. package/esm2022/lib/elements/select/select.component.mjs +0 -471
  20. package/esm2022/lib/elements/spinner/spinner.component.mjs +0 -32
  21. package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +0 -74
  22. package/esm2022/lib/elements/textarea/textarea.component.mjs +0 -157
  23. package/esm2022/lib/services/confirmation.service.mjs +0 -151
  24. package/esm2022/lib/services/dropdown-manager.service.mjs +0 -93
  25. package/esm2022/lib/services/notification.service.mjs +0 -196
  26. package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +0 -231
  27. package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +0 -294
  28. package/esm2022/lib/utils/pipes/capitalize/capitalize.pipe.mjs +0 -38
  29. package/esm2022/lib/utils/services/elements/elements.service.mjs +0 -39
  30. package/esm2022/public-api.mjs +0 -31
  31. package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +0 -16
  32. package/lib/components/data-grid/data-grid.component.d.ts +0 -244
  33. package/lib/components/data-grid/data-grid.types.d.ts +0 -146
  34. package/lib/components/dropdown/dropdown.component.d.ts +0 -75
  35. package/lib/components/global-notifications/global-notifications.component.d.ts +0 -5
  36. package/lib/components/json-editor/json-editor.component.d.ts +0 -116
  37. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +0 -11
  38. package/lib/components/toast-notification/toast-notification.component.d.ts +0 -13
  39. package/lib/elements/button/cide-ele-button.component.d.ts +0 -85
  40. package/lib/elements/file-input/file-input.component.d.ts +0 -25
  41. package/lib/elements/icon/icon.component.d.ts +0 -9
  42. package/lib/elements/input/input.component.d.ts +0 -182
  43. package/lib/elements/select/select.component.d.ts +0 -91
  44. package/lib/elements/spinner/spinner.component.d.ts +0 -19
  45. package/lib/elements/tab/cide-ele-tab.component.d.ts +0 -26
  46. package/lib/elements/textarea/textarea.component.d.ts +0 -47
  47. package/lib/services/confirmation.service.d.ts +0 -65
  48. package/lib/services/dropdown-manager.service.d.ts +0 -22
  49. package/lib/services/notification.service.d.ts +0 -81
  50. package/lib/utils/directives/resizer/resizer.directive.d.ts +0 -44
  51. package/lib/utils/directives/tooltip/tooltip.directive.d.ts +0 -43
  52. package/lib/utils/pipes/capitalize/capitalize.pipe.d.ts +0 -7
  53. package/lib/utils/services/elements/elements.service.d.ts +0 -12
  54. package/public-api.d.ts +0 -22
package/package.json CHANGED
@@ -1,34 +1,9 @@
1
1
  {
2
2
  "name": "cloud-ide-element",
3
- "version": "1.0.4",
4
- "description": "A comprehensive Angular UI component library with data grid, form elements, and utilities",
5
- "keywords": [
6
- "angular",
7
- "ui",
8
- "components",
9
- "data-grid",
10
- "form",
11
- "typescript",
12
- "tailwind",
13
- "responsive"
14
- ],
15
- "author": "CIDE-LMS Team",
16
- "license": "MIT",
17
- "homepage": "https://github.com/your-org/cloud-ide-element#readme",
18
- "repository": {
19
- "type": "git",
20
- "url": "https://github.com/your-org/cloud-ide-element.git"
21
- },
22
- "bugs": {
23
- "url": "https://github.com/your-org/cloud-ide-element/issues"
24
- },
25
- "engines": {
26
- "node": ">=18.0.0",
27
- "npm": ">=8.0.0"
28
- },
3
+ "version": "1.0.5",
29
4
  "peerDependencies": {
30
- "@angular/common": "^18.0.0",
31
- "@angular/core": "^18.0.0"
5
+ "@angular/common": "^20.1.0",
6
+ "@angular/core": "^20.1.0"
32
7
  },
33
8
  "dependencies": {
34
9
  "tslib": "^2.3.0"
@@ -41,8 +16,6 @@
41
16
  },
42
17
  ".": {
43
18
  "types": "./index.d.ts",
44
- "esm2022": "./esm2022/cloud-ide-element.mjs",
45
- "esm": "./esm2022/cloud-ide-element.mjs",
46
19
  "default": "./fesm2022/cloud-ide-element.mjs"
47
20
  }
48
21
  },
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtaWRlLWVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvY2xvdWQtaWRlLWVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,182 +0,0 @@
1
- import { Component, signal, computed, inject } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { CideIconComponent } from '../../elements/icon/icon.component';
4
- import { ConfirmationService } from '../../services/confirmation.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- export class CideEleConfirmationModalComponent {
8
- constructor() {
9
- this.confirmationService = inject(ConfirmationService);
10
- // Signals
11
- this.hasActiveConfirmation = this.confirmationService.hasActiveConfirmation;
12
- this.currentRequest = this.confirmationService.getCurrentRequest();
13
- this.customData = signal(null);
14
- // Computed
15
- this.getHeaderClass = computed(() => {
16
- const request = this.currentRequest();
17
- return request ? `header-${request.type}` : '';
18
- });
19
- this.getIconClass = computed(() => {
20
- const request = this.currentRequest();
21
- return request ? request.type : 'info';
22
- });
23
- this.getConfirmButtonClass = computed(() => {
24
- const request = this.currentRequest();
25
- if (!request)
26
- return 'btn-primary';
27
- const classMap = {
28
- danger: 'btn-danger',
29
- warning: 'btn-warning',
30
- info: 'btn-primary',
31
- success: 'btn-success'
32
- };
33
- return classMap[request.type] || 'btn-primary';
34
- });
35
- }
36
- onBackdropClick(event) {
37
- // Only close if clicking the backdrop itself, not its children
38
- if (event.target === event.currentTarget) {
39
- this.onCancel();
40
- }
41
- }
42
- onCancel() {
43
- this.confirmationService.cancelCurrentRequest();
44
- }
45
- onConfirm() {
46
- // If there's custom data, pass it to the confirmation
47
- const data = this.customData();
48
- this.confirmationService.confirmCurrentRequest(data);
49
- this.customData.set(null); // Reset custom data
50
- }
51
- // Method to update custom data (called by custom templates)
52
- updateCustomData(data) {
53
- this.customData.set(data);
54
- }
55
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleConfirmationModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideEleConfirmationModalComponent, isStandalone: true, selector: "cide-ele-confirmation-modal", ngImport: i0, template: `
57
- <!-- Backdrop -->
58
- <div
59
- *ngIf="hasActiveConfirmation()"
60
- class="confirmation-backdrop"
61
- (click)="onBackdropClick($event)"
62
- [@backdropAnimation]>
63
- </div>
64
-
65
- <!-- Modal -->
66
- <div
67
- *ngIf="hasActiveConfirmation()"
68
- class="confirmation-modal"
69
- [@modalAnimation]>
70
-
71
- <!-- Modal Header -->
72
- <div class="modal-header" [class]="getHeaderClass()">
73
- <div class="header-content">
74
- <div class="icon-container" [class]="getIconClass()">
75
- <cide-ele-icon
76
- size="lg">
77
- {{ currentRequest()?.icon || 'info' }}
78
- </cide-ele-icon>
79
- </div>
80
- <h2 class="modal-title">{{ currentRequest()?.title }}</h2>
81
- </div>
82
- </div>
83
-
84
- <!-- Modal Body -->
85
- <div class="modal-body">
86
- <p class="modal-message">{{ currentRequest()?.message }}</p>
87
-
88
- <!-- Custom Template Slot -->
89
- <div *ngIf="currentRequest()?.customTemplate" class="custom-content">
90
- <ng-container
91
- *ngTemplateOutlet="currentRequest()?.customTemplate!; context: { $implicit: customData }">
92
- </ng-container>
93
- </div>
94
- </div>
95
-
96
- <!-- Modal Footer -->
97
- <div class="modal-footer">
98
- <button
99
- type="button"
100
- class="btn btn-secondary"
101
- (click)="onCancel()">
102
- {{ currentRequest()?.cancelText || 'Cancel' }}
103
- </button>
104
-
105
- <button
106
- type="button"
107
- class="btn"
108
- [class]="getConfirmButtonClass()"
109
- (click)="onConfirm()">
110
- {{ currentRequest()?.confirmText || 'Confirm' }}
111
- </button>
112
- </div>
113
- </div>
114
- `, isInline: true, styles: [".confirmation-backdrop{position:fixed;inset:0;background-color:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;align-items:center;justify-content:center}.confirmation-modal{background:#fff;border-radius:12px;box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;max-width:480px;width:90%;max-height:90vh;overflow:hidden;z-index:10001;position:relative}.modal-header{padding:24px 24px 16px;border-bottom:1px solid #e5e7eb}.header-content{display:flex;align-items:center;gap:16px}.icon-container{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.icon-container.danger{background-color:#fef2f2;color:#dc2626}.icon-container.warning{background-color:#fffbeb;color:#d97706}.icon-container.info{background-color:#eff6ff;color:#2563eb}.icon-container.success{background-color:#f0fdf4;color:#16a34a}.modal-title{margin:0;font-size:20px;font-weight:600;color:#111827;line-height:1.4}.modal-body{padding:16px 24px 24px}.modal-message{margin:0 0 16px;font-size:16px;line-height:1.5;color:#6b7280}.custom-content{margin-top:16px;padding-top:16px;border-top:1px solid #f3f4f6}.modal-footer{padding:16px 24px 24px;display:flex;gap:12px;justify-content:flex-end;border-top:1px solid #e5e7eb}.btn{padding:10px 20px;border-radius:8px;font-size:14px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;min-width:80px}.btn:hover{transform:translateY(-1px)}.btn:active{transform:translateY(0)}.btn-secondary{background-color:#f9fafb;color:#374151;border:1px solid #d1d5db}.btn-secondary:hover{background-color:#f3f4f6;border-color:#9ca3af}.btn-primary{background-color:#2563eb;color:#fff}.btn-primary:hover{background-color:#1d4ed8}.btn-danger{background-color:#dc2626;color:#fff}.btn-danger:hover{background-color:#b91c1c}.btn-warning{background-color:#d97706;color:#fff}.btn-warning:hover{background-color:#b45309}.btn-success{background-color:#16a34a;color:#fff}.btn-success:hover{background-color:#15803d}@media (max-width: 640px){.confirmation-modal{width:95%;margin:20px}.modal-header{padding:20px 20px 12px}.modal-body{padding:12px 20px 20px}.modal-footer{padding:12px 20px 20px;flex-direction:column-reverse}.btn{width:100%;justify-content:center}.header-content{flex-direction:column;text-align:center;gap:12px}.modal-title{font-size:18px}}.btn:focus{outline:2px solid #2563eb;outline-offset:2px}.modal-enter{opacity:0;transform:scale(.95) translateY(-10px)}.modal-enter-active{opacity:1;transform:scale(1) translateY(0);transition:all .2s ease-out}.modal-exit{opacity:1;transform:scale(1) translateY(0)}.modal-exit-active{opacity:0;transform:scale(.95) translateY(-10px);transition:all .15s ease-in}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }], animations: [
115
- // Add animations here if needed
116
- ] }); }
117
- }
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleConfirmationModalComponent, decorators: [{
119
- type: Component,
120
- args: [{ selector: 'cide-ele-confirmation-modal', standalone: true, imports: [CommonModule, CideIconComponent], template: `
121
- <!-- Backdrop -->
122
- <div
123
- *ngIf="hasActiveConfirmation()"
124
- class="confirmation-backdrop"
125
- (click)="onBackdropClick($event)"
126
- [@backdropAnimation]>
127
- </div>
128
-
129
- <!-- Modal -->
130
- <div
131
- *ngIf="hasActiveConfirmation()"
132
- class="confirmation-modal"
133
- [@modalAnimation]>
134
-
135
- <!-- Modal Header -->
136
- <div class="modal-header" [class]="getHeaderClass()">
137
- <div class="header-content">
138
- <div class="icon-container" [class]="getIconClass()">
139
- <cide-ele-icon
140
- size="lg">
141
- {{ currentRequest()?.icon || 'info' }}
142
- </cide-ele-icon>
143
- </div>
144
- <h2 class="modal-title">{{ currentRequest()?.title }}</h2>
145
- </div>
146
- </div>
147
-
148
- <!-- Modal Body -->
149
- <div class="modal-body">
150
- <p class="modal-message">{{ currentRequest()?.message }}</p>
151
-
152
- <!-- Custom Template Slot -->
153
- <div *ngIf="currentRequest()?.customTemplate" class="custom-content">
154
- <ng-container
155
- *ngTemplateOutlet="currentRequest()?.customTemplate!; context: { $implicit: customData }">
156
- </ng-container>
157
- </div>
158
- </div>
159
-
160
- <!-- Modal Footer -->
161
- <div class="modal-footer">
162
- <button
163
- type="button"
164
- class="btn btn-secondary"
165
- (click)="onCancel()">
166
- {{ currentRequest()?.cancelText || 'Cancel' }}
167
- </button>
168
-
169
- <button
170
- type="button"
171
- class="btn"
172
- [class]="getConfirmButtonClass()"
173
- (click)="onConfirm()">
174
- {{ currentRequest()?.confirmText || 'Confirm' }}
175
- </button>
176
- </div>
177
- </div>
178
- `, animations: [
179
- // Add animations here if needed
180
- ], styles: [".confirmation-backdrop{position:fixed;inset:0;background-color:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;display:flex;align-items:center;justify-content:center}.confirmation-modal{background:#fff;border-radius:12px;box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a;max-width:480px;width:90%;max-height:90vh;overflow:hidden;z-index:10001;position:relative}.modal-header{padding:24px 24px 16px;border-bottom:1px solid #e5e7eb}.header-content{display:flex;align-items:center;gap:16px}.icon-container{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.icon-container.danger{background-color:#fef2f2;color:#dc2626}.icon-container.warning{background-color:#fffbeb;color:#d97706}.icon-container.info{background-color:#eff6ff;color:#2563eb}.icon-container.success{background-color:#f0fdf4;color:#16a34a}.modal-title{margin:0;font-size:20px;font-weight:600;color:#111827;line-height:1.4}.modal-body{padding:16px 24px 24px}.modal-message{margin:0 0 16px;font-size:16px;line-height:1.5;color:#6b7280}.custom-content{margin-top:16px;padding-top:16px;border-top:1px solid #f3f4f6}.modal-footer{padding:16px 24px 24px;display:flex;gap:12px;justify-content:flex-end;border-top:1px solid #e5e7eb}.btn{padding:10px 20px;border-radius:8px;font-size:14px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;min-width:80px}.btn:hover{transform:translateY(-1px)}.btn:active{transform:translateY(0)}.btn-secondary{background-color:#f9fafb;color:#374151;border:1px solid #d1d5db}.btn-secondary:hover{background-color:#f3f4f6;border-color:#9ca3af}.btn-primary{background-color:#2563eb;color:#fff}.btn-primary:hover{background-color:#1d4ed8}.btn-danger{background-color:#dc2626;color:#fff}.btn-danger:hover{background-color:#b91c1c}.btn-warning{background-color:#d97706;color:#fff}.btn-warning:hover{background-color:#b45309}.btn-success{background-color:#16a34a;color:#fff}.btn-success:hover{background-color:#15803d}@media (max-width: 640px){.confirmation-modal{width:95%;margin:20px}.modal-header{padding:20px 20px 12px}.modal-body{padding:12px 20px 20px}.modal-footer{padding:12px 20px 20px;flex-direction:column-reverse}.btn{width:100%;justify-content:center}.header-content{flex-direction:column;text-align:center;gap:12px}.modal-title{font-size:18px}}.btn:focus{outline:2px solid #2563eb;outline-offset:2px}.modal-enter{opacity:0;transform:scale(.95) translateY(-10px)}.modal-enter-active{opacity:1;transform:scale(1) translateY(0);transition:all .2s ease-out}.modal-exit{opacity:1;transform:scale(1) translateY(0)}.modal-exit-active{opacity:0;transform:scale(.95) translateY(-10px);transition:all .15s ease-in}\n"] }]
181
- }] });
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybWF0aW9uLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1lbGVtZW50L3NyYy9saWIvY29tcG9uZW50cy9jb25maXJtYXRpb24tbW9kYWwvY29uZmlybWF0aW9uLW1vZGFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBNlMxRSxNQUFNLE9BQU8saUNBQWlDO0lBM1M5QztRQTRTVSx3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUUxRCxVQUFVO1FBQ1YsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDO1FBQ3ZFLG1CQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDOUQsZUFBVSxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUVuQyxXQUFXO1FBQ1gsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztRQUVILDBCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sYUFBYSxDQUFDO1lBRW5DLE1BQU0sUUFBUSxHQUFHO2dCQUNmLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixPQUFPLEVBQUUsYUFBYTtnQkFDdEIsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLE9BQU8sRUFBRSxhQUFhO2FBQ3ZCLENBQUM7WUFFRixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0tBd0JKO0lBdEJDLGVBQWUsQ0FBQyxLQUFZO1FBQzFCLCtEQUErRDtRQUMvRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsU0FBUztRQUNQLHNEQUFzRDtRQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CO0lBQ2pELENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsZ0JBQWdCLENBQUMsSUFBYTtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDOzhHQXREVSxpQ0FBaUM7a0dBQWpDLGlDQUFpQyx1RkF2U2xDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERULGd2RkEzRFMsWUFBWSwwU0FBRSxpQkFBaUIsaUZBb1M3QjtRQUNWLGdDQUFnQztTQUNqQzs7MkZBRVUsaUNBQWlDO2tCQTNTN0MsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLFlBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERULGNBeU9XO29CQUNWLGdDQUFnQztxQkFDakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIHNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDaWRlSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2ljb24vaWNvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlybWF0aW9uLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjaWRlLWVsZS1jb25maXJtYXRpb24tbW9kYWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2lkZUljb25Db21wb25lbnRdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8IS0tIEJhY2tkcm9wIC0tPlxyXG4gICAgPGRpdiBcclxuICAgICAgKm5nSWY9XCJoYXNBY3RpdmVDb25maXJtYXRpb24oKVwiXHJcbiAgICAgIGNsYXNzPVwiY29uZmlybWF0aW9uLWJhY2tkcm9wXCJcclxuICAgICAgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCJcclxuICAgICAgW0BiYWNrZHJvcEFuaW1hdGlvbl0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE1vZGFsIC0tPlxyXG4gICAgPGRpdiBcclxuICAgICAgKm5nSWY9XCJoYXNBY3RpdmVDb25maXJtYXRpb24oKVwiXHJcbiAgICAgIGNsYXNzPVwiY29uZmlybWF0aW9uLW1vZGFsXCJcclxuICAgICAgW0Btb2RhbEFuaW1hdGlvbl0+XHJcbiAgICAgIFxyXG4gICAgICA8IS0tIE1vZGFsIEhlYWRlciAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiIFtjbGFzc109XCJnZXRIZWFkZXJDbGFzcygpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1jb250ZW50XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIiBbY2xhc3NdPVwiZ2V0SWNvbkNsYXNzKClcIj5cclxuICAgICAgICAgICAgPGNpZGUtZWxlLWljb24gXHJcbiAgICAgICAgICAgICAgc2l6ZT1cImxnXCI+XHJcbiAgICAgICAgICAgICAge3sgY3VycmVudFJlcXVlc3QoKT8uaWNvbiB8fCAnaW5mbycgfX1cclxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8aDIgY2xhc3M9XCJtb2RhbC10aXRsZVwiPnt7IGN1cnJlbnRSZXF1ZXN0KCk/LnRpdGxlIH19PC9oMj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE1vZGFsIEJvZHkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1tZXNzYWdlXCI+e3sgY3VycmVudFJlcXVlc3QoKT8ubWVzc2FnZSB9fTwvcD5cclxuICAgICAgICBcclxuICAgICAgICA8IS0tIEN1c3RvbSBUZW1wbGF0ZSBTbG90IC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50UmVxdWVzdCgpPy5jdXN0b21UZW1wbGF0ZVwiIGNsYXNzPVwiY3VzdG9tLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgXHJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VycmVudFJlcXVlc3QoKT8uY3VzdG9tVGVtcGxhdGUhOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogY3VzdG9tRGF0YSB9XCI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE1vZGFsIEZvb3RlciAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cclxuICAgICAgICAgIHt7IGN1cnJlbnRSZXF1ZXN0KCk/LmNhbmNlbFRleHQgfHwgJ0NhbmNlbCcgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICBcclxuICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0blwiXHJcbiAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29uZmlybUJ1dHRvbkNsYXNzKClcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ29uZmlybSgpXCI+XHJcbiAgICAgICAgICB7eyBjdXJyZW50UmVxdWVzdCgpPy5jb25maXJtVGV4dCB8fCAnQ29uZmlybScgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlczogW2BcclxuICAgIC5jb25maXJtYXRpb24tYmFja2Ryb3Age1xyXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgbGVmdDogMDtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIGJvdHRvbTogMDtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xyXG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcclxuICAgICAgei1pbmRleDogMTAwMDA7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC5jb25maXJtYXRpb24tbW9kYWwge1xyXG4gICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcclxuICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMTBweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjA0KTtcclxuICAgICAgbWF4LXdpZHRoOiA0ODBweDtcclxuICAgICAgd2lkdGg6IDkwJTtcclxuICAgICAgbWF4LWhlaWdodDogOTB2aDtcclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICAgei1pbmRleDogMTAwMDE7XHJcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICAubW9kYWwtaGVhZGVyIHtcclxuICAgICAgcGFkZGluZzogMjRweCAyNHB4IDE2cHg7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlN2ViO1xyXG4gICAgfVxyXG5cclxuICAgIC5oZWFkZXItY29udGVudCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogMTZweDtcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbi1jb250YWluZXIge1xyXG4gICAgICB3aWR0aDogNDhweDtcclxuICAgICAgaGVpZ2h0OiA0OHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbi1jb250YWluZXIuZGFuZ2VyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZjJmMjtcclxuICAgICAgY29sb3I6ICNkYzI2MjY7XHJcbiAgICB9XHJcblxyXG4gICAgLmljb24tY29udGFpbmVyLndhcm5pbmcge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYmViO1xyXG4gICAgICBjb2xvcjogI2Q5NzcwNjtcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbi1jb250YWluZXIuaW5mbyB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmY2ZmY7XHJcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xyXG4gICAgfVxyXG5cclxuICAgIC5pY29uLWNvbnRhaW5lci5zdWNjZXNzIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZmRmNDtcclxuICAgICAgY29sb3I6ICMxNmEzNGE7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vZGFsLXRpdGxlIHtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGNvbG9yOiAjMTExODI3O1xyXG4gICAgICBsaW5lLWhlaWdodDogMS40O1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1ib2R5IHtcclxuICAgICAgcGFkZGluZzogMTZweCAyNHB4IDI0cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vZGFsLW1lc3NhZ2Uge1xyXG4gICAgICBtYXJnaW46IDAgMCAxNnB4IDA7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcclxuICAgICAgY29sb3I6ICM2YjcyODA7XHJcbiAgICB9XHJcblxyXG4gICAgLmN1c3RvbS1jb250ZW50IHtcclxuICAgICAgbWFyZ2luLXRvcDogMTZweDtcclxuICAgICAgcGFkZGluZy10b3A6IDE2cHg7XHJcbiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjNmNGY2O1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1mb290ZXIge1xyXG4gICAgICBwYWRkaW5nOiAxNnB4IDI0cHggMjRweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xyXG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTdlYjtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuIHtcclxuICAgICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XHJcbiAgICAgIG1pbi13aWR0aDogODBweDtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuOmhvdmVyIHtcclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG46YWN0aXZlIHtcclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc2Vjb25kYXJ5IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmFmYjtcclxuICAgICAgY29sb3I6ICMzNzQxNTE7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1zZWNvbmRhcnk6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNGY2O1xyXG4gICAgICBib3JkZXItY29sb3I6ICM5Y2EzYWY7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1wcmltYXJ5IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzI1NjNlYjtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tcHJpbWFyeTpob3ZlciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxZDRlZDg7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1kYW5nZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGMyNjI2O1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1kYW5nZXI6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYjkxYzFjO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4td2FybmluZyB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTc3MDY7XHJcbiAgICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXdhcm5pbmc6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYjQ1MzA5O1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc3VjY2VzcyB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxNmEzNGE7XHJcbiAgICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXN1Y2Nlc3M6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTU4MDNkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFJlc3BvbnNpdmUgRGVzaWduICovXHJcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNjQwcHgpIHtcclxuICAgICAgLmNvbmZpcm1hdGlvbi1tb2RhbCB7XHJcbiAgICAgICAgd2lkdGg6IDk1JTtcclxuICAgICAgICBtYXJnaW46IDIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5tb2RhbC1oZWFkZXIge1xyXG4gICAgICAgIHBhZGRpbmc6IDIwcHggMjBweCAxMnB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubW9kYWwtYm9keSB7XHJcbiAgICAgICAgcGFkZGluZzogMTJweCAyMHB4IDIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5tb2RhbC1mb290ZXIge1xyXG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweCAyMHB4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLmJ0biB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5oZWFkZXItY29udGVudCB7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubW9kYWwtdGl0bGUge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMThweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIEZvY3VzIHN0eWxlcyBmb3IgYWNjZXNzaWJpbGl0eSAqL1xyXG4gICAgLmJ0bjpmb2N1cyB7XHJcbiAgICAgIG91dGxpbmU6IDJweCBzb2xpZCAjMjU2M2ViO1xyXG4gICAgICBvdXRsaW5lLW9mZnNldDogMnB4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEFuaW1hdGlvbiBjbGFzc2VzICovXHJcbiAgICAubW9kYWwtZW50ZXIge1xyXG4gICAgICBvcGFjaXR5OiAwO1xyXG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpIHRyYW5zbGF0ZVkoLTEwcHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1lbnRlci1hY3RpdmUge1xyXG4gICAgICBvcGFjaXR5OiAxO1xyXG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZVkoMCk7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2Utb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1leGl0IHtcclxuICAgICAgb3BhY2l0eTogMTtcclxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGVZKDApO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb2RhbC1leGl0LWFjdGl2ZSB7XHJcbiAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSkgdHJhbnNsYXRlWSgtMTBweCk7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlLWluO1xyXG4gICAgfVxyXG4gIGBdLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIC8vIEFkZCBhbmltYXRpb25zIGhlcmUgaWYgbmVlZGVkXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2lkZUVsZUNvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50IHtcclxuICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2UgPSBpbmplY3QoQ29uZmlybWF0aW9uU2VydmljZSk7XHJcblxyXG4gIC8vIFNpZ25hbHNcclxuICBoYXNBY3RpdmVDb25maXJtYXRpb24gPSB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuaGFzQWN0aXZlQ29uZmlybWF0aW9uO1xyXG4gIGN1cnJlbnRSZXF1ZXN0ID0gdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRSZXF1ZXN0KCk7XHJcbiAgY3VzdG9tRGF0YSA9IHNpZ25hbDx1bmtub3duPihudWxsKTtcclxuXHJcbiAgLy8gQ29tcHV0ZWRcclxuICBnZXRIZWFkZXJDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0KCk7XHJcbiAgICByZXR1cm4gcmVxdWVzdCA/IGBoZWFkZXItJHtyZXF1ZXN0LnR5cGV9YCA6ICcnO1xyXG4gIH0pO1xyXG5cclxuICBnZXRJY29uQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5jdXJyZW50UmVxdWVzdCgpO1xyXG4gICAgcmV0dXJuIHJlcXVlc3QgPyByZXF1ZXN0LnR5cGUgOiAnaW5mbyc7XHJcbiAgfSk7XHJcblxyXG4gIGdldENvbmZpcm1CdXR0b25DbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmN1cnJlbnRSZXF1ZXN0KCk7XHJcbiAgICBpZiAoIXJlcXVlc3QpIHJldHVybiAnYnRuLXByaW1hcnknO1xyXG4gICAgXHJcbiAgICBjb25zdCBjbGFzc01hcCA9IHtcclxuICAgICAgZGFuZ2VyOiAnYnRuLWRhbmdlcicsXHJcbiAgICAgIHdhcm5pbmc6ICdidG4td2FybmluZycsXHJcbiAgICAgIGluZm86ICdidG4tcHJpbWFyeScsXHJcbiAgICAgIHN1Y2Nlc3M6ICdidG4tc3VjY2VzcydcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiBjbGFzc01hcFtyZXF1ZXN0LnR5cGVdIHx8ICdidG4tcHJpbWFyeSc7XHJcbiAgfSk7XHJcblxyXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIE9ubHkgY2xvc2UgaWYgY2xpY2tpbmcgdGhlIGJhY2tkcm9wIGl0c2VsZiwgbm90IGl0cyBjaGlsZHJlblxyXG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCkge1xyXG4gICAgICB0aGlzLm9uQ2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jYW5jZWxDdXJyZW50UmVxdWVzdCgpO1xyXG4gIH1cclxuXHJcbiAgb25Db25maXJtKCk6IHZvaWQge1xyXG4gICAgLy8gSWYgdGhlcmUncyBjdXN0b20gZGF0YSwgcGFzcyBpdCB0byB0aGUgY29uZmlybWF0aW9uXHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jdXN0b21EYXRhKCk7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybUN1cnJlbnRSZXF1ZXN0KGRhdGEpO1xyXG4gICAgdGhpcy5jdXN0b21EYXRhLnNldChudWxsKTsgLy8gUmVzZXQgY3VzdG9tIGRhdGFcclxuICB9XHJcblxyXG4gIC8vIE1ldGhvZCB0byB1cGRhdGUgY3VzdG9tIGRhdGEgKGNhbGxlZCBieSBjdXN0b20gdGVtcGxhdGVzKVxyXG4gIHVwZGF0ZUN1c3RvbURhdGEoZGF0YTogdW5rbm93bik6IHZvaWQge1xyXG4gICAgdGhpcy5jdXN0b21EYXRhLnNldChkYXRhKTtcclxuICB9XHJcbn1cclxuIl19