@myrmidon/paged-data-browsers 1.1.0 → 2.0.0

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.
@@ -1,4 +1,4 @@
1
- import { BehaviorSubject, forkJoin, of, switchMap, tap, } from 'rxjs';
1
+ import { BehaviorSubject, forkJoin, of, tap, } from 'rxjs';
2
2
  import { LRUCache } from './lru-cache';
3
3
  import { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';
4
4
  /**
@@ -23,7 +23,7 @@ export class PagedTreeStore {
23
23
  return;
24
24
  }
25
25
  this._pageSize = value;
26
- this.reset(this._radix?.label || this._radixLabel);
26
+ this.reset();
27
27
  }
28
28
  /**
29
29
  * Create an instance of the store.
@@ -35,21 +35,12 @@ export class PagedTreeStore {
35
35
  this._pageSize = options.pageSize;
36
36
  this._cache = new LRUCache(options.cacheSize);
37
37
  this._customCacheKeyBuilder = options.buildCacheKey;
38
- this._radixLabel = '(root)';
39
- this._roots = [];
40
38
  this._nodes$ = new BehaviorSubject([]);
41
39
  this.nodes$ = this._nodes$.asObservable();
42
- this._tags$ = new BehaviorSubject([]);
43
- this.tags$ = this._tags$.asObservable();
44
40
  this._filter$ = new BehaviorSubject({});
45
41
  this.filter$ = this._filter$.asObservable();
46
42
  this._dirty = true;
47
- this.updateTags();
48
- }
49
- updateTags() {
50
- this._service.getTags().subscribe((tags) => {
51
- this._tags$.next(tags);
52
- });
43
+ this._hasMockRoot = options.hasMockRoot || false;
53
44
  }
54
45
  /**
55
46
  * Gets the global filter, eventually overridden with values
@@ -65,6 +56,13 @@ export class PagedTreeStore {
65
56
  }
66
57
  : this._filter$.value;
67
58
  }
59
+ /**
60
+ * Checks if this store is empty.
61
+ * @returns True if this store is empty.
62
+ */
63
+ isEmpty() {
64
+ return this._nodes$.value.length === 0;
65
+ }
68
66
  /**
69
67
  * Gets all the nodes in the store.
70
68
  * @returns The nodes.
@@ -72,13 +70,6 @@ export class PagedTreeStore {
72
70
  getNodes() {
73
71
  return this._nodes$.value;
74
72
  }
75
- /**
76
- * Gets the list of nodes tags.
77
- * @returns The tags.
78
- */
79
- getTags() {
80
- return this._tags$.value;
81
- }
82
73
  /**
83
74
  * Build the cache key for the given page number and filter.
84
75
  * The default implementation just returns a stringified object
@@ -94,6 +85,13 @@ export class PagedTreeStore {
94
85
  }
95
86
  return JSON.stringify({ pageNumber, ...filter });
96
87
  }
88
+ /**
89
+ * Get the specified page of nodes, either from cache or from the server.
90
+ * When the page is retrieved from the server, it is stored in cache.
91
+ * @param filter The filter to apply.
92
+ * @param pageNumber The page number to get.
93
+ * @returns Observable of the page of nodes.
94
+ */
97
95
  getPageFromCacheOrServer(filter, pageNumber) {
98
96
  const key = this.buildCacheKey(pageNumber, filter);
99
97
  const pageInCache = this._cache.get(key);
@@ -101,11 +99,19 @@ export class PagedTreeStore {
101
99
  return of(pageInCache);
102
100
  }
103
101
  else {
104
- return this._service.getNodes(filter, pageNumber, this._pageSize).pipe(tap((page) => {
102
+ return this._service
103
+ .getNodes(filter, pageNumber, this._pageSize, this._hasMockRoot)
104
+ .pipe(tap((page) => {
105
105
  this._cache.put(key, page, 0);
106
106
  }));
107
107
  }
108
108
  }
109
+ /**
110
+ * Create paged tree nodes from a page of tree nodes, by providing further
111
+ * metadata like page number, page count and total items.
112
+ * @param page The page to create nodes from.
113
+ * @returns Paged nodes.
114
+ */
109
115
  createPageNodes(page) {
110
116
  return page.items.map((n) => {
111
117
  return {
@@ -123,94 +129,44 @@ export class PagedTreeStore {
123
129
  * Sets the filter for this store. Whenever the filter is set,
124
130
  * the store is reset.
125
131
  * @param filter The filter.
126
- * @param radixLabel The label of the radix node, if this needs to be set.
127
132
  * @returns true if tree was changed, false otherwise.
128
133
  */
129
- setFilter(filter, radixLabel) {
134
+ setFilter(filter) {
130
135
  if (this._filter$.value === filter) {
131
136
  return Promise.resolve(false);
132
137
  }
133
138
  this._filter$.next(filter);
134
139
  this._dirty = true;
135
- return this.reset(this._radix?.label || radixLabel || this._radixLabel);
140
+ return this.reset();
136
141
  }
137
142
  /**
138
143
  * Reset the store, loading the root nodes and their children.
139
- * @param label The label of the radix node.
140
144
  * @returns true if tree was changed, false otherwise.
141
145
  */
142
- reset(label) {
146
+ reset() {
143
147
  if (!this._dirty) {
144
148
  return Promise.resolve(false);
145
149
  }
146
150
  this._cache.clear();
147
151
  const filter = this._filter$.value;
148
- this._radix = {
149
- id: 0,
150
- y: 0,
151
- x: 1,
152
- label: label,
153
- paging: {
154
- pageNumber: 0,
155
- pageCount: 0,
156
- total: 0,
157
- },
158
- };
159
152
  return new Promise((resolve, reject) => {
160
153
  this._service
161
- .getRootNodes(filter.tags)
162
- .pipe(switchMap((nodes) => {
163
- // no roots, clear and return empty set
164
- if (!nodes || nodes.length === 0) {
165
- this._roots = [];
166
- return of([]);
167
- }
168
- else {
169
- // got roots, set them and get their children
170
- this._roots = nodes.map((node) => ({
171
- ...node,
172
- paging: {
173
- pageNumber: 1,
174
- pageCount: 1,
175
- total: 1,
176
- },
177
- }));
178
- // fetch children for each root node
179
- return forkJoin(this._roots.map((root) => this.getPageFromCacheOrServer({ ...filter, parentId: root.id }, 1)));
180
- }
181
- }))
154
+ .getNodes({
155
+ ...filter,
156
+ parentId: undefined,
157
+ }, 1, this._pageSize, this._hasMockRoot)
182
158
  .subscribe({
183
- next: (pages) => {
184
- this._dirty = false;
185
- if (pages.some((page) => page.total)) {
186
- // radix
187
- this._radix.hasChildren = true;
188
- this._radix.expanded = true;
189
- this._radix.paging = {
190
- pageNumber: 1,
191
- pageCount: 1,
192
- total: pages.length,
193
- };
194
- // roots
195
- this._roots.forEach((root, i) => {
196
- root.hasChildren = !!pages[i].total;
197
- root.expanded = !!pages[i].total;
198
- });
199
- const nodes = this._roots.flatMap((root, i) => [
200
- root,
201
- ...this.createPageNodes(pages[i]),
202
- ]);
203
- this._nodes$.next([this._radix, ...nodes]);
204
- resolve(true);
205
- }
206
- else {
207
- this._roots.forEach((root) => {
208
- root.hasChildren = false;
209
- root.expanded = false;
159
+ next: (page) => {
160
+ this._nodes$.next(this.createPageNodes(page));
161
+ // get the children of each node thus calculating their hasChildren property
162
+ const childrenObservables = this._nodes$.value.map((node) => this.getPageFromCacheOrServer({ ...filter, parentId: node.id }, 1));
163
+ forkJoin(childrenObservables).subscribe((childrenPages) => {
164
+ childrenPages.forEach((page, i) => {
165
+ this._nodes$.value[i].hasChildren = page.total > 0;
210
166
  });
211
- this._nodes$.next([this._radix, ...this._roots]);
212
- resolve(true);
213
- }
167
+ });
168
+ this._dirty = false;
169
+ resolve(true);
214
170
  },
215
171
  error: (error) => {
216
172
  reject(error);
@@ -413,7 +369,12 @@ export class PagedTreeStore {
413
369
  * Collapse all the nodes in the store.
414
370
  */
415
371
  collapseAll() {
416
- this._nodes$.next([this._radix, ...this._roots]);
372
+ if (this.isEmpty()) {
373
+ return;
374
+ }
375
+ // collapse the first node
376
+ const root = this._nodes$.value[0];
377
+ this.collapse(root.id);
417
378
  }
418
379
  /**
419
380
  * Clear the cache.
@@ -432,4 +393,4 @@ export class PagedTreeStore {
432
393
  return this._cache.has(key);
433
394
  }
434
395
  }
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLEVBQUUsRUFDRixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBSWQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWdHdEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQW9DekI7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ1UsUUFBa0MsRUFDMUMsVUFBaUMsZ0NBQWdDO1FBRHpELGFBQVEsR0FBUixRQUFRLENBQTBCO1FBRzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFxQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9B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aEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIGZvcmtKb2luLFxyXG4gIG9mLFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YXAsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuaW1wb3J0IHsgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlMgfSBmcm9tICcuL3BhZ2VkLWxpc3Quc3RvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlLiBZb3VyIGRhdGEgc2VydmljZSBzaG91bGQgcmV0dXJuIGEgbGlzdCBvZiB0aGVzZSBub2Rlc1xyXG4gKiBvciBvZiBhbnkgdHlwZSBleHRlbmRpbmcgdGhpcyBpbnRlcmZhY2UuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB4OiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB0YWc/OiBzdHJpbmc7XHJcbiAgaGFzQ2hpbGRyZW4/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQSBmaWx0ZXIgZm9yIHRyZWUgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlRmlsdGVyIHtcclxuICB0YWdzPzogc3RyaW5nW107XHJcbiAgcGFyZW50SWQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYWdpbmcgaW5mb3JtYXRpb24gZm9yIGEgcGFnZWQgdHJlZSBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmdJbmZvIHtcclxuICBwYWdlTnVtYmVyOiBudW1iZXI7XHJcbiAgcGFnZUNvdW50OiBudW1iZXI7XHJcbiAgdG90YWw6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlIHdpdGggcGFnaW5nIGluZm9ybWF0aW9uLCB1c2VkIGluIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZU5vZGU8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiBleHRlbmRzIFRyZWVOb2RlIHtcclxuICBwYWdpbmc6IFBhZ2luZ0luZm87XHJcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xyXG4gIGZpbHRlcj86IEY7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgTm9kZUJyb3dzZXJTdG9yZVxyXG4gKiB0byBsb2FkIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZFRyZWVTdG9yZVNlcnZpY2U8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiB7XHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCB0aGUgcm9vdCBub2Rlcywgb3IganVzdCB0aGUgb25lcyBoYXZpbmcgb25lIG9mIHRoZSBzcGVjaWZpZWRcclxuICAgKiB0YWdzLlxyXG4gICAqIEBwYXJhbSB0YWdzIFRoZSBvcHRpb25hbCB0YWdzIHRvIGZpbHRlciB0aGUgcm9vdCBub2Rlcy5cclxuICAgKi9cclxuICBnZXRSb290Tm9kZXModGFncz86IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxUcmVlTm9kZVtdPjtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2Rlcy5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqL1xyXG4gIGdldE5vZGVzKFxyXG4gICAgZmlsdGVyOiBGLFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgcGFnZVNpemU6IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VHJlZU5vZGU+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBsaXN0IG9mIHVuaXF1ZSBub2RlIHRhZ3MuIEVhY2ggdGFnIGNvcnJlc3BvbmRzIHRvIGEgdHJlZSxcclxuICAgKiBhcyBub2RlcyBhcmUgdmlydHVhbGx5IGdyb3VwZWQgYnkgdGhlaXIgdGFnLlxyXG4gICAqL1xyXG4gIGdldFRhZ3MoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgTm9kZUJyb3dzZXJTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlU3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3RvcmUgZm9yIHRoZSBub2RlIGJyb3dzZXIgY29tcG9uZW50LiBUaGlzIHN0b3JlIGlzIHVzZWQgdG8ga2VlcCBhXHJcbiAqIGxpc3Qgb2Ygbm9kZXMsIGFuZCB0byBsb2FkIHRoZW0gZnJvbSB0aGUgQVBJLiBJdCBhbHNvIGtlZXBzIHRoZSByb290XHJcbiAqIG5vZGUuIEV2ZXJ5IHRyZWUgbm9kZSBpbiB0aGUgbGlzdCBpcyBleHRlbmRlZCB3aXRoIHBhZ2UgbnVtYmVyLFxyXG4gKiBwYWdlIGNvdW50IGFuZCB0b3RhbCBpdGVtcywgcGx1cyBleHBhbnNpb24tcmVsYXRlZCBtZXRhZGF0YS5cclxuICogVGhlIHN0b3JlIGtlZXBzIGEgZmxhdCBsaXN0IG9mIHRoZXNlIHRyZWUgbm9kZXMsIGFsbG93aW5nIHVzZXJzIHRvXHJcbiAqIGV4cGFuZCBhbmQgY29sbGFwc2UgdGhlbS5cclxuICogRiBpcyB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyIG9iamVjdCwgRSBpcyB0aGUgdHlwZSBvZiB0aGUgcGFnZWQgdHJlZSBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZFRyZWVTdG9yZTxcclxuICBFIGV4dGVuZHMgUGFnZWRUcmVlTm9kZTxGPixcclxuICBGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXJcclxuPiB7XHJcbiAgcHJpdmF0ZSBfcmFkaXg/OiBFO1xyXG4gIHByaXZhdGUgX3JhZGl4TGFiZWw6IHN0cmluZztcclxuICBwcml2YXRlIF9yb290czogRVtdO1xyXG4gIHByaXZhdGUgX25vZGVzJDogQmVoYXZpb3JTdWJqZWN0PEVbXT47XHJcbiAgcHJpdmF0ZSBfdGFncyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT47XHJcbiAgcHJpdmF0ZSBfZmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PEY+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1c3RvbUNhY2hlS2V5QnVpbGRlcj86IChcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIGZpbHRlcjogYW55XHJcbiAgKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGU6IExSVUNhY2hlPERhdGFQYWdlPFRyZWVOb2RlPj47XHJcblxyXG4gIHByaXZhdGUgX3BhZ2VTaXplOiBudW1iZXI7XHJcbiAgLy8gZGlydHkgc3RhdGU6IHRoaXMgaXMgcmVzZXQgd2hlbiB0aGUgc3RvcmUgaXMgcmVzZXQsIGFuZCBzZXQgdG8gdHJ1ZVxyXG4gIC8vIHdoZW4gdGhlIHN0b3JlIGlzIGNoYW5nZWRcclxuICBwcml2YXRlIF9kaXJ0eT86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmbGF0IGxpc3Qgb2YgcGFnZWQgbm9kZXMgaW4gdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgbm9kZXMkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEVbXT4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbGlzdCBvZiB0cmVlIHRhZ3MgaW4gdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgdGFncyQ6IE9ic2VydmFibGU8UmVhZG9ubHk8c3RyaW5nW10+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGdsb2JhbCBub2RlcyBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8UmVhZG9ubHk8Rj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBub2RlcyBwYWdlcyBpbiB0aGlzIHN0b3JlLiBJZiB5b3UgY2hhbmdlIGl0LCB0aGUgc3RvcmVcclxuICAgKiBpcyByZXNldC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9wYWdlU2l6ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGFnZVNpemUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmVzZXQodGhpcy5fcmFkaXg/LmxhYmVsIHx8IHRoaXMuX3JhZGl4TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzdG9yZS5cclxuICAgKiBAcGFyYW0gX3NlcnZpY2UgVGhlIHNlcnZpY2UgdXNlZCB0byBsb2FkIG5vZGVzLlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGlzIHN0b3JlLlxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2VydmljZTogUGFnZWRUcmVlU3RvcmVTZXJ2aWNlPEY+LFxyXG4gICAgb3B0aW9uczogUGFnZWRUcmVlU3RvcmVPcHRpb25zID0gREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlNcclxuICApIHtcclxuICAgIHRoaXMuX3BhZ2VTaXplID0gb3B0aW9ucy5wYWdlU2l6ZTtcclxuICAgIHRoaXMuX2NhY2hlID0gbmV3IExSVUNhY2hlPERhdGFQYWdlPFRyZWVOb2RlPj4ob3B0aW9ucy5jYWNoZVNpemUpO1xyXG4gICAgdGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyID0gb3B0aW9ucy5idWlsZENhY2hlS2V5O1xyXG4gICAgdGhpcy5fcmFkaXhMYWJlbCA9ICcocm9vdCknO1xyXG4gICAgdGhpcy5fcm9vdHMgPSBbXTtcclxuICAgIHRoaXMuX25vZGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPihbXSk7XHJcbiAgICB0aGlzLm5vZGVzJCA9IHRoaXMuX25vZGVzJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX3RhZ3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xyXG4gICAgdGhpcy50YWdzJCA9IHRoaXMuX3RhZ3MkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5fZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rj4oe30gYXMgRik7XHJcbiAgICB0aGlzLmZpbHRlciQgPSB0aGlzLl9maWx0ZXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGVUYWdzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRhZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2aWNlLmdldFRhZ3MoKS5zdWJzY3JpYmUoKHRhZ3MpID0+IHtcclxuICAgICAgdGhpcy5fdGFncyQubmV4dCh0YWdzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgZ2xvYmFsIGZpbHRlciwgZXZlbnR1YWxseSBvdmVycmlkZGVuIHdpdGggdmFsdWVzXHJcbiAgICogZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUncyBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIG9wdGlvbmFsIG5vZGUuXHJcbiAgICogQHJldHVybnMgVGhlIGZpbHRlci5cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcihub2RlPzogUGFnZWRUcmVlTm9kZTxGPik6IEYge1xyXG4gICAgcmV0dXJuIG5vZGU/LmZpbHRlclxyXG4gICAgICA/IHtcclxuICAgICAgICAgIC4uLnRoaXMuX2ZpbHRlciQudmFsdWUsXHJcbiAgICAgICAgICAuLi5ub2RlLmZpbHRlcixcclxuICAgICAgICB9XHJcbiAgICAgIDogdGhpcy5fZmlsdGVyJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICogQHJldHVybnMgVGhlIG5vZGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXROb2RlcygpOiBSZWFkb25seTxQYWdlZFRyZWVOb2RlPEY+W10+IHtcclxuICAgIHJldHVybiB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIG5vZGVzIHRhZ3MuXHJcbiAgICogQHJldHVybnMgVGhlIHRhZ3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFRhZ3MoKTogUmVhZG9ubHk8c3RyaW5nW10+IHtcclxuICAgIHJldHVybiB0aGlzLl90YWdzJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlciBhbmQgZmlsdGVyLlxyXG4gICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBhIHN0cmluZ2lmaWVkIG9iamVjdFxyXG4gICAqIGNvbnRhaW5pbmcgdGhlIHBhZ2UgbnVtYmVyIGFuZCB0aGUgZmlsdGVyLiBZb3UgbWF5IG92ZXJyaWRlXHJcbiAgICogdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYWNoZSBrZXkuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBwdWJsaWMgYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHBhZ2VOdW1iZXIsIC4uLmZpbHRlciB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKFxyXG4gICAgZmlsdGVyOiBGLFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyXHJcbiAgKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxUcmVlTm9kZT4+IHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgY29uc3QgcGFnZUluQ2FjaGUgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuXHJcbiAgICBpZiAocGFnZUluQ2FjaGUpIHtcclxuICAgICAgcmV0dXJuIG9mKHBhZ2VJbkNhY2hlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLmdldE5vZGVzKGZpbHRlciwgcGFnZU51bWJlciwgdGhpcy5fcGFnZVNpemUpLnBpcGUoXHJcbiAgICAgICAgdGFwKChwYWdlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9jYWNoZS5wdXQoa2V5LCBwYWdlLCAwKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQYWdlTm9kZXMocGFnZTogRGF0YVBhZ2U8VHJlZU5vZGU+KTogUGFnZWRUcmVlTm9kZTxGPltdIHtcclxuICAgIHJldHVybiBwYWdlLml0ZW1zLm1hcCgobikgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLm4sXHJcbiAgICAgICAgaGFzQ2hpbGRyZW46IG4uaGFzQ2hpbGRyZW4sXHJcbiAgICAgICAgcGFnaW5nOiB7XHJcbiAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlLnBhZ2VOdW1iZXIsXHJcbiAgICAgICAgICBwYWdlQ291bnQ6IHBhZ2UucGFnZUNvdW50LFxyXG4gICAgICAgICAgdG90YWw6IHBhZ2UudG90YWwsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIHN0b3JlLiBXaGVuZXZlciB0aGUgZmlsdGVyIGlzIHNldCxcclxuICAgKiB0aGUgc3RvcmUgaXMgcmVzZXQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSByYWRpeExhYmVsIFRoZSBsYWJlbCBvZiB0aGUgcmFkaXggbm9kZSwgaWYgdGhpcyBuZWVkcyB0byBiZSBzZXQuXHJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0cmVlIHdhcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldEZpbHRlcihmaWx0ZXI6IEYsIHJhZGl4TGFiZWw/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXIkLnZhbHVlID09PSBmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9maWx0ZXIkLm5leHQoZmlsdGVyKTtcclxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLnJlc2V0KHRoaXMuX3JhZGl4Py5sYWJlbCB8fCByYWRpeExhYmVsIHx8IHRoaXMuX3JhZGl4TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIHN0b3JlLCBsb2FkaW5nIHRoZSByb290IG5vZGVzIGFuZCB0aGVpciBjaGlsZHJlbi5cclxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSByYWRpeCBub2RlLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXNldChsYWJlbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuX2RpcnR5KSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcbiAgICB0aGlzLl9yYWRpeCA9IHtcclxuICAgICAgaWQ6IDAsXHJcbiAgICAgIHk6IDAsXHJcbiAgICAgIHg6IDEsXHJcbiAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgcGFnaW5nOiB7XHJcbiAgICAgICAgcGFnZU51bWJlcjogMCxcclxuICAgICAgICBwYWdlQ291bnQ6IDAsXHJcbiAgICAgICAgdG90YWw6IDAsXHJcbiAgICAgIH0sXHJcbiAgICB9IGFzIEU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2VydmljZVxyXG4gICAgICAgIC5nZXRSb290Tm9kZXMoZmlsdGVyLnRhZ3MpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBzd2l0Y2hNYXAoKG5vZGVzKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIG5vIHJvb3RzLCBjbGVhciBhbmQgcmV0dXJuIGVtcHR5IHNldFxyXG4gICAgICAgICAgICBpZiAoIW5vZGVzIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3Jvb3RzID0gW107XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBnb3Qgcm9vdHMsIHNldCB0aGVtIGFuZCBnZXQgdGhlaXIgY2hpbGRyZW5cclxuICAgICAgICAgICAgICB0aGlzLl9yb290cyA9IG5vZGVzLm1hcChcclxuICAgICAgICAgICAgICAgIChub2RlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAoe1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLm5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFnaW5nOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZUNvdW50OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG90YWw6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgfSBhcyBFKVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgLy8gZmV0Y2ggY2hpbGRyZW4gZm9yIGVhY2ggcm9vdCBub2RlXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdHMubWFwKChyb290KSA9PlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgICAgICAgICAgICAgICAgICB7IC4uLmZpbHRlciwgcGFyZW50SWQ6IHJvb3QuaWQgfSxcclxuICAgICAgICAgICAgICAgICAgICAxXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChwYWdlcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAocGFnZXMuc29tZSgocGFnZSkgPT4gcGFnZS50b3RhbCkpIHtcclxuICAgICAgICAgICAgICAvLyByYWRpeFxyXG4gICAgICAgICAgICAgIHRoaXMuX3JhZGl4IS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmFkaXghLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLl9yYWRpeCEucGFnaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgcGFnZU51bWJlcjogMSxcclxuICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogMSxcclxuICAgICAgICAgICAgICAgIHRvdGFsOiBwYWdlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAvLyByb290c1xyXG4gICAgICAgICAgICAgIHRoaXMuX3Jvb3RzLmZvckVhY2goKHJvb3QsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJvb3QuaGFzQ2hpbGRyZW4gPSAhIXBhZ2VzW2ldLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgcm9vdC5leHBhbmRlZCA9ICEhcGFnZXNbaV0udG90YWw7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9yb290cy5mbGF0TWFwKChyb290LCBpKSA9PiBbXHJcbiAgICAgICAgICAgICAgICByb290LFxyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5jcmVhdGVQYWdlTm9kZXMocGFnZXNbaV0pLFxyXG4gICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KFt0aGlzLl9yYWRpeCEsIC4uLihub2RlcyBhcyBFW10pXSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cy5mb3JFYWNoKChyb290KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByb290Lmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByb290LmV4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQoW3RoaXMuX3JhZGl4ISwgLi4udGhpcy5fcm9vdHNdKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBub2RlIGZpbHRlciBmb3IgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBpZCBUaGUgbm9kZSBJRC5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIGZpbHRlciB3YXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVGaWx0ZXIoaWQ6IG51bWJlciwgZmlsdGVyPzogRiB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUhLmZpbHRlciA9IGZpbHRlciB8fCB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZVBhZ2UoaWQsIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGV4cGFuZGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8IG5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihub2RlKSwgcGFyZW50SWQ6IGlkIH0sXHJcbiAgICAgICAgMVxyXG4gICAgICApLnN1YnNjcmliZSgocGFnZSkgPT4ge1xyXG4gICAgICAgIC8vIG5vIGNoaWxkcmVuLCBzZXQgaGFzQ2hpbGRyZW4gdG8gZmFsc2VcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIG5vZGUhLmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IHBhZ2Ugbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGluZGV4ICsgMSwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG5vZGUhLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kQWxsKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyBnZXQgdGhlIHBhcmVudCBub2RlIHRvIHN0YXJ0IGZyb21cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuZmluZEluZGV4KChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb2xsZWN0IGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyBJRHNcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZXNUb0V4cGFuZCA9IG5vZGVzLnNsaWNlKG5vZGVJbmRleCwgaSkubWFwKChuKSA9PiBuLmlkKTtcclxuXHJcbiAgICAvLyBleHBhbmQgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBub2Rlc1RvRXhwYW5kLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBhbmQoaWQpO1xyXG4gICAgICAgIHRoaXMuZXhwYW5kQWxsKGlkKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbihpZDogbnVtYmVyKTogRVtdIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3QgaW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUpO1xyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZHJlbjogRVtdID0gW107XHJcbiAgICBsZXQgaSA9IGluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2RlLnkpIHtcclxuICAgICAgY2hpbGRyZW4ucHVzaChub2Rlc1tpXSk7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVzY2VuZGFudHMoXHJcbiAgICBub2RlczogUGFnZWRUcmVlTm9kZTxGPltdLFxyXG4gICAgbm9kZUluZGV4OiBudW1iZXJcclxuICApOiB2b2lkIHtcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgbm9kZXMuc3BsaWNlKG5vZGVJbmRleCArIDEsIGkgLSBub2RlSW5kZXggLSAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxhcHNlIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4gSWYgdGhlIG5vZGUgaXMgbm90IGV4cGFuZGFibGUsXHJcbiAgICogb3IgaXQgaXMgYWxyZWFkeSBjb2xsYXBzZWQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cclxuICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjb2xsYXBzZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgY29sbGFwc2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8ICFub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuaW5kZXhPZihub2RlISk7XHJcbiAgICAgIGlmIChub2RlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZURlc2NlbmRhbnRzKG5vZGVzLCBub2RlSW5kZXgpO1xyXG4gICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICBub2RlIS5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBwYWdlIGluY2x1ZGluZyB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIHBhcmVudCBub2RlIHdob3NlIGNoaWxkcmVuIGFyZSBpbnNpZGUgdGhlIHBhZ2UgeW91IHdhbnQgdG8gY2hhbmdlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBuZXcgcGFnZSBudW1iZXIuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIHBhZ2Ugd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZShwYXJlbnRJZDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gcGFyZW50SWQpO1xyXG4gICAgICBpZiAoIXBhcmVudE5vZGUpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgICAgICB7IC4uLnRoaXMuZ2V0RmlsdGVyKHBhcmVudE5vZGUpLCBwYXJlbnRJZCB9LFxyXG4gICAgICAgIHBhZ2VOdW1iZXJcclxuICAgICAgKS5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICAvLyBpZiBwYWdlIGlzIGVtcHR5IGRvIG5vdGhpbmdcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHRoZSBub2RlcyBpbiB0aGUgc2FtZSBwYWdlIG9mIG5vZGVcclxuICAgICAgICAgIC8vIHdpdGggYWxsIHRoZWlyIGRlc2NlbmRhbnRzXHJcbiAgICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmluZGV4T2YocGFyZW50Tm9kZSEpICsgMTtcclxuICAgICAgICAgIGNvbnN0IHBhZ2VOb2RlcyA9IHRoaXMuY3JlYXRlUGFnZU5vZGVzKHBhZ2UpO1xyXG4gICAgICAgICAgLy8gZmluZCB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgbm9kZSdzIHBhZ2VcclxuICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVJbmRleDtcclxuICAgICAgICAgIGNvbnN0IG9sZFBhZ2VOciA9IG5vZGVzW3N0YXJ0XS5wYWdpbmcucGFnZU51bWJlcjtcclxuICAgICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgc3RhcnQgPiAwICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFyZW50SWQgPT09IHBhcmVudElkICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFnaW5nLnBhZ2VOdW1iZXIgPT09IG9sZFBhZ2VOclxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0LS07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlLFxyXG4gICAgICAgICAgLy8gaW5jbHVkaW5nIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgbGV0IGVuZCA9IG5vZGVJbmRleCArIDE7XHJcbiAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgIGVuZCA8IG5vZGVzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhcmVudElkID09PSBwYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhZ2luZy5wYWdlTnVtYmVyID09PSBvbGRQYWdlTnJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIHRoZXNlIG5vZGVzIHdpdGggdGhlIG5ldyBvbmVzXHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcclxuICAgICAgICAgIG5vZGVzLnNwbGljZShzdGFydCwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcGFyZW50IG5vZGUgcGFnaW5nIGluZm9cclxuICAgICAgICAgIHBhcmVudE5vZGUhLnBhZ2luZy5wYWdlTnVtYmVyID0gcGFnZS5wYWdlTnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSBhbGwgdGhlIG5vZGVzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2VBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ub2RlcyQubmV4dChbdGhpcy5fcmFkaXghLCAuLi50aGlzLl9yb290c10pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlciBhbmQgZmlsdGVyIGlzIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFnZSBpcyBpbiBjYWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNDYWNoZWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KTtcclxuICB9XHJcbn1cclxuIl19
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLEVBQUUsRUFFRixHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFJZCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBNkZ0RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBNEJ6Qjs7O09BR0c7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFXLFFBQVEsQ0FBQyxLQUFhO1FBQy9CLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFDVSxRQUFrQyxFQUMxQyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFHMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQXFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFJLEVBQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFNBQVMsQ0FBQyxJQUF1QjtRQUN2QyxPQUFPLElBQUksRUFBRSxNQUFNO1lBQ2pCLENBQUMsQ0FBQztnQkFDRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztnQkFDdEIsR0FBRyxJQUFJLENBQUMsTUFBTTthQUNmO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxhQUFhLENBQUMsVUFBa0IsRUFBRSxNQUFTO1FBQ2hELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyx3QkFBd0IsQ0FDOUIsTUFBUyxFQUNULFVBQWtCO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXpDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxRQUFRO2lCQUNqQixRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7aUJBQy9ELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLElBQXdCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMxQixPQUFPO2dCQUNMLEdBQUcsQ0FBQztnQkFDSixXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7Z0JBQzFCLE1BQU0sRUFBRTtvQkFDTixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNsQjthQUNHLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFNBQVMsQ0FBQyxNQUFTO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbkMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBRW5DLE9BQU8sSUFBSSxPQUFPLENBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFFBQVE7aUJBQ1YsUUFBUSxDQUNQO2dCQUNFLEdBQUcsTUFBTTtnQkFDVCxRQUFRLEVBQUUsU0FBUzthQUNwQixFQUNELENBQUMsRUFDRCxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxZQUFZLENBQ2xCO2lCQUNBLFNBQVMsQ0FBQztnQkFDVCxJQUFJLEVBQUUsQ0FBQyxJQUF3QixFQUFFLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFFOUMsNEVBQTRFO29CQUM1RSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzFELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ25FLENBQUM7b0JBQ0YsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7d0JBQ3hELGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzt3QkFDckQsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGFBQWEsQ0FBQyxFQUFVLEVBQUUsTUFBaUI7UUFDaEQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxJQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxTQUFTLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxFQUFVO1FBQ3RCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQixDQUFDO1lBRUQsSUFBSSxDQUFDLHdCQUF3QixDQUMzQixFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQ3pDLENBQUMsQ0FDRixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNuQix3Q0FBd0M7Z0JBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2hCLElBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbkIsMkNBQTJDO29CQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDakMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFLLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDakIsTUFBTSxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO29CQUM3QyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDN0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFJLFNBQWlCLENBQUMsQ0FBQzt3QkFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3pCLElBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUN6QixJQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVMsQ0FBQyxFQUFVO1FBQ3pCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0Qsb0NBQW9DO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxJQUFJLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsQ0FBQyxFQUFFLENBQUM7UUFDTixDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFakUsa0NBQWtDO1FBQ2xDLE9BQU8sSUFBSSxPQUFPLENBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDOUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVcsQ0FBQyxFQUFVO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDakMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixDQUFDLEVBQUUsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8saUJBQWlCLENBQ3ZCLEtBQXlCLEVBQ3pCLFNBQWlCO1FBRWpCLElBQUksQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxDQUFDLEVBQUUsQ0FBQztRQUNOLENBQUM7UUFDRCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxRQUFRLENBQUMsRUFBVTtRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sSUFBSSxPQUFPLENBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzFELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQixDQUFDO1lBRUQseURBQXlEO1lBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2pDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSyxDQUFDLENBQUM7WUFDdkMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLElBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksVUFBVSxDQUFDLFFBQWdCLEVBQUUsVUFBa0I7UUFDcEQsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsQ0FBQztZQUNELElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQzNDLFVBQVUsQ0FDWCxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNuQiw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixnREFBZ0Q7b0JBQ2hELDZCQUE2QjtvQkFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ2pDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3Qyx5Q0FBeUM7b0JBQ3pDLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQztvQkFDdEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7b0JBQ2pELE9BQ0UsS0FBSyxHQUFHLENBQUM7d0JBQ1QsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUTt3QkFDdEMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFDaEQsQ0FBQzt3QkFDRCxLQUFLLEVBQUUsQ0FBQztvQkFDVixDQUFDO29CQUNELHlDQUF5QztvQkFDekMsa0NBQWtDO29CQUNsQyxJQUFJLEdBQUcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO29CQUN4QixPQUNFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTTt3QkFDbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRO3dCQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQzFDLENBQUM7d0JBQ0QsR0FBRyxFQUFFLENBQUM7b0JBQ1IsQ0FBQztvQkFDRCw0Q0FBNEM7b0JBQzVDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUksU0FBaUIsQ0FBQyxDQUFDO29CQUM5QyxxQ0FBcUM7b0JBQ3JDLFVBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDVCxDQUFDO1FBQ0QsMEJBQTBCO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGFBQWEsQ0FBQyxVQUFrQixFQUFFLE1BQVM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIGZvcmtKb2luLFxyXG4gIG9mLFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YXAsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuaW1wb3J0IHsgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlMgfSBmcm9tICcuL3BhZ2VkLWxpc3Quc3RvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlLiBZb3VyIGRhdGEgc2VydmljZSBzaG91bGQgcmV0dXJuIGEgbGlzdCBvZiB0aGVzZSBub2Rlc1xyXG4gKiBvciBvZiBhbnkgdHlwZSBleHRlbmRpbmcgdGhpcyBpbnRlcmZhY2UuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB4OiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB0YWc/OiBzdHJpbmc7XHJcbiAgaGFzQ2hpbGRyZW4/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQSBmaWx0ZXIgZm9yIHRyZWUgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlRmlsdGVyIHtcclxuICB0YWdzPzogc3RyaW5nW107XHJcbiAgcGFyZW50SWQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYWdpbmcgaW5mb3JtYXRpb24gZm9yIGEgcGFnZWQgdHJlZSBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmdJbmZvIHtcclxuICBwYWdlTnVtYmVyOiBudW1iZXI7XHJcbiAgcGFnZUNvdW50OiBudW1iZXI7XHJcbiAgdG90YWw6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlIHdpdGggcGFnaW5nIGluZm9ybWF0aW9uLCB1c2VkIGluIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZU5vZGU8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiBleHRlbmRzIFRyZWVOb2RlIHtcclxuICBwYWdpbmc6IFBhZ2luZ0luZm87XHJcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xyXG4gIGZpbHRlcj86IEY7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgTm9kZUJyb3dzZXJTdG9yZVxyXG4gKiB0byBsb2FkIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZFRyZWVTdG9yZVNlcnZpY2U8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiB7XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2Rlcy5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqIEBwYXJhbSBoYXNNb2NrUm9vdCBJZiB0cnVlLCB0aGUgcm9vdCBub2RlIGlzIGEgbW9jayBub2RlIHByb3ZpZGVkIGJ5IHlvdXJcclxuICAgKiBzZXJ2aWNlLCB3aGljaCBpbXBsaWVzIHRoYXQgaXRzIFkgdmFsdWUgaXMgMCByYXRoZXIgdGhhbiAxLiBEZWZhdWx0IGlzXHJcbiAgICogZmFsc2UsIG1lYW5pbmcgdGhhdCB5b3VyIHNlcnZpY2Ugd2lsbCByZXR1cm4gYSBzaW5nbGUgcm9vdCBub2RlIHdpdGggWVxyXG4gICAqIHZhbHVlIDEuXHJcbiAgICovXHJcbiAgZ2V0Tm9kZXMoXHJcbiAgICBmaWx0ZXI6IEYsXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBwYWdlU2l6ZTogbnVtYmVyLFxyXG4gICAgaGFzTW9ja1Jvb3Q/OiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxUcmVlTm9kZT4+O1xyXG59XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgdGhlIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgcGFnZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlIGZvciBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgY2FjaGVTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxuICAvKipcclxuICAgKiBJZiB0cnVlLCB0aGUgcm9vdCBub2RlIGlzIGEgbW9jayBub2RlIHByb3ZpZGVkIGJ5IHlvdXIgc2VydmljZSwgd2hpY2hcclxuICAgKiBpbXBsaWVzIHRoYXQgaXRzIFkgdmFsdWUgaXMgMCByYXRoZXIgdGhhbiAxLiBEZWZhdWx0IGlzIGZhbHNlLCBtZWFuaW5nXHJcbiAgICogdGhhdCB5b3VyIHNlcnZpY2Ugd2lsbCByZXR1cm4gYSBzaW5nbGUgcm9vdCBub2RlIHdpdGggWSB2YWx1ZSAxLlxyXG4gICAqL1xyXG4gIGhhc01vY2tSb290PzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3RvcmUgZm9yIHRoZSBub2RlIGJyb3dzZXIgY29tcG9uZW50LiBUaGlzIHN0b3JlIGlzIHVzZWQgdG8ga2VlcCBhXHJcbiAqIGxpc3Qgb2Ygbm9kZXMsIGFuZCB0byBsb2FkIHRoZW0gZnJvbSB0aGUgQVBJLiBJdCBhbHNvIGtlZXBzIHRoZSByb290XHJcbiAqIG5vZGUuIEV2ZXJ5IHRyZWUgbm9kZSBpbiB0aGUgbGlzdCBpcyBleHRlbmRlZCB3aXRoIHBhZ2UgbnVtYmVyLFxyXG4gKiBwYWdlIGNvdW50IGFuZCB0b3RhbCBpdGVtcywgcGx1cyBleHBhbnNpb24tcmVsYXRlZCBtZXRhZGF0YS5cclxuICogVGhlIHN0b3JlIGtlZXBzIGEgZmxhdCBsaXN0IG9mIHRoZXNlIHRyZWUgbm9kZXMsIGFsbG93aW5nIHVzZXJzIHRvXHJcbiAqIGV4cGFuZCBhbmQgY29sbGFwc2UgdGhlbS5cclxuICogRiBpcyB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyIG9iamVjdCwgRSBpcyB0aGUgdHlwZSBvZiB0aGUgcGFnZWQgdHJlZSBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZFRyZWVTdG9yZTxcclxuICBFIGV4dGVuZHMgUGFnZWRUcmVlTm9kZTxGPixcclxuICBGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXJcclxuPiB7XHJcbiAgcHJpdmF0ZSBfbm9kZXMkOiBCZWhhdmlvclN1YmplY3Q8RVtdPjtcclxuICBwcml2YXRlIF9maWx0ZXIkOiBCZWhhdmlvclN1YmplY3Q8Rj47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VzdG9tQ2FjaGVLZXlCdWlsZGVyPzogKFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgZmlsdGVyOiBhbnlcclxuICApID0+IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZTogTFJVQ2FjaGU8RGF0YVBhZ2U8VHJlZU5vZGU+PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNNb2NrUm9vdDogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBfcGFnZVNpemU6IG51bWJlcjtcclxuICAvLyBkaXJ0eSBzdGF0ZTogdGhpcyBpcyByZXNldCB3aGVuIHRoZSBzdG9yZSBpcyByZXNldCwgYW5kIHNldCB0byB0cnVlXHJcbiAgLy8gd2hlbiB0aGUgc3RvcmUgaXMgY2hhbmdlZFxyXG4gIHByaXZhdGUgX2RpcnR5PzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZsYXQgbGlzdCBvZiBwYWdlZCBub2RlcyBpbiB0aGlzIHN0b3JlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBub2RlcyQ6IE9ic2VydmFibGU8UmVhZG9ubHk8RVtdPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnbG9iYWwgZmlsdGVyIGZvciBhbGwgdGhlIG5vZGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEY+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2Ygbm9kZXMgcGFnZXMgaW4gdGhpcyBzdG9yZS4gSWYgeW91IGNoYW5nZSBpdCwgdGhlIHN0b3JlXHJcbiAgICogaXMgcmVzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fcGFnZVNpemUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BhZ2VTaXplID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHN0b3JlLlxyXG4gICAqIEBwYXJhbSBfc2VydmljZSBUaGUgc2VydmljZSB1c2VkIHRvIGxvYWQgbm9kZXMuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBQYWdlZFRyZWVTdG9yZVNlcnZpY2U8Rj4sXHJcbiAgICBvcHRpb25zOiBQYWdlZFRyZWVTdG9yZU9wdGlvbnMgPSBERUZBVUxUX1BBR0VEX0xJU1RfU1RPUkVfT1BUSU9OU1xyXG4gICkge1xyXG4gICAgdGhpcy5fcGFnZVNpemUgPSBvcHRpb25zLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTFJVQ2FjaGU8RGF0YVBhZ2U8VHJlZU5vZGU+PihvcHRpb25zLmNhY2hlU2l6ZSk7XHJcbiAgICB0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIgPSBvcHRpb25zLmJ1aWxkQ2FjaGVLZXk7XHJcbiAgICB0aGlzLl9ub2RlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVbXT4oW10pO1xyXG4gICAgdGhpcy5ub2RlcyQgPSB0aGlzLl9ub2RlcyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB0aGlzLl9maWx0ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGPih7fSBhcyBGKTtcclxuICAgIHRoaXMuZmlsdGVyJCA9IHRoaXMuX2ZpbHRlciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICB0aGlzLl9oYXNNb2NrUm9vdCA9IG9wdGlvbnMuaGFzTW9ja1Jvb3QgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBnbG9iYWwgZmlsdGVyLCBldmVudHVhbGx5IG92ZXJyaWRkZW4gd2l0aCB2YWx1ZXNcclxuICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgbm9kZSdzIGZpbHRlci5cclxuICAgKiBAcGFyYW0gbm9kZSBUaGUgb3B0aW9uYWwgbm9kZS5cclxuICAgKiBAcmV0dXJucyBUaGUgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyKG5vZGU/OiBQYWdlZFRyZWVOb2RlPEY+KTogRiB7XHJcbiAgICByZXR1cm4gbm9kZT8uZmlsdGVyXHJcbiAgICAgID8ge1xyXG4gICAgICAgICAgLi4udGhpcy5fZmlsdGVyJC52YWx1ZSxcclxuICAgICAgICAgIC4uLm5vZGUuZmlsdGVyLFxyXG4gICAgICAgIH1cclxuICAgICAgOiB0aGlzLl9maWx0ZXIkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoaXMgc3RvcmUgaXMgZW1wdHkuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIHN0b3JlIGlzIGVtcHR5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25vZGVzJC52YWx1ZS5sZW5ndGggPT09IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBub2Rlcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Tm9kZXMoKTogUmVhZG9ubHk8UGFnZWRUcmVlTm9kZTxGPltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyIGFuZCBmaWx0ZXIuXHJcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGEgc3RyaW5naWZpZWQgb2JqZWN0XHJcbiAgICogY29udGFpbmluZyB0aGUgcGFnZSBudW1iZXIgYW5kIHRoZSBmaWx0ZXIuIFlvdSBtYXkgb3ZlcnJpZGVcclxuICAgKiB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgY3VzdG9tIGNhY2hlIGtleS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBidWlsZENhY2hlS2V5KHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcihwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgcGFnZU51bWJlciwgLi4uZmlsdGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2RlcywgZWl0aGVyIGZyb20gY2FjaGUgb3IgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqIFdoZW4gdGhlIHBhZ2UgaXMgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlciwgaXQgaXMgc3RvcmVkIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gZ2V0LlxyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHBhZ2Ugb2Ygbm9kZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICBmaWx0ZXI6IEYsXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXJcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICBjb25zdCBwYWdlSW5DYWNoZSA9IHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG5cclxuICAgIGlmIChwYWdlSW5DYWNoZSkge1xyXG4gICAgICByZXR1cm4gb2YocGFnZUluQ2FjaGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VcclxuICAgICAgICAuZ2V0Tm9kZXMoZmlsdGVyLCBwYWdlTnVtYmVyLCB0aGlzLl9wYWdlU2l6ZSwgdGhpcy5faGFzTW9ja1Jvb3QpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKHBhZ2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgcGFnZWQgdHJlZSBub2RlcyBmcm9tIGEgcGFnZSBvZiB0cmVlIG5vZGVzLCBieSBwcm92aWRpbmcgZnVydGhlclxyXG4gICAqIG1ldGFkYXRhIGxpa2UgcGFnZSBudW1iZXIsIHBhZ2UgY291bnQgYW5kIHRvdGFsIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIGNyZWF0ZSBub2RlcyBmcm9tLlxyXG4gICAqIEByZXR1cm5zIFBhZ2VkIG5vZGVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlUGFnZU5vZGVzKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPik6IEVbXSB7XHJcbiAgICByZXR1cm4gcGFnZS5pdGVtcy5tYXAoKG4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5uLFxyXG4gICAgICAgIGhhc0NoaWxkcmVuOiBuLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICAgICAgcGFnZUNvdW50OiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIHN0b3JlLiBXaGVuZXZlciB0aGUgZmlsdGVyIGlzIHNldCxcclxuICAgKiB0aGUgc3RvcmUgaXMgcmVzZXQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyJC52YWx1ZSA9PT0gZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIHN0b3JlLCBsb2FkaW5nIHRoZSByb290IG5vZGVzIGFuZCB0aGVpciBjaGlsZHJlbi5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRyZWUgd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuX2RpcnR5KSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2VydmljZVxyXG4gICAgICAgIC5nZXROb2RlcyhcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLl9wYWdlU2l6ZSxcclxuICAgICAgICAgIHRoaXMuX2hhc01vY2tSb290XHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9ub2RlcyQubmV4dCh0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuIG9mIGVhY2ggbm9kZSB0aHVzIGNhbGN1bGF0aW5nIHRoZWlyIGhhc0NoaWxkcmVuIHByb3BlcnR5XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuT2JzZXJ2YWJsZXMgPSB0aGlzLl9ub2RlcyQudmFsdWUubWFwKChub2RlKSA9PlxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKHsgLi4uZmlsdGVyLCBwYXJlbnRJZDogbm9kZS5pZCB9LCAxKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBmb3JrSm9pbihjaGlsZHJlbk9ic2VydmFibGVzKS5zdWJzY3JpYmUoKGNoaWxkcmVuUGFnZXMpID0+IHtcclxuICAgICAgICAgICAgICBjaGlsZHJlblBhZ2VzLmZvckVhY2goKHBhZ2UsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vZGVzJC52YWx1ZVtpXS5oYXNDaGlsZHJlbiA9IHBhZ2UudG90YWwgPiAwO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBub2RlIGZpbHRlciBmb3IgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBpZCBUaGUgbm9kZSBJRC5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIGZpbHRlciB3YXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVGaWx0ZXIoaWQ6IG51bWJlciwgZmlsdGVyPzogRiB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUhLmZpbHRlciA9IGZpbHRlciB8fCB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZVBhZ2UoaWQsIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGV4cGFuZGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8IG5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihub2RlKSwgcGFyZW50SWQ6IGlkIH0sXHJcbiAgICAgICAgMVxyXG4gICAgICApLnN1YnNjcmliZSgocGFnZSkgPT4ge1xyXG4gICAgICAgIC8vIG5vIGNoaWxkcmVuLCBzZXQgaGFzQ2hpbGRyZW4gdG8gZmFsc2VcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIG5vZGUhLmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IHBhZ2Ugbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGluZGV4ICsgMSwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG5vZGUhLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kQWxsKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyBnZXQgdGhlIHBhcmVudCBub2RlIHRvIHN0YXJ0IGZyb21cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuZmluZEluZGV4KChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb2xsZWN0IGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyBJRHNcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZXNUb0V4cGFuZCA9IG5vZGVzLnNsaWNlKG5vZGVJbmRleCwgaSkubWFwKChuKSA9PiBuLmlkKTtcclxuXHJcbiAgICAvLyBleHBhbmQgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBub2Rlc1RvRXhwYW5kLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBhbmQoaWQpO1xyXG4gICAgICAgIHRoaXMuZXhwYW5kQWxsKGlkKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbihpZDogbnVtYmVyKTogRVtdIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3QgaW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUpO1xyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZHJlbjogRVtdID0gW107XHJcbiAgICBsZXQgaSA9IGluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2RlLnkpIHtcclxuICAgICAgY2hpbGRyZW4ucHVzaChub2Rlc1tpXSk7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVzY2VuZGFudHMoXHJcbiAgICBub2RlczogUGFnZWRUcmVlTm9kZTxGPltdLFxyXG4gICAgbm9kZUluZGV4OiBudW1iZXJcclxuICApOiB2b2lkIHtcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgbm9kZXMuc3BsaWNlKG5vZGVJbmRleCArIDEsIGkgLSBub2RlSW5kZXggLSAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxhcHNlIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4gSWYgdGhlIG5vZGUgaXMgbm90IGV4cGFuZGFibGUsXHJcbiAgICogb3IgaXQgaXMgYWxyZWFkeSBjb2xsYXBzZWQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cclxuICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjb2xsYXBzZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgY29sbGFwc2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8ICFub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuaW5kZXhPZihub2RlISk7XHJcbiAgICAgIGlmIChub2RlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZURlc2NlbmRhbnRzKG5vZGVzLCBub2RlSW5kZXgpO1xyXG4gICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICBub2RlIS5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBwYWdlIGluY2x1ZGluZyB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIHBhcmVudCBub2RlIHdob3NlIGNoaWxkcmVuIGFyZSBpbnNpZGUgdGhlIHBhZ2UgeW91IHdhbnQgdG8gY2hhbmdlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBuZXcgcGFnZSBudW1iZXIuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIHBhZ2Ugd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZShwYXJlbnRJZDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gcGFyZW50SWQpO1xyXG4gICAgICBpZiAoIXBhcmVudE5vZGUpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgICAgICB7IC4uLnRoaXMuZ2V0RmlsdGVyKHBhcmVudE5vZGUpLCBwYXJlbnRJZCB9LFxyXG4gICAgICAgIHBhZ2VOdW1iZXJcclxuICAgICAgKS5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICAvLyBpZiBwYWdlIGlzIGVtcHR5IGRvIG5vdGhpbmdcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHRoZSBub2RlcyBpbiB0aGUgc2FtZSBwYWdlIG9mIG5vZGVcclxuICAgICAgICAgIC8vIHdpdGggYWxsIHRoZWlyIGRlc2NlbmRhbnRzXHJcbiAgICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmluZGV4T2YocGFyZW50Tm9kZSEpICsgMTtcclxuICAgICAgICAgIGNvbnN0IHBhZ2VOb2RlcyA9IHRoaXMuY3JlYXRlUGFnZU5vZGVzKHBhZ2UpO1xyXG4gICAgICAgICAgLy8gZmluZCB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgbm9kZSdzIHBhZ2VcclxuICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVJbmRleDtcclxuICAgICAgICAgIGNvbnN0IG9sZFBhZ2VOciA9IG5vZGVzW3N0YXJ0XS5wYWdpbmcucGFnZU51bWJlcjtcclxuICAgICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgc3RhcnQgPiAwICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFyZW50SWQgPT09IHBhcmVudElkICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFnaW5nLnBhZ2VOdW1iZXIgPT09IG9sZFBhZ2VOclxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0LS07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlLFxyXG4gICAgICAgICAgLy8gaW5jbHVkaW5nIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgbGV0IGVuZCA9IG5vZGVJbmRleCArIDE7XHJcbiAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgIGVuZCA8IG5vZGVzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhcmVudElkID09PSBwYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhZ2luZy5wYWdlTnVtYmVyID09PSBvbGRQYWdlTnJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIHRoZXNlIG5vZGVzIHdpdGggdGhlIG5ldyBvbmVzXHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcclxuICAgICAgICAgIG5vZGVzLnNwbGljZShzdGFydCwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcGFyZW50IG5vZGUgcGFnaW5nIGluZm9cclxuICAgICAgICAgIHBhcmVudE5vZGUhLnBhZ2luZy5wYWdlTnVtYmVyID0gcGFnZS5wYWdlTnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSBhbGwgdGhlIG5vZGVzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2VBbGwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gY29sbGFwc2UgdGhlIGZpcnN0IG5vZGVcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9ub2RlcyQudmFsdWVbMF07XHJcbiAgICB0aGlzLmNvbGxhcHNlKHJvb3QuaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlciBhbmQgZmlsdGVyIGlzIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFnZSBpcyBpbiBjYWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNDYWNoZWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KTtcclxuICB9XHJcbn1cclxuIl19