valtech-components 2.0.288 → 2.0.290

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.
package/README.md CHANGED
@@ -184,7 +184,7 @@ export class UserComponent {
184
184
  The library now includes automatic link detection and processing capabilities. Convert URLs and internal routes in text content into clickable links automatically:
185
185
 
186
186
  ```typescript
187
- // Basic usage
187
+ // Basic usage with direct URLs
188
188
  <val-text [props]="{
189
189
  content: 'Visit https://angular.io or go to /dashboard',
190
190
  processLinks: true,
@@ -194,18 +194,27 @@ The library now includes automatic link detection and processing capabilities. C
194
194
  }
195
195
  }"></val-text>
196
196
 
197
- // Advanced configuration
198
- linkConfig: LinkProcessorConfig = {
199
- openExternalInNewTab: true,
200
- linkClass: 'custom-link',
201
- externalLinkClass: 'external',
202
- internalLinkClass: 'internal'
203
- };
197
+ // Markdown-style links [text](url)
198
+ <val-text [props]="{
199
+ content: 'Check [the documentation](https://angular.io/docs) for details',
200
+ processLinks: true,
201
+ linkConfig: {
202
+ processMarkdownLinks: true,
203
+ openExternalInNewTab: true
204
+ }
205
+ }"></val-text>
206
+
207
+ // Mixed formats in the same text
208
+ <val-text [props]="{
209
+ content: 'Read [the guide](https://angular.io/guide), check https://github.com/angular, or go to /examples',
210
+ processLinks: true
211
+ }"></val-text>
204
212
  ```
205
213
 
206
214
  ### Features
207
215
 
208
- - **Automatic Detection**: Identifies external URLs (http/https) and internal routes (starting with /)
216
+ - **Automatic Detection**: Identifies external URLs (http/https), internal routes (starting with /), and Markdown-style links `[text](url)`
217
+ - **Improved Regex**: Excludes punctuation marks (`,`, `;`, `.`, `!`, `?`, `()`) from URLs to prevent broken links
209
218
  - **Configurable Behavior**: Control whether links open in new tabs
210
219
  - **Custom Styling**: Apply custom CSS classes to links
211
220
  - **Secure Processing**: Uses Angular's DomSanitizer for safe HTML generation
@@ -225,13 +234,12 @@ processText(text: string) {
225
234
  // Check if text contains links
226
235
  const hasLinks = this.linkProcessor.hasLinks(text);
227
236
 
228
- // Extract all links with their types
237
+ // Extract all links with their types and text
229
238
  const links = this.linkProcessor.extractLinks(text);
239
+ // Returns: [{ url: '...', type: 'external|internal', text: '...' }]
230
240
  }
231
241
  ```
232
242
 
233
- See the **[Link Processing Guide](./LINK_PROCESSING_GUIDE.md)** for complete documentation and examples.
234
-
235
243
  ## Project Structure
236
244
 
237
245
  - `src/lib/components/atoms/` – Basic UI elements (e.g., button, icon, text)
@@ -243,14 +251,6 @@ See the **[Link Processing Guide](./LINK_PROCESSING_GUIDE.md)** for complete doc
243
251
  - `src/lib/services/` – Utility and helper services (e.g., theme, navigation, i18n)
244
252
  - `src/lib/shared/` – Shared constants and utility functions
245
253
 
246
- ## 📚 Examples
247
-
248
- The library includes example components that demonstrate best practices:
249
-
250
- - `ReactiveContentExampleComponent` - Demonstrates the reactive content system with component-specific content
251
- - `GlobalContentExampleComponent` - Comprehensive demonstration of global and mixed content usage
252
- - `LinkProcessingExampleComponent` - Shows automatic link detection and processing in different scenarios
253
- - Check the `_examples/` directory for more implementation examples
254
254
 
255
255
  ## License
256
256
 
@@ -141,7 +141,7 @@ export class TextComponent {
141
141
  <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
142
142
  }
143
143
  </ion-text>
144
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}:host ::ng-deep .processed-link{color:var(--ion-color-primary, #3880ff);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;transition:color .3s ease}:host ::ng-deep .processed-link:hover{color:var(--ion-color-primary-shade, #3171e0);text-decoration-thickness:2px}:host ::ng-deep .processed-link:active{color:var(--ion-color-primary-tint, #4c8dff)}:host ::ng-deep .external-link:after{content:\" \\2197\";font-size:.8em;opacity:.7}:host ::ng-deep .internal-link{color:var(--ion-color-secondary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-secondary-shade, #0bb8cc)}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: ProcessLinksPipe, name: "processLinks" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
144
+ `, isInline: true, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}\n"], dependencies: [{ kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: ProcessLinksPipe, name: "processLinks" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
145
145
  }
146
146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextComponent, decorators: [{
147
147
  type: Component,
@@ -157,7 +157,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
157
157
  <p [class]="props.size" [class.bold]="props.bold">{{ displayContent$ | async }}</p>
158
158
  }
159
159
  </ion-text>
160
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";:root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}:host ::ng-deep .processed-link{color:var(--ion-color-primary, #3880ff);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;transition:color .3s ease}:host ::ng-deep .processed-link:hover{color:var(--ion-color-primary-shade, #3171e0);text-decoration-thickness:2px}:host ::ng-deep .processed-link:active{color:var(--ion-color-primary-tint, #4c8dff)}:host ::ng-deep .external-link:after{content:\" \\2197\";font-size:.8em;opacity:.7}:host ::ng-deep .internal-link{color:var(--ion-color-secondary, #0cd1e8)}:host ::ng-deep .internal-link:hover{color:var(--ion-color-secondary-shade, #0bb8cc)}\n"] }]
160
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":root{--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8}@media (prefers-color-scheme: dark){:root{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143,73,248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255,255,255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:.75rem;line-height:1.25rem;font-weight:400}.small.bold{font-size:.75rem;line-height:1.25rem;font-weight:700}.medium{font-size:.875rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.medium{font-size:1rem;line-height:1.5rem}}.medium.bold{font-size:.875rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.medium.bold{font-size:1rem;line-height:1.5rem}}.large{font-size:1rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.large{font-size:1.125rem;line-height:1.5rem}}.large.bold{font-size:1rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.large.bold{font-size:1.125rem;line-height:1.5rem}}.xlarge{font-size:1.125rem;line-height:1.5rem;font-weight:400}@media (min-width: 768px){.xlarge{font-size:1.5rem;line-height:2rem}}.xlarge.bold{font-size:1.125rem;line-height:1.5rem;font-weight:700}@media (min-width: 768px){.xlarge.bold{font-size:1.5rem;line-height:2rem}}\n"] }]
161
161
  }], ctorParameters: () => [{ type: i1.ContentService }, { type: i2.LinkProcessorService }], propDecorators: { props: [{
162
162
  type: Input
163
163
  }] } });
@@ -195,4 +195,4 @@ export function createTextProps(contentConfig, styleConfig = {}) {
195
195
  bold: styleConfig.bold || false,
196
196
  };
197
197
  }
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2F0b21zL3RleHQvdGV4dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7QUF1QjVFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBZ0N4QixZQUNVLGNBQThCLEVBQzlCLGFBQW1DO1FBRG5DLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFKckMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBS3ZDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDNUQseUNBQXlDO1lBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNwQyxxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDdEUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtvQkFDbEMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtvQkFDcEMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2lCQUMvQyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMEJBQTBCO2dCQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO29CQUNyRCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO29CQUNsQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO29CQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO2lCQUNyQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTiw2REFBNkQ7WUFDN0QsT0FBTyxDQUFDLElBQUksQ0FDVixnSkFBZ0osQ0FDakosQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDOytHQTlFVSxhQUFhO21HQUFiLGFBQWEsZ0dBM0ZkOzs7Ozs7Ozs7Ozs7R0FZVCxzOEhBYlMsT0FBTywyRUFBRSxTQUFTLHlDQUFFLGdCQUFnQjs7NEZBNEZuQyxhQUFhO2tCQS9GekIsU0FBUzsrQkFDRSxVQUFVLGNBQ1IsSUFBSSxXQUNQLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxZQUNyQzs7Ozs7Ozs7Ozs7O0dBWVQsbUJBRWdCLHVCQUF1QixDQUFDLE1BQU07c0hBbUcvQyxLQUFLO3NCQURKLEtBQUs7O0FBNERSOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsYUFBZ0MsRUFDaEMsY0FBc0UsRUFBRTtJQUV4RSxPQUFPO1FBQ0wsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO1FBQ3BDLFlBQVksRUFBRSxhQUFhLENBQUMsWUFBWTtRQUN4QyxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7UUFDOUMsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLG9CQUFvQjtRQUN4RCxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssSUFBSSxNQUFNO1FBQ2xDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFDbEMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksS0FBSztLQUNoQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvblRleHQgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IExpbmtQcm9jZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGluay1wcm9jZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9jZXNzTGlua3NQaXBlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3BpcGVzL3Byb2Nlc3MtbGlua3MucGlwZSc7XG5pbXBvcnQgeyBUZXh0Q29udGVudENvbmZpZywgVGV4dE1ldGFkYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC10ZXh0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lvblRleHQsIEFzeW5jUGlwZSwgUHJvY2Vzc0xpbmtzUGlwZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi10ZXh0IFtjb2xvcl09XCJwcm9wcy5jb2xvclwiPlxuICAgICAgQGlmIChwcm9wcy5wcm9jZXNzTGlua3MpIHtcbiAgICAgICAgPHBcbiAgICAgICAgICBbY2xhc3NdPVwicHJvcHMuc2l6ZVwiXG4gICAgICAgICAgW2NsYXNzLmJvbGRdPVwicHJvcHMuYm9sZFwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkaXNwbGF5Q29udGVudCQgfCBhc3luYyB8IHByb2Nlc3NMaW5rczogcHJvcHMubGlua0NvbmZpZ1wiXG4gICAgICAgID48L3A+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cInByb3BzLnNpemVcIiBbY2xhc3MuYm9sZF09XCJwcm9wcy5ib2xkXCI+e3sgZGlzcGxheUNvbnRlbnQkIHwgYXN5bmMgfX08L3A+XG4gICAgICB9XG4gICAgPC9pb24tdGV4dD5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG4vKipcbiAqIHZhbC10ZXh0XG4gKlxuICogRW5oYW5jZWQgdGV4dCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBib3RoIHN0YXRpYyBjb250ZW50IGFuZCByZWFjdGl2ZSBjb250ZW50IGZyb20gdGhlIGxhbmd1YWdlIHNlcnZpY2UuXG4gKiBUaGUgY29tcG9uZW50IGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB3aGVuIHRoZSBsYW5ndWFnZSBjaGFuZ2VzIGlmIHVzaW5nIHJlYWN0aXZlIGNvbnRlbnQuXG4gKlxuICogQGV4YW1wbGUgU3RhdGljIGNvbnRlbnQ6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXRleHQgW3Byb3BzXT1cIntcbiAqICAgY29udGVudDogJ1N0YXRpYyB0ZXh0JyxcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ21lZGl1bScsXG4gKiAgIGJvbGQ6IGZhbHNlXG4gKiB9XCI+PC92YWwtdGV4dD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFJlYWN0aXZlIGNvbnRlbnQ6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXRleHQgW3Byb3BzXT1cIntcbiAqICAgY29udGVudEtleTogJ3dlbGNvbWVNZXNzYWdlJyxcbiAqICAgY29udGVudENsYXNzOiAnSG9tZUNvbXBvbmVudCcsXG4gKiAgIGNvbnRlbnRGYWxsYmFjazogJ1dlbGNvbWUhJyxcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ2xhcmdlJyxcbiAqICAgYm9sZDogdHJ1ZVxuICogfVwiPjwvdmFsLXRleHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBSZWFjdGl2ZSBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbjpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtdGV4dCBbcHJvcHNdPVwie1xuICogICBjb250ZW50S2V5OiAnZ3JlZXRpbmcnLFxuICogICBjb250ZW50Q2xhc3M6ICdVc2VyQ29tcG9uZW50JyxcbiAqICAgY29udGVudEludGVycG9sYXRpb246IHsgbmFtZTogJ0pvaG4nLCBjb3VudDogNSB9LFxuICogICBjb2xvcjogJ3NlY29uZGFyeScsXG4gKiAgIHNpemU6ICdtZWRpdW0nLFxuICogICBib2xkOiBmYWxzZVxuICogfVwiPjwvdmFsLXRleHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBXaXRoIGF1dG9tYXRpYyBsaW5rIHByb2Nlc3Npbmc6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXRleHQgW3Byb3BzXT1cIntcbiAqICAgY29udGVudDogJ1Zpc2l0IGh0dHBzOi8vZXhhbXBsZS5jb20gb3IgZ28gdG8gL3Byb2ZpbGUgZm9yIG1vcmUgaW5mbycsXG4gKiAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAqICAgbGlua0NvbmZpZzoge1xuICogICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiOiB0cnVlLFxuICogICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAqICAgICBsaW5rQ2xhc3M6ICdjdXN0b20tbGluaycsXG4gKiAgICAgZXh0ZXJuYWxMaW5rQ2xhc3M6ICdleHRlcm5hbCcsXG4gKiAgICAgaW50ZXJuYWxMaW5rQ2xhc3M6ICdpbnRlcm5hbCdcbiAqICAgfSxcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ21lZGl1bSdcbiAqIH1cIj48L3ZhbC10ZXh0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVXNpbmcgQ29udGVudFNlcnZpY2UgaGVscGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW4gY29tcG9uZW50XG4gKiBjb250ZW50ID0gaW5qZWN0KENvbnRlbnRTZXJ2aWNlKTtcbiAqIGNvbXBvbmVudENvbnRlbnQgPSB0aGlzLmNvbnRlbnQuZm9yQ29tcG9uZW50KCdNeUNvbXBvbmVudCcpO1xuICpcbiAqIHRleHRQcm9wcyA9IHtcbiAqICAgY29udGVudDogdGhpcy5jb21wb25lbnRDb250ZW50LmdldFRleHQoJ3RpdGxlJyksIC8vIHN5bmNcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ2xhcmdlJyxcbiAqICAgYm9sZDogdHJ1ZVxuICogfTtcbiAqIC8vIE9yIHdpdGggcmVhY3RpdmUgYmluZGluZzpcbiAqIHRpdGxlJCA9IHRoaXMuY29tcG9uZW50Q29udGVudC5nZXQoJ3RpdGxlJyk7XG4gKiBgYGBcbiAqXG4gKiBAaW5wdXQgcHJvcHM6IFRleHRNZXRhZGF0YSAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXh0IChjb250ZW50LCBzdHlsaW5nLCBhbmQgcmVhY3RpdmUgY29udGVudCBvcHRpb25zKVxuICovXG5leHBvcnQgY2xhc3MgVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRleHQgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEB0eXBlIHtUZXh0TWV0YWRhdGF9XG4gICAqXG4gICAqIEZvciBzdGF0aWMgY29udGVudDpcbiAgICogQHByb3BlcnR5IGNvbnRlbnQgLSBUaGUgdGV4dCB0byBkaXNwbGF5ICh0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcmVhY3RpdmUgY29udGVudClcbiAgICpcbiAgICogRm9yIHJlYWN0aXZlIGNvbnRlbnQ6XG4gICAqIEBwcm9wZXJ0eSBjb250ZW50S2V5IC0gVGhlIGNvbnRlbnQga2V5IHRvIHJldHJpZXZlIGZyb20gbGFuZ3VhZ2Ugc2VydmljZVxuICAgKiBAcHJvcGVydHkgY29udGVudENsYXNzIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lIGZvciBjb250ZW50IGxvb2t1cFxuICAgKiBAcHJvcGVydHkgY29udGVudEZhbGxiYWNrIC0gT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBjb250ZW50IGlzIG5vdCBmb3VuZFxuICAgKiBAcHJvcGVydHkgY29udGVudEludGVycG9sYXRpb24gLSBPcHRpb25hbCB2YWx1ZXMgdG8gaW50ZXJwb2xhdGUgaW50byBjb250ZW50XG4gICAqXG4gICAqIEZvciBzdHlsaW5nOlxuICAgKiBAcHJvcGVydHkgY29sb3IgLSBUaGUgdGV4dCBjb2xvciAoSW9uaWMgY29sb3Igc3RyaW5nKVxuICAgKiBAcHJvcGVydHkgc2l6ZSAtIFRoZSB0ZXh0IHNpemUgKCdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScgfCAneGxhcmdlJylcbiAgICogQHByb3BlcnR5IGJvbGQgLSBXaGV0aGVyIHRoZSB0ZXh0IGlzIGJvbGRcbiAgICogQHByb3BlcnR5IHByb2Nlc3NMaW5rcyAtIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBwcm9jZXNzIGFuZCBjb252ZXJ0IGxpbmtzIGluIHRleHQgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKiBAcHJvcGVydHkgbGlua0NvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGxpbmsgcHJvY2Vzc2luZyAoY29sb3JzLCB0YXJnZXQgYmVoYXZpb3IsIGV0Yy4pXG4gICAqL1xuICBASW5wdXQoKVxuICBwcm9wczogVGV4dE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgcHJvdmlkZXMgdGhlIGNvbnRlbnQgdG8gZGlzcGxheS5cbiAgICogVGhpcyB3aWxsIGJlIGVpdGhlciBzdGF0aWMgY29udGVudCBvciByZWFjdGl2ZSBjb250ZW50IGZyb20gdGhlIGxhbmd1YWdlIHNlcnZpY2UuXG4gICAqL1xuICBkaXNwbGF5Q29udGVudCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbnRlbnRTZXJ2aWNlOiBDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGxpbmtQcm9jZXNzb3I6IExpbmtQcm9jZXNzb3JTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldHVwRGlzcGxheUNvbnRlbnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIHRoZSBjb250ZW50IG9ic2VydmFibGUgYmFzZWQgb24gdGhlIHByb3BzIGNvbmZpZ3VyYXRpb24uXG4gICAqIFByaW9yaXR5OiBzdGF0aWMgY29udGVudCA+IHJlYWN0aXZlIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uID4gcmVhY3RpdmUgY29udGVudFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERpc3BsYXlDb250ZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnQpIHtcbiAgICAgIC8vIFN0YXRpYyBjb250ZW50IHRha2VzIHByZWNlZGVuY2VcbiAgICAgIHRoaXMuZGlzcGxheUNvbnRlbnQkID0gb2YodGhpcy5wcm9wcy5jb250ZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuY29udGVudEtleSAmJiB0aGlzLnByb3BzLmNvbnRlbnRDbGFzcykge1xuICAgICAgLy8gUmVhY3RpdmUgY29udGVudCBmcm9tIGxhbmd1YWdlIHNlcnZpY2VcbiAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRJbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgIC8vIFdpdGggaW50ZXJwb2xhdGlvblxuICAgICAgICB0aGlzLmRpc3BsYXlDb250ZW50JCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmNvbnRlbnRDbGFzcyxcbiAgICAgICAgICBrZXk6IHRoaXMucHJvcHMuY29udGVudEtleSxcbiAgICAgICAgICBmYWxsYmFjazogdGhpcy5wcm9wcy5jb250ZW50RmFsbGJhY2ssXG4gICAgICAgICAgaW50ZXJwb2xhdGlvbjogdGhpcy5wcm9wcy5jb250ZW50SW50ZXJwb2xhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW1wbGUgcmVhY3RpdmUgY29udGVudFxuICAgICAgICB0aGlzLmRpc3BsYXlDb250ZW50JCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jb250ZW50Q2xhc3MsXG4gICAgICAgICAga2V5OiB0aGlzLnByb3BzLmNvbnRlbnRLZXksXG4gICAgICAgICAgZmFsbGJhY2s6IHRoaXMucHJvcHMuY29udGVudEZhbGxiYWNrLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZW1wdHkgc3RyaW5nIGlmIG5vIHZhbGlkIGNvbnRlbnQgY29uZmlndXJhdGlvblxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAndmFsLXRleHQ6IE5vIHZhbGlkIGNvbnRlbnQgY29uZmlndXJhdGlvbiBwcm92aWRlZC4gVXNlIGVpdGhlciBcImNvbnRlbnRcIiBmb3Igc3RhdGljIHRleHQgb3IgXCJjb250ZW50S2V5XCIgKyBcImNvbnRlbnRDbGFzc1wiIGZvciByZWFjdGl2ZSBjb250ZW50LidcbiAgICAgICk7XG4gICAgICB0aGlzLmRpc3BsYXlDb250ZW50JCA9IG9mKHRoaXMucHJvcHMuY29udGVudEZhbGxiYWNrIHx8ICcnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlYWN0aXZlIHRleHQgcHJvcHMgZnJvbSBjb250ZW50IGNvbmZpZ3VyYXRpb24uXG4gKiBUaGlzIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gY3JlYXRlIHZhbC10ZXh0IHByb3BzIHdpdGggcmVhY3RpdmUgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gY29udGVudENvbmZpZyAtIENvbnRlbnQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHN0eWxlQ29uZmlnIC0gT3B0aW9uYWwgc3R5bGUgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUGFydGlhbCBUZXh0TWV0YWRhdGEgd2l0aCBjb250ZW50IHByb3BlcnRpZXMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGNvbXBvbmVudFxuICogdGl0bGVQcm9wczogVGV4dE1ldGFkYXRhID0ge1xuICogICAuLi5jcmVhdGVUZXh0UHJvcHMoe1xuICogICAgIGNvbnRlbnRLZXk6ICd0aXRsZScsXG4gKiAgICAgY29udGVudENsYXNzOiAnSGVhZGVyQ29tcG9uZW50J1xuICogICB9LCB7XG4gKiAgICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgICBzaXplOiAnbGFyZ2UnLFxuICogICAgIGJvbGQ6IHRydWVcbiAqICAgfSlcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRleHRQcm9wcyhcbiAgY29udGVudENvbmZpZzogVGV4dENvbnRlbnRDb25maWcsXG4gIHN0eWxlQ29uZmlnOiBQYXJ0aWFsPFBpY2s8VGV4dE1ldGFkYXRhLCAnY29sb3InIHwgJ3NpemUnIHwgJ2JvbGQnPj4gPSB7fVxuKTogUGFydGlhbDxUZXh0TWV0YWRhdGE+IHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50S2V5OiBjb250ZW50Q29uZmlnLmNvbnRlbnRLZXksXG4gICAgY29udGVudENsYXNzOiBjb250ZW50Q29uZmlnLmNvbnRlbnRDbGFzcyxcbiAgICBjb250ZW50RmFsbGJhY2s6IGNvbnRlbnRDb25maWcuY29udGVudEZhbGxiYWNrLFxuICAgIGNvbnRlbnRJbnRlcnBvbGF0aW9uOiBjb250ZW50Q29uZmlnLmNvbnRlbnRJbnRlcnBvbGF0aW9uLFxuICAgIGNvbG9yOiBzdHlsZUNvbmZpZy5jb2xvciB8fCAnZGFyaycsXG4gICAgc2l6ZTogc3R5bGVDb25maWcuc2l6ZSB8fCAnbWVkaXVtJyxcbiAgICBib2xkOiBzdHlsZUNvbmZpZy5ib2xkIHx8IGZhbHNlLFxuICB9O1xufVxuIl19
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2F0b21zL3RleHQvdGV4dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7QUF1QjVFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBZ0N4QixZQUNVLGNBQThCLEVBQzlCLGFBQW1DO1FBRG5DLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFKckMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBS3ZDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDNUQseUNBQXlDO1lBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNwQyxxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDdEUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtvQkFDbEMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtvQkFDcEMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CO2lCQUMvQyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMEJBQTBCO2dCQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO29CQUNyRCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO29CQUNsQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO29CQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO2lCQUNyQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTiw2REFBNkQ7WUFDN0QsT0FBTyxDQUFDLElBQUksQ0FDVixnSkFBZ0osQ0FDakosQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDOytHQTlFVSxhQUFhO21HQUFiLGFBQWEsZ0dBM0ZkOzs7Ozs7Ozs7Ozs7R0FZVCx3MEdBYlMsT0FBTywyRUFBRSxTQUFTLHlDQUFFLGdCQUFnQjs7NEZBNEZuQyxhQUFhO2tCQS9GekIsU0FBUzsrQkFDRSxVQUFVLGNBQ1IsSUFBSSxXQUNQLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxZQUNyQzs7Ozs7Ozs7Ozs7O0dBWVQsbUJBRWdCLHVCQUF1QixDQUFDLE1BQU07c0hBbUcvQyxLQUFLO3NCQURKLEtBQUs7O0FBNERSOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsYUFBZ0MsRUFDaEMsY0FBc0UsRUFBRTtJQUV4RSxPQUFPO1FBQ0wsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVO1FBQ3BDLFlBQVksRUFBRSxhQUFhLENBQUMsWUFBWTtRQUN4QyxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7UUFDOUMsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLG9CQUFvQjtRQUN4RCxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssSUFBSSxNQUFNO1FBQ2xDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFDbEMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksS0FBSztLQUNoQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvblRleHQgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IExpbmtQcm9jZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGluay1wcm9jZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9jZXNzTGlua3NQaXBlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3BpcGVzL3Byb2Nlc3MtbGlua3MucGlwZSc7XG5pbXBvcnQgeyBUZXh0Q29udGVudENvbmZpZywgVGV4dE1ldGFkYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC10ZXh0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lvblRleHQsIEFzeW5jUGlwZSwgUHJvY2Vzc0xpbmtzUGlwZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi10ZXh0IFtjb2xvcl09XCJwcm9wcy5jb2xvclwiPlxuICAgICAgQGlmIChwcm9wcy5wcm9jZXNzTGlua3MpIHtcbiAgICAgICAgPHBcbiAgICAgICAgICBbY2xhc3NdPVwicHJvcHMuc2l6ZVwiXG4gICAgICAgICAgW2NsYXNzLmJvbGRdPVwicHJvcHMuYm9sZFwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJkaXNwbGF5Q29udGVudCQgfCBhc3luYyB8IHByb2Nlc3NMaW5rczogcHJvcHMubGlua0NvbmZpZ1wiXG4gICAgICAgID48L3A+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cInByb3BzLnNpemVcIiBbY2xhc3MuYm9sZF09XCJwcm9wcy5ib2xkXCI+e3sgZGlzcGxheUNvbnRlbnQkIHwgYXN5bmMgfX08L3A+XG4gICAgICB9XG4gICAgPC9pb24tdGV4dD5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG4vKipcbiAqIHZhbC10ZXh0XG4gKlxuICogRW5oYW5jZWQgdGV4dCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBib3RoIHN0YXRpYyBjb250ZW50IGFuZCByZWFjdGl2ZSBjb250ZW50IGZyb20gdGhlIGxhbmd1YWdlIHNlcnZpY2UuXG4gKiBUaGUgY29tcG9uZW50IGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB3aGVuIHRoZSBsYW5ndWFnZSBjaGFuZ2VzIGlmIHVzaW5nIHJlYWN0aXZlIGNvbnRlbnQuXG4gKlxuICogQGV4YW1wbGUgU3RhdGljIGNvbnRlbnQ6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXRleHQgW3Byb3BzXT1cIntcbiAqICAgY29udGVudDogJ1N0YXRpYyB0ZXh0JyxcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ21lZGl1bScsXG4gKiAgIGJvbGQ6IGZhbHNlXG4gKiB9XCI+PC92YWwtdGV4dD5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFJlYWN0aXZlIGNvbnRlbnQ6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXRleHQgW3Byb3BzXT1cIntcbiAqICAgY29udGVudEtleTogJ3dlbGNvbWVNZXNzYWdlJyxcbiAqICAgY29udGVudENsYXNzOiAnSG9tZUNvbXBvbmVudCcsXG4gKiAgIGNvbnRlbnRGYWxsYmFjazogJ1dlbGNvbWUhJyxcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ2xhcmdlJyxcbiAqICAgYm9sZDogdHJ1ZVxuICogfVwiPjwvdmFsLXRleHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBSZWFjdGl2ZSBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbjpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtdGV4dCBbcHJvcHNdPVwie1xuICogICBjb250ZW50S2V5OiAnZ3JlZXRpbmcnLFxuICogICBjb250ZW50Q2xhc3M6ICdVc2VyQ29tcG9uZW50JyxcbiAqICAgY29udGVudEludGVycG9sYXRpb246IHsgbmFtZTogJ0pvaG4nLCBjb3VudDogNSB9LFxuICogICBjb2xvcjogJ3NlY29uZGFyeScsXG4gKiAgIHNpemU6ICdtZWRpdW0nLFxuICogICBib2xkOiBmYWxzZVxuICogfVwiPjwvdmFsLXRleHQ+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBXaXRoIGF1dG9tYXRpYyBsaW5rIHByb2Nlc3Npbmc6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXRleHQgW3Byb3BzXT1cIntcbiAqICAgY29udGVudDogJ1Zpc2l0IGh0dHBzOi8vZXhhbXBsZS5jb20gb3IgZ28gdG8gL3Byb2ZpbGUgZm9yIG1vcmUgaW5mbycsXG4gKiAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAqICAgbGlua0NvbmZpZzoge1xuICogICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiOiB0cnVlLFxuICogICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAqICAgICBsaW5rQ2xhc3M6ICdjdXN0b20tbGluaycsXG4gKiAgICAgZXh0ZXJuYWxMaW5rQ2xhc3M6ICdleHRlcm5hbCcsXG4gKiAgICAgaW50ZXJuYWxMaW5rQ2xhc3M6ICdpbnRlcm5hbCdcbiAqICAgfSxcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ21lZGl1bSdcbiAqIH1cIj48L3ZhbC10ZXh0PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVXNpbmcgQ29udGVudFNlcnZpY2UgaGVscGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW4gY29tcG9uZW50XG4gKiBjb250ZW50ID0gaW5qZWN0KENvbnRlbnRTZXJ2aWNlKTtcbiAqIGNvbXBvbmVudENvbnRlbnQgPSB0aGlzLmNvbnRlbnQuZm9yQ29tcG9uZW50KCdNeUNvbXBvbmVudCcpO1xuICpcbiAqIHRleHRQcm9wcyA9IHtcbiAqICAgY29udGVudDogdGhpcy5jb21wb25lbnRDb250ZW50LmdldFRleHQoJ3RpdGxlJyksIC8vIHN5bmNcbiAqICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgc2l6ZTogJ2xhcmdlJyxcbiAqICAgYm9sZDogdHJ1ZVxuICogfTtcbiAqIC8vIE9yIHdpdGggcmVhY3RpdmUgYmluZGluZzpcbiAqIHRpdGxlJCA9IHRoaXMuY29tcG9uZW50Q29udGVudC5nZXQoJ3RpdGxlJyk7XG4gKiBgYGBcbiAqXG4gKiBAaW5wdXQgcHJvcHM6IFRleHRNZXRhZGF0YSAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXh0IChjb250ZW50LCBzdHlsaW5nLCBhbmQgcmVhY3RpdmUgY29udGVudCBvcHRpb25zKVxuICovXG5leHBvcnQgY2xhc3MgVGV4dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRleHQgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEB0eXBlIHtUZXh0TWV0YWRhdGF9XG4gICAqXG4gICAqIEZvciBzdGF0aWMgY29udGVudDpcbiAgICogQHByb3BlcnR5IGNvbnRlbnQgLSBUaGUgdGV4dCB0byBkaXNwbGF5ICh0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcmVhY3RpdmUgY29udGVudClcbiAgICpcbiAgICogRm9yIHJlYWN0aXZlIGNvbnRlbnQ6XG4gICAqIEBwcm9wZXJ0eSBjb250ZW50S2V5IC0gVGhlIGNvbnRlbnQga2V5IHRvIHJldHJpZXZlIGZyb20gbGFuZ3VhZ2Ugc2VydmljZVxuICAgKiBAcHJvcGVydHkgY29udGVudENsYXNzIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lIGZvciBjb250ZW50IGxvb2t1cFxuICAgKiBAcHJvcGVydHkgY29udGVudEZhbGxiYWNrIC0gT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBjb250ZW50IGlzIG5vdCBmb3VuZFxuICAgKiBAcHJvcGVydHkgY29udGVudEludGVycG9sYXRpb24gLSBPcHRpb25hbCB2YWx1ZXMgdG8gaW50ZXJwb2xhdGUgaW50byBjb250ZW50XG4gICAqXG4gICAqIEZvciBzdHlsaW5nOlxuICAgKiBAcHJvcGVydHkgY29sb3IgLSBUaGUgdGV4dCBjb2xvciAoSW9uaWMgY29sb3Igc3RyaW5nKVxuICAgKiBAcHJvcGVydHkgc2l6ZSAtIFRoZSB0ZXh0IHNpemUgKCdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScgfCAneGxhcmdlJylcbiAgICogQHByb3BlcnR5IGJvbGQgLSBXaGV0aGVyIHRoZSB0ZXh0IGlzIGJvbGRcbiAgICogQHByb3BlcnR5IHByb2Nlc3NMaW5rcyAtIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBwcm9jZXNzIGFuZCBjb252ZXJ0IGxpbmtzIGluIHRleHQgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKiBAcHJvcGVydHkgbGlua0NvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIGxpbmsgcHJvY2Vzc2luZyAoY29sb3JzLCB0YXJnZXQgYmVoYXZpb3IsIGV0Yy4pXG4gICAqL1xuICBASW5wdXQoKVxuICBwcm9wczogVGV4dE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgcHJvdmlkZXMgdGhlIGNvbnRlbnQgdG8gZGlzcGxheS5cbiAgICogVGhpcyB3aWxsIGJlIGVpdGhlciBzdGF0aWMgY29udGVudCBvciByZWFjdGl2ZSBjb250ZW50IGZyb20gdGhlIGxhbmd1YWdlIHNlcnZpY2UuXG4gICAqL1xuICBkaXNwbGF5Q29udGVudCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbnRlbnRTZXJ2aWNlOiBDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGxpbmtQcm9jZXNzb3I6IExpbmtQcm9jZXNzb3JTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldHVwRGlzcGxheUNvbnRlbnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIHRoZSBjb250ZW50IG9ic2VydmFibGUgYmFzZWQgb24gdGhlIHByb3BzIGNvbmZpZ3VyYXRpb24uXG4gICAqIFByaW9yaXR5OiBzdGF0aWMgY29udGVudCA+IHJlYWN0aXZlIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uID4gcmVhY3RpdmUgY29udGVudFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERpc3BsYXlDb250ZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnQpIHtcbiAgICAgIC8vIFN0YXRpYyBjb250ZW50IHRha2VzIHByZWNlZGVuY2VcbiAgICAgIHRoaXMuZGlzcGxheUNvbnRlbnQkID0gb2YodGhpcy5wcm9wcy5jb250ZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuY29udGVudEtleSAmJiB0aGlzLnByb3BzLmNvbnRlbnRDbGFzcykge1xuICAgICAgLy8gUmVhY3RpdmUgY29udGVudCBmcm9tIGxhbmd1YWdlIHNlcnZpY2VcbiAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRJbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgIC8vIFdpdGggaW50ZXJwb2xhdGlvblxuICAgICAgICB0aGlzLmRpc3BsYXlDb250ZW50JCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmNvbnRlbnRDbGFzcyxcbiAgICAgICAgICBrZXk6IHRoaXMucHJvcHMuY29udGVudEtleSxcbiAgICAgICAgICBmYWxsYmFjazogdGhpcy5wcm9wcy5jb250ZW50RmFsbGJhY2ssXG4gICAgICAgICAgaW50ZXJwb2xhdGlvbjogdGhpcy5wcm9wcy5jb250ZW50SW50ZXJwb2xhdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW1wbGUgcmVhY3RpdmUgY29udGVudFxuICAgICAgICB0aGlzLmRpc3BsYXlDb250ZW50JCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jb250ZW50Q2xhc3MsXG4gICAgICAgICAga2V5OiB0aGlzLnByb3BzLmNvbnRlbnRLZXksXG4gICAgICAgICAgZmFsbGJhY2s6IHRoaXMucHJvcHMuY29udGVudEZhbGxiYWNrLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZW1wdHkgc3RyaW5nIGlmIG5vIHZhbGlkIGNvbnRlbnQgY29uZmlndXJhdGlvblxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAndmFsLXRleHQ6IE5vIHZhbGlkIGNvbnRlbnQgY29uZmlndXJhdGlvbiBwcm92aWRlZC4gVXNlIGVpdGhlciBcImNvbnRlbnRcIiBmb3Igc3RhdGljIHRleHQgb3IgXCJjb250ZW50S2V5XCIgKyBcImNvbnRlbnRDbGFzc1wiIGZvciByZWFjdGl2ZSBjb250ZW50LidcbiAgICAgICk7XG4gICAgICB0aGlzLmRpc3BsYXlDb250ZW50JCA9IG9mKHRoaXMucHJvcHMuY29udGVudEZhbGxiYWNrIHx8ICcnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlYWN0aXZlIHRleHQgcHJvcHMgZnJvbSBjb250ZW50IGNvbmZpZ3VyYXRpb24uXG4gKiBUaGlzIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gY3JlYXRlIHZhbC10ZXh0IHByb3BzIHdpdGggcmVhY3RpdmUgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gY29udGVudENvbmZpZyAtIENvbnRlbnQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHN0eWxlQ29uZmlnIC0gT3B0aW9uYWwgc3R5bGUgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUGFydGlhbCBUZXh0TWV0YWRhdGEgd2l0aCBjb250ZW50IHByb3BlcnRpZXMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGNvbXBvbmVudFxuICogdGl0bGVQcm9wczogVGV4dE1ldGFkYXRhID0ge1xuICogICAuLi5jcmVhdGVUZXh0UHJvcHMoe1xuICogICAgIGNvbnRlbnRLZXk6ICd0aXRsZScsXG4gKiAgICAgY29udGVudENsYXNzOiAnSGVhZGVyQ29tcG9uZW50J1xuICogICB9LCB7XG4gKiAgICAgY29sb3I6ICdwcmltYXJ5JyxcbiAqICAgICBzaXplOiAnbGFyZ2UnLFxuICogICAgIGJvbGQ6IHRydWVcbiAqICAgfSlcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRleHRQcm9wcyhcbiAgY29udGVudENvbmZpZzogVGV4dENvbnRlbnRDb25maWcsXG4gIHN0eWxlQ29uZmlnOiBQYXJ0aWFsPFBpY2s8VGV4dE1ldGFkYXRhLCAnY29sb3InIHwgJ3NpemUnIHwgJ2JvbGQnPj4gPSB7fVxuKTogUGFydGlhbDxUZXh0TWV0YWRhdGE+IHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50S2V5OiBjb250ZW50Q29uZmlnLmNvbnRlbnRLZXksXG4gICAgY29udGVudENsYXNzOiBjb250ZW50Q29uZmlnLmNvbnRlbnRDbGFzcyxcbiAgICBjb250ZW50RmFsbGJhY2s6IGNvbnRlbnRDb25maWcuY29udGVudEZhbGxiYWNrLFxuICAgIGNvbnRlbnRJbnRlcnBvbGF0aW9uOiBjb250ZW50Q29uZmlnLmNvbnRlbnRJbnRlcnBvbGF0aW9uLFxuICAgIGNvbG9yOiBzdHlsZUNvbmZpZy5jb2xvciB8fCAnZGFyaycsXG4gICAgc2l6ZTogc3R5bGVDb25maWcuc2l6ZSB8fCAnbWVkaXVtJyxcbiAgICBib2xkOiBzdHlsZUNvbmZpZy5ib2xkIHx8IGZhbHNlLFxuICB9O1xufVxuIl19
@@ -70,6 +70,48 @@ export class LinkProcessingExampleComponent {
70
70
  internalLinkClass: 'internal-same-tab',
71
71
  },
72
72
  };
73
+ this.markdownLinksProps = {
74
+ content: 'Consulta [la documentación de Angular](https://angular.io/docs) y ve a [configuración del perfil](/profile/settings) para más opciones.',
75
+ size: 'medium',
76
+ color: 'dark',
77
+ bold: false,
78
+ processLinks: true,
79
+ linkConfig: {
80
+ openExternalInNewTab: true,
81
+ openInternalInNewTab: false,
82
+ processMarkdownLinks: true,
83
+ linkClass: 'markdown-link',
84
+ externalLinkClass: 'markdown-external',
85
+ internalLinkClass: 'markdown-internal',
86
+ },
87
+ };
88
+ this.mixedFormatsProps = {
89
+ content: 'Aquí hay [documentación oficial](https://angular.io/docs), un enlace directo https://github.com/angular/angular, y una ruta interna /dashboard/analytics. ¡Todos funcionan!',
90
+ size: 'medium',
91
+ color: 'dark',
92
+ bold: false,
93
+ processLinks: true,
94
+ linkConfig: {
95
+ openExternalInNewTab: true,
96
+ openInternalInNewTab: false,
97
+ processMarkdownLinks: true,
98
+ linkClass: 'mixed-link',
99
+ externalLinkClass: 'mixed-external',
100
+ internalLinkClass: 'mixed-internal',
101
+ },
102
+ };
103
+ this.punctuationTestProps = {
104
+ content: 'URLs con puntuación: https://ionicframework.com/docs, revisa https://angular.io! También https://github.com/angular? Y finalmente https://typescript.org. ¡Todos deben funcionar correctamente!',
105
+ size: 'medium',
106
+ color: 'dark',
107
+ bold: false,
108
+ processLinks: true,
109
+ linkConfig: {
110
+ openExternalInNewTab: true,
111
+ linkClass: 'punctuation-test',
112
+ externalLinkClass: 'external-punct',
113
+ },
114
+ };
73
115
  }
74
116
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
75
117
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LinkProcessingExampleComponent, isStandalone: true, selector: "val-link-processing-example", ngImport: i0, template: `
@@ -100,6 +142,21 @@ export class LinkProcessingExampleComponent {
100
142
  <h3>Enlaces sin abrir en nueva pestaña:</h3>
101
143
  <val-text [props]="sameTabLinksProps"></val-text>
102
144
  </div>
145
+
146
+ <div class="example-section">
147
+ <h3>Enlaces estilo Markdown [texto](url):</h3>
148
+ <val-text [props]="markdownLinksProps"></val-text>
149
+ </div>
150
+
151
+ <div class="example-section">
152
+ <h3>Mezcla de enlaces directos y Markdown:</h3>
153
+ <val-text [props]="mixedFormatsProps"></val-text>
154
+ </div>
155
+
156
+ <div class="example-section">
157
+ <h3>Corrección de puntuación en URLs:</h3>
158
+ <val-text [props]="punctuationTestProps"></val-text>
159
+ </div>
103
160
  </div>
104
161
  `, isInline: true, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"], dependencies: [{ kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
105
162
  }
@@ -133,7 +190,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
133
190
  <h3>Enlaces sin abrir en nueva pestaña:</h3>
134
191
  <val-text [props]="sameTabLinksProps"></val-text>
135
192
  </div>
193
+
194
+ <div class="example-section">
195
+ <h3>Enlaces estilo Markdown [texto](url):</h3>
196
+ <val-text [props]="markdownLinksProps"></val-text>
197
+ </div>
198
+
199
+ <div class="example-section">
200
+ <h3>Mezcla de enlaces directos y Markdown:</h3>
201
+ <val-text [props]="mixedFormatsProps"></val-text>
202
+ </div>
203
+
204
+ <div class="example-section">
205
+ <h3>Corrección de puntuación en URLs:</h3>
206
+ <val-text [props]="punctuationTestProps"></val-text>
207
+ </div>
136
208
  </div>
137
209
  `, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"] }]
138
210
  }] });
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1wcm9jZXNzaW5nLWV4YW1wbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvZXhhbXBsZXMvbGluay1wcm9jZXNzaW5nLWV4YW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQUV4RTs7Ozs7Ozs7OztHQVVHO0FBK0RILE1BQU0sT0FBTyw4QkFBOEI7SUE5RDNDO1FBK0RFLG1CQUFjLEdBQWlCO1lBQzdCLE9BQU8sRUFBRSx1RkFBdUY7WUFDaEcsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQztRQUVGLG9CQUFlLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSx5RkFBeUY7WUFDbEcsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQztRQUVGLHFCQUFnQixHQUFpQjtZQUMvQixPQUFPLEVBQUUsZ0ZBQWdGO1lBQ3pGLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsbUJBQW1CO2dCQUM5QixpQkFBaUIsRUFBRSxpQkFBaUI7Z0JBQ3BDLGlCQUFpQixFQUFFLGlCQUFpQjthQUNyQztTQUNGLENBQUM7UUFFRixvQkFBZSxHQUFpQjtZQUM5QixPQUFPLEVBQ0wseUxBQXlMO1lBQzNMLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixpQkFBaUIsRUFBRSxlQUFlO2dCQUNsQyxpQkFBaUIsRUFBRSxlQUFlO2FBQ25DO1NBQ0YsQ0FBQztRQUVGLHNCQUFpQixHQUFpQjtZQUNoQyxPQUFPLEVBQUUsc0VBQXNFO1lBQy9FLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsZUFBZTtnQkFDMUIsaUJBQWlCLEVBQUUsbUJBQW1CO2dCQUN0QyxpQkFBaUIsRUFBRSxtQkFBbUI7YUFDdkM7U0FDRixDQUFDO0tBQ0g7K0dBOURZLDhCQUE4QjttR0FBOUIsOEJBQThCLHVGQTFEL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJULG9hQTlCUyxhQUFhOzs0RkEyRFosOEJBQThCO2tCQTlEMUMsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQLENBQUMsYUFBYSxDQUFDLFlBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRNZXRhZGF0YSB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXRvbXMvdGV4dC90eXBlcyc7XG4vKipcbiAqIExpbmtQcm9jZXNzaW5nRXhhbXBsZUNvbXBvbmVudCAtIENvbXBvbmVudGUgZGUgZWplbXBsbyBxdWUgZGVtdWVzdHJhIGVsIHByb2Nlc2FtaWVudG8gYXV0b23DoXRpY28gZGUgZW5sYWNlcy5cbiAqXG4gKiBFc3RlIGNvbXBvbmVudGUgbXVlc3RyYSBkaWZlcmVudGVzIGNhc29zIGRlIHVzbyBwYXJhIGVsIHByb2Nlc2FtaWVudG8gYXV0b23DoXRpY28gZGUgZW5sYWNlc1xuICogZW4gZWwgY29tcG9uZW50ZSB2YWwtdGV4dCwgaW5jbHV5ZW5kbyBlbmxhY2VzIGV4dGVybm9zLCBydXRhcyBpbnRlcm5hcyB5IGNvbmZpZ3VyYWNpb25lcyBwZXJzb25hbGl6YWRhcy5cbiAqXG4gKiBAZXhhbXBsZSBVc28gZW4gdGVtcGxhdGU6XG4gKiBgYGBodG1sXG4gKiA8dmFsLWxpbmstcHJvY2Vzc2luZy1leGFtcGxlPjwvdmFsLWxpbmstcHJvY2Vzc2luZy1leGFtcGxlPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1saW5rLXByb2Nlc3NpbmctZXhhbXBsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtUZXh0Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibGluay1leGFtcGxlc1wiPlxuICAgICAgPGgyPkVqZW1wbG9zIGRlIFByb2Nlc2FtaWVudG8gZGUgRW5sYWNlczwvaDI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLXNlY3Rpb25cIj5cbiAgICAgICAgPGgzPlRleHRvIHNpbiBwcm9jZXNhbWllbnRvIGRlIGVubGFjZXM6PC9oMz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJiYXNpY1RleHRQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+VGV4dG8gY29uIHByb2Nlc2FtaWVudG8gYsOhc2ljbyBkZSBlbmxhY2VzOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiYmFzaWNMaW5rc1Byb3BzXCI+PC92YWwtdGV4dD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1zZWN0aW9uXCI+XG4gICAgICAgIDxoMz5FbmxhY2VzIGNvbiBjb25maWd1cmFjacOzbiBwZXJzb25hbGl6YWRhOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiY3VzdG9tTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+RW5sYWNlcyBpbnRlcm5vcyB5IGV4dGVybm9zIG1lemNsYWRvczo8L2gzPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cIm1peGVkTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+RW5sYWNlcyBzaW4gYWJyaXIgZW4gbnVldmEgcGVzdGHDsWE6PC9oMz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJzYW1lVGFiTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmxpbmstZXhhbXBsZXMge1xuICAgICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDgwMHB4O1xuICAgICAgfVxuXG4gICAgICAuZXhhbXBsZS1zZWN0aW9uIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQtdGludCwgI2Y1ZjZmOSk7XG4gICAgICB9XG5cbiAgICAgIGgyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjMzg4MGZmKTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIH1cblxuICAgICAgaDMge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICMyMjI0MjgpO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlua1Byb2Nlc3NpbmdFeGFtcGxlQ29tcG9uZW50IHtcbiAgYmFzaWNUZXh0UHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnRXN0ZSB0ZXh0byBjb250aWVuZSBodHRwczovL2FuZ3VsYXIuaW8geSAvZGFzaGJvYXJkIHBlcm8gbm8gc2UgcHJvY2VzYW4gY29tbyBlbmxhY2VzLicsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBib2xkOiBmYWxzZSxcbiAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICB9O1xuXG4gIGJhc2ljTGlua3NQcm9wczogVGV4dE1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdWaXNpdGEgaHR0cHM6Ly9hbmd1bGFyLmlvIHBhcmEgZG9jdW1lbnRhY2nDs24gbyB2ZSBhIC9kYXNoYm9hcmQgcGFyYSBlbCBwYW5lbCBwcmluY2lwYWwuJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgfTtcblxuICBjdXN0b21MaW5rc1Byb3BzOiBUZXh0TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ0VubGFjZXMgcGVyc29uYWxpemFkb3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIgeSAvcHJvZmlsZS9zZXR0aW5ncycsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBib2xkOiBmYWxzZSxcbiAgICBwcm9jZXNzTGlua3M6IHRydWUsXG4gICAgbGlua0NvbmZpZzoge1xuICAgICAgb3BlbkV4dGVybmFsSW5OZXdUYWI6IHRydWUsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBsaW5rQ2xhc3M6ICdjdXN0b20tbGluay1zdHlsZScsXG4gICAgICBleHRlcm5hbExpbmtDbGFzczogJ2V4dGVybmFsLWN1c3RvbScsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzczogJ2ludGVybmFsLWN1c3RvbScsXG4gICAgfSxcbiAgfTtcblxuICBtaXhlZExpbmtzUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OlxuICAgICAgJ0NvbnN1bHRhIGxhIGRvY3VtZW50YWNpw7NuIGVuIGh0dHBzOi8vaW9uaWNmcmFtZXdvcmsuY29tL2RvY3MsIHJldmlzYSBlbCBjw7NkaWdvIGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9pb25pYy10ZWFtL2lvbmljLWZyYW1ld29yaywgbyBuYXZlZ2EgYSAvY29tcG9uZW50cy9idXR0b25zIHBhcmEgZWplbXBsb3MgaW50ZXJub3MuJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgICBsaW5rQ29uZmlnOiB7XG4gICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogdHJ1ZSxcbiAgICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAgICAgIGxpbmtDbGFzczogJ3Byb2Nlc3NlZC1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzOiAnZXh0ZXJuYWwtbGluaycsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzczogJ2ludGVybmFsLWxpbmsnLFxuICAgIH0sXG4gIH07XG5cbiAgc2FtZVRhYkxpbmtzUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnRXN0b3MgZW5sYWNlcyBubyBhYnJlbiBlbiBudWV2YSBwZXN0YcOxYTogaHR0cHM6Ly9leGFtcGxlLmNvbSB5IC9ob21lJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgICBsaW5rQ29uZmlnOiB7XG4gICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBsaW5rQ2xhc3M6ICdzYW1lLXRhYi1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzOiAnZXh0ZXJuYWwtc2FtZS10YWInLFxuICAgICAgaW50ZXJuYWxMaW5rQ2xhc3M6ICdpbnRlcm5hbC1zYW1lLXRhYicsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1wcm9jZXNzaW5nLWV4YW1wbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvZXhhbXBsZXMvbGluay1wcm9jZXNzaW5nLWV4YW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQUV4RTs7Ozs7Ozs7OztHQVVHO0FBOEVILE1BQU0sT0FBTyw4QkFBOEI7SUE3RTNDO1FBOEVFLG1CQUFjLEdBQWlCO1lBQzdCLE9BQU8sRUFBRSx1RkFBdUY7WUFDaEcsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQztRQUVGLG9CQUFlLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSx5RkFBeUY7WUFDbEcsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQztRQUVGLHFCQUFnQixHQUFpQjtZQUMvQixPQUFPLEVBQUUsZ0ZBQWdGO1lBQ3pGLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsbUJBQW1CO2dCQUM5QixpQkFBaUIsRUFBRSxpQkFBaUI7Z0JBQ3BDLGlCQUFpQixFQUFFLGlCQUFpQjthQUNyQztTQUNGLENBQUM7UUFFRixvQkFBZSxHQUFpQjtZQUM5QixPQUFPLEVBQ0wseUxBQXlMO1lBQzNMLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixpQkFBaUIsRUFBRSxlQUFlO2dCQUNsQyxpQkFBaUIsRUFBRSxlQUFlO2FBQ25DO1NBQ0YsQ0FBQztRQUVGLHNCQUFpQixHQUFpQjtZQUNoQyxPQUFPLEVBQUUsc0VBQXNFO1lBQy9FLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsZUFBZTtnQkFDMUIsaUJBQWlCLEVBQUUsbUJBQW1CO2dCQUN0QyxpQkFBaUIsRUFBRSxtQkFBbUI7YUFDdkM7U0FDRixDQUFDO1FBRUYsdUJBQWtCLEdBQWlCO1lBQ2pDLE9BQU8sRUFDTCx5SUFBeUk7WUFDM0ksSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFO2dCQUNWLG9CQUFvQixFQUFFLElBQUk7Z0JBQzFCLG9CQUFvQixFQUFFLEtBQUs7Z0JBQzNCLG9CQUFvQixFQUFFLElBQUk7Z0JBQzFCLFNBQVMsRUFBRSxlQUFlO2dCQUMxQixpQkFBaUIsRUFBRSxtQkFBbUI7Z0JBQ3RDLGlCQUFpQixFQUFFLG1CQUFtQjthQUN2QztTQUNGLENBQUM7UUFFRixzQkFBaUIsR0FBaUI7WUFDaEMsT0FBTyxFQUNMLDZLQUE2SztZQUMvSyxJQUFJLEVBQUUsUUFBUTtZQUNkLEtBQUssRUFBRSxNQUFNO1lBQ2IsSUFBSSxFQUFFLEtBQUs7WUFDWCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUU7Z0JBQ1Ysb0JBQW9CLEVBQUUsSUFBSTtnQkFDMUIsb0JBQW9CLEVBQUUsS0FBSztnQkFDM0Isb0JBQW9CLEVBQUUsSUFBSTtnQkFDMUIsU0FBUyxFQUFFLFlBQVk7Z0JBQ3ZCLGlCQUFpQixFQUFFLGdCQUFnQjtnQkFDbkMsaUJBQWlCLEVBQUUsZ0JBQWdCO2FBQ3BDO1NBQ0YsQ0FBQztRQUVGLHlCQUFvQixHQUFpQjtZQUNuQyxPQUFPLEVBQ0wsaU1BQWlNO1lBQ25NLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixTQUFTLEVBQUUsa0JBQWtCO2dCQUM3QixpQkFBaUIsRUFBRSxnQkFBZ0I7YUFDcEM7U0FDRixDQUFDO0tBQ0g7K0dBOUdZLDhCQUE4QjttR0FBOUIsOEJBQThCLHVGQXpFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNENULG9hQTdDUyxhQUFhOzs0RkEwRVosOEJBQThCO2tCQTdFMUMsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQLENBQUMsYUFBYSxDQUFDLFlBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNENUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRNZXRhZGF0YSB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXRvbXMvdGV4dC90eXBlcyc7XG4vKipcbiAqIExpbmtQcm9jZXNzaW5nRXhhbXBsZUNvbXBvbmVudCAtIENvbXBvbmVudGUgZGUgZWplbXBsbyBxdWUgZGVtdWVzdHJhIGVsIHByb2Nlc2FtaWVudG8gYXV0b23DoXRpY28gZGUgZW5sYWNlcy5cbiAqXG4gKiBFc3RlIGNvbXBvbmVudGUgbXVlc3RyYSBkaWZlcmVudGVzIGNhc29zIGRlIHVzbyBwYXJhIGVsIHByb2Nlc2FtaWVudG8gYXV0b23DoXRpY28gZGUgZW5sYWNlc1xuICogZW4gZWwgY29tcG9uZW50ZSB2YWwtdGV4dCwgaW5jbHV5ZW5kbyBlbmxhY2VzIGV4dGVybm9zLCBydXRhcyBpbnRlcm5hcyB5IGNvbmZpZ3VyYWNpb25lcyBwZXJzb25hbGl6YWRhcy5cbiAqXG4gKiBAZXhhbXBsZSBVc28gZW4gdGVtcGxhdGU6XG4gKiBgYGBodG1sXG4gKiA8dmFsLWxpbmstcHJvY2Vzc2luZy1leGFtcGxlPjwvdmFsLWxpbmstcHJvY2Vzc2luZy1leGFtcGxlPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1saW5rLXByb2Nlc3NpbmctZXhhbXBsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtUZXh0Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibGluay1leGFtcGxlc1wiPlxuICAgICAgPGgyPkVqZW1wbG9zIGRlIFByb2Nlc2FtaWVudG8gZGUgRW5sYWNlczwvaDI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLXNlY3Rpb25cIj5cbiAgICAgICAgPGgzPlRleHRvIHNpbiBwcm9jZXNhbWllbnRvIGRlIGVubGFjZXM6PC9oMz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJiYXNpY1RleHRQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+VGV4dG8gY29uIHByb2Nlc2FtaWVudG8gYsOhc2ljbyBkZSBlbmxhY2VzOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiYmFzaWNMaW5rc1Byb3BzXCI+PC92YWwtdGV4dD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1zZWN0aW9uXCI+XG4gICAgICAgIDxoMz5FbmxhY2VzIGNvbiBjb25maWd1cmFjacOzbiBwZXJzb25hbGl6YWRhOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiY3VzdG9tTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+RW5sYWNlcyBpbnRlcm5vcyB5IGV4dGVybm9zIG1lemNsYWRvczo8L2gzPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cIm1peGVkTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+RW5sYWNlcyBzaW4gYWJyaXIgZW4gbnVldmEgcGVzdGHDsWE6PC9oMz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJzYW1lVGFiTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+RW5sYWNlcyBlc3RpbG8gTWFya2Rvd24gW3RleHRvXSh1cmwpOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwibWFya2Rvd25MaW5rc1Byb3BzXCI+PC92YWwtdGV4dD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1zZWN0aW9uXCI+XG4gICAgICAgIDxoMz5NZXpjbGEgZGUgZW5sYWNlcyBkaXJlY3RvcyB5IE1hcmtkb3duOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwibWl4ZWRGb3JtYXRzUHJvcHNcIj48L3ZhbC10ZXh0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLXNlY3Rpb25cIj5cbiAgICAgICAgPGgzPkNvcnJlY2Npw7NuIGRlIHB1bnR1YWNpw7NuIGVuIFVSTHM6PC9oMz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJwdW5jdHVhdGlvblRlc3RQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmxpbmstZXhhbXBsZXMge1xuICAgICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDgwMHB4O1xuICAgICAgfVxuXG4gICAgICAuZXhhbXBsZS1zZWN0aW9uIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQtdGludCwgI2Y1ZjZmOSk7XG4gICAgICB9XG5cbiAgICAgIGgyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjMzg4MGZmKTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIH1cblxuICAgICAgaDMge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICMyMjI0MjgpO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlua1Byb2Nlc3NpbmdFeGFtcGxlQ29tcG9uZW50IHtcbiAgYmFzaWNUZXh0UHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnRXN0ZSB0ZXh0byBjb250aWVuZSBodHRwczovL2FuZ3VsYXIuaW8geSAvZGFzaGJvYXJkIHBlcm8gbm8gc2UgcHJvY2VzYW4gY29tbyBlbmxhY2VzLicsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBib2xkOiBmYWxzZSxcbiAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICB9O1xuXG4gIGJhc2ljTGlua3NQcm9wczogVGV4dE1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdWaXNpdGEgaHR0cHM6Ly9hbmd1bGFyLmlvIHBhcmEgZG9jdW1lbnRhY2nDs24gbyB2ZSBhIC9kYXNoYm9hcmQgcGFyYSBlbCBwYW5lbCBwcmluY2lwYWwuJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgfTtcblxuICBjdXN0b21MaW5rc1Byb3BzOiBUZXh0TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ0VubGFjZXMgcGVyc29uYWxpemFkb3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIgeSAvcHJvZmlsZS9zZXR0aW5ncycsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBib2xkOiBmYWxzZSxcbiAgICBwcm9jZXNzTGlua3M6IHRydWUsXG4gICAgbGlua0NvbmZpZzoge1xuICAgICAgb3BlbkV4dGVybmFsSW5OZXdUYWI6IHRydWUsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBsaW5rQ2xhc3M6ICdjdXN0b20tbGluay1zdHlsZScsXG4gICAgICBleHRlcm5hbExpbmtDbGFzczogJ2V4dGVybmFsLWN1c3RvbScsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzczogJ2ludGVybmFsLWN1c3RvbScsXG4gICAgfSxcbiAgfTtcblxuICBtaXhlZExpbmtzUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OlxuICAgICAgJ0NvbnN1bHRhIGxhIGRvY3VtZW50YWNpw7NuIGVuIGh0dHBzOi8vaW9uaWNmcmFtZXdvcmsuY29tL2RvY3MsIHJldmlzYSBlbCBjw7NkaWdvIGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9pb25pYy10ZWFtL2lvbmljLWZyYW1ld29yaywgbyBuYXZlZ2EgYSAvY29tcG9uZW50cy9idXR0b25zIHBhcmEgZWplbXBsb3MgaW50ZXJub3MuJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgICBsaW5rQ29uZmlnOiB7XG4gICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogdHJ1ZSxcbiAgICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAgICAgIGxpbmtDbGFzczogJ3Byb2Nlc3NlZC1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzOiAnZXh0ZXJuYWwtbGluaycsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzczogJ2ludGVybmFsLWxpbmsnLFxuICAgIH0sXG4gIH07XG5cbiAgc2FtZVRhYkxpbmtzUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnRXN0b3MgZW5sYWNlcyBubyBhYnJlbiBlbiBudWV2YSBwZXN0YcOxYTogaHR0cHM6Ly9leGFtcGxlLmNvbSB5IC9ob21lJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgICBsaW5rQ29uZmlnOiB7XG4gICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBsaW5rQ2xhc3M6ICdzYW1lLXRhYi1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzOiAnZXh0ZXJuYWwtc2FtZS10YWInLFxuICAgICAgaW50ZXJuYWxMaW5rQ2xhc3M6ICdpbnRlcm5hbC1zYW1lLXRhYicsXG4gICAgfSxcbiAgfTtcblxuICBtYXJrZG93bkxpbmtzUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OlxuICAgICAgJ0NvbnN1bHRhIFtsYSBkb2N1bWVudGFjacOzbiBkZSBBbmd1bGFyXShodHRwczovL2FuZ3VsYXIuaW8vZG9jcykgeSB2ZSBhIFtjb25maWd1cmFjacOzbiBkZWwgcGVyZmlsXSgvcHJvZmlsZS9zZXR0aW5ncykgcGFyYSBtw6FzIG9wY2lvbmVzLicsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBib2xkOiBmYWxzZSxcbiAgICBwcm9jZXNzTGlua3M6IHRydWUsXG4gICAgbGlua0NvbmZpZzoge1xuICAgICAgb3BlbkV4dGVybmFsSW5OZXdUYWI6IHRydWUsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBwcm9jZXNzTWFya2Rvd25MaW5rczogdHJ1ZSxcbiAgICAgIGxpbmtDbGFzczogJ21hcmtkb3duLWxpbmsnLFxuICAgICAgZXh0ZXJuYWxMaW5rQ2xhc3M6ICdtYXJrZG93bi1leHRlcm5hbCcsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzczogJ21hcmtkb3duLWludGVybmFsJyxcbiAgICB9LFxuICB9O1xuXG4gIG1peGVkRm9ybWF0c1Byb3BzOiBUZXh0TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDpcbiAgICAgICdBcXXDrSBoYXkgW2RvY3VtZW50YWNpw7NuIG9maWNpYWxdKGh0dHBzOi8vYW5ndWxhci5pby9kb2NzKSwgdW4gZW5sYWNlIGRpcmVjdG8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhciwgeSB1bmEgcnV0YSBpbnRlcm5hIC9kYXNoYm9hcmQvYW5hbHl0aWNzLiDCoVRvZG9zIGZ1bmNpb25hbiEnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICAgIGNvbG9yOiAnZGFyaycsXG4gICAgYm9sZDogZmFsc2UsXG4gICAgcHJvY2Vzc0xpbmtzOiB0cnVlLFxuICAgIGxpbmtDb25maWc6IHtcbiAgICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiOiB0cnVlLFxuICAgICAgb3BlbkludGVybmFsSW5OZXdUYWI6IGZhbHNlLFxuICAgICAgcHJvY2Vzc01hcmtkb3duTGlua3M6IHRydWUsXG4gICAgICBsaW5rQ2xhc3M6ICdtaXhlZC1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzOiAnbWl4ZWQtZXh0ZXJuYWwnLFxuICAgICAgaW50ZXJuYWxMaW5rQ2xhc3M6ICdtaXhlZC1pbnRlcm5hbCcsXG4gICAgfSxcbiAgfTtcblxuICBwdW5jdHVhdGlvblRlc3RQcm9wczogVGV4dE1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6XG4gICAgICAnVVJMcyBjb24gcHVudHVhY2nDs246IGh0dHBzOi8vaW9uaWNmcmFtZXdvcmsuY29tL2RvY3MsIHJldmlzYSBodHRwczovL2FuZ3VsYXIuaW8hIFRhbWJpw6luIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyPyBZIGZpbmFsbWVudGUgaHR0cHM6Ly90eXBlc2NyaXB0Lm9yZy4gwqFUb2RvcyBkZWJlbiBmdW5jaW9uYXIgY29ycmVjdGFtZW50ZSEnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICAgIGNvbG9yOiAnZGFyaycsXG4gICAgYm9sZDogZmFsc2UsXG4gICAgcHJvY2Vzc0xpbmtzOiB0cnVlLFxuICAgIGxpbmtDb25maWc6IHtcbiAgICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiOiB0cnVlLFxuICAgICAgbGlua0NsYXNzOiAncHVuY3R1YXRpb24tdGVzdCcsXG4gICAgICBleHRlcm5hbExpbmtDbGFzczogJ2V4dGVybmFsLXB1bmN0JyxcbiAgICB9LFxuICB9O1xufVxuIl19
@@ -4,15 +4,15 @@ import * as i1 from "@angular/platform-browser";
4
4
  /**
5
5
  * LinkProcessorService - Service for processing text content to convert URLs and internal routes into clickable links.
6
6
  *
7
- * This service automatically detects external URLs (http/https) and internal routes (starting with /)
8
- * and converts them into HTML anchor elements with appropriate attributes.
7
+ * This service automatically detects external URLs (http/https), internal routes (starting with /),
8
+ * and Markdown-style links [text](url) and converts them into HTML anchor elements with appropriate attributes.
9
9
  *
10
10
  * @example Basic usage:
11
11
  * ```typescript
12
12
  * constructor(private linkProcessor: LinkProcessorService) {}
13
13
  *
14
14
  * processText() {
15
- * const text = 'Visit https://example.com or go to /profile';
15
+ * const text = 'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)';
16
16
  * const processed = this.linkProcessor.processLinks(text);
17
17
  * // Returns SafeHtml with clickable links
18
18
  * }
@@ -21,14 +21,16 @@ import * as i1 from "@angular/platform-browser";
21
21
  export class LinkProcessorService {
22
22
  constructor(sanitizer) {
23
23
  this.sanitizer = sanitizer;
24
- // Regex para detectar URLs completas (http/https)
25
- this.urlRegex = /(https?:\/\/[^\s]+)/g;
26
- // Regex para detectar rutas internas (empiezan con / pero no son URLs completas)
27
- this.internalRouteRegex = /(\s|^)(\/[^\s]*)/g;
24
+ // Regex para detectar URLs completas (http/https) - permite caracteres válidos pero excluye puntuación al final
25
+ this.urlRegex = /(https?:\/\/[^\s]+?)(?=[.,;!?()\s]|$)/g;
26
+ // Regex para detectar rutas internas (empiezan con / pero no son URLs completas) - excluye puntuación al final
27
+ this.internalRouteRegex = /(\s|^)(\/[^\s]*?)(?=[.,;!?()\s]|$)/g;
28
+ // Regex para detectar enlaces estilo Markdown [texto](url)
29
+ this.markdownLinkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
28
30
  }
29
31
  /**
30
32
  * Procesa texto para convertir enlaces en elementos <a> clickeables.
31
- * Detecta automáticamente URLs externas e internas y las convierte en enlaces.
33
+ * Detecta automáticamente URLs externas, rutas internas y enlaces estilo Markdown.
32
34
  *
33
35
  * @param text - Texto a procesar
34
36
  * @param config - Configuración del procesamiento
@@ -37,10 +39,11 @@ export class LinkProcessorService {
37
39
  * @example
38
40
  * ```typescript
39
41
  * const result = this.linkProcessor.processLinks(
40
- * 'Visit https://example.com or /profile',
42
+ * 'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)',
41
43
  * {
42
44
  * openExternalInNewTab: true,
43
45
  * openInternalInNewTab: false,
46
+ * processMarkdownLinks: true,
44
47
  * linkClass: 'custom-link'
45
48
  * }
46
49
  * );
@@ -49,33 +52,61 @@ export class LinkProcessorService {
49
52
  processLinks(text, config = {}) {
50
53
  if (!text)
51
54
  return '';
52
- const { openExternalInNewTab = true, openInternalInNewTab = false, linkClass = 'processed-link', externalLinkClass = 'external-link', internalLinkClass = 'internal-link', } = config;
55
+ const { openExternalInNewTab = true, openInternalInNewTab = false, linkClass = 'processed-link', externalLinkClass = 'external-link', internalLinkClass = 'internal-link', processMarkdownLinks = true, } = config;
53
56
  let hasLinks = false;
54
57
  let processedText = text;
55
- // Procesar URLs externas primero
56
- if (this.urlRegex.test(text)) {
57
- hasLinks = true;
58
- this.urlRegex.lastIndex = 0; // Reset regex
59
- processedText = processedText.replace(this.urlRegex, url => {
60
- const target = openExternalInNewTab ? ' target="_blank" rel="noopener noreferrer"' : '';
61
- const classes = `${linkClass} ${externalLinkClass}`.trim();
62
- return `<a href="${url}"${target} class="${classes}">${url}</a>`;
58
+ // 1. Procesar enlaces estilo Markdown [texto](url) primero
59
+ if (processMarkdownLinks) {
60
+ this.markdownLinkRegex.lastIndex = 0; // Reset regex
61
+ processedText = processedText.replace(this.markdownLinkRegex, (match, linkText, url) => {
62
+ hasLinks = true;
63
+ const isExternal = /^https?:\/\//.test(url);
64
+ const target = (isExternal ? openExternalInNewTab : openInternalInNewTab)
65
+ ? isExternal
66
+ ? ' target="_blank" rel="noopener noreferrer"'
67
+ : ' target="_blank"'
68
+ : '';
69
+ const typeClass = isExternal ? externalLinkClass : internalLinkClass;
70
+ const classes = `${linkClass} ${typeClass}`.trim();
71
+ return `<a href="${url}"${target} class="${classes}">${linkText}</a>`;
63
72
  });
64
73
  }
65
- // Procesar rutas internas después
66
- if (this.internalRouteRegex.test(processedText)) {
74
+ // 2. Procesar URLs externas directas (solo si no están ya en un enlace HTML)
75
+ this.urlRegex.lastIndex = 0; // Reset regex
76
+ processedText = processedText.replace(this.urlRegex, (fullMatch, url) => {
77
+ // Verificar que no esté ya dentro de un enlace HTML existente
78
+ const urlPosition = processedText.indexOf(fullMatch);
79
+ const textBefore = processedText.substring(0, urlPosition);
80
+ // Buscar la última apertura y cierre de enlace antes de esta posición
81
+ const lastOpenTag = textBefore.lastIndexOf('<a ');
82
+ const lastCloseTag = textBefore.lastIndexOf('</a>');
83
+ // Si hay un tag <a abierto sin cerrar, no procesamos
84
+ if (lastOpenTag > lastCloseTag) {
85
+ return fullMatch; // Mantener original
86
+ }
67
87
  hasLinks = true;
68
- this.internalRouteRegex.lastIndex = 0; // Reset regex
69
- processedText = processedText.replace(this.internalRouteRegex, (match, prefix, route) => {
70
- // Solo procesar si no está ya dentro de un enlace
71
- if (processedText.indexOf(`href="${route}"`) === -1) {
72
- const target = openInternalInNewTab ? ' target="_blank"' : '';
73
- const classes = `${linkClass} ${internalLinkClass}`.trim();
74
- return `${prefix}<a href="${route}"${target} class="${classes}">${route}</a>`;
75
- }
76
- return match;
77
- });
78
- }
88
+ const target = openExternalInNewTab ? ' target="_blank" rel="noopener noreferrer"' : '';
89
+ const classes = `${linkClass} ${externalLinkClass}`.trim();
90
+ return `<a href="${url}"${target} class="${classes}">${url}</a>`;
91
+ });
92
+ // 3. Procesar rutas internas (solo si no están ya en un enlace HTML)
93
+ this.internalRouteRegex.lastIndex = 0; // Reset regex
94
+ processedText = processedText.replace(this.internalRouteRegex, (match, prefix, route) => {
95
+ // Verificar que no esté ya dentro de un enlace HTML existente
96
+ const matchPosition = processedText.indexOf(match);
97
+ const textBefore = processedText.substring(0, matchPosition);
98
+ // Buscar la última apertura y cierre de enlace antes de esta posición
99
+ const lastOpenTag = textBefore.lastIndexOf('<a ');
100
+ const lastCloseTag = textBefore.lastIndexOf('</a>');
101
+ // Si hay un tag <a abierto sin cerrar, no procesamos
102
+ if (lastOpenTag > lastCloseTag) {
103
+ return match; // Mantener original
104
+ }
105
+ hasLinks = true;
106
+ const target = openInternalInNewTab ? ' target="_blank"' : '';
107
+ const classes = `${linkClass} ${internalLinkClass}`.trim();
108
+ return `${prefix}<a href="${route}"${target} class="${classes}">${route}</a>`;
109
+ });
79
110
  // Si hay enlaces, sanitizar el HTML
80
111
  if (hasLinks) {
81
112
  return this.sanitizer.bypassSecurityTrustHtml(processedText);
@@ -83,14 +114,14 @@ export class LinkProcessorService {
83
114
  return text;
84
115
  }
85
116
  /**
86
- * Detecta si un texto contiene enlaces (URLs o rutas internas).
117
+ * Detecta si un texto contiene enlaces (URLs, rutas internas o enlaces Markdown).
87
118
  *
88
119
  * @param text - Texto a analizar
89
120
  * @returns true si contiene enlaces
90
121
  *
91
122
  * @example
92
123
  * ```typescript
93
- * const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com');
124
+ * const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com or [docs](https://docs.com)');
94
125
  * // Returns: true
95
126
  * ```
96
127
  */
@@ -100,20 +131,24 @@ export class LinkProcessorService {
100
131
  // Reset regex indices
101
132
  this.urlRegex.lastIndex = 0;
102
133
  this.internalRouteRegex.lastIndex = 0;
103
- return this.urlRegex.test(text) || this.internalRouteRegex.test(text);
134
+ this.markdownLinkRegex.lastIndex = 0;
135
+ return (this.urlRegex.test(text) ||
136
+ this.internalRouteRegex.test(text) ||
137
+ this.markdownLinkRegex.test(text));
104
138
  }
105
139
  /**
106
140
  * Extrae todos los enlaces de un texto.
107
141
  *
108
142
  * @param text - Texto a analizar
109
- * @returns Array de enlaces encontrados con su tipo
143
+ * @returns Array de enlaces encontrados con su tipo y texto (si es Markdown)
110
144
  *
111
145
  * @example
112
146
  * ```typescript
113
- * const links = this.linkProcessor.extractLinks('Visit https://example.com or /profile');
147
+ * const links = this.linkProcessor.extractLinks('Visit https://example.com, /profile, or [docs](https://docs.com)');
114
148
  * // Returns: [
115
- * // { url: 'https://example.com', type: 'external' },
116
- * // { url: '/profile', type: 'internal' }
149
+ * // { url: 'https://example.com', type: 'external', text: 'https://example.com' },
150
+ * // { url: '/profile', type: 'internal', text: '/profile' },
151
+ * // { url: 'https://docs.com', type: 'external', text: 'docs' }
117
152
  * // ]
118
153
  * ```
119
154
  */
@@ -124,14 +159,30 @@ export class LinkProcessorService {
124
159
  // Reset regex indices
125
160
  this.urlRegex.lastIndex = 0;
126
161
  this.internalRouteRegex.lastIndex = 0;
127
- // Extraer URLs externas
162
+ this.markdownLinkRegex.lastIndex = 0;
163
+ // Extraer enlaces Markdown primero
128
164
  let match;
165
+ while ((match = this.markdownLinkRegex.exec(text)) !== null) {
166
+ const url = match[2];
167
+ const linkText = match[1];
168
+ const type = /^https?:\/\//.test(url) ? 'external' : 'internal';
169
+ links.push({ url, type, text: linkText });
170
+ }
171
+ // Extraer URLs externas directas
129
172
  while ((match = this.urlRegex.exec(text)) !== null) {
130
- links.push({ url: match[1], type: 'external' });
173
+ const url = match[1];
174
+ // Verificar que no esté ya capturado como Markdown link
175
+ if (!links.some(link => link.url === url)) {
176
+ links.push({ url, type: 'external', text: url });
177
+ }
131
178
  }
132
- // Extraer rutas internas
179
+ // Extraer rutas internas directas
133
180
  while ((match = this.internalRouteRegex.exec(text)) !== null) {
134
- links.push({ url: match[2], type: 'internal' });
181
+ const url = match[2];
182
+ // Verificar que no esté ya capturado como Markdown link
183
+ if (!links.some(link => link.url === url)) {
184
+ links.push({ url, type: 'internal', text: url });
185
+ }
135
186
  }
136
187
  return links;
137
188
  }
@@ -144,4 +195,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
144
195
  providedIn: 'root',
145
196
  }]
146
197
  }], ctorParameters: () => [{ type: i1.DomSanitizer }] });
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1wcm9jZXNzb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2xpbmstcHJvY2Vzc29yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBZ0IzQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFPL0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQU4zQyxrREFBa0Q7UUFDakMsYUFBUSxHQUFHLHNCQUFzQixDQUFDO1FBRW5ELGlGQUFpRjtRQUNoRSx1QkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztJQUVaLENBQUM7SUFFL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxZQUFZLENBQUMsSUFBWSxFQUFFLFNBQThCLEVBQUU7UUFDekQsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVyQixNQUFNLEVBQ0osb0JBQW9CLEdBQUcsSUFBSSxFQUMzQixvQkFBb0IsR0FBRyxLQUFLLEVBQzVCLFNBQVMsR0FBRyxnQkFBZ0IsRUFDNUIsaUJBQWlCLEdBQUcsZUFBZSxFQUNuQyxpQkFBaUIsR0FBRyxlQUFlLEdBQ3BDLEdBQUcsTUFBTSxDQUFDO1FBRVgsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztRQUV6QixpQ0FBaUM7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYztZQUUzQyxhQUFhLEdB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Q0FBQztRQUNsRCxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7K0dBeklVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Byb2Nlc3NvckNvbmZpZyB7XG4gIC8qKiBXaGV0aGVyIHRvIG9wZW4gZXh0ZXJuYWwgbGlua3MgaW4gbmV3IHRhYiAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgb3BlbkV4dGVybmFsSW5OZXdUYWI/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byBvcGVuIGludGVybmFsIGxpbmtzIGluIG5ldyB0YWIgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBvcGVuSW50ZXJuYWxJbk5ld1RhYj86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzZXMgZm9yIGxpbmtzICovXG4gIGxpbmtDbGFzcz86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBDU1MgY2xhc3NlcyBmb3IgZXh0ZXJuYWwgbGlua3MgKi9cbiAgZXh0ZXJuYWxMaW5rQ2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzZXMgZm9yIGludGVybmFsIGxpbmtzICovXG4gIGludGVybmFsTGlua0NsYXNzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIExpbmtQcm9jZXNzb3JTZXJ2aWNlIC0gU2VydmljZSBmb3IgcHJvY2Vzc2luZyB0ZXh0IGNvbnRlbnQgdG8gY29udmVydCBVUkxzIGFuZCBpbnRlcm5hbCByb3V0ZXMgaW50byBjbGlja2FibGUgbGlua3MuXG4gKlxuICogVGhpcyBzZXJ2aWNlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBleHRlcm5hbCBVUkxzIChodHRwL2h0dHBzKSBhbmQgaW50ZXJuYWwgcm91dGVzIChzdGFydGluZyB3aXRoIC8pXG4gKiBhbmQgY29udmVydHMgdGhlbSBpbnRvIEhUTUwgYW5jaG9yIGVsZW1lbnRzIHdpdGggYXBwcm9wcmlhdGUgYXR0cmlidXRlcy5cbiAqXG4gKiBAZXhhbXBsZSBCYXNpYyB1c2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgbGlua1Byb2Nlc3NvcjogTGlua1Byb2Nlc3NvclNlcnZpY2UpIHt9XG4gKlxuICogcHJvY2Vzc1RleHQoKSB7XG4gKiAgIGNvbnN0IHRleHQgPSAnVmlzaXQgaHR0cHM6Ly9leGFtcGxlLmNvbSBvciBnbyB0byAvcHJvZmlsZSc7XG4gKiAgIGNvbnN0IHByb2Nlc3NlZCA9IHRoaXMubGlua1Byb2Nlc3Nvci5wcm9jZXNzTGlua3ModGV4dCk7XG4gKiAgIC8vIFJldHVybnMgU2FmZUh0bWwgd2l0aCBjbGlja2FibGUgbGlua3NcbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTGlua1Byb2Nlc3NvclNlcnZpY2Uge1xuICAvLyBSZWdleCBwYXJhIGRldGVjdGFyIFVSTHMgY29tcGxldGFzIChodHRwL2h0dHBzKVxuICBwcml2YXRlIHJlYWRvbmx5IHVybFJlZ2V4ID0gLyhodHRwcz86XFwvXFwvW15cXHNdKykvZztcblxuICAvLyBSZWdleCBwYXJhIGRldGVjdGFyIHJ1dGFzIGludGVybmFzIChlbXBpZXphbiBjb24gLyBwZXJvIG5vIHNvbiBVUkxzIGNvbXBsZXRhcylcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcm5hbFJvdXRlUmVnZXggPSAvKFxcc3xeKShcXC9bXlxcc10qKS9nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgLyoqXG4gICAqIFByb2Nlc2EgdGV4dG8gcGFyYSBjb252ZXJ0aXIgZW5sYWNlcyBlbiBlbGVtZW50b3MgPGE+IGNsaWNrZWFibGVzLlxuICAgKiBEZXRlY3RhIGF1dG9tw6F0aWNhbWVudGUgVVJMcyBleHRlcm5hcyBlIGludGVybmFzIHkgbGFzIGNvbnZpZXJ0ZSBlbiBlbmxhY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHRvIGEgcHJvY2VzYXJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYWNpw7NuIGRlbCBwcm9jZXNhbWllbnRvXG4gICAqIEByZXR1cm5zIFNhZmVIdG1sIGNvbiBlbmxhY2VzIHByb2Nlc2Fkb3MgbyBzdHJpbmcgb3JpZ2luYWxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSB0aGlzLmxpbmtQcm9jZXNzb3IucHJvY2Vzc0xpbmtzKFxuICAgKiAgICdWaXNpdCBodHRwczovL2V4YW1wbGUuY29tIG9yIC9wcm9maWxlJyxcbiAgICogICB7XG4gICAqICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogdHJ1ZSxcbiAgICogICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAgICogICAgIGxpbmtDbGFzczogJ2N1c3RvbS1saW5rJ1xuICAgKiAgIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwcm9jZXNzTGlua3ModGV4dDogc3RyaW5nLCBjb25maWc6IExpbmtQcm9jZXNzb3JDb25maWcgPSB7fSk6IFNhZmVIdG1sIHwgc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHtcbiAgICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiID0gdHJ1ZSxcbiAgICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiID0gZmFsc2UsXG4gICAgICBsaW5rQ2xhc3MgPSAncHJvY2Vzc2VkLWxpbmsnLFxuICAgICAgZXh0ZXJuYWxMaW5rQ2xhc3MgPSAnZXh0ZXJuYWwtbGluaycsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzcyA9ICdpbnRlcm5hbC1saW5rJyxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgbGV0IGhhc0xpbmtzID0gZmFsc2U7XG4gICAgbGV0IHByb2Nlc3NlZFRleHQgPSB0ZXh0O1xuXG4gICAgLy8gUHJvY2VzYXIgVVJMcyBleHRlcm5hcyBwcmltZXJvXG4gICAgaWYgKHRoaXMudXJsUmVnZXgudGVzdCh0ZXh0KSkge1xuICAgICAgaGFzTGlua3MgPSB0cnVlO1xuICAgICAgdGhpcy51cmxSZWdleC5sYXN0SW5kZXggPSAwOyAvLyBSZXNldCByZWdleFxuXG4gICAgICBwcm9jZXNzZWRUZXh0ID0gcHJvY2Vzc2VkVGV4dC5yZXBsYWNlKHRoaXMudXJsUmVnZXgsIHVybCA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG9wZW5FeHRlcm5hbEluTmV3VGFiID8gJyB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCInIDogJyc7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBgJHtsaW5rQ2xhc3N9ICR7ZXh0ZXJuYWxMaW5rQ2xhc3N9YC50cmltKCk7XG4gICAgICAgIHJldHVybiBgPGEgaHJlZj1cIiR7dXJsfVwiJHt0YXJnZXR9IGNsYXNzPVwiJHtjbGFzc2VzfVwiPiR7dXJsfTwvYT5gO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzYXIgcnV0YXMgaW50ZXJuYXMgZGVzcHXDqXNcbiAgICBpZiAodGhpcy5pbnRlcm5hbFJvdXRlUmVnZXgudGVzdChwcm9jZXNzZWRUZXh0KSkge1xuICAgICAgaGFzTGlua3MgPSB0cnVlO1xuICAgICAgdGhpcy5pbnRlcm5hbFJvdXRlUmVnZXgubGFzdEluZGV4ID0gMDsgLy8gUmVzZXQgcmVnZXhcblxuICAgICAgcHJvY2Vzc2VkVGV4dCA9IHByb2Nlc3NlZFRleHQucmVwbGFjZSh0aGlzLmludGVybmFsUm91dGVSZWdleCwgKG1hdGNoLCBwcmVmaXgsIHJvdXRlKSA9PiB7XG4gICAgICAgIC8vIFNvbG8gcHJvY2VzYXIgc2kgbm8gZXN0w6EgeWEgZGVudHJvIGRlIHVuIGVubGFjZVxuICAgICAgICBpZiAocHJvY2Vzc2VkVGV4dC5pbmRleE9mKGBocmVmPVwiJHtyb3V0ZX1cImApID09PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG9wZW5JbnRlcm5hbEluTmV3VGFiID8gJyB0YXJnZXQ9XCJfYmxhbmtcIicgOiAnJztcbiAgICAgICAgICBjb25zdCBjbGFzc2VzID0gYCR7bGlua0NsYXNzfSAke2ludGVybmFsTGlua0NsYXNzfWAudHJpbSgpO1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9PGEgaHJlZj1cIiR7cm91dGV9XCIke3RhcmdldH0gY2xhc3M9XCIke2NsYXNzZXN9XCI+JHtyb3V0ZX08L2E+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaSBoYXkgZW5sYWNlcywgc2FuaXRpemFyIGVsIEhUTUxcbiAgICBpZiAoaGFzTGlua3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChwcm9jZXNzZWRUZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RhIHNpIHVuIHRleHRvIGNvbnRpZW5lIGVubGFjZXMgKFVSTHMgbyBydXRhcyBpbnRlcm5hcykuXG4gICAqXG4gICAqIEBwYXJhbSB0ZXh0IC0gVGV4dG8gYSBhbmFsaXphclxuICAgKiBAcmV0dXJucyB0cnVlIHNpIGNvbnRpZW5lIGVubGFjZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBoYXNMaW5rcyA9IHRoaXMubGlua1Byb2Nlc3Nvci5oYXNMaW5rcygnVmlzaXQgaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgKiAvLyBSZXR1cm5zOiB0cnVlXG4gICAqIGBgYFxuICAgKi9cbiAgaGFzTGlua3ModGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZXNldCByZWdleCBpbmRpY2VzXG4gICAgdGhpcy51cmxSZWdleC5sYXN0SW5kZXggPSAwO1xuICAgIHRoaXMuaW50ZXJuYWxSb3V0ZVJlZ2V4Lmxhc3RJbmRleCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcy51cmxSZWdleC50ZXN0KHRleHQpIHx8IHRoaXMuaW50ZXJuYWxSb3V0ZVJlZ2V4LnRlc3QodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFlIHRvZG9zIGxvcyBlbmxhY2VzIGRlIHVuIHRleHRvLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHRvIGEgYW5hbGl6YXJcbiAgICogQHJldHVybnMgQXJyYXkgZGUgZW5sYWNlcyBlbmNvbnRyYWRvcyBjb24gc3UgdGlwb1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGxpbmtzID0gdGhpcy5saW5rUHJvY2Vzc29yLmV4dHJhY3RMaW5rcygnVmlzaXQgaHR0cHM6Ly9leGFtcGxlLmNvbSBvciAvcHJvZmlsZScpO1xuICAgKiAvLyBSZXR1cm5zOiBbXG4gICAqIC8vICAgeyB1cmw6ICdodHRwczovL2V4YW1wbGUuY29tJywgdHlwZTogJ2V4dGVybmFsJyB9LFxuICAgKiAvLyAgIHsgdXJsOiAnL3Byb2ZpbGUnLCB0eXBlOiAnaW50ZXJuYWwnIH1cbiAgICogLy8gXVxuICAgKiBgYGBcbiAgICovXG4gIGV4dHJhY3RMaW5rcyh0ZXh0OiBzdHJpbmcpOiBBcnJheTx7IHVybDogc3RyaW5nOyB0eXBlOiAnZXh0ZXJuYWwnIHwgJ2ludGVybmFsJyB9PiB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gW107XG5cbiAgICBjb25zdCBsaW5rczogQXJyYXk8eyB1cmw6IHN0cmluZzsgdHlwZTogJ2V4dGVybmFsJyB8ICdpbnRlcm5hbCcgfT4gPSBbXTtcblxuICAgIC8vIFJlc2V0IHJlZ2V4IGluZGljZXNcbiAgICB0aGlzLnVybFJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgdGhpcy5pbnRlcm5hbFJvdXRlUmVnZXgubGFzdEluZGV4ID0gMDtcblxuICAgIC8vIEV4dHJhZXIgVVJMcyBleHRlcm5hc1xuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy51cmxSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgbGlua3MucHVzaCh7IHVybDogbWF0Y2hbMV0sIHR5cGU6ICdleHRlcm5hbCcgfSk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFlciBydXRhcyBpbnRlcm5hc1xuICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLmludGVybmFsUm91dGVSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgbGlua3MucHVzaCh7IHVybDogbWF0Y2hbMl0sIHR5cGU6ICdpbnRlcm5hbCcgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmtzO1xuICB9XG59XG4iXX0=
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1wcm9jZXNzb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2xpbmstcHJvY2Vzc29yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBa0IzQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFVL0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQVQzQyxnSEFBZ0g7UUFDL0YsYUFBUSxHQUFHLHdDQUF3QyxDQUFDO1FBRXJFLCtHQUErRztRQUM5Rix1QkFBa0IsR0FBRyxxQ0FBcUMsQ0FBQztRQUU1RSwyREFBMkQ7UUFDMUMsc0JBQWlCLEdBQUcsMEJBQTBCLENBQUM7SUFFbEIsQ0FBQztJQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDSCxZQUFZLENBQUMsSUFBWSxFQUFFLFNBQThCLEVBQUU7UUFDekQsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVyQixNQUFNLEVBQ0osb0JBQW9CLEdBQUcsSUFBSSxFQUMzQixvQkFBb0IsR0FBRyxLQUFLLEVBQzVCLFNBQVMsR0FBRyxnQkFBZ0IsRUFDNUIsaUJBQWlCLEdBQUcsZUFBZSxFQUNuQyxpQkFBaUIsR0FBRyxlQUFlLEVBQ25DLG9CQUFvQixHQUFHLElBQUksR0FDNUIsR0FBRyxNQUFNLENBQUM7UUFFWCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRXpCLDJEQUEyRDtRQUMzRCxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjO1lB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QUMsRUFBRSxDQUFDO2dCQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLHdEQUF3RDtZQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOytHQXpNVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtQcm9jZXNzb3JDb25maWcge1xuICAvKiogV2hldGhlciB0byBvcGVuIGV4dGVybmFsIGxpbmtzIGluIG5ldyB0YWIgKGRlZmF1bHQ6IHRydWUpICovXG4gIG9wZW5FeHRlcm5hbEluTmV3VGFiPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gb3BlbiBpbnRlcm5hbCBsaW5rcyBpbiBuZXcgdGFiIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgb3BlbkludGVybmFsSW5OZXdUYWI/OiBib29sZWFuO1xuICAvKiogQ3VzdG9tIENTUyBjbGFzc2VzIGZvciBsaW5rcyAqL1xuICBsaW5rQ2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzZXMgZm9yIGV4dGVybmFsIGxpbmtzICovXG4gIGV4dGVybmFsTGlua0NsYXNzPzogc3RyaW5nO1xuICAvKiogQ3VzdG9tIENTUyBjbGFzc2VzIGZvciBpbnRlcm5hbCBsaW5rcyAqL1xuICBpbnRlcm5hbExpbmtDbGFzcz86IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdG8gcHJvY2VzcyBNYXJrZG93bi1zdHlsZSBsaW5rcyBbdGV4dF0odXJsKSAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgcHJvY2Vzc01hcmtkb3duTGlua3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIExpbmtQcm9jZXNzb3JTZXJ2aWNlIC0gU2VydmljZSBmb3IgcHJvY2Vzc2luZyB0ZXh0IGNvbnRlbnQgdG8gY29udmVydCBVUkxzIGFuZCBpbnRlcm5hbCByb3V0ZXMgaW50byBjbGlja2FibGUgbGlua3MuXG4gKlxuICogVGhpcyBzZXJ2aWNlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBleHRlcm5hbCBVUkxzIChodHRwL2h0dHBzKSwgaW50ZXJuYWwgcm91dGVzIChzdGFydGluZyB3aXRoIC8pLFxuICogYW5kIE1hcmtkb3duLXN0eWxlIGxpbmtzIFt0ZXh0XSh1cmwpIGFuZCBjb252ZXJ0cyB0aGVtIGludG8gSFRNTCBhbmNob3IgZWxlbWVudHMgd2l0aCBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzLlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIHVzYWdlOlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSBsaW5rUHJvY2Vzc29yOiBMaW5rUHJvY2Vzc29yU2VydmljZSkge31cbiAqXG4gKiBwcm9jZXNzVGV4dCgpIHtcbiAqICAgY29uc3QgdGV4dCA9ICdWaXNpdCBodHRwczovL2V4YW1wbGUuY29tLCBnbyB0byAvcHJvZmlsZSwgb3IgW2NoZWNrIGRvY3NdKGh0dHBzOi8vZG9jcy5leGFtcGxlLmNvbSknO1xuICogICBjb25zdCBwcm9jZXNzZWQgPSB0aGlzLmxpbmtQcm9jZXNzb3IucHJvY2Vzc0xpbmtzKHRleHQpO1xuICogICAvLyBSZXR1cm5zIFNhZmVIdG1sIHdpdGggY2xpY2thYmxlIGxpbmtzXG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIExpbmtQcm9jZXNzb3JTZXJ2aWNlIHtcbiAgLy8gUmVnZXggcGFyYSBkZXRlY3RhciBVUkxzIGNvbXBsZXRhcyAoaHR0cC9odHRwcykgLSBwZXJtaXRlIGNhcmFjdGVyZXMgdsOhbGlkb3MgcGVybyBleGNsdXllIHB1bnR1YWNpw7NuIGFsIGZpbmFsXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsUmVnZXggPSAvKGh0dHBzPzpcXC9cXC9bXlxcc10rPykoPz1bLiw7IT8oKVxcc118JCkvZztcblxuICAvLyBSZWdleCBwYXJhIGRldGVjdGFyIHJ1dGFzIGludGVybmFzIChlbXBpZXphbiBjb24gLyBwZXJvIG5vIHNvbiBVUkxzIGNvbXBsZXRhcykgLSBleGNsdXllIHB1bnR1YWNpw7NuIGFsIGZpbmFsXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJuYWxSb3V0ZVJlZ2V4ID0gLyhcXHN8XikoXFwvW15cXHNdKj8pKD89Wy4sOyE/KClcXHNdfCQpL2c7XG5cbiAgLy8gUmVnZXggcGFyYSBkZXRlY3RhciBlbmxhY2VzIGVzdGlsbyBNYXJrZG93biBbdGV4dG9dKHVybClcbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZG93bkxpbmtSZWdleCA9IC9cXFsoW15cXF1dKylcXF1cXCgoW14pXSspXFwpL2c7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICAvKipcbiAgICogUHJvY2VzYSB0ZXh0byBwYXJhIGNvbnZlcnRpciBlbmxhY2VzIGVuIGVsZW1lbnRvcyA8YT4gY2xpY2tlYWJsZXMuXG4gICAqIERldGVjdGEgYXV0b23DoXRpY2FtZW50ZSBVUkxzIGV4dGVybmFzLCBydXRhcyBpbnRlcm5hcyB5IGVubGFjZXMgZXN0aWxvIE1hcmtkb3duLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHRvIGEgcHJvY2VzYXJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYWNpw7NuIGRlbCBwcm9jZXNhbWllbnRvXG4gICAqIEByZXR1cm5zIFNhZmVIdG1sIGNvbiBlbmxhY2VzIHByb2Nlc2Fkb3MgbyBzdHJpbmcgb3JpZ2luYWxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSB0aGlzLmxpbmtQcm9jZXNzb3IucHJvY2Vzc0xpbmtzKFxuICAgKiAgICdWaXNpdCBodHRwczovL2V4YW1wbGUuY29tLCBnbyB0byAvcHJvZmlsZSwgb3IgW2NoZWNrIGRvY3NdKGh0dHBzOi8vZG9jcy5leGFtcGxlLmNvbSknLFxuICAgKiAgIHtcbiAgICogICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiOiB0cnVlLFxuICAgKiAgICAgb3BlbkludGVybmFsSW5OZXdUYWI6IGZhbHNlLFxuICAgKiAgICAgcHJvY2Vzc01hcmtkb3duTGlua3M6IHRydWUsXG4gICAqICAgICBsaW5rQ2xhc3M6ICdjdXN0b20tbGluaydcbiAgICogICB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvY2Vzc0xpbmtzKHRleHQ6IHN0cmluZywgY29uZmlnOiBMaW5rUHJvY2Vzc29yQ29uZmlnID0ge30pOiBTYWZlSHRtbCB8IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCB7XG4gICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYiA9IHRydWUsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYiA9IGZhbHNlLFxuICAgICAgbGlua0NsYXNzID0gJ3Byb2Nlc3NlZC1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzID0gJ2V4dGVybmFsLWxpbmsnLFxuICAgICAgaW50ZXJuYWxMaW5rQ2xhc3MgPSAnaW50ZXJuYWwtbGluaycsXG4gICAgICBwcm9jZXNzTWFya2Rvd25MaW5rcyA9IHRydWUsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIGxldCBoYXNMaW5rcyA9IGZhbHNlO1xuICAgIGxldCBwcm9jZXNzZWRUZXh0ID0gdGV4dDtcblxuICAgIC8vIDEuIFByb2Nlc2FyIGVubGFjZXMgZXN0aWxvIE1hcmtkb3duIFt0ZXh0b10odXJsKSBwcmltZXJvXG4gICAgaWYgKHByb2Nlc3NNYXJrZG93bkxpbmtzKSB7XG4gICAgICB0aGlzLm1hcmtkb3duTGlua1JlZ2V4Lmxhc3RJbmRleCA9IDA7IC8vIFJlc2V0IHJlZ2V4XG5cbiAgICAgIHByb2Nlc3NlZFRleHQgPSBwcm9jZXNzZWRUZXh0LnJlcGxhY2UodGhpcy5tYXJrZG93bkxpbmtSZWdleCwgKG1hdGNoLCBsaW5rVGV4dCwgdXJsKSA9PiB7XG4gICAgICAgIGhhc0xpbmtzID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgaXNFeHRlcm5hbCA9IC9eaHR0cHM/OlxcL1xcLy8udGVzdCh1cmwpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAoaXNFeHRlcm5hbCA/IG9wZW5FeHRlcm5hbEluTmV3VGFiIDogb3BlbkludGVybmFsSW5OZXdUYWIpXG4gICAgICAgICAgPyBpc0V4dGVybmFsXG4gICAgICAgICAgICA/ICcgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiJ1xuICAgICAgICAgICAgOiAnIHRhcmdldD1cIl9ibGFua1wiJ1xuICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IHR5cGVDbGFzcyA9IGlzRXh0ZXJuYWwgPyBleHRlcm5hbExpbmtDbGFzcyA6IGludGVybmFsTGlua0NsYXNzO1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gYCR7bGlua0NsYXNzfSAke3R5cGVDbGFzc31gLnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIGA8YSBocmVmPVwiJHt1cmx9XCIke3RhcmdldH0gY2xhc3M9XCIke2NsYXNzZXN9XCI+JHtsaW5rVGV4dH08L2E+YDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIFByb2Nlc2FyIFVSTHMgZXh0ZXJuYXMgZGlyZWN0YXMgKHNvbG8gc2kgbm8gZXN0w6FuIHlhIGVuIHVuIGVubGFjZSBIVE1MKVxuICAgIHRoaXMudXJsUmVnZXgubGFzdEluZGV4ID0gMDsgLy8gUmVzZXQgcmVnZXhcblxuICAgIHByb2Nlc3NlZFRleHQgPSBwcm9jZXNzZWRUZXh0LnJlcGxhY2UodGhpcy51cmxSZWdleCwgKGZ1bGxNYXRjaCwgdXJsKSA9PiB7XG4gICAgICAvLyBWZXJpZmljYXIgcXVlIG5vIGVzdMOpIHlhIGRlbnRybyBkZSB1biBlbmxhY2UgSFRNTCBleGlzdGVudGVcbiAgICAgIGNvbnN0IHVybFBvc2l0aW9uID0gcHJvY2Vzc2VkVGV4dC5pbmRleE9mKGZ1bGxNYXRjaCk7XG4gICAgICBjb25zdCB0ZXh0QmVmb3JlID0gcHJvY2Vzc2VkVGV4dC5zdWJzdHJpbmcoMCwgdXJsUG9zaXRpb24pO1xuXG4gICAgICAvLyBCdXNjYXIgbGEgw7psdGltYSBhcGVydHVyYSB5IGNpZXJyZSBkZSBlbmxhY2UgYW50ZXMgZGUgZXN0YSBwb3NpY2nDs25cbiAgICAgIGNvbnN0IGxhc3RPcGVuVGFnID0gdGV4dEJlZm9yZS5sYXN0SW5kZXhPZignPGEgJyk7XG4gICAgICBjb25zdCBsYXN0Q2xvc2VUYWcgPSB0ZXh0QmVmb3JlLmxhc3RJbmRleE9mKCc8L2E+Jyk7XG5cbiAgICAgIC8vIFNpIGhheSB1biB0YWcgPGEgYWJpZXJ0byBzaW4gY2VycmFyLCBubyBwcm9jZXNhbW9zXG4gICAgICBpZiAobGFzdE9wZW5UYWcgPiBsYXN0Q2xvc2VUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bGxNYXRjaDsgLy8gTWFudGVuZXIgb3JpZ2luYWxcbiAgICAgIH1cblxuICAgICAgaGFzTGlua3MgPSB0cnVlO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gb3BlbkV4dGVybmFsSW5OZXdUYWIgPyAnIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIicgOiAnJztcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBgJHtsaW5rQ2xhc3N9ICR7ZXh0ZXJuYWxMaW5rQ2xhc3N9YC50cmltKCk7XG4gICAgICByZXR1cm4gYDxhIGhyZWY9XCIke3VybH1cIiR7dGFyZ2V0fSBjbGFzcz1cIiR7Y2xhc3Nlc31cIj4ke3VybH08L2E+YDtcbiAgICB9KTtcblxuICAgIC8vIDMuIFByb2Nlc2FyIHJ1dGFzIGludGVybmFzIChzb2xvIHNpIG5vIGVzdMOhbiB5YSBlbiB1biBlbmxhY2UgSFRNTClcbiAgICB0aGlzLmludGVybmFsUm91dGVSZWdleC5sYXN0SW5kZXggPSAwOyAvLyBSZXNldCByZWdleFxuXG4gICAgcHJvY2Vzc2VkVGV4dCA9IHByb2Nlc3NlZFRleHQucmVwbGFjZSh0aGlzLmludGVybmFsUm91dGVSZWdleCwgKG1hdGNoLCBwcmVmaXgsIHJvdXRlKSA9PiB7XG4gICAgICAvLyBWZXJpZmljYXIgcXVlIG5vIGVzdMOpIHlhIGRlbnRybyBkZSB1biBlbmxhY2UgSFRNTCBleGlzdGVudGVcbiAgICAgIGNvbnN0IG1hdGNoUG9zaXRpb24gPSBwcm9jZXNzZWRUZXh0LmluZGV4T2YobWF0Y2gpO1xuICAgICAgY29uc3QgdGV4dEJlZm9yZSA9IHByb2Nlc3NlZFRleHQuc3Vic3RyaW5nKDAsIG1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAvLyBCdXNjYXIgbGEgw7psdGltYSBhcGVydHVyYSB5IGNpZXJyZSBkZSBlbmxhY2UgYW50ZXMgZGUgZXN0YSBwb3NpY2nDs25cbiAgICAgIGNvbnN0IGxhc3RPcGVuVGFnID0gdGV4dEJlZm9yZS5sYXN0SW5kZXhPZignPGEgJyk7XG4gICAgICBjb25zdCBsYXN0Q2xvc2VUYWcgPSB0ZXh0QmVmb3JlLmxhc3RJbmRleE9mKCc8L2E+Jyk7XG5cbiAgICAgIC8vIFNpIGhheSB1biB0YWcgPGEgYWJpZXJ0byBzaW4gY2VycmFyLCBubyBwcm9jZXNhbW9zXG4gICAgICBpZiAobGFzdE9wZW5UYWcgPiBsYXN0Q2xvc2VUYWcpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoOyAvLyBNYW50ZW5lciBvcmlnaW5hbFxuICAgICAgfVxuXG4gICAgICBoYXNMaW5rcyA9IHRydWU7XG4gICAgICBjb25zdCB0YXJnZXQgPSBvcGVuSW50ZXJuYWxJbk5ld1RhYiA/ICcgdGFyZ2V0PVwiX2JsYW5rXCInIDogJyc7XG4gICAgICBjb25zdCBjbGFzc2VzID0gYCR7bGlua0NsYXNzfSAke2ludGVybmFsTGlua0NsYXNzfWAudHJpbSgpO1xuICAgICAgcmV0dXJuIGAke3ByZWZpeH08YSBocmVmPVwiJHtyb3V0ZX1cIiR7dGFyZ2V0fSBjbGFzcz1cIiR7Y2xhc3Nlc31cIj4ke3JvdXRlfTwvYT5gO1xuICAgIH0pO1xuXG4gICAgLy8gU2kgaGF5IGVubGFjZXMsIHNhbml0aXphciBlbCBIVE1MXG4gICAgaWYgKGhhc0xpbmtzKSB7XG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwocHJvY2Vzc2VkVGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0YSBzaSB1biB0ZXh0byBjb250aWVuZSBlbmxhY2VzIChVUkxzLCBydXRhcyBpbnRlcm5hcyBvIGVubGFjZXMgTWFya2Rvd24pLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHRvIGEgYW5hbGl6YXJcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBjb250aWVuZSBlbmxhY2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgaGFzTGlua3MgPSB0aGlzLmxpbmtQcm9jZXNzb3IuaGFzTGlua3MoJ1Zpc2l0IGh0dHBzOi8vZXhhbXBsZS5jb20gb3IgW2RvY3NdKGh0dHBzOi8vZG9jcy5jb20pJyk7XG4gICAqIC8vIFJldHVybnM6IHRydWVcbiAgICogYGBgXG4gICAqL1xuICBoYXNMaW5rcyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlc2V0IHJlZ2V4IGluZGljZXNcbiAgICB0aGlzLnVybFJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgdGhpcy5pbnRlcm5hbFJvdXRlUmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICB0aGlzLm1hcmtkb3duTGlua1JlZ2V4Lmxhc3RJbmRleCA9IDA7XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy51cmxSZWdleC50ZXN0KHRleHQpIHx8XG4gICAgICB0aGlzLmludGVybmFsUm91dGVSZWdleC50ZXN0KHRleHQpIHx8XG4gICAgICB0aGlzLm1hcmtkb3duTGlua1JlZ2V4LnRlc3QodGV4dClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhZSB0b2RvcyBsb3MgZW5sYWNlcyBkZSB1biB0ZXh0by5cbiAgICpcbiAgICogQHBhcmFtIHRleHQgLSBUZXh0byBhIGFuYWxpemFyXG4gICAqIEByZXR1cm5zIEFycmF5IGRlIGVubGFjZXMgZW5jb250cmFkb3MgY29uIHN1IHRpcG8geSB0ZXh0byAoc2kgZXMgTWFya2Rvd24pXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbGlua3MgPSB0aGlzLmxpbmtQcm9jZXNzb3IuZXh0cmFjdExpbmtzKCdWaXNpdCBodHRwczovL2V4YW1wbGUuY29tLCAvcHJvZmlsZSwgb3IgW2RvY3NdKGh0dHBzOi8vZG9jcy5jb20pJyk7XG4gICAqIC8vIFJldHVybnM6IFtcbiAgICogLy8gICB7IHVybDogJ2h0dHBzOi8vZXhhbXBsZS5jb20nLCB0eXBlOiAnZXh0ZXJuYWwnLCB0ZXh0OiAnaHR0cHM6Ly9leGFtcGxlLmNvbScgfSxcbiAgICogLy8gICB7IHVybDogJy9wcm9maWxlJywgdHlwZTogJ2ludGVybmFsJywgdGV4dDogJy9wcm9maWxlJyB9LFxuICAgKiAvLyAgIHsgdXJsOiAnaHR0cHM6Ly9kb2NzLmNvbScsIHR5cGU6ICdleHRlcm5hbCcsIHRleHQ6ICdkb2NzJyB9XG4gICAqIC8vIF1cbiAgICogYGBgXG4gICAqL1xuICBleHRyYWN0TGlua3ModGV4dDogc3RyaW5nKTogQXJyYXk8eyB1cmw6IHN0cmluZzsgdHlwZTogJ2V4dGVybmFsJyB8ICdpbnRlcm5hbCc7IHRleHQ6IHN0cmluZyB9PiB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gW107XG5cbiAgICBjb25zdCBsaW5rczogQXJyYXk8eyB1cmw6IHN0cmluZzsgdHlwZTogJ2V4dGVybmFsJyB8ICdpbnRlcm5hbCc7IHRleHQ6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgLy8gUmVzZXQgcmVnZXggaW5kaWNlc1xuICAgIHRoaXMudXJsUmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICB0aGlzLmludGVybmFsUm91dGVSZWdleC5sYXN0SW5kZXggPSAwO1xuICAgIHRoaXMubWFya2Rvd25MaW5rUmVnZXgubGFzdEluZGV4ID0gMDtcblxuICAgIC8vIEV4dHJhZXIgZW5sYWNlcyBNYXJrZG93biBwcmltZXJvXG4gICAgbGV0IG1hdGNoO1xuICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLm1hcmtkb3duTGlua1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB1cmwgPSBtYXRjaFsyXTtcbiAgICAgIGNvbnN0IGxpbmtUZXh0ID0gbWF0Y2hbMV07XG4gICAgICBjb25zdCB0eXBlID0gL15odHRwcz86XFwvXFwvLy50ZXN0KHVybCkgPyAnZXh0ZXJuYWwnIDogJ2ludGVybmFsJztcbiAgICAgIGxpbmtzLnB1c2goeyB1cmwsIHR5cGUsIHRleHQ6IGxpbmtUZXh0IH0pO1xuICAgIH1cblxuICAgIC8vIEV4dHJhZXIgVVJMcyBleHRlcm5hcyBkaXJlY3Rhc1xuICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnVybFJlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB1cmwgPSBtYXRjaFsxXTtcbiAgICAgIC8vIFZlcmlmaWNhciBxdWUgbm8gZXN0w6kgeWEgY2FwdHVyYWRvIGNvbW8gTWFya2Rvd24gbGlua1xuICAgICAgaWYgKCFsaW5rcy5zb21lKGxpbmsgPT4gbGluay51cmwgPT09IHVybCkpIHtcbiAgICAgICAgbGlua3MucHVzaCh7IHVybCwgdHlwZTogJ2V4dGVybmFsJywgdGV4dDogdXJsIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4dHJhZXIgcnV0YXMgaW50ZXJuYXMgZGlyZWN0YXNcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy5pbnRlcm5hbFJvdXRlUmVnZXguZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHVybCA9IG1hdGNoWzJdO1xuICAgICAgLy8gVmVyaWZpY2FyIHF1ZSBubyBlc3TDqSB5YSBjYXB0dXJhZG8gY29tbyBNYXJrZG93biBsaW5rXG4gICAgICBpZiAoIWxpbmtzLnNvbWUobGluayA9PiBsaW5rLnVybCA9PT0gdXJsKSkge1xuICAgICAgICBsaW5rcy5wdXNoKHsgdXJsLCB0eXBlOiAnaW50ZXJuYWwnLCB0ZXh0OiB1cmwgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmtzO1xuICB9XG59XG4iXX0=