@decaf-ts/for-angular 0.0.11 → 0.0.13
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/package.json +19 -91
- package/LICENSE.md +0 -659
- package/dist/lib/README.md +0 -92
- package/dist/lib/assets/i18n/en.json +0 -140
- package/dist/lib/assets/images/angular-logo.svg +0 -45
- package/dist/lib/assets/images/decaf-logo-black.svg +0 -22
- package/dist/lib/assets/images/decaf-logo-lw.svg +0 -50
- package/dist/lib/assets/images/decaf-logo-white.svg +0 -22
- package/dist/lib/assets/images/decaf-logo.svg +0 -54
- package/dist/lib/components/component-renderer/component-renderer.component.d.ts +0 -276
- package/dist/lib/components/crud-field/crud-field.component.d.ts +0 -445
- package/dist/lib/components/crud-form/constants.d.ts +0 -5
- package/dist/lib/components/crud-form/crud-form.component.d.ts +0 -102
- package/dist/lib/components/crud-form/types.d.ts +0 -17
- package/dist/lib/components/empty-state/empty-state.component.d.ts +0 -301
- package/dist/lib/components/fieldset/fieldset.component.d.ts +0 -199
- package/dist/lib/components/filter/filter.component.d.ts +0 -505
- package/dist/lib/components/for-angular-components.module.d.ts +0 -20
- package/dist/lib/components/index.d.ts +0 -16
- package/dist/lib/components/layout/layout.component.d.ts +0 -133
- package/dist/lib/components/list/constants.d.ts +0 -29
- package/dist/lib/components/list/list.component.d.ts +0 -849
- package/dist/lib/components/list-item/list-item.component.d.ts +0 -390
- package/dist/lib/components/model-renderer/model-renderer.component.d.ts +0 -96
- package/dist/lib/components/pagination/constants.d.ts +0 -7
- package/dist/lib/components/pagination/pagination.component.d.ts +0 -264
- package/dist/lib/components/searchbar/searchbar.component.d.ts +0 -407
- package/dist/lib/directives/collapsable.directive.d.ts +0 -8
- package/dist/lib/directives/index.d.ts +0 -1
- package/dist/lib/engine/DynamicModule.d.ts +0 -17
- package/dist/lib/engine/NgxBaseComponent.d.ts +0 -541
- package/dist/lib/engine/NgxCrudFormField.d.ts +0 -118
- package/dist/lib/engine/NgxFormService.d.ts +0 -167
- package/dist/lib/engine/NgxRenderingEngine.d.ts +0 -127
- package/dist/lib/engine/NgxRenderingEngine2.d.ts +0 -250
- package/dist/lib/engine/ValidatorFactory.d.ts +0 -15
- package/dist/lib/engine/constants.d.ts +0 -151
- package/dist/lib/engine/decorators.d.ts +0 -25
- package/dist/lib/engine/index.d.ts +0 -16
- package/dist/lib/engine/types.d.ts +0 -381
- package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +0 -313
- package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +0 -301
- package/dist/lib/esm2022/components/crud-form/constants.mjs +0 -14
- package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +0 -139
- package/dist/lib/esm2022/components/crud-form/types.mjs +0 -2
- package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +0 -348
- package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +0 -225
- package/dist/lib/esm2022/components/filter/filter.component.mjs +0 -689
- package/dist/lib/esm2022/components/for-angular-components.module.mjs +0 -71
- package/dist/lib/esm2022/components/index.mjs +0 -20
- package/dist/lib/esm2022/components/layout/layout.component.mjs +0 -176
- package/dist/lib/esm2022/components/list/constants.mjs +0 -6
- package/dist/lib/esm2022/components/list/list.component.mjs +0 -1236
- package/dist/lib/esm2022/components/list-item/list-item.component.mjs +0 -408
- package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +0 -138
- package/dist/lib/esm2022/components/pagination/constants.mjs +0 -2
- package/dist/lib/esm2022/components/pagination/pagination.component.mjs +0 -323
- package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +0 -493
- package/dist/lib/esm2022/decaf-ts-for-angular.mjs +0 -5
- package/dist/lib/esm2022/directives/collapsable.directive.mjs +0 -28
- package/dist/lib/esm2022/directives/index.mjs +0 -2
- package/dist/lib/esm2022/engine/DynamicModule.mjs +0 -18
- package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +0 -539
- package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +0 -125
- package/dist/lib/esm2022/engine/NgxFormService.mjs +0 -315
- package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +0 -192
- package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
- package/dist/lib/esm2022/engine/ValidatorFactory.mjs +0 -102
- package/dist/lib/esm2022/engine/constants.mjs +0 -160
- package/dist/lib/esm2022/engine/decorators.mjs +0 -38
- package/dist/lib/esm2022/engine/index.mjs +0 -17
- package/dist/lib/esm2022/engine/types.mjs +0 -4
- package/dist/lib/esm2022/for-angular.module.mjs +0 -118
- package/dist/lib/esm2022/helpers/index.mjs +0 -13
- package/dist/lib/esm2022/helpers/utils.mjs +0 -415
- package/dist/lib/esm2022/interfaces.mjs +0 -2
- package/dist/lib/esm2022/public-apis.mjs +0 -14
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs +0 -7109
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
- package/dist/lib/for-angular.module.d.ts +0 -45
- package/dist/lib/helpers/index.d.ts +0 -12
- package/dist/lib/helpers/utils.d.ts +0 -253
- package/dist/lib/index.d.ts +0 -5
- package/dist/lib/interfaces.d.ts +0 -28
- package/dist/lib/public-apis.d.ts +0 -13
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
import { Component, EnvironmentInjector, EventEmitter, inject, Input, Output, reflectComponentType, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
-
import { NgxRenderingEngine2 } from '../../engine/NgxRenderingEngine2';
|
|
3
|
-
import { ForAngularModule, getLogger } from '../../for-angular.module';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/common";
|
|
6
|
-
/**
|
|
7
|
-
* @description Dynamic component renderer for Decaf Angular applications.
|
|
8
|
-
* @summary This component provides a flexible way to dynamically render Angular components
|
|
9
|
-
* at runtime based on a tag name. It handles the creation, property binding, and event
|
|
10
|
-
* subscription for dynamically loaded components. This is particularly useful for
|
|
11
|
-
* building configurable UIs where components need to be determined at runtime.
|
|
12
|
-
*
|
|
13
|
-
* @component {ComponentRendererComponent}
|
|
14
|
-
* @example
|
|
15
|
-
* <ngx-decaf-component-renderer
|
|
16
|
-
* [tag]="tag"
|
|
17
|
-
* [globals]="globals"
|
|
18
|
-
* (listenEvent)="listenEvent($event)">
|
|
19
|
-
* </ngx-decaf-component-renderer>
|
|
20
|
-
*
|
|
21
|
-
* @mermaid
|
|
22
|
-
* classDiagram
|
|
23
|
-
* class ComponentRendererComponent {
|
|
24
|
-
* +ViewContainerRef vcr
|
|
25
|
-
* +string tag
|
|
26
|
-
* +Record~string, unknown~ globals
|
|
27
|
-
* +EnvironmentInjector injector
|
|
28
|
-
* +ComponentRef~unknown~ component
|
|
29
|
-
* +EventEmitter~RendererCustomEvent~ listenEvent
|
|
30
|
-
* +ngOnInit()
|
|
31
|
-
* +ngOnDestroy()
|
|
32
|
-
* +ngOnChanges(changes)
|
|
33
|
-
* -createComponent(tag, globals)
|
|
34
|
-
* -subscribeEvents()
|
|
35
|
-
* -unsubscribeEvents()
|
|
36
|
-
* }
|
|
37
|
-
* ComponentRendererComponent --|> OnInit
|
|
38
|
-
* ComponentRendererComponent --|> OnChanges
|
|
39
|
-
* ComponentRendererComponent --|> OnDestroy
|
|
40
|
-
*
|
|
41
|
-
* @implements {OnInit}
|
|
42
|
-
* @implements {OnChanges}
|
|
43
|
-
* @implements {OnDestroy}
|
|
44
|
-
*/
|
|
45
|
-
export class ComponentRendererComponent {
|
|
46
|
-
/**
|
|
47
|
-
* @description Creates an instance of ComponentRendererComponent.
|
|
48
|
-
* @summary Initializes a new ComponentRendererComponent. This component doesn't require
|
|
49
|
-
* any dependencies to be injected in its constructor as it uses the inject function to
|
|
50
|
-
* obtain the EnvironmentInjector.
|
|
51
|
-
*
|
|
52
|
-
* @memberOf ComponentRendererComponent
|
|
53
|
-
*/
|
|
54
|
-
constructor() {
|
|
55
|
-
/**
|
|
56
|
-
* @description Global properties to pass to the rendered component.
|
|
57
|
-
* @summary This input property allows passing a set of properties to the dynamically
|
|
58
|
-
* rendered component. These properties will be mapped to the component's inputs if they
|
|
59
|
-
* match. Properties that don't match any input on the target component will be filtered out
|
|
60
|
-
* with a warning.
|
|
61
|
-
*
|
|
62
|
-
* @type {Record<string, unknown>}
|
|
63
|
-
* @default {}
|
|
64
|
-
* @memberOf ComponentRendererComponent
|
|
65
|
-
*/
|
|
66
|
-
this.globals = {};
|
|
67
|
-
/**
|
|
68
|
-
* @description Injector used for dependency injection in the dynamic component.
|
|
69
|
-
* @summary This injector is used when creating the dynamic component to provide it with
|
|
70
|
-
* access to the application's dependency injection system. It ensures that the dynamically
|
|
71
|
-
* created component can access the same services and dependencies as statically created
|
|
72
|
-
* components.
|
|
73
|
-
*
|
|
74
|
-
* @type {EnvironmentInjector}
|
|
75
|
-
* @memberOf ComponentRendererComponent
|
|
76
|
-
*/
|
|
77
|
-
this.injector = inject(EnvironmentInjector);
|
|
78
|
-
/**
|
|
79
|
-
* @description Event emitter for events from the rendered component.
|
|
80
|
-
* @summary This output property emits events that originate from the dynamically rendered
|
|
81
|
-
* component. It allows the parent component to listen for and respond to events from the
|
|
82
|
-
* dynamic component, creating a communication channel between the parent and the dynamically
|
|
83
|
-
* rendered child.
|
|
84
|
-
*
|
|
85
|
-
* @type {EventEmitter<RendererCustomEvent>}
|
|
86
|
-
* @memberOf ComponentRendererComponent
|
|
87
|
-
*/
|
|
88
|
-
this.listenEvent = new EventEmitter();
|
|
89
|
-
this.parent = undefined;
|
|
90
|
-
this.logger = getLogger(this);
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* @description Initializes the component after Angular first displays the data-bound properties.
|
|
94
|
-
* @summary Sets up the component by creating the dynamic component specified by the tag input.
|
|
95
|
-
* This method is called once when the component is initialized and triggers the dynamic
|
|
96
|
-
* component creation process with the provided tag name and global properties.
|
|
97
|
-
*
|
|
98
|
-
* @mermaid
|
|
99
|
-
* sequenceDiagram
|
|
100
|
-
* participant A as Angular Lifecycle
|
|
101
|
-
* participant C as ComponentRendererComponent
|
|
102
|
-
* participant R as NgxRenderingEngine2
|
|
103
|
-
*
|
|
104
|
-
* A->>C: ngOnInit()
|
|
105
|
-
* C->>C: createComponent(tag, globals)
|
|
106
|
-
* C->>R: components(tag)
|
|
107
|
-
* R-->>C: Return component constructor
|
|
108
|
-
* C->>C: Process component inputs
|
|
109
|
-
* C->>C: Create component instance
|
|
110
|
-
* C->>C: subscribeEvents()
|
|
111
|
-
*
|
|
112
|
-
* @return {void}
|
|
113
|
-
* @memberOf ComponentRendererComponent
|
|
114
|
-
*/
|
|
115
|
-
ngOnInit() {
|
|
116
|
-
if (!this.parent) {
|
|
117
|
-
this.createComponent(this.tag, this.globals);
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
this.createParentComponent();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* @description Cleans up resources when the component is destroyed.
|
|
125
|
-
* @summary Performs cleanup operations when the component is being destroyed by Angular.
|
|
126
|
-
* This includes unsubscribing from all event emitters of the dynamic component and
|
|
127
|
-
* destroying the rendering engine instance to prevent memory leaks.
|
|
128
|
-
*
|
|
129
|
-
* @mermaid
|
|
130
|
-
* sequenceDiagram
|
|
131
|
-
* participant A as Angular Lifecycle
|
|
132
|
-
* participant C as ComponentRendererComponent
|
|
133
|
-
* participant R as NgxRenderingEngine2
|
|
134
|
-
*
|
|
135
|
-
* A->>C: ngOnDestroy()
|
|
136
|
-
* alt component exists
|
|
137
|
-
* C->>C: unsubscribeEvents()
|
|
138
|
-
* C->>R: destroy()
|
|
139
|
-
* end
|
|
140
|
-
*
|
|
141
|
-
* @return {Promise<void>} A promise that resolves when cleanup is complete
|
|
142
|
-
* @memberOf ComponentRendererComponent
|
|
143
|
-
*/
|
|
144
|
-
async ngOnDestroy() {
|
|
145
|
-
if (this.component) {
|
|
146
|
-
this.unsubscribeEvents();
|
|
147
|
-
NgxRenderingEngine2.destroy();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* @description Creates and renders a dynamic component.
|
|
152
|
-
* @summary This method handles the creation of a dynamic component based on the provided tag.
|
|
153
|
-
* It retrieves the component constructor from the rendering engine, processes its inputs,
|
|
154
|
-
* filters out unmapped properties, creates the component instance, and sets up event subscriptions.
|
|
155
|
-
*
|
|
156
|
-
* @param {string} tag - The tag name of the component to create
|
|
157
|
-
* @param {KeyValue} globals - Global properties to pass to the component
|
|
158
|
-
* @return {void}
|
|
159
|
-
*
|
|
160
|
-
* @mermaid
|
|
161
|
-
* sequenceDiagram
|
|
162
|
-
* participant C as ComponentRendererComponent
|
|
163
|
-
* participant R as NgxRenderingEngine2
|
|
164
|
-
* participant V as ViewContainerRef
|
|
165
|
-
*
|
|
166
|
-
* C->>R: components(tag)
|
|
167
|
-
* R-->>C: Return component constructor
|
|
168
|
-
* C->>C: reflectComponentType(component)
|
|
169
|
-
* C->>C: Process input properties
|
|
170
|
-
* C->>C: Filter unmapped properties
|
|
171
|
-
* C->>V: clear()
|
|
172
|
-
* C->>R: createComponent(component, props, metadata, vcr, injector, [])
|
|
173
|
-
* R-->>C: Return component reference
|
|
174
|
-
* C->>C: subscribeEvents()
|
|
175
|
-
*
|
|
176
|
-
* @private
|
|
177
|
-
* @memberOf ComponentRendererComponent
|
|
178
|
-
*/
|
|
179
|
-
createComponent(tag, globals = {}) {
|
|
180
|
-
const component = NgxRenderingEngine2.components(tag)
|
|
181
|
-
?.constructor;
|
|
182
|
-
const metadata = reflectComponentType(component);
|
|
183
|
-
const componentInputs = metadata.inputs;
|
|
184
|
-
const props = globals?.['item'] || globals?.['props'] || {};
|
|
185
|
-
if (props?.['tag'])
|
|
186
|
-
delete props['tag'];
|
|
187
|
-
const inputKeys = Object.keys(props);
|
|
188
|
-
const unmappedKeys = [];
|
|
189
|
-
for (const input of inputKeys) {
|
|
190
|
-
if (!inputKeys.length)
|
|
191
|
-
break;
|
|
192
|
-
const prop = componentInputs.find((item) => item.propName === input);
|
|
193
|
-
if (!prop) {
|
|
194
|
-
delete props[input];
|
|
195
|
-
unmappedKeys.push(input);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
this.vcr.clear();
|
|
199
|
-
this.component = NgxRenderingEngine2.createComponent(component, props, metadata, this.vcr, this.injector, []);
|
|
200
|
-
this.subscribeEvents();
|
|
201
|
-
}
|
|
202
|
-
createParentComponent() {
|
|
203
|
-
const { component, inputs } = this.parent;
|
|
204
|
-
const metadata = reflectComponentType(component);
|
|
205
|
-
const template = this.vcr.createEmbeddedView(this.inner, this.injector).rootNodes;
|
|
206
|
-
this.component = NgxRenderingEngine2.createComponent(component, inputs, metadata, this.vcr, this.injector, template);
|
|
207
|
-
this.subscribeEvents();
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* @description Subscribes to events emitted by the dynamic component.
|
|
211
|
-
* @summary This method sets up subscriptions to all EventEmitter properties of the
|
|
212
|
-
* dynamically created component. When an event is emitted by the dynamic component,
|
|
213
|
-
* it is captured and re-emitted through the listenEvent output property with additional
|
|
214
|
-
* metadata about the event source.
|
|
215
|
-
*
|
|
216
|
-
* @mermaid
|
|
217
|
-
* sequenceDiagram
|
|
218
|
-
* participant C as ComponentRendererComponent
|
|
219
|
-
* participant D as Dynamic Component
|
|
220
|
-
* participant P as Parent Component
|
|
221
|
-
*
|
|
222
|
-
* C->>C: subscribeEvents()
|
|
223
|
-
* C->>D: Get instance properties
|
|
224
|
-
* loop For each property
|
|
225
|
-
* C->>C: Check if property is EventEmitter
|
|
226
|
-
* alt is EventEmitter
|
|
227
|
-
* C->>D: Subscribe to event
|
|
228
|
-
* D-->>C: Event emitted
|
|
229
|
-
* C->>P: Re-emit event with metadata
|
|
230
|
-
* end
|
|
231
|
-
* end
|
|
232
|
-
*
|
|
233
|
-
* @private
|
|
234
|
-
* @return {void}
|
|
235
|
-
* @memberOf ComponentRendererComponent
|
|
236
|
-
*/
|
|
237
|
-
subscribeEvents() {
|
|
238
|
-
if (this.component) {
|
|
239
|
-
const instance = this.component?.instance;
|
|
240
|
-
const componentKeys = Object.keys(instance);
|
|
241
|
-
for (const key of componentKeys) {
|
|
242
|
-
const value = instance[key];
|
|
243
|
-
if (value instanceof EventEmitter)
|
|
244
|
-
instance[key].subscribe((event) => {
|
|
245
|
-
this.listenEvent.emit({
|
|
246
|
-
name: key,
|
|
247
|
-
...event,
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* @description Unsubscribes from all events of the dynamic component.
|
|
255
|
-
* @summary This method cleans up event subscriptions when the component is being destroyed.
|
|
256
|
-
* It iterates through all properties of the dynamic component instance and unsubscribes
|
|
257
|
-
* from any EventEmitter properties to prevent memory leaks and unexpected behavior after
|
|
258
|
-
* the component is destroyed.
|
|
259
|
-
*
|
|
260
|
-
* @mermaid
|
|
261
|
-
* sequenceDiagram
|
|
262
|
-
* participant C as ComponentRendererComponent
|
|
263
|
-
* participant D as Dynamic Component
|
|
264
|
-
*
|
|
265
|
-
* C->>C: unsubscribeEvents()
|
|
266
|
-
* C->>D: Get instance properties
|
|
267
|
-
* loop For each property
|
|
268
|
-
* C->>C: Check if property is EventEmitter
|
|
269
|
-
* alt is EventEmitter
|
|
270
|
-
* C->>D: Unsubscribe from event
|
|
271
|
-
* end
|
|
272
|
-
* end
|
|
273
|
-
*
|
|
274
|
-
* @private
|
|
275
|
-
* @return {void}
|
|
276
|
-
* @memberOf ComponentRendererComponent
|
|
277
|
-
*/
|
|
278
|
-
unsubscribeEvents() {
|
|
279
|
-
if (this.component) {
|
|
280
|
-
const instance = this.component?.instance;
|
|
281
|
-
const componentKeys = Object.keys(instance);
|
|
282
|
-
for (const key of componentKeys) {
|
|
283
|
-
const value = instance[key];
|
|
284
|
-
if (value instanceof EventEmitter)
|
|
285
|
-
instance[key].unsubscribe();
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComponentRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
290
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ComponentRendererComponent, isStandalone: true, selector: "ngx-decaf-component-renderer", inputs: { tag: "tag", globals: "globals", model: "model", parent: "parent" }, outputs: { listenEvent: "listenEvent" }, viewQueries: [{ propertyName: "vcr", first: true, predicate: ["componentViewContainer"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<ng-template #componentViewContainer></ng-template>\n\n<ng-template #inner>\n @if(parent?.children?.length) {\n @for(child of parent.children; track child) {\n @if(!child.children?.length) {\n <ng-container\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n } @else {\n <ngx-decaf-component-renderer [parent]=\"child\"> </ngx-decaf-component-renderer>\n }\n }\n }\n</ng-template>\n\n\n", styles: [""], dependencies: [{ kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }, { kind: "ngmodule", type: ForAngularModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }] }); }
|
|
291
|
-
}
|
|
292
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComponentRendererComponent, decorators: [{
|
|
293
|
-
type: Component,
|
|
294
|
-
args: [{ selector: 'ngx-decaf-component-renderer', imports: [ForAngularModule], standalone: true, template: "<ng-template #componentViewContainer></ng-template>\n\n<ng-template #inner>\n @if(parent?.children?.length) {\n @for(child of parent.children; track child) {\n @if(!child.children?.length) {\n <ng-container\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n } @else {\n <ngx-decaf-component-renderer [parent]=\"child\"> </ngx-decaf-component-renderer>\n }\n }\n }\n</ng-template>\n\n\n" }]
|
|
295
|
-
}], ctorParameters: () => [], propDecorators: { vcr: [{
|
|
296
|
-
type: ViewChild,
|
|
297
|
-
args: ['componentViewContainer', { static: true, read: ViewContainerRef }]
|
|
298
|
-
}], tag: [{
|
|
299
|
-
type: Input,
|
|
300
|
-
args: [{ required: true }]
|
|
301
|
-
}], globals: [{
|
|
302
|
-
type: Input
|
|
303
|
-
}], listenEvent: [{
|
|
304
|
-
type: Output
|
|
305
|
-
}], model: [{
|
|
306
|
-
type: Input
|
|
307
|
-
}], parent: [{
|
|
308
|
-
type: Input
|
|
309
|
-
}], inner: [{
|
|
310
|
-
type: ViewChild,
|
|
311
|
-
args: ['inner', { read: TemplateRef, static: true }]
|
|
312
|
-
}] } });
|
|
313
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixNQUFNLEVBRU4sS0FBSyxFQUdMLE1BQU0sRUFDTixvQkFBb0IsRUFDcEIsV0FBVyxFQUVYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFJdkU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBUUgsTUFBTSxPQUFPLDBCQUEwQjtJQTRHckM7Ozs7Ozs7T0FPRztJQUNIO1FBeEZBOzs7Ozs7Ozs7O1dBVUc7UUFFSCxZQUFPLEdBQTRCLEVBQUUsQ0FBQztRQUV0Qzs7Ozs7Ozs7O1dBU0c7UUFDSCxhQUFRLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBYTVEOzs7Ozs7Ozs7V0FTRztRQUVILGdCQUFXLEdBQ1QsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUF5QjFDLFdBQU0sR0FBeUIsU0FBUyxDQUFDO1FBZXZDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXNC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VSwwQkFBMEI7bUdBQTFCLDBCQUEwQix5U0FXc0IsZ0JBQWdCLHVHQThGL0MsV0FBVywyQ0MvS3pDLCttQkFzQkEsMEREZ0RhLDBCQUEwQixpSkFIM0IsZ0JBQWdCOzs0RkFHZiwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0UsOEJBQThCLFdBRy9CLENBQUMsZ0JBQWdCLENBQUMsY0FDZixJQUFJO3dEQWNoQixHQUFHO3NCQURGLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFlN0UsR0FBRztzQkFERixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFlekIsT0FBTztzQkFETixLQUFLO2dCQXFDTixXQUFXO3NCQURWLE1BQU07Z0JBd0JQLEtBQUs7c0JBREosS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBS04sS0FBSztzQkFESixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50TWlycm9yLFxuICBDb21wb25lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIHJlZmxlY3RDb21wb25lbnRUeXBlLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neFJlbmRlcmluZ0VuZ2luZTIgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4UmVuZGVyaW5nRW5naW5lMic7XG5pbXBvcnQgeyBCYXNlQ3VzdG9tRXZlbnQsIEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUsIGdldExvZ2dlciB9IGZyb20gJy4uLy4uL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZGVjYWYtdHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIER5bmFtaWMgY29tcG9uZW50IHJlbmRlcmVyIGZvciBEZWNhZiBBbmd1bGFyIGFwcGxpY2F0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZmxleGlibGUgd2F5IHRvIGR5bmFtaWNhbGx5IHJlbmRlciBBbmd1bGFyIGNvbXBvbmVudHNcbiAqIGF0IHJ1bnRpbWUgYmFzZWQgb24gYSB0YWcgbmFtZS4gSXQgaGFuZGxlcyB0aGUgY3JlYXRpb24sIHByb3BlcnR5IGJpbmRpbmcsIGFuZCBldmVudFxuICogc3Vic2NyaXB0aW9uIGZvciBkeW5hbWljYWxseSBsb2FkZWQgY29tcG9uZW50cy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvclxuICogYnVpbGRpbmcgY29uZmlndXJhYmxlIFVJcyB3aGVyZSBjb21wb25lbnRzIG5lZWQgdG8gYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLlxuICpcbiAqIEBjb21wb25lbnQge0NvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50fVxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyXG4gKiAgIFt0YWddPVwidGFnXCJcbiAqICAgW2dsb2JhbHNdPVwiZ2xvYmFsc1wiXG4gKiAgIChsaXN0ZW5FdmVudCk9XCJsaXN0ZW5FdmVudCgkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXI+XG4gKlxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB7XG4gKiAgICAgK1ZpZXdDb250YWluZXJSZWYgdmNyXG4gKiAgICAgK3N0cmluZyB0YWdcbiAqICAgICArUmVjb3JkfnN0cmluZywgdW5rbm93bn4gZ2xvYmFsc1xuICogICAgICtFbnZpcm9ubWVudEluamVjdG9yIGluamVjdG9yXG4gKiAgICAgK0NvbXBvbmVudFJlZn51bmtub3dufiBjb21wb25lbnRcbiAqICAgICArRXZlbnRFbWl0dGVyflJlbmRlcmVyQ3VzdG9tRXZlbnR+IGxpc3RlbkV2ZW50XG4gKiAgICAgK25nT25Jbml0KClcbiAqICAgICArbmdPbkRlc3Ryb3koKVxuICogICAgICtuZ09uQ2hhbmdlcyhjaGFuZ2VzKVxuICogICAgIC1jcmVhdGVDb21wb25lbnQodGFnLCBnbG9iYWxzKVxuICogICAgIC1zdWJzY3JpYmVFdmVudHMoKVxuICogICAgIC11bnN1YnNjcmliZUV2ZW50cygpXG4gKiAgIH1cbiAqICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgLS18PiBPbkluaXRcbiAqICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgLS18PiBPbkNoYW5nZXNcbiAqICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgLS18PiBPbkRlc3Ryb3lcbiAqXG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICogQGltcGxlbWVudHMge09uQ2hhbmdlc31cbiAqIEBpbXBsZW1lbnRzIHtPbkRlc3Ryb3l9XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtGb3JBbmd1bGFyTW9kdWxlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBjb250YWluZXIgd2hlcmUgdGhlIGR5bmFtaWMgY29tcG9uZW50IHdpbGwgYmUgcmVuZGVyZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgVmlld0NvbnRhaW5lclJlZiBwcm92aWRlcyB0aGUgY29udGFpbmVyIHdoZXJlIHRoZSBkeW5hbWljYWxseSBjcmVhdGVkXG4gICAqIGNvbXBvbmVudCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIERPTS4gSXQncyBtYXJrZWQgYXMgc3RhdGljIHRvIGVuc3VyZSBpdCdzIGF2YWlsYWJsZVxuICAgKiBkdXJpbmcgdGhlIG5nT25Jbml0IGxpZmVjeWNsZSBob29rIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAdHlwZSB7Vmlld0NvbnRhaW5lclJlZn1cbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnRWaWV3Q29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgdmNyITogVmlld0NvbnRhaW5lclJlZjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0YWcgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGR5bmFtaWNhbGx5IHJlbmRlcmVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIGlucHV0IHByb3BlcnR5IHNwZWNpZmllcyB3aGljaCBjb21wb25lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGJ5IHByb3ZpZGluZ1xuICAgKiBpdHMgcmVnaXN0ZXJlZCB0YWcgbmFtZS4gVGhlIHRhZyBtdXN0IGNvcnJlc3BvbmQgdG8gYSBjb21wb25lbnQgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5neFJlbmRlcmluZ0VuZ2luZTIuIFRoaXMgaXMgYSByZXF1aXJlZCBpbnB1dCBhcyBpdCBkZXRlcm1pbmVzIHdoaWNoIGNvbXBvbmVudFxuICAgKiB0byBjcmVhdGUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEByZXF1aXJlZFxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHRhZyE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmVkIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBpbnB1dCBwcm9wZXJ0eSBhbGxvd3MgcGFzc2luZyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIHRoZSBkeW5hbWljYWxseVxuICAgKiByZW5kZXJlZCBjb21wb25lbnQuIFRoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIGNvbXBvbmVudCdzIGlucHV0cyBpZiB0aGV5XG4gICAqIG1hdGNoLiBQcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IGlucHV0IG9uIHRoZSB0YXJnZXQgY29tcG9uZW50IHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gICAqIHdpdGggYSB3YXJuaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqIEBkZWZhdWx0IHt9XG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2xvYmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluamVjdG9yIHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIHRoZSBkeW5hbWljIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBpbmplY3RvciBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGR5bmFtaWMgY29tcG9uZW50IHRvIHByb3ZpZGUgaXQgd2l0aFxuICAgKiBhY2Nlc3MgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtLiBJdCBlbnN1cmVzIHRoYXQgdGhlIGR5bmFtaWNhbGx5XG4gICAqIGNyZWF0ZWQgY29tcG9uZW50IGNhbiBhY2Nlc3MgdGhlIHNhbWUgc2VydmljZXMgYW5kIGRlcGVuZGVuY2llcyBhcyBzdGF0aWNhbGx5IGNyZWF0ZWRcbiAgICogY29tcG9uZW50cy5cbiAgICpcbiAgICogQHR5cGUge0Vudmlyb25tZW50SW5qZWN0b3J9XG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIHByb3BlcnR5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBDb21wb25lbnRSZWYgb2YgdGhlIGR5bmFtaWNhbGx5IGNyZWF0ZWRcbiAgICogY29tcG9uZW50LiBJdCdzIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgY29tcG9uZW50IGluc3RhbmNlLCBzdWJzY3JpYmUgdG8gaXRzIGV2ZW50cyxcbiAgICogYW5kIHByb3Blcmx5IGRlc3Ryb3kgaXQgd2hlbiB0aGUgcmVuZGVyZXIgaXMgZGVzdHJveWVkLlxuICAgKlxuICAgKiBAdHlwZSB7Q29tcG9uZW50UmVmPHVua25vd24+fVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudCE6IENvbXBvbmVudFJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIGV2ZW50cyBmcm9tIHRoZSByZW5kZXJlZCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgb3V0cHV0IHByb3BlcnR5IGVtaXRzIGV2ZW50cyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoZSBkeW5hbWljYWxseSByZW5kZXJlZFxuICAgKiBjb21wb25lbnQuIEl0IGFsbG93cyB0aGUgcGFyZW50IGNvbXBvbmVudCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIGV2ZW50cyBmcm9tIHRoZVxuICAgKiBkeW5hbWljIGNvbXBvbmVudCwgY3JlYXRpbmcgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCB0aGUgZHluYW1pY2FsbHlcbiAgICogcmVuZGVyZWQgY2hpbGQuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50OiBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBwcm9wZXJ0eSBob2xkcyBhIExvZ2dlciBpbnN0YW5jZSBzcGVjaWZpYyB0byB0aGlzIGNvbXBvbmVudC5cbiAgICogSXQncyB1c2VkIHRvIGxvZyBpbmZvcm1hdGlvbiwgd2FybmluZ3MsIGFuZCBlcnJvcnMgcmVsYXRlZCB0byB0aGUgY29tcG9uZW50J3NcbiAgICogb3BlcmF0aW9ucywgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIHRoZSBkeW5hbWljXG4gICAqIGNvbXBvbmVudCByZW5kZXJpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogQHR5cGUge0xvZ2dlcn1cbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IG1vZGVsIGZvciBkYXRhIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFRoZSBkYXRhIG1vZGVsIHJlcG9zaXRvcnkgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgQElucHV0KClcbiAgbW9kZWwhOiAgTW9kZWwgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcGFyZW50OiB1bmRlZmluZWQgfCBLZXlWYWx1ZSA9IHVuZGVmaW5lZDtcblxuXG4gIEBWaWV3Q2hpbGQoJ2lubmVyJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGlubmVyPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudC4gVGhpcyBjb21wb25lbnQgZG9lc24ndCByZXF1aXJlXG4gICAqIGFueSBkZXBlbmRlbmNpZXMgdG8gYmUgaW5qZWN0ZWQgaW4gaXRzIGNvbnN0cnVjdG9yIGFzIGl0IHVzZXMgdGhlIGluamVjdCBmdW5jdGlvbiB0b1xuICAgKiBvYnRhaW4gdGhlIEVudmlyb25tZW50SW5qZWN0b3IuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBnZXRMb2dnZXIodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBmaXJzdCBkaXNwbGF5cyB0aGUgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgY3JlYXRpbmcgdGhlIGR5bmFtaWMgY29tcG9uZW50IHNwZWNpZmllZCBieSB0aGUgdGFnIGlucHV0LlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB3aGVuIHRoZSBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQgYW5kIHRyaWdnZXJzIHRoZSBkeW5hbWljXG4gICAqIGNvbXBvbmVudCBjcmVhdGlvbiBwcm9jZXNzIHdpdGggdGhlIHByb3ZpZGVkIHRhZyBuYW1lIGFuZCBnbG9iYWwgcHJvcGVydGllcy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIE5neFJlbmRlcmluZ0VuZ2luZTJcbiAgICpcbiAgICogICBBLT4+QzogbmdPbkluaXQoKVxuICAgKiAgIEMtPj5DOiBjcmVhdGVDb21wb25lbnQodGFnLCBnbG9iYWxzKVxuICAgKiAgIEMtPj5SOiBjb21wb25lbnRzKHRhZylcbiAgICogICBSLS0+PkM6IFJldHVybiBjb21wb25lbnQgY29uc3RydWN0b3JcbiAgICogICBDLT4+QzogUHJvY2VzcyBjb21wb25lbnQgaW5wdXRzXG4gICAqICAgQy0+PkM6IENyZWF0ZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICogICBDLT4+Qzogc3Vic2NyaWJlRXZlbnRzKClcbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnRhZywgdGhpcy5nbG9iYWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVQYXJlbnRDb21wb25lbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFucyB1cCByZXNvdXJjZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyBkZXN0cm95ZWQgYnkgQW5ndWxhci5cbiAgICogVGhpcyBpbmNsdWRlcyB1bnN1YnNjcmliaW5nIGZyb20gYWxsIGV2ZW50IGVtaXR0ZXJzIG9mIHRoZSBkeW5hbWljIGNvbXBvbmVudCBhbmRcbiAgICogZGVzdHJveWluZyB0aGUgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIE5neFJlbmRlcmluZ0VuZ2luZTJcbiAgICpcbiAgICogICBBLT4+QzogbmdPbkRlc3Ryb3koKVxuICAgKiAgIGFsdCBjb21wb25lbnQgZXhpc3RzXG4gICAqICAgICBDLT4+QzogdW5zdWJzY3JpYmVFdmVudHMoKVxuICAgKiAgICAgQy0+PlI6IGRlc3Ryb3koKVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNsZWFudXAgaXMgY29tcGxldGVcbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uRGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgIE5neFJlbmRlcmluZ0VuZ2luZTIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbmQgcmVuZGVycyBhIGR5bmFtaWMgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBhIGR5bmFtaWMgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBwcm92aWRlZCB0YWcuXG4gICAqIEl0IHJldHJpZXZlcyB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlbmRlcmluZyBlbmdpbmUsIHByb2Nlc3NlcyBpdHMgaW5wdXRzLFxuICAgKiBmaWx0ZXJzIG91dCB1bm1hcHBlZCBwcm9wZXJ0aWVzLCBjcmVhdGVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2UsIGFuZCBzZXRzIHVwIGV2ZW50IHN1YnNjcmlwdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgLSBUaGUgdGFnIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHtLZXlWYWx1ZX0gZ2xvYmFscyAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBOZ3hSZW5kZXJpbmdFbmdpbmUyXG4gICAqICAgcGFydGljaXBhbnQgViBhcyBWaWV3Q29udGFpbmVyUmVmXG4gICAqXG4gICAqICAgQy0+PlI6IGNvbXBvbmVudHModGFnKVxuICAgKiAgIFItLT4+QzogUmV0dXJuIGNvbXBvbmVudCBjb25zdHJ1Y3RvclxuICAgKiAgIEMtPj5DOiByZWZsZWN0Q29tcG9uZW50VHlwZShjb21wb25lbnQpXG4gICAqICAgQy0+PkM6IFByb2Nlc3MgaW5wdXQgcHJvcGVydGllc1xuICAgKiAgIEMtPj5DOiBGaWx0ZXIgdW5tYXBwZWQgcHJvcGVydGllc1xuICAgKiAgIEMtPj5WOiBjbGVhcigpXG4gICAqICAgQy0+PlI6IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHByb3BzLCBtZXRhZGF0YSwgdmNyLCBpbmplY3RvciwgW10pXG4gICAqICAgUi0tPj5DOiBSZXR1cm4gY29tcG9uZW50IHJlZmVyZW5jZVxuICAgKiAgIEMtPj5DOiBzdWJzY3JpYmVFdmVudHMoKVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50KHRhZzogc3RyaW5nLCBnbG9iYWxzOiBLZXlWYWx1ZSA9IHt9KTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gTmd4UmVuZGVyaW5nRW5naW5lMi5jb21wb25lbnRzKHRhZylcbiAgICAgID8uY29uc3RydWN0b3IgYXMgVHlwZTx1bmtub3duPjtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHJlZmxlY3RDb21wb25lbnRUeXBlKGNvbXBvbmVudCk7XG4gICAgY29uc3QgY29tcG9uZW50SW5wdXRzID0gKG1ldGFkYXRhIGFzIENvbXBvbmVudE1pcnJvcjx1bmtub3duPikuaW5wdXRzO1xuICAgIGNvbnN0IHByb3BzID0gZ2xvYmFscz8uWydpdGVtJ10gfHwgZ2xvYmFscz8uWydwcm9wcyddIHx8IHt9O1xuICAgIGlmKHByb3BzPy5bJ3RhZyddKVxuICAgICAgZGVsZXRlIHByb3BzWyd0YWcnXTtcbiAgICBjb25zdCBpbnB1dEtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgY29uc3QgdW5tYXBwZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dEtleXMpIHtcbiAgICAgIGlmICghaW5wdXRLZXlzLmxlbmd0aCkgYnJlYWs7XG4gICAgICBjb25zdCBwcm9wID0gY29tcG9uZW50SW5wdXRzLmZpbmQoXG4gICAgICAgIChpdGVtOiB7IHByb3BOYW1lOiBzdHJpbmcgfSkgPT4gaXRlbS5wcm9wTmFtZSA9PT0gaW5wdXQsXG4gICAgICApO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIGRlbGV0ZSBwcm9wc1tpbnB1dF07XG4gICAgICAgIHVubWFwcGVkS2V5cy5wdXNoKGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52Y3IuY2xlYXIoKTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IE5neFJlbmRlcmluZ0VuZ2luZTIuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgY29tcG9uZW50LFxuICAgICAgcHJvcHMsXG4gICAgICBtZXRhZGF0YSBhcyBDb21wb25lbnRNaXJyb3I8dW5rbm93bj4sXG4gICAgICB0aGlzLnZjcixcbiAgICAgIHRoaXMuaW5qZWN0b3IgYXMgSW5qZWN0b3IsXG4gICAgICBbXSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKCk7XG4gIH1cblxuICBjcmVhdGVQYXJlbnRDb21wb25lbnQoKSB7XG4gICAgY29uc3QgeyBjb21wb25lbnQsIGlucHV0cyB9ID0gdGhpcy5wYXJlbnQgYXMgS2V5VmFsdWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSByZWZsZWN0Q29tcG9uZW50VHlwZShjb21wb25lbnQpIGFzIENvbXBvbmVudE1pcnJvcjx1bmtub3duPjtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudmNyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmlubmVyIGFzIFRlbXBsYXRlUmVmPHVua25vd24+LCB0aGlzLmluamVjdG9yKS5yb290Tm9kZXM7XG4gICAgdGhpcy5jb21wb25lbnQgPSBOZ3hSZW5kZXJpbmdFbmdpbmUyLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGlucHV0cyxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgdGhpcy52Y3IsXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgdGVtcGxhdGUsXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmliZUV2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJzY3JpYmVzIHRvIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSBkeW5hbWljIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2V0cyB1cCBzdWJzY3JpcHRpb25zIHRvIGFsbCBFdmVudEVtaXR0ZXIgcHJvcGVydGllcyBvZiB0aGVcbiAgICogZHluYW1pY2FsbHkgY3JlYXRlZCBjb21wb25lbnQuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCBieSB0aGUgZHluYW1pYyBjb21wb25lbnQsXG4gICAqIGl0IGlzIGNhcHR1cmVkIGFuZCByZS1lbWl0dGVkIHRocm91Z2ggdGhlIGxpc3RlbkV2ZW50IG91dHB1dCBwcm9wZXJ0eSB3aXRoIGFkZGl0aW9uYWxcbiAgICogbWV0YWRhdGEgYWJvdXQgdGhlIGV2ZW50IHNvdXJjZS5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRHluYW1pYyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFBhcmVudCBDb21wb25lbnRcbiAgICpcbiAgICogICBDLT4+Qzogc3Vic2NyaWJlRXZlbnRzKClcbiAgICogICBDLT4+RDogR2V0IGluc3RhbmNlIHByb3BlcnRpZXNcbiAgICogICBsb29wIEZvciBlYWNoIHByb3BlcnR5XG4gICAqICAgICBDLT4+QzogQ2hlY2sgaWYgcHJvcGVydHkgaXMgRXZlbnRFbWl0dGVyXG4gICAqICAgICBhbHQgaXMgRXZlbnRFbWl0dGVyXG4gICAqICAgICAgIEMtPj5EOiBTdWJzY3JpYmUgdG8gZXZlbnRcbiAgICogICAgICAgRC0tPj5DOiBFdmVudCBlbWl0dGVkXG4gICAqICAgICAgIEMtPj5QOiBSZS1lbWl0IGV2ZW50IHdpdGggbWV0YWRhdGFcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudD8uaW5zdGFuY2UgYXMgS2V5VmFsdWU7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXMoaW5zdGFuY2UpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgY29tcG9uZW50S2V5cykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgS2V5VmFsdWUpW2tleV0uc3Vic2NyaWJlKFxuICAgICAgICAgICAgKGV2ZW50OiBQYXJ0aWFsPEJhc2VDdXN0b21FdmVudD4pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5FdmVudC5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICAgIH0gYXMgUmVuZGVyZXJDdXN0b21FdmVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnN1YnNjcmliZXMgZnJvbSBhbGwgZXZlbnRzIG9mIHRoZSBkeW5hbWljIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgY2xlYW5zIHVwIGV2ZW50IHN1YnNjcmlwdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICogSXQgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZHluYW1pYyBjb21wb25lbnQgaW5zdGFuY2UgYW5kIHVuc3Vic2NyaWJlc1xuICAgKiBmcm9tIGFueSBFdmVudEVtaXR0ZXIgcHJvcGVydGllcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBhbmQgdW5leHBlY3RlZCBiZWhhdmlvciBhZnRlclxuICAgKiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRHluYW1pYyBDb21wb25lbnRcbiAgICpcbiAgICogICBDLT4+QzogdW5zdWJzY3JpYmVFdmVudHMoKVxuICAgKiAgIEMtPj5EOiBHZXQgaW5zdGFuY2UgcHJvcGVydGllc1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggcHJvcGVydHlcbiAgICogICAgIEMtPj5DOiBDaGVjayBpZiBwcm9wZXJ0eSBpcyBFdmVudEVtaXR0ZXJcbiAgICogICAgIGFsdCBpcyBFdmVudEVtaXR0ZXJcbiAgICogICAgICAgQy0+PkQ6IFVuc3Vic2NyaWJlIGZyb20gZXZlbnRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50Py5pbnN0YW5jZSBhcyBLZXlWYWx1ZTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyhpbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaW5zdGFuY2Vba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSBpbnN0YW5jZVtrZXldLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2NvbXBvbmVudFZpZXdDb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbm5lcj5cbiAgQGlmKHBhcmVudD8uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgIEBmb3IoY2hpbGQgb2YgcGFyZW50LmNoaWxkcmVuOyB0cmFjayBjaGlsZCkge1xuICAgICAgICBAaWYoIWNoaWxkLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICBjaGlsZC5jb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICBpbmplY3RvcjogY2hpbGQuaW5qZWN0b3I7XG4gICAgICAgICAgICAgICAgICBpbnB1dHM6IGNoaWxkLmlucHV0cztcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6Y2hpbGQuY29udGVudDtcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyIFtwYXJlbnRdPVwiY2hpbGRcIj4gPC9uZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyPlxuICAgICAgICB9XG4gICAgIH1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuXG4iXX0=
|