@boldreports/angular-reporting-components 5.2.26 → 5.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm2022/core.mjs DELETED
@@ -1,405 +0,0 @@
1
- import { EventEmitter, Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export { ContentChild, Type, forwardRef } from '@angular/core';
4
- export let currentTemplateElement;
5
- let firstVal = {};
6
- /** Internal Helpers */
7
- export class Utils {
8
- static IterateAndGetChanges(obj) {
9
- if (ej.isNullOrUndefined(obj.tags) || obj.tags.length === 0) {
10
- return null;
11
- }
12
- let res = {};
13
- for (let i = 0, tags = obj.tags; i < tags.length; i++) {
14
- let tag = tags[i], tagElement = obj['tag_' + tag.replace(/\./g, '_')];
15
- if (!ej.isNullOrUndefined(tagElement) && tagElement.hasChanges) {
16
- res[tag] = tagElement.getChangesAndReset();
17
- }
18
- }
19
- return res;
20
- }
21
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: Utils, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
22
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: Utils });
23
- }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: Utils, decorators: [{
25
- type: Injectable
26
- }] });
27
- // tslint:disable-next-line:max-line-length
28
- export class BoldReportComponents {
29
- controlName;
30
- el;
31
- cdRef;
32
- tags;
33
- ejIterableDiffers;
34
- _ejKeyValueDiffers;
35
- model = {};
36
- widget;
37
- outputs = [];
38
- inputs = [];
39
- twoways = [];
40
- complexProperties;
41
- isEditor;
42
- firstCheck;
43
- ejIterable;
44
- ejKeyValueDif;
45
- static bindAndRaiseEvent(instance, model, event) {
46
- if (!event.startsWith('model.')) { // && instance[event]['observers'].length > 1) {
47
- let originalEvt = event.startsWith('bold') ? event.substr(4) : event;
48
- model[originalEvt] = function (params) {
49
- instance[event + '_output']['emit'](params);
50
- };
51
- }
52
- }
53
- // tslint:disable-next-line:max-line-length
54
- constructor(controlName, el, cdRef, tags, ejIterableDiffers, _ejKeyValueDiffers) {
55
- this.controlName = controlName;
56
- this.el = el;
57
- this.cdRef = cdRef;
58
- this.tags = tags;
59
- this.ejIterableDiffers = ejIterableDiffers;
60
- this._ejKeyValueDiffers = _ejKeyValueDiffers;
61
- // this.__shadow = this.dom.getShadowRoot(this.el.nativeElement);
62
- this.firstCheck = true;
63
- this.ejIterable = this.ejIterableDiffers.find([]).create(null);
64
- this.ejKeyValueDif = _ejKeyValueDiffers.find([]).create();
65
- }
66
- createTwoways(twoways) {
67
- if (!twoways) {
68
- return;
69
- }
70
- let model = this.model;
71
- for (let i = 0; i < twoways.length; i++) {
72
- let element = twoways[i].replace(/\_/g, '.');
73
- ej.createObject(element + 'Change', this[twoways[i] + '_twoChange'], model);
74
- ej.createObject(element, this.addTwoways(element), model);
75
- }
76
- }
77
- addTwoways(prop) {
78
- let model = this.model, value = firstVal; // , originalProp = prop.replace(/-/g, '.');
79
- return function (newVal, isApp) {
80
- if (value === firstVal) {
81
- value = ej.getObject(prop + '_two', model);
82
- if (value === undefined) {
83
- value = ej.getObject(prop, this === undefined || this.defaults === undefined ? {} : this.defaults);
84
- }
85
- }
86
- if (newVal === undefined) {
87
- return value;
88
- }
89
- if (value === newVal) {
90
- return;
91
- }
92
- value = newVal;
93
- if (!isApp) {
94
- ej.createObject(prop + '_two', newVal, model);
95
- ej.getObject(prop + 'Change', model).emit(newVal);
96
- }
97
- };
98
- }
99
- ngOnInit() {
100
- for (let key in this) {
101
- if (key.indexOf('_input') != -1)
102
- this.inputs.push(key);
103
- if (key.indexOf('_output') != -1)
104
- this.outputs.push(key);
105
- if (key.indexOf('_two') != -1 && key.indexOf('_twoChange') == -1)
106
- this.twoways.push(key.replace('_two', ''));
107
- }
108
- if (ej.isNullOrUndefined(this['options'])) {
109
- this.createTwoways(this.twoways);
110
- }
111
- }
112
- ngAfterContentInit() {
113
- this.firstCheck = false;
114
- let model = this.model, events = this.outputs;
115
- if (events) {
116
- for (let i = 0; i < events.length; i++) {
117
- let event = events[i].replace('_output', '');
118
- BoldReportComponents.bindAndRaiseEvent(this, model, event);
119
- }
120
- }
121
- if (ej.isNullOrUndefined(this['options'])) {
122
- for (let i = 0; i < this.tags.length; i++) {
123
- let element = this.tags[i], item = this['tag_' + element.replace(/\./g, '_')];
124
- if (!ej.isNullOrUndefined(item)) {
125
- ej.createObject(element, item.getList(), this.model);
126
- }
127
- }
128
- for (let i = 0; i < this.inputs.length; i++) {
129
- let property = this.inputs[i];
130
- let modelProperty = this.inputs[i].replace('_input', '');
131
- if (this[property] != null) {
132
- if (modelProperty.indexOf('_') == -1) {
133
- if (this.model[modelProperty]) {
134
- $.extend(true, this.model[modelProperty], this[property]);
135
- }
136
- else {
137
- this.model[modelProperty] = this[property];
138
- }
139
- }
140
- else if (modelProperty.indexOf('_two') == -1) {
141
- let tempObj = {};
142
- let key = modelProperty.replace(/\_/g, '.');
143
- ej.createObject(key, this[property], tempObj);
144
- let rootProp = key.split('.')[0];
145
- if (this.model[rootProp] == undefined)
146
- this.model[rootProp] = {};
147
- $.extend(true, this.model[rootProp], tempObj[rootProp]);
148
- }
149
- }
150
- }
151
- for (let i = 0; i < this.twoways.length; i++) {
152
- let twoway = this.twoways[i];
153
- let twowayProperty = twoway + '_two';
154
- if (this[twowayProperty] != null) {
155
- if (twoway.indexOf('_') == -1) {
156
- this.model[twowayProperty] = this[twowayProperty];
157
- }
158
- else {
159
- let tempObj = {};
160
- let key = twoway.replace(/\_/g, '.') + '_two';
161
- ej.createObject(key, this[twowayProperty], tempObj);
162
- let rootProp = twowayProperty.split('_')[0];
163
- $.extend(true, this.model[rootProp], tempObj[rootProp]);
164
- }
165
- }
166
- }
167
- }
168
- else
169
- this.model = jQuery.extend(this.model, this['options']);
170
- }
171
- ngDoCheck() {
172
- if (ej.isNullOrUndefined(this['options'])) {
173
- this.twoways.forEach(element => {
174
- if (this[element + '_two'] instanceof Array) {
175
- let changes = this.ejIterable.diff(this[element + '_two']);
176
- if (changes) {
177
- let ngChanges = {};
178
- if (this.widget != undefined) {
179
- ngChanges = this.getTwowayChanges(changes.collection, ngChanges, element.replace(/\_/g, '.'));
180
- ej.createObject(element.replace(/\_/g, '.') + '.two', changes.collection, ngChanges);
181
- this.widget['setModel'](ngChanges, $.isPlainObject(ngChanges));
182
- }
183
- }
184
- }
185
- });
186
- }
187
- else {
188
- let changes = this.ejKeyValueDif.diff(this['options']);
189
- if (changes) {
190
- if (this.widget != undefined) {
191
- var ngchanges = {};
192
- changes.forEachChangedItem((changedprop) => {
193
- ej.createObject(changedprop.key, changedprop.currentValue, ngchanges);
194
- });
195
- this.widget['setModel'](ngchanges, $.isPlainObject(ngchanges));
196
- }
197
- }
198
- }
199
- }
200
- ngAfterViewInit() {
201
- let nativeElement = this.isEditor ? $(this.el.nativeElement.children) : $(this.el.nativeElement);
202
- let controlName = this.lowerCaseFirstLetter(this.controlName);
203
- this.widget = $(nativeElement)[controlName](this.model)[controlName]('instance');
204
- }
205
- lowerCaseFirstLetter(string) {
206
- return string[0].toLowerCase() + string.slice(1);
207
- }
208
- ngOnChanges(changes) {
209
- if (this.firstCheck) {
210
- return;
211
- }
212
- let ngChanges = {};
213
- if (ej.isNullOrUndefined(this['options'])) {
214
- for (let key in changes) {
215
- let element = changes[key];
216
- if (element.previousValue === element.currentValue) {
217
- break;
218
- }
219
- key = key.replace('_input', '').replace(/\_/g, '.');
220
- if (key.endsWith('.two')) {
221
- let oKey = key.replace('.two', '');
222
- ngChanges = this.getTwowayChanges(element.currentValue, ngChanges, oKey);
223
- }
224
- ej.createObject(key, element.currentValue, ngChanges);
225
- }
226
- this.widget['setModel'](ngChanges, $.isPlainObject(ngChanges));
227
- }
228
- }
229
- getTwowayChanges(value, ngChanges, prop) {
230
- let valFn = ej.getObject(prop, this.widget['model']);
231
- valFn(value, true);
232
- ej.createObject(prop, valFn, ngChanges);
233
- return ngChanges;
234
- }
235
- ngAfterContentChecked() {
236
- // TODO: ChangeDetection Third/Multi level
237
- let changes = Utils.IterateAndGetChanges(this);
238
- for (let key in changes) {
239
- if (changes.hasOwnProperty(key)) {
240
- let element = changes[key];
241
- this.widget['_' + key](element);
242
- }
243
- }
244
- }
245
- ngOnDestroy() {
246
- this.widget['destroy']();
247
- }
248
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: BoldReportComponents, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
249
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: BoldReportComponents });
250
- }
251
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: BoldReportComponents, decorators: [{
252
- type: Injectable
253
- }], ctorParameters: function () { return [{ type: undefined }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Array }, { type: i0.IterableDiffers }, { type: i0.KeyValueDiffers }]; } });
254
- export class ComplexTagElement {
255
- tags;
256
- recentChanges;
257
- hasChanges;
258
- firstChange;
259
- index;
260
- valueChange = new EventEmitter();
261
- complexProperties;
262
- property;
263
- parent;
264
- complexes = [];
265
- // tags: Array<string>;
266
- constructor(tags) {
267
- this.tags = tags;
268
- this.hasChanges = false;
269
- this.firstChange = true;
270
- Object.defineProperty(this, 'parent', {
271
- enumerable: false,
272
- writable: true,
273
- value: null
274
- });
275
- currentTemplateElement = this;
276
- }
277
- ngOnInit() {
278
- this.firstChange = false;
279
- for (let key in this) {
280
- if (key.indexOf('_') != -1 && key.indexOf('tag_') == -1)
281
- this.complexes.push(key);
282
- }
283
- for (let i = 0; i < this.complexes.length; i++) {
284
- let property = this.complexes[i];
285
- if (property.indexOf('_') != -1) {
286
- let tempObj = {};
287
- let key = property.replace(/\_/g, '.');
288
- ej.createObject(key, this[property], tempObj);
289
- let rootProp = key.split('.')[0];
290
- if (this[rootProp] == undefined)
291
- this[rootProp] = {};
292
- $.extend(true, this[rootProp], tempObj[rootProp]);
293
- }
294
- }
295
- }
296
- ensureCleanObject() {
297
- let tags = this.tags;
298
- for (let i = 0; i < tags.length; i++) {
299
- let element = tags[i], tagElement = this['tag_' + element.replace(/\./g, '_')];
300
- if (i === 0 && this[element]) {
301
- return;
302
- }
303
- if (ej.isNullOrUndefined(tagElement)) {
304
- continue;
305
- }
306
- ej.createObject(element, tagElement.getList(), this);
307
- }
308
- }
309
- ngOnChanges(changes) {
310
- if (this.firstChange) {
311
- return;
312
- }
313
- this.recentChanges = changes;
314
- this.hasChanges = true;
315
- }
316
- getChangesAndReset() {
317
- if (this.hasChanges === false) {
318
- return;
319
- }
320
- let changes = this.recentChanges || {};
321
- let contentChanges = Utils.IterateAndGetChanges(this);
322
- if (!$.isEmptyObject(contentChanges)) {
323
- for (let key in contentChanges) {
324
- if (contentChanges.hasOwnProperty(key)) {
325
- let element = contentChanges[key];
326
- // this.el.nativeElement.
327
- if (!ej.isNullOrUndefined(this.parent.widget['_' + this.property.replace(/\./g, '_') + '_' + key]))
328
- this.parent.widget['_' + this.property.replace(/\./g, '_') + '_' + key](element);
329
- }
330
- }
331
- }
332
- this.hasChanges = false;
333
- return changes;
334
- }
335
- ngAfterContentChecked() {
336
- let tags = this.tags;
337
- for (let i = 0, len = tags.length; i < len; i++) {
338
- let element = tags[i], tagElement = this['tag_' + element.replace(/\./g, '_')];
339
- if (tagElement && tagElement.hasChanges) {
340
- this.hasChanges = true;
341
- }
342
- }
343
- }
344
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ComplexTagElement, deps: [{ token: Array }], target: i0.ɵɵFactoryTarget.Injectable });
345
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ComplexTagElement });
346
- }
347
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ComplexTagElement, decorators: [{
348
- type: Injectable
349
- }], ctorParameters: function () { return [{ type: Array }]; } });
350
- export class ArrayTagElement {
351
- propertyName;
352
- list;
353
- children;
354
- recentChanges;
355
- hasChanges;
356
- constructor(propertyName) {
357
- this.propertyName = propertyName;
358
- this.hasChanges = false;
359
- }
360
- // TODO: Need to consider dynamic child change
361
- ngAfterContentInit() {
362
- let index = 0;
363
- this.list = this.children.map((child) => {
364
- child.index = index++;
365
- child.property = this.propertyName;
366
- return child;
367
- });
368
- }
369
- getList() {
370
- let list = this.list;
371
- for (let i = 0; i < list.length; i++) {
372
- list[i].ensureCleanObject();
373
- }
374
- return list;
375
- }
376
- getChangesAndReset() {
377
- this.hasChanges = false;
378
- return this.recentChanges;
379
- }
380
- ngAfterContentChecked() {
381
- let changes = {}, res = changes[this.propertyName] = [], childChange;
382
- for (let i = 0, list = this.list; i < list.length; i++) {
383
- let child = list[i];
384
- if (child.hasChanges) {
385
- childChange = child.getChangesAndReset();
386
- if (!ej.isNullOrUndefined(childChange)) {
387
- res.push({
388
- index: child.index,
389
- change: childChange
390
- });
391
- }
392
- }
393
- }
394
- if (res.length > 0) {
395
- this.recentChanges = res;
396
- this.hasChanges = true;
397
- }
398
- }
399
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ArrayTagElement, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
400
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ArrayTagElement });
401
- }
402
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: ArrayTagElement, decorators: [{
403
- type: Injectable
404
- }], ctorParameters: function () { return [{ type: undefined }]; } });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxZQUFZLEVBRXlFLFVBQVUsRUFFbEcsTUFBTSxlQUFlLENBQUM7O0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRCxNQUFNLENBQUMsSUFBSSxzQkFBMkIsQ0FBQztBQWlCdkMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBR2xCLHVCQUF1QjtBQUN2QixNQUFNLE9BQU8sS0FBSztJQUNkLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFlO1FBQ3ZDLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFTLEdBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUM5QztTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO3VHQWJRLEtBQUs7MkdBQUwsS0FBSzs7MkZBQUwsS0FBSztrQkFGakIsVUFBVTs7QUFvQlgsMkNBQTJDO0FBQzNDLE1BQU0sT0FBTyxvQkFBb0I7SUFzQlA7SUFBK0I7SUFBMEI7SUFBaUM7SUFBNkI7SUFBNEM7SUFyQmxMLEtBQUssR0FBUyxFQUFFLENBQUM7SUFDakIsTUFBTSxDQUFJO0lBQ1AsT0FBTyxHQUFrQixFQUFFLENBQUM7SUFDNUIsTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDM0IsT0FBTyxHQUFrQixFQUFFLENBQUM7SUFDNUIsaUJBQWlCLENBQWdCO0lBQ2pDLFFBQVEsQ0FBVTtJQUVwQixVQUFVLENBQVU7SUFDNUIsVUFBVSxDQUFNO0lBQ2hCLGFBQWEsQ0FBTTtJQUVYLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFhLEVBQUUsS0FBVSxFQUFFLEtBQWE7UUFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxnREFBZ0Q7WUFDOUUsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3JFLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLE1BQVc7Z0JBQ3RDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBQ0QsMkNBQTJDO0lBQzNDLFlBQXNCLFdBQW1CLEVBQVksRUFBYyxFQUFZLEtBQXdCLEVBQVMsSUFBbUIsRUFBVSxpQkFBa0MsRUFBVSxrQkFBbUM7UUFBdE0sZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBWSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVksVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFlO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFpQjtRQUFVLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBaUI7UUFDeE4sd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVTLGFBQWEsQ0FBQyxPQUFzQjtRQUMxQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3pCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0MsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsUUFBUSxFQUFRLElBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkYsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM3RDtJQUNMLENBQUM7SUFFUyxVQUFVLENBQUMsSUFBWTtRQUM3QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyw0Q0FBNEM7UUFDdEYsT0FBTyxVQUFVLE1BQVcsRUFBRSxLQUFjO1lBQ3hDLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDcEIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO29CQUNyQixLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3RHO2FBQ0o7WUFDRCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUNqQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDUixFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JEO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELFFBQVE7UUFDSixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNsQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBTyxJQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7UUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlDLElBQUksTUFBTSxFQUFFO1lBQ1IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzlEO1NBQ0o7UUFDRCxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBTyxJQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFTLElBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDN0IsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDeEQ7YUFDSjtZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFVLElBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBQy9CLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDbEMsSUFBVSxJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFOzRCQUNsQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBUSxJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsQ0FBQyxFQUFRLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3lCQUMzRTs2QkFBTTs0QkFDRyxJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsQ0FBQyxHQUFTLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzt5QkFDNUQ7cUJBQ0o7eUJBQU0sSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO3dCQUM1QyxJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7d0JBQ3RCLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUM1QyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBUSxJQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQ3JELElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2pDLElBQVUsSUFBSSxDQUFDLEtBQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTOzRCQUNsQyxJQUFJLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQVEsSUFBSSxDQUFDLEtBQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztxQkFDbEU7aUJBQ0o7YUFDSjtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxjQUFjLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDckMsSUFBVSxJQUFLLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFO29CQUNyQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxLQUFNLENBQUMsY0FBYyxDQUFDLEdBQVMsSUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO3FCQUNuRTt5QkFBTTt3QkFDSCxJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7d0JBQ3RCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQzt3QkFDOUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQVEsSUFBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUMzRCxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM1QyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBUSxJQUFJLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3FCQUNsRTtpQkFDSjthQUNKO1NBQ0o7O1lBRUcsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQVEsSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsQ0FBQztJQUNELFNBQVM7UUFDTCxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBTyxJQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDM0IsSUFBVSxJQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEtBQUssRUFBRTtvQkFDaEQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQU8sSUFBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUNsRSxJQUFJLE9BQU8sRUFBRTt3QkFDVCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7d0JBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7NEJBQzFCLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDOUYsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQzs0QkFDL0UsSUFBSSxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3lCQUN6RTtxQkFDSjtpQkFDSjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBRU47YUFDSTtZQUNELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFPLElBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzlELElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7b0JBQzFCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFO3dCQUM1QyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDMUUsQ0FBQyxDQUFDLENBQUM7b0JBQ0csSUFBSSxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUN6RTthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBQ0QsZUFBZTtRQUNYLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakcsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsTUFBTSxHQUFJLENBQUMsQ0FBQyxhQUFhLENBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQWM7UUFDL0IsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXdDO1FBQ2hELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNoQyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxFQUFFLENBQUMsaUJBQWlCLENBQU8sSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7WUFDOUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUU7Z0JBQ3JCLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLE9BQU8sQ0FBQyxZQUFZLEVBQUU7b0JBQ2hELE1BQU07aUJBQ1Q7Z0JBQ0QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDdEIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ25DLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzVFO2dCQUNELEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDekQ7WUFFSyxJQUFJLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDekU7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVSxFQUFFLFNBQWMsRUFBRSxJQUFZO1FBQ3JELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFRLElBQUksQ0FBQyxNQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLDBDQUEwQztRQUMxQyxJQUFJLE9BQU8sR0FBZSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsS0FBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUU7WUFDckIsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzFDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNELElBQUksQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztJQUNwQyxDQUFDO3VHQXJOUSxvQkFBb0I7MkdBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFGaEMsVUFBVTs7QUEyTlgsTUFBTSxPQUFPLGlCQUFpQjtJQWFQO0lBWm5CLGFBQWEsQ0FBTTtJQUNuQixVQUFVLENBQVU7SUFDcEIsV0FBVyxDQUFVO0lBQ3JCLEtBQUssQ0FBUztJQUNkLFdBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMxQyxpQkFBaUIsQ0FBZ0I7SUFDM0MsUUFBUSxDQUFTO0lBQ2pCLE1BQU0sQ0FBaUM7SUFDdkMsU0FBUyxHQUFrQixFQUFFLENBQUM7SUFFOUIsdUJBQXVCO0lBRXZCLFlBQW1CLElBQW1CO1FBQW5CLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFeEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ2xDLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUM7UUFDSCxzQkFBc0IsR0FBRyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNsQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBUSxJQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3JELElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQVUsSUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVM7b0JBQVEsSUFBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDbkUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQVEsSUFBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQzVEO1NBQ0o7SUFDTCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFTLElBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV0RixJQUFJLENBQUMsS0FBSyxDQUFDLElBQVUsSUFBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUNoRCxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFBRSxTQUFTO2FBQUU7WUFFbkQsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hEO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUF3QztRQUNoRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFMUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ2xDLEtBQUssSUFBSSxHQUFHLElBQUksY0FBYyxFQUFFO2dCQUM1QixJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3BDLElBQUksT0FBTyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEMseUJBQXlCO29CQUN6QixJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO3dCQUM5RixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDeEY7YUFDSjtTQUNKO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsR0FBUyxJQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEYsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7YUFDMUI7U0FDSjtJQUNMLENBQUM7dUdBMUZRLGlCQUFpQjsyR0FBakIsaUJBQWlCOzsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVOztBQStGWCxNQUFNLE9BQU8sZUFBZTtJQU1MO0lBTG5CLElBQUksQ0FBVztJQUNmLFFBQVEsQ0FBZTtJQUN2QixhQUFhLENBQXNCO0lBQ25DLFVBQVUsQ0FBVTtJQUVwQixZQUFtQixZQUFvQjtRQUFwQixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsOENBQThDO0lBQzlDLGtCQUFrQjtRQUNkLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNwQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNuQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxrQkFBa0I7UUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixJQUFJLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUE4QixPQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFnQixDQUFDO1FBRXRHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xCLFdBQVcsR0FBRyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDcEMsR0FBRyxDQUFDLElBQUksQ0FBZTt3QkFDbkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO3dCQUNsQixNQUFNLEVBQUUsV0FBVztxQkFDdEIsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7U0FDSjtRQUVELElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDTCxDQUFDO3VHQXJEUSxlQUFlOzJHQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgRXZlbnRFbWl0dGVyLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIFNpbXBsZUNoYW5nZSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLCBJdGVyYWJsZURpZmZlcnMsIEtleVZhbHVlRGlmZmVycywgT25Jbml0LFxyXG4gICAgRG9DaGVjaywgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRDaGVja2VkLCBPbkRlc3Ryb3ksIEluamVjdGFibGVcclxuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgeyBDb250ZW50Q2hpbGQsIFR5cGUsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCBsZXQgY3VycmVudFRlbXBsYXRlRWxlbWVudDogYW55O1xyXG5cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQYXJlbnRUYWcge1xyXG4gICAgdGFnczogQXJyYXk8YW55PjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ2hpbGRDaGFuZ2Uge1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIGNoYW5nZTogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElDaGFuZ2VTZXQge1xyXG4gICAgW2tleTogc3RyaW5nXTogQXJyYXk8SUNoaWxkQ2hhbmdlPjtcclxufVxyXG5cclxubGV0IGZpcnN0VmFsID0ge307XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbi8qKiBJbnRlcm5hbCBIZWxwZXJzICovXHJcbmV4cG9ydCBjbGFzcyBVdGlscyB7XHJcbiAgICBzdGF0aWMgSXRlcmF0ZUFuZEdldENoYW5nZXMob2JqOiBJUGFyZW50VGFnKTogSUNoYW5nZVNldCB7XHJcbiAgICAgICAgaWYgKGVqLmlzTnVsbE9yVW5kZWZpbmVkKG9iai50YWdzKSB8fCBvYmoudGFncy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXM6IElDaGFuZ2VTZXQgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgdGFncyA9IG9iai50YWdzOyBpIDwgdGFncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGFnID0gdGFnc1tpXSwgdGFnRWxlbWVudCA9ICg8YW55Pm9iailbJ3RhZ18nICsgdGFnLnJlcGxhY2UoL1xcLi9nLCAnXycpXTtcclxuICAgICAgICAgICAgaWYgKCFlai5pc051bGxPclVuZGVmaW5lZCh0YWdFbGVtZW50KSAmJiB0YWdFbGVtZW50Lmhhc0NoYW5nZXMpIHtcclxuICAgICAgICAgICAgICAgIHJlc1t0YWddID0gdGFnRWxlbWVudC5nZXRDaGFuZ2VzQW5kUmVzZXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbmV4cG9ydCBjbGFzcyBCb2xkUmVwb3J0Q29tcG9uZW50czxXLCBUPiBpbXBsZW1lbnRzIElQYXJlbnRUYWcsIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgRG9DaGVjaywgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRDaGVja2VkLCBPbkRlc3Ryb3kge1xyXG4gICAgcHVibGljIG1vZGVsOiBUID0gPFQ+e307XHJcbiAgICBwdWJsaWMgd2lkZ2V0OiBXO1xyXG4gICAgcHJvdGVjdGVkIG91dHB1dHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgIHByb3RlY3RlZCBpbnB1dHM6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgIHByb3RlY3RlZCB0d293YXlzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBwcm90ZWN0ZWQgY29tcGxleFByb3BlcnRpZXM6IEFycmF5PHN0cmluZz47XHJcbiAgICBwcm90ZWN0ZWQgaXNFZGl0b3I6IGJvb2xlYW47XHJcblxyXG4gICAgcHJpdmF0ZSBmaXJzdENoZWNrOiBib29sZWFuO1xyXG4gICAgZWpJdGVyYWJsZTogYW55O1xyXG4gICAgZWpLZXlWYWx1ZURpZjogYW55O1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGJpbmRBbmRSYWlzZUV2ZW50KGluc3RhbmNlOiBhbnksIG1vZGVsOiBhbnksIGV2ZW50OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIWV2ZW50LnN0YXJ0c1dpdGgoJ21vZGVsLicpKSB7Ly8gJiYgaW5zdGFuY2VbZXZlbnRdWydvYnNlcnZlcnMnXS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbEV2dCA9IGV2ZW50LnN0YXJ0c1dpdGgoJ2JvbGQnKSA/IGV2ZW50LnN1YnN0cig0KSA6IGV2ZW50O1xyXG4gICAgICAgICAgICBtb2RlbFtvcmlnaW5hbEV2dF0gPSBmdW5jdGlvbiAocGFyYW1zOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlW2V2ZW50ICsgJ19vdXRwdXQnXVsnZW1pdCddKHBhcmFtcyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbnRyb2xOYW1lOiBzdHJpbmcsIHByb3RlY3RlZCBlbDogRWxlbWVudFJlZiwgcHJvdGVjdGVkIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHVibGljIHRhZ3M6IEFycmF5PHN0cmluZz4sIHByaXZhdGUgZWpJdGVyYWJsZURpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycywgcHJpdmF0ZSBfZWpLZXlWYWx1ZURpZmZlcnM6IEtleVZhbHVlRGlmZmVycykge1xyXG4gICAgICAgIC8vICAgICAgICB0aGlzLl9fc2hhZG93ID0gdGhpcy5kb20uZ2V0U2hhZG93Um9vdCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZmlyc3RDaGVjayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lakl0ZXJhYmxlID0gdGhpcy5lakl0ZXJhYmxlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5laktleVZhbHVlRGlmID0gX2VqS2V5VmFsdWVEaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVUd293YXlzKHR3b3dheXM6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICBpZiAoIXR3b3dheXMpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5tb2RlbDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR3b3dheXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0d293YXlzW2ldLnJlcGxhY2UoL1xcXy9nLCAnLicpO1xyXG4gICAgICAgICAgICBlai5jcmVhdGVPYmplY3QoZWxlbWVudCArICdDaGFuZ2UnLCAoPGFueT50aGlzKVt0d293YXlzW2ldICsgJ190d29DaGFuZ2UnXSwgbW9kZWwpO1xyXG4gICAgICAgICAgICBlai5jcmVhdGVPYmplY3QoZWxlbWVudCwgdGhpcy5hZGRUd293YXlzKGVsZW1lbnQpLCBtb2RlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhZGRUd293YXlzKHByb3A6IHN0cmluZyk6IEZ1bmN0aW9uIHtcclxuICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLm1vZGVsLCB2YWx1ZSA9IGZpcnN0VmFsOyAvLyAsIG9yaWdpbmFsUHJvcCA9IHByb3AucmVwbGFjZSgvLS9nLCAnLicpO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobmV3VmFsOiBhbnksIGlzQXBwOiBib29sZWFuKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmlyc3RWYWwpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gZWouZ2V0T2JqZWN0KHByb3AgKyAnX3R3bycsIG1vZGVsKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlai5nZXRPYmplY3QocHJvcCwgdGhpcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuZGVmYXVsdHMgPT09IHVuZGVmaW5lZCA/IHt9IDogdGhpcy5kZWZhdWx0cyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBuZXdWYWwpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsO1xyXG4gICAgICAgICAgICBpZiAoIWlzQXBwKSB7XHJcbiAgICAgICAgICAgICAgICBlai5jcmVhdGVPYmplY3QocHJvcCArICdfdHdvJywgbmV3VmFsLCBtb2RlbCk7XHJcbiAgICAgICAgICAgICAgICBlai5nZXRPYmplY3QocHJvcCArICdDaGFuZ2UnLCBtb2RlbCkuZW1pdChuZXdWYWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX2lucHV0JykgIT0gLTEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0cy5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX291dHB1dCcpICE9IC0xKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdfdHdvJykgIT0gLTEgJiYga2V5LmluZGV4T2YoJ190d29DaGFuZ2UnKSA9PSAtMSlcclxuICAgICAgICAgICAgICAgIHRoaXMudHdvd2F5cy5wdXNoKGtleS5yZXBsYWNlKCdfdHdvJywgJycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVqLmlzTnVsbE9yVW5kZWZpbmVkKCg8YW55PnRoaXMpWydvcHRpb25zJ10pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVHdvd2F5cyh0aGlzLnR3b3dheXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5maXJzdENoZWNrID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBtb2RlbCA9IHRoaXMubW9kZWwsIGV2ZW50cyA9IHRoaXMub3V0cHV0cztcclxuICAgICAgICBpZiAoZXZlbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXZlbnQgPSBldmVudHNbaV0ucmVwbGFjZSgnX291dHB1dCcsICcnKTtcclxuICAgICAgICAgICAgICAgIEJvbGRSZXBvcnRDb21wb25lbnRzLmJpbmRBbmRSYWlzZUV2ZW50KHRoaXMsIG1vZGVsLCBldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVqLmlzTnVsbE9yVW5kZWZpbmVkKCg8YW55PnRoaXMpWydvcHRpb25zJ10pKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YWdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMudGFnc1tpXSwgaXRlbSA9ICg8YW55PnRoaXMpWyd0YWdfJyArIGVsZW1lbnQucmVwbGFjZSgvXFwuL2csICdfJyldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlai5pc051bGxPclVuZGVmaW5lZChpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChlbGVtZW50LCBpdGVtLmdldExpc3QoKSwgdGhpcy5tb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9wZXJ0eSA9IHRoaXMuaW5wdXRzW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vZGVsUHJvcGVydHkgPSB0aGlzLmlucHV0c1tpXS5yZXBsYWNlKCdfaW5wdXQnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxhbnk+dGhpcylbcHJvcGVydHldICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWxQcm9wZXJ0eS5pbmRleE9mKCdfJykgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCg8YW55PnRoaXMubW9kZWwpW21vZGVsUHJvcGVydHldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmV4dGVuZCh0cnVlLCAoPGFueT50aGlzLm1vZGVsKVttb2RlbFByb3BlcnR5XSwgKDxhbnk+dGhpcylbcHJvcGVydHldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMubW9kZWwpW21vZGVsUHJvcGVydHldID0gKDxhbnk+dGhpcylbcHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbFByb3BlcnR5LmluZGV4T2YoJ190d28nKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcE9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBtb2RlbFByb3BlcnR5LnJlcGxhY2UoL1xcXy9nLCAnLicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlai5jcmVhdGVPYmplY3Qoa2V5LCAoPGFueT50aGlzKVtwcm9wZXJ0eV0sIHRlbXBPYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vdFByb3AgPSBrZXkuc3BsaXQoJy4nKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCg8YW55PnRoaXMubW9kZWwpW3Jvb3RQcm9wXSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLm1vZGVsKVtyb290UHJvcF0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgKDxhbnk+dGhpcy5tb2RlbClbcm9vdFByb3BdLCB0ZW1wT2JqW3Jvb3RQcm9wXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50d293YXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHdvd2F5ID0gdGhpcy50d293YXlzW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHR3b3dheVByb3BlcnR5ID0gdHdvd2F5ICsgJ190d28nO1xyXG4gICAgICAgICAgICAgICAgaWYgKCg8YW55PnRoaXMpW3R3b3dheVByb3BlcnR5XSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR3b3dheS5pbmRleE9mKCdfJykgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcy5tb2RlbClbdHdvd2F5UHJvcGVydHldID0gKDxhbnk+dGhpcylbdHdvd2F5UHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wT2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IHR3b3dheS5yZXBsYWNlKC9cXF8vZywgJy4nKSArICdfdHdvJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGtleSwgKDxhbnk+dGhpcylbdHdvd2F5UHJvcGVydHldLCB0ZW1wT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvb3RQcm9wID0gdHdvd2F5UHJvcGVydHkuc3BsaXQoJ18nKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgKDxhbnk+dGhpcy5tb2RlbClbcm9vdFByb3BdLCB0ZW1wT2JqW3Jvb3RQcm9wXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IGpRdWVyeS5leHRlbmQodGhpcy5tb2RlbCwgKDxhbnk+dGhpcylbJ29wdGlvbnMnXSk7XHJcblxyXG4gICAgfVxyXG4gICAgbmdEb0NoZWNrKCkge1xyXG4gICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZCgoPGFueT50aGlzKVsnb3B0aW9ucyddKSkge1xyXG4gICAgICAgICAgICB0aGlzLnR3b3dheXMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzKVtlbGVtZW50ICsgJ190d28nXSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSB0aGlzLmVqSXRlcmFibGUuZGlmZigoPGFueT50aGlzKVtlbGVtZW50ICsgJ190d28nXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5nQ2hhbmdlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53aWRnZXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0NoYW5nZXMgPSB0aGlzLmdldFR3b3dheUNoYW5nZXMoY2hhbmdlcy5jb2xsZWN0aW9uLCBuZ0NoYW5nZXMsIGVsZW1lbnQucmVwbGFjZSgvXFxfL2csICcuJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGVsZW1lbnQucmVwbGFjZSgvXFxfL2csICcuJykgKyAnLnR3bycsIGNoYW5nZXMuY29sbGVjdGlvbiwgbmdDaGFuZ2VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMud2lkZ2V0KVsnc2V0TW9kZWwnXShuZ0NoYW5nZXMsICQuaXNQbGFpbk9iamVjdChuZ0NoYW5nZXMpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSB0aGlzLmVqS2V5VmFsdWVEaWYuZGlmZigoPGFueT50aGlzKVsnb3B0aW9ucyddKTtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLndpZGdldCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmdjaGFuZ2VzID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oKGNoYW5nZWRwcm9wOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGNoYW5nZWRwcm9wLmtleSwgY2hhbmdlZHByb3AuY3VycmVudFZhbHVlLCBuZ2NoYW5nZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMud2lkZ2V0KVsnc2V0TW9kZWwnXShuZ2NoYW5nZXMsICQuaXNQbGFpbk9iamVjdChuZ2NoYW5nZXMpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBsZXQgbmF0aXZlRWxlbWVudCA9IHRoaXMuaXNFZGl0b3IgPyAkKHRoaXMuZWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbikgOiAkKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgbGV0IGNvbnRyb2xOYW1lOiBzdHJpbmcgPSB0aGlzLmxvd2VyQ2FzZUZpcnN0TGV0dGVyKHRoaXMuY29udHJvbE5hbWUpO1xyXG4gICAgICAgIHRoaXMud2lkZ2V0ID0gKCQobmF0aXZlRWxlbWVudCkgYXMgYW55KVtjb250cm9sTmFtZV0odGhpcy5tb2RlbClbY29udHJvbE5hbWVdKCdpbnN0YW5jZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvd2VyQ2FzZUZpcnN0TGV0dGVyKHN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZ1swXS50b0xvd2VyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pIHtcclxuICAgICAgICBpZiAodGhpcy5maXJzdENoZWNrKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGxldCBuZ0NoYW5nZXMgPSB7fTtcclxuICAgICAgICBpZiAoZWouaXNOdWxsT3JVbmRlZmluZWQoKDxhbnk+dGhpcylbJ29wdGlvbnMnXSkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gY2hhbmdlc1trZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucHJldmlvdXNWYWx1ZSA9PT0gZWxlbWVudC5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKCdfaW5wdXQnLCAnJykucmVwbGFjZSgvXFxfL2csICcuJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKCcudHdvJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb0tleSA9IGtleS5yZXBsYWNlKCcudHdvJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5nQ2hhbmdlcyA9IHRoaXMuZ2V0VHdvd2F5Q2hhbmdlcyhlbGVtZW50LmN1cnJlbnRWYWx1ZSwgbmdDaGFuZ2VzLCBvS2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChrZXksIGVsZW1lbnQuY3VycmVudFZhbHVlLCBuZ0NoYW5nZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAoPGFueT50aGlzLndpZGdldClbJ3NldE1vZGVsJ10obmdDaGFuZ2VzLCAkLmlzUGxhaW5PYmplY3QobmdDaGFuZ2VzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFR3b3dheUNoYW5nZXModmFsdWU6IGFueSwgbmdDaGFuZ2VzOiBhbnksIHByb3A6IHN0cmluZykge1xyXG4gICAgICAgIGxldCB2YWxGbiA9IGVqLmdldE9iamVjdChwcm9wLCAoPGFueT50aGlzLndpZGdldClbJ21vZGVsJ10pO1xyXG4gICAgICAgIHZhbEZuKHZhbHVlLCB0cnVlKTtcclxuICAgICAgICBlai5jcmVhdGVPYmplY3QocHJvcCwgdmFsRm4sIG5nQ2hhbmdlcyk7XHJcbiAgICAgICAgcmV0dXJuIG5nQ2hhbmdlcztcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XHJcbiAgICAgICAgLy8gVE9ETzogQ2hhbmdlRGV0ZWN0aW9uIFRoaXJkL011bHRpIGxldmVsXHJcbiAgICAgICAgbGV0IGNoYW5nZXM6IElDaGFuZ2VTZXQgPSBVdGlscy5JdGVyYXRlQW5kR2V0Q2hhbmdlcyh0aGlzKTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gY2hhbmdlcykge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGNoYW5nZXNba2V5XTtcclxuICAgICAgICAgICAgICAgICg8YW55PnRoaXMud2lkZ2V0KVsnXycgKyBrZXldKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgICg8YW55PnRoaXMud2lkZ2V0KVsnZGVzdHJveSddKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbXBsZXhUYWdFbGVtZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudENoZWNrZWQge1xyXG4gICAgcmVjZW50Q2hhbmdlczogYW55O1xyXG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcclxuICAgIGZpcnN0Q2hhbmdlOiBib29sZWFuO1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByb3RlY3RlZCBjb21wbGV4UHJvcGVydGllczogQXJyYXk8c3RyaW5nPjtcclxuICAgIHByb3BlcnR5OiBzdHJpbmc7XHJcbiAgICBwYXJlbnQ6IEJvbGRSZXBvcnRDb21wb25lbnRzPGFueSwgYW55PjtcclxuICAgIGNvbXBsZXhlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAgIC8vIHRhZ3M6IEFycmF5PHN0cmluZz47XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHRhZ3M6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZpcnN0Q2hhbmdlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYXJlbnQnLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgdmFsdWU6IG51bGxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjdXJyZW50VGVtcGxhdGVFbGVtZW50ID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmZpcnN0Q2hhbmdlID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMpIHtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdfJykgIT0gLTEgJiYga2V5LmluZGV4T2YoJ3RhZ18nKSA9PSAtMSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxleGVzLnB1c2goa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbXBsZXhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgcHJvcGVydHkgPSB0aGlzLmNvbXBsZXhlc1tpXTtcclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluZGV4T2YoJ18nKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRlbXBPYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHByb3BlcnR5LnJlcGxhY2UoL1xcXy9nLCAnLicpO1xyXG4gICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGtleSwgKDxhbnk+dGhpcylbcHJvcGVydHldLCB0ZW1wT2JqKTtcclxuICAgICAgICAgICAgICAgIGxldCByb290UHJvcCA9IGtleS5zcGxpdCgnLicpWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCg8YW55PnRoaXMpW3Jvb3RQcm9wXSA9PSB1bmRlZmluZWQpICg8YW55PnRoaXMpW3Jvb3RQcm9wXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgKDxhbnk+dGhpcylbcm9vdFByb3BdLCB0ZW1wT2JqW3Jvb3RQcm9wXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZW5zdXJlQ2xlYW5PYmplY3QoKSB7XHJcbiAgICAgICAgbGV0IHRhZ3MgPSB0aGlzLnRhZ3M7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGFnc1tpXSwgdGFnRWxlbWVudCA9ICg8YW55PnRoaXMpWyd0YWdfJyArIGVsZW1lbnQucmVwbGFjZSgvXFwuL2csICdfJyldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgKDxhbnk+dGhpcylbZWxlbWVudF0pIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZCh0YWdFbGVtZW50KSkgeyBjb250aW51ZTsgfVxyXG5cclxuICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGVsZW1lbnQsIHRhZ0VsZW1lbnQuZ2V0TGlzdCgpLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpcnN0Q2hhbmdlKSB7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMucmVjZW50Q2hhbmdlcyA9IGNoYW5nZXM7XHJcbiAgICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGFuZ2VzQW5kUmVzZXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlcyA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGxldCBjaGFuZ2VzID0gdGhpcy5yZWNlbnRDaGFuZ2VzIHx8IHt9O1xyXG4gICAgICAgIGxldCBjb250ZW50Q2hhbmdlcyA9IFV0aWxzLkl0ZXJhdGVBbmRHZXRDaGFuZ2VzKHRoaXMpO1xyXG4gICAgICAgIGlmICghJC5pc0VtcHR5T2JqZWN0KGNvbnRlbnRDaGFuZ2VzKSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29udGVudENoYW5nZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50Q2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBjb250ZW50Q2hhbmdlc1trZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZWwubmF0aXZlRWxlbWVudC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVqLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMucGFyZW50LndpZGdldFsnXycgKyB0aGlzLnByb3BlcnR5LnJlcGxhY2UoL1xcLi9nLCAnXycpICsgJ18nICsga2V5XSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LndpZGdldFsnXycgKyB0aGlzLnByb3BlcnR5LnJlcGxhY2UoL1xcLi9nLCAnXycpICsgJ18nICsga2V5XShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGNoYW5nZXM7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xyXG4gICAgICAgIGxldCB0YWdzID0gdGhpcy50YWdzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0YWdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGFnc1tpXSwgdGFnRWxlbWVudCA9ICg8YW55PnRoaXMpWyd0YWdfJyArIGVsZW1lbnQucmVwbGFjZSgvXFwuL2csICdfJyldO1xyXG4gICAgICAgICAgICBpZiAodGFnRWxlbWVudCAmJiB0YWdFbGVtZW50Lmhhc0NoYW5nZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFycmF5VGFnRWxlbWVudDxUIGV4dGVuZHMgQ29tcGxleFRhZ0VsZW1lbnQ+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XHJcbiAgICBsaXN0OiBBcnJheTxUPjtcclxuICAgIGNoaWxkcmVuOiBRdWVyeUxpc3Q8VD47XHJcbiAgICByZWNlbnRDaGFuZ2VzOiBBcnJheTxJQ2hpbGRDaGFuZ2U+O1xyXG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBOZWVkIHRvIGNvbnNpZGVyIGR5bmFtaWMgY2hpbGQgY2hhbmdlXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLmxpc3QgPSB0aGlzLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQuaW5kZXggPSBpbmRleCsrO1xyXG4gICAgICAgICAgICBjaGlsZC5wcm9wZXJ0eSA9IHRoaXMucHJvcGVydHlOYW1lO1xyXG4gICAgICAgICAgICByZXR1cm4gY2hpbGQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TGlzdCgpIHtcclxuICAgICAgICBsZXQgbGlzdCA9IHRoaXMubGlzdDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGlzdFtpXS5lbnN1cmVDbGVhbk9iamVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGFuZ2VzQW5kUmVzZXQoKTogQXJyYXk8SUNoaWxkQ2hhbmdlPiB7XHJcbiAgICAgICAgdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjZW50Q2hhbmdlcztcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGNoYW5nZXMgPSB7fSwgcmVzOiBBcnJheTxJQ2hpbGRDaGFuZ2U+ID0gKDxhbnk+Y2hhbmdlcylbdGhpcy5wcm9wZXJ0eU5hbWVdID0gW10sIGNoaWxkQ2hhbmdlOiBhbnk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsaXN0ID0gdGhpcy5saXN0OyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBsaXN0W2ldO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQuaGFzQ2hhbmdlcykge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRDaGFuZ2UgPSBjaGlsZC5nZXRDaGFuZ2VzQW5kUmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIGlmICghZWouaXNOdWxsT3JVbmRlZmluZWQoY2hpbGRDaGFuZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goPElDaGlsZENoYW5nZT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBjaGlsZC5pbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBjaGlsZENoYW5nZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZWNlbnRDaGFuZ2VzID0gcmVzO1xyXG4gICAgICAgICAgICB0aGlzLmhhc0NoYW5nZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=