@nativescript-community/ui-collectionview 5.2.0 → 5.3.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.
Files changed (32) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/angular/collectionview-comp.d.ts +3 -3
  3. package/angular/esm2022/collectionview-comp.mjs +416 -0
  4. package/angular/{esm2020 → esm2022}/index.mjs +4 -4
  5. package/angular/{fesm2020 → fesm2022}/nativescript-community-ui-collectionview-angular.mjs +68 -49
  6. package/angular/{fesm2020 → fesm2022}/nativescript-community-ui-collectionview-angular.mjs.map +1 -1
  7. package/angular/package.json +4 -10
  8. package/index-common.d.ts +3 -5
  9. package/index-common.js +101 -24
  10. package/index-common.js.map +1 -1
  11. package/index.android.d.ts +11 -5
  12. package/index.android.js +198 -96
  13. package/index.android.js.map +1 -1
  14. package/index.ios.d.ts +1 -1
  15. package/package.json +2 -2
  16. package/platforms/android/AndroidManifest.xml +1 -1
  17. package/platforms/android/include.gradle +4 -3
  18. package/platforms/android/java/com/nativescript/collectionview/GridLayoutManager.java +9 -0
  19. package/platforms/android/java/com/nativescript/collectionview/OverlapDecoration.java +22 -0
  20. package/platforms/android/java/com/nativescript/collectionview/RecyclerView.java +21 -1
  21. package/platforms/android/java/com/nativescript/collectionview/SizeChangedListener.java +2 -1
  22. package/react/index.d.ts +5 -5
  23. package/svelte/index.d.ts +0 -1
  24. package/typings/android.d.ts +16 -2
  25. package/typings/android.wasabeef.d.ts +843 -0
  26. package/vue3/component.d.ts +1 -1
  27. package/vue3/component.js +16 -9
  28. package/vue3/component.js.map +1 -1
  29. package/angular/esm2020/collectionview-comp.mjs +0 -397
  30. package/angular/fesm2015/nativescript-community-ui-collectionview-angular.mjs +0 -441
  31. package/angular/fesm2015/nativescript-community-ui-collectionview-angular.mjs.map +0 -1
  32. /package/angular/{esm2020 → esm2022}/nativescript-community-ui-collectionview-angular.mjs +0 -0
@@ -33,4 +33,4 @@ export declare const CollectionView: import("nativescript-vue").DefineComponent<
33
33
  }>>, {
34
34
  itemIdGenerator: string;
35
35
  alias: string;
36
- }>;
36
+ }, {}>;
package/vue3/component.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { CollectionView as NSCollectionView } from '..';
2
2
  import { Observable, ObservableArray } from '@nativescript/core';
3
- import { computed, defineComponent, getCurrentInstance, h, ref, toRaw, warn, watch } from 'nativescript-vue';
3
+ import { ELEMENT_REF, NSVElement, NSVRoot, computed, defineComponent, getCurrentInstance, h, ref, render, toRaw, warn, watch } from 'nativescript-vue';
4
4
  const LIST_CELL_ID = Symbol('list_cell_id');
5
+ const LIST_CELL_CONTAINER = Symbol('list_cell_container');
5
6
  function getItemCtx(item, index, itemAlias, indexAlias) {
6
7
  return {
7
8
  [itemAlias]: item,
@@ -51,24 +52,30 @@ export const CollectionView = defineComponent({
51
52
  const itemCtx = getItemCtx(event.bindingContext, index, props.alias, props.itemIdGenerator);
52
53
  // const itemCtx: ListItem = getItemCtx(props.items instanceof ObservableArray ? props.items.getItem(index) : props.items[index], index, props.alias, props.itemIdGenerator);
53
54
  // update the cell data with the current row
55
+ const slotName = getSlotName(itemCtx, index, event.object.items);
54
56
  cells.value[id] = {
55
57
  itemCtx,
56
- slotName: getSlotName(itemCtx, index, event.object.items)
58
+ slotName
57
59
  };
58
60
  // trigger an update!
59
- vm?.update();
61
+ // vm?.update();
60
62
  // find the vnode rendering this cell
61
- const vnode = (vm?.subTree.children).find((vnode) => vnode.key === id);
62
- const cellEl = toRaw(vnode?.el?.nativeView);
63
- cellEl[LIST_CELL_ID] = id;
63
+ const container = event.view?.[LIST_CELL_CONTAINER] ?? new NSVRoot();
64
+ const vnode = ctx.slots[slotName]?.(itemCtx)[0];
64
65
  if (event.view) {
65
66
  event.view._batchUpdate(() => {
66
- event.view = cellEl;
67
+ // todo: handle the case where the slot is not found
68
+ render(vnode, container);
67
69
  });
68
70
  }
69
71
  else {
70
- event.view = cellEl;
72
+ // todo: handle the case where the slot is not found
73
+ render(vnode, container);
71
74
  }
75
+ const cellEl = toRaw(vnode?.el?.nativeView);
76
+ cellEl[LIST_CELL_ID] = id;
77
+ cellEl[LIST_CELL_CONTAINER] = container;
78
+ event.view = cellEl;
72
79
  }
73
80
  // render all realized templates as children
74
81
  const cellVNODES = () => Object.entries(cells.value).map(([id, entry]) => {
@@ -91,7 +98,7 @@ export const CollectionView = defineComponent({
91
98
  items: props.items,
92
99
  itemTemplates,
93
100
  onItemLoading
94
- }, cellVNODES());
101
+ });
95
102
  }
96
103
  });
97
104
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"../src/","sources":["vue3/component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,gBAAgB,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAiB,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAmB,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAc9H,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAE5C,SAAS,UAAU,CAAC,IAAS,EAAE,KAAa,EAAE,SAAiB,EAAE,UAAkB;IAC/E,OAAO;QACH,CAAC,SAAS,CAAC,EAAE,IAAI;QACjB,CAAC,UAAU,CAAC,EAAE,KAAK;QACnB,KAAK;QACL,IAAI,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC;QACrB,GAAG,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC;KACvB,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;IAC1C,KAAK,EAAE;QACH,KAAK,EAAE;YACH,IAAI,EAAE,MAAgD;YACtD,QAAQ,EAAE,IAAI;SACjB;QACD,KAAK,EAAE;YACH,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM;SAClB;QACD,eAAe,EAAE;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,QAAQ;SACpB;QACD,oBAAoB,EAAE,QAAQ;KACjC;IACD,KAAK,CAAC,KAAK,EAAE,GAAG;QACZ,0IAA0I;QAE1I,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC5D,GAAG,EAAE,QAAQ;YACb,UAAU;gBACN,kCAAkC;YACtC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,MAAM,WAAW,GAAG,CAAC,OAAiB,EAAE,KAAa,EAAE,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC;QAE9I,MAAM,cAAc,GAAG,GAAG,CAAyC,IAAI,CAAC,CAAC;QAEzE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAEhC,KAAK,CACD,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EACjB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACf,IAAI,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,EAAE;gBACjC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;aACtD;QACL,CAAC,CACJ,CAAC;QAEF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,KAAK,GAAG,GAAG,CAA+B,EAAE,CAAC,CAAC;QAEpD,SAAS,aAAa,CAAC,KAA0B;YAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC;YAEvD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;YAC5F,6KAA6K;YAE7K,4CAA4C;YAC5C,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG;gBACd,OAAO;gBACP,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;aAC5D,CAAC;YAEF,qBAAqB;YACrB,EAAE,EAAE,MAAM,EAAE,CAAC;YAEb,qCAAqC;YACrC,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,QAAoB,CAAA,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YAE1B,IAAI,KAAK,CAAC,IAAI,EAAE;gBACZ,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;oBACzB,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;gBACxB,CAAC,CAAC,CAAC;aACN;iBAAM;gBACH,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;aACvB;QACL,CAAC;QAED,4CAA4C;QAC5C,MAAM,UAAU,GAAG,GAAG,EAAE,CACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAY,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI;gBAClE,mCAAmC;gBACnC,CAAC,CAAC,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;iBACnC,CAAC;aACL,CAAC;YAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,IAAI,CAAC,gEAAgE,MAAM,CAAC,MAAM,oCAAoC,CAAC,CAAC;aAC3H;YAED,MAAM,KAAK,GAAU,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/B,qEAAqE;YACrE,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;YAEf,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QAEP,OAAO,GAAG,EAAE,CACR,CAAC,CACG,sBAAsB,EACtB;YACI,GAAG,EAAE,cAAc;YACnB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,aAAa;YACb,aAAa;SAChB,EACD,UAAU,EAAE,CACf,CAAC;IACV,CAAC;CACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"component.js","sourceRoot":"../src/","sources":["vue3/component.ts"],"names":[],"mappings":"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"}
@@ -1,397 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ComponentRef, ContentChild, Directive, ElementRef, EmbeddedViewRef, EventEmitter, Host, HostListener, Inject, Input, IterableDiffers, NgZone, Output, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
2
- import { CLog, CLogTypes, CollectionView, ListViewViewTypes } from '@nativescript-community/ui-collectionview';
3
- import { DetachedLoader, NativeScriptRendererFactory, extractSingleViewRecursive, isListLikeIterable, registerElement } from '@nativescript/angular';
4
- import { LayoutBase, ObservableArray, Trace, View } from '@nativescript/core';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@nativescript/angular";
7
- const _c0 = ["loader"];
8
- registerElement('CollectionView', () => CollectionView);
9
- const NG_VIEW = '_ngViewRef';
10
- export class ItemContext {
11
- constructor($implicit, item, index, even, odd) {
12
- this.$implicit = $implicit;
13
- this.item = item;
14
- this.index = index;
15
- this.even = even;
16
- this.odd = odd;
17
- }
18
- }
19
- export class CollectionViewComponent {
20
- constructor(_elementRef, _iterableDiffers, _renderer, _ngZone) {
21
- this._elementRef = _elementRef;
22
- this._iterableDiffers = _iterableDiffers;
23
- this._renderer = _renderer;
24
- this._ngZone = _ngZone;
25
- this.setupItemView = new EventEmitter();
26
- this.autoReuseViews = false;
27
- this.itemViewLoader = (viewType) => this._ngZone.run(() => {
28
- switch (viewType) {
29
- case ListViewViewTypes.ItemView:
30
- if (this._itemTemplate && this.loader) {
31
- const typedView = this.getOrCreate(this._itemTemplate);
32
- return typedView;
33
- }
34
- break;
35
- }
36
- return null;
37
- });
38
- this.viewPool = new Map();
39
- this.viewToTemplate = new WeakMap();
40
- this.viewToLoader = new WeakMap();
41
- this._collectionView = _elementRef.nativeElement;
42
- this._collectionView.on(CollectionView.itemLoadingEvent, this.onItemLoading, this);
43
- this._collectionView.itemViewLoader = this.itemViewLoader;
44
- this._loaders = [];
45
- }
46
- get nativeElement() {
47
- return this._collectionView;
48
- }
49
- get listView() {
50
- return this._collectionView;
51
- }
52
- detachedLoaderFactory() {
53
- const ref = this.loader.createComponent(DetachedLoader, {
54
- index: 0
55
- });
56
- this.loader.detach(0);
57
- this._loaders.push(ref);
58
- return ref;
59
- }
60
- get itemTemplate() {
61
- return this._itemTemplate;
62
- }
63
- set itemTemplate(value) {
64
- this._itemTemplate = value;
65
- this._collectionView.refresh();
66
- }
67
- get items() {
68
- return this._items;
69
- }
70
- set items(value) {
71
- this._items = value;
72
- let needDiffer = true;
73
- if (value instanceof ObservableArray) {
74
- needDiffer = false;
75
- }
76
- if (needDiffer && !this._differ && isListLikeIterable(value)) {
77
- this._differ = this._iterableDiffers.find(this._items).create((_index, item) => item);
78
- }
79
- this._collectionView.items = this._items;
80
- }
81
- ngAfterContentInit() {
82
- if (Trace.isEnabled()) {
83
- CLog(CLogTypes.info, 'CollectionView.ngAfterContentInit()');
84
- }
85
- this.setItemTemplates();
86
- }
87
- ngOnDestroy() {
88
- this._collectionView.off(CollectionView.itemLoadingEvent, this.onItemLoading, this);
89
- this._collectionView = null;
90
- this._loaders.forEach((l) => l.destroy());
91
- this._loaders = null;
92
- this.viewToLoader = null;
93
- this.viewToTemplate = null;
94
- this.viewPool = null;
95
- this._items = null;
96
- this._differ = null;
97
- this._itemTemplate = null;
98
- if (this._templateMap) {
99
- this._templateMap.clear();
100
- }
101
- this._templateMap = null;
102
- }
103
- ngDoCheck() {
104
- if (Trace.isEnabled()) {
105
- CLog(CLogTypes.info, 'ngDoCheck() - execute differ? ' + this._differ);
106
- }
107
- if (this._differ) {
108
- if (Trace.isEnabled()) {
109
- CLog(CLogTypes.info, 'ngDoCheck() - execute differ');
110
- }
111
- const changes = this._differ.diff(this._items);
112
- if (changes) {
113
- if (Trace.isEnabled()) {
114
- CLog(CLogTypes.info, 'ngDoCheck() - refresh');
115
- }
116
- this.refresh();
117
- }
118
- }
119
- }
120
- registerTemplate(key, template) {
121
- if (Trace.isEnabled()) {
122
- CLog(CLogTypes.info, 'registerTemplate for key: ' + key);
123
- }
124
- if (!this._templateMap) {
125
- this._templateMap = new Map();
126
- }
127
- const keyedTemplate = {
128
- key,
129
- createView: this.getItemTemplateViewFactory(template)
130
- };
131
- this._templateMap.set(key, keyedTemplate);
132
- }
133
- onItemLoading(args) {
134
- if (!args.view && !this.itemTemplate) {
135
- return;
136
- }
137
- if (!this.items)
138
- return;
139
- const index = args.index;
140
- const items = args.object.items;
141
- const currentItem = typeof items.getItem === 'function' ? items.getItem(index) : items[index];
142
- let viewRef;
143
- if (Trace.isEnabled()) {
144
- CLog(CLogTypes.info, `onItemLoading: ${index} - Reusing existing view`);
145
- }
146
- viewRef = args.view[NG_VIEW];
147
- // Getting angular view from original element (in cases when ProxyViewContainer
148
- // is used NativeScript internally wraps it in a StackLayout)
149
- if (!viewRef && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
150
- viewRef = args.view.getChildAt(0)[NG_VIEW];
151
- }
152
- if (!viewRef && Trace.isEnabled()) {
153
- if (Trace.isEnabled()) {
154
- CLog(CLogTypes.info, `ViewReference not found for item ${index}. View recycling is not working`);
155
- }
156
- }
157
- if (!viewRef) {
158
- if (Trace.isEnabled()) {
159
- CLog(CLogTypes.info, `onItemLoading: ${index} - Creating view from template`);
160
- }
161
- viewRef = this.loader.createEmbeddedView(this.itemTemplate, new ItemContext(), 0);
162
- args.view = getItemViewRoot(viewRef);
163
- args.view[NG_VIEW] = viewRef;
164
- }
165
- this.setupViewRef(viewRef, currentItem, index);
166
- this.detectChangesOnChild(viewRef, index);
167
- }
168
- onItemRecyclingInternal(args) {
169
- if (!args.view) {
170
- return;
171
- }
172
- let ngView = args.view[NG_VIEW];
173
- // Getting angular view from original element (in cases when ProxyViewContainer
174
- // is used NativeScript internally wraps it in a StackLayout)
175
- if (!ngView && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
176
- ngView = args.view.getChildAt(0)[NG_VIEW];
177
- }
178
- // console.log('recycling', args.view);
179
- if (ngView) {
180
- ngView.detach();
181
- }
182
- }
183
- onItemDisposingInternal(args) {
184
- if (!args.view) {
185
- return;
186
- }
187
- let ngView = args.view[NG_VIEW];
188
- // Getting angular view from original element (in cases when ProxyViewContainer
189
- // is used NativeScript internally wraps it in a StackLayout)
190
- if (!ngView && args.view instanceof LayoutBase && args.view.getChildrenCount() > 0) {
191
- ngView = args.view.getChildAt(0)[NG_VIEW];
192
- }
193
- if (ngView) {
194
- ngView.detach();
195
- this.storeViewRef(ngView);
196
- }
197
- }
198
- setupViewRef(view, data, index) {
199
- const context = view.context;
200
- context.$implicit = data;
201
- context.item = data;
202
- context.index = index;
203
- context.even = index % 2 === 0;
204
- context.odd = !context.even;
205
- this.setupItemView.next({
206
- context,
207
- data,
208
- index,
209
- view
210
- });
211
- }
212
- getItemTemplateViewFactory(template) {
213
- return () => {
214
- const viewRef = this.loader.createEmbeddedView(template, new ItemContext(), 0);
215
- const resultView = getItemViewRoot(viewRef);
216
- resultView[NG_VIEW] = viewRef;
217
- return resultView;
218
- };
219
- }
220
- storeViewRef(viewRef) {
221
- const templateRef = this.viewToTemplate.get(viewRef);
222
- if (templateRef) {
223
- const scrap = this.viewPool.get(templateRef);
224
- if (scrap) {
225
- if (scrap.scrapHead.size >= scrap.scrapSize) {
226
- viewRef.destroy();
227
- this.viewToLoader.get(viewRef)?.destroy();
228
- }
229
- else {
230
- scrap.scrapHead.add(viewRef);
231
- }
232
- }
233
- }
234
- }
235
- getOrCreate(templateRef) {
236
- return this._ngZone.run(() => {
237
- let viewRef = this.getView(templateRef);
238
- if (!viewRef) {
239
- const loader = this.detachedLoaderFactory();
240
- // viewRef = this.loader.createEmbeddedView(templateRef, new ItemContext(), 0);
241
- viewRef = loader.instance.vc.createEmbeddedView(templateRef, new ItemContext(), 0);
242
- this.viewToLoader.set(viewRef, loader);
243
- this.viewToTemplate.set(viewRef, templateRef);
244
- }
245
- viewRef.detach();
246
- const resultView = getItemViewRoot(viewRef);
247
- resultView[NG_VIEW] = viewRef;
248
- resultView.reusable = this.autoReuseViews;
249
- return resultView;
250
- });
251
- }
252
- getView(templateRef) {
253
- const pool = this.getViewPool(templateRef);
254
- while (pool.scrapHead.size > 0) {
255
- const viewRef = pool.scrapHead.values().next().value;
256
- pool.scrapHead.delete(viewRef);
257
- if (!viewRef.destroyed) {
258
- return viewRef;
259
- }
260
- }
261
- return null;
262
- }
263
- getViewPool(templateRef) {
264
- if (!this.viewPool.has(templateRef)) {
265
- this.viewPool.set(templateRef, {
266
- scrapSize: this.autoReuseViews ? Infinity : 0,
267
- scrapHead: new Set()
268
- });
269
- }
270
- return this.viewPool.get(templateRef);
271
- }
272
- setItemTemplates() {
273
- // The itemTemplateQuery may be changed after list items are added that contain <template> inside,
274
- // so cache and use only the original template to avoid errors.
275
- this.itemTemplate = this.itemTemplateQuery;
276
- if (this._templateMap) {
277
- if (Trace.isEnabled()) {
278
- CLog(CLogTypes.info, 'Setting templates');
279
- }
280
- const templates = [];
281
- this._templateMap.forEach((value) => {
282
- templates.push(value);
283
- });
284
- this._collectionView.itemTemplates = templates;
285
- }
286
- else {
287
- // If the map was not initialized this means that there are no named templates, so we register the default one.
288
- this._collectionView.itemTemplate = this.getItemTemplateViewFactory(this.itemTemplate);
289
- }
290
- }
291
- detectChangesOnChild(viewRef, index) {
292
- if (Trace.isEnabled()) {
293
- CLog(CLogTypes.info, 'Manually detect changes in child: ' + index);
294
- }
295
- viewRef.markForCheck();
296
- viewRef.detectChanges();
297
- }
298
- refresh() {
299
- if (this._collectionView) {
300
- this._collectionView.refresh();
301
- }
302
- }
303
- }
304
- CollectionViewComponent.ɵfac = function CollectionViewComponent_Factory(t) { return new (t || CollectionViewComponent)(i0.ɵɵdirectiveInject(ElementRef), i0.ɵɵdirectiveInject(IterableDiffers), i0.ɵɵdirectiveInject(NativeScriptRendererFactory), i0.ɵɵdirectiveInject(NgZone)); };
305
- CollectionViewComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionViewComponent, selectors: [["CollectionView"]], contentQueries: function CollectionViewComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
306
- i0.ɵɵcontentQuery(dirIndex, TemplateRef, 7, TemplateRef);
307
- } if (rf & 2) {
308
- let _t;
309
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.itemTemplateQuery = _t.first);
310
- } }, viewQuery: function CollectionViewComponent_Query(rf, ctx) { if (rf & 1) {
311
- i0.ɵɵviewQuery(_c0, 7, ViewContainerRef);
312
- } if (rf & 2) {
313
- let _t;
314
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.loader = _t.first);
315
- } }, hostBindings: function CollectionViewComponent_HostBindings(rf, ctx) { if (rf & 1) {
316
- i0.ɵɵlistener("itemLoading", function CollectionViewComponent_itemLoading_HostBindingHandler($event) { return ctx.onItemLoading($event); })("itemRecycling", function CollectionViewComponent_itemRecycling_HostBindingHandler($event) { return ctx.onItemRecyclingInternal($event); })("itemDisposing", function CollectionViewComponent_itemDisposing_HostBindingHandler($event) { return ctx.onItemDisposingInternal($event); });
317
- } }, inputs: { autoReuseViews: "autoReuseViews", itemTemplate: "itemTemplate", items: "items" }, outputs: { setupItemView: "setupItemView" }, decls: 3, vars: 0, consts: [["loader", ""]], template: function CollectionViewComponent_Template(rf, ctx) { if (rf & 1) {
318
- i0.ɵɵelementStart(0, "DetachedContainer");
319
- i0.ɵɵelement(1, "Placeholder", null, 0);
320
- i0.ɵɵelementEnd();
321
- } }, encapsulation: 2, changeDetection: 0 });
322
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CollectionViewComponent, [{
323
- type: Component,
324
- args: [{
325
- selector: 'CollectionView',
326
- template: `
327
- <DetachedContainer>
328
- <Placeholder #loader></Placeholder>
329
- </DetachedContainer>
330
- `,
331
- changeDetection: ChangeDetectionStrategy.OnPush
332
- }]
333
- }], function () { return [{ type: i0.ElementRef, decorators: [{
334
- type: Inject,
335
- args: [ElementRef]
336
- }] }, { type: i0.IterableDiffers, decorators: [{
337
- type: Inject,
338
- args: [IterableDiffers]
339
- }] }, { type: i1.NativeScriptRendererFactory, decorators: [{
340
- type: Inject,
341
- args: [NativeScriptRendererFactory]
342
- }] }, { type: i0.NgZone, decorators: [{
343
- type: Inject,
344
- args: [NgZone]
345
- }] }]; }, { loader: [{
346
- type: ViewChild,
347
- args: ['loader', { read: ViewContainerRef, static: true }]
348
- }], setupItemView: [{
349
- type: Output
350
- }], itemTemplateQuery: [{
351
- type: ContentChild,
352
- args: [TemplateRef, { read: TemplateRef, static: true }]
353
- }], autoReuseViews: [{
354
- type: Input
355
- }], itemTemplate: [{
356
- type: Input
357
- }], items: [{
358
- type: Input
359
- }], onItemLoading: [{
360
- type: HostListener,
361
- args: ['itemLoading', ['$event']]
362
- }], onItemRecyclingInternal: [{
363
- type: HostListener,
364
- args: ['itemRecycling', ['$event']]
365
- }], onItemDisposingInternal: [{
366
- type: HostListener,
367
- args: ['itemDisposing', ['$event']]
368
- }] }); })();
369
- export function getItemViewRoot(viewRef, rootLocator = extractSingleViewRecursive) {
370
- const rootView = rootLocator(viewRef.rootNodes, 0);
371
- return rootView;
372
- }
373
- export class TemplateKeyDirective {
374
- constructor(templateRef, collectionView) {
375
- this.templateRef = templateRef;
376
- this.collectionView = collectionView;
377
- }
378
- set cvTemplateKey(value) {
379
- if (Trace.isEnabled()) {
380
- CLog(CLogTypes.info, 'cvTemplateKey: ' + value);
381
- }
382
- if (this.collectionView && this.templateRef) {
383
- this.collectionView.registerTemplate(value.toLowerCase(), this.templateRef);
384
- }
385
- }
386
- }
387
- TemplateKeyDirective.ɵfac = function TemplateKeyDirective_Factory(t) { return new (t || TemplateKeyDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(CollectionViewComponent, 1)); };
388
- TemplateKeyDirective.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: TemplateKeyDirective, selectors: [["", "cvTemplateKey", ""]], inputs: { cvTemplateKey: "cvTemplateKey" } });
389
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TemplateKeyDirective, [{
390
- type: Directive,
391
- args: [{ selector: '[cvTemplateKey]' }]
392
- }], function () { return [{ type: i0.TemplateRef }, { type: CollectionViewComponent, decorators: [{
393
- type: Host
394
- }] }]; }, { cvTemplateKey: [{
395
- type: Input
396
- }] }); })();
397
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnZpZXctY29tcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2xsZWN0aW9udmlldy9hbmd1bGFyL2NvbGxlY3Rpb252aWV3LWNvbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEVBRVQsVUFBVSxFQUNWLGVBQWUsRUFDZixZQUFZLEVBQ1osSUFBSSxFQUNKLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLGVBQWUsRUFDZixNQUFNLEVBRU4sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBK0IsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM1SSxPQUFPLEVBQUUsY0FBYyxFQUFFLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JKLE9BQU8sRUFBaUIsVUFBVSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUFFN0YsZUFBZSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXhELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztBQUU3QixNQUFNLE9BQU8sV0FBVztJQUNwQixZQUFtQixTQUFlLEVBQVMsSUFBVSxFQUFTLEtBQWMsRUFBUyxJQUFjLEVBQVMsR0FBYTtRQUF0RyxjQUFTLEdBQVQsU0FBUyxDQUFNO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVM7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFVO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBVTtJQUFHLENBQUM7Q0FDaEk7QUFrQkQsTUFBTSxPQUFPLHVCQUF1QjtJQXVEaEMsWUFDZ0MsV0FBdUIsRUFDbEIsZ0JBQWlDLEVBQ3JCLFNBQXNDLEVBQzNELE9BQWU7UUFIWCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUNsQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQzNELFlBQU8sR0FBUCxPQUFPLENBQVE7UUFsRDFCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFHOUQsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUF3RHhCLG1CQUFjLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbEIsUUFBUSxRQUFRLEVBQUU7Z0JBQ2QsS0FBSyxpQkFBaUIsQ0FBQyxRQUFRO29CQUMzQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3ZELE9BQU8sU0FBUyxDQUFDO3FCQUNwQjtvQkFDRCxNQUFNO2FBQ2I7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQXNLUCxhQUFRLEdBQUcsSUFBSSxHQUFHLEVBTWYsQ0FBQztRQWVKLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQTBDLENBQUM7UUFDdkUsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBc0QsQ0FBQztRQTlNN0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBRWpELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQWpFRCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQVFELHFCQUFxQjtRQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUU7WUFDcEQsS0FBSyxFQUFFLENBQUM7U0FDWCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxJQUNXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFXLFlBQVksQ0FBQyxLQUFVO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQ1csS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBVyxLQUFLLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxLQUFLLFlBQVksZUFBZSxFQUFFO1lBQ2xDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDdEI7UUFDRCxJQUFJLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6RjtRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDN0MsQ0FBQztJQW1DTSxrQkFBa0I7UUFDckIsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUscUNBQXFDLENBQUMsQ0FBQztTQUMvRDtRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVNLFNBQVM7UUFDWixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekU7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsOEJBQThCLENBQUMsQ0FBQzthQUN4RDtZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU8sRUFBRTtnQkFDVCxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztpQkFDakQ7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xCO1NBQ0o7SUFDTCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsR0FBVyxFQUFFLFFBQWtDO1FBQ25FLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLDRCQUE0QixHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztTQUN4RDtRQUVELE1BQU0sYUFBYSxHQUFHO1lBQ2xCLEdBQUc7WUFDSCxVQUFVLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQztTQUN4RCxDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFHTSxhQUFhLENBQUMsSUFBaUM7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2xDLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBSSxJQUFJLENBQUMsTUFBYyxDQUFDLEtBQUssQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUYsSUFBSSxPQUFxQyxDQUFDO1FBRTFDLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGtCQUFrQixLQUFLLDBCQUEwQixDQUFDLENBQUM7U0FDM0U7UUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QiwrRUFBK0U7UUFDL0UsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksWUFBWSxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNqRixPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUM7UUFFRCxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUMvQixJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsb0NBQW9DLEtBQUssaUNBQWlDLENBQUMsQ0FBQzthQUNwRztTQUNKO1FBRUQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxrQkFBa0IsS0FBSyxnQ0FBZ0MsQ0FBQyxDQUFDO2FBQ2pGO1lBRUQsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLHVCQUF1QixDQUFDLElBQVM7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixPQUFPO1NBQ1Y7UUFDRCxJQUFJLE1BQU0sR0FBeUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0RCwrRUFBK0U7UUFDL0UsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksWUFBWSxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNoRixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDN0M7UUFDRCx1Q0FBdUM7UUFFdkMsSUFBSSxNQUFNLEVBQUU7WUFDUixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbkI7SUFDTCxDQUFDO0lBR00sdUJBQXVCLENBQUMsSUFBUztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNaLE9BQU87U0FDVjtRQUNELElBQUksTUFBTSxHQUF5QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRELCtFQUErRTtRQUMvRSw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2hGLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksTUFBTSxFQUFFO1lBQ1IsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQWtDLEVBQUUsSUFBUyxFQUFFLEtBQWE7UUFDNUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN0QixPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRTVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3BCLE9BQU87WUFDUCxJQUFJO1lBQ0osS0FBSztZQUNMLElBQUk7U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsMEJBQTBCLENBQUMsUUFBa0M7UUFDbkUsT0FBTyxHQUFHLEVBQUU7WUFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxJQUFJLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9FLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBRTlCLE9BQU8sVUFBVSxDQUFDO1FBQ3RCLENBQUMsQ0FBQztJQUNOLENBQUM7SUFRTyxZQUFZLENBQUMsT0FBNkI7UUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBSSxXQUFXLEVBQUU7WUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxJQUFJLEtBQUssRUFBRTtnQkFDUCxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUU7b0JBQ3pDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUM7aUJBQzdDO3FCQUFNO29CQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNoQzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBSU8sV0FBVyxDQUFDLFdBQXFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ3pCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDVixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsK0VBQStFO2dCQUMvRSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLElBQUksV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQzlCLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUMxQyxPQUFPLFVBQVUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDTyxPQUFPLENBQUMsV0FBcUM7UUFDakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUM1QixNQUFNLE9BQU8sR0FBaUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLE9BQU8sT0FBTyxDQUFDO2FBQ2xCO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sV0FBVyxDQUFDLFdBQXFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLFNBQVMsRUFBRSxJQUFJLEdBQUcsRUFBZ0M7YUFDckQsQ0FBQyxDQUFDO1NBQ047UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsa0dBQWtHO1FBQ2xHLCtEQUErRDtRQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUUzQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7YUFDN0M7WUFFRCxNQUFNLFNBQVMsR0FBb0IsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7U0FDbEQ7YUFBTTtZQUNILCtHQUErRztZQUMvRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzFGO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQXFDLEVBQUUsS0FBYTtRQUM3RSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxvQ0FBb0MsR0FBRyxLQUFLLENBQUMsQ0FBQztTQUN0RTtRQUNELE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QixPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVPLE9BQU87UUFDWCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNsQztJQUNMLENBQUM7OzhGQXJWUSx1QkFBdUIsdUJBd0RwQixVQUFVLHdCQUNWLGVBQWUsd0JBQ2YsMkJBQTJCLHdCQUMzQixNQUFNOzBFQTNEVCx1QkFBdUI7b0NBVWxCLFdBQVcsS0FBVSxXQUFXOzs7OzsrQkFGakIsZ0JBQWdCOzs7OztzSEFScEMseUJBQXFCLHlHQUFyQixtQ0FBK0IseUdBQS9CLG1DQUErQjs7UUFOcEMseUNBQW1CO1FBQ2YsdUNBQW1DO1FBQ3ZDLGlCQUFvQjs7dUZBSWYsdUJBQXVCO2NBVG5DLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixRQUFRLEVBQUU7Ozs7S0FJVDtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNsRDs7c0JBeURRLE1BQU07dUJBQUMsVUFBVTs7c0JBQ2pCLE1BQU07dUJBQUMsZUFBZTs7c0JBQ3RCLE1BQU07dUJBQUMsMkJBQTJCOztzQkFDbEMsTUFBTTt1QkFBQyxNQUFNO3dCQW5Eb0QsTUFBTTtrQkFBM0UsU0FBUzttQkFBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUM1QyxhQUFhO2tCQUE3QixNQUFNO1lBQ2dFLGlCQUFpQjtrQkFBdkYsWUFBWTttQkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFFckQsY0FBYztrQkFBdEIsS0FBSztZQVlLLFlBQVk7a0JBRHRCLEtBQUs7WUFTSyxLQUFLO2tCQURmLEtBQUs7WUE4R0MsYUFBYTtrQkFEbkIsWUFBWTttQkFBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUEyQ2hDLHVCQUF1QjtrQkFEN0IsWUFBWTttQkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFvQmxDLHVCQUF1QjtrQkFEN0IsWUFBWTttQkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0FBc0o3QyxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQXNCLEVBQUUsY0FBMkIsMEJBQTBCO0lBQ3pHLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFHRCxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFlBQW9CLFdBQTZCLEVBQWtCLGNBQXVDO1FBQXRGLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUFrQixtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7SUFBRyxDQUFDO0lBRTlHLElBQ0ksYUFBYSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDL0U7SUFDTCxDQUFDOzt3RkFYUSxvQkFBb0I7dUVBQXBCLG9CQUFvQjt1RkFBcEIsb0JBQW9CO2NBRGhDLFNBQVM7ZUFBQyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRTs7c0JBRWMsSUFBSTt3QkFHcEQsYUFBYTtrQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEVtYmVkZGVkVmlld1JlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdCxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlRGlmZmVyLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENMb2csIENMb2dUeXBlcywgQ29sbGVjdGlvblZpZXcsIENvbGxlY3Rpb25WaWV3SXRlbUV2ZW50RGF0YSwgTGlzdFZpZXdWaWV3VHlwZXMgfSBmcm9tICdAbmF0aXZlc2NyaXB0LWNvbW11bml0eS91aS1jb2xsZWN0aW9udmlldyc7XG5pbXBvcnQgeyBEZXRhY2hlZExvYWRlciwgTmF0aXZlU2NyaXB0UmVuZGVyZXJGYWN0b3J5LCBleHRyYWN0U2luZ2xlVmlld1JlY3Vyc2l2ZSwgaXNMaXN0TGlrZUl0ZXJhYmxlLCByZWdpc3RlckVsZW1lbnQgfSBmcm9tICdAbmF0aXZlc2NyaXB0L2FuZ3VsYXInO1xuaW1wb3J0IHsgS2V5ZWRUZW1wbGF0ZSwgTGF5b3V0QmFzZSwgT2JzZXJ2YWJsZUFycmF5LCBUcmFjZSwgVmlldyB9IGZyb20gJ0BuYXRpdmVzY3JpcHQvY29yZSc7XG5cbnJlZ2lzdGVyRWxlbWVudCgnQ29sbGVjdGlvblZpZXcnLCAoKSA9PiBDb2xsZWN0aW9uVmlldyk7XG5cbmNvbnN0IE5HX1ZJRVcgPSAnX25nVmlld1JlZic7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocHVibGljICRpbXBsaWNpdD86IGFueSwgcHVibGljIGl0ZW0/OiBhbnksIHB1YmxpYyBpbmRleD86IG51bWJlciwgcHVibGljIGV2ZW4/OiBib29sZWFuLCBwdWJsaWMgb2RkPzogYm9vbGVhbikge31cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR1cEl0ZW1WaWV3QXJncyB7XG4gICAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG4gICAgZGF0YTogYW55O1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgY29udGV4dDogSXRlbUNvbnRleHQ7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnQ29sbGVjdGlvblZpZXcnLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxEZXRhY2hlZENvbnRhaW5lcj5cbiAgICAgICAgICAgIDxQbGFjZWhvbGRlciAjbG9hZGVyPjwvUGxhY2Vob2xkZXI+XG4gICAgICAgIDwvRGV0YWNoZWRDb250YWluZXI+XG4gICAgYCxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uVmlldztcbiAgICB9XG4gICAgcHVibGljIGdldCBsaXN0VmlldygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvblZpZXc7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnbG9hZGVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgcHVibGljIGxvYWRlcjogVmlld0NvbnRhaW5lclJlZjtcbiAgICBAT3V0cHV0KCkgcHVibGljIHNldHVwSXRlbVZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPFNldHVwSXRlbVZpZXdBcmdzPigpO1xuICAgIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgaXRlbVRlbXBsYXRlUXVlcnk6IFRlbXBsYXRlUmVmPEl0ZW1Db250ZXh0PjtcblxuICAgIEBJbnB1dCgpIGF1dG9SZXVzZVZpZXdzID0gZmFsc2U7XG5cbiAgICBkZXRhY2hlZExvYWRlckZhY3RvcnkoKSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMubG9hZGVyLmNyZWF0ZUNvbXBvbmVudChEZXRhY2hlZExvYWRlciwge1xuICAgICAgICAgICAgaW5kZXg6IDBcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubG9hZGVyLmRldGFjaCgwKTtcbiAgICAgICAgdGhpcy5fbG9hZGVycy5wdXNoKHJlZik7XG4gICAgICAgIHJldHVybiByZWY7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGl0ZW1UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1UZW1wbGF0ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBpdGVtVGVtcGxhdGUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9pdGVtVGVtcGxhdGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcucmVmcmVzaCgpO1xuICAgIH1cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgICB9XG4gICAgcHVibGljIHNldCBpdGVtcyh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdmFsdWU7XG4gICAgICAgIGxldCBuZWVkRGlmZmVyID0gdHJ1ZTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZUFycmF5KSB7XG4gICAgICAgICAgICBuZWVkRGlmZmVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWREaWZmZXIgJiYgIXRoaXMuX2RpZmZlciAmJiBpc0xpc3RMaWtlSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9pdGVtcykuY3JlYXRlKChfaW5kZXgsIGl0ZW0pID0+IGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcuaXRlbXMgPSB0aGlzLl9pdGVtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb2xsZWN0aW9uVmlldzogQ29sbGVjdGlvblZpZXc7XG4gICAgcHJpdmF0ZSBfaXRlbXM6IGFueTtcbiAgICBwcml2YXRlIF9kaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPEtleWVkVGVtcGxhdGU+O1xuICAgIHByaXZhdGUgX2l0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX3RlbXBsYXRlTWFwOiBNYXA8c3RyaW5nLCBLZXllZFRlbXBsYXRlPjtcbiAgICBwcml2YXRlIF9sb2FkZXJzOiBDb21wb25lbnRSZWY8RGV0YWNoZWRMb2FkZXI+W107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChFbGVtZW50UmVmKSBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBASW5qZWN0KEl0ZXJhYmxlRGlmZmVycykgcHJpdmF0ZSBfaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIEBJbmplY3QoTmF0aXZlU2NyaXB0UmVuZGVyZXJGYWN0b3J5KSBwcml2YXRlIF9yZW5kZXJlcjogTmF0aXZlU2NyaXB0UmVuZGVyZXJGYWN0b3J5LFxuICAgICAgICBASW5qZWN0KE5nWm9uZSkgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmVcbiAgICApIHtcbiAgICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcgPSBfZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lm9uKENvbGxlY3Rpb25WaWV3Lml0ZW1Mb2FkaW5nRXZlbnQsIHRoaXMub25JdGVtTG9hZGluZywgdGhpcyk7XG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lml0ZW1WaWV3TG9hZGVyID0gdGhpcy5pdGVtVmlld0xvYWRlcjtcbiAgICAgICAgdGhpcy5fbG9hZGVycyA9IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXRlbVZpZXdMb2FkZXIgPSAodmlld1R5cGUpID0+XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh2aWV3VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgTGlzdFZpZXdWaWV3VHlwZXMuSXRlbVZpZXc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pdGVtVGVtcGxhdGUgJiYgdGhpcy5sb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkVmlldyA9IHRoaXMuZ2V0T3JDcmVhdGUodGhpcy5faXRlbVRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlZFZpZXc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICdDb2xsZWN0aW9uVmlldy5uZ0FmdGVyQ29udGVudEluaXQoKScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SXRlbVRlbXBsYXRlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcub2ZmKENvbGxlY3Rpb25WaWV3Lml0ZW1Mb2FkaW5nRXZlbnQsIHRoaXMub25JdGVtTG9hZGluZywgdGhpcyk7XG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbG9hZGVycy5mb3JFYWNoKChsKSA9PiBsLmRlc3Ryb3koKSk7XG4gICAgICAgIHRoaXMuX2xvYWRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdUb0xvYWRlciA9IG51bGw7XG4gICAgICAgIHRoaXMudmlld1RvVGVtcGxhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdQb29sID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2l0ZW1UZW1wbGF0ZSA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZU1hcCkge1xuICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGVNYXAuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZW1wbGF0ZU1hcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAnbmdEb0NoZWNrKCkgLSBleGVjdXRlIGRpZmZlcj8gJyArIHRoaXMuX2RpZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RpZmZlcikge1xuICAgICAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ25nRG9DaGVjaygpIC0gZXhlY3V0ZSBkaWZmZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9pdGVtcyk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAnbmdEb0NoZWNrKCkgLSByZWZyZXNoJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyVGVtcGxhdGUoa2V5OiBzdHJpbmcsIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pIHtcbiAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAncmVnaXN0ZXJUZW1wbGF0ZSBmb3Iga2V5OiAnICsga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3RlbXBsYXRlTWFwKSB7XG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBLZXllZFRlbXBsYXRlPigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ZWRUZW1wbGF0ZSA9IHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGNyZWF0ZVZpZXc6IHRoaXMuZ2V0SXRlbVRlbXBsYXRlVmlld0ZhY3RvcnkodGVtcGxhdGUpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fdGVtcGxhdGVNYXAuc2V0KGtleSwga2V5ZWRUZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignaXRlbUxvYWRpbmcnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkl0ZW1Mb2FkaW5nKGFyZ3M6IENvbGxlY3Rpb25WaWV3SXRlbUV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoIWFyZ3MudmlldyAmJiAhdGhpcy5pdGVtVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXRlbXMpIHJldHVybjtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhcmdzLmluZGV4O1xuICAgICAgICBjb25zdCBpdGVtcyA9IChhcmdzLm9iamVjdCBhcyBhbnkpLml0ZW1zO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IHR5cGVvZiBpdGVtcy5nZXRJdGVtID09PSAnZnVuY3Rpb24nID8gaXRlbXMuZ2V0SXRlbShpbmRleCkgOiBpdGVtc1tpbmRleF07XG4gICAgICAgIGxldCB2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+O1xuXG4gICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgYG9uSXRlbUxvYWRpbmc6ICR7aW5kZXh9IC0gUmV1c2luZyBleGlzdGluZyB2aWV3YCk7XG4gICAgICAgIH1cblxuICAgICAgICB2aWV3UmVmID0gYXJncy52aWV3W05HX1ZJRVddO1xuICAgICAgICAvLyBHZXR0aW5nIGFuZ3VsYXIgdmlldyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgKGluIGNhc2VzIHdoZW4gUHJveHlWaWV3Q29udGFpbmVyXG4gICAgICAgIC8vIGlzIHVzZWQgTmF0aXZlU2NyaXB0IGludGVybmFsbHkgd3JhcHMgaXQgaW4gYSBTdGFja0xheW91dClcbiAgICAgICAgaWYgKCF2aWV3UmVmICYmIGFyZ3MudmlldyBpbnN0YW5jZW9mIExheW91dEJhc2UgJiYgYXJncy52aWV3LmdldENoaWxkcmVuQ291bnQoKSA+IDApIHtcbiAgICAgICAgICAgIHZpZXdSZWYgPSBhcmdzLnZpZXcuZ2V0Q2hpbGRBdCgwKVtOR19WSUVXXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmlld1JlZiAmJiBUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgYFZpZXdSZWZlcmVuY2Ugbm90IGZvdW5kIGZvciBpdGVtICR7aW5kZXh9LiBWaWV3IHJlY3ljbGluZyBpcyBub3Qgd29ya2luZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2aWV3UmVmKSB7XG4gICAgICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCBgb25JdGVtTG9hZGluZzogJHtpbmRleH0gLSBDcmVhdGluZyB2aWV3IGZyb20gdGVtcGxhdGVgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmlld1JlZiA9IHRoaXMubG9hZGVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLml0ZW1UZW1wbGF0ZSwgbmV3IEl0ZW1Db250ZXh0KCksIDApO1xuICAgICAgICAgICAgYXJncy52aWV3ID0gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWYpO1xuICAgICAgICAgICAgYXJncy52aWV3W05HX1ZJRVddID0gdmlld1JlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0dXBWaWV3UmVmKHZpZXdSZWYsIGN1cnJlbnRJdGVtLCBpbmRleCk7XG5cbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzT25DaGlsZCh2aWV3UmVmLCBpbmRleCk7XG4gICAgfVxuICAgIEBIb3N0TGlzdGVuZXIoJ2l0ZW1SZWN5Y2xpbmcnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkl0ZW1SZWN5Y2xpbmdJbnRlcm5hbChhcmdzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFhcmdzLnZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmdWaWV3OiBFbWJlZGRlZFZpZXdSZWY8YW55PiA9IGFyZ3Mudmlld1tOR19WSUVXXTtcblxuICAgICAgICAvLyBHZXR0aW5nIGFuZ3VsYXIgdmlldyBmcm9tIG9yaWdpbmFsIGVsZW1lbnQgKGluIGNhc2VzIHdoZW4gUHJveHlWaWV3Q29udGFpbmVyXG4gICAgICAgIC8vIGlzIHVzZWQgTmF0aXZlU2NyaXB0IGludGVybmFsbHkgd3JhcHMgaXQgaW4gYSBTdGFja0xheW91dClcbiAgICAgICAgaWYgKCFuZ1ZpZXcgJiYgYXJncy52aWV3IGluc3RhbmNlb2YgTGF5b3V0QmFzZSAmJiBhcmdzLnZpZXcuZ2V0Q2hpbGRyZW5Db3VudCgpID4gMCkge1xuICAgICAgICAgICAgbmdWaWV3ID0gYXJncy52aWV3LmdldENoaWxkQXQoMClbTkdfVklFV107XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3JlY3ljbGluZycsIGFyZ3Mudmlldyk7XG5cbiAgICAgICAgaWYgKG5nVmlldykge1xuICAgICAgICAgICAgbmdWaWV3LmRldGFjaCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignaXRlbURpc3Bvc2luZycsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uSXRlbURpc3Bvc2luZ0ludGVybmFsKGFyZ3M6IGFueSkge1xuICAgICAgICBpZiAoIWFyZ3Mudmlldykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZ1ZpZXc6IEVtYmVkZGVkVmlld1JlZjxhbnk+ID0gYXJncy52aWV3W05HX1ZJRVddO1xuXG4gICAgICAgIC8vIEdldHRpbmcgYW5ndWxhciB2aWV3IGZyb20gb3JpZ2luYWwgZWxlbWVudCAoaW4gY2FzZXMgd2hlbiBQcm94eVZpZXdDb250YWluZXJcbiAgICAgICAgLy8gaXMgdXNlZCBOYXRpdmVTY3JpcHQgaW50ZXJuYWxseSB3cmFwcyBpdCBpbiBhIFN0YWNrTGF5b3V0KVxuICAgICAgICBpZiAoIW5nVmlldyAmJiBhcmdzLnZpZXcgaW5zdGFuY2VvZiBMYXlvdXRCYXNlICYmIGFyZ3Mudmlldy5nZXRDaGlsZHJlbkNvdW50KCkgPiAwKSB7XG4gICAgICAgICAgICBuZ1ZpZXcgPSBhcmdzLnZpZXcuZ2V0Q2hpbGRBdCgwKVtOR19WSUVXXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZ1ZpZXcpIHtcbiAgICAgICAgICAgIG5nVmlldy5kZXRhY2goKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVWaWV3UmVmKG5nVmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0dXBWaWV3UmVmKHZpZXc6IEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD4sIGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdmlldy5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LiRpbXBsaWNpdCA9IGRhdGE7XG4gICAgICAgIGNvbnRleHQuaXRlbSA9IGRhdGE7XG4gICAgICAgIGNvbnRleHQuaW5kZXggPSBpbmRleDtcbiAgICAgICAgY29udGV4dC5ldmVuID0gaW5kZXggJSAyID09PSAwO1xuICAgICAgICBjb250ZXh0Lm9kZCA9ICFjb250ZXh0LmV2ZW47XG5cbiAgICAgICAgdGhpcy5zZXR1cEl0ZW1WaWV3Lm5leHQoe1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIHZpZXdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEl0ZW1UZW1wbGF0ZVZpZXdGYWN0b3J5KHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pOiAoKSA9PiBWaWV3IHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLmxvYWRlci5jcmVhdGVFbWJlZGRlZFZpZXcodGVtcGxhdGUsIG5ldyBJdGVtQ29udGV4dCgpLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFZpZXcgPSBnZXRJdGVtVmlld1Jvb3Qodmlld1JlZik7XG4gICAgICAgICAgICByZXN1bHRWaWV3W05HX1ZJRVddID0gdmlld1JlZjtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFZpZXc7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHZpZXdQb29sID0gbmV3IE1hcDxcbiAgICAgICAgVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+LFxuICAgICAgICB7XG4gICAgICAgICAgICBzY3JhcFNpemU6IG51bWJlcjtcbiAgICAgICAgICAgIHNjcmFwSGVhZDogU2V0PEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD4+O1xuICAgICAgICB9XG4gICAgPigpO1xuICAgIHByaXZhdGUgc3RvcmVWaWV3UmVmKHZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjxhbnk+KSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUmVmID0gdGhpcy52aWV3VG9UZW1wbGF0ZS5nZXQodmlld1JlZik7XG4gICAgICAgIGlmICh0ZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgY29uc3Qgc2NyYXAgPSB0aGlzLnZpZXdQb29sLmdldCh0ZW1wbGF0ZVJlZik7XG4gICAgICAgICAgICBpZiAoc2NyYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NyYXAuc2NyYXBIZWFkLnNpemUgPj0gc2NyYXAuc2NyYXBTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdSZWYuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdUb0xvYWRlci5nZXQodmlld1JlZik/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY3JhcC5zY3JhcEhlYWQuYWRkKHZpZXdSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3VG9UZW1wbGF0ZSA9IG5ldyBXZWFrTWFwPEVtYmVkZGVkVmlld1JlZjxhbnk+LCBUZW1wbGF0ZVJlZjxhbnk+PigpO1xuICAgIHZpZXdUb0xvYWRlciA9IG5ldyBXZWFrTWFwPEVtYmVkZGVkVmlld1JlZjxhbnk+LCBDb21wb25lbnRSZWY8RGV0YWNoZWRMb2FkZXI+PigpO1xuXG4gICAgcHJpdmF0ZSBnZXRPckNyZWF0ZSh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGxldCB2aWV3UmVmID0gdGhpcy5nZXRWaWV3KHRlbXBsYXRlUmVmKTtcbiAgICAgICAgICAgIGlmICghdmlld1JlZikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlciA9IHRoaXMuZGV0YWNoZWRMb2FkZXJGYWN0b3J5KCk7XG4gICAgICAgICAgICAgICAgLy8gdmlld1JlZiA9IHRoaXMubG9hZGVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0ZW1wbGF0ZVJlZiwgbmV3IEl0ZW1Db250ZXh0KCksIDApO1xuICAgICAgICAgICAgICAgIHZpZXdSZWYgPSBsb2FkZXIuaW5zdGFuY2UudmMuY3JlYXRlRW1iZWRkZWRWaWV3KHRlbXBsYXRlUmVmLCBuZXcgSXRlbUNvbnRleHQoKSwgMCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3VG9Mb2FkZXIuc2V0KHZpZXdSZWYsIGxvYWRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3VG9UZW1wbGF0ZS5zZXQodmlld1JlZiwgdGVtcGxhdGVSZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmlld1JlZi5kZXRhY2goKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFZpZXcgPSBnZXRJdGVtVmlld1Jvb3Qodmlld1JlZik7XG4gICAgICAgICAgICByZXN1bHRWaWV3W05HX1ZJRVddID0gdmlld1JlZjtcbiAgICAgICAgICAgIHJlc3VsdFZpZXcucmV1c2FibGUgPSB0aGlzLmF1dG9SZXVzZVZpZXdzO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFZpZXc7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFZpZXcodGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPEl0ZW1Db250ZXh0Pikge1xuICAgICAgICBjb25zdCBwb29sID0gdGhpcy5nZXRWaWV3UG9vbCh0ZW1wbGF0ZVJlZik7XG4gICAgICAgIHdoaWxlIChwb29sLnNjcmFwSGVhZC5zaXplID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PiA9IHBvb2wuc2NyYXBIZWFkLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgIHBvb2wuc2NyYXBIZWFkLmRlbGV0ZSh2aWV3UmVmKTtcbiAgICAgICAgICAgIGlmICghdmlld1JlZi5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlld1JlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZpZXdQb29sKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdQb29sLmhhcyh0ZW1wbGF0ZVJlZikpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1Bvb2wuc2V0KHRlbXBsYXRlUmVmLCB7XG4gICAgICAgICAgICAgICAgc2NyYXBTaXplOiB0aGlzLmF1dG9SZXVzZVZpZXdzID8gSW5maW5pdHkgOiAwLFxuICAgICAgICAgICAgICAgIHNjcmFwSGVhZDogbmV3IFNldDxFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+PigpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52aWV3UG9vbC5nZXQodGVtcGxhdGVSZWYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SXRlbVRlbXBsYXRlcygpIHtcbiAgICAgICAgLy8gVGhlIGl0ZW1UZW1wbGF0ZVF1ZXJ5IG1heSBiZSBjaGFuZ2VkIGFmdGVyIGxpc3QgaXRlbXMgYXJlIGFkZGVkIHRoYXQgY29udGFpbiA8dGVtcGxhdGU+IGluc2lkZSxcbiAgICAgICAgLy8gc28gY2FjaGUgYW5kIHVzZSBvbmx5IHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSB0byBhdm9pZCBlcnJvcnMuXG4gICAgICAgIHRoaXMuaXRlbVRlbXBsYXRlID0gdGhpcy5pdGVtVGVtcGxhdGVRdWVyeTtcblxuICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGVNYXApIHtcbiAgICAgICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICdTZXR0aW5nIHRlbXBsYXRlcycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXM6IEtleWVkVGVtcGxhdGVbXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGVNYXAuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lml0ZW1UZW1wbGF0ZXMgPSB0ZW1wbGF0ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbWFwIHdhcyBub3QgaW5pdGlhbGl6ZWQgdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBuYW1lZCB0ZW1wbGF0ZXMsIHNvIHdlIHJlZ2lzdGVyIHRoZSBkZWZhdWx0IG9uZS5cbiAgICAgICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lml0ZW1UZW1wbGF0ZSA9IHRoaXMuZ2V0SXRlbVRlbXBsYXRlVmlld0ZhY3RvcnkodGhpcy5pdGVtVGVtcGxhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXRlY3RDaGFuZ2VzT25DaGlsZCh2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8SXRlbUNvbnRleHQ+LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ01hbnVhbGx5IGRldGVjdCBjaGFuZ2VzIGluIGNoaWxkOiAnICsgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXdSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3Rpb25WaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50VmlldyB7XG4gICAgcm9vdE5vZGVzOiBhbnlbXTtcbiAgICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFJvb3RMb2NhdG9yID0gKG5vZGVzOiBhbnlbXSwgbmVzdExldmVsOiBudW1iZXIpID0+IFZpZXc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtVmlld1Jvb3Qodmlld1JlZjogQ29tcG9uZW50Vmlldywgcm9vdExvY2F0b3I6IFJvb3RMb2NhdG9yID0gZXh0cmFjdFNpbmdsZVZpZXdSZWN1cnNpdmUpOiBWaWV3IHtcbiAgICBjb25zdCByb290VmlldyA9IHJvb3RMb2NhdG9yKHZpZXdSZWYucm9vdE5vZGVzLCAwKTtcbiAgICByZXR1cm4gcm9vdFZpZXc7XG59XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tjdlRlbXBsYXRlS2V5XScgfSlcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUtleURpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PiwgQEhvc3QoKSBwcml2YXRlIGNvbGxlY3Rpb25WaWV3OiBDb2xsZWN0aW9uVmlld0NvbXBvbmVudCkge31cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGN2VGVtcGxhdGVLZXkodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICdjdlRlbXBsYXRlS2V5OiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbGxlY3Rpb25WaWV3ICYmIHRoaXMudGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvblZpZXcucmVnaXN0ZXJUZW1wbGF0ZSh2YWx1ZS50b0xvd2VyQ2FzZSgpLCB0aGlzLnRlbXBsYXRlUmVmKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==