@libs-ui/components-drag-drop 0.2.190 → 0.2.192

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.
@@ -0,0 +1,804 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component } from '@angular/core';
3
+ import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
4
+ import { LibsUiComponentsDragContainerDirective } from '../drag-drop.directive';
5
+ import { LibsUiDragItemDirective } from '../drag-item.directive';
6
+ import * as i0 from "@angular/core";
7
+ export class LibsUiDragDropDemoComponent {
8
+ // Basic List Items
9
+ basicItems = [
10
+ 'Task 1',
11
+ 'Task 2',
12
+ 'Task 3',
13
+ 'Task 4',
14
+ 'Task 5'
15
+ ];
16
+ // Kanban Board Columns
17
+ columnsIds = ['todo', 'in-progress', 'done'];
18
+ columns = [
19
+ {
20
+ id: 'todo',
21
+ title: 'To Do',
22
+ items: [
23
+ {
24
+ id: 1,
25
+ title: 'Implement drag and drop',
26
+ description: 'Add drag and drop functionality to the component',
27
+ status: 'todo'
28
+ },
29
+ {
30
+ id: 2,
31
+ title: 'Add animations',
32
+ description: 'Implement smooth animations for drag and drop',
33
+ status: 'todo'
34
+ }
35
+ ]
36
+ },
37
+ {
38
+ id: 'in-progress',
39
+ title: 'In Progress',
40
+ items: [
41
+ {
42
+ id: 3,
43
+ title: 'Fix styling issues',
44
+ description: 'Resolve CSS conflicts in the component',
45
+ status: 'in-progress'
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ id: 'done',
51
+ title: 'Done',
52
+ items: [
53
+ {
54
+ id: 4,
55
+ title: 'Setup project structure',
56
+ description: 'Initialize the project with necessary configurations',
57
+ status: 'done'
58
+ }
59
+ ]
60
+ }
61
+ ];
62
+ // Nested Items
63
+ nestedItems = [
64
+ {
65
+ id: 1,
66
+ title: 'Project A',
67
+ subItems: ['Task 1', 'Task 2', 'Task 3']
68
+ },
69
+ {
70
+ id: 2,
71
+ title: 'Project B',
72
+ subItems: ['Task 4', 'Task 5']
73
+ },
74
+ {
75
+ id: 3,
76
+ title: 'Project C',
77
+ subItems: ['Task 6', 'Task 7', 'Task 8']
78
+ }
79
+ ];
80
+ // API Documentation
81
+ inputsDoc = [
82
+ {
83
+ name: 'items',
84
+ type: 'Array<unknown>',
85
+ default: '[]',
86
+ description: 'Array of items to be displayed in the container'
87
+ },
88
+ {
89
+ name: 'mode',
90
+ type: "'move' | 'copy' | 'deepCopy'",
91
+ default: "'move'",
92
+ description: 'Mode for drag and drop operations'
93
+ },
94
+ {
95
+ name: 'directionDrag',
96
+ type: "'horizontal' | 'vertical'",
97
+ default: 'undefined',
98
+ description: 'Direction of drag movement'
99
+ },
100
+ {
101
+ name: 'viewEncapsulation',
102
+ type: "'emulated' | 'none'",
103
+ default: "'emulated'",
104
+ description: 'View encapsulation mode for styling'
105
+ },
106
+ {
107
+ name: 'disableDragContainer',
108
+ type: 'boolean',
109
+ default: 'undefined',
110
+ description: 'Whether to disable drag operations for the container'
111
+ },
112
+ {
113
+ name: 'acceptDragSameGroup',
114
+ type: 'boolean',
115
+ default: 'false',
116
+ description: 'Whether to accept drag operations within the same group'
117
+ },
118
+ {
119
+ name: 'placeholder',
120
+ type: 'boolean',
121
+ default: 'true',
122
+ description: 'Whether to show placeholder during drag'
123
+ },
124
+ {
125
+ name: 'groupName',
126
+ type: 'string',
127
+ default: "'groupDragAndDropDefault'",
128
+ description: 'Name of the group for drag and drop operations'
129
+ },
130
+ {
131
+ name: 'dropToGroupName',
132
+ type: 'Array<string> | null',
133
+ default: 'null',
134
+ description: 'List of group names that can accept drops from this container'
135
+ },
136
+ {
137
+ name: 'stylesOverride',
138
+ type: 'Array<{ className: string, styles: string }>',
139
+ default: 'undefined',
140
+ description: 'Custom styles to override default drag-drop styling'
141
+ }
142
+ ];
143
+ outputsDoc = [
144
+ {
145
+ name: 'outDragStartContainer',
146
+ type: 'IDragStart',
147
+ description: 'Event emitted when dragging starts in the container'
148
+ },
149
+ {
150
+ name: 'outDragOverContainer',
151
+ type: 'IDragOver',
152
+ description: 'Event emitted when dragging over the container'
153
+ },
154
+ {
155
+ name: 'outDragLeaveContainer',
156
+ type: 'IDragLeave',
157
+ description: 'Event emitted when dragging leaves the container'
158
+ },
159
+ {
160
+ name: 'outDragEndContainer',
161
+ type: 'IDragEnd',
162
+ description: 'Event emitted when dragging ends in the container'
163
+ },
164
+ {
165
+ name: 'outDroppedContainer',
166
+ type: 'IDrop',
167
+ description: 'Event emitted when an item is dropped in the container'
168
+ },
169
+ {
170
+ name: 'outDroppedContainerEmpty',
171
+ type: 'IDrop',
172
+ description: 'Event emitted when an item is dropped in an empty container'
173
+ },
174
+ {
175
+ name: 'outFunctionControl',
176
+ type: 'IDragDropFunctionControlEvent',
177
+ description: 'Event emitted to control drag-drop functionality'
178
+ }
179
+ ];
180
+ // Interface Documentation
181
+ interfacesDoc = [
182
+ {
183
+ name: 'IDragging',
184
+ code: `interface IDragging {
185
+ mousePosition: IMousePosition;
186
+ elementDrag: HTMLElement;
187
+ elementKeepContainer?: boolean;
188
+ itemDragInfo?: IItemDragInfo;
189
+ }`,
190
+ description: 'Interface for drag operation events, containing information about the dragged element and mouse position'
191
+ },
192
+ {
193
+ name: 'IDragStart',
194
+ code: `interface IDragStart {
195
+ mousePosition: IMousePosition;
196
+ elementDrag: HTMLElement;
197
+ itemDragInfo?: IItemDragInfo;
198
+ }`,
199
+ description: 'Interface for drag start events, triggered when dragging begins'
200
+ },
201
+ {
202
+ name: 'IDragOver',
203
+ code: `interface IDragOver {
204
+ mousePosition: IMousePosition;
205
+ elementDrag: HTMLElement;
206
+ elementDragOver: HTMLElement;
207
+ itemDragInfo?: IItemDragInfo;
208
+ }`,
209
+ description: 'Interface for drag over events, triggered when an element is dragged over another element'
210
+ },
211
+ {
212
+ name: 'IDragLeave',
213
+ code: `interface IDragLeave {
214
+ elementDrag: HTMLElement;
215
+ elementDragLeave: HTMLElement;
216
+ itemDragInfo?: IItemDragInfo;
217
+ }`,
218
+ description: 'Interface for drag leave events, triggered when a dragged element leaves another element'
219
+ },
220
+ {
221
+ name: 'IDragEnd',
222
+ code: `interface IDragEnd {
223
+ mousePosition: IMousePosition;
224
+ elementDrag: HTMLElement;
225
+ itemDragInfo?: IItemDragInfo;
226
+ }`,
227
+ description: 'Interface for drag end events, triggered when dragging ends'
228
+ },
229
+ {
230
+ name: 'IDrop',
231
+ code: `interface IDrop {
232
+ elementDrag: HTMLElement;
233
+ elementDrop: HTMLElement;
234
+ itemDragInfo?: IItemDragInfo;
235
+ }`,
236
+ description: 'Interface for drop events, triggered when an element is dropped'
237
+ },
238
+ {
239
+ name: 'IItemDragInfo',
240
+ code: `interface IItemDragInfo {
241
+ item: object;
242
+ itemsMove?: WritableSignal<Array<unknown>>;
243
+ indexDrag?: number;
244
+ indexDrop?: number;
245
+ itemsDrag: WritableSignal<Array<unknown>>;
246
+ itemsDrop?: WritableSignal<Array<unknown>>;
247
+ containerDrag?: HTMLElement;
248
+ containerDrop?: HTMLElement;
249
+ }`,
250
+ description: 'Interface containing information about the dragged item and its containers'
251
+ },
252
+ {
253
+ name: 'IDragItemInContainerVirtualScroll',
254
+ code: `interface IDragItemInContainerVirtualScroll {
255
+ itemDragInfo?: IItemDragInfo;
256
+ elementDrag: HTMLElement;
257
+ distanceStartElementAndMouseTop: number;
258
+ distanceStartElementAndMouseLeft: number;
259
+ elementContainer?: HTMLElement;
260
+ dragBoundary?: boolean;
261
+ dragBoundaryAcceptMouseLeaveContainer?: boolean;
262
+ ignoreStopEvent?: boolean;
263
+ }`,
264
+ description: 'Interface for virtual scrolling drag operations, containing information about drag boundaries and container elements'
265
+ },
266
+ {
267
+ name: 'IMousePosition',
268
+ code: `interface IMousePosition {
269
+ clientX: number;
270
+ clientY: number;
271
+ }`,
272
+ description: 'Interface representing mouse position coordinates'
273
+ },
274
+ {
275
+ name: 'IDragDropFunctionControlEvent',
276
+ code: `interface IDragDropFunctionControlEvent {
277
+ setAttributeElementAndItemDrag: () => Promise<void>;
278
+ }`,
279
+ description: 'Interface for drag and drop control functions'
280
+ }
281
+ ];
282
+ // Features
283
+ features = [
284
+ {
285
+ id: 1,
286
+ icon: '🔄',
287
+ title: 'Flexible Drag and Drop',
288
+ description: 'Support for container-to-container dragging with customizable group names and drop zones'
289
+ },
290
+ {
291
+ id: 2,
292
+ icon: '📜',
293
+ title: 'Virtual Scrolling',
294
+ description: 'Efficient handling of large lists with virtual scrolling support'
295
+ },
296
+ {
297
+ id: 3,
298
+ icon: '🎯',
299
+ title: 'Custom Boundaries',
300
+ description: 'Define custom drag boundaries and drop zones for precise control'
301
+ },
302
+ {
303
+ id: 4,
304
+ icon: '🎨',
305
+ title: 'Styling Options',
306
+ description: 'Customizable styles for drag items and containers'
307
+ }
308
+ ];
309
+ // Code Examples
310
+ codeExamples = [
311
+ {
312
+ id: 1,
313
+ title: 'Basic Usage',
314
+ code: `&lt;div LibsUiComponentsDragContainerDirective
315
+ [(items)]="items"
316
+ [groupName]="'myGroup'"
317
+ [acceptDragSameGroup]="true"&gt;
318
+ @for (item of items; track item) {
319
+ &lt;div LibsUiDragItemDirective&gt;
320
+ {{ item }}
321
+ &lt;/div&gt;
322
+ }
323
+ &lt;/div&gt;`
324
+ },
325
+ {
326
+ id: 2,
327
+ title: 'Container-to-Container',
328
+ code: `&lt;div LibsUiComponentsDragContainerDirective
329
+ [(items)]="sourceItems"
330
+ [groupName]="'source'"&gt;
331
+ @for (item of sourceItems; track item) {
332
+ &lt;div LibsUiDragItemDirective&gt;
333
+ {{ item }}
334
+ &lt;/div&gt;
335
+ }
336
+ &lt;/div&gt;
337
+
338
+ &lt;div LibsUiComponentsDragContainerDirective
339
+ [(items)]="targetItems"
340
+ [groupName]="'target'"
341
+ [dropToGroupName]="['source']"&gt;
342
+ @for (item of targetItems; track item) {
343
+ &lt;div LibsUiDragItemDirective&gt;
344
+ {{ item }}
345
+ &lt;/div&gt;
346
+ }
347
+ &lt;/div&gt;`
348
+ }
349
+ ];
350
+ /**
351
+ * Copy text to clipboard
352
+ */
353
+ copyToClipboard(text) {
354
+ navigator.clipboard.writeText(text).then(() => {
355
+ alert('Copied to clipboard');
356
+ }, (err) => {
357
+ console.error('Could not copy text: ', err);
358
+ });
359
+ }
360
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiDragDropDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
361
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiDragDropDemoComponent, isStandalone: true, selector: "lib-drag-drop-demo", ngImport: i0, template: `
362
+ <div class="page-container">
363
+ <header>
364
+ <h1>Demo Drag and Drop Component</h1>
365
+ <p>Angular component library for drag and drop functionality</p>
366
+ </header>
367
+
368
+ <main>
369
+ <section class="intro-section">
370
+ <h2>Introduction</h2>
371
+ <p>
372
+ <code>&#64;libs-ui/components-drag-drop</code> is a powerful Angular component that enables drag and drop functionality with features like virtual scrolling, multi-selection, and custom boundaries.
373
+ </p>
374
+ </section>
375
+
376
+ <section class="installation-section">
377
+ <h2>Installation</h2>
378
+ <p>To install the library, use npm or yarn:</p>
379
+
380
+ <div class="install-command">
381
+ <pre>
382
+ <code>npm install &#64;libs-ui/components-drag-drop</code>
383
+ <libs_ui-components-buttons-button
384
+ [label]="'Copy'"
385
+ (outClick)="copyToClipboard('npm install @libs-ui/components-drag-drop')" />
386
+ </pre>
387
+ </div>
388
+
389
+ <p>Or with yarn:</p>
390
+
391
+ <div class="install-command">
392
+ <pre>
393
+ <code>yarn add &#64;libs-ui/components-drag-drop</code>
394
+ <libs_ui-components-buttons-button
395
+ [label]="'Copy'"
396
+ (outClick)="copyToClipboard('yarn add @libs-ui/components-drag-drop')" />
397
+ </pre>
398
+ </div>
399
+ </section>
400
+
401
+ <section class="demo-section">
402
+ <h2>Live Demo</h2>
403
+ <div class="demo-container">
404
+ <!-- Basic List Demo -->
405
+ <div class="demo-example">
406
+ <h3>Basic List</h3>
407
+ <div class="list-container">
408
+ <div LibsUiComponentsDragContainerDirective
409
+ [(items)]="basicItems"
410
+ [acceptDragSameGroup]="true">
411
+ @for (item of basicItems; track item) {
412
+ <div class="list-item"
413
+ LibsUiDragItemDirective>
414
+ <span class="item-icon">📋</span>
415
+ <span class="item-text">{{ item }}</span>
416
+ </div>
417
+ }
418
+ </div>
419
+ </div>
420
+ </div>
421
+
422
+ <!-- Kanban Board Demo -->
423
+ <div class="demo-example">
424
+ <h3>Kanban Board</h3>
425
+ <div class="kanban-board">
426
+ @for (column of columns; track column) {
427
+ <div class="kanban-column"
428
+ LibsUiComponentsDragContainerDirective
429
+ [(items)]="column.items"
430
+ [groupName]="column.id"
431
+ [dropToGroupName]="columnsIds"
432
+ [acceptDragSameGroup]="true">
433
+ <h4>{{ column.title }}</h4>
434
+ @for (item of column.items; track item) {
435
+ <div class="kanban-item"
436
+ LibsUiDragItemDirective>
437
+ <div class="kanban-item-header">
438
+ <span class="item-title">{{ item.title }}</span>
439
+ <span class="item-status" [class]="'status-' + item.status">
440
+ {{ item.status }}
441
+ </span>
442
+ </div>
443
+ <p class="item-description">{{ item.description }}</p>
444
+ </div>
445
+ }
446
+ </div>
447
+ }
448
+ </div>
449
+ </div>
450
+
451
+ <!-- Nested Containers Demo -->
452
+ <div class="demo-example">
453
+ <h3>Nested Containers</h3>
454
+ <div class="nested-container">
455
+ <div LibsUiComponentsDragContainerDirective
456
+ [(items)]="nestedItems"
457
+ [groupName]="'parent'"
458
+ [acceptDragSameGroup]="true">
459
+ @for (item of nestedItems; track item) {
460
+ <div class="nested-item"
461
+ LibsUiDragItemDirective>
462
+ <div class="nested-item-header">
463
+ <span class="item-title">{{ item.title }}</span>
464
+ </div>
465
+ <div class="nested-item-content">
466
+ <div LibsUiComponentsDragContainerDirective
467
+ [(items)]="item.subItems"
468
+ [groupName]="'child'"
469
+ [acceptDragSameGroup]="true">
470
+ @for (subItem of item.subItems; track subItem) {
471
+ <div class="sub-item"
472
+ LibsUiDragItemDirective>
473
+ {{ subItem }}
474
+ </div>
475
+ }
476
+ </div>
477
+ </div>
478
+ </div>
479
+ }
480
+ </div>
481
+ </div>
482
+ </div>
483
+ </div>
484
+ </section>
485
+
486
+ <section class="api-doc-section">
487
+ <h2>API Documentation</h2>
488
+
489
+ <h3>Inputs</h3>
490
+ <div class="table-container">
491
+ <table class="api-table">
492
+ <thead>
493
+ <tr>
494
+ <th>Name</th>
495
+ <th>Type</th>
496
+ <th>Default</th>
497
+ <th>Description</th>
498
+ </tr>
499
+ </thead>
500
+ <tbody>
501
+ @for (input of inputsDoc; track input.name) {
502
+ <tr>
503
+ <td><code>{{input.name}}</code></td>
504
+ <td><code>{{input.type}}</code></td>
505
+ <td>{{input.default}}</td>
506
+ <td>{{input.description}}</td>
507
+ </tr>
508
+ }
509
+ </tbody>
510
+ </table>
511
+ </div>
512
+
513
+ <h3>Outputs</h3>
514
+ <div class="table-container">
515
+ <table class="api-table">
516
+ <thead>
517
+ <tr>
518
+ <th>Name</th>
519
+ <th>Type</th>
520
+ <th>Description</th>
521
+ </tr>
522
+ </thead>
523
+ <tbody>
524
+ @for (output of outputsDoc; track output.name) {
525
+ <tr>
526
+ <td><code>{{output.name}}</code></td>
527
+ <td><code>{{output.type}}</code></td>
528
+ <td>{{output.description}}</td>
529
+ </tr>
530
+ }
531
+ </tbody>
532
+ </table>
533
+ </div>
534
+ </section>
535
+
536
+ <section class="interfaces-section">
537
+ <h2>Interfaces</h2>
538
+ <div class="interface-docs">
539
+ @for (interfaceItem of interfacesDoc; track interfaceItem.name) {
540
+ <div class="interface-item">
541
+ <h3>{{interfaceItem.name}}</h3>
542
+ <pre><code>{{interfaceItem.code}}</code></pre>
543
+ <p>{{interfaceItem.description}}</p>
544
+ </div>
545
+ }
546
+ </div>
547
+ </section>
548
+
549
+ <section class="features-section">
550
+ <h2>Features</h2>
551
+ <ul>
552
+ @for (feature of features; track feature.id) {
553
+ <li>
554
+ <span class="feature-icon">{{feature.icon}}</span>
555
+ <div class="feature-info">
556
+ <h3>{{feature.title}}</h3>
557
+ <p>{{feature.description}}</p>
558
+ </div>
559
+ </li>
560
+ }
561
+ </ul>
562
+ </section>
563
+
564
+ <section class="usage-section">
565
+ <h2>Usage</h2>
566
+ <div class="code-examples">
567
+ @for (example of codeExamples; track example.id) {
568
+ <div class="code-example">
569
+ <h3>{{example.title}}</h3>
570
+ <pre><code [innerHTML]="example.code"></code></pre>
571
+ </div>
572
+ }
573
+ </div>
574
+ </section>
575
+ </main>
576
+ </div>
577
+ `, isInline: true, styles: [".page-container{max-width:1200px;margin:0 auto;padding:20px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;line-height:1.6;color:#333}header{text-align:center;padding:40px 0;background-color:#fff;border-radius:8px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}header h1{font-size:2.5rem;color:#2c3e50;margin-bottom:10px}header p{font-size:1.2rem;color:#7f8c8d}section{background-color:#fff;border-radius:8px;padding:30px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}h2{font-size:1.8rem;color:#2c3e50;margin-bottom:20px;padding-bottom:10px;border-bottom:2px solid #ecf0f1}h3{font-size:1.4rem;color:#34495e;margin-bottom:15px}h4{font-size:1.2rem;color:#34495e;margin-bottom:10px}p{margin-bottom:15px}code{font-family:Courier New,Courier,monospace;background-color:#f7f7f7;padding:2px 5px;border-radius:3px;font-size:.9em}pre{background-color:#f7f7f7;padding:15px;border-radius:5px;overflow-x:auto;margin-bottom:20px;display:flex;align-items:center;justify-content:space-between}pre code{background-color:transparent;padding:0}.installation-section .install-command{position:relative;margin-bottom:20px}.installation-section .copy-button{position:absolute;top:10px;right:10px;background:#3498db;color:#fff;border:none;border-radius:4px;padding:5px 10px;font-size:.9rem;cursor:pointer;transition:background .2s}.installation-section .copy-button:hover{background:#2980b9}.demo-container{display:grid;grid-template-columns:1fr;gap:30px}.demo-example{background:#f7f7f7;padding:20px;border-radius:8px;margin-bottom:20px}.list-container{max-width:400px;margin:20px auto}.list-item{padding:12px;margin:8px 0;background:#fff;border:1px solid #e0e0e0;border-radius:6px;display:flex;align-items:center;transition:transform .2s,box-shadow .2s}.list-item:hover{transform:translateY(-2px);box-shadow:0 4px 8px #0000001a}.item-icon{margin-right:12px;font-size:1.2em}.kanban-board{display:flex;gap:20px;padding:20px;overflow-x:auto}.kanban-column{flex:1;min-width:300px;background:#f5f5f5;padding:15px;border-radius:8px}.kanban-item{background:#fff;padding:12px;margin:8px 0;border-radius:6px;box-shadow:0 1px 3px #0000001a}.kanban-item-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.item-title{font-weight:500}.item-status{padding:4px 8px;border-radius:4px;font-size:.8em}.status-todo{background:#ffebee;color:#c62828}.status-in-progress{background:#fff3e0;color:#ef6c00}.status-done{background:#e8f5e9;color:#2e7d32}.item-description{font-size:.9em;color:#666}.nested-container{max-width:800px;margin:0 auto}.nested-item{background:#fff;border:1px solid #e0e0e0;border-radius:8px;margin:12px 0;overflow:hidden}.nested-item-header{padding:12px;background:#f5f5f5;border-bottom:1px solid #e0e0e0}.nested-item-content{padding:12px}.sub-item{padding:8px;margin:4px 0;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:4px}.api-doc-section{margin-bottom:40px}.table-container{overflow-x:auto;margin-bottom:30px}.api-table{width:100%;border-collapse:collapse;margin-bottom:20px}.api-table th,.api-table td{padding:12px 15px;text-align:left;border-bottom:1px solid #e1e1e1}.api-table th{background-color:#f5f5f5;font-weight:700}.api-table tbody tr:hover{background-color:#f9f9f9}.features-section ul{list-style:none}.features-section li{display:flex;margin-bottom:25px;align-items:flex-start}.feature-icon{font-size:2rem;margin-right:20px;min-width:40px;text-align:center}.feature-info{flex:1}.code-examples{display:grid;grid-template-columns:1fr;gap:20px}@media (min-width: 768px){.code-examples{grid-template-columns:repeat(2,1fr)}}@media (min-width: 992px){.code-examples{grid-template-columns:repeat(3,1fr)}}.code-example{border:1px solid #ecf0f1;border-radius:5px;padding:15px}@media (max-width: 768px){header{padding:30px 0}header h1{font-size:2rem}section{padding:20px}.kanban-board{flex-direction:column}.kanban-column{min-width:100%}.feature-icon{font-size:1.5rem;margin-right:15px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: LibsUiComponentsDragContainerDirective, selector: "[LibsUiComponentsDragContainerDirective]", inputs: ["disableDragContainer", "mode", "directionDrag", "viewEncapsulation", "acceptDragSameGroup", "placeholder", "groupName", "dropToGroupName", "items", "stylesOverride"], outputs: ["itemsChange", "outDragStartContainer", "outDragOverContainer", "outDragLeaveContainer", "outDragEndContainer", "outDroppedContainer", "outDroppedContainerEmpty", "outFunctionControl"] }, { kind: "directive", type: LibsUiDragItemDirective, selector: "[LibsUiDragItemDirective]", inputs: ["fieldId", "item", "itemInContainerVirtualScroll", "throttleTimeHandlerDraggingEvent", "ignoreStopEvent", "onlyMouseDownStopEvent", "dragRootElement", "dragBoundary", "dragBoundaryAcceptMouseLeaveContainer", "elementContainer", "zIndex", "disable"], outputs: ["outDragStart", "outDragOver", "outDragLeave", "outDragEnd", "outDropped"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }] });
578
+ }
579
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiDragDropDemoComponent, decorators: [{
580
+ type: Component,
581
+ args: [{ selector: 'lib-drag-drop-demo', standalone: true, imports: [
582
+ CommonModule,
583
+ LibsUiComponentsDragContainerDirective,
584
+ LibsUiDragItemDirective,
585
+ LibsUiComponentsButtonsButtonComponent
586
+ ], template: `
587
+ <div class="page-container">
588
+ <header>
589
+ <h1>Demo Drag and Drop Component</h1>
590
+ <p>Angular component library for drag and drop functionality</p>
591
+ </header>
592
+
593
+ <main>
594
+ <section class="intro-section">
595
+ <h2>Introduction</h2>
596
+ <p>
597
+ <code>&#64;libs-ui/components-drag-drop</code> is a powerful Angular component that enables drag and drop functionality with features like virtual scrolling, multi-selection, and custom boundaries.
598
+ </p>
599
+ </section>
600
+
601
+ <section class="installation-section">
602
+ <h2>Installation</h2>
603
+ <p>To install the library, use npm or yarn:</p>
604
+
605
+ <div class="install-command">
606
+ <pre>
607
+ <code>npm install &#64;libs-ui/components-drag-drop</code>
608
+ <libs_ui-components-buttons-button
609
+ [label]="'Copy'"
610
+ (outClick)="copyToClipboard('npm install @libs-ui/components-drag-drop')" />
611
+ </pre>
612
+ </div>
613
+
614
+ <p>Or with yarn:</p>
615
+
616
+ <div class="install-command">
617
+ <pre>
618
+ <code>yarn add &#64;libs-ui/components-drag-drop</code>
619
+ <libs_ui-components-buttons-button
620
+ [label]="'Copy'"
621
+ (outClick)="copyToClipboard('yarn add @libs-ui/components-drag-drop')" />
622
+ </pre>
623
+ </div>
624
+ </section>
625
+
626
+ <section class="demo-section">
627
+ <h2>Live Demo</h2>
628
+ <div class="demo-container">
629
+ <!-- Basic List Demo -->
630
+ <div class="demo-example">
631
+ <h3>Basic List</h3>
632
+ <div class="list-container">
633
+ <div LibsUiComponentsDragContainerDirective
634
+ [(items)]="basicItems"
635
+ [acceptDragSameGroup]="true">
636
+ @for (item of basicItems; track item) {
637
+ <div class="list-item"
638
+ LibsUiDragItemDirective>
639
+ <span class="item-icon">📋</span>
640
+ <span class="item-text">{{ item }}</span>
641
+ </div>
642
+ }
643
+ </div>
644
+ </div>
645
+ </div>
646
+
647
+ <!-- Kanban Board Demo -->
648
+ <div class="demo-example">
649
+ <h3>Kanban Board</h3>
650
+ <div class="kanban-board">
651
+ @for (column of columns; track column) {
652
+ <div class="kanban-column"
653
+ LibsUiComponentsDragContainerDirective
654
+ [(items)]="column.items"
655
+ [groupName]="column.id"
656
+ [dropToGroupName]="columnsIds"
657
+ [acceptDragSameGroup]="true">
658
+ <h4>{{ column.title }}</h4>
659
+ @for (item of column.items; track item) {
660
+ <div class="kanban-item"
661
+ LibsUiDragItemDirective>
662
+ <div class="kanban-item-header">
663
+ <span class="item-title">{{ item.title }}</span>
664
+ <span class="item-status" [class]="'status-' + item.status">
665
+ {{ item.status }}
666
+ </span>
667
+ </div>
668
+ <p class="item-description">{{ item.description }}</p>
669
+ </div>
670
+ }
671
+ </div>
672
+ }
673
+ </div>
674
+ </div>
675
+
676
+ <!-- Nested Containers Demo -->
677
+ <div class="demo-example">
678
+ <h3>Nested Containers</h3>
679
+ <div class="nested-container">
680
+ <div LibsUiComponentsDragContainerDirective
681
+ [(items)]="nestedItems"
682
+ [groupName]="'parent'"
683
+ [acceptDragSameGroup]="true">
684
+ @for (item of nestedItems; track item) {
685
+ <div class="nested-item"
686
+ LibsUiDragItemDirective>
687
+ <div class="nested-item-header">
688
+ <span class="item-title">{{ item.title }}</span>
689
+ </div>
690
+ <div class="nested-item-content">
691
+ <div LibsUiComponentsDragContainerDirective
692
+ [(items)]="item.subItems"
693
+ [groupName]="'child'"
694
+ [acceptDragSameGroup]="true">
695
+ @for (subItem of item.subItems; track subItem) {
696
+ <div class="sub-item"
697
+ LibsUiDragItemDirective>
698
+ {{ subItem }}
699
+ </div>
700
+ }
701
+ </div>
702
+ </div>
703
+ </div>
704
+ }
705
+ </div>
706
+ </div>
707
+ </div>
708
+ </div>
709
+ </section>
710
+
711
+ <section class="api-doc-section">
712
+ <h2>API Documentation</h2>
713
+
714
+ <h3>Inputs</h3>
715
+ <div class="table-container">
716
+ <table class="api-table">
717
+ <thead>
718
+ <tr>
719
+ <th>Name</th>
720
+ <th>Type</th>
721
+ <th>Default</th>
722
+ <th>Description</th>
723
+ </tr>
724
+ </thead>
725
+ <tbody>
726
+ @for (input of inputsDoc; track input.name) {
727
+ <tr>
728
+ <td><code>{{input.name}}</code></td>
729
+ <td><code>{{input.type}}</code></td>
730
+ <td>{{input.default}}</td>
731
+ <td>{{input.description}}</td>
732
+ </tr>
733
+ }
734
+ </tbody>
735
+ </table>
736
+ </div>
737
+
738
+ <h3>Outputs</h3>
739
+ <div class="table-container">
740
+ <table class="api-table">
741
+ <thead>
742
+ <tr>
743
+ <th>Name</th>
744
+ <th>Type</th>
745
+ <th>Description</th>
746
+ </tr>
747
+ </thead>
748
+ <tbody>
749
+ @for (output of outputsDoc; track output.name) {
750
+ <tr>
751
+ <td><code>{{output.name}}</code></td>
752
+ <td><code>{{output.type}}</code></td>
753
+ <td>{{output.description}}</td>
754
+ </tr>
755
+ }
756
+ </tbody>
757
+ </table>
758
+ </div>
759
+ </section>
760
+
761
+ <section class="interfaces-section">
762
+ <h2>Interfaces</h2>
763
+ <div class="interface-docs">
764
+ @for (interfaceItem of interfacesDoc; track interfaceItem.name) {
765
+ <div class="interface-item">
766
+ <h3>{{interfaceItem.name}}</h3>
767
+ <pre><code>{{interfaceItem.code}}</code></pre>
768
+ <p>{{interfaceItem.description}}</p>
769
+ </div>
770
+ }
771
+ </div>
772
+ </section>
773
+
774
+ <section class="features-section">
775
+ <h2>Features</h2>
776
+ <ul>
777
+ @for (feature of features; track feature.id) {
778
+ <li>
779
+ <span class="feature-icon">{{feature.icon}}</span>
780
+ <div class="feature-info">
781
+ <h3>{{feature.title}}</h3>
782
+ <p>{{feature.description}}</p>
783
+ </div>
784
+ </li>
785
+ }
786
+ </ul>
787
+ </section>
788
+
789
+ <section class="usage-section">
790
+ <h2>Usage</h2>
791
+ <div class="code-examples">
792
+ @for (example of codeExamples; track example.id) {
793
+ <div class="code-example">
794
+ <h3>{{example.title}}</h3>
795
+ <pre><code [innerHTML]="example.code"></code></pre>
796
+ </div>
797
+ }
798
+ </div>
799
+ </section>
800
+ </main>
801
+ </div>
802
+ `, styles: [".page-container{max-width:1200px;margin:0 auto;padding:20px;font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;line-height:1.6;color:#333}header{text-align:center;padding:40px 0;background-color:#fff;border-radius:8px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}header h1{font-size:2.5rem;color:#2c3e50;margin-bottom:10px}header p{font-size:1.2rem;color:#7f8c8d}section{background-color:#fff;border-radius:8px;padding:30px;margin-bottom:30px;box-shadow:0 2px 5px #0000001a}h2{font-size:1.8rem;color:#2c3e50;margin-bottom:20px;padding-bottom:10px;border-bottom:2px solid #ecf0f1}h3{font-size:1.4rem;color:#34495e;margin-bottom:15px}h4{font-size:1.2rem;color:#34495e;margin-bottom:10px}p{margin-bottom:15px}code{font-family:Courier New,Courier,monospace;background-color:#f7f7f7;padding:2px 5px;border-radius:3px;font-size:.9em}pre{background-color:#f7f7f7;padding:15px;border-radius:5px;overflow-x:auto;margin-bottom:20px;display:flex;align-items:center;justify-content:space-between}pre code{background-color:transparent;padding:0}.installation-section .install-command{position:relative;margin-bottom:20px}.installation-section .copy-button{position:absolute;top:10px;right:10px;background:#3498db;color:#fff;border:none;border-radius:4px;padding:5px 10px;font-size:.9rem;cursor:pointer;transition:background .2s}.installation-section .copy-button:hover{background:#2980b9}.demo-container{display:grid;grid-template-columns:1fr;gap:30px}.demo-example{background:#f7f7f7;padding:20px;border-radius:8px;margin-bottom:20px}.list-container{max-width:400px;margin:20px auto}.list-item{padding:12px;margin:8px 0;background:#fff;border:1px solid #e0e0e0;border-radius:6px;display:flex;align-items:center;transition:transform .2s,box-shadow .2s}.list-item:hover{transform:translateY(-2px);box-shadow:0 4px 8px #0000001a}.item-icon{margin-right:12px;font-size:1.2em}.kanban-board{display:flex;gap:20px;padding:20px;overflow-x:auto}.kanban-column{flex:1;min-width:300px;background:#f5f5f5;padding:15px;border-radius:8px}.kanban-item{background:#fff;padding:12px;margin:8px 0;border-radius:6px;box-shadow:0 1px 3px #0000001a}.kanban-item-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.item-title{font-weight:500}.item-status{padding:4px 8px;border-radius:4px;font-size:.8em}.status-todo{background:#ffebee;color:#c62828}.status-in-progress{background:#fff3e0;color:#ef6c00}.status-done{background:#e8f5e9;color:#2e7d32}.item-description{font-size:.9em;color:#666}.nested-container{max-width:800px;margin:0 auto}.nested-item{background:#fff;border:1px solid #e0e0e0;border-radius:8px;margin:12px 0;overflow:hidden}.nested-item-header{padding:12px;background:#f5f5f5;border-bottom:1px solid #e0e0e0}.nested-item-content{padding:12px}.sub-item{padding:8px;margin:4px 0;background:#f9f9f9;border:1px solid #e0e0e0;border-radius:4px}.api-doc-section{margin-bottom:40px}.table-container{overflow-x:auto;margin-bottom:30px}.api-table{width:100%;border-collapse:collapse;margin-bottom:20px}.api-table th,.api-table td{padding:12px 15px;text-align:left;border-bottom:1px solid #e1e1e1}.api-table th{background-color:#f5f5f5;font-weight:700}.api-table tbody tr:hover{background-color:#f9f9f9}.features-section ul{list-style:none}.features-section li{display:flex;margin-bottom:25px;align-items:flex-start}.feature-icon{font-size:2rem;margin-right:20px;min-width:40px;text-align:center}.feature-info{flex:1}.code-examples{display:grid;grid-template-columns:1fr;gap:20px}@media (min-width: 768px){.code-examples{grid-template-columns:repeat(2,1fr)}}@media (min-width: 992px){.code-examples{grid-template-columns:repeat(3,1fr)}}.code-example{border:1px solid #ecf0f1;border-radius:5px;padding:15px}@media (max-width: 768px){header{padding:30px 0}header h1{font-size:2rem}section{padding:20px}.kanban-board{flex-direction:column}.kanban-column{min-width:100%}.feature-icon{font-size:1.5rem;margin-right:15px}}\n"] }]
803
+ }] });
804
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJhZy1kcm9wL3NyYy9kZW1vL2RlbW8uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQWlsQmpFLE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsbUJBQW1CO0lBQ25CLFVBQVUsR0FBRztRQUNYLFFBQVE7UUFDUixRQUFRO1FBQ1IsUUFBUTtRQUNSLFFBQVE7UUFDUixRQUFRO0tBQ1QsQ0FBQztJQUVGLHVCQUF1QjtJQUN2QixVQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLE9BQU8sR0FBYTtRQUNsQjtZQUNFLEVBQUUsRUFBRSxNQUFNO1lBQ1YsS0FBSyxFQUFFLE9BQU87WUFDZCxLQUFLLEVBQUU7Z0JBQ0w7b0JBQ0UsRUFBRSxFQUFFLENBQUM7b0JBQ0wsS0FBSyxFQUFFLHlCQUF5QjtvQkFDaEMsV0FBVyxFQUFFLGtEQUFrRDtvQkFDL0QsTUFBTSxFQUFFLE1BQU07aUJBQ2Y7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFFLENBQUM7b0JBQ0wsS0FBSyxFQUFFLGdCQUFnQjtvQkFDdkIsV0FBVyxFQUFFLCtDQUErQztvQkFDNUQsTUFBTSxFQUFFLE1BQU07aUJBQ2Y7YUFDRjtTQUNGO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsYUFBYTtZQUNqQixLQUFLLEVBQUUs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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd05UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vZHJhZy1kcm9wLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMaWJzVWlEcmFnSXRlbURpcmVjdGl2ZSB9IGZyb20gJy4uL2RyYWctaXRlbS5kaXJlY3RpdmUnO1xuXG5pbnRlcmZhY2UgVGFzayB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHN0YXR1czogJ3RvZG8nIHwgJ2luLXByb2dyZXNzJyB8ICdkb25lJztcbn1cblxuaW50ZXJmYWNlIENvbHVtbiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGl0ZW1zOiBUYXNrW107XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kcmFnLWRyb3AtZGVtbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUsXG4gICAgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicGFnZS1jb250YWluZXJcIj5cbiAgICAgIDxoZWFkZXI+XG4gICAgICAgIDxoMT5EZW1vIERyYWcgYW5kIERyb3AgQ29tcG9uZW50PC9oMT5cbiAgICAgICAgPHA+QW5ndWxhciBjb21wb25lbnQgbGlicmFyeSBmb3IgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5PC9wPlxuICAgICAgPC9oZWFkZXI+XG5cbiAgICAgIDxtYWluPlxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImludHJvLXNlY3Rpb25cIj5cbiAgICAgICAgICA8aDI+SW50cm9kdWN0aW9uPC9oMj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxjb2RlPiYjNjQ7bGlicy11aS9jb21wb25lbnRzLWRyYWctZHJvcDwvY29kZT4gaXMgYSBwb3dlcmZ1bCBBbmd1bGFyIGNvbXBvbmVudCB0aGF0IGVuYWJsZXMgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5IHdpdGggZmVhdHVyZXMgbGlrZSB2aXJ0dWFsIHNjcm9sbGluZywgbXVsdGktc2VsZWN0aW9uLCBhbmQgY3VzdG9tIGJvdW5kYXJpZXMuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJpbnN0YWxsYXRpb24tc2VjdGlvblwiPlxuICAgICAgICAgIDxoMj5JbnN0YWxsYXRpb248L2gyPlxuICAgICAgICAgIDxwPlRvIGluc3RhbGwgdGhlIGxpYnJhcnksIHVzZSBucG0gb3IgeWFybjo8L3A+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluc3RhbGwtY29tbWFuZFwiPlxuICAgICAgICAgICAgPHByZT5cbiAgICAgICAgICAgICAgPGNvZGU+bnBtIGluc3RhbGwgJiM2NDtsaWJzLXVpL2NvbXBvbmVudHMtZHJhZy1kcm9wPC9jb2RlPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDb3B5J1wiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImNvcHlUb0NsaXBib2FyZCgnbnBtIGluc3RhbGwgQGxpYnMtdWkvY29tcG9uZW50cy1kcmFnLWRyb3AnKVwiIC8+XG4gICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICA8cD5PciB3aXRoIHlhcm46PC9wPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0YWxsLWNvbW1hbmRcIj5cbiAgICAgICAgICAgIDxwcmU+XG4gICAgICAgICAgICAgIDxjb2RlPnlhcm4gYWRkICYjNjQ7bGlicy11aS9jb21wb25lbnRzLWRyYWctZHJvcDwvY29kZT5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ29weSdcIlxuICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJjb3B5VG9DbGlwYm9hcmQoJ3lhcm4gYWRkIEBsaWJzLXVpL2NvbXBvbmVudHMtZHJhZy1kcm9wJylcIiAvPlxuICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImRlbW8tc2VjdGlvblwiPlxuICAgICAgICAgIDxoMj5MaXZlIERlbW88L2gyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZW1vLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPCEtLSBCYXNpYyBMaXN0IERlbW8gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVtby1leGFtcGxlXCI+XG4gICAgICAgICAgICAgIDxoMz5CYXNpYyBMaXN0PC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSBcbiAgICAgICAgICAgICAgICAgICAgIFsoaXRlbXMpXT1cImJhc2ljSXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdERyYWdTYW1lR3JvdXBdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBiYXNpY0l0ZW1zOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1pY29uXCI+8J+Tizwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tdGV4dFwiPnt7IGl0ZW0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEthbmJhbiBCb2FyZCBEZW1vIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbW8tZXhhbXBsZVwiPlxuICAgICAgICAgICAgICA8aDM+S2FuYmFuIEJvYXJkPC9oMz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImthbmJhbi1ib2FyZFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zOyB0cmFjayBjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrYW5iYW4tY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUgXG4gICAgICAgICAgICAgICAgICAgICAgIFsoaXRlbXMpXT1cImNvbHVtbi5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFtncm91cE5hbWVdPVwiY29sdW1uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3BUb0dyb3VwTmFtZV09XCJjb2x1bW5zSWRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdERyYWdTYW1lR3JvdXBdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aDQ+e3sgY29sdW1uLnRpdGxlIH19PC9oND5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBjb2x1bW4uaXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FuYmFuLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FuYmFuLWl0ZW0taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS10aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1zdGF0dXNcIiBbY2xhc3NdPVwiJ3N0YXR1cy0nICsgaXRlbS5zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnN0YXR1cyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaXRlbS1kZXNjcmlwdGlvblwiPnt7IGl0ZW0uZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBOZXN0ZWQgQ29udGFpbmVycyBEZW1vIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbW8tZXhhbXBsZVwiPlxuICAgICAgICAgICAgICA8aDM+TmVzdGVkIENvbnRhaW5lcnM8L2gzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmVzdGVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUgXG4gICAgICAgICAgICAgICAgICAgICBbKGl0ZW1zKV09XCJuZXN0ZWRJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICBbZ3JvdXBOYW1lXT1cIidwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICAgICAgIFthY2NlcHREcmFnU2FtZUdyb3VwXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgbmVzdGVkSXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5lc3RlZC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBMaWJzVWlEcmFnSXRlbURpcmVjdGl2ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmVzdGVkLWl0ZW0taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXN0ZWQtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW1zKV09XCJpdGVtLnN1Ykl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwTmFtZV09XCInY2hpbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdERyYWdTYW1lR3JvdXBdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChzdWJJdGVtIG9mIGl0ZW0uc3ViSXRlbXM7IHRyYWNrIHN1Ykl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdWJJdGVtIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiYXBpLWRvYy1zZWN0aW9uXCI+XG4gICAgICAgICAgPGgyPkFQSSBEb2N1bWVudGF0aW9uPC9oMj5cbiAgICAgICAgICBcbiAgICAgICAgICA8aDM+SW5wdXRzPC9oMz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJhcGktdGFibGVcIj5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5UeXBlPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5EZWZhdWx0PC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKGlucHV0IG9mIGlucHV0c0RvYzsgdHJhY2sgaW5wdXQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PGNvZGU+e3tpbnB1dC5uYW1lfX08L2NvZGU+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxjb2RlPnt7aW5wdXQudHlwZX19PC9jb2RlPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e2lucHV0LmRlZmF1bHR9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e2lucHV0LmRlc2NyaXB0aW9ufX08L3RkPlxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGgzPk91dHB1dHM8L2gzPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImFwaS10YWJsZVwiPlxuICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoPlR5cGU8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgQGZvciAob3V0cHV0IG9mIG91dHB1dHNEb2M7IHRyYWNrIG91dHB1dC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48Y29kZT57e291dHB1dC5uYW1lfX08L2NvZGU+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxjb2RlPnt7b3V0cHV0LnR5cGV9fTwvY29kZT48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3tvdXRwdXQuZGVzY3JpcHRpb259fTwvdGQ+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImludGVyZmFjZXMtc2VjdGlvblwiPlxuICAgICAgICAgIDxoMj5JbnRlcmZhY2VzPC9oMj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJmYWNlLWRvY3NcIj5cbiAgICAgICAgICAgIEBmb3IgKGludGVyZmFjZUl0ZW0gb2YgaW50ZXJmYWNlc0RvYzsgdHJhY2sgaW50ZXJmYWNlSXRlbS5uYW1lKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnRlcmZhY2UtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxoMz57e2ludGVyZmFjZUl0ZW0ubmFtZX19PC9oMz5cbiAgICAgICAgICAgICAgICA8cHJlPjxjb2RlPnt7aW50ZXJmYWNlSXRlbS5jb2RlfX08L2NvZGU+PC9wcmU+XG4gICAgICAgICAgICAgICAgPHA+e3tpbnRlcmZhY2VJdGVtLmRlc2NyaXB0aW9ufX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJmZWF0dXJlcy1zZWN0aW9uXCI+XG4gICAgICAgICAgPGgyPkZlYXR1cmVzPC9oMj5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICBAZm9yIChmZWF0dXJlIG9mIGZlYXR1cmVzOyB0cmFjayBmZWF0dXJlLmlkKSB7XG4gICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZlYXR1cmUtaWNvblwiPnt7ZmVhdHVyZS5pY29ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlYXR1cmUtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPGgzPnt7ZmVhdHVyZS50aXRsZX19PC9oMz5cbiAgICAgICAgICAgICAgICAgIDxwPnt7ZmVhdHVyZS5kZXNjcmlwdGlvbn19PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cInVzYWdlLXNlY3Rpb25cIj5cbiAgICAgICAgICA8aDI+VXNhZ2U8L2gyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLWV4YW1wbGVzXCI+XG4gICAgICAgICAgICBAZm9yIChleGFtcGxlIG9mIGNvZGVFeGFtcGxlczsgdHJhY2sgZXhhbXBsZS5pZCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS1leGFtcGxlXCI+XG4gICAgICAgICAgICAgICAgPGgzPnt7ZXhhbXBsZS50aXRsZX19PC9oMz5cbiAgICAgICAgICAgICAgICA8cHJlPjxjb2RlIFtpbm5lckhUTUxdPVwiZXhhbXBsZS5jb2RlXCI+PC9jb2RlPjwvcHJlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9tYWluPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnBhZ2UtY29udGFpbmVyIHtcbiAgICAgIG1heC13aWR0aDogMTIwMHB4O1xuICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsIFRhaG9tYSwgR2VuZXZhLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNjtcbiAgICAgIGNvbG9yOiAjMzMzO1xuICAgIH1cbiAgICBcbiAgICBoZWFkZXIge1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgcGFkZGluZzogNDBweCAwO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDMwcHg7XG4gICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgIH1cbiAgICBcbiAgICBoZWFkZXIgaDEge1xuICAgICAgZm9udC1zaXplOiAyLjVyZW07XG4gICAgICBjb2xvcjogIzJjM2U1MDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgfVxuICAgIFxuICAgIGhlYWRlciBwIHtcbiAgICAgIGZvbnQtc2l6ZTogMS4ycmVtO1xuICAgICAgY29sb3I6ICM3ZjhjOGQ7XG4gICAgfVxuICAgIFxuICAgIHNlY3Rpb24ge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIHBhZGRpbmc6IDMwcHg7XG4gICAgICBtYXJnaW4tYm90dG9tOiAzMHB4O1xuICAgICAgYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgICB9XG4gICAgXG4gICAgaDIge1xuICAgICAgZm9udC1zaXplOiAxLjhyZW07XG4gICAgICBjb2xvcjogIzJjM2U1MDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZWNmMGYxO1xuICAgIH1cbiAgICBcbiAgICBoMyB7XG4gICAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgICAgIGNvbG9yOiAjMzQ0OTVlO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbiAgICB9XG5cbiAgICBoNCB7XG4gICAgICBmb250LXNpemU6IDEuMnJlbTtcbiAgICAgIGNvbG9yOiAjMzQ0OTVlO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICB9XG4gICAgXG4gICAgcCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICAgIH1cbiAgICBcbiAgICBjb2RlIHtcbiAgICAgIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb3VyaWVyLCBtb25vc3BhY2U7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3O1xuICAgICAgcGFkZGluZzogMnB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIGZvbnQtc2l6ZTogMC45ZW07XG4gICAgfVxuICAgIFxuICAgIHByZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3O1xuICAgICAgcGFkZGluZzogMTVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgfVxuICAgIFxuICAgIHByZSBjb2RlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG5cbiAgICAvKiBJbnN0YWxsYXRpb24gc2VjdGlvbiBzdHlsZXMgKi9cbiAgICAuaW5zdGFsbGF0aW9uLXNlY3Rpb24gLmluc3RhbGwtY29tbWFuZCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgIH1cbiAgICBcbiAgICAuaW5zdGFsbGF0aW9uLXNlY3Rpb24gLmNvcHktYnV0dG9uIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMTBweDtcbiAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgYmFja2dyb3VuZDogIzM0OThkYjtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgICAgZm9udC1zaXplOiAwLjlyZW07XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnM7XG4gICAgfVxuICAgIFxuICAgIC5pbnN0YWxsYXRpb24tc2VjdGlvbiAuY29weS1idXR0b246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogIzI5ODBiOTtcbiAgICB9XG5cbiAgICAvKiBEZW1vIHNlY3Rpb24gc3R5bGVzICovXG4gICAgLmRlbW8tY29udGFpbmVyIHtcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcbiAgICAgIGdhcDogMzBweDtcbiAgICB9XG5cbiAgICAuZGVtby1leGFtcGxlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmN2Y3Zjc7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICB9XG5cbiAgICAvKiBMaXN0IHN0eWxlcyAqL1xuICAgIC5saXN0LWNvbnRhaW5lciB7XG4gICAgICBtYXgtd2lkdGg6IDQwMHB4O1xuICAgICAgbWFyZ2luOiAyMHB4IGF1dG87XG4gICAgfVxuXG4gICAgLmxpc3QtaXRlbSB7XG4gICAgICBwYWRkaW5nOiAxMnB4O1xuICAgICAgbWFyZ2luOiA4cHggMDtcbiAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UwZTBlMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMsIGJveC1zaGFkb3cgMC4ycztcbiAgICB9XG5cbiAgICAubGlzdC1pdGVtOmhvdmVyIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsMCwwLDAuMSk7XG4gICAgfVxuXG4gICAgLml0ZW0taWNvbiB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDEycHg7XG4gICAgICBmb250LXNpemU6IDEuMmVtO1xuICAgIH1cblxuICAgIC8qIEthbmJhbiBzdHlsZXMgKi9cbiAgICAua2FuYmFuLWJvYXJkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBnYXA6IDIwcHg7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICB9XG5cbiAgICAua2FuYmFuLWNvbHVtbiB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLXdpZHRoOiAzMDBweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gICAgICBwYWRkaW5nOiAxNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIH1cblxuICAgIC5rYW5iYW4taXRlbSB7XG4gICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICBtYXJnaW46IDhweCAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwwLDAsMC4xKTtcbiAgICB9XG5cbiAgICAua2FuYmFuLWl0ZW0taGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgIH1cblxuICAgIC5pdGVtLXRpdGxlIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuXG4gICAgLml0ZW0tc3RhdHVzIHtcbiAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBmb250LXNpemU6IDAuOGVtO1xuICAgIH1cblxuICAgIC5zdGF0dXMtdG9kbyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZlYmVlO1xuICAgICAgY29sb3I6ICNjNjI4Mjg7XG4gICAgfVxuXG4gICAgLnN0YXR1cy1pbi1wcm9ncmVzcyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmM2UwO1xuICAgICAgY29sb3I6ICNlZjZjMDA7XG4gICAgfVxuXG4gICAgLnN0YXR1cy1kb25lIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlOGY1ZTk7XG4gICAgICBjb2xvcjogIzJlN2QzMjtcbiAgICB9XG5cbiAgICAuaXRlbS1kZXNjcmlwdGlvbiB7XG4gICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgY29sb3I6ICM2NjY7XG4gICAgfVxuXG4gICAgLyogTmVzdGVkIGNvbnRhaW5lcnMgc3R5bGVzICovXG4gICAgLm5lc3RlZC1jb250YWluZXIge1xuICAgICAgbWF4LXdpZHRoOiA4MDBweDtcbiAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIH1cblxuICAgIC5uZXN0ZWQtaXRlbSB7XG4gICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMGUwZTA7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBtYXJnaW46IDEycHggMDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLm5lc3RlZC1pdGVtLWhlYWRlciB7XG4gICAgICBwYWRkaW5nOiAxMnB4O1xuICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTBlMGUwO1xuICAgIH1cblxuICAgIC5uZXN0ZWQtaXRlbS1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgfVxuXG4gICAgLnN1Yi1pdGVtIHtcbiAgICAgIHBhZGRpbmc6IDhweDtcbiAgICAgIG1hcmdpbjogNHB4IDA7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UwZTBlMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICB9XG5cbiAgICAvKiBBUEkgZG9jdW1lbnRhdGlvbiBzdHlsZXMgKi9cbiAgICAuYXBpLWRvYy1zZWN0aW9uIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDQwcHg7XG4gICAgfVxuICAgIFxuICAgIC50YWJsZS1jb250YWluZXIge1xuICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgIG1hcmdpbi1ib3R0b206IDMwcHg7XG4gICAgfVxuICAgIFxuICAgIC5hcGktdGFibGUge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICB9XG4gICAgXG4gICAgLmFwaS10YWJsZSB0aCxcbiAgICAuYXBpLXRhYmxlIHRkIHtcbiAgICAgIHBhZGRpbmc6IDEycHggMTVweDtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UxZTFlMTtcbiAgICB9XG4gICAgXG4gICAgLmFwaS10YWJsZSB0aCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgfVxuICAgIFxuICAgIC5hcGktdGFibGUgdGJvZHkgdHI6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcbiAgICB9XG5cbiAgICAvKiBGZWF0dXJlcyBzZWN0aW9uICovXG4gICAgLmZlYXR1cmVzLXNlY3Rpb24gdWwge1xuICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICB9XG4gICAgXG4gICAgLmZlYXR1cmVzLXNlY3Rpb24gbGkge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7XG4gICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICB9XG4gICAgXG4gICAgLmZlYXR1cmUtaWNvbiB7XG4gICAgICBmb250LXNpemU6IDJyZW07XG4gICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XG4gICAgICBtaW4td2lkdGg6IDQwcHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuICAgIFxuICAgIC5mZWF0dXJlLWluZm8ge1xuICAgICAgZmxleDogMTtcbiAgICB9XG5cbiAgICAvKiBDb2RlIGV4YW1wbGVzICovXG4gICAgLmNvZGUtZXhhbXBsZXMge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xuICAgICAgZ2FwOiAyMHB4O1xuICAgIH1cbiAgICBcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgICAgIC5jb2RlLWV4YW1wbGVzIHtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XG4gICAgICAuY29kZS1leGFtcGxlcyB7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIDFmcik7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC5jb2RlLWV4YW1wbGUge1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VjZjBmMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIHBhZGRpbmc6IDE1cHg7XG4gICAgfVxuXG4gICAgLyogUmVzcG9uc2l2ZSBhZGp1c3RtZW50cyAqL1xuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAgICAgaGVhZGVyIHtcbiAgICAgICAgcGFkZGluZzogMzBweCAwO1xuICAgICAgfVxuICAgICAgXG4gICAgICBoZWFkZXIgaDEge1xuICAgICAgICBmb250LXNpemU6IDJyZW07XG4gICAgICB9XG4gICAgICBcbiAgICAgIHNlY3Rpb24ge1xuICAgICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgfVxuICAgICAgXG4gICAgICAua2FuYmFuLWJvYXJkIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLmthbmJhbi1jb2x1bW4ge1xuICAgICAgICBtaW4td2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC5mZWF0dXJlLWljb24ge1xuICAgICAgICBmb250LXNpemU6IDEuNXJlbTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgICAgfVxuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpRHJhZ0Ryb3BEZW1vQ29tcG9uZW50IHtcbiAgLy8gQmFzaWMgTGlzdCBJdGVtc1xuICBiYXNpY0l0ZW1zID0gW1xuICAgICdUYXNrIDEnLFxuICAgICdUYXNrIDInLFxuICAgICdUYXNrIDMnLFxuICAgICdUYXNrIDQnLFxuICAgICdUYXNrIDUnXG4gIF07XG5cbiAgLy8gS2FuYmFuIEJvYXJkIENvbHVtbnNcbiAgY29sdW1uc0lkcyA9IFsndG9kbycsICdpbi1wcm9ncmVzcycsICdkb25lJ107XG4gIGNvbHVtbnM6IENvbHVtbltdID0gW1xuICAgIHtcbiAgICAgIGlkOiAndG9kbycsXG4gICAgICB0aXRsZTogJ1RvIERvJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICB0aXRsZTogJ0ltcGxlbWVudCBkcmFnIGFuZCBkcm9wJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FkZCBkcmFnIGFuZCBkcm9wIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGNvbXBvbmVudCcsXG4gICAgICAgICAgc3RhdHVzOiAndG9kbydcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAyLFxuICAgICAgICAgIHRpdGxlOiAnQWRkIGFuaW1hdGlvbnMnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW1wbGVtZW50IHNtb290aCBhbmltYXRpb25zIGZvciBkcmFnIGFuZCBkcm9wJyxcbiAgICAgICAgICBzdGF0dXM6ICd0b2RvJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2luLXByb2dyZXNzJyxcbiAgICAgIHRpdGxlOiAnSW4gUHJvZ3Jlc3MnLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAzLFxuICAgICAgICAgIHRpdGxlOiAnRml4IHN0eWxpbmcgaXNzdWVzJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1Jlc29sdmUgQ1NTIGNvbmZsaWN0cyBpbiB0aGUgY29tcG9uZW50JyxcbiAgICAgICAgICBzdGF0dXM6ICdpbi1wcm9ncmVzcydcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdkb25lJyxcbiAgICAgIHRpdGxlOiAnRG9uZScsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDQsXG4gICAgICAgICAgdGl0bGU6ICdTZXR1cCBwcm9qZWN0IHN0cnVjdHVyZScsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdJbml0aWFsaXplIHRoZSBwcm9qZWN0IHdpdGggbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb25zJyxcbiAgICAgICAgICBzdGF0dXM6ICdkb25lJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICBdO1xuXG4gIC8vIE5lc3RlZCBJdGVtc1xuICBuZXN0ZWRJdGVtcyA9IFtcbiAgICB7XG4gICAgICBpZDogMSxcbiAgICAgIHRpdGxlOiAnUHJvamVjdCBBJyxcbiAgICAgIHN1Ykl0ZW1zOiBbJ1Rhc2sgMScsICdUYXNrIDInLCAnVGFzayAzJ11cbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAyLFxuICAgICAgdGl0bGU6ICdQcm9qZWN0IEInLFxuICAgICAgc3ViSXRlbXM6IFsnVGFzayA0JywgJ1Rhc2sgNSddXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogMyxcbiAgICAgIHRpdGxlOiAnUHJvamVjdCBDJyxcbiAgICAgIHN1Ykl0ZW1zOiBbJ1Rhc2sgNicsICdUYXNrIDcnLCAnVGFzayA4J11cbiAgICB9XG4gIF07XG5cbiAgLy8gQVBJIERvY3VtZW50YXRpb25cbiAgaW5wdXRzRG9jID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdpdGVtcycsXG4gICAgICB0eXBlOiAnQXJyYXk8dW5rbm93bj4nLFxuICAgICAgZGVmYXVsdDogJ1tdJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXJyYXkgb2YgaXRlbXMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb250YWluZXInXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbW9kZScsXG4gICAgICB0eXBlOiBcIidtb3ZlJyB8ICdjb3B5JyB8ICdkZWVwQ29weSdcIixcbiAgICAgIGRlZmF1bHQ6IFwiJ21vdmUnXCIsXG4gICAgICBkZXNjcmlwdGlvbjogJ01vZGUgZm9yIGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdkaXJlY3Rpb25EcmFnJyxcbiAgICAgIHR5cGU6IFwiJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ1wiLFxuICAgICAgZGVmYXVsdDogJ3VuZGVmaW5lZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdGlvbiBvZiBkcmFnIG1vdmVtZW50J1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3ZpZXdFbmNhcHN1bGF0aW9uJyxcbiAgICAgIHR5cGU6IFwiJ2VtdWxhdGVkJyB8ICdub25lJ1wiLFxuICAgICAgZGVmYXVsdDogXCInZW11bGF0ZWQnXCIsXG4gICAgICBkZXNjcmlwdGlvbjogJ1ZpZXcgZW5jYXBzdWxhdGlvbiBtb2RlIGZvciBzdHlsaW5nJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2Rpc2FibGVEcmFnQ29udGFpbmVyJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGRlZmF1bHQ6ICd1bmRlZmluZWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIGRpc2FibGUgZHJhZyBvcGVyYXRpb25zIGZvciB0aGUgY29udGFpbmVyJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2FjY2VwdERyYWdTYW1lR3JvdXAnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZGVmYXVsdDogJ2ZhbHNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBhY2NlcHQgZHJhZyBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBncm91cCdcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdwbGFjZWhvbGRlcicsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBkZWZhdWx0OiAndHJ1ZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyBwbGFjZWhvbGRlciBkdXJpbmcgZHJhZydcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdncm91cE5hbWUnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiBcIidncm91cERyYWdBbmREcm9wRGVmYXVsdCdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgZ3JvdXAgZm9yIGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdkcm9wVG9Hcm91cE5hbWUnLFxuICAgICAgdHlwZTogJ0FycmF5PHN0cmluZz4gfCBudWxsJyxcbiAgICAgIGRlZmF1bHQ6ICdudWxsJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBvZiBncm91cCBuYW1lcyB0aGF0IGNhbiBhY2NlcHQgZHJvcHMgZnJvbSB0aGlzIGNvbnRhaW5lcidcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzdHlsZXNPdmVycmlkZScsXG4gICAgICB0eXBlOiAnQXJyYXk8eyBjbGFzc05hbWU6IHN0cmluZywgc3R5bGVzOiBzdHJpbmcgfT4nLFxuICAgICAgZGVmYXVsdDogJ3VuZGVmaW5lZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0N1c3RvbSBzdHlsZXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBkcmFnLWRyb3Agc3R5bGluZydcbiAgICB9XG4gIF07XG5cbiAgb3V0cHV0c0RvYyA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnb3V0RHJhZ1N0YXJ0Q29udGFpbmVyJyxcbiAgICAgIHR5cGU6ICdJRHJhZ1N0YXJ0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRXZlbnQgZW1pdHRlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cyBpbiB0aGUgY29udGFpbmVyJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ291dERyYWdPdmVyQ29udGFpbmVyJyxcbiAgICAgIHR5cGU6ICdJRHJhZ092ZXInLFxuICAgICAgZGVzY3JpcHRpb246ICdFdmVudCBlbWl0dGVkIHdoZW4gZHJhZ2dpbmcgb3ZlciB0aGUgY29udGFpbmVyJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ291dERyYWdMZWF2ZUNvbnRhaW5lcicsXG4gICAgICB0eXBlOiAnSURyYWdMZWF2ZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0V2ZW50IGVtaXR0ZWQgd2hlbiBkcmFnZ2luZyBsZWF2ZXMgdGhlIGNvbnRhaW5lcidcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdvdXREcmFnRW5kQ29udGFpbmVyJyxcbiAgICAgIHR5cGU6ICdJRHJhZ0VuZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0V2ZW50IGVtaXR0ZWQgd2hlbiBkcmFnZ2luZyBlbmRzIGluIHRoZSBjb250YWluZXInXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnb3V0RHJvcHBlZENvbnRhaW5lcicsXG4gICAgICB0eXBlOiAnSURyb3AnLFxuICAgICAgZGVzY3JpcHRpb246ICdFdmVudCBlbWl0dGVkIHdoZW4gYW4gaXRlbSBpcyBkcm9wcGVkIGluIHRoZSBjb250YWluZXInXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnb3V0RHJvcHBlZENvbnRhaW5lckVtcHR5JyxcbiAgICAgIHR5cGU6ICdJRHJvcCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0V2ZW50IGVtaXR0ZWQgd2hlbiBhbiBpdGVtIGlzIGRyb3BwZWQgaW4gYW4gZW1wdHkgY29udGFpbmVyJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ291dEZ1bmN0aW9uQ29udHJvbCcsXG4gICAgICB0eXBlOiAnSURyYWdEcm9wRnVuY3Rpb25Db250cm9sRXZlbnQnLFxuICAgICAgZGVzY3JpcHRpb246ICdFdmVudCBlbWl0dGVkIHRvIGNvbnRyb2wgZHJhZy1kcm9wIGZ1bmN0aW9uYWxpdHknXG4gICAgfVxuICBdO1xuXG4gIC8vIEludGVyZmFjZSBEb2N1bWVudGF0aW9uXG4gIGludGVyZmFjZXNEb2MgPSBbXG4gICAge1xuICAgICAgbmFtZTogJ0lEcmFnZ2luZycsXG4gICAgICBjb2RlOiBgaW50ZXJmYWNlIElEcmFnZ2luZyB7XG4gIG1vdXNlUG9zaXRpb246IElNb3VzZVBvc2l0aW9uO1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGVsZW1lbnRLZWVwQ29udGFpbmVyPzogYm9vbGVhbjtcbiAgaXRlbURyYWdJbmZvPzogSUl0ZW1EcmFnSW5mbztcbn1gLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmZhY2UgZm9yIGRyYWcgb3BlcmF0aW9uIGV2ZW50cywgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJhZ2dlZCBlbGVtZW50IGFuZCBtb3VzZSBwb3NpdGlvbidcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJRHJhZ1N0YXJ0JyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSURyYWdTdGFydCB7XG4gIG1vdXNlUG9zaXRpb246IElNb3VzZVBvc2l0aW9uO1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGl0ZW1EcmFnSW5mbz86IElJdGVtRHJhZ0luZm87XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciBkcmFnIHN0YXJ0IGV2ZW50cywgdHJpZ2dlcmVkIHdoZW4gZHJhZ2dpbmcgYmVnaW5zJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0lEcmFnT3ZlcicsXG4gICAgICBjb2RlOiBgaW50ZXJmYWNlIElEcmFnT3ZlciB7XG4gIG1vdXNlUG9zaXRpb246IElNb3VzZVBvc2l0aW9uO1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGVsZW1lbnREcmFnT3ZlcjogSFRNTEVsZW1lbnQ7XG4gIGl0ZW1EcmFnSW5mbz86IElJdGVtRHJhZ0luZm87XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciBkcmFnIG92ZXIgZXZlbnRzLCB0cmlnZ2VyZWQgd2hlbiBhbiBlbGVtZW50IGlzIGRyYWdnZWQgb3ZlciBhbm90aGVyIGVsZW1lbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSURyYWdMZWF2ZScsXG4gICAgICBjb2RlOiBgaW50ZXJmYWNlIElEcmFnTGVhdmUge1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGVsZW1lbnREcmFnTGVhdmU6IEhUTUxFbGVtZW50O1xuICBpdGVtRHJhZ0luZm8/OiBJSXRlbURyYWdJbmZvO1xufWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyZmFjZSBmb3IgZHJhZyBsZWF2ZSBldmVudHMsIHRyaWdnZXJlZCB3aGVuIGEgZHJhZ2dlZCBlbGVtZW50IGxlYXZlcyBhbm90aGVyIGVsZW1lbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSURyYWdFbmQnLFxuICAgICAgY29kZTogYGludGVyZmFjZSBJRHJhZ0VuZCB7XG4gIG1vdXNlUG9zaXRpb246IElNb3VzZVBvc2l0aW9uO1xuICBlbGVtZW50RHJhZzogSFRNTEVsZW1lbnQ7XG4gIGl0ZW1EcmFnSW5mbz86IElJdGVtRHJhZ0luZm87XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciBkcmFnIGVuZCBldmVudHMsIHRyaWdnZXJlZCB3aGVuIGRyYWdnaW5nIGVuZHMnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSURyb3AnLFxuICAgICAgY29kZTogYGludGVyZmFjZSBJRHJvcCB7XG4gIGVsZW1lbnREcmFnOiBIVE1MRWxlbWVudDtcbiAgZWxlbWVudERyb3A6IEhUTUxFbGVtZW50O1xuICBpdGVtRHJhZ0luZm8/OiBJSXRlbURyYWdJbmZvO1xufWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyZmFjZSBmb3IgZHJvcCBldmVudHMsIHRyaWdnZXJlZCB3aGVuIGFuIGVsZW1lbnQgaXMgZHJvcHBlZCdcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJSXRlbURyYWdJbmZvJyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSUl0ZW1EcmFnSW5mbyB7XG4gIGl0ZW06IG9iamVjdDtcbiAgaXRlbXNNb3ZlPzogV3JpdGFibGVTaWduYWw8QXJyYXk8dW5rbm93bj4+O1xuICBpbmRleERyYWc/OiBudW1iZXI7XG4gIGluZGV4RHJvcD86IG51bWJlcjtcbiAgaXRlbXNEcmFnOiBXcml0YWJsZVNpZ25hbDxBcnJheTx1bmtub3duPj47XG4gIGl0ZW1zRHJvcD86IFdyaXRhYmxlU2lnbmFsPEFycmF5PHVua25vd24+PjtcbiAgY29udGFpbmVyRHJhZz86IEhUTUxFbGVtZW50O1xuICBjb250YWluZXJEcm9wPzogSFRNTEVsZW1lbnQ7XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyYWdnZWQgaXRlbSBhbmQgaXRzIGNvbnRhaW5lcnMnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSURyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsJyxcbiAgICAgIGNvZGU6IGBpbnRlcmZhY2UgSURyYWdJdGVtSW5Db250YWluZXJWaXJ0dWFsU2Nyb2xsIHtcbiAgaXRlbURyYWdJbmZvPzogSUl0ZW1EcmFnSW5mbztcbiAgZWxlbWVudERyYWc6IEhUTUxFbGVtZW50O1xuICBkaXN0YW5jZVN0YXJ0RWxlbWVudEFuZE1vdXNlVG9wOiBudW1iZXI7XG4gIGRpc3RhbmNlU3RhcnRFbGVtZW50QW5kTW91c2VMZWZ0OiBudW1iZXI7XG4gIGVsZW1lbnRDb250YWluZXI/OiBIVE1MRWxlbWVudDtcbiAgZHJhZ0JvdW5kYXJ5PzogYm9vbGVhbjtcbiAgZHJhZ0JvdW5kYXJ5QWNjZXB0TW91c2VMZWF2ZUNvbnRhaW5lcj86IGJvb2xlYW47XG4gIGlnbm9yZVN0b3BFdmVudD86IGJvb2xlYW47XG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW50ZXJmYWNlIGZvciB2aXJ0dWFsIHNjcm9sbGluZyBkcmFnIG9wZXJhdGlvbnMsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgZHJhZyBib3VuZGFyaWVzIGFuZCBjb250YWluZXIgZWxlbWVudHMnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSU1vdXNlUG9zaXRpb24nLFxuICAgICAgY29kZTogYGludGVyZmFjZSBJTW91c2VQb3NpdGlvbiB7XG4gIGNsaWVudFg6IG51bWJlcjtcbiAgY2xpZW50WTogbnVtYmVyO1xufWAsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ludGVyZmFjZSByZXByZXNlbnRpbmcgbW91c2UgcG9zaXRpb24gY29vcmRpbmF0ZXMnXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSURyYWdEcm9wRnVuY3Rpb25Db250cm9sRXZlbnQnLFxuICAgICAgY29kZTogYGludGVyZmFjZSBJRHJhZ0Ryb3BGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gIHNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1gLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmZhY2UgZm9yIGRyYWcgYW5kIGRyb3AgY29udHJvbCBmdW5jdGlvbnMnXG4gICAgfVxuICBdO1xuXG4gIC8vIEZlYXR1cmVzXG4gIGZlYXR1cmVzID0gW1xuICAgIHtcbiAgICAgIGlkOiAxLFxuICAgICAgaWNvbjogJ/CflIQnLFxuICAgICAgdGl0bGU6ICdGbGV4aWJsZSBEcmFnIGFuZCBEcm9wJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU3VwcG9ydCBmb3IgY29udGFpbmVyLXRvLWNvbnRhaW5lciBkcmFnZ2luZyB3aXRoIGN1c3RvbWl6YWJsZSBncm91cCBuYW1lcyBhbmQgZHJvcCB6b25lcydcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAyLFxuICAgICAgaWNvbjogJ/Cfk5wnLFxuICAgICAgdGl0bGU6ICdWaXJ0dWFsIFNjcm9sbGluZycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0VmZmljaWVudCBoYW5kbGluZyBvZiBsYXJnZSBsaXN0cyB3aXRoIHZpcnR1YWwgc2Nyb2xsaW5nIHN1cHBvcnQnXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogMyxcbiAgICAgIGljb246ICfwn46vJyxcbiAgICAgIHRpdGxlOiAnQ3VzdG9tIEJvdW5kYXJpZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdEZWZpbmUgY3VzdG9tIGRyYWcgYm91bmRhcmllcyBhbmQgZHJvcCB6b25lcyBmb3IgcHJlY2lzZSBjb250cm9sJ1xuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IDQsXG4gICAgICBpY29uOiAn8J+OqCcsXG4gICAgICB0aXRsZTogJ1N0eWxpbmcgT3B0aW9ucycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0N1c3RvbWl6YWJsZSBzdHlsZXMgZm9yIGRyYWcgaXRlbXMgYW5kIGNvbnRhaW5lcnMnXG4gICAgfVxuICBdO1xuXG4gIC8vIENvZGUgRXhhbXBsZXNcbiAgY29kZUV4YW1wbGVzID0gW1xuICAgIHtcbiAgICAgIGlkOiAxLFxuICAgICAgdGl0bGU6ICdCYXNpYyBVc2FnZScsXG4gICAgICBjb2RlOiBgJmx0O2RpdiBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSBcbiAgWyhpdGVtcyldPVwiaXRlbXNcIlxuICBbZ3JvdXBOYW1lXT1cIidteUdyb3VwJ1wiXG4gIFthY2NlcHREcmFnU2FtZUdyb3VwXT1cInRydWVcIiZndDtcbiAgQGZvciAoaXRlbSBvZiBpdGVtczsgdHJhY2sgaXRlbSkge1xuICAgICZsdDtkaXYgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUmZ3Q7XG4gICAgICB7eyBpdGVtIH19XG4gICAgJmx0Oy9kaXYmZ3Q7XG4gIH1cbiZsdDsvZGl2Jmd0O2BcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAyLFxuICAgICAgdGl0bGU6ICdDb250YWluZXItdG8tQ29udGFpbmVyJyxcbiAgICAgIGNvZGU6IGAmbHQ7ZGl2IExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlIFxuICBbKGl0ZW1zKV09XCJzb3VyY2VJdGVtc1wiXG4gIFtncm91cE5hbWVdPVwiJ3NvdXJjZSdcIiZndDtcbiAgQGZvciAoaXRlbSBvZiBzb3VyY2VJdGVtczsgdHJhY2sgaXRlbSkge1xuICAgICZsdDtkaXYgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUmZ3Q7XG4gICAgICB7eyBpdGVtIH19XG4gICAgJmx0Oy9kaXYmZ3Q7XG4gIH1cbiZsdDsvZGl2Jmd0O1xuXG4mbHQ7ZGl2IExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlIFxuICBbKGl0ZW1zKV09XCJ0YXJnZXRJdGVtc1wiXG4gIFtncm91cE5hbWVdPVwiJ3RhcmdldCdcIlxuICBbZHJvcFRvR3JvdXBOYW1lXT1cIlsnc291cmNlJ11cIiZndDtcbiAgQGZvciAoaXRlbSBvZiB0YXJnZXRJdGVtczsgdHJhY2sgaXRlbSkge1xuICAgICZsdDtkaXYgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUmZ3Q7XG4gICAgICB7eyBpdGVtIH19XG4gICAgJmx0Oy9kaXYmZ3Q7XG4gIH1cbiZsdDsvZGl2Jmd0O2BcbiAgICB9XTtcblxuICAvKipcbiAgICogQ29weSB0ZXh0IHRvIGNsaXBib2FyZFxuICAgKi9cbiAgY29weVRvQ2xpcGJvYXJkKHRleHQ6IHN0cmluZykge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGFsZXJ0KCdDb3BpZWQgdG8gY2xpcGJvYXJkJyk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgY29weSB0ZXh0OiAnLCBlcnIpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn0gIl19