photon-grid-angular 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/esm2022/library/angular-renderer.adapter.mjs +269 -0
- package/esm2022/library/angular-renderer.types.mjs +8 -0
- package/esm2022/library/photon-grid.component.mjs +287 -0
- package/esm2022/library/photon-grid.module.mjs +23 -0
- package/esm2022/photon-grid-angular.mjs +5 -0
- package/esm2022/public-api.mjs +8 -0
- package/fesm2022/photon-grid-angular.mjs +593 -0
- package/fesm2022/photon-grid-angular.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/library/angular-renderer.adapter.d.ts +68 -0
- package/library/angular-renderer.adapter.d.ts.map +1 -0
- package/library/angular-renderer.types.d.ts +68 -0
- package/library/angular-renderer.types.d.ts.map +1 -0
- package/library/photon-grid.component.d.ts +162 -0
- package/library/photon-grid.component.d.ts.map +1 -0
- package/library/photon-grid.module.d.ts +14 -0
- package/library/photon-grid.module.d.ts.map +1 -0
- package/package.json +39 -0
- package/photon-grid-angular.d.ts.map +1 -0
- package/public-api.d.ts +6 -0
- package/public-api.d.ts.map +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# PhotonGridAngular
|
|
2
|
+
|
|
3
|
+
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.14.
|
|
4
|
+
|
|
5
|
+
## Development server
|
|
6
|
+
|
|
7
|
+
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
|
|
8
|
+
|
|
9
|
+
## Code scaffolding
|
|
10
|
+
|
|
11
|
+
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
|
|
12
|
+
|
|
13
|
+
## Build
|
|
14
|
+
|
|
15
|
+
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
16
|
+
|
|
17
|
+
## Running unit tests
|
|
18
|
+
|
|
19
|
+
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
20
|
+
|
|
21
|
+
## Running end-to-end tests
|
|
22
|
+
|
|
23
|
+
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
|
|
24
|
+
|
|
25
|
+
## Further help
|
|
26
|
+
|
|
27
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { TemplateRef, createComponent, } from '@angular/core';
|
|
2
|
+
import { isComponentRendererSpec, isTemplateRendererSpec, } from './angular-renderer.types';
|
|
3
|
+
/**
|
|
4
|
+
* Bridges the framework-agnostic `ColumnRendererMap` (plain functions
|
|
5
|
+
* returning `HTMLElement | string`) to Angular components and templates.
|
|
6
|
+
*
|
|
7
|
+
* One instance is owned per `<photon-grid>` and lives for the component's
|
|
8
|
+
* lifetime: {@link adaptColumns} is called whenever columns are (re)supplied,
|
|
9
|
+
* and {@link dispose} is called once, in `ngOnDestroy`, to guarantee nothing
|
|
10
|
+
* outlives the host component.
|
|
11
|
+
*
|
|
12
|
+
* ### Why a MutationObserver
|
|
13
|
+
* The core owns cell/row virtualization and recycling; it has no lifecycle
|
|
14
|
+
* hook that tells us "this cell's DOM node is gone, destroy whatever you
|
|
15
|
+
* mounted into it". Since every renderer invocation mounts a *fresh*
|
|
16
|
+
* component/embedded view (the core's contract is "produce output for these
|
|
17
|
+
* params", not "patch existing output"), the only reliable place to catch
|
|
18
|
+
* disposal is watching the DOM itself: when the core removes/replaces a
|
|
19
|
+
* mounted host element, a MutationObserver on the grid root sees it and we
|
|
20
|
+
* destroy the corresponding Angular view right then. This is what keeps
|
|
21
|
+
* scrolling/virtualized grids from leaking components.
|
|
22
|
+
*/
|
|
23
|
+
export class RendererAdapter {
|
|
24
|
+
appRef;
|
|
25
|
+
environmentInjector;
|
|
26
|
+
elementInjector;
|
|
27
|
+
/** Host element -> live Angular view mounted into it. */
|
|
28
|
+
mounts = new Map();
|
|
29
|
+
observer;
|
|
30
|
+
constructor(appRef, environmentInjector, elementInjector) {
|
|
31
|
+
this.appRef = appRef;
|
|
32
|
+
this.environmentInjector = environmentInjector;
|
|
33
|
+
this.elementInjector = elementInjector;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Starts watching `root` for node removals so mounted views can be torn
|
|
37
|
+
* down as soon as the core discards their host element. Safe to call
|
|
38
|
+
* repeatedly (e.g. across grid recreation) — any previous observer is
|
|
39
|
+
* disconnected first, but existing mounts are left untouched.
|
|
40
|
+
*/
|
|
41
|
+
observe(root) {
|
|
42
|
+
this.observer?.disconnect();
|
|
43
|
+
this.observer = new MutationObserver((mutations) => {
|
|
44
|
+
// Bounded by the number of *currently mounted* renderer views
|
|
45
|
+
// (i.e. visible custom cells), not by row/data-set size, because
|
|
46
|
+
// virtualization keeps that number small regardless of grid size.
|
|
47
|
+
if (this.mounts.size === 0) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
for (const mutation of mutations) {
|
|
51
|
+
mutation.removedNodes.forEach((node) => this.cleanupRemovedNode(node));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
this.observer.observe(root, { childList: true, subtree: true });
|
|
55
|
+
}
|
|
56
|
+
/** Recursively converts `GridColumnDef[]` into plain `ColumnDef[]`. */
|
|
57
|
+
adaptColumns(columns) {
|
|
58
|
+
return columns.map((column) => this.adaptColumn(column));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Destroys every currently-mounted component/embedded view and stops
|
|
62
|
+
* observing. Call exactly once, when the owning grid is torn down.
|
|
63
|
+
* Deliberately unconditional (does not wait on the MutationObserver):
|
|
64
|
+
* `disconnect()` drops any in-flight mutation records, so relying on it
|
|
65
|
+
* for final teardown would risk leaking whatever hadn't been flushed yet.
|
|
66
|
+
*/
|
|
67
|
+
dispose() {
|
|
68
|
+
this.observer?.disconnect();
|
|
69
|
+
this.observer = undefined;
|
|
70
|
+
for (const [element, mount] of this.mounts) {
|
|
71
|
+
this.destroyMount(mount);
|
|
72
|
+
this.mounts.delete(element);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
adaptColumn(column) {
|
|
76
|
+
const { renderer, children, ...rest } = column;
|
|
77
|
+
const adapted = { ...rest };
|
|
78
|
+
if (renderer) {
|
|
79
|
+
// Adapted per-slot (rather than via a generic loop over the
|
|
80
|
+
// slot names) so each call keeps its own TParams/TOutput pair —
|
|
81
|
+
// looping over a union of keys would force `adaptRenderer` to
|
|
82
|
+
// accept the union of every slot's renderer type at once, which
|
|
83
|
+
// doesn't type-check (an EditorRendererParams renderer isn't
|
|
84
|
+
// assignable where a TooltipRendererParams renderer is expected).
|
|
85
|
+
const adaptedRenderer = {
|
|
86
|
+
display: this.adaptRenderer(renderer.display),
|
|
87
|
+
editor: this.adaptRenderer(renderer.editor),
|
|
88
|
+
option: this.adaptRenderer(renderer.option),
|
|
89
|
+
filter: this.adaptRenderer(renderer.filter),
|
|
90
|
+
tooltip: this.adaptRenderer(renderer.tooltip),
|
|
91
|
+
group: this.adaptRenderer(renderer.group),
|
|
92
|
+
header: this.adaptRenderer(renderer.header),
|
|
93
|
+
summary: this.adaptRenderer(renderer.summary),
|
|
94
|
+
};
|
|
95
|
+
adapted.renderer = adaptedRenderer;
|
|
96
|
+
}
|
|
97
|
+
if (children) {
|
|
98
|
+
adapted.children = children.map((child) => this.adaptColumn(child));
|
|
99
|
+
}
|
|
100
|
+
return adapted;
|
|
101
|
+
}
|
|
102
|
+
adaptRenderer(renderer) {
|
|
103
|
+
if (!renderer) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
if (isComponentRendererSpec(renderer)) {
|
|
107
|
+
return (params) => this.mountComponent(renderer, params);
|
|
108
|
+
}
|
|
109
|
+
if (isTemplateRendererSpec(renderer)) {
|
|
110
|
+
return (params) => this.mountTemplate(renderer, params);
|
|
111
|
+
}
|
|
112
|
+
if (renderer instanceof TemplateRef) {
|
|
113
|
+
return (params) => this.mountTemplate({ template: renderer }, params);
|
|
114
|
+
}
|
|
115
|
+
if (this.isComponentType(renderer)) {
|
|
116
|
+
return (params) => this.mountComponent({ component: renderer }, params);
|
|
117
|
+
}
|
|
118
|
+
if (typeof renderer === 'function') {
|
|
119
|
+
return renderer;
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
isComponentType(value) {
|
|
124
|
+
return typeof value === 'function' && !!value.ɵcmp;
|
|
125
|
+
}
|
|
126
|
+
mountComponent(spec, params) {
|
|
127
|
+
const componentRef = createComponent(spec.component, {
|
|
128
|
+
environmentInjector: this.environmentInjector,
|
|
129
|
+
elementInjector: this.elementInjector,
|
|
130
|
+
});
|
|
131
|
+
const normalizedParams = this.normalizeRendererParams(params);
|
|
132
|
+
const inputs = spec.inputs ? spec.inputs(normalizedParams) : this.inferInputs(componentRef, normalizedParams);
|
|
133
|
+
for (const [key, value] of Object.entries(inputs)) {
|
|
134
|
+
this.setComponentInput(componentRef, key, value);
|
|
135
|
+
}
|
|
136
|
+
this.setComponentInput(componentRef, 'params', normalizedParams);
|
|
137
|
+
// Attaching to ApplicationRef is what makes this component
|
|
138
|
+
// participate in normal change detection (zone triggers, async
|
|
139
|
+
// pipe, etc.) for as long as it stays mounted — required for any
|
|
140
|
+
// interactivity inside the component itself (clicks, forms, ...).
|
|
141
|
+
this.appRef.attachView(componentRef.hostView);
|
|
142
|
+
componentRef.changeDetectorRef.detectChanges();
|
|
143
|
+
this.invokeLifecycle(componentRef.instance, 'pgGridInit', normalizedParams);
|
|
144
|
+
this.invokeLifecycle(componentRef.instance, 'pgGridRefresh', normalizedParams);
|
|
145
|
+
const element = componentRef.location.nativeElement;
|
|
146
|
+
this.mounts.set(element, { kind: 'component', ref: componentRef });
|
|
147
|
+
return element;
|
|
148
|
+
}
|
|
149
|
+
setComponentInput(componentRef, key, value) {
|
|
150
|
+
try {
|
|
151
|
+
componentRef.setInput(key, value);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
const instance = componentRef.instance;
|
|
156
|
+
instance[key] = value;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
normalizeRendererParams(params) {
|
|
160
|
+
const normalized = { ...params };
|
|
161
|
+
const option = normalized['option'];
|
|
162
|
+
if (normalized['value'] === undefined && option && typeof option === 'object') {
|
|
163
|
+
const optionValue = option.value;
|
|
164
|
+
normalized['value'] = optionValue;
|
|
165
|
+
normalized['rawValue'] = optionValue;
|
|
166
|
+
}
|
|
167
|
+
return normalized;
|
|
168
|
+
}
|
|
169
|
+
inferInputs(componentRef, params) {
|
|
170
|
+
const instance = componentRef.instance;
|
|
171
|
+
const inputs = {};
|
|
172
|
+
const paramBag = params;
|
|
173
|
+
const row = paramBag['row'] && typeof paramBag['row'] === 'object'
|
|
174
|
+
? paramBag['row']
|
|
175
|
+
: undefined;
|
|
176
|
+
for (const key of Object.keys(instance)) {
|
|
177
|
+
if (key === '__ngContext__' || key === 'constructor') {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (paramBag[key] !== undefined) {
|
|
181
|
+
inputs[key] = paramBag[key];
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (row && row[key] !== undefined) {
|
|
185
|
+
inputs[key] = row[key];
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (key === 'seed' && row && row['id'] !== undefined) {
|
|
189
|
+
inputs[key] = row['id'];
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (key === 'value' && paramBag['value'] !== undefined) {
|
|
193
|
+
inputs[key] = paramBag['value'];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return inputs;
|
|
197
|
+
}
|
|
198
|
+
invokeLifecycle(instance, lifecycle, params) {
|
|
199
|
+
const candidate = instance?.[lifecycle];
|
|
200
|
+
if (typeof candidate === 'function') {
|
|
201
|
+
candidate.call(instance, params);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
mountTemplate(spec, params) {
|
|
205
|
+
const normalizedParams = this.normalizeRendererParams(params);
|
|
206
|
+
const context = {
|
|
207
|
+
$implicit: normalizedParams,
|
|
208
|
+
params: normalizedParams,
|
|
209
|
+
...(spec.context ? spec.context(normalizedParams) : {}),
|
|
210
|
+
};
|
|
211
|
+
const viewRef = spec.template.createEmbeddedView(context);
|
|
212
|
+
this.appRef.attachView(viewRef);
|
|
213
|
+
viewRef.detectChanges();
|
|
214
|
+
const host = this.resolveTemplateHost(viewRef);
|
|
215
|
+
this.mounts.set(host, { kind: 'template', ref: viewRef });
|
|
216
|
+
return host;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Uses the template's single root element directly when possible (so
|
|
220
|
+
* `editor`/`filter` slots that expect the returned element to *be* the
|
|
221
|
+
* control keep working); falls back to a wrapper `<div>` for templates
|
|
222
|
+
* with multiple root nodes or text-only content.
|
|
223
|
+
*/
|
|
224
|
+
resolveTemplateHost(viewRef) {
|
|
225
|
+
const [singleRoot] = viewRef.rootNodes;
|
|
226
|
+
if (viewRef.rootNodes.length === 1 && singleRoot instanceof HTMLElement) {
|
|
227
|
+
return singleRoot;
|
|
228
|
+
}
|
|
229
|
+
const host = document.createElement('div');
|
|
230
|
+
host.classList.add('photon-grid__template-host');
|
|
231
|
+
host.append(...viewRef.rootNodes);
|
|
232
|
+
return host;
|
|
233
|
+
}
|
|
234
|
+
cleanupRemovedNode(node) {
|
|
235
|
+
if (!(node instanceof HTMLElement)) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const directMount = this.mounts.get(node);
|
|
239
|
+
if (directMount) {
|
|
240
|
+
this.mounts.delete(node);
|
|
241
|
+
this.destroyMount(directMount);
|
|
242
|
+
}
|
|
243
|
+
// The core may remove an ancestor (e.g. an entire recycled row)
|
|
244
|
+
// rather than the mounted element itself; sweep for any tracked
|
|
245
|
+
// host contained in the removed subtree.
|
|
246
|
+
if (node.childElementCount === 0) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
for (const [element, mount] of this.mounts) {
|
|
250
|
+
if (node.contains(element)) {
|
|
251
|
+
this.mounts.delete(element);
|
|
252
|
+
this.destroyMount(mount);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
destroyMount(mount) {
|
|
257
|
+
if (mount.kind === 'component') {
|
|
258
|
+
this.invokeLifecycle(mount.ref.instance, 'pgGridDestroy', undefined);
|
|
259
|
+
const viewRef = mount.ref.hostView;
|
|
260
|
+
this.appRef.detachView(viewRef);
|
|
261
|
+
mount.ref.destroy();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const viewRef = mount.ref;
|
|
265
|
+
this.appRef.detachView(viewRef);
|
|
266
|
+
mount.ref.destroy();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZW5kZXJlci5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYnJhcnkvYW5ndWxhci1yZW5kZXJlci5hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFNSCxXQUFXLEVBQ1gsZUFBZSxHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBS0gsdUJBQXVCLEVBQ3ZCLHNCQUFzQixHQUN6QixNQUFNLDBCQUEwQixDQUFDO0FBUWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFPSDtJQUNBO0lBQ0E7SUFSckIseURBQXlEO0lBQ3hDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQUV4RCxRQUFRLENBQW9CO0lBRXBDLFlBQ3FCLE1BQXNCLEVBQ3RCLG1CQUF3QyxFQUN4QyxlQUF5QjtRQUZ6QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG9CQUFlLEdBQWYsZUFBZSxDQUFVO0lBQzNDLENBQUM7SUFFSjs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQyxJQUFpQjtRQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBRTVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQy9DLDhEQUE4RDtZQUM5RCxpRUFBaUU7WUFDakUsa0VBQWtFO1lBQ2xFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU87WUFDWCxDQUFDO1lBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FB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QyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBcHBsaWNhdGlvblJlZixcclxuICAgIENvbXBvbmVudFJlZixcclxuICAgIEVtYmVkZGVkVmlld1JlZixcclxuICAgIEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgICBJbmplY3RvcixcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgY3JlYXRlQ29tcG9uZW50LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBDb2x1bW5EZWYsIFJlbmRlcmVyT3V0cHV0IH0gZnJvbSAncGhvdG9uLWdyaWQtY29yZSc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgQ2VsbFJlbmRlcmVyLFxyXG4gICAgQ29sdW1uUmVuZGVyZXJNYXAsXHJcbiAgICBDb2x1bW5EZWYgYXMgR3JpZENvbHVtbkRlZixcclxuICAgIFJlbmRlcmVyQ29udGV4dCxcclxuICAgIGlzQ29tcG9uZW50UmVuZGVyZXJTcGVjLFxyXG4gICAgaXNUZW1wbGF0ZVJlbmRlcmVyU3BlYyxcclxufSBmcm9tICcuL2FuZ3VsYXItcmVuZGVyZXIudHlwZXMnO1xyXG5cclxudHlwZSBSZW5kZXJlck1vdW50ID1cclxuICAgIHwgeyByZWFkb25seSBraW5kOiAnY29tcG9uZW50JzsgcmVhZG9ubHkgcmVmOiBDb21wb25lbnRSZWY8dW5rbm93bj4gfVxyXG4gICAgfCB7IHJlYWRvbmx5IGtpbmQ6ICd0ZW1wbGF0ZSc7IHJlYWRvbmx5IHJlZjogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+IH07XHJcblxyXG50eXBlIEdyaWRMaWZlY3ljbGVNZXRob2QgPSAncGdHcmlkSW5pdCcgfCAncGdHcmlkUmVmcmVzaCcgfCAncGdHcmlkRGVzdHJveSc7XHJcblxyXG4vKipcclxuICogQnJpZGdlcyB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGBDb2x1bW5SZW5kZXJlck1hcGAgKHBsYWluIGZ1bmN0aW9uc1xyXG4gKiByZXR1cm5pbmcgYEhUTUxFbGVtZW50IHwgc3RyaW5nYCkgdG8gQW5ndWxhciBjb21wb25lbnRzIGFuZCB0ZW1wbGF0ZXMuXHJcbiAqXHJcbiAqIE9uZSBpbnN0YW5jZSBpcyBvd25lZCBwZXIgYDxwaG90b24tZ3JpZD5gIGFuZCBsaXZlcyBmb3IgdGhlIGNvbXBvbmVudCdzXHJcbiAqIGxpZmV0aW1lOiB7QGxpbmsgYWRhcHRDb2x1bW5zfSBpcyBjYWxsZWQgd2hlbmV2ZXIgY29sdW1ucyBhcmUgKHJlKXN1cHBsaWVkLFxyXG4gKiBhbmQge0BsaW5rIGRpc3Bvc2V9IGlzIGNhbGxlZCBvbmNlLCBpbiBgbmdPbkRlc3Ryb3lgLCB0byBndWFyYW50ZWUgbm90aGluZ1xyXG4gKiBvdXRsaXZlcyB0aGUgaG9zdCBjb21wb25lbnQuXHJcbiAqXHJcbiAqICMjIyBXaHkgYSBNdXRhdGlvbk9ic2VydmVyXHJcbiAqIFRoZSBjb3JlIG93bnMgY2VsbC9yb3cgdmlydHVhbGl6YXRpb24gYW5kIHJlY3ljbGluZzsgaXQgaGFzIG5vIGxpZmVjeWNsZVxyXG4gKiBob29rIHRoYXQgdGVsbHMgdXMgXCJ0aGlzIGNlbGwncyBET00gbm9kZSBpcyBnb25lLCBkZXN0cm95IHdoYXRldmVyIHlvdVxyXG4gKiBtb3VudGVkIGludG8gaXRcIi4gU2luY2UgZXZlcnkgcmVuZGVyZXIgaW52b2NhdGlvbiBtb3VudHMgYSAqZnJlc2gqXHJcbiAqIGNvbXBvbmVudC9lbWJlZGRlZCB2aWV3ICh0aGUgY29yZSdzIGNvbnRyYWN0IGlzIFwicHJvZHVjZSBvdXRwdXQgZm9yIHRoZXNlXHJcbiAqIHBhcmFtc1wiLCBub3QgXCJwYXRjaCBleGlzdGluZyBvdXRwdXRcIiksIHRoZSBvbmx5IHJlbGlhYmxlIHBsYWNlIHRvIGNhdGNoXHJcbiAqIGRpc3Bvc2FsIGlzIHdhdGNoaW5nIHRoZSBET00gaXRzZWxmOiB3aGVuIHRoZSBjb3JlIHJlbW92ZXMvcmVwbGFjZXMgYVxyXG4gKiBtb3VudGVkIGhvc3QgZWxlbWVudCwgYSBNdXRhdGlvbk9ic2VydmVyIG9uIHRoZSBncmlkIHJvb3Qgc2VlcyBpdCBhbmQgd2VcclxuICogZGVzdHJveSB0aGUgY29ycmVzcG9uZGluZyBBbmd1bGFyIHZpZXcgcmlnaHQgdGhlbi4gVGhpcyBpcyB3aGF0IGtlZXBzXHJcbiAqIHNjcm9sbGluZy92aXJ0dWFsaXplZCBncmlkcyBmcm9tIGxlYWtpbmcgY29tcG9uZW50cy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZW5kZXJlckFkYXB0ZXIge1xyXG4gICAgLyoqIEhvc3QgZWxlbWVudCAtPiBsaXZlIEFuZ3VsYXIgdmlldyBtb3VudGVkIGludG8gaXQuICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vdW50cyA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIFJlbmRlcmVyTW91bnQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBvYnNlcnZlcj86IE11dGF0aW9uT2JzZXJ2ZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRJbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICApIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgd2F0Y2hpbmcgYHJvb3RgIGZvciBub2RlIHJlbW92YWxzIHNvIG1vdW50ZWQgdmlld3MgY2FuIGJlIHRvcm5cclxuICAgICAqIGRvd24gYXMgc29vbiBhcyB0aGUgY29yZSBkaXNjYXJkcyB0aGVpciBob3N0IGVsZW1lbnQuIFNhZmUgdG8gY2FsbFxyXG4gICAgICogcmVwZWF0ZWRseSAoZS5nLiBhY3Jvc3MgZ3JpZCByZWNyZWF0aW9uKSDigJQgYW55IHByZXZpb3VzIG9ic2VydmVyIGlzXHJcbiAgICAgKiBkaXNjb25uZWN0ZWQgZmlyc3QsIGJ1dCBleGlzdGluZyBtb3VudHMgYXJlIGxlZnQgdW50b3VjaGVkLlxyXG4gICAgICovXHJcbiAgICBvYnNlcnZlKHJvb3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xyXG5cclxuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAvLyBCb3VuZGVkIGJ5IHRoZSBudW1iZXIgb2YgKmN1cnJlbnRseSBtb3VudGVkKiByZW5kZXJlciB2aWV3c1xyXG4gICAgICAgICAgICAvLyAoaS5lLiB2aXNpYmxlIGN1c3RvbSBjZWxscyksIG5vdCBieSByb3cvZGF0YS1zZXQgc2l6ZSwgYmVjYXVzZVxyXG4gICAgICAgICAgICAvLyB2aXJ0dWFsaXphdGlvbiBrZWVwcyB0aGF0IG51bWJlciBzbWFsbCByZWdhcmRsZXNzIG9mIGdyaWQgc2l6ZS5cclxuICAgICAgICAgICAgaWYgKHRoaXMubW91bnRzLnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHRoaXMuY2xlYW51cFJlbW92ZWROb2RlKG5vZGUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUocm9vdCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIGBHcmlkQ29sdW1uRGVmW11gIGludG8gcGxhaW4gYENvbHVtbkRlZltdYC4gKi9cclxuICAgIGFkYXB0Q29sdW1ucyhjb2x1bW5zOiByZWFkb25seSBHcmlkQ29sdW1uRGVmW10pOiBDb2x1bW5EZWZbXSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuYWRhcHRDb2x1bW4oY29sdW1uKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyBldmVyeSBjdXJyZW50bHktbW91bnRlZCBjb21wb25lbnQvZW1iZWRkZWQgdmlldyBhbmQgc3RvcHNcclxuICAgICAqIG9ic2VydmluZy4gQ2FsbCBleGFjdGx5IG9uY2UsIHdoZW4gdGhlIG93bmluZyBncmlkIGlzIHRvcm4gZG93bi5cclxuICAgICAqIERlbGliZXJhdGVseSB1bmNvbmRpdGlvbmFsIChkb2VzIG5vdCB3YWl0IG9uIHRoZSBNdXRhdGlvbk9ic2VydmVyKTpcclxuICAgICAqIGBkaXNjb25uZWN0KClgIGRyb3BzIGFueSBpbi1mbGlnaHQgbXV0YXRpb24gcmVjb3Jkcywgc28gcmVseWluZyBvbiBpdFxyXG4gICAgICogZm9yIGZpbmFsIHRlYXJkb3duIHdvdWxkIHJpc2sgbGVha2luZyB3aGF0ZXZlciBoYWRuJ3QgYmVlbiBmbHVzaGVkIHlldC5cclxuICAgICAqL1xyXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudCwgbW91bnRdIG9mIHRoaXMubW91bnRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vdW50KG1vdW50KTtcclxuICAgICAgICAgICAgdGhpcy5tb3VudHMuZGVsZXRlKGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkYXB0Q29sdW1uKGNvbHVtbjogR3JpZENvbHVtbkRlZik6IENvbHVtbkRlZiB7XHJcbiAgICAgICAgY29uc3QgeyByZW5kZXJlciwgY2hpbGRyZW4sIC4uLnJlc3QgfSA9IGNvbHVtbjtcclxuICAgICAgICBjb25zdCBhZGFwdGVkID0geyAuLi5yZXN0IH0gYXMgQ29sdW1uRGVmO1xyXG5cclxuICAgICAgICBpZiAocmVuZGVyZXIpIHtcclxuICAgICAgICAgICAgLy8gQWRhcHRlZCBwZXItc2xvdCAocmF0aGVyIHRoYW4gdmlhIGEgZ2VuZXJpYyBsb29wIG92ZXIgdGhlXHJcbiAgICAgICAgICAgIC8vIHNsb3QgbmFtZXMpIHNvIGVhY2ggY2FsbCBrZWVwcyBpdHMgb3duIFRQYXJhbXMvVE91dHB1dCBwYWlyIOKAlFxyXG4gICAgICAgICAgICAvLyBsb29waW5nIG92ZXIgYSB1bmlvbiBvZiBrZXlzIHdvdWxkIGZvcmNlIGBhZGFwdFJlbmRlcmVyYCB0b1xyXG4gICAgICAgICAgICAvLyBhY2NlcHQgdGhlIHVuaW9uIG9mIGV2ZXJ5IHNsb3QncyByZW5kZXJlciB0eXBlIGF0IG9uY2UsIHdoaWNoXHJcbiAgICAgICAgICAgIC8vIGRvZXNuJ3QgdHlwZS1jaGVjayAoYW4gRWRpdG9yUmVuZGVyZXJQYXJhbXMgcmVuZGVyZXIgaXNuJ3RcclxuICAgICAgICAgICAgLy8gYXNzaWduYWJsZSB3aGVyZSBhIFRvb2x0aXBSZW5kZXJlclBhcmFtcyByZW5kZXJlciBpcyBleHBlY3RlZCkuXHJcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZWRSZW5kZXJlcjogUGFydGlhbDxDb2x1bW5SZW5kZXJlck1hcD4gPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIuZGlzcGxheSksXHJcbiAgICAgICAgICAgICAgICBlZGl0b3I6IHRoaXMuYWRhcHRSZW5kZXJlcihyZW5kZXJlci5lZGl0b3IpLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uOiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIub3B0aW9uKSxcclxuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy5hZGFwdFJlbmRlcmVyKHJlbmRlcmVyLmZpbHRlciksXHJcbiAgICAgICAgICAgICAgICB0b29sdGlwOiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIudG9vbHRpcCksXHJcbiAgICAgICAgICAgICAgICBncm91cDogdGhpcy5hZGFwdFJlbmRlcmVyKHJlbmRlcmVyLmdyb3VwKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogdGhpcy5hZGFwdFJlbmRlcmVyKHJlbmRlcmVyLmhlYWRlciksXHJcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLmFkYXB0UmVuZGVyZXIocmVuZGVyZXIuc3VtbWFyeSksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGFkYXB0ZWQucmVuZGVyZXIgPSBhZGFwdGVkUmVuZGVyZXIgYXMgYW55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGFkYXB0ZWQuY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB0aGlzLmFkYXB0Q29sdW1uKGNoaWxkKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWRhcHRlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkYXB0UmVuZGVyZXI8VFBhcmFtcywgVE91dHB1dCBleHRlbmRzIFJlbmRlcmVyT3V0cHV0IHwgSFRNTEVsZW1lbnQ+KFxyXG4gICAgICAgIHJlbmRlcmVyOiBDZWxsUmVuZGVyZXI8VFBhcmFtcywgVE91dHB1dD4gfCB1bmRlZmluZWQsXHJcbiAgICApOiAoKHBhcmFtczogVFBhcmFtcykgPT4gVE91dHB1dCkgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICghcmVuZGVyZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpc0NvbXBvbmVudFJlbmRlcmVyU3BlYyhyZW5kZXJlcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJhbXM6IFRQYXJhbXMpID0+IHRoaXMubW91bnRDb21wb25lbnQocmVuZGVyZXIsIHBhcmFtcykgYXMgdW5rbm93biBhcyBUT3V0cHV0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlzVGVtcGxhdGVSZW5kZXJlclNwZWMocmVuZGVyZXIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAocGFyYW1zOiBUUGFyYW1zKSA9PiB0aGlzLm1vdW50VGVtcGxhdGUocmVuZGVyZXIsIHBhcmFtcykgYXMgdW5rbm93biBhcyBUT3V0cHV0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbmRlcmVyIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJhbXM6IFRQYXJhbXMpID0+IHRoaXMubW91bnRUZW1wbGF0ZSh7IHRlbXBsYXRlOiByZW5kZXJlciB9LCBwYXJhbXMpIGFzIHVua25vd24gYXMgVE91dHB1dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50VHlwZShyZW5kZXJlcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJhbXM6IFRQYXJhbXMpID0+IHRoaXMubW91bnRDb21wb25lbnQoeyBjb21wb25lbnQ6IHJlbmRlcmVyIH0sIHBhcmFtcykgYXMgdW5rbm93biBhcyBUT3V0cHV0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiByZW5kZXJlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNDb21wb25lbnRUeXBlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgaW1wb3J0KCdAYW5ndWxhci9jb3JlJykuVHlwZTx1bmtub3duPiB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhISh2YWx1ZSBhcyB7IHJlYWRvbmx5IMm1Y21wPzogdW5rbm93biB9KS7JtWNtcDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1vdW50Q29tcG9uZW50PFRQYXJhbXM+KFxyXG4gICAgICAgIHNwZWM6IHsgY29tcG9uZW50OiBpbXBvcnQoJ0Bhbmd1bGFyL2NvcmUnKS5UeXBlPHVua25vd24+OyBpbnB1dHM/OiAocGFyYW1zOiBUUGFyYW1zKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxyXG4gICAgICAgIHBhcmFtczogVFBhcmFtcyxcclxuICAgICk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjcmVhdGVDb21wb25lbnQoc3BlYy5jb21wb25lbnQsIHtcclxuICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5lbnZpcm9ubWVudEluamVjdG9yLFxyXG4gICAgICAgICAgICBlbGVtZW50SW5qZWN0b3I6IHRoaXMuZWxlbWVudEluamVjdG9yLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBub3JtYWxpemVkUGFyYW1zID0gdGhpcy5ub3JtYWxpemVSZW5kZXJlclBhcmFtcyhwYXJhbXMpO1xyXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHNwZWMuaW5wdXRzID8gc3BlYy5pbnB1dHMobm9ybWFsaXplZFBhcmFtcykgOiB0aGlzLmluZmVySW5wdXRzKGNvbXBvbmVudFJlZiwgbm9ybWFsaXplZFBhcmFtcyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXRzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldENvbXBvbmVudElucHV0KGNvbXBvbmVudFJlZiwga2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldENvbXBvbmVudElucHV0KGNvbXBvbmVudFJlZiwgJ3BhcmFtcycsIG5vcm1hbGl6ZWRQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2hpbmcgdG8gQXBwbGljYXRpb25SZWYgaXMgd2hhdCBtYWtlcyB0aGlzIGNvbXBvbmVudFxyXG4gICAgICAgIC8vIHBhcnRpY2lwYXRlIGluIG5vcm1hbCBjaGFuZ2UgZGV0ZWN0aW9uICh6b25lIHRyaWdnZXJzLCBhc3luY1xyXG4gICAgICAgIC8vIHBpcGUsIGV0Yy4pIGZvciBhcyBsb25nIGFzIGl0IHN0YXlzIG1vdW50ZWQg4oCUIHJlcXVpcmVkIGZvciBhbnlcclxuICAgICAgICAvLyBpbnRlcmFjdGl2aXR5IGluc2lkZSB0aGUgY29tcG9uZW50IGl0c2VsZiAoY2xpY2tzLCBmb3JtcywgLi4uKS5cclxuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcbiAgICAgICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnZva2VMaWZlY3ljbGUoY29tcG9uZW50UmVmLmluc3RhbmNlLCAncGdHcmlkSW5pdCcsIG5vcm1hbGl6ZWRQYXJhbXMpO1xyXG4gICAgICAgIHRoaXMuaW52b2tlTGlmZWN5Y2xlKGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgJ3BnR3JpZFJlZnJlc2gnLCBub3JtYWxpemVkUGFyYW1zKTtcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHRoaXMubW91bnRzLnNldChlbGVtZW50LCB7IGtpbmQ6ICdjb21wb25lbnQnLCByZWY6IGNvbXBvbmVudFJlZiB9KTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbXBvbmVudElucHV0PFRDb21wb25lbnQ+KFxyXG4gICAgICAgIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFRDb21wb25lbnQ+LFxyXG4gICAgICAgIGtleTogc3RyaW5nLFxyXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbm9ybWFsaXplUmVuZGVyZXJQYXJhbXM8VFBhcmFtcz4ocGFyYW1zOiBUUGFyYW1zKTogVFBhcmFtcyAmIHsgdmFsdWU/OiB1bmtub3duOyByYXdWYWx1ZT86IHVua25vd24gfSB7XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHsgLi4uKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSBub3JtYWxpemVkWydvcHRpb24nXTtcclxuXHJcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRbJ3ZhbHVlJ10gPT09IHVuZGVmaW5lZCAmJiBvcHRpb24gJiYgdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSAob3B0aW9uIGFzIHsgdmFsdWU/OiB1bmtub3duIH0pLnZhbHVlO1xyXG4gICAgICAgICAgICBub3JtYWxpemVkWyd2YWx1ZSddID0gb3B0aW9uVmFsdWU7XHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRbJ3Jhd1ZhbHVlJ10gPSBvcHRpb25WYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkIGFzIFRQYXJhbXMgJiB7IHZhbHVlPzogdW5rbm93bjsgcmF3VmFsdWU/OiB1bmtub3duIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbmZlcklucHV0czxUQ29tcG9uZW50LCBUUGFyYW1zPihcclxuICAgICAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUQ29tcG9uZW50PixcclxuICAgICAgICBwYXJhbXM6IFRQYXJhbXMsXHJcbiAgICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAgICAgY29uc3QgaW5wdXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHBhcmFtQmFnID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHBhcmFtQmFnWydyb3cnXSAmJiB0eXBlb2YgcGFyYW1CYWdbJ3JvdyddID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IHBhcmFtQmFnWydyb3cnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaW5zdGFuY2UpKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdfX25nQ29udGV4dF9fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1CYWdba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dHNba2V5XSA9IHBhcmFtQmFnW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJvdyAmJiByb3dba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dHNba2V5XSA9IHJvd1trZXldO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdzZWVkJyAmJiByb3cgJiYgcm93WydpZCddICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlucHV0c1trZXldID0gcm93WydpZCddO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd2YWx1ZScgJiYgcGFyYW1CYWdbJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRzW2tleV0gPSBwYXJhbUJhZ1sndmFsdWUnXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlucHV0cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGludm9rZUxpZmVjeWNsZTxUUGFyYW1zPihcclxuICAgICAgICBpbnN0YW5jZTogdW5rbm93bixcclxuICAgICAgICBsaWZlY3ljbGU6IEdyaWRMaWZlY3ljbGVNZXRob2QsXHJcbiAgICAgICAgcGFyYW1zOiBUUGFyYW1zLFxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gKGluc3RhbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LltsaWZlY3ljbGVdO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIChjYW5kaWRhdGUgYXMgKHBhcmFtczogVFBhcmFtcykgPT4gdm9pZCkuY2FsbChpbnN0YW5jZSwgcGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtb3VudFRlbXBsYXRlPFRQYXJhbXM+KFxyXG4gICAgICAgIHNwZWM6IHtcclxuICAgICAgICAgICAgdGVtcGxhdGU6IGltcG9ydCgnQGFuZ3VsYXIvY29yZScpLlRlbXBsYXRlUmVmPFJlbmRlcmVyQ29udGV4dDxUUGFyYW1zPj47XHJcbiAgICAgICAgICAgIGNvbnRleHQ/OiAocGFyYW1zOiBUUGFyYW1zKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcmFtczogVFBhcmFtcyxcclxuICAgICk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkUGFyYW1zID0gdGhpcy5ub3JtYWxpemVSZW5kZXJlclBhcmFtcyhwYXJhbXMpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogbm9ybWFsaXplZFBhcmFtcyxcclxuICAgICAgICAgICAgcGFyYW1zOiBub3JtYWxpemVkUGFyYW1zLFxyXG4gICAgICAgICAgICAuLi4oc3BlYy5jb250ZXh0ID8gc3BlYy5jb250ZXh0KG5vcm1hbGl6ZWRQYXJhbXMpIDoge30pLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZXdSZWYgPSBzcGVjLnRlbXBsYXRlLmNyZWF0ZUVtYmVkZGVkVmlldyhjb250ZXh0KTtcclxuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHZpZXdSZWYpO1xyXG4gICAgICAgIHZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5yZXNvbHZlVGVtcGxhdGVIb3N0KHZpZXdSZWYpO1xyXG4gICAgICAgIHRoaXMubW91bnRzLnNldChob3N0LCB7IGtpbmQ6ICd0ZW1wbGF0ZScsIHJlZjogdmlld1JlZiB9KTtcclxuICAgICAgICByZXR1cm4gaG9zdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZXMgdGhlIHRlbXBsYXRlJ3Mgc2luZ2xlIHJvb3QgZWxlbWVudCBkaXJlY3RseSB3aGVuIHBvc3NpYmxlIChzb1xyXG4gICAgICogYGVkaXRvcmAvYGZpbHRlcmAgc2xvdHMgdGhhdCBleHBlY3QgdGhlIHJldHVybmVkIGVsZW1lbnQgdG8gKmJlKiB0aGVcclxuICAgICAqIGNvbnRyb2wga2VlcCB3b3JraW5nKTsgZmFsbHMgYmFjayB0byBhIHdyYXBwZXIgYDxkaXY+YCBmb3IgdGVtcGxhdGVzXHJcbiAgICAgKiB3aXRoIG11bHRpcGxlIHJvb3Qgbm9kZXMgb3IgdGV4dC1vbmx5IGNvbnRlbnQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzb2x2ZVRlbXBsYXRlSG9zdCh2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj4pOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgW3NpbmdsZVJvb3RdID0gdmlld1JlZi5yb290Tm9kZXM7XHJcbiAgICAgICAgaWYgKHZpZXdSZWYucm9vdE5vZGVzLmxlbmd0aCA9PT0gMSAmJiBzaW5nbGVSb290IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVJvb3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaG9zdC5jbGFzc0xpc3QuYWRkKCdwaG90b24tZ3JpZF9fdGVtcGxhdGUtaG9zdCcpO1xyXG4gICAgICAgIGhvc3QuYXBwZW5kKC4uLnZpZXdSZWYucm9vdE5vZGVzKTtcclxuICAgICAgICByZXR1cm4gaG9zdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsZWFudXBSZW1vdmVkTm9kZShub2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaXJlY3RNb3VudCA9IHRoaXMubW91bnRzLmdldChub2RlKTtcclxuICAgICAgICBpZiAoZGlyZWN0TW91bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb3VudHMuZGVsZXRlKG5vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lNb3VudChkaXJlY3RNb3VudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUaGUgY29yZSBtYXkgcmVtb3ZlIGFuIGFuY2VzdG9yIChlLmcuIGFuIGVudGlyZSByZWN5Y2xlZCByb3cpXHJcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gdGhlIG1vdW50ZWQgZWxlbWVudCBpdHNlbGY7IHN3ZWVwIGZvciBhbnkgdHJhY2tlZFxyXG4gICAgICAgIC8vIGhvc3QgY29udGFpbmVkIGluIHRoZSByZW1vdmVkIHN1YnRyZWUuXHJcbiAgICAgICAgaWYgKG5vZGUuY2hpbGRFbGVtZW50Q291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50LCBtb3VudF0gb2YgdGhpcy5tb3VudHMpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGUuY29udGFpbnMoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW91bnRzLmRlbGV0ZShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vdW50KG1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlc3Ryb3lNb3VudChtb3VudDogUmVuZGVyZXJNb3VudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChtb3VudC5raW5kID09PSAnY29tcG9uZW50Jykge1xyXG4gICAgICAgICAgICB0aGlzLmludm9rZUxpZmVjeWNsZShtb3VudC5yZWYuaW5zdGFuY2UsICdwZ0dyaWREZXN0cm95JywgdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgY29uc3Qgdmlld1JlZiA9IG1vdW50LnJlZi5ob3N0VmlldztcclxuICAgICAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyh2aWV3UmVmKTtcclxuICAgICAgICAgICAgbW91bnQucmVmLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgdmlld1JlZiA9IG1vdW50LnJlZjtcclxuICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KHZpZXdSZWYpO1xyXG4gICAgICAgIG1vdW50LnJlZi5kZXN0cm95KCk7XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Narrowing helpers used by the adapter (and usable by consumers/tests). */
|
|
2
|
+
export function isComponentRendererSpec(value) {
|
|
3
|
+
return !!value && typeof value === 'object' && value.kind === 'component';
|
|
4
|
+
}
|
|
5
|
+
export function isTemplateRendererSpec(value) {
|
|
6
|
+
return !!value && typeof value === 'object' && value.kind === 'template';
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZW5kZXJlci50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5L2FuZ3VsYXItcmVuZGVyZXIudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0ZBLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsdUJBQXVCLENBQ25DLEtBQWM7SUFFZCxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFLLEtBQTRCLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztBQUN0RyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNsQyxLQUFjO0lBRWQsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSyxLQUE0QixDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7QUFDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB0eXBlIHtcclxuICAgIENvbHVtbkRlZiBhcyBjb3JlQ29sdW1uRGVmLFxyXG4gICAgRGlzcGxheVJlbmRlcmVyUGFyYW1zLFxyXG4gICAgRWRpdG9yUmVuZGVyZXJQYXJhbXMsXHJcbiAgICBGaWx0ZXJSZW5kZXJlclBhcmFtcyxcclxuICAgIEdyb3VwUmVuZGVyZXJQYXJhbXMsXHJcbiAgICBIZWFkZXJSZW5kZXJlclBhcmFtcyxcclxuICAgIE9wdGlvblJlbmRlcmVyUGFyYW1zLFxyXG4gICAgUmVuZGVyZXJPdXRwdXQsXHJcbiAgICBTdW1tYXJ5UmVuZGVyZXJQYXJhbXMsXHJcbiAgICBUb29sdGlwUmVuZGVyZXJQYXJhbXMsXHJcbn0gZnJvbSAncGhvdG9uLWdyaWQtY29yZSc7XHJcbiBcclxuLyoqXHJcbiAqIFJlbmRlcnMgYHBhcmFtc2AgdGhyb3VnaCBhIGBAQ29tcG9uZW50YC5cclxuICpcclxuICogQSAqKm5ldyoqIGNvbXBvbmVudCBpbnN0YW5jZSBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhlIGNvcmUgaW52b2tlcyB0aGVcclxuICogcmVuZGVyZXIgKGl0IGhhcyBubyBjb25jZXB0IG9mIFwidXBkYXRlXCIsIG9ubHkgXCJwcm9kdWNlIG91dHB1dCBmb3IgdGhlc2VcclxuICogcGFyYW1zXCIpLiBgaW5wdXRzYCBpcyByZS1ldmFsdWF0ZWQgb24gZXZlcnkgbW91bnQgYW5kIGFwcGxpZWQgdmlhXHJcbiAqIGBDb21wb25lbnRSZWYuc2V0SW5wdXRgIGJlZm9yZSB0aGUgZmlyc3QgY2hhbmdlLWRldGVjdGlvbiBwYXNzLCBzbyB0aGVcclxuICogY29tcG9uZW50IHNlZXMgdGhlIGN1cnJlbnQgcGFyYW1zIGFzIGl0cyBpbml0aWFsIGBASW5wdXQoKWBzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRSZW5kZXJlclNwZWM8VFBhcmFtcywgVENvbXBvbmVudCA9IHVua25vd24+IHtcclxuICAgIHJlYWRvbmx5IGtpbmQ6ICdjb21wb25lbnQnO1xyXG4gICAgcmVhZG9ubHkgY29tcG9uZW50OiBUeXBlPFRDb21wb25lbnQ+O1xyXG4gICAgLyoqIE1hcHMgcmVuZGVyZXIgcGFyYW1zIHRvIHRoZSBjb21wb25lbnQncyBgQElucHV0KClgIGJhZy4gKi9cclxuICAgIHJlYWRvbmx5IGlucHV0cz86IChwYXJhbXM6IFRQYXJhbXMpID0+IFBhcnRpYWw8VENvbXBvbmVudD4gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxufVxyXG5cclxuLyoqIENvbnRleHQgaGFuZGVkIHRvIGFuIGA8bmctdGVtcGxhdGU+YCB1c2VkIGFzIGEgcmVuZGVyZXIuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyZXJDb250ZXh0PFRQYXJhbXM+IHtcclxuICAgIC8qKiBFbmFibGVzIGBsZXQteGAgLyBpbXBsaWNpdCBgbGV0LXBhcmFtc2AgdGVtcGxhdGUgc3ludGF4LiAqL1xyXG4gICAgJGltcGxpY2l0OiBUUGFyYW1zO1xyXG4gICAgcGFyYW1zOiBUUGFyYW1zO1xyXG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgYHBhcmFtc2AgdGhyb3VnaCBhbiBgPG5nLXRlbXBsYXRlPmAgKG9idGFpbmVkIHZpYSBgQFZpZXdDaGlsZGApLlxyXG4gKlxyXG4gKiBQcmVmZXIgYSBzaW5nbGUgcm9vdCBlbGVtZW50IGluIHRoZSB0ZW1wbGF0ZSBmb3IgYGVkaXRvcmAgLyBgZmlsdGVyYFxyXG4gKiBzbG90czogdGhlIGNvcmUgdHJlYXRzIHRoZSByZXR1cm5lZCBgSFRNTEVsZW1lbnRgIGFzIHRoZSBpbnRlcmFjdGl2ZVxyXG4gKiBjb250cm9sIGl0c2VsZiAoZS5nLiBpdCBtYXkgY2FsbCBgLmZvY3VzKClgIG9uIGl0KSwgYW5kIGEgbXVsdGktcm9vdFxyXG4gKiB0ZW1wbGF0ZSBnZXRzIHdyYXBwZWQgaW4gYSBzeW50aGV0aWMgYDxkaXY+YCBob3N0IHRoYXQgYnJlYWtzIHRoYXRcclxuICogYXNzdW1wdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVSZW5kZXJlclNwZWM8VFBhcmFtcz4ge1xyXG4gICAgcmVhZG9ubHkga2luZDogJ3RlbXBsYXRlJztcclxuICAgIHJlYWRvbmx5IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxSZW5kZXJlckNvbnRleHQ8VFBhcmFtcz4+O1xyXG4gICAgcmVhZG9ubHkgY29udGV4dD86IChwYXJhbXM6IFRQYXJhbXMpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG59XHJcblxyXG4vKipcclxuICogQSByZW5kZXJlciBzbG90IGFjY2VwdHMgZWl0aGVyOlxyXG4gKiAtIGEgZGVjbGFyYXRpdmUgc3BlYyAoYHsga2luZDogJ2NvbXBvbmVudCcgfCAndGVtcGxhdGUnLCAuLi4gfWApLCBvclxyXG4gKiAtIGEgcGxhaW4gZnVuY3Rpb24sIGZvciBjb25zdW1lcnMgd2hvIHdhbnQgdG8ga2VlcCBwcm9kdWNpbmcgcmF3XHJcbiAqICAgYEhUTUxFbGVtZW50YC9gc3RyaW5nYCBvdXRwdXQgKGlkZW50aWNhbCB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgQVBJKS5cclxuICovXHJcbmV4cG9ydCB0eXBlIENlbGxSZW5kZXJlcjxUUGFyYW1zLCBUT3V0cHV0PiA9XHJcbiAgICB8IENvbXBvbmVudFJlbmRlcmVyU3BlYzxUUGFyYW1zPlxyXG4gICAgfCBUZW1wbGF0ZVJlbmRlcmVyU3BlYzxUUGFyYW1zPlxyXG4gICAgfCBUeXBlPHVua25vd24+XHJcbiAgICB8IFRlbXBsYXRlUmVmPFJlbmRlcmVyQ29udGV4dDxUUGFyYW1zPj5cclxuICAgIHwgKChwYXJhbXM6IFRQYXJhbXMpID0+IFRPdXRwdXQpO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5SZW5kZXJlck1hcCB7XHJcbiAgICBkaXNwbGF5PzogQ2VsbFJlbmRlcmVyPERpc3BsYXlSZW5kZXJlclBhcmFtcywgUmVuZGVyZXJPdXRwdXQ+O1xyXG4gICAgZWRpdG9yPzogQ2VsbFJlbmRlcmVyPEVkaXRvclJlbmRlcmVyUGFyYW1zLCBIVE1MRWxlbWVudD47XHJcbiAgICBvcHRpb24/OiBUeXBlPGFueT4gfCBUZW1wbGF0ZVJlZjxhbnk+IHwgKChwYXJhbXM6IE9wdGlvblJlbmRlcmVyUGFyYW1zKSA9PiBIVE1MRWxlbWVudCk7XHJcbiAgICBmaWx0ZXI/OiBDZWxsUmVuZGVyZXI8RmlsdGVyUmVuZGVyZXJQYXJhbXMsIEhUTUxFbGVtZW50PjtcclxuICAgIHRvb2x0aXA/OiBDZWxsUmVuZGVyZXI8VG9vbHRpcFJlbmRlcmVyUGFyYW1zLCBSZW5kZXJlck91dHB1dD47XHJcbiAgICBncm91cD86IENlbGxSZW5kZXJlcjxHcm91cFJlbmRlcmVyUGFyYW1zLCBSZW5kZXJlck91dHB1dD47XHJcbiAgICBoZWFkZXI/OiBDZWxsUmVuZGVyZXI8SGVhZGVyUmVuZGVyZXJQYXJhbXMsIFJlbmRlcmVyT3V0cHV0PjtcclxuICAgIHN1bW1hcnk/OiBDZWxsUmVuZGVyZXI8U3VtbWFyeVJlbmRlcmVyUGFyYW1zLCBSZW5kZXJlck91dHB1dD47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEcm9wLWluIHJlcGxhY2VtZW50IGZvciBgQ29sdW1uRGVmYDogaWRlbnRpY2FsIHNoYXBlLCBleGNlcHQgYHJlbmRlcmVyYFxyXG4gKiAoYW5kIGByZW5kZXJlcmAgb24gYW55IG5lc3RlZCBgY2hpbGRyZW5gKSBhY2NlcHRzIHRoZSBkZWNsYXJhdGl2ZVxyXG4gKiBjb21wb25lbnQvdGVtcGxhdGUgc3BlY3MgYWJvdmUgaW4gYWRkaXRpb24gdG8gcGxhaW4gZnVuY3Rpb25zLlxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQ29sdW1uRGVmID0gT21pdDxjb3JlQ29sdW1uRGVmLCAncmVuZGVyZXInIHwgJ2NoaWxkcmVuJz4gJiB7XHJcbiAgICByZW5kZXJlcj86IENvbHVtblJlbmRlcmVyTWFwO1xyXG4gICAgY2hpbGRyZW4/OiBDb2x1bW5EZWZbXTtcclxufTtcclxuXHJcbi8qKiBOYXJyb3dpbmcgaGVscGVycyB1c2VkIGJ5IHRoZSBhZGFwdGVyIChhbmQgdXNhYmxlIGJ5IGNvbnN1bWVycy90ZXN0cykuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudFJlbmRlcmVyU3BlYyhcclxuICAgIHZhbHVlOiB1bmtub3duLFxyXG4pOiB2YWx1ZSBpcyBDb21wb25lbnRSZW5kZXJlclNwZWM8dW5rbm93bj4ge1xyXG4gICAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAodmFsdWUgYXMgeyBraW5kPzogdW5rbm93biB9KS5raW5kID09PSAnY29tcG9uZW50JztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVtcGxhdGVSZW5kZXJlclNwZWMoXHJcbiAgICB2YWx1ZTogdW5rbm93bixcclxuKTogdmFsdWUgaXMgVGVtcGxhdGVSZW5kZXJlclNwZWM8dW5rbm93bj4ge1xyXG4gICAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAodmFsdWUgYXMgeyBraW5kPzogdW5rbm93biB9KS5raW5kID09PSAndGVtcGxhdGUnO1xyXG59Il19
|