gridstack 8.1.1 → 8.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/README.md +12 -11
  2. package/angular/.editorconfig +16 -0
  3. package/angular/.vscode/extensions.json +4 -0
  4. package/angular/.vscode/launch.json +20 -0
  5. package/angular/.vscode/tasks.json +42 -0
  6. package/{dist/ng → angular}/README.md +170 -154
  7. package/angular/README_build.md +27 -0
  8. package/angular/angular.json +132 -0
  9. package/angular/package.json +40 -0
  10. package/angular/projects/demo/.browserslistrc +16 -0
  11. package/angular/projects/demo/src/app/app.component.css +11 -0
  12. package/angular/projects/demo/src/app/app.component.html +78 -0
  13. package/angular/projects/demo/src/app/app.component.spec.ts +25 -0
  14. package/angular/projects/demo/src/app/app.component.ts +208 -0
  15. package/angular/projects/demo/src/app/app.module.ts +38 -0
  16. package/angular/projects/demo/src/app/dummy.component.ts +29 -0
  17. package/angular/projects/demo/src/app/ngFor.ts +131 -0
  18. package/angular/projects/demo/src/app/ngFor_cmd.ts +106 -0
  19. package/angular/projects/demo/src/app/simple.ts +46 -0
  20. package/angular/projects/demo/src/assets/.gitkeep +0 -0
  21. package/angular/projects/demo/src/environments/environment.prod.ts +3 -0
  22. package/angular/projects/demo/src/environments/environment.ts +16 -0
  23. package/angular/projects/demo/src/favicon.ico +0 -0
  24. package/angular/projects/demo/src/index.html +13 -0
  25. package/angular/projects/demo/src/main.ts +12 -0
  26. package/angular/projects/demo/src/polyfills.ts +53 -0
  27. package/angular/projects/demo/src/styles.css +4 -0
  28. package/angular/projects/demo/src/test.ts +26 -0
  29. package/angular/projects/demo/tsconfig.app.json +15 -0
  30. package/angular/projects/demo/tsconfig.spec.json +18 -0
  31. package/angular/projects/lib/README.md +24 -0
  32. package/angular/projects/lib/ng-package.json +7 -0
  33. package/angular/projects/lib/package.json +11 -0
  34. package/angular/projects/lib/src/lib/gridstack-item.component.ts +70 -0
  35. package/angular/projects/lib/src/lib/gridstack.component.ts +240 -0
  36. package/angular/projects/lib/src/lib/gridstack.module.ts +32 -0
  37. package/angular/projects/lib/src/public-api.ts +7 -0
  38. package/angular/projects/lib/src/test.ts +27 -0
  39. package/angular/projects/lib/tsconfig.lib.json +15 -0
  40. package/angular/projects/lib/tsconfig.lib.prod.json +10 -0
  41. package/angular/projects/lib/tsconfig.spec.json +17 -0
  42. package/dist/angular/README.md +170 -0
  43. package/dist/angular/esm2020/gridstack-angular.mjs +5 -0
  44. package/dist/angular/esm2020/lib/gridstack-item.component.mjs +67 -0
  45. package/dist/angular/esm2020/lib/gridstack.component.mjs +233 -0
  46. package/dist/angular/esm2020/lib/gridstack.module.mjs +39 -0
  47. package/dist/angular/esm2020/public-api.mjs +7 -0
  48. package/dist/angular/fesm2015/gridstack-angular.mjs +346 -0
  49. package/dist/angular/fesm2015/gridstack-angular.mjs.map +1 -0
  50. package/dist/angular/fesm2020/gridstack-angular.mjs +342 -0
  51. package/dist/angular/fesm2020/gridstack-angular.mjs.map +1 -0
  52. package/dist/angular/index.d.ts +5 -0
  53. package/dist/{ng → angular/lib}/gridstack-item.component.d.ts +32 -29
  54. package/dist/{ng → angular/lib}/gridstack.component.d.ts +121 -118
  55. package/dist/angular/lib/gridstack.module.d.ts +10 -0
  56. package/dist/angular/package.json +31 -0
  57. package/dist/angular/public-api.d.ts +3 -0
  58. package/dist/angular/src/gridstack-item.component.ts +70 -0
  59. package/dist/angular/src/gridstack.component.ts +240 -0
  60. package/dist/angular/src/gridstack.module.ts +32 -0
  61. package/dist/dd-base-impl.d.ts +1 -1
  62. package/dist/dd-base-impl.js +1 -1
  63. package/dist/dd-base-impl.js.map +1 -1
  64. package/dist/dd-draggable.d.ts +1 -1
  65. package/dist/dd-draggable.js +1 -1
  66. package/dist/dd-draggable.js.map +1 -1
  67. package/dist/dd-droppable.d.ts +1 -1
  68. package/dist/dd-droppable.js +1 -1
  69. package/dist/dd-droppable.js.map +1 -1
  70. package/dist/dd-element.d.ts +1 -1
  71. package/dist/dd-element.js +1 -1
  72. package/dist/dd-element.js.map +1 -1
  73. package/dist/dd-gridstack.d.ts +1 -1
  74. package/dist/dd-gridstack.js +1 -1
  75. package/dist/dd-gridstack.js.map +1 -1
  76. package/dist/dd-manager.d.ts +1 -1
  77. package/dist/dd-manager.js +1 -1
  78. package/dist/dd-manager.js.map +1 -1
  79. package/dist/dd-resizable-handle.d.ts +1 -1
  80. package/dist/dd-resizable-handle.js +1 -1
  81. package/dist/dd-resizable-handle.js.map +1 -1
  82. package/dist/dd-resizable.d.ts +1 -1
  83. package/dist/dd-resizable.js +1 -1
  84. package/dist/dd-resizable.js.map +1 -1
  85. package/dist/dd-touch.d.ts +1 -1
  86. package/dist/dd-touch.js +1 -1
  87. package/dist/dd-touch.js.map +1 -1
  88. package/dist/es5/dd-base-impl.d.ts +1 -1
  89. package/dist/es5/dd-base-impl.js +1 -1
  90. package/dist/es5/dd-base-impl.js.map +1 -1
  91. package/dist/es5/dd-draggable.d.ts +1 -1
  92. package/dist/es5/dd-draggable.js +1 -1
  93. package/dist/es5/dd-draggable.js.map +1 -1
  94. package/dist/es5/dd-droppable.d.ts +1 -1
  95. package/dist/es5/dd-droppable.js +1 -1
  96. package/dist/es5/dd-droppable.js.map +1 -1
  97. package/dist/es5/dd-element.d.ts +1 -1
  98. package/dist/es5/dd-element.js +1 -1
  99. package/dist/es5/dd-element.js.map +1 -1
  100. package/dist/es5/dd-gridstack.d.ts +1 -1
  101. package/dist/es5/dd-gridstack.js +1 -1
  102. package/dist/es5/dd-gridstack.js.map +1 -1
  103. package/dist/es5/dd-manager.d.ts +1 -1
  104. package/dist/es5/dd-manager.js +1 -1
  105. package/dist/es5/dd-manager.js.map +1 -1
  106. package/dist/es5/dd-resizable-handle.d.ts +1 -1
  107. package/dist/es5/dd-resizable-handle.js +1 -1
  108. package/dist/es5/dd-resizable-handle.js.map +1 -1
  109. package/dist/es5/dd-resizable.d.ts +1 -1
  110. package/dist/es5/dd-resizable.js +1 -1
  111. package/dist/es5/dd-resizable.js.map +1 -1
  112. package/dist/es5/dd-touch.d.ts +1 -1
  113. package/dist/es5/dd-touch.js +1 -1
  114. package/dist/es5/dd-touch.js.map +1 -1
  115. package/dist/es5/gridstack-all.js +1 -1
  116. package/dist/es5/gridstack-all.js.LICENSE.txt +1 -1
  117. package/dist/es5/gridstack-all.js.map +1 -1
  118. package/dist/es5/gridstack-engine.d.ts +1 -1
  119. package/dist/es5/gridstack-engine.js +1 -1
  120. package/dist/es5/gridstack-engine.js.map +1 -1
  121. package/dist/es5/gridstack-poly.js +1 -1
  122. package/dist/es5/gridstack.d.ts +1 -1
  123. package/dist/es5/gridstack.js +2 -2
  124. package/dist/es5/gridstack.js.map +1 -1
  125. package/dist/es5/types.d.ts +1 -1
  126. package/dist/es5/types.js +1 -1
  127. package/dist/es5/types.js.map +1 -1
  128. package/dist/es5/utils.d.ts +1 -1
  129. package/dist/es5/utils.js +1 -1
  130. package/dist/es5/utils.js.map +1 -1
  131. package/dist/gridstack-all.js +1 -1
  132. package/dist/gridstack-all.js.LICENSE.txt +1 -1
  133. package/dist/gridstack-all.js.map +1 -1
  134. package/dist/gridstack-engine.d.ts +1 -1
  135. package/dist/gridstack-engine.js +1 -1
  136. package/dist/gridstack-engine.js.map +1 -1
  137. package/dist/gridstack.css +1 -1
  138. package/dist/gridstack.d.ts +1 -1
  139. package/dist/gridstack.js +2 -2
  140. package/dist/gridstack.js.map +1 -1
  141. package/dist/src/gridstack-extra.scss +3 -3
  142. package/dist/src/gridstack.scss +1 -1
  143. package/dist/types.d.ts +1 -1
  144. package/dist/types.js +1 -1
  145. package/dist/types.js.map +1 -1
  146. package/dist/utils.d.ts +1 -1
  147. package/dist/utils.js +1 -1
  148. package/dist/utils.js.map +1 -1
  149. package/doc/CHANGES.md +4 -1
  150. package/package.json +3 -3
  151. package/dist/ng/gridstack-item.component.js +0 -65
  152. package/dist/ng/gridstack-item.component.js.map +0 -1
  153. package/dist/ng/gridstack.component.js +0 -245
  154. package/dist/ng/gridstack.component.js.map +0 -1
@@ -0,0 +1,233 @@
1
+ /**
2
+ * gridstack.component.ts 8.1.2
3
+ * Copyright (c) 2022 Alain Dumesny - see GridStack root license
4
+ */
5
+ import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild, ViewContainerRef, reflectComponentType } from '@angular/core';
6
+ import { Subject } from 'rxjs';
7
+ import { takeUntil } from 'rxjs/operators';
8
+ import { GridStack } from 'gridstack';
9
+ import { GridstackItemComponent } from './gridstack-item.component';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ /**
13
+ * HTML Component Wrapper for gridstack, in combination with GridstackItemComponent for the items
14
+ */
15
+ export class GridstackComponent {
16
+ constructor(
17
+ // private readonly zone: NgZone,
18
+ // private readonly cd: ChangeDetectorRef,
19
+ elementRef) {
20
+ this.elementRef = elementRef;
21
+ /** individual list of GridStackEvent callbacks handlers as output
22
+ * otherwise use this.grid.on('name1 name2 name3', callback) to handle multiple at once
23
+ * see https://github.com/gridstack/gridstack.js/blob/master/demo/events.js#L4
24
+ *
25
+ * Note: camel casing and 'CB' added at the end to prevent @angular-eslint/no-output-native
26
+ * eg: 'change' would trigger the raw CustomEvent so use different name.
27
+ */
28
+ this.addedCB = new EventEmitter();
29
+ this.changeCB = new EventEmitter();
30
+ this.disableCB = new EventEmitter();
31
+ this.dragCB = new EventEmitter();
32
+ this.dragStartCB = new EventEmitter();
33
+ this.dragStopCB = new EventEmitter();
34
+ this.droppedCB = new EventEmitter();
35
+ this.enableCB = new EventEmitter();
36
+ this.removedCB = new EventEmitter();
37
+ this.resizeCB = new EventEmitter();
38
+ this.resizeStartCB = new EventEmitter();
39
+ this.resizeStopCB = new EventEmitter();
40
+ this.ngUnsubscribe = new Subject();
41
+ this.el._gridComp = this;
42
+ }
43
+ /** initial options for creation of the grid */
44
+ set options(val) { this._options = val; }
45
+ /** return the current running options */
46
+ get options() { return this._grid?.opts || this._options || {}; }
47
+ /** return the native element that contains grid specific fields as well */
48
+ get el() { return this.elementRef.nativeElement; }
49
+ /** return the GridStack class */
50
+ get grid() { return this._grid; }
51
+ /** add a list of ng Component to be mapped to selector */
52
+ static addComponentToSelectorType(typeList) {
53
+ typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type);
54
+ }
55
+ /** return the ng Component selector */
56
+ static getSelector(type) {
57
+ const mirror = reflectComponentType(type);
58
+ return mirror.selector;
59
+ }
60
+ ngOnInit() {
61
+ // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets
62
+ this.loaded = !!this.options?.children?.length;
63
+ this._grid = GridStack.init(this._options, this.el);
64
+ delete this._options; // GS has it now
65
+ this.checkEmpty();
66
+ }
67
+ /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */
68
+ ngAfterContentInit() {
69
+ // track whenever the children list changes and update the layout...
70
+ this.gridstackItems?.changes
71
+ .pipe(takeUntil(this.ngUnsubscribe))
72
+ .subscribe(() => this.updateAll());
73
+ // ...and do this once at least unless we loaded children already
74
+ if (!this.loaded)
75
+ this.updateAll();
76
+ this.hookEvents(this.grid);
77
+ }
78
+ ngOnDestroy() {
79
+ this.ngUnsubscribe.next();
80
+ this.ngUnsubscribe.complete();
81
+ this.grid?.destroy();
82
+ delete this._grid;
83
+ delete this.el._gridComp;
84
+ }
85
+ /**
86
+ * called when the TEMPLATE list of items changes - get a list of nodes and
87
+ * update the layout accordingly (which will take care of adding/removing items changed by Angular)
88
+ */
89
+ updateAll() {
90
+ if (!this.grid)
91
+ return;
92
+ const layout = [];
93
+ this.gridstackItems?.forEach(item => {
94
+ layout.push(item.options);
95
+ item.clearOptions();
96
+ });
97
+ this.grid.load(layout); // efficient that does diffs only
98
+ }
99
+ /** check if the grid is empty, if so show alternative content */
100
+ checkEmpty() {
101
+ if (!this.grid)
102
+ return;
103
+ const isEmpty = !this.grid.engine.nodes.length;
104
+ if (isEmpty === this.isEmpty)
105
+ return;
106
+ this.isEmpty = isEmpty;
107
+ // this.cd.detectChanges();
108
+ }
109
+ /** get all known events as easy to use Outputs for convenience */
110
+ hookEvents(grid) {
111
+ if (!grid)
112
+ return;
113
+ grid
114
+ .on('added', (event, nodes) => { this.checkEmpty(); this.addedCB.emit({ event, nodes }); })
115
+ .on('change', (event, nodes) => this.changeCB.emit({ event, nodes }))
116
+ .on('disable', (event) => this.disableCB.emit({ event }))
117
+ .on('drag', (event, el) => this.dragCB.emit({ event, el }))
118
+ .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el }))
119
+ .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el }))
120
+ .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode }))
121
+ .on('enable', (event) => this.enableCB.emit({ event }))
122
+ .on('removed', (event, nodes) => { this.checkEmpty(); this.removedCB.emit({ event, nodes }); })
123
+ .on('resize', (event, el) => this.resizeCB.emit({ event, el }))
124
+ .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el }))
125
+ .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el }));
126
+ }
127
+ }
128
+ /**
129
+ * stores the selector -> Type mapping, so we can create items dynamically from a string.
130
+ * Unfortunately Ng doesn't provide public access to that mapping.
131
+ */
132
+ GridstackComponent.selectorToType = {};
133
+ GridstackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
134
+ GridstackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackComponent, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `
135
+ <!-- content to show when when grid is empty, like instructions on how to add widgets -->
136
+ <ng-content select="[empty-content]" *ngIf="isEmpty"></ng-content>
137
+ <!-- where dynamic items go -->
138
+ <ng-template #container></ng-template>
139
+ <!-- where template items go -->
140
+ <ng-content></ng-content>
141
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, decorators: [{
143
+ type: Component,
144
+ args: [{ selector: 'gridstack', template: `
145
+ <!-- content to show when when grid is empty, like instructions on how to add widgets -->
146
+ <ng-content select="[empty-content]" *ngIf="isEmpty"></ng-content>
147
+ <!-- where dynamic items go -->
148
+ <ng-template #container></ng-template>
149
+ <!-- where template items go -->
150
+ <ng-content></ng-content>
151
+ `, styles: [":host{display:block}\n"] }]
152
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { gridstackItems: [{
153
+ type: ContentChildren,
154
+ args: [GridstackItemComponent]
155
+ }], container: [{
156
+ type: ViewChild,
157
+ args: ['container', { read: ViewContainerRef, static: true }]
158
+ }], options: [{
159
+ type: Input
160
+ }], isEmpty: [{
161
+ type: Input
162
+ }], addedCB: [{
163
+ type: Output
164
+ }], changeCB: [{
165
+ type: Output
166
+ }], disableCB: [{
167
+ type: Output
168
+ }], dragCB: [{
169
+ type: Output
170
+ }], dragStartCB: [{
171
+ type: Output
172
+ }], dragStopCB: [{
173
+ type: Output
174
+ }], droppedCB: [{
175
+ type: Output
176
+ }], enableCB: [{
177
+ type: Output
178
+ }], removedCB: [{
179
+ type: Output
180
+ }], resizeCB: [{
181
+ type: Output
182
+ }], resizeStartCB: [{
183
+ type: Output
184
+ }], resizeStopCB: [{
185
+ type: Output
186
+ }] } });
187
+ /**
188
+ * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip)
189
+ **/
190
+ export function gsCreateNgComponents(host, w, add, isGrid) {
191
+ // only care about creating ng components here...
192
+ if (!add || !host)
193
+ return;
194
+ // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html
195
+ if (isGrid) {
196
+ let grid;
197
+ const gridItemComp = host.parentElement?._gridItemComp;
198
+ if (gridItemComp) {
199
+ grid = gridItemComp.container?.createComponent(GridstackComponent)?.instance;
200
+ }
201
+ else {
202
+ // TODO: figure out how to create ng component inside regular Div. need to access app injectors...
203
+ // const hostElement: Element = host;
204
+ // const environmentInjector: EnvironmentInjector;
205
+ // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance;
206
+ }
207
+ if (grid)
208
+ grid.options = w;
209
+ return grid?.el;
210
+ }
211
+ else {
212
+ const gridComp = host._gridComp;
213
+ const gridItem = gridComp?.container?.createComponent(GridstackItemComponent)?.instance;
214
+ // IFF we're not a subGrid, define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic
215
+ const selector = w.type;
216
+ const type = selector ? GridstackComponent.selectorToType[selector] : undefined;
217
+ if (!w.subGridOpts && type) {
218
+ gridItem?.container?.createComponent(type);
219
+ }
220
+ return gridItem?.el;
221
+ }
222
+ }
223
+ /**
224
+ * can be used when saving the grid - make sure we save the content from the field (not HTML as we get ng markups)
225
+ * and can put the extra info of type, otherwise content
226
+ */
227
+ export function gsSaveAdditionalNgInfo(n, w) {
228
+ if (n.type)
229
+ w.type = n.type;
230
+ else if (n.content)
231
+ w.content = n.content;
232
+ }
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQW9CLFNBQVMsRUFBRSxlQUFlLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFDakUsTUFBTSxFQUFtQixTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUF3QyxTQUFTLEVBQW9ELE1BQU0sV0FBVyxDQUFDO0FBRTlILE9BQU8sRUFBMkIsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBNEI3Rjs7R0FFRztBQWdCSCxNQUFNLE9BQU8sa0JBQWtCO0lBNkQ3QjtJQUNFLGlDQUFpQztJQUNqQywwQ0FBMEM7SUFDekIsVUFBMkM7UUFBM0MsZUFBVSxHQUFWLFVBQVUsQ0FBaUM7UUFqRDlEOzs7Ozs7V0FNRztRQUNjLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3ZDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3hDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ3ZDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUM1QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUMzQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUMxQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN2QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUN4QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUN6QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFDOUMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBMEJ0RCxrQkFBYSxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBT25ELElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBNURELCtDQUErQztJQUMvQyxJQUFvQixPQUFPLENBQUMsR0FBcUIsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0UseUNBQXlDO0lBQ3pDLElBQVcsT0FBTyxLQUF1QixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQXlCMUYsMkVBQTJFO0lBQzNFLElBQVcsRUFBRSxLQUEwQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU5RSxpQ0FBaUM7SUFDakMsSUFBVyxJQUFJLEtBQTRCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFPL0QsMERBQTBEO0lBQ25ELE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxRQUE2QjtRQUNwRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFFLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFDRCx1Q0FBdUM7SUFDaEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFrQjtRQUMxQyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUUsQ0FBQztRQUMzQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQWVNLFFBQVE7UUFDYixtSUFBbUk7UUFDbkksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxnQkFBZ0I7UUFFdEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxzSEFBc0g7SUFDL0csa0JBQWtCO1FBQ3ZCLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU87YUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3ZCLE1BQU0sTUFBTSxHQUFzQixFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7SUFDM0QsQ0FBQztJQUVELGlFQUFpRTtJQUMxRCxVQUFVO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUN2QixNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDL0MsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLDJCQUEyQjtJQUM3QixDQUFDO0lBRUQsa0VBQWtFO0lBQzFELFVBQVUsQ0FBQyxJQUFnQjtRQUNqQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsSUFBSTthQUNILEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFZLEVBQUUsS0FBc0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoSCxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBWSxFQUFFLEtBQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7YUFDMUYsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO2FBQzdELEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFZLEVBQUUsRUFBdUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQzthQUNwRixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBWSxFQUFFLEVBQXVCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7YUFDOUYsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQVksRUFBRSxFQUF1QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFDO2FBQzVGLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFZLEVBQUUsWUFBMkIsRUFBRSxPQUFzQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQzthQUN6SSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUM7YUFDM0QsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQVksRUFBRSxLQUFzQixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BILEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFZLEVBQUUsRUFBdUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQzthQUN4RixFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBWSxFQUFFLEVBQXVCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7YUFDbEcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQVksRUFBRSxFQUF1QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbkcsQ0FBQzs7QUEvRkQ7OztHQUdHO0FBQ1csaUNBQWMsR0FBbUIsRUFBRyxDQUFBOytHQTdDdkMsa0JBQWtCO21HQUFsQixrQkFBa0IscWJBR1osc0JBQXNCLGdIQUVQLGdCQUFnQiwyQ0FsQnRDOzs7Ozs7O0dBT1Q7MkZBTVUsa0JBQWtCO2tCQWY5QixTQUFTOytCQUNFLFdBQVcsWUFDWDs7Ozs7OztHQU9UO2lHQVMrQyxjQUFjO3NCQUE3RCxlQUFlO3VCQUFDLHNCQUFzQjtnQkFFaUMsU0FBUztzQkFBaEYsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQztnQkFHM0MsT0FBTztzQkFBMUIsS0FBSztnQkFLVSxPQUFPO3NCQUF0QixLQUFLO2dCQVNXLE9BQU87c0JBQXZCLE1BQU07Z0JBQ1UsUUFBUTtzQkFBeEIsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNO2dCQUNVLE1BQU07c0JBQXRCLE1BQU07Z0JBQ1UsV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxVQUFVO3NCQUExQixNQUFNO2dCQUNVLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsUUFBUTtzQkFBeEIsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNO2dCQUNVLFFBQVE7c0JBQXhCLE1BQU07Z0JBQ1UsYUFBYTtzQkFBN0IsTUFBTTtnQkFDVSxZQUFZO3NCQUE1QixNQUFNOztBQTBHVDs7SUFFSTtBQUNKLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUF1QyxFQUFFLENBQXVDLEVBQUUsR0FBWSxFQUFFLE1BQWU7SUFDbEosaURBQWlEO0lBQ2pELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTztJQUUxQixrSEFBa0g7SUFDbEgsSUFBSSxNQUFNLEVBQUU7UUFDVixJQUFJLElBQW9DLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUksSUFBSSxDQUFDLGFBQXlDLEVBQUUsYUFBYSxDQUFDO1FBQ3BGLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQztTQUM5RTthQUFNO1lBQ0wsa0dBQWtHO1lBQ2xHLHFDQUFxQztZQUNyQyxrREFBa0Q7WUFDbEQsNEZBQTRGO1NBQzdGO1FBQ0QsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFxQixDQUFDO1FBQy9DLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztLQUNqQjtTQUFNO1FBQ0wsTUFBTSxRQUFRLEdBQUksSUFBNEIsQ0FBQyxTQUFTLENBQUM7UUFDekQsTUFBTSxRQUFRLEdBQUcsUUFBUSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsc0JBQXNCLENBQUMsRUFBRSxRQUFRLENBQUM7UUFFeEYsd0pBQXdKO1FBQ3hKLE1BQU0sUUFBUSxHQUFJLENBQXVCLENBQUMsSUFBSSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEYsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO1lBQzFCLFFBQVEsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxRQUFRLEVBQUUsRUFBRSxDQUFDO0tBQ3JCO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxDQUFrQixFQUFFLENBQW9CO0lBQzdFLElBQUksQ0FBQyxDQUFDLElBQUk7UUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDdkIsSUFBSSxDQUFDLENBQUMsT0FBTztRQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBncmlkc3RhY2suY29tcG9uZW50LnRzIDguMS4yXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsXG4gIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVHlwZSwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCByZWZsZWN0Q29tcG9uZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgR3JpZEhUTUxFbGVtZW50LCBHcmlkSXRlbUhUTUxFbGVtZW50LCBHcmlkU3RhY2ssIEdyaWRTdGFja05vZGUsIEdyaWRTdGFja09wdGlvbnMsIEdyaWRTdGFja1dpZGdldCB9IGZyb20gJ2dyaWRzdGFjayc7XG5cbmltcG9ydCB7IEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50LCBHcmlkc3RhY2tJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9ncmlkc3RhY2staXRlbS5jb21wb25lbnQnO1xuXG4vKiogZXZlbnRzIGhhbmRsZXJzIGVtaXR0ZXJzIHNpZ25hdHVyZSBmb3IgZGlmZmVyZW50IGV2ZW50cyAqL1xuZXhwb3J0IHR5cGUgZXZlbnRDQiA9IHtldmVudDogRXZlbnR9O1xuZXhwb3J0IHR5cGUgZWxlbWVudENCID0ge2V2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnR9O1xuZXhwb3J0IHR5cGUgbm9kZXNDQiA9IHtldmVudDogRXZlbnQsIG5vZGVzOiBHcmlkU3RhY2tOb2RlW119O1xuZXhwb3J0IHR5cGUgZHJvcHBlZENCID0ge2V2ZW50OiBFdmVudCwgcHJldmlvdXNOb2RlOiBHcmlkU3RhY2tOb2RlLCBuZXdOb2RlOiBHcmlkU3RhY2tOb2RlfTtcblxuLyoqIGV4dGVuZHMgdG8gc3RvcmUgTmcgQ29tcG9uZW50IHNlbGVjdG9yLCBpbnN0ZWFkL2luQWRkaXRpb24gdG8gY29udGVudCAqL1xuZXhwb3J0IGludGVyZmFjZSBOZ0dyaWRTdGFja1dpZGdldCBleHRlbmRzIEdyaWRTdGFja1dpZGdldCB7XG4gIHR5cGU/OiBzdHJpbmc7IC8vIGNvbXBvbmVudCB0eXBlIHRvIGNyZWF0ZSBhcyBjb250ZW50XG59XG5leHBvcnQgaW50ZXJmYWNlIE5nR3JpZFN0YWNrTm9kZSBleHRlbmRzIEdyaWRTdGFja05vZGUge1xuICB0eXBlPzogc3RyaW5nOyAvLyBjb21wb25lbnQgdHlwZSB0byBjcmVhdGUgYXMgY29udGVudFxufVxuZXhwb3J0IGludGVyZmFjZSBOZ0dyaWRTdGFja09wdGlvbnMgZXh0ZW5kcyBHcmlkU3RhY2tPcHRpb25zIHtcbiAgY2hpbGRyZW4/OiBOZ0dyaWRTdGFja1dpZGdldFtdO1xuICBzdWJHcmlkT3B0cz86IE5nR3JpZFN0YWNrT3B0aW9ucztcbn1cblxuLyoqIHN0b3JlIGVsZW1lbnQgdG8gTmcgQ2xhc3MgcG9pbnRlciBiYWNrICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRDb21wSFRNTEVsZW1lbnQgZXh0ZW5kcyBHcmlkSFRNTEVsZW1lbnQge1xuICBfZ3JpZENvbXA/OiBHcmlkc3RhY2tDb21wb25lbnQ7XG59XG5cbi8qKiBzZWxlY3RvciBzdHJpbmcgdG8gcnVudGltZSBUeXBlIG1hcHBpbmcgKi9cbmV4cG9ydCB0eXBlIFNlbGVjdG9yVG9UeXBlID0ge1trZXk6IHN0cmluZ106IFR5cGU8T2JqZWN0Pn07XG5cbi8qKlxuICogSFRNTCBDb21wb25lbnQgV3JhcHBlciBmb3IgZ3JpZHN0YWNrLCBpbiBjb21iaW5hdGlvbiB3aXRoIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgZm9yIHRoZSBpdGVtc1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdncmlkc3RhY2snLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gY29udGVudCB0byBzaG93IHdoZW4gd2hlbiBncmlkIGlzIGVtcHR5LCBsaWtlIGluc3RydWN0aW9ucyBvbiBob3cgdG8gYWRkIHdpZGdldHMgLS0+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2VtcHR5LWNvbnRlbnRdXCIgKm5nSWY9XCJpc0VtcHR5XCI+PC9uZy1jb250ZW50PlxuICAgIDwhLS0gd2hlcmUgZHluYW1pYyBpdGVtcyBnbyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2NvbnRhaW5lcj48L25nLXRlbXBsYXRlPlxuICAgIDwhLS0gd2hlcmUgdGVtcGxhdGUgaXRlbXMgZ28gLS0+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfVxuICBgXSxcbiAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsIC8vIElGRiB5b3Ugd2FudCB0byBvcHRpbWl6ZSBhbmQgY29udHJvbCB3aGVuIENoYW5nZURldGVjdGlvbiBuZWVkcyB0byBoYXBwZW4uLi5cbn0pXG5leHBvcnQgY2xhc3MgR3JpZHN0YWNrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKiB0cmFjayBsaXN0IG9mIFRFTVBMQVRFIGdyaWQgaXRlbXMgc28gd2UgY2FuIHN5bmMgYmV0d2VlbiBET00gYW5kIEdTIGludGVybmFscyAqL1xuICBAQ29udGVudENoaWxkcmVuKEdyaWRzdGFja0l0ZW1Db21wb25lbnQpIHB1YmxpYyBncmlkc3RhY2tJdGVtcz86IFF1ZXJ5TGlzdDxHcmlkc3RhY2tJdGVtQ29tcG9uZW50PjtcbiAgLyoqIGNvbnRhaW5lciB0byBhcHBlbmQgaXRlbXMgZHluYW1pY2FsbHkgKi9cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWV9KSBwdWJsaWMgY29udGFpbmVyPzogVmlld0NvbnRhaW5lclJlZjtcblxuICAvKiogaW5pdGlhbCBvcHRpb25zIGZvciBjcmVhdGlvbiBvZiB0aGUgZ3JpZCAqL1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IG9wdGlvbnModmFsOiBHcmlkU3RhY2tPcHRpb25zKSB7IHRoaXMuX29wdGlvbnMgPSB2YWw7IH1cbiAgLyoqIHJldHVybiB0aGUgY3VycmVudCBydW5uaW5nIG9wdGlvbnMgKi9cbiAgcHVibGljIGdldCBvcHRpb25zKCk6IEdyaWRTdGFja09wdGlvbnMgeyByZXR1cm4gdGhpcy5fZ3JpZD8ub3B0cyB8fCB0aGlzLl9vcHRpb25zIHx8IHt9OyB9XG5cbiAgLyoqIHRydWUgd2hpbGUgbmctY29udGVudCB3aXRoICduby1pdGVtLWNvbnRlbnQnIHNob3VsZCBiZSBzaG93biB3aGVuIGxhc3QgaXRlbSBpcyByZW1vdmVkIGZyb20gYSBncmlkICovXG4gIEBJbnB1dCgpIHB1YmxpYyBpc0VtcHR5PzogYm9vbGVhbjtcblxuICAvKiogaW5kaXZpZHVhbCBsaXN0IG9mIEdyaWRTdGFja0V2ZW50IGNhbGxiYWNrcyBoYW5kbGVycyBhcyBvdXRwdXRcbiAgICogb3RoZXJ3aXNlIHVzZSB0aGlzLmdyaWQub24oJ25hbWUxIG5hbWUyIG5hbWUzJywgY2FsbGJhY2spIHRvIGhhbmRsZSBtdWx0aXBsZSBhdCBvbmNlXG4gICAqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy9ibG9iL21hc3Rlci9kZW1vL2V2ZW50cy5qcyNMNFxuICAgKlxuICAgKiBOb3RlOiBjYW1lbCBjYXNpbmcgYW5kICdDQicgYWRkZWQgYXQgdGhlIGVuZCB0byBwcmV2ZW50IEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gICAqIGVnOiAnY2hhbmdlJyB3b3VsZCB0cmlnZ2VyIHRoZSByYXcgQ3VzdG9tRXZlbnQgc28gdXNlIGRpZmZlcmVudCBuYW1lLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBhZGRlZENCID0gbmV3IEV2ZW50RW1pdHRlcjxub2Rlc0NCPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZUNCID0gbmV3IEV2ZW50RW1pdHRlcjxub2Rlc0NCPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGRpc2FibGVDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZXZlbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBkcmFnQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBkcmFnU3RhcnRDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGRyYWdTdG9wQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBkcm9wcGVkQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGRyb3BwZWRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBlbmFibGVDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZXZlbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZW1vdmVkQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPG5vZGVzQ0I+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVzaXplQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZXNpemVTdGFydENCID0gbmV3IEV2ZW50RW1pdHRlcjxlbGVtZW50Q0I+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVzaXplU3RvcENCID0gbmV3IEV2ZW50RW1pdHRlcjxlbGVtZW50Q0I+KCk7XG5cbiAgLyoqIHJldHVybiB0aGUgbmF0aXZlIGVsZW1lbnQgdGhhdCBjb250YWlucyBncmlkIHNwZWNpZmljIGZpZWxkcyBhcyB3ZWxsICovXG4gIHB1YmxpYyBnZXQgZWwoKTogR3JpZENvbXBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsgfVxuXG4gIC8qKiByZXR1cm4gdGhlIEdyaWRTdGFjayBjbGFzcyAqL1xuICBwdWJsaWMgZ2V0IGdyaWQoKTogR3JpZFN0YWNrIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2dyaWQ7IH1cblxuICAvKipcbiAgICogc3RvcmVzIHRoZSBzZWxlY3RvciAtPiBUeXBlIG1hcHBpbmcsIHNvIHdlIGNhbiBjcmVhdGUgaXRlbXMgZHluYW1pY2FsbHkgZnJvbSBhIHN0cmluZy5cbiAgICogVW5mb3J0dW5hdGVseSBOZyBkb2Vzbid0IHByb3ZpZGUgcHVibGljIGFjY2VzcyB0byB0aGF0IG1hcHBpbmcuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlbGVjdG9yVG9UeXBlOiBTZWxlY3RvclRvVHlwZSA9IHt9O1xuICAvKiogYWRkIGEgbGlzdCBvZiBuZyBDb21wb25lbnQgdG8gYmUgbWFwcGVkIHRvIHNlbGVjdG9yICovXG4gIHB1YmxpYyBzdGF0aWMgYWRkQ29tcG9uZW50VG9TZWxlY3RvclR5cGUodHlwZUxpc3Q6IEFycmF5PFR5cGU8T2JqZWN0Pj4pIHtcbiAgICB0eXBlTGlzdC5mb3JFYWNoKHR5cGUgPT4gR3JpZHN0YWNrQ29tcG9uZW50LnNlbGVjdG9yVG9UeXBlWyBHcmlkc3RhY2tDb21wb25lbnQuZ2V0U2VsZWN0b3IodHlwZSkgXSA9IHR5cGUpO1xuICB9XG4gIC8qKiByZXR1cm4gdGhlIG5nIENvbXBvbmVudCBzZWxlY3RvciAqL1xuICBwdWJsaWMgc3RhdGljIGdldFNlbGVjdG9yKHR5cGU6IFR5cGU8T2JqZWN0Pik6IHN0cmluZyB7XG4gICAgY29uc3QgbWlycm9yID0gcmVmbGVjdENvbXBvbmVudFR5cGUodHlwZSkhO1xuICAgIHJldHVybiBtaXJyb3Iuc2VsZWN0b3I7XG4gIH1cblxuICBwcml2YXRlIF9vcHRpb25zPzogR3JpZFN0YWNrT3B0aW9ucztcbiAgcHJpdmF0ZSBfZ3JpZD86IEdyaWRTdGFjaztcbiAgcHJpdmF0ZSBsb2FkZWQ/OiBib29sZWFuO1xuICBwcml2YXRlIG5nVW5zdWJzY3JpYmU6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lLFxuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxHcmlkQ29tcEhUTUxFbGVtZW50PixcbiAgKSB7XG4gICAgdGhpcy5lbC5fZ3JpZENvbXAgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGluaXQgb3Vyc2VsZiBiZWZvcmUgYW55IHRlbXBsYXRlIGNoaWxkcmVuIGFyZSBjcmVhdGVkIHNpbmNlIHdlIHRyYWNrIHRoZW0gYmVsb3cgYW55d2F5IC0gbm8gbmVlZCB0byBkb3VibGUgY3JlYXRlK3VwZGF0ZSB3aWRnZXRzXG4gICAgdGhpcy5sb2FkZWQgPSAhIXRoaXMub3B0aW9ucz8uY2hpbGRyZW4/Lmxlbmd0aDtcbiAgICB0aGlzLl9ncmlkID0gR3JpZFN0YWNrLmluaXQodGhpcy5fb3B0aW9ucywgdGhpcy5lbCk7XG4gICAgZGVsZXRlIHRoaXMuX29wdGlvbnM7IC8vIEdTIGhhcyBpdCBub3dcblxuICAgIHRoaXMuY2hlY2tFbXB0eSgpO1xuICB9XG5cbiAgLyoqIHdhaXQgdW50aWwgYWZ0ZXIgYWxsIERPTSBpcyByZWFkeSB0byBpbml0IGdyaWRzdGFjayBjaGlsZHJlbiAoYWZ0ZXIgYW5ndWxhciBuZ0ZvciBhbmQgc3ViLWNvbXBvbmVudHMgcnVuIGZpcnN0KSAqL1xuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIC8vIHRyYWNrIHdoZW5ldmVyIHRoZSBjaGlsZHJlbiBsaXN0IGNoYW5nZXMgYW5kIHVwZGF0ZSB0aGUgbGF5b3V0Li4uXG4gICAgdGhpcy5ncmlkc3RhY2tJdGVtcz8uY2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlQWxsKCkpO1xuICAgIC8vIC4uLmFuZCBkbyB0aGlzIG9uY2UgYXQgbGVhc3QgdW5sZXNzIHdlIGxvYWRlZCBjaGlsZHJlbiBhbHJlYWR5XG4gICAgaWYgKCF0aGlzLmxvYWRlZCkgdGhpcy51cGRhdGVBbGwoKTtcbiAgICB0aGlzLmhvb2tFdmVudHModGhpcy5ncmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZ3JpZD8uZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLl9ncmlkO1xuICAgIGRlbGV0ZSB0aGlzLmVsLl9ncmlkQ29tcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiB0aGUgVEVNUExBVEUgbGlzdCBvZiBpdGVtcyBjaGFuZ2VzIC0gZ2V0IGEgbGlzdCBvZiBub2RlcyBhbmRcbiAgICogdXBkYXRlIHRoZSBsYXlvdXQgYWNjb3JkaW5nbHkgKHdoaWNoIHdpbGwgdGFrZSBjYXJlIG9mIGFkZGluZy9yZW1vdmluZyBpdGVtcyBjaGFuZ2VkIGJ5IEFuZ3VsYXIpXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQWxsKCkge1xuICAgIGlmICghdGhpcy5ncmlkKSByZXR1cm47XG4gICAgY29uc3QgbGF5b3V0OiBHcmlkU3RhY2tXaWRnZXRbXSA9IFtdO1xuICAgIHRoaXMuZ3JpZHN0YWNrSXRlbXM/LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBsYXlvdXQucHVzaChpdGVtLm9wdGlvbnMpO1xuICAgICAgaXRlbS5jbGVhck9wdGlvbnMoKTtcbiAgICB9KTtcbiAgICB0aGlzLmdyaWQubG9hZChsYXlvdXQpOyAvLyBlZmZpY2llbnQgdGhhdCBkb2VzIGRpZmZzIG9ubHlcbiAgfVxuXG4gIC8qKiBjaGVjayBpZiB0aGUgZ3JpZCBpcyBlbXB0eSwgaWYgc28gc2hvdyBhbHRlcm5hdGl2ZSBjb250ZW50ICovXG4gIHB1YmxpYyBjaGVja0VtcHR5KCkge1xuICAgIGlmICghdGhpcy5ncmlkKSByZXR1cm47XG4gICAgY29uc3QgaXNFbXB0eSA9ICF0aGlzLmdyaWQuZW5naW5lLm5vZGVzLmxlbmd0aDtcbiAgICBpZiAoaXNFbXB0eSA9PT0gdGhpcy5pc0VtcHR5KSByZXR1cm47XG4gICAgdGhpcy5pc0VtcHR5ID0gaXNFbXB0eTtcbiAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBnZXQgYWxsIGtub3duIGV2ZW50cyBhcyBlYXN5IHRvIHVzZSBPdXRwdXRzIGZvciBjb252ZW5pZW5jZSAqL1xuICBwcml2YXRlIGhvb2tFdmVudHMoZ3JpZD86IEdyaWRTdGFjaykge1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIGdyaWRcbiAgICAub24oJ2FkZGVkJywgKGV2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXSkgPT4geyB0aGlzLmNoZWNrRW1wdHkoKTsgdGhpcy5hZGRlZENCLmVtaXQoe2V2ZW50LCBub2Rlc30pOyB9KVxuICAgIC5vbignY2hhbmdlJywgKGV2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXSkgPT4gdGhpcy5jaGFuZ2VDQi5lbWl0KHtldmVudCwgbm9kZXN9KSlcbiAgICAub24oJ2Rpc2FibGUnLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLmRpc2FibGVDQi5lbWl0KHtldmVudH0pKVxuICAgIC5vbignZHJhZycsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLmRyYWdDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgICAub24oJ2RyYWdzdGFydCcsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLmRyYWdTdGFydENCLmVtaXQoe2V2ZW50LCBlbH0pKVxuICAgIC5vbignZHJhZ3N0b3AnLCAoZXZlbnQ6IEV2ZW50LCBlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCkgPT4gdGhpcy5kcmFnU3RvcENCLmVtaXQoe2V2ZW50LCBlbH0pKVxuICAgIC5vbignZHJvcHBlZCcsIChldmVudDogRXZlbnQsIHByZXZpb3VzTm9kZTogR3JpZFN0YWNrTm9kZSwgbmV3Tm9kZTogR3JpZFN0YWNrTm9kZSkgPT4gdGhpcy5kcm9wcGVkQ0IuZW1pdCh7ZXZlbnQsIHByZXZpb3VzTm9kZSwgbmV3Tm9kZX0pKVxuICAgIC5vbignZW5hYmxlJywgKGV2ZW50OiBFdmVudCkgPT4gdGhpcy5lbmFibGVDQi5lbWl0KHtldmVudH0pKVxuICAgIC5vbigncmVtb3ZlZCcsIChldmVudDogRXZlbnQsIG5vZGVzOiBHcmlkU3RhY2tOb2RlW10pID0+IHsgdGhpcy5jaGVja0VtcHR5KCk7IHRoaXMucmVtb3ZlZENCLmVtaXQoe2V2ZW50LCBub2Rlc30pOyB9KVxuICAgIC5vbigncmVzaXplJywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMucmVzaXplQ0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgLm9uKCdyZXNpemVzdGFydCcsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLnJlc2l6ZVN0YXJ0Q0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgLm9uKCdyZXNpemVzdG9wJywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMucmVzaXplU3RvcENCLmVtaXQoe2V2ZW50LCBlbH0pKVxuICB9XG59XG5cbi8qKlxuICogY2FuIGJlIHVzZWQgd2hlbiBhIG5ldyBpdGVtIG5lZWRzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdlIGRvIGFzIGEgQW5ndWxhciBjb21wb25lbnQsIG9yIGRlbGV0ZWQgKHNraXApXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ3NDcmVhdGVOZ0NvbXBvbmVudHMoaG9zdDogR3JpZENvbXBIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50LCB3OiBOZ0dyaWRTdGFja1dpZGdldCB8IEdyaWRTdGFja09wdGlvbnMsIGFkZDogYm9vbGVhbiwgaXNHcmlkOiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAvLyBvbmx5IGNhcmUgYWJvdXQgY3JlYXRpbmcgbmcgY29tcG9uZW50cyBoZXJlLi4uXG4gIGlmICghYWRkIHx8ICFob3N0KSByZXR1cm47XG5cbiAgLy8gY3JlYXRlIHRoZSBjb21wb25lbnQgZHluYW1pY2FsbHkgLSBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2RvY3MvdHMvbGF0ZXN0L2Nvb2tib29rL2R5bmFtaWMtY29tcG9uZW50LWxvYWRlci5odG1sXG4gIGlmIChpc0dyaWQpIHtcbiAgICBsZXQgZ3JpZDogR3JpZHN0YWNrQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdyaWRJdGVtQ29tcCA9IChob3N0LnBhcmVudEVsZW1lbnQgYXMgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQpPy5fZ3JpZEl0ZW1Db21wO1xuICAgIGlmIChncmlkSXRlbUNvbXApIHtcbiAgICAgIGdyaWQgPSBncmlkSXRlbUNvbXAuY29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoR3JpZHN0YWNrQ29tcG9uZW50KT8uaW5zdGFuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIGNyZWF0ZSBuZyBjb21wb25lbnQgaW5zaWRlIHJlZ3VsYXIgRGl2LiBuZWVkIHRvIGFjY2VzcyBhcHAgaW5qZWN0b3JzLi4uXG4gICAgICAvLyBjb25zdCBob3N0RWxlbWVudDogRWxlbWVudCA9IGhvc3Q7XG4gICAgICAvLyBjb25zdCBlbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yO1xuICAgICAgLy8gZ3JpZCA9IGNyZWF0ZUNvbXBvbmVudChHcmlkc3RhY2tDb21wb25lbnQsIHtlbnZpcm9ubWVudEluamVjdG9yLCBob3N0RWxlbWVudH0pPy5pbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKGdyaWQpIGdyaWQub3B0aW9ucyA9IHcgYXMgR3JpZFN0YWNrT3B0aW9ucztcbiAgICByZXR1cm4gZ3JpZD8uZWw7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZ3JpZENvbXAgPSAoaG9zdCBhcyBHcmlkQ29tcEhUTUxFbGVtZW50KS5fZ3JpZENvbXA7XG4gICAgY29uc3QgZ3JpZEl0ZW0gPSBncmlkQ29tcD8uY29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoR3JpZHN0YWNrSXRlbUNvbXBvbmVudCk/Lmluc3RhbmNlO1xuXG4gICAgLy8gSUZGIHdlJ3JlIG5vdCBhIHN1YkdyaWQsIGRlZmluZSB3aGF0IHR5cGUgb2YgY29tcG9uZW50IHRvIGNyZWF0ZSBhcyBjaGlsZCwgT1IgeW91IGNhbiBkbyBpdCBHcmlkc3RhY2tJdGVtQ29tcG9uZW50IHRlbXBsYXRlLCBidXQgdGhpcyBpcyBtb3JlIGdlbmVyaWNcbiAgICBjb25zdCBzZWxlY3RvciA9ICh3IGFzIE5nR3JpZFN0YWNrV2lkZ2V0KS50eXBlO1xuICAgIGNvbnN0IHR5cGUgPSBzZWxlY3RvciA/IEdyaWRzdGFja0NvbXBvbmVudC5zZWxlY3RvclRvVHlwZVtzZWxlY3Rvcl0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF3LnN1YkdyaWRPcHRzICYmIHR5cGUpIHtcbiAgICAgIGdyaWRJdGVtPy5jb250YWluZXI/LmNyZWF0ZUNvbXBvbmVudCh0eXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JpZEl0ZW0/LmVsO1xuICB9XG59XG5cbi8qKlxuICogY2FuIGJlIHVzZWQgd2hlbiBzYXZpbmcgdGhlIGdyaWQgLSBtYWtlIHN1cmUgd2Ugc2F2ZSB0aGUgY29udGVudCBmcm9tIHRoZSBmaWVsZCAobm90IEhUTUwgYXMgd2UgZ2V0IG5nIG1hcmt1cHMpXG4gKiBhbmQgY2FuIHB1dCB0aGUgZXh0cmEgaW5mbyBvZiB0eXBlLCBvdGhlcndpc2UgY29udGVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3NTYXZlQWRkaXRpb25hbE5nSW5mbyhuOiBOZ0dyaWRTdGFja05vZGUsIHc6IE5nR3JpZFN0YWNrV2lkZ2V0KSB7XG4gIGlmIChuLnR5cGUpIHcudHlwZSA9IG4udHlwZTtcbiAgZWxzZSBpZiAobi5jb250ZW50KSB3LmNvbnRlbnQgPSBuLmNvbnRlbnQ7XG59XG4iXX0=
@@ -0,0 +1,39 @@
1
+ /**
2
+ * gridstack.component.ts 8.1.2
3
+ * Copyright (c) 2022 Alain Dumesny - see GridStack root license
4
+ */
5
+ import { NgModule } from "@angular/core";
6
+ import { CommonModule } from '@angular/common';
7
+ import { GridStack } from "gridstack";
8
+ import { GridstackComponent, gsCreateNgComponents, gsSaveAdditionalNgInfo } from "./gridstack.component";
9
+ import { GridstackItemComponent } from "./gridstack-item.component";
10
+ import * as i0 from "@angular/core";
11
+ export class GridstackModule {
12
+ constructor() {
13
+ // set globally our method to create the right widget type
14
+ GridStack.addRemoveCB = gsCreateNgComponents;
15
+ GridStack.saveCB = gsSaveAdditionalNgInfo;
16
+ }
17
+ }
18
+ GridstackModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
19
+ GridstackModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, declarations: [GridstackComponent,
20
+ GridstackItemComponent], imports: [CommonModule], exports: [GridstackComponent,
21
+ GridstackItemComponent] });
22
+ GridstackModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [CommonModule] });
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, decorators: [{
24
+ type: NgModule,
25
+ args: [{
26
+ imports: [
27
+ CommonModule,
28
+ ],
29
+ declarations: [
30
+ GridstackComponent,
31
+ GridstackItemComponent,
32
+ ],
33
+ exports: [
34
+ GridstackComponent,
35
+ GridstackItemComponent,
36
+ ],
37
+ }]
38
+ }], ctorParameters: function () { return []; } });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQWVwRSxNQUFNLE9BQU8sZUFBZTtJQUMxQjtRQUNFLDBEQUEwRDtRQUMxRCxTQUFTLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDO1FBQzdDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsc0JBQXNCLENBQUM7SUFDNUMsQ0FBQzs7NEdBTFUsZUFBZTs2R0FBZixlQUFlLGlCQVJ4QixrQkFBa0I7UUFDbEIsc0JBQXNCLGFBSnRCLFlBQVksYUFPWixrQkFBa0I7UUFDbEIsc0JBQXNCOzZHQUdiLGVBQWUsWUFYeEIsWUFBWTsyRkFXSCxlQUFlO2tCQWIzQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3FCQUNiO29CQUNELFlBQVksRUFBRTt3QkFDWixrQkFBa0I7d0JBQ2xCLHNCQUFzQjtxQkFDdkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIsc0JBQXNCO3FCQUN2QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBncmlkc3RhY2suY29tcG9uZW50LnRzIDguMS4yXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMiBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQgeyBHcmlkU3RhY2sgfSBmcm9tIFwiZ3JpZHN0YWNrXCI7XHJcbmltcG9ydCB7IEdyaWRzdGFja0NvbXBvbmVudCwgZ3NDcmVhdGVOZ0NvbXBvbmVudHMsIGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm8gfSBmcm9tIFwiLi9ncmlkc3RhY2suY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdyaWRzdGFja0l0ZW1Db21wb25lbnQgfSBmcm9tIFwiLi9ncmlkc3RhY2staXRlbS5jb21wb25lbnRcIjtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gIF0sXHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBHcmlkc3RhY2tDb21wb25lbnQsXHJcbiAgICBHcmlkc3RhY2tJdGVtQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgR3JpZHN0YWNrQ29tcG9uZW50LFxyXG4gICAgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JpZHN0YWNrTW9kdWxlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIHNldCBnbG9iYWxseSBvdXIgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmlnaHQgd2lkZ2V0IHR5cGVcclxuICAgIEdyaWRTdGFjay5hZGRSZW1vdmVDQiA9IGdzQ3JlYXRlTmdDb21wb25lbnRzO1xyXG4gICAgR3JpZFN0YWNrLnNhdmVDQiA9IGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm87XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Public API Surface of gridstack-angular
3
+ */
4
+ export * from './lib/gridstack-item.component';
5
+ export * from './lib/gridstack.component';
6
+ export * from './lib/gridstack.module';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsd0JBQXdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGdyaWRzdGFjay1hbmd1bGFyXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWRzdGFjay5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3JpZHN0YWNrLm1vZHVsZSc7XG4iXX0=