@smartbit4all/ng-client 1.2.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/esm2020/lib/smart-client/smart-component-api-client.mjs +2 -2
  2. package/esm2020/lib/smart-ng-client.module.mjs +15 -4
  3. package/esm2020/lib/smart-tree/projects.mjs +9 -0
  4. package/esm2020/lib/smart-tree/smarttree-generic.service.mjs +292 -0
  5. package/esm2020/lib/smart-tree/smarttree.component.mjs +181 -0
  6. package/esm2020/lib/smart-tree/smarttree.model.mjs +7 -0
  7. package/esm2020/lib/smart-tree/smarttree.module.mjs +54 -0
  8. package/esm2020/lib/smart-tree/smarttree.node.model.mjs +6 -0
  9. package/esm2020/lib/smart-tree/smarttree.service.interface.mjs +2 -0
  10. package/esm2020/lib/smart-tree/smarttree.service.mjs +47 -0
  11. package/esm2020/lib/smart-tree/tree-api/api/tree.service.mjs +644 -0
  12. package/esm2020/lib/smart-tree/tree-api/configuration.mjs +91 -0
  13. package/esm2020/lib/smart-tree/tree-api/encoder.mjs +19 -0
  14. package/esm2020/lib/smart-tree/tree-api/param.mjs +2 -0
  15. package/esm2020/lib/smart-tree/tree-api/variables.mjs +9 -0
  16. package/esm2020/projects.mjs +2 -1
  17. package/fesm2015/smartbit4all-ng-client.mjs +1421 -70
  18. package/fesm2015/smartbit4all-ng-client.mjs.map +1 -1
  19. package/fesm2020/smartbit4all-ng-client.mjs +1383 -70
  20. package/fesm2020/smartbit4all-ng-client.mjs.map +1 -1
  21. package/lib/smart-client/smart-component-api-client.d.ts +1 -1
  22. package/lib/smart-ng-client.module.d.ts +2 -1
  23. package/lib/smart-tree/projects.d.ts +5 -0
  24. package/lib/smart-tree/smarttree-generic.service.d.ts +50 -0
  25. package/lib/smart-tree/smarttree.component.d.ts +42 -0
  26. package/lib/smart-tree/smarttree.model.d.ts +41 -0
  27. package/lib/smart-tree/smarttree.module.d.ts +15 -0
  28. package/lib/smart-tree/smarttree.node.model.d.ts +13 -0
  29. package/lib/smart-tree/smarttree.service.d.ts +24 -0
  30. package/lib/smart-tree/smarttree.service.interface.d.ts +43 -0
  31. package/lib/smart-tree/tree-api/api/tree.service.d.ts +177 -0
  32. package/lib/smart-tree/tree-api/configuration.d.ts +104 -0
  33. package/lib/smart-tree/tree-api/encoder.d.ts +11 -0
  34. package/lib/smart-tree/tree-api/param.d.ts +37 -0
  35. package/lib/smart-tree/tree-api/variables.d.ts +8 -0
  36. package/package.json +1 -1
  37. package/projects.d.ts +1 -0
  38. package/smartbit4all-ng-client-2.0.1.tgz +0 -0
  39. package/src/lib/smart-tree/tree-api/README.md +226 -0
  40. package/smartbit4all-ng-client-1.2.1.tgz +0 -0
@@ -0,0 +1,644 @@
1
+ /**
2
+ * UiTree domain objects
3
+ * Tree domain objects
4
+ *
5
+ * The version of the OpenAPI document: 1.0.0
6
+ * Contact: info@it4all.hu
7
+ *
8
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9
+ * https://openapi-generator.tech
10
+ * Do not edit the class manually.
11
+ */
12
+ /* tslint:disable:no-unused-variable member-ordering */
13
+ import { Inject, Injectable, Optional } from '@angular/core';
14
+ import { HttpHeaders, HttpContext, } from '@angular/common/http';
15
+ import { CustomHttpParameterCodec } from '../encoder';
16
+ // @ts-ignore
17
+ // @ts-ignore
18
+ import { BASE_PATH } from '../variables';
19
+ import { Configuration } from '../configuration';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@angular/common/http";
22
+ import * as i2 from "../configuration";
23
+ export class TreeService {
24
+ constructor(httpClient, basePath, configuration) {
25
+ this.httpClient = httpClient;
26
+ this.basePath = 'http://localhost';
27
+ this.defaultHeaders = new HttpHeaders();
28
+ this.configuration = new Configuration();
29
+ if (configuration) {
30
+ this.configuration = configuration;
31
+ }
32
+ if (typeof this.configuration.basePath !== 'string') {
33
+ if (Array.isArray(basePath) && basePath.length > 0) {
34
+ basePath = basePath[0];
35
+ }
36
+ if (typeof basePath !== 'string') {
37
+ basePath = this.basePath;
38
+ }
39
+ this.configuration.basePath = basePath;
40
+ }
41
+ this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
42
+ }
43
+ // @ts-ignore
44
+ addToHttpParams(httpParams, value, key) {
45
+ if (typeof value === 'object' && value instanceof Date === false) {
46
+ httpParams = this.addToHttpParamsRecursive(httpParams, value);
47
+ }
48
+ else {
49
+ httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
50
+ }
51
+ return httpParams;
52
+ }
53
+ addToHttpParamsRecursive(httpParams, value, key) {
54
+ if (value == null) {
55
+ return httpParams;
56
+ }
57
+ if (typeof value === 'object') {
58
+ if (Array.isArray(value)) {
59
+ value.forEach((elem) => (httpParams = this.addToHttpParamsRecursive(httpParams, elem, key)));
60
+ }
61
+ else if (value instanceof Date) {
62
+ if (key != null) {
63
+ httpParams = httpParams.append(key, value.toISOString().substr(0, 10));
64
+ }
65
+ else {
66
+ throw Error('key may not be null if value is Date');
67
+ }
68
+ }
69
+ else {
70
+ Object.keys(value).forEach((k) => (httpParams = this.addToHttpParamsRecursive(httpParams, value[k], key != null ? `${key}.${k}` : k)));
71
+ }
72
+ }
73
+ else if (key != null) {
74
+ httpParams = httpParams.append(key, value);
75
+ }
76
+ else {
77
+ throw Error('key may not be null if value is not object or array');
78
+ }
79
+ return httpParams;
80
+ }
81
+ collapseNode(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
82
+ if (viewUuid === null || viewUuid === undefined) {
83
+ throw new Error('Required parameter viewUuid was null or undefined when calling collapseNode.');
84
+ }
85
+ if (treeId === null || treeId === undefined) {
86
+ throw new Error('Required parameter treeId was null or undefined when calling collapseNode.');
87
+ }
88
+ if (nodeId === null || nodeId === undefined) {
89
+ throw new Error('Required parameter nodeId was null or undefined when calling collapseNode.');
90
+ }
91
+ let localVarHeaders = this.defaultHeaders;
92
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
93
+ if (localVarHttpHeaderAcceptSelected === undefined) {
94
+ // to determine the Accept header
95
+ const httpHeaderAccepts = ['application/json'];
96
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
97
+ }
98
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
99
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
100
+ }
101
+ let localVarHttpContext = options && options.context;
102
+ if (localVarHttpContext === undefined) {
103
+ localVarHttpContext = new HttpContext();
104
+ }
105
+ let responseType_ = 'json';
106
+ if (localVarHttpHeaderAcceptSelected) {
107
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
108
+ responseType_ = 'text';
109
+ }
110
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
111
+ responseType_ = 'json';
112
+ }
113
+ else {
114
+ responseType_ = 'blob';
115
+ }
116
+ }
117
+ let localVarPath = `/tree/${this.configuration.encodeParam({
118
+ name: 'viewUuid',
119
+ value: viewUuid,
120
+ in: 'path',
121
+ style: 'simple',
122
+ explode: false,
123
+ dataType: 'string',
124
+ dataFormat: 'uuid',
125
+ })}/${this.configuration.encodeParam({
126
+ name: 'treeId',
127
+ value: treeId,
128
+ in: 'path',
129
+ style: 'simple',
130
+ explode: false,
131
+ dataType: 'string',
132
+ dataFormat: undefined,
133
+ })}/${this.configuration.encodeParam({
134
+ name: 'nodeId',
135
+ value: nodeId,
136
+ in: 'path',
137
+ style: 'simple',
138
+ explode: false,
139
+ dataType: 'string',
140
+ dataFormat: undefined,
141
+ })}/collapse`;
142
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
143
+ context: localVarHttpContext,
144
+ responseType: responseType_,
145
+ withCredentials: this.configuration.withCredentials,
146
+ headers: localVarHeaders,
147
+ observe: observe,
148
+ reportProgress: reportProgress,
149
+ });
150
+ }
151
+ expandNode(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
152
+ if (viewUuid === null || viewUuid === undefined) {
153
+ throw new Error('Required parameter viewUuid was null or undefined when calling expandNode.');
154
+ }
155
+ if (treeId === null || treeId === undefined) {
156
+ throw new Error('Required parameter treeId was null or undefined when calling expandNode.');
157
+ }
158
+ if (nodeId === null || nodeId === undefined) {
159
+ throw new Error('Required parameter nodeId was null or undefined when calling expandNode.');
160
+ }
161
+ let localVarHeaders = this.defaultHeaders;
162
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
163
+ if (localVarHttpHeaderAcceptSelected === undefined) {
164
+ // to determine the Accept header
165
+ const httpHeaderAccepts = ['application/json'];
166
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
167
+ }
168
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
169
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
170
+ }
171
+ let localVarHttpContext = options && options.context;
172
+ if (localVarHttpContext === undefined) {
173
+ localVarHttpContext = new HttpContext();
174
+ }
175
+ let responseType_ = 'json';
176
+ if (localVarHttpHeaderAcceptSelected) {
177
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
178
+ responseType_ = 'text';
179
+ }
180
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
181
+ responseType_ = 'json';
182
+ }
183
+ else {
184
+ responseType_ = 'blob';
185
+ }
186
+ }
187
+ let localVarPath = `/tree/${this.configuration.encodeParam({
188
+ name: 'viewUuid',
189
+ value: viewUuid,
190
+ in: 'path',
191
+ style: 'simple',
192
+ explode: false,
193
+ dataType: 'string',
194
+ dataFormat: 'uuid',
195
+ })}/${this.configuration.encodeParam({
196
+ name: 'treeId',
197
+ value: treeId,
198
+ in: 'path',
199
+ style: 'simple',
200
+ explode: false,
201
+ dataType: 'string',
202
+ dataFormat: undefined,
203
+ })}/${this.configuration.encodeParam({
204
+ name: 'nodeId',
205
+ value: nodeId,
206
+ in: 'path',
207
+ style: 'simple',
208
+ explode: false,
209
+ dataType: 'string',
210
+ dataFormat: undefined,
211
+ })}/expand`;
212
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
213
+ context: localVarHttpContext,
214
+ responseType: responseType_,
215
+ withCredentials: this.configuration.withCredentials,
216
+ headers: localVarHeaders,
217
+ observe: observe,
218
+ reportProgress: reportProgress,
219
+ });
220
+ }
221
+ getChildrenNodes(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
222
+ if (viewUuid === null || viewUuid === undefined) {
223
+ throw new Error('Required parameter viewUuid was null or undefined when calling getChildrenNodes.');
224
+ }
225
+ if (treeId === null || treeId === undefined) {
226
+ throw new Error('Required parameter treeId was null or undefined when calling getChildrenNodes.');
227
+ }
228
+ if (nodeId === null || nodeId === undefined) {
229
+ throw new Error('Required parameter nodeId was null or undefined when calling getChildrenNodes.');
230
+ }
231
+ let localVarHeaders = this.defaultHeaders;
232
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
233
+ if (localVarHttpHeaderAcceptSelected === undefined) {
234
+ // to determine the Accept header
235
+ const httpHeaderAccepts = ['application/json'];
236
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
237
+ }
238
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
239
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
240
+ }
241
+ let localVarHttpContext = options && options.context;
242
+ if (localVarHttpContext === undefined) {
243
+ localVarHttpContext = new HttpContext();
244
+ }
245
+ let responseType_ = 'json';
246
+ if (localVarHttpHeaderAcceptSelected) {
247
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
248
+ responseType_ = 'text';
249
+ }
250
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
251
+ responseType_ = 'json';
252
+ }
253
+ else {
254
+ responseType_ = 'blob';
255
+ }
256
+ }
257
+ let localVarPath = `/tree/${this.configuration.encodeParam({
258
+ name: 'viewUuid',
259
+ value: viewUuid,
260
+ in: 'path',
261
+ style: 'simple',
262
+ explode: false,
263
+ dataType: 'string',
264
+ dataFormat: 'uuid',
265
+ })}/${this.configuration.encodeParam({
266
+ name: 'treeId',
267
+ value: treeId,
268
+ in: 'path',
269
+ style: 'simple',
270
+ explode: false,
271
+ dataType: 'string',
272
+ dataFormat: undefined,
273
+ })}/${this.configuration.encodeParam({
274
+ name: 'nodeId',
275
+ value: nodeId,
276
+ in: 'path',
277
+ style: 'simple',
278
+ explode: false,
279
+ dataType: 'string',
280
+ dataFormat: undefined,
281
+ })}`;
282
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
283
+ context: localVarHttpContext,
284
+ responseType: responseType_,
285
+ withCredentials: this.configuration.withCredentials,
286
+ headers: localVarHeaders,
287
+ observe: observe,
288
+ reportProgress: reportProgress,
289
+ });
290
+ }
291
+ getMainActions(viewUuid, treeId, observe = 'body', reportProgress = false, options) {
292
+ if (viewUuid === null || viewUuid === undefined) {
293
+ throw new Error('Required parameter viewUuid was null or undefined when calling getMainActions.');
294
+ }
295
+ if (treeId === null || treeId === undefined) {
296
+ throw new Error('Required parameter treeId was null or undefined when calling getMainActions.');
297
+ }
298
+ let localVarHeaders = this.defaultHeaders;
299
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
300
+ if (localVarHttpHeaderAcceptSelected === undefined) {
301
+ // to determine the Accept header
302
+ const httpHeaderAccepts = ['application/json'];
303
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
304
+ }
305
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
306
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
307
+ }
308
+ let localVarHttpContext = options && options.context;
309
+ if (localVarHttpContext === undefined) {
310
+ localVarHttpContext = new HttpContext();
311
+ }
312
+ let responseType_ = 'json';
313
+ if (localVarHttpHeaderAcceptSelected) {
314
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
315
+ responseType_ = 'text';
316
+ }
317
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
318
+ responseType_ = 'json';
319
+ }
320
+ else {
321
+ responseType_ = 'blob';
322
+ }
323
+ }
324
+ let localVarPath = `/tree/${this.configuration.encodeParam({
325
+ name: 'viewUuid',
326
+ value: viewUuid,
327
+ in: 'path',
328
+ style: 'simple',
329
+ explode: false,
330
+ dataType: 'string',
331
+ dataFormat: 'uuid',
332
+ })}/${this.configuration.encodeParam({
333
+ name: 'treeId',
334
+ value: treeId,
335
+ in: 'path',
336
+ style: 'simple',
337
+ explode: false,
338
+ dataType: 'string',
339
+ dataFormat: undefined,
340
+ })}/action`;
341
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
342
+ context: localVarHttpContext,
343
+ responseType: responseType_,
344
+ withCredentials: this.configuration.withCredentials,
345
+ headers: localVarHeaders,
346
+ observe: observe,
347
+ reportProgress: reportProgress,
348
+ });
349
+ }
350
+ getRootNodes(viewUuid, treeId, observe = 'body', reportProgress = false, options) {
351
+ if (viewUuid === null || viewUuid === undefined) {
352
+ throw new Error('Required parameter viewUuid was null or undefined when calling getRootNodes.');
353
+ }
354
+ if (treeId === null || treeId === undefined) {
355
+ throw new Error('Required parameter treeId was null or undefined when calling getRootNodes.');
356
+ }
357
+ let localVarHeaders = this.defaultHeaders;
358
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
359
+ if (localVarHttpHeaderAcceptSelected === undefined) {
360
+ // to determine the Accept header
361
+ const httpHeaderAccepts = ['application/json'];
362
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
363
+ }
364
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
365
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
366
+ }
367
+ let localVarHttpContext = options && options.context;
368
+ if (localVarHttpContext === undefined) {
369
+ localVarHttpContext = new HttpContext();
370
+ }
371
+ let responseType_ = 'json';
372
+ if (localVarHttpHeaderAcceptSelected) {
373
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
374
+ responseType_ = 'text';
375
+ }
376
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
377
+ responseType_ = 'json';
378
+ }
379
+ else {
380
+ responseType_ = 'blob';
381
+ }
382
+ }
383
+ let localVarPath = `/tree/${this.configuration.encodeParam({
384
+ name: 'viewUuid',
385
+ value: viewUuid,
386
+ in: 'path',
387
+ style: 'simple',
388
+ explode: false,
389
+ dataType: 'string',
390
+ dataFormat: 'uuid',
391
+ })}/${this.configuration.encodeParam({
392
+ name: 'treeId',
393
+ value: treeId,
394
+ in: 'path',
395
+ style: 'simple',
396
+ explode: false,
397
+ dataType: 'string',
398
+ dataFormat: undefined,
399
+ })}`;
400
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
401
+ context: localVarHttpContext,
402
+ responseType: responseType_,
403
+ withCredentials: this.configuration.withCredentials,
404
+ headers: localVarHeaders,
405
+ observe: observe,
406
+ reportProgress: reportProgress,
407
+ });
408
+ }
409
+ performAction(viewUuid, treeId, nodeId, body, observe = 'body', reportProgress = false, options) {
410
+ if (viewUuid === null || viewUuid === undefined) {
411
+ throw new Error('Required parameter viewUuid was null or undefined when calling performAction.');
412
+ }
413
+ if (treeId === null || treeId === undefined) {
414
+ throw new Error('Required parameter treeId was null or undefined when calling performAction.');
415
+ }
416
+ if (nodeId === null || nodeId === undefined) {
417
+ throw new Error('Required parameter nodeId was null or undefined when calling performAction.');
418
+ }
419
+ if (body === null || body === undefined) {
420
+ throw new Error('Required parameter body was null or undefined when calling performAction.');
421
+ }
422
+ let localVarHeaders = this.defaultHeaders;
423
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
424
+ if (localVarHttpHeaderAcceptSelected === undefined) {
425
+ // to determine the Accept header
426
+ const httpHeaderAccepts = ['application/json'];
427
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
428
+ }
429
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
430
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
431
+ }
432
+ let localVarHttpContext = options && options.context;
433
+ if (localVarHttpContext === undefined) {
434
+ localVarHttpContext = new HttpContext();
435
+ }
436
+ // to determine the Content-Type header
437
+ const consumes = ['application/json'];
438
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
439
+ if (httpContentTypeSelected !== undefined) {
440
+ localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
441
+ }
442
+ let responseType_ = 'json';
443
+ if (localVarHttpHeaderAcceptSelected) {
444
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
445
+ responseType_ = 'text';
446
+ }
447
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
448
+ responseType_ = 'json';
449
+ }
450
+ else {
451
+ responseType_ = 'blob';
452
+ }
453
+ }
454
+ let localVarPath = `/tree/${this.configuration.encodeParam({
455
+ name: 'viewUuid',
456
+ value: viewUuid,
457
+ in: 'path',
458
+ style: 'simple',
459
+ explode: false,
460
+ dataType: 'string',
461
+ dataFormat: 'uuid',
462
+ })}/${this.configuration.encodeParam({
463
+ name: 'treeId',
464
+ value: treeId,
465
+ in: 'path',
466
+ style: 'simple',
467
+ explode: false,
468
+ dataType: 'string',
469
+ dataFormat: undefined,
470
+ })}/${this.configuration.encodeParam({
471
+ name: 'nodeId',
472
+ value: nodeId,
473
+ in: 'path',
474
+ style: 'simple',
475
+ explode: false,
476
+ dataType: 'string',
477
+ dataFormat: undefined,
478
+ })}/action`;
479
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
480
+ context: localVarHttpContext,
481
+ body: body,
482
+ responseType: responseType_,
483
+ withCredentials: this.configuration.withCredentials,
484
+ headers: localVarHeaders,
485
+ observe: observe,
486
+ reportProgress: reportProgress,
487
+ });
488
+ }
489
+ performMainAction(viewUuid, treeId, body, observe = 'body', reportProgress = false, options) {
490
+ if (viewUuid === null || viewUuid === undefined) {
491
+ throw new Error('Required parameter viewUuid was null or undefined when calling performMainAction.');
492
+ }
493
+ if (treeId === null || treeId === undefined) {
494
+ throw new Error('Required parameter treeId was null or undefined when calling performMainAction.');
495
+ }
496
+ if (body === null || body === undefined) {
497
+ throw new Error('Required parameter body was null or undefined when calling performMainAction.');
498
+ }
499
+ let localVarHeaders = this.defaultHeaders;
500
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
501
+ if (localVarHttpHeaderAcceptSelected === undefined) {
502
+ // to determine the Accept header
503
+ const httpHeaderAccepts = ['application/json'];
504
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
505
+ }
506
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
507
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
508
+ }
509
+ let localVarHttpContext = options && options.context;
510
+ if (localVarHttpContext === undefined) {
511
+ localVarHttpContext = new HttpContext();
512
+ }
513
+ // to determine the Content-Type header
514
+ const consumes = ['application/json'];
515
+ const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
516
+ if (httpContentTypeSelected !== undefined) {
517
+ localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
518
+ }
519
+ let responseType_ = 'json';
520
+ if (localVarHttpHeaderAcceptSelected) {
521
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
522
+ responseType_ = 'text';
523
+ }
524
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
525
+ responseType_ = 'json';
526
+ }
527
+ else {
528
+ responseType_ = 'blob';
529
+ }
530
+ }
531
+ let localVarPath = `/tree/${this.configuration.encodeParam({
532
+ name: 'viewUuid',
533
+ value: viewUuid,
534
+ in: 'path',
535
+ style: 'simple',
536
+ explode: false,
537
+ dataType: 'string',
538
+ dataFormat: 'uuid',
539
+ })}/${this.configuration.encodeParam({
540
+ name: 'treeId',
541
+ value: treeId,
542
+ in: 'path',
543
+ style: 'simple',
544
+ explode: false,
545
+ dataType: 'string',
546
+ dataFormat: undefined,
547
+ })}/action`;
548
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
549
+ context: localVarHttpContext,
550
+ body: body,
551
+ responseType: responseType_,
552
+ withCredentials: this.configuration.withCredentials,
553
+ headers: localVarHeaders,
554
+ observe: observe,
555
+ reportProgress: reportProgress,
556
+ });
557
+ }
558
+ selectNode(viewUuid, treeId, nodeId, observe = 'body', reportProgress = false, options) {
559
+ if (viewUuid === null || viewUuid === undefined) {
560
+ throw new Error('Required parameter viewUuid was null or undefined when calling selectNode.');
561
+ }
562
+ if (treeId === null || treeId === undefined) {
563
+ throw new Error('Required parameter treeId was null or undefined when calling selectNode.');
564
+ }
565
+ if (nodeId === null || nodeId === undefined) {
566
+ throw new Error('Required parameter nodeId was null or undefined when calling selectNode.');
567
+ }
568
+ let localVarHeaders = this.defaultHeaders;
569
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
570
+ if (localVarHttpHeaderAcceptSelected === undefined) {
571
+ // to determine the Accept header
572
+ const httpHeaderAccepts = ['application/json'];
573
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
574
+ }
575
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
576
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
577
+ }
578
+ let localVarHttpContext = options && options.context;
579
+ if (localVarHttpContext === undefined) {
580
+ localVarHttpContext = new HttpContext();
581
+ }
582
+ let responseType_ = 'json';
583
+ if (localVarHttpHeaderAcceptSelected) {
584
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
585
+ responseType_ = 'text';
586
+ }
587
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
588
+ responseType_ = 'json';
589
+ }
590
+ else {
591
+ responseType_ = 'blob';
592
+ }
593
+ }
594
+ let localVarPath = `/tree/${this.configuration.encodeParam({
595
+ name: 'viewUuid',
596
+ value: viewUuid,
597
+ in: 'path',
598
+ style: 'simple',
599
+ explode: false,
600
+ dataType: 'string',
601
+ dataFormat: 'uuid',
602
+ })}/${this.configuration.encodeParam({
603
+ name: 'treeId',
604
+ value: treeId,
605
+ in: 'path',
606
+ style: 'simple',
607
+ explode: false,
608
+ dataType: 'string',
609
+ dataFormat: undefined,
610
+ })}/${this.configuration.encodeParam({
611
+ name: 'nodeId',
612
+ value: nodeId,
613
+ in: 'path',
614
+ style: 'simple',
615
+ explode: false,
616
+ dataType: 'string',
617
+ dataFormat: undefined,
618
+ })}/select`;
619
+ return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
620
+ context: localVarHttpContext,
621
+ responseType: responseType_,
622
+ withCredentials: this.configuration.withCredentials,
623
+ headers: localVarHeaders,
624
+ observe: observe,
625
+ reportProgress: reportProgress,
626
+ });
627
+ }
628
+ }
629
+ TreeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TreeService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
630
+ TreeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TreeService, providedIn: 'root' });
631
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TreeService, decorators: [{
632
+ type: Injectable,
633
+ args: [{
634
+ providedIn: 'root',
635
+ }]
636
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
637
+ type: Optional
638
+ }, {
639
+ type: Inject,
640
+ args: [BASE_PATH]
641
+ }] }, { type: i2.Configuration, decorators: [{
642
+ type: Optional
643
+ }] }]; } });
644
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtdHJlZS90cmVlLWFwaS9hcGkvdHJlZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFFTCxXQUFXLEVBS1gsV0FBVyxHQUNaLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTXRELGFBQWE7QUFFYixhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBTSxjQUFjLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBTWpELE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQ1ksVUFBc0IsRUFDRCxRQUEyQixFQUM5QyxhQUE0QjtRQUY5QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBTnhCLGFBQVEsR0FBRyxrQkFBa0IsQ0FBQztRQUNqQyxtQkFBYyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBUXpDLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2xELFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFD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RUFBRSxFQUFFLE1BQU07WUFDVixLQUFLLEVBQUUsUUFBUTtZQUNmLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLFFBQVE7WUFDbEIsVUFBVSxFQUFFLFNBQVM7U0FDdEIsQ0FBQyxTQUFTLENBQUM7UUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUM1QixNQUFNLEVBQ04sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxZQUFZLEVBQUUsRUFDL0M7WUFDRSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDL0IsQ0FDRixDQUFDO0lBQ0osQ0FBQzs7d0dBei9CVSxXQUFXLDRDQVFBLFNBQVM7NEdBUnBCLFdBQVcsY0FGVixNQUFNOzJGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFTSSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFNBQVM7OzBCQUM1QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFVpVHJlZSBkb21haW4gb2JqZWN0c1xyXG4gKiBUcmVlIGRvbWFpbiBvYmplY3RzXHJcbiAqXHJcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAxLjAuMFxyXG4gKiBDb250YWN0OiBpbmZvQGl0NGFsbC5odVxyXG4gKlxyXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxyXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcclxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxyXG4gKi9cclxuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEh0dHBDbGllbnQsXHJcbiAgSHR0cEhlYWRlcnMsXHJcbiAgSHR0cFBhcmFtcyxcclxuICBIdHRwUmVzcG9uc2UsXHJcbiAgSHR0cEV2ZW50LFxyXG4gIEh0dHBQYXJhbWV0ZXJDb2RlYyxcclxuICBIdHRwQ29udGV4dCxcclxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYyB9IGZyb20gJy4uL2VuY29kZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vLyBAdHMtaWdub3JlXHJcbi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0IHsgVWlBY3Rpb24sIFVpQWN0aW9uUmVxdWVzdCB9IGZyb20gJy4uL3ZpZXctY29udGV4dC9wcm9qZWN0cyc7XHJcbi8vIEB0cy1pZ25vcmVcclxuXHJcbi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSBmcm9tICcuLi92YXJpYWJsZXMnO1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IFNtYXJ0VHJlZU5vZGUgfSBmcm9tICcuLi8uLi9zbWFydHRyZWUubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRyZWVTZXJ2aWNlIHtcclxuICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cDovL2xvY2FsaG9zdCc7XHJcbiAgcHVibGljIGRlZmF1bHRIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgcHVibGljIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xyXG4gIHB1YmxpYyBlbmNvZGVyOiBIdHRwUGFyYW1ldGVyQ29kZWM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEJBU0VfUEFUSCkgYmFzZVBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLFxyXG4gICAgQE9wdGlvbmFsKCkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvblxyXG4gICkge1xyXG4gICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShiYXNlUGF0aCkgJiYgYmFzZVBhdGgubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGJhc2VQYXRoID0gYmFzZVBhdGhbMF07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgYmFzZVBhdGggIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCA9IGJhc2VQYXRoO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbmNvZGVyID0gdGhpcy5jb25maWd1cmF0aW9uLmVuY29kZXIgfHwgbmV3IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYygpO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlOiBhbnksIGtleT86IHN0cmluZyk6IEh0dHBQYXJhbXMge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBEYXRlID09PSBmYWxzZSkge1xyXG4gICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGh0dHBQYXJhbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZT86IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XHJcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gaHR0cFBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAodmFsdWUgYXMgYW55W10pLmZvckVhY2goXHJcbiAgICAgICAgICAoZWxlbSkgPT4gKGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCAodmFsdWUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHIoMCwgMTApKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ2tleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgRGF0ZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChcclxuICAgICAgICAgIChrKSA9PlxyXG4gICAgICAgICAgICAoaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKFxyXG4gICAgICAgICAgICAgIGh0dHBQYXJhbXMsXHJcbiAgICAgICAgICAgICAgdmFsdWVba10sXHJcbiAgICAgICAgICAgICAga2V5ICE9IG51bGwgPyBgJHtrZXl9LiR7a31gIDoga1xyXG4gICAgICAgICAgICApKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcclxuICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ2tleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgbm90IG9iamVjdCBvciBhcnJheScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGh0dHBQYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZXMgdGhlIGdpdmVuIHRyZWVub2RlLiBUaGUgdmlld2NvbnRleHQgd2lsbCBob2xkIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiAgZm9yIHRoZSB1aS4gUmV0dXJucyB0aGUgY29sbGFwc2VkIFNtYXJ0VHJlZU5vZGUuXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBub2RlSWRcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2VOb2RlKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPFNtYXJ0VHJlZU5vZGU+O1xyXG4gIHB1YmxpYyBjb2xsYXBzZU5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIGNvbGxhcHNlTm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIGNvbGxhcHNlTm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh2aWV3VXVpZCA9PT0gbnVsbCB8fCB2aWV3VXVpZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHZpZXdVdWlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY29sbGFwc2VOb2RlLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0cmVlSWQgPT09IG51bGwgfHwgdHJlZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdHJlZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY29sbGFwc2VOb2RlLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5vZGVJZCA9PT0gbnVsbCB8fCBub2RlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBub2RlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjb2xsYXBzZU5vZGUuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAnbm9kZUlkJyxcclxuICAgICAgdmFsdWU6IG5vZGVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vY29sbGFwc2VgO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFNtYXJ0VHJlZU5vZGU+KFxyXG4gICAgICAncG9zdCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxyXG4gICAgICAgIG9ic2VydmU6IG9ic2VydmUsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwYW5kcyB0aGUgZ2l2ZW4gdHJlZW5vZGUuIFRoZSB2aWV3Y29udGV4dCB3aWxsIGhvbGQgdGhlIGFwcHJvcHJpYXRlIGluc3RydWN0aW9uICBmb3IgdGhlIHVpLCBpZiBhbnkuIFJldHVybnMgdGhlIGV4cGFuZGVkIFNtYXJ0VHJlZU5vZGUuXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBub2RlSWRcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kTm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxTbWFydFRyZWVOb2RlPjtcclxuICBwdWJsaWMgZXhwYW5kTm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdyZXNwb25zZScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFNtYXJ0VHJlZU5vZGU+PjtcclxuICBwdWJsaWMgZXhwYW5kTm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIGV4cGFuZE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGV4cGFuZE5vZGUuJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGV4cGFuZE5vZGUuJyk7XHJcbiAgICB9XHJcbiAgICBpZiAobm9kZUlkID09PSBudWxsIHx8IG5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIG5vZGVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGV4cGFuZE5vZGUuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAnbm9kZUlkJyxcclxuICAgICAgdmFsdWU6IG5vZGVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vZXhwYW5kYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxTbWFydFRyZWVOb2RlPihcclxuICAgICAgJ3Bvc3QnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5IHRoZSBjaGlsZCBub2RlcyBvZiB0aGUgdHJlZVxcJiMzOTtzIG5vZGUgZ2l2ZW4gaW4gdGhlIHBhcmFtZXRlclxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldENoaWxkcmVuTm9kZXMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8QXJyYXk8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbk5vZGVzKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXk8U21hcnRUcmVlTm9kZT4+PjtcclxuICBwdWJsaWMgZ2V0Q2hpbGRyZW5Ob2RlcyhcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheTxTbWFydFRyZWVOb2RlPj4+O1xyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbk5vZGVzKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRDaGlsZHJlbk5vZGVzLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0cmVlSWQgPT09IG51bGwgfHwgdHJlZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdHJlZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0Q2hpbGRyZW5Ob2Rlcy4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAobm9kZUlkID09PSBudWxsIHx8IG5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIG5vZGVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldENoaWxkcmVuTm9kZXMuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xyXG5cclxuICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcclxuICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ25vZGVJZCcsXHJcbiAgICAgIHZhbHVlOiBub2RlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcnJheTxTbWFydFRyZWVOb2RlPj4oXHJcbiAgICAgICdnZXQnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1ZXJ5IGFsbCB0cmVlIG5vZGVzLlxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0TWFpbkFjdGlvbnMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEFycmF5PFVpQWN0aW9uPj47XHJcbiAgcHVibGljIGdldE1haW5BY3Rpb25zKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdyZXNwb25zZScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFycmF5PFVpQWN0aW9uPj4+O1xyXG4gIHB1YmxpYyBnZXRNYWluQWN0aW9ucyhcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnZXZlbnRzJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXJyYXk8VWlBY3Rpb24+Pj47XHJcbiAgcHVibGljIGdldE1haW5BY3Rpb25zKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh2aWV3VXVpZCA9PT0gbnVsbCB8fCB2aWV3VXVpZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIHZpZXdVdWlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0TWFpbkFjdGlvbnMuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRNYWluQWN0aW9ucy4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vYWN0aW9uYDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcnJheTxVaUFjdGlvbj4+KFxyXG4gICAgICAnZ2V0JyxcclxuICAgICAgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXHJcbiAgICAgIHtcclxuICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBRdWVyeSBhbGwgdHJlZSBub2Rlcy5cclxuICAgKiBAcGFyYW0gdmlld1V1aWRcclxuICAgKiBAcGFyYW0gdHJlZUlkXHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFJvb3ROb2RlcyhcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU/OiAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8QXJyYXk8U21hcnRUcmVlTm9kZT4+O1xyXG4gIHB1YmxpYyBnZXRSb290Tm9kZXMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXk8U21hcnRUcmVlTm9kZT4+PjtcclxuICBwdWJsaWMgZ2V0Um9vdE5vZGVzKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheTxTbWFydFRyZWVOb2RlPj4+O1xyXG4gIHB1YmxpYyBnZXRSb290Tm9kZXMoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBvYnNlcnZlOiBhbnkgPSAnYm9keScsXHJcbiAgICByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHZpZXdVdWlkID09PSBudWxsIHx8IHZpZXdVdWlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdmlld1V1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRSb290Tm9kZXMuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRSb290Tm9kZXMuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFycmF5PFNtYXJ0VHJlZU5vZGU+PihcclxuICAgICAgJ2dldCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcclxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXHJcbiAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxyXG4gICAgICAgIG9ic2VydmU6IG9ic2VydmUsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybXMgYW4gYWN0aW9uIG9uIHRoZSBnaXZlbiB0cmVlbm9kZS4gVGhlIHZpZXdjb250ZXh0IHdpbGwgaG9sZCB0aGUgYXBwcm9wcmlhdGUgaW5zdHJ1Y3Rpb24gIGZvciB0aGUgdWkuIFJldHVybnMgdGhlIFNtYXJ0VHJlZU5vZGUgd2hpY2ggdGhlIGFjdGlvbiB3YXMgcGVyZm9ybWVkIG9uLlxyXG4gICAqIEBwYXJhbSB2aWV3VXVpZFxyXG4gICAqIEBwYXJhbSB0cmVlSWRcclxuICAgKiBAcGFyYW0gbm9kZUlkXHJcbiAgICogQHBhcmFtIGJvZHlcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgcGVyZm9ybUFjdGlvbihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxBcnJheTxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIHBlcmZvcm1BY3Rpb24oXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU/OiAncmVzcG9uc2UnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheTxTbWFydFRyZWVOb2RlPj4+O1xyXG4gIHB1YmxpYyBwZXJmb3JtQWN0aW9uKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICBib2R5OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBvYnNlcnZlPzogJ2V2ZW50cycsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFycmF5PFNtYXJ0VHJlZU5vZGU+Pj47XHJcbiAgcHVibGljIHBlcmZvcm1BY3Rpb24oXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1BY3Rpb24uJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRyZWVJZCA9PT0gbnVsbCB8fCB0cmVlSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmVlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwZXJmb3JtQWN0aW9uLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChub2RlSWQgPT09IG51bGwgfHwgbm9kZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgbm9kZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGVyZm9ybUFjdGlvbi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1BY3Rpb24uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxyXG4gICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID1cclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcclxuICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ25vZGVJZCcsXHJcbiAgICAgIHZhbHVlOiBub2RlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9L2FjdGlvbmA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXJyYXk8U21hcnRUcmVlTm9kZT4+KFxyXG4gICAgICAncG9zdCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICBib2R5OiBib2R5LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtcyBhbiBhY3Rpb24gb24gdGhlIGdpdmVuIHRyZWVub2RlLiBUaGUgdmlld2NvbnRleHQgd2lsbCBob2xkIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiAgZm9yIHRoZSB1aS4gUmV0dXJucyB0aGUgU21hcnRUcmVlTm9kZSB3aGljaCB0aGUgYWN0aW9uIHdhcyBwZXJmb3JtZWQgb24uXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBib2R5XHJcbiAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cclxuICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXHJcbiAgICovXHJcbiAgcHVibGljIHBlcmZvcm1NYWluQWN0aW9uKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxBcnJheTxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIHBlcmZvcm1NYWluQWN0aW9uKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZT86ICdyZXNwb25zZScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFycmF5PFNtYXJ0VHJlZU5vZGU+Pj47XHJcbiAgcHVibGljIHBlcmZvcm1NYWluQWN0aW9uKFxyXG4gICAgdmlld1V1aWQ6IHN0cmluZyxcclxuICAgIHRyZWVJZDogc3RyaW5nLFxyXG4gICAgYm9keTogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcnJheTxTbWFydFRyZWVOb2RlPj4+O1xyXG4gIHB1YmxpYyBwZXJmb3JtTWFpbkFjdGlvbihcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIGJvZHk6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBlcmZvcm1NYWluQWN0aW9uLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0cmVlSWQgPT09IG51bGwgfHwgdHJlZUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdSZXF1aXJlZCBwYXJhbWV0ZXIgdHJlZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGVyZm9ybU1haW5BY3Rpb24uJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnUmVxdWlyZWQgcGFyYW1ldGVyIGJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwZXJmb3JtTWFpbkFjdGlvbi4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxyXG4gICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gWydhcHBsaWNhdGlvbi9qc29uJ107XHJcbiAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID1cclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcclxuICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xyXG4gICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XHJcbiAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3RyZWUvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndmlld1V1aWQnLFxyXG4gICAgICB2YWx1ZTogdmlld1V1aWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogJ3V1aWQnLFxyXG4gICAgfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtcclxuICAgICAgbmFtZTogJ3RyZWVJZCcsXHJcbiAgICAgIHZhbHVlOiB0cmVlSWQsXHJcbiAgICAgIGluOiAncGF0aCcsXHJcbiAgICAgIHN0eWxlOiAnc2ltcGxlJyxcclxuICAgICAgZXhwbG9kZTogZmFsc2UsXHJcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcclxuICAgICAgZGF0YUZvcm1hdDogdW5kZWZpbmVkLFxyXG4gICAgfSl9L2FjdGlvbmA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXJyYXk8U21hcnRUcmVlTm9kZT4+KFxyXG4gICAgICAncG9zdCcsXHJcbiAgICAgIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcclxuICAgICAgICBib2R5OiBib2R5LFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcclxuICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXHJcbiAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcclxuICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3MsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZXMgdGhlIGdpdmVuIHRyZWVub2RlLiBUaGUgdmlld2NvbnRleHQgd2lsbCBob2xkIHRoZSBhcHByb3ByaWF0ZSBpbnN0cnVjdGlvbiAgZm9yIHRoZSB1aS4gUmV0dXJucyB0aGUgY29sbGFwc2VkIFNtYXJ0VHJlZU5vZGUuXHJcbiAgICogQHBhcmFtIHZpZXdVdWlkXHJcbiAgICogQHBhcmFtIHRyZWVJZFxyXG4gICAqIEBwYXJhbSBub2RlSWRcclxuICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxyXG4gICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cclxuICAgKi9cclxuICBwdWJsaWMgc2VsZWN0Tm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IGh0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbic7IGNvbnRleHQ/OiBIdHRwQ29udGV4dCB9XHJcbiAgKTogT2JzZXJ2YWJsZTxTbWFydFRyZWVOb2RlPjtcclxuICBwdWJsaWMgc2VsZWN0Tm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdyZXNwb25zZScsXHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFNtYXJ0VHJlZU5vZGU+PjtcclxuICBwdWJsaWMgc2VsZWN0Tm9kZShcclxuICAgIHZpZXdVdWlkOiBzdHJpbmcsXHJcbiAgICB0cmVlSWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgb2JzZXJ2ZT86ICdldmVudHMnLFxyXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxyXG4gICAgb3B0aW9ucz86IHsgaHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJzsgY29udGV4dD86IEh0dHBDb250ZXh0IH1cclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxTbWFydFRyZWVOb2RlPj47XHJcbiAgcHVibGljIHNlbGVjdE5vZGUoXHJcbiAgICB2aWV3VXVpZDogc3RyaW5nLFxyXG4gICAgdHJlZUlkOiBzdHJpbmcsXHJcbiAgICBub2RlSWQ6IHN0cmluZyxcclxuICAgIG9ic2VydmU6IGFueSA9ICdib2R5JyxcclxuICAgIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvcHRpb25zPzogeyBodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nOyBjb250ZXh0PzogSHR0cENvbnRleHQgfVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAodmlld1V1aWQgPT09IG51bGwgfHwgdmlld1V1aWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2aWV3VXVpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNlbGVjdE5vZGUuJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJlZUlkID09PSBudWxsIHx8IHRyZWVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHRyZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNlbGVjdE5vZGUuJyk7XHJcbiAgICB9XHJcbiAgICBpZiAobm9kZUlkID09PSBudWxsIHx8IG5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIG5vZGVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNlbGVjdE5vZGUuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XHJcblxyXG4gICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxyXG4gICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcclxuICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcclxuICAgIH1cclxuICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcclxuICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XHJcbiAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xyXG4gICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvdHJlZS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7XHJcbiAgICAgIG5hbWU6ICd2aWV3VXVpZCcsXHJcbiAgICAgIHZhbHVlOiB2aWV3VXVpZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiAndXVpZCcsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAndHJlZUlkJyxcclxuICAgICAgdmFsdWU6IHRyZWVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe1xyXG4gICAgICBuYW1lOiAnbm9kZUlkJyxcclxuICAgICAgdmFsdWU6IG5vZGVJZCxcclxuICAgICAgaW46ICdwYXRoJyxcclxuICAgICAgc3R5bGU6ICdzaW1wbGUnLFxyXG4gICAgICBleHBsb2RlOiBmYWxzZSxcclxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICBkYXRhRm9ybWF0OiB1bmRlZmluZWQsXHJcbiAgICB9KX0vc2VsZWN0YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxTbWFydFRyZWVOb2RlPihcclxuICAgICAgJ3Bvc3QnLFxyXG4gICAgICBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcclxuICAgICAge1xyXG4gICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcclxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxyXG4gICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzcyxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19