speechrecorderng 3.0.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. package/lib/utils/css_utils.d.ts +0 -3
@@ -1,10 +1,11 @@
1
1
  import { Browser, Platform, UserAgentBuilder } from "../../utils/ua-parser";
2
- import { Platform as CfgPlatform } from "../../speechrecorder/project/project";
2
+ import { AudioStorageType, Platform as CfgPlatform } from "../../speechrecorder/project/project";
3
3
  import { ArrayAudioBuffer } from "../array_audio_buffer";
4
+ import { UUID } from "../../utils/utils";
5
+ import { IndexedDbAudioBuffer } from "../inddb_audio_buffer";
4
6
  export const CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC = false;
5
7
  const DEBUG_TRACE_LEVEL = 0;
6
- const ENABLE_AUDIO_WORKLET = true;
7
- // Super dirty way to load this module
8
+ // Dirty way to load this module
8
9
  // Copy content of interceptor_worklet.js to this string
9
10
  const awpStr = "class AudioCaptureInterceptorProcessor extends AudioWorkletProcessor{\n" +
10
11
  "\n" +
@@ -82,23 +83,72 @@ const awpStr = "class AudioCaptureInterceptorProcessor extends AudioWorkletProce
82
83
  "registerProcessor('capture-interceptor',AudioCaptureInterceptorProcessor);\n";
83
84
  export class AudioCapture {
84
85
  constructor(context) {
86
+ this._maxAutoNetMemStoreSamples = AudioCapture.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES;
87
+ this._recUUID = null;
85
88
  this.agcStatus = null;
86
89
  this.bufferingNode = null;
90
+ this.data = null;
87
91
  this.audioOutStream = null;
88
92
  this.disconnectStreams = true;
89
93
  this._opened = false;
90
94
  this.capturing = false;
91
95
  this.framesRecorded = 0;
96
+ this._audioStorageType = AudioStorageType.MEM_ENTIRE;
97
+ this._persistentAudioStorageTarget = null;
98
+ this.persisted = true;
99
+ this.persistError = null;
100
+ this.inddbAudioBuffer = null;
92
101
  this.context = context;
93
102
  this.n = navigator;
103
+ this.context.addEventListener('statechange', (ev) => {
104
+ if (this.context.state !== 'running') {
105
+ this.close();
106
+ }
107
+ });
108
+ }
109
+ get maxAutoNetMemStoreSamples() {
110
+ return this._maxAutoNetMemStoreSamples;
111
+ }
112
+ set maxAutoNetMemStoreSamples(value) {
113
+ this._maxAutoNetMemStoreSamples = value;
114
+ }
115
+ set recUUID(value) {
116
+ this._recUUID = value;
117
+ }
118
+ get recUUID() {
119
+ return this._recUUID;
120
+ }
121
+ get audioStorageType() {
122
+ return this._audioStorageType;
123
+ }
124
+ set audioStorageType(value) {
125
+ this._audioStorageType = value;
126
+ }
127
+ get persistentAudioStorageTarget() {
128
+ return this._persistentAudioStorageTarget;
129
+ }
130
+ set persistentAudioStorageTarget(value) {
131
+ this._persistentAudioStorageTarget = value;
94
132
  }
95
133
  get opened() {
96
134
  return this._opened;
97
135
  }
98
136
  initData() {
99
- this.data = new Array();
100
- for (let i = 0; i < this.channelCount; i++) {
101
- this.data.push(new Array());
137
+ if (!this._recUUID) {
138
+ this._recUUID = UUID.generate();
139
+ }
140
+ this.persistError = null;
141
+ console.info("Audio capture initialize storage for type: " + this._audioStorageType);
142
+ if (AudioStorageType.DB_CHUNKED === this._audioStorageType && this._persistentAudioStorageTarget && this._recUUID) {
143
+ console.debug("Create indexed db audio buffer.");
144
+ this.inddbAudioBuffer = new IndexedDbAudioBuffer(this._persistentAudioStorageTarget, this.channelCount, this.currentSampleRate, AudioCapture.BUFFER_SIZE, 0, this._recUUID);
145
+ }
146
+ if (!(AudioStorageType.NET_CHUNKED === this._audioStorageType)) {
147
+ // Initialize audio data array except for net audio buffer mode
148
+ this.data = new Array();
149
+ for (let i = 0; i < this.channelCount; i++) {
150
+ this.data.push(new Array());
151
+ }
102
152
  }
103
153
  this.framesRecorded = 0;
104
154
  }
@@ -190,16 +240,24 @@ export class AudioCapture {
190
240
  });
191
241
  }
192
242
  printDevices(l) {
193
- let selDeviceId = '___dummy___';
243
+ //let selDeviceId = '___dummy___';
194
244
  for (let i = 0; i < l.length; i++) {
195
245
  let di = l[i];
196
246
  console.log("Audio device: Id: " + di.deviceId + " groupId: " + di.groupId + " label: " + di.label + " kind: " + di.kind);
197
247
  }
198
248
  }
199
249
  open(channelCount, selDeviceId, autoGainControlConfigs) {
200
- this.context.resume().then(() => {
250
+ //console.debug("Capture open: ctx state: "+this.context.state);
251
+ if (this.context.state !== 'running') {
252
+ //console.debug("Capture open: Resume context");
253
+ this.context.resume().then(() => {
254
+ //console.debug("Capture open (ctx resumed): ctx state: "+this.context.state);
255
+ this._open(channelCount, selDeviceId, autoGainControlConfigs);
256
+ });
257
+ }
258
+ else {
201
259
  this._open(channelCount, selDeviceId, autoGainControlConfigs);
202
- });
260
+ }
203
261
  }
204
262
  _open(channelCount, selDeviceId, autoGainControlConfigs) {
205
263
  this.channelCount = channelCount;
@@ -305,8 +363,8 @@ export class AudioCapture {
305
363
  }
306
364
  else if (ua.detectedBrowser === Browser.Safari) {
307
365
  console.info("Setting media track constraints for Safari browser.");
308
- console.info("Apply workaround for Safari: Avoid disconnect of streams.");
309
- this.disconnectStreams = false;
366
+ //console.info("Apply workaround for Safari: Avoid disconnect of streams.");
367
+ this.disconnectStreams = true;
310
368
  msc = {
311
369
  audio: {
312
370
  deviceId: selDeviceId,
@@ -360,7 +418,7 @@ export class AudioCapture {
360
418
  // The ScriptProcessorNode Interface - DEPRECATED
361
419
  // Update 06-2021
362
420
  // AudioWorkletProcessor is here to stay. Web Audio API has now Recommendation status !
363
- if (ENABLE_AUDIO_WORKLET && this.context.audioWorklet) {
421
+ if (this.context.audioWorklet) {
364
422
  //const workletFileName = ('file-loader!./interceptor_worklet.js');
365
423
  //const workletFileName = 'http://localhost:4200/assets/interceptor_worklet.js';
366
424
  //console.log(awpStr);
@@ -388,35 +446,77 @@ export class AudioCapture {
388
446
  if (DEBUG_TRACE_LEVEL > 8) {
389
447
  console.debug('Received data from worklet: ' + chs + ' ' + dt.len + ' Data chs: ' + adaLen);
390
448
  }
391
- //let chunkLen = adaLen / chs;
392
- let chunkLen = adaLen;
393
449
  let chunk = new Array(chs);
450
+ const samples = this.framesRecorded * chs;
451
+ if ((AudioStorageType.MEM_ENTIRE_AUTO_NET_CHUNKED === this.audioStorageType || AudioStorageType.MEM_CHUNKED_AUTO_NET_CHUNKED === this.audioStorageType) && this.data && samples > this._maxAutoNetMemStoreSamples) {
452
+ this.data = null;
453
+ }
454
+ //console.debug("Data initialized: "+(this.data!=null));
394
455
  for (let ch = 0; ch < chs; ch++) {
395
- if (this.data && this.data[ch]) {
396
- let adaPos = ch * chunkLen;
456
+ //console.debug("Data ch initialized: "+(this.data !=null && this.data[ch] !=null));
457
+ if (ch < this.channelCount) {
397
458
  if (dt.data[ch]) {
398
459
  let fa = new Float32Array(dt.data[ch]);
399
- this.data[ch].push(fa);
460
+ if (this.data && this.data[ch]) {
461
+ this.data[ch].push(fa);
462
+ }
400
463
  chunk[ch] = fa;
401
464
  // Use samples of channel 0 to count frames (samples)
402
465
  if (ch == 0) {
403
466
  this.framesRecorded += fa.length;
404
467
  }
405
468
  }
469
+ }
470
+ }
471
+ if (this.audioOutStream) {
472
+ try {
473
+ this.audioOutStream.write(chunk);
474
+ // // Random test error:
475
+ // if(Math.random()>0.98) {
476
+ // throw new Error('Test');
477
+ // }
478
+ }
479
+ catch (err) {
480
+ if (err instanceof Error) {
481
+ this.persistError = err;
482
+ }
406
483
  else {
407
- if (DEBUG_TRACE_LEVEL > 8) {
408
- console.debug('Channel ' + ch + ' data not set!!');
484
+ this.persistError = new Error('Error handling recorded audio data');
485
+ }
486
+ console.error("Capture error: " + err);
487
+ try {
488
+ this.stop();
489
+ }
490
+ catch (err2) {
491
+ console.error("Capture next error (ignored): " + err2);
492
+ }
493
+ finally {
494
+ if (this.listener) {
495
+ let errExpl = '';
496
+ if (err instanceof DOMException) {
497
+ errExpl = ': ' + err.name + ': ' + err.message;
498
+ }
499
+ this.listener.error("Could not handle recorded audio data" + errExpl, "Please try to record again.");
500
+ }
501
+ else {
502
+ this.close();
409
503
  }
410
504
  }
411
505
  }
412
506
  }
413
- if (this.audioOutStream) {
414
- this.audioOutStream.write(chunk);
507
+ if (AudioStorageType.DB_CHUNKED === this._audioStorageType && this._persistentAudioStorageTarget) {
508
+ this.store();
415
509
  }
416
510
  }
417
511
  };
418
512
  }
513
+ // Tried to fix that Safari does not record the second channel
514
+ // Does not help
515
+ //awn.channelCount=this.channelCount;
516
+ //awn.channelCountMode='explicit';
517
+ //console.debug('Channel count explicitly set to '+this.channelCount);
419
518
  this.bufferingNode = awn;
519
+ //this.bufferingNode.channelCount=this.channelCount;
420
520
  this._opened = true;
421
521
  if (this.listener) {
422
522
  this.listener.opened();
@@ -435,14 +535,15 @@ export class AudioCapture {
435
535
  scriptProcessorNode.onaudioprocess = (e) => {
436
536
  if (this.capturing) {
437
537
  let inBuffer = e.inputBuffer;
438
- let duration = inBuffer.duration;
439
538
  // only process requested count of channels
440
539
  let currentBuffers = new Array(channelCount);
441
540
  for (let ch = 0; ch < channelCount; ch++) {
442
541
  let chSamples = inBuffer.getChannelData(ch);
443
542
  let chSamplesCopy = chSamples.slice(0);
444
543
  currentBuffers[ch] = chSamplesCopy.slice(0);
445
- this.data[ch].push(chSamplesCopy);
544
+ if (this.data) {
545
+ this.data[ch].push(chSamplesCopy);
546
+ }
446
547
  if (DEBUG_TRACE_LEVEL > 8) {
447
548
  console.debug("Process " + chSamplesCopy.length + " samples.");
448
549
  }
@@ -485,7 +586,7 @@ export class AudioCapture {
485
586
  }
486
587
  });
487
588
  }
488
- start() {
589
+ _start() {
489
590
  this.initData();
490
591
  if (this.audioOutStream) {
491
592
  this.audioOutStream.nextStream();
@@ -499,82 +600,205 @@ export class AudioCapture {
499
600
  this.listener.started();
500
601
  }
501
602
  }
603
+ start() {
604
+ const aSt = this.context.state;
605
+ if (aSt === 'running') {
606
+ this._start();
607
+ }
608
+ else {
609
+ console.debug("Capture start: audio context not running, state: " + aSt + ", resuming...");
610
+ this.context.resume().then(() => {
611
+ console.debug("Capture start: audio context resumed, starting...");
612
+ this._start();
613
+ });
614
+ }
615
+ }
502
616
  stop() {
503
617
  if (this.disconnectStreams && this.bufferingNode) {
504
618
  this.mediaStream.disconnect(this.bufferingNode);
505
619
  this.bufferingNode.disconnect(this.context.destination);
506
620
  }
507
- if (this.audioOutStream) {
508
- this.audioOutStream.flush();
621
+ try {
622
+ if (this.audioOutStream) {
623
+ this.audioOutStream.flush();
624
+ }
509
625
  }
510
- this.capturing = false;
511
- if (this.listener) {
512
- this.listener.stopped();
626
+ catch (err) {
627
+ console.error("Could not flush capture stream.");
628
+ throw err;
629
+ }
630
+ finally {
631
+ this.capturing = false;
632
+ if (this.inddbAudioBuffer && this.persistError) {
633
+ // Delete invalid persistent audio data and hope that it will be completely uploaded to the server
634
+ this.inddbAudioBuffer.releaseAudioData();
635
+ this.inddbAudioBuffer = null;
636
+ }
637
+ if (this.listener && (this.persistError || this.persisted)) {
638
+ //console.debug("Stopped by stop() method call");
639
+ this.listener.stopped();
640
+ }
641
+ }
642
+ }
643
+ store() {
644
+ // if(this.db && this.recUUID){
645
+ // let tr= this.db.transaction(SprDb.RECORDING_FILE_CHUNKS_OBJECT_STORE_NAME, 'readwrite');
646
+ // let recFileObjStore = tr.objectStore(SprDb.RECORDING_FILE_CHUNKS_OBJECT_STORE_NAME);
647
+ //
648
+ // try {
649
+ // let ch0Data=this.data[0];
650
+ // let dataChkCnt=ch0Data.length;
651
+ // let pos = 0;
652
+ // for (let chCkIdx = 0; chCkIdx < dataChkCnt; chCkIdx++) {
653
+ // let bufLen=0;
654
+ // for (let ch = 0; ch < this.channelCount; ch++) {
655
+ // let chChk = this.data[ch][chCkIdx];
656
+ // bufLen = chChk.length;
657
+ // //let cacheId = uuid + '_' + ch + '_' + chCkIdx;
658
+ // let chkDbId = [this.recUUID, this.indDbChkIdx + chCkIdx, ch];
659
+ // let cr = recFileObjStore.add(chChk, chkDbId);
660
+ // //console.debug("Added: "+ch+" "+(this.indDbChkIdx+chCkIdx));
661
+ // cr.onsuccess=()=>{
662
+ // //console.debug("Stored audio data to indexed db");
663
+ // }
664
+ // cr.onerror=()=>{
665
+ // console.error("Error storing audio data to indexed db");
666
+ // }
667
+ // }
668
+ // pos += bufLen;
669
+ // }
670
+ // this.indDbChkIdx+=dataChkCnt;
671
+ //
672
+ // tr.onerror = (err) => {
673
+ // console.error('Failed to cache audio data to indexed db: ' + err)
674
+ // }
675
+ // tr.oncomplete = () => {
676
+ // //console.debug('Transferred capture audio data to indexed db, deleting original data from memory...');
677
+ //
678
+ // /// Audio data saved to index db delete from in memory data array
679
+ // for (let ch = 0; ch < this.channelCount; ch++) {
680
+ // this.data[ch].splice(0);
681
+ // //console.debug("Spliced/removed ch: "+ch);
682
+ // }
683
+ //
684
+ // this.persisted=true;
685
+ // if(this.listener && !this.capturing){
686
+ // //console.debug("Stopped by indexed db hook");
687
+ // this.listener.stopped();
688
+ // }
689
+ // }
690
+ // // Commit chunks
691
+ // this.persisted=false;
692
+ // tr.commit();
693
+ // } catch (err) {
694
+ // console.error('Transfer capture audio data error: '+err);
695
+ // }
696
+ // }
697
+ // if(!this.inddbAudioBuffer && this._persistentAudioStorageTarget && this.recUUID) {
698
+ // this.inddbAudioBuffer = new IndexedDbAudioBuffer(this._persistentAudioStorageTarget, this.channelCount,this.currentSampleRate,AudioCapture.BUFFER_SIZE,0,this.recUUID)
699
+ // }
700
+ if (this.inddbAudioBuffer && this.data) {
701
+ // Try to append to
702
+ this.inddbAudioBuffer.appendRawAudioData(this.data).subscribe({
703
+ complete: () => {
704
+ //console.debug('Transferred capture audio data to indexed db, deleting original data from memory...');
705
+ /// Audio data saved to index db delete from in memory data array
706
+ if (this.data) {
707
+ for (let ch = 0; ch < this.channelCount; ch++) {
708
+ this.data[ch].splice(0);
709
+ //console.debug("Spliced/removed ch: "+ch);
710
+ }
711
+ }
712
+ this.persisted = true;
713
+ if (this.listener && !this.capturing) {
714
+ //console.debug("Stopped by indexed db hook");
715
+ this.listener.stopped();
716
+ }
717
+ }, error: (err) => {
718
+ // Only log the first error
719
+ if (!this.persistError) {
720
+ this.persistError = err;
721
+ console.error("Error persisting audio data: " + err);
722
+ }
723
+ }
724
+ });
725
+ this.persisted = false;
513
726
  }
514
727
  }
515
728
  close() {
516
729
  this.mediaStream.disconnect();
517
730
  if (this.stream) {
518
- //this.stream.stop();
519
- //'MediaStream.stop()' is deprecated and will be removed in M47, around November 2015. Please use 'MediaStream.active' instead.
520
- //this.stream.active=false;
521
- var mts = this.stream.getTracks();
522
- for (var i = 0; i < mts.length; i++) {
731
+ const mts = this.stream.getTracks();
732
+ for (let i = 0; i < mts.length; i++) {
523
733
  mts[i].stop();
524
734
  }
525
735
  }
526
736
  this._opened = false;
527
737
  }
528
738
  audioBuffer() {
529
- let frameLen = 0;
530
- let ch0Data = this.data[0];
531
- for (let ch0Chk of ch0Data) {
532
- frameLen += ch0Chk.length;
533
- }
534
- let ab;
535
- try {
536
- ab = this.context.createBuffer(this.channelCount, frameLen, this.context.sampleRate);
537
- }
538
- catch (err) {
539
- if (err instanceof DOMException) {
540
- if (err.name === 'NotSupportedError') {
541
- if (frameLen == 0) {
542
- // Empty buffers are not supported by Chromium
543
- // Create dummy buffer with one sample
544
- ab = this.context.createBuffer(this.channelCount, 1, this.context.sampleRate);
739
+ let ab = null;
740
+ if (this.data) {
741
+ let frameLen = 0;
742
+ let ch0Data = this.data[0];
743
+ for (let ch0Chk of ch0Data) {
744
+ frameLen += ch0Chk.length;
745
+ }
746
+ try {
747
+ ab = this.context.createBuffer(this.channelCount, frameLen, this.context.sampleRate);
748
+ }
749
+ catch (err) {
750
+ if (err instanceof DOMException) {
751
+ if (err.name === 'NotSupportedError') {
752
+ if (frameLen == 0) {
753
+ // Empty buffers are not supported by Chromium
754
+ // Create dummy buffer with one sample
755
+ ab = this.context.createBuffer(this.channelCount, 1, this.context.sampleRate);
756
+ }
757
+ else {
758
+ throw err;
759
+ }
545
760
  }
546
761
  else {
547
762
  throw err;
548
763
  }
549
764
  }
765
+ else if (err instanceof RangeError) {
766
+ // Out of memory
767
+ // TODO What to do ??
768
+ throw err;
769
+ }
550
770
  else {
551
771
  throw err;
552
772
  }
553
773
  }
554
- else if (err instanceof RangeError) {
555
- // Out of memory
556
- // TODO What to do ??
557
- throw err;
558
- }
559
- else {
560
- throw err;
561
- }
562
- }
563
- for (let ch = 0; ch < this.channelCount; ch++) {
564
- let chD = ab.getChannelData(ch);
565
- let pos = 0;
566
- for (let chChk of this.data[ch]) {
567
- let bufLen = chChk.length;
568
- chD.set(chChk, pos);
569
- pos += bufLen;
774
+ for (let ch = 0; ch < this.channelCount; ch++) {
775
+ let chD = ab.getChannelData(ch);
776
+ let pos = 0;
777
+ for (let chChk of this.data[ch]) {
778
+ let bufLen = chChk.length;
779
+ chD.set(chChk, pos);
780
+ pos += bufLen;
781
+ }
570
782
  }
571
783
  }
572
784
  return ab;
573
785
  }
574
786
  audioBufferArray() {
575
- let aba = new ArrayAudioBuffer(this.channelCount, this.currentSampleRate, this.data);
576
- return aba;
787
+ let arrAb = null;
788
+ if (this.data) {
789
+ arrAb = new ArrayAudioBuffer(this.channelCount, this.currentSampleRate, this.data);
790
+ }
791
+ return arrAb;
792
+ }
793
+ inddbAudioBufferArray() {
794
+ if (this.persistError) {
795
+ return null;
796
+ }
797
+ else {
798
+ return this.inddbAudioBuffer;
799
+ }
577
800
  }
578
801
  }
579
802
  AudioCapture.BUFFER_SIZE = 8192;
580
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQXdCLFFBQVEsSUFBSSxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2RCxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBQyxLQUFLLENBQUM7QUFFOUQsTUFBTSxpQkFBaUIsR0FBQyxDQUFDLENBQUM7QUFFMUIsTUFBTSxvQkFBb0IsR0FBQyxJQUFJLENBQUM7QUFFaEMsc0NBQXNDO0FBQ3RDLHdEQUF3RDtBQUN4RCxNQUFNLE1BQU0sR0FBQyx5RUFBeUU7SUFDbEYsSUFBSTtJQUNKLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIscUVBQXFFO0lBQ3JFLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsSUFBSTtJQUNKLFNBQVM7SUFDVCxJQUFJO0lBQ0osYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLFFBQVE7SUFDUixJQUFJO0lBQ0oscUNBQXFDO0lBQ3JDLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsNkJBQTZCO0lBQzdCLDBCQUEwQjtJQUMxQixvQ0FBb0M7SUFDcEMsMENBQTBDO0lBQzFDLG9DQUFvQztJQUNwQyx5Q0FBeUM7SUFDekMsMkNBQTJDO0lBQzNDLHVEQUF1RDtJQUN2RCxjQUFjO0lBQ2QsVUFBVTtJQUNWLGlFQUFpRTtJQUNqRSxtREFBbUQ7SUFDbkQsK0JBQStCO0lBQy9CLDJEQUEyRDtJQUMzRCw0RUFBNEU7SUFDNUUsb0NBQW9DO0lBQ3BDLHVDQUF1QztJQUN2QyxjQUFjO0lBQ2QsVUFBVTtJQUNWLCtEQUErRDtJQUMvRCxpREFBaUQ7SUFDakQsbUNBQW1DO0lBQ25DLDZDQUE2QztJQUM3Qyx3REFBd0Q7SUFDeEQseURBQXlEO0lBQ3pELGNBQWM7SUFDZCxvQ0FBb0M7SUFDcEMsMkJBQTJCO0lBQzNCLG1DQUFtQztJQUNuQyxvQ0FBb0M7SUFDcEMscUJBQXFCO0lBQ3JCLHlDQUF5QztJQUN6QyxnQ0FBZ0M7SUFDaEMsbUNBQW1DO0lBQ25DLFVBQVU7SUFDVixJQUFJO0lBQ0osMENBQTBDO0lBQzFDLHdEQUF3RDtJQUN4RCxnQ0FBZ0M7SUFDaEMsMkNBQTJDO0lBQzNDLGdEQUFnRDtJQUNoRCwrREFBK0Q7SUFDL0QsY0FBYztJQUNkLHNDQUFzQztJQUN0QyxnREFBZ0Q7SUFDaEQsVUFBVTtJQUNWLFFBQVE7SUFDUixxQkFBcUI7SUFDckIsT0FBTztJQUNQLEtBQUs7SUFDTCxJQUFJO0lBQ0osOEVBQThFLENBQUM7QUFpQm5GLE1BQU0sT0FBTyxZQUFZO0lBdUJ2QixZQUFZLE9BQXFCO1FBYmpDLGNBQVMsR0FBYyxJQUFJLENBQUM7UUFDNUIsa0JBQWEsR0FBaUIsSUFBSSxDQUFDO1FBS25DLG1CQUFjLEdBQXVDLElBQUksQ0FBQztRQUNsRCxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDekIsWUFBTyxHQUFDLEtBQUssQ0FBQztRQUNkLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUIsbUJBQWMsR0FBUyxDQUFDLENBQUM7UUFHdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQXpCRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQXlCTyxRQUFRO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEtBQUssRUFBdUIsQ0FBQztRQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBZ0IsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVc7UUFDVCxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFTyxZQUFZO1FBQ2xCLHFDQUFxQztRQUNyQyx3QkFBd0I7UUFDeEIsSUFBSSxjQUFjLEdBQTJCLEVBQUMsS0FBSyxFQUMvQyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUM7U0FDM0IsQ0FBQztRQUNGLE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFN0QsQ0FBQztJQUdPLG9CQUFvQixDQUFDLFdBQXVCO1FBQ2hELElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQyxzREFBc0Q7WUFDdEQsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFrRCxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUMsV0FBd0I7UUFFbkcsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUN0RSxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUU7b0JBQ1osZUFBZSxHQUFHLElBQUksQ0FBQztpQkFDeEI7YUFDRjtZQUNELElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BCLHVEQUF1RDtnQkFDdkQsSUFBSSxLQUFLLEVBQUU7b0JBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO29CQUV0RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBYyxFQUFFLEVBQUU7d0JBQzVDLDBCQUEwQjt3QkFFMUIsSUFBRyxDQUFDLEVBQUU7NEJBQ0osd0RBQXdEO3lCQUN6RDs2QkFBSTs0QkFDSCxrQ0FBa0M7eUJBQ25DO3dCQUNELG9CQUFvQjt3QkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ1QsMENBQTBDO3dCQUMxQyxzQkFBc0I7d0JBQ3RCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDWCxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ1Y7YUFDRjtpQkFBTTtnQkFDTCxVQUFVO2dCQUNWLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNQO1lBQ0QsSUFBRyxXQUFXLEVBQUM7Z0JBQ2IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxFQUFDLENBQUMsTUFBTSxFQUFDLEVBQUU7WUFDVixVQUFVO1lBQ1YscURBQXFEO1lBQ3JELElBQUksS0FBSyxFQUFFO2dCQUNULHlFQUF5RTtnQkFDekUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWMsRUFBRSxFQUFFO29CQUMxQywwQkFBMEI7b0JBQzFCLGlDQUFpQztvQkFDakMsSUFBRyxDQUFDLEVBQUU7d0JBQ0osd0RBQXdEO3FCQUN6RDt5QkFBSTt3QkFDSCxrQ0FBa0M7cUJBQ25DO29CQUNELG9CQUFvQjtvQkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ1YsMENBQTBDO29CQUMxQyxzQkFBc0I7b0JBQ3RCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNWO1lBQ0QsSUFBRyxXQUFXLEVBQUM7Z0JBQ2IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFJTCxDQUFDO0lBR0QsWUFBWSxDQUFDLENBQW9CO1FBQy9CLElBQUksV0FBVyxHQUFHLGFBQWEsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFZCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxRQUFRLEdBQUcsWUFBWSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzSDtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsWUFBb0IsRUFBRSxXQUEwQyxFQUFDLHNCQUFtRTtRQUNySSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUMsV0FBVyxFQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQW9CLEVBQUUsV0FBMEMsRUFBQyxzQkFBbUU7UUFDeEksSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEIsb0NBQW9DO1FBQ3BDLGNBQWM7UUFDZCxvQkFBb0I7UUFDcEIsbUJBQW1CO1FBRW5CLHNEQUFzRDtRQUN0RCx3SEFBd0g7UUFFeEgsK0RBQStEO1FBQy9ELDJEQUEyRDtRQUMzRCxxR0FBcUc7UUFFckcsd0RBQXdEO1FBQ3hELG9DQUFvQztRQUVwQyxJQUFJLEdBQTBCLENBQUM7UUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRy9DLElBQUksRUFBRSxHQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXBDLCtCQUErQjtRQUMvQiw0Q0FBNEM7UUFDNUMsS0FBSztRQUVOLElBQUksTUFBTSxHQUE0QixJQUFJLENBQUM7UUFFNUMsSUFBSSxlQUFlLEdBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksc0JBQXNCLEdBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUcsc0JBQXNCLEVBQUM7WUFDeEIsS0FBSSxJQUFJLElBQUksSUFBSSxzQkFBc0IsRUFBQztnQkFDckMsSUFBRyxJQUFJLENBQUMsUUFBUSxLQUFHLFdBQVcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLGdCQUFnQixLQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUM7b0JBQzdFLE1BQU0sR0FBQyxJQUFJLENBQUM7b0JBQ1osTUFBTTtpQkFDVDtnQkFDRCxJQUFHLElBQUksQ0FBQyxRQUFRLEtBQUcsV0FBVyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEtBQUcsUUFBUSxDQUFDLE9BQU8sRUFBQztvQkFDL0UsTUFBTSxHQUFDLElBQUksQ0FBQztvQkFDWixNQUFNO2lCQUNQO2FBQ0Y7WUFDRCxJQUFHLE1BQU0sRUFBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLGVBQWUsR0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM3QixJQUFHLDBDQUEwQyxFQUFDO29CQUM1QyxzQkFBc0IsR0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUNyQztnQkFDRCw2QkFBNkI7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUM3QjtpQkFBSTtnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFDLEtBQUssQ0FBQzthQUN0QjtTQUNGO1FBRUQsVUFBVTtRQUNWLEdBQUcsR0FBRztZQUNKLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsV0FBVztnQkFDckIsZ0JBQWdCLEVBQUUsS0FBSztnQkFDdkIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLGVBQWUsRUFBRSxlQUFlO2FBQ2pDO1lBQ0QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBRUYsSUFBSSxFQUFFLENBQUMsZUFBZSxLQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFFckMsd0NBQXdDO1lBQ3hDLDhDQUE4QztZQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDcEUsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsV0FBVztvQkFDckIsZ0JBQWdCLEVBQUUsS0FBSztvQkFDdkIsWUFBWSxFQUFFLFlBQVk7b0JBQzFCLGVBQWUsRUFBRSxlQUFlO2lCQUNqQztnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUM7U0FDSDthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzlDLG9GQUFvRjtZQUNwRixPQUFPLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFFbkUsMEJBQTBCO1lBQzFCLHNEQUFzRDtZQUd0RCw4QkFBOEI7WUFDOUIsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsV0FBVztvQkFDckIsWUFBWSxFQUFFLFlBQVk7b0JBQzFCLGdCQUFnQixFQUFFLEVBQUMsS0FBSyxFQUFDLHNCQUFzQixFQUFDO29CQUNoRCxlQUFlLEVBQUUsRUFBQyxLQUFLLEVBQUMsZUFBZSxFQUFDO29CQUN4QyxVQUFVLEVBQUMsRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFDO2lCQUNyQjtnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUE7U0FFRjthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUNyRSxVQUFVO1lBQ1YsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDSCxRQUFRLEVBQUUsV0FBVztvQkFDckIsWUFBWSxFQUFFLFlBQVk7b0JBQzVCLGdCQUFnQixFQUFFLEtBQUs7b0JBQ3JCLGVBQWUsRUFBRSxlQUFlO29CQUNsQyxnQkFBZ0IsRUFBRSxLQUFLO2lCQUN4QjtnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUE7U0FFRjthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQTtZQUNuRSxPQUFPLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFFMUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixHQUFHLEdBQUc7Z0JBQ0osS0FBSyxFQUFFO29CQUNMLFFBQVEsRUFBRSxXQUFXO29CQUNyQixZQUFZLEVBQUUsWUFBWTtvQkFDMUIsZ0JBQWdCLEVBQUUsS0FBSztpQkFDeEI7Z0JBQ0QsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFBO1NBRUY7YUFBTTtZQUVMLDBEQUEwRDtTQUMzRDtRQUlELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEdBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBR3BELElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV4QixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2xILElBQUksTUFBTSxHQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFFaEMsbUVBQW1FO2dCQUNuRSx1SEFBdUg7Z0JBQ3ZILFlBQVk7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBQyxNQUFNLENBQUMsWUFBWSxHQUFDLFNBQVMsR0FBQyxNQUFNLENBQUMsZUFBZSxHQUFDLG1CQUFtQixHQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoSixJQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUM7b0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztpQkFDdkM7YUFDRjtZQUVELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxRztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCx3Q0FBd0M7WUFDeEMsSUFBSSxrQkFBa0IsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUMvRCxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUQsZUFBZTtZQUNmLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxrQkFBa0IsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsNENBQTRDO1lBQzVDLEVBQUU7WUFDRix1RkFBdUY7WUFDdkYsMERBQTBEO1lBRTVELGtCQUFrQjtZQUNqQixpREFBaUQ7WUFFbEQsaUJBQWlCO1lBQ2pCLHdGQUF3RjtZQUVwRixJQUFHLG9CQUFvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFDO2dCQUNuRCxtRUFBbUU7Z0JBQ25FLGdGQUFnRjtnQkFDaEYsc0JBQXNCO2dCQUN0QixJQUFJLHNCQUFzQixHQUFFLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO2dCQUUxRSxJQUFJLHlCQUF5QixHQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBRWpGLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7b0JBQ2xFLE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO29CQUN0RSxHQUFHLENBQUMsZ0JBQWdCLEdBQUMsQ0FBQyxFQUFRLEVBQUMsRUFBRTt3QkFDL0IsSUFBSSxHQUFHLEdBQUMsZUFBZSxDQUFDO3dCQUN4QixJQUFHLEVBQUUsWUFBWSxVQUFVLEVBQUM7NEJBQzFCLEdBQUcsR0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO3lCQUNoQjt3QkFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNuRCxJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUM7NEJBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQzFCO29CQUNILENBQUMsQ0FBQTtvQkFDRCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNyQixJQUFJLEtBQUssRUFBRTt3QkFDVCxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBcUIsRUFBRSxFQUFFOzRCQUMxQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0NBQ2xCLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2YsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQ0FDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0NBQzVCLElBQUcsaUJBQWlCLEdBQUMsQ0FBQyxFQUFFO29DQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixHQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRSxhQUFhLEdBQUMsTUFBTSxDQUFDLENBQUM7aUNBQ3pGO2dDQUNELDhCQUE4QjtnQ0FDOUIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDO2dDQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBZSxHQUFHLENBQUMsQ0FBQztnQ0FDekMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtvQ0FDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7d0NBQzlCLElBQUksTUFBTSxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUM7d0NBQzNCLElBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTs0Q0FDZCxJQUFJLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NENBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRDQUN2QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOzRDQUNmLHFEQUFxRDs0Q0FDckQsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO2dEQUNYLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQzs2Q0FDbEM7eUNBQ0Y7NkNBQUk7NENBQ0gsSUFBRyxpQkFBaUIsR0FBQyxDQUFDLEVBQUU7Z0RBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFDLEVBQUUsR0FBQyxpQkFBaUIsQ0FBQyxDQUFDOzZDQUNoRDt5Q0FDRjtxQ0FDRjtpQ0FDRjtnQ0FDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0NBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lDQUNsQzs2QkFDRjt3QkFDSCxDQUFDLENBQUM7cUJBQ0g7b0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ3hCO2dCQUNILENBQUMsQ0FDSixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQVUsRUFBQyxFQUFFO29CQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixHQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLENBQUMsQ0FBQzthQUVKO2lCQUFLLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtnQkFDM0Msa0VBQWtFO2dCQUNsRSwrREFBK0Q7Z0JBQy9ELElBQUksbUJBQW1CLEdBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQzlILElBQUksQ0FBQyxhQUFhLEdBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFHLG1CQUFtQixDQUFDLGNBQWMsRUFBQztvQkFDcEMsbUJBQW1CLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBdUIsRUFBRSxFQUFFO3dCQUUvRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7NEJBQ2xCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7NEJBQzdCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7NEJBQ2pDLDJDQUEyQzs0QkFDM0MsSUFBSSxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQWUsWUFBWSxDQUFDLENBQUM7NEJBQzNELEtBQUssSUFBSSxFQUFFLEdBQVcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0NBQ2hELElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQzVDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3ZDLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQ0FDbEMsSUFBRyxpQkFBaUIsR0FBQyxDQUFDLEVBQUM7b0NBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUMsV0FBVyxDQUFDLENBQUM7aUNBQzVEO2dDQUNELElBQUksQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQzs2QkFDN0M7NEJBQ0QsQ0FBQyxFQUFFLENBQUM7NEJBQ0osSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dDQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQzs2QkFDM0M7eUJBQ0Y7b0JBQ0gsQ0FBQyxDQUFDO29CQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ3hCO2lCQUNGO3FCQUFJO29CQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDhGQUE4RixDQUFDLENBQUM7aUJBQ3JIO2FBQ0Y7aUJBQUk7Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZ0dBQWdHLENBQUMsQ0FBQzthQUN2SDtRQUNILENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ1AsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsZUFBZSxHQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUcsaUJBQWlCLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBQztvQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUMsMkZBQTJGLENBQUMsQ0FBQztpQkFDeEo7cUJBQUssSUFBRyxrQkFBa0IsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFDO29CQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBQyxnREFBZ0QsQ0FBQyxDQUFDO2lCQUNoSDtxQkFBSyxJQUFHLHNCQUFzQixLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUM7b0JBQ3pDLElBQUksSUFBSSxHQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLENBQUEsQ0FBQyxDQUFBLDZDQUE2QyxDQUFDO29CQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDM0I7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDdkI7YUFDRjtRQUNILENBQUMsQ0FDSixDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFFSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUE7U0FDakM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN6QjtJQUVILENBQUM7SUFFRCxJQUFJO1FBRUYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6RDtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBR0QsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YscUJBQXFCO1lBQ3JCLCtIQUErSDtZQUMvSCwyQkFBMkI7WUFDM0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2Y7U0FDRjtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxRQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUU7WUFDMUIsUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDM0I7UUFDRCxJQUFJLEVBQWMsQ0FBQztRQUNqQixJQUFJO1lBQ0YsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDdEY7UUFBQSxPQUFNLEdBQUcsRUFBQztZQUNULElBQUcsR0FBRyxZQUFZLFlBQVksRUFBQztnQkFDN0IsSUFBRyxHQUFHLENBQUMsSUFBSSxLQUFHLG1CQUFtQixFQUFDO29CQUNoQyxJQUFHLFFBQVEsSUFBRSxDQUFDLEVBQUM7d0JBQ2IsOENBQThDO3dCQUM5QyxzQ0FBc0M7d0JBQ3RDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUMvRTt5QkFBSTt3QkFDSCxNQUFNLEdBQUcsQ0FBQztxQkFDWDtpQkFDRjtxQkFBSTtvQkFDSCxNQUFNLEdBQUcsQ0FBQztpQkFDWDthQUNGO2lCQUFLLElBQUksR0FBRyxZQUFZLFVBQVUsRUFBQztnQkFDbEMsZ0JBQWdCO2dCQUNoQixxQkFBcUI7Z0JBQ3JCLE1BQU0sR0FBRyxDQUFDO2FBQ1g7aUJBQUk7Z0JBQ0gsTUFBTSxHQUFHLENBQUM7YUFDWDtTQUNGO1FBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQy9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixHQUFHLElBQUksTUFBTSxDQUFDO2FBQ2Y7U0FDRjtRQUNILE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGdCQUFnQjtRQUNaLElBQUksR0FBRyxHQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQzs7QUFwaUJNLHdCQUFXLEdBQVcsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbSwgU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1NdWx0aXBsaWVyfSBmcm9tIFwiLi4vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7QnJvd3NlciwgUGxhdGZvcm0sIFVzZXJBZ2VudEJ1aWxkZXJ9IGZyb20gXCIuLi8uLi91dGlscy91YS1wYXJzZXJcIjtcclxuXHJcbmltcG9ydCB7QXV0b0dhaW5Db250cm9sQ29uZmlnLCBQbGF0Zm9ybSBhcyBDZmdQbGF0Zm9ybX0gZnJvbSBcIi4uLy4uL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdFwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi9hcnJheV9hdWRpb19idWZmZXJcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgQ0hST01FX0FDVElWQVRFX0VDSE9fQ0FOQ0VMTEFUSU9OX1dJVEhfQUdDPWZhbHNlO1xyXG5cclxuY29uc3QgREVCVUdfVFJBQ0VfTEVWRUw9MDtcclxuXHJcbmNvbnN0IEVOQUJMRV9BVURJT19XT1JLTEVUPXRydWU7XHJcblxyXG4vLyBTdXBlciBkaXJ0eSB3YXkgdG8gbG9hZCB0aGlzIG1vZHVsZVxyXG4vLyBDb3B5IGNvbnRlbnQgb2YgaW50ZXJjZXB0b3Jfd29ya2xldC5qcyB0byB0aGlzIHN0cmluZ1xyXG5jb25zdCBhd3BTdHI9XCJjbGFzcyBBdWRpb0NhcHR1cmVJbnRlcmNlcHRvclByb2Nlc3NvciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvcntcXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgIEJVRkZFUl9RVUFOVFVNUz02NDtcXG5cIiArXHJcbiAgICBcIiAgICBRVUFOVFVNX0ZSQU1FX0xFTj0xMjg7XFxuXCIgK1xyXG4gICAgXCIgICAgQlVGRkVSX0ZSQU1FX0xFTj10aGlzLlFVQU5UVU1fRlJBTUVfTEVOKnRoaXMuQlVGRkVSX1FVQU5UVU1TO1xcblwiICtcclxuICAgIFwiICAgIGJ1ZmZlcj1udWxsO1xcblwiICtcclxuICAgIFwiICAgIGJ1ZmZlclBvcz0wO1xcblwiICtcclxuICAgIFwiICAgIGJ1ZmZlclBvc0J5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgY29uc3RydWN0b3IoKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgIHN1cGVyKCk7XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICB9XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiBwcm9jZXNzKFxcblwiICtcclxuICAgIFwiICAgICAgaW5wdXRzLFxcblwiICtcclxuICAgIFwiICAgICAgb3V0cHV0cyxcXG5cIiArXHJcbiAgICBcIiAgICAgIHBhcmFtZXRlcnNcXG5cIiArXHJcbiAgICBcIiAgKXtcXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgICBsZXQgaW5wdXRzQ250PWlucHV0cy5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBjaGFubmVsQ291bnQ9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGlucHV0TGVuPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBpbnB1dExlbkJ5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIGlmKGlucHV0c0NudD4wKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBsZXQgaW5wdXQwID0gaW5wdXRzWzBdO1xcblwiICtcclxuICAgIFwiICAgICAgICAgY2hhbm5lbENvdW50ID0gaW5wdXQwLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPiAwKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGV0IGlucHV0MGNoMD1pbnB1dDBbMF07XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgaW5wdXRMZW49aW5wdXQwY2gwLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBpbnB1dExlbkJ5dGVzPWlucHV0MGNoMC5idWZmZXIubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIGlmICghdGhpcy5idWZmZXIgfHwgdGhpcy5idWZmZXIubGVuZ3RoIDwgY2hhbm5lbENvdW50KSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShjaGFubmVsQ291bnQpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3MgPSAwXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBmb3IgKGxldCBiY2ggPSAwOyBiY2ggPCBjaGFubmVsQ291bnQ7IGJjaCsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJbYmNoXSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5CVUZGRVJfRlJBTUVfTEVOKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IDA7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJQb3NCeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBidWZBdmFpbCA9IHRoaXMuQlVGRkVSX0ZSQU1FX0xFTiAtIHRoaXMuYnVmZmVyUG9zO1xcblwiICtcclxuICAgIFwiICAgICAvLyBjaGVjayBpZiBidWZmZXIgaGFzIHRvIGJlIHRyYW5zZmVycmVkXFxuXCIgK1xyXG4gICAgXCIgICAgIGlmIChpbnB1dExlbiA+IGJ1ZkF2YWlsKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBsZXQgYWRhPW5ldyBBcnJheShjaGFubmVsQ291bnQpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGFkYVtjaF09dGhpcy5idWZmZXJbY2hdLmJ1ZmZlci5zbGljZSgwKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgZGF0YTogYWRhLFxcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGNoczogY2hhbm5lbENvdW50LFxcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGxlbjogdGhpcy5idWZmZXJQb3NcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH0sIGFkYSk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAvLyBidWZmZXIgdHJhbnNmZXJyZWQsIHJlc2V0XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IDA7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvc0J5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgICBmb3IobGV0IGlpPTA7aWk8aW5wdXRzQ250O2lpKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICAvLyBNdXRlIG91dHB1dHNcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICAvL291dHB1dHNbaWldW2NoXS5maWxsKDApO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGxldCBjaFNhbXBsZXMgPSBpbnB1dHNbaWldW2NoXTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltjaF0uc2V0KGNoU2FtcGxlcyx0aGlzLmJ1ZmZlclBvcyk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvcys9aW5wdXRMZW47XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvc0J5dGVzKz1pbnB1dExlbkJ5dGVzO1xcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgXFxuXCIgK1xyXG4gICAgXCIgICAgIHJldHVybiB0cnVlO1xcblwiICtcclxuICAgIFwiICB9XFxuXCIgK1xyXG4gICAgXCJ9XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcInJlZ2lzdGVyUHJvY2Vzc29yKCdjYXB0dXJlLWludGVyY2VwdG9yJyxBdWRpb0NhcHR1cmVJbnRlcmNlcHRvclByb2Nlc3Nvcik7XFxuXCI7XHJcblxyXG5cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvQ2FwdHVyZUxpc3RlbmVyIHtcclxuICBvcGVuZWQoKTogdm9pZDtcclxuXHJcbiAgc3RhcnRlZCgpOiB2b2lkO1xyXG5cclxuICBzdG9wcGVkKCk6IHZvaWQ7XHJcblxyXG4gIGNsb3NlZCgpOiB2b2lkO1xyXG5cclxuICBlcnJvcihtc2c/OnN0cmluZyxhZHZpY2U/OnN0cmluZyk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NhcHR1cmUge1xyXG4gIGdldCBvcGVuZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3BlbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIEJVRkZFUl9TSVpFOiBudW1iZXIgPSA4MTkyO1xyXG4gIGNvbnRleHQ6IEF1ZGlvQ29udGV4dDtcclxuICBzdHJlYW0hOiBNZWRpYVN0cmVhbTtcclxuICBjaGFubmVsQ291bnQhOiBudW1iZXI7XHJcbiAgbWVkaWFTdHJlYW06IGFueTtcclxuICBhZ2NTdGF0dXM6Ym9vbGVhbnxudWxsPW51bGw7XHJcbiAgYnVmZmVyaW5nTm9kZTogQXVkaW9Ob2RlfG51bGw9bnVsbDtcclxuICBsaXN0ZW5lciE6IEF1ZGlvQ2FwdHVyZUxpc3RlbmVyO1xyXG4gIGRhdGEhOiBBcnJheTxBcnJheTxGbG9hdDMyQXJyYXk+PjtcclxuICBjdXJyZW50U2FtcGxlUmF0ZSE6IG51bWJlcjtcclxuICBuOiBOYXZpZ2F0b3I7XHJcbiAgYXVkaW9PdXRTdHJlYW06IFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZGlzY29ubmVjdFN0cmVhbXMgPSB0cnVlO1xyXG4gIHByaXZhdGUgX29wZW5lZD1mYWxzZTtcclxuICBwcml2YXRlIGNhcHR1cmluZyA9IGZhbHNlO1xyXG5cclxuICBmcmFtZXNSZWNvcmRlZDogbnVtYmVyPTA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IEF1ZGlvQ29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMubiA9IG5hdmlnYXRvcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XHJcbiAgICB0aGlzLmRhdGEgPSBuZXcgQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVsQ291bnQ7IGkrKykge1xyXG4gICAgICB0aGlzLmRhdGEucHVzaChuZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgPSAwO1xyXG4gIH1cclxuXHJcbiAgbGlzdERldmljZXMoKSB7XHJcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKChsOiBNZWRpYURldmljZUluZm9bXSkgPT4gdGhpcy5wcmludERldmljZXMobCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkdW1teVNlc3Npb24oKTpQcm9taXNlPE1lZGlhU3RyZWFtPntcclxuICAgIC8vIHdvcmthcm91bmQgdG8gcmVxdWVzdCBwZXJtaXNzaW9uczpcclxuICAgIC8vIFN0YXJ0IGEgZHVtbXkgc2Vzc2lvblxyXG4gICAgbGV0IG1lZGlhU3RyQ25zdHJzID0gPE1lZGlhU3RyZWFtQ29uc3RyYWludHM+e2F1ZGlvOlxyXG4gICAgICAgIHtlY2hvQ2FuY2VsYXRpb246IGZhbHNlfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtZWRpYVN0ckNuc3Rycyk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc3RvcEFsbFNlc3Npb25UcmFja3MobWVkaWFTdHJlYW06TWVkaWFTdHJlYW0pe1xyXG4gICAgICBsZXQgYXRzID0gbWVkaWFTdHJlYW0uZ2V0VHJhY2tzKCk7XHJcbiAgICAgIGZvciAobGV0IGF0SWR4ID0gMDsgYXRJZHggPCBhdHMubGVuZ3RoOyBhdElkeCsrKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RvcCBkdW1teSBzZXNzaW9uIHRyYWNrOiAjXCIgKyBhdElkeClcclxuICAgICAgICBhdHNbYXRJZHhdLnN0b3AoKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgZGV2aWNlSW5mb3MoY2I6IChkZXZpY2VJbmZvczogTWVkaWFEZXZpY2VJbmZvW10gfCBudWxsKSA9PiBhbnksIHJldHJ5ID0gdHJ1ZSxkdW1teVN0cmVhbT86TWVkaWFTdHJlYW0pIHtcclxuXHJcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKChsOiBNZWRpYURldmljZUluZm9bXSkgPT4ge1xyXG4gICAgICBsZXQgbGFiZWxzQXZhaWxhYmxlID0gZmFsc2U7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBkaSA9IGxbaV07XHJcbiAgICAgICAgaWYgKGRpLmxhYmVsKSB7XHJcbiAgICAgICAgICBsYWJlbHNBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWxhYmVsc0F2YWlsYWJsZSkge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk1lZGlhIGRldmljZSBlbnVtZXJhdGlvbjogTm8gbGFiZWxzLlwiKVxyXG4gICAgICAgIGlmIChyZXRyeSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCJTdGFydGluZyBkdW1teSBzZXNzaW9uIHRvIHJlcXVlc3QgYXVkaW8gcGVybWlzc2lvbnMuLi5cIilcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZHVtbXlTZXNzaW9uKCkudGhlbigoczogTWVkaWFTdHJlYW0pID0+IHtcclxuICAgICAgICAgICAgLy8gYW5kIHN0b3AgaXQgaW1tZWRpYXRlbHlcclxuXHJcbiAgICAgICAgICAgIGlmKHMpIHtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJHb3QgZHVtbXkgc2Vzc2lvbiBzdHJlYW06IFwiICsgcyArIFwiIC5cIilcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTm8gZHVtbXkgc3RyZWFtXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcmV0cnkgKG9ubHkgb25jZSlcclxuICAgICAgICAgICAgdGhpcy5kZXZpY2VJbmZvcyhjYiwgZmFsc2Uscyk7XHJcbiAgICAgICAgICB9LHJlYXNvbiA9PiB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkR1bW15IHNlc3Npb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgICAgICAgIC8vIFRPRE8gZXJyb3IgY2FsbGJhY2tcclxuICAgICAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHN1Y2Nlc3NcclxuICAgICAgICBjYihsKTtcclxuICAgICAgfVxyXG4gICAgICBpZihkdW1teVN0cmVhbSl7XHJcbiAgICAgICAgdGhpcy5zdG9wQWxsU2Vzc2lvblRyYWNrcyhkdW1teVN0cmVhbSk7XHJcbiAgICAgIH1cclxuICAgIH0sKHJlYXNvbik9PiB7XHJcbiAgICAgIC8vcmVqZWN0ZWRcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTWVkaWEgZGV2aWNlIGVudW1lcmF0aW9uIHJlamVjdGVkLlwiKVxyXG4gICAgICBpZiAocmV0cnkpIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdGFydGluZyBkdW1teSBzZXNzaW9uIHRvIHJlcXVlc3QgYXVkaW8gcGVybWlzc2lvbnMuLi5cIilcclxuICAgICAgICB0aGlzLmR1bW15U2Vzc2lvbigpLnRoZW4oKHM6IE1lZGlhU3RyZWFtKSA9PiB7XHJcbiAgICAgICAgICAvLyBhbmQgc3RvcCBpdCBpbW1lZGlhdGVseVxyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbi5cIilcclxuICAgICAgICAgIGlmKHMpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiR290IGR1bW15IHNlc3Npb24gc3RyZWFtOiBcIiArIHMgKyBcIiAuXCIpXHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTm8gZHVtbXkgc3RyZWFtXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyByZXRyeSAob25seSBvbmNlKVxyXG4gICAgICAgICAgdGhpcy5kZXZpY2VJbmZvcyhjYiwgZmFsc2Uscyk7XHJcbiAgICAgICAgfSwgcmVhc29uID0+IHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkR1bW15IHNlc3Npb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgICAgICAvLyBUT0RPIGVycm9yIGNhbGxiYWNrXHJcbiAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYihudWxsKTtcclxuICAgICAgfVxyXG4gICAgICBpZihkdW1teVN0cmVhbSl7XHJcbiAgICAgICAgdGhpcy5zdG9wQWxsU2Vzc2lvblRyYWNrcyhkdW1teVN0cmVhbSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHByaW50RGV2aWNlcyhsOiBNZWRpYURldmljZUluZm9bXSk6IHZvaWQge1xyXG4gICAgbGV0IHNlbERldmljZUlkID0gJ19fX2R1bW15X19fJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgZGkgPSBsW2ldO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXCJBdWRpbyBkZXZpY2U6IElkOiBcIiArIGRpLmRldmljZUlkICsgXCIgZ3JvdXBJZDogXCIgKyBkaS5ncm91cElkICsgXCIgbGFiZWw6IFwiICsgZGkubGFiZWwgKyBcIiBraW5kOiBcIiArIGRpLmtpbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlbihjaGFubmVsQ291bnQ6IG51bWJlciwgc2VsRGV2aWNlSWQ/OiBDb25zdHJhaW5ET01TdHJpbmd8dW5kZWZpbmVkLGF1dG9HYWluQ29udHJvbENvbmZpZ3M/OkFycmF5PEF1dG9HYWluQ29udHJvbENvbmZpZz58bnVsbHx1bmRlZmluZWQpe1xyXG4gICAgICB0aGlzLmNvbnRleHQucmVzdW1lKCkudGhlbigoKT0+e1xyXG4gICAgICAgIHRoaXMuX29wZW4oY2hhbm5lbENvdW50LHNlbERldmljZUlkLGF1dG9HYWluQ29udHJvbENvbmZpZ3MpO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgX29wZW4oY2hhbm5lbENvdW50OiBudW1iZXIsIHNlbERldmljZUlkPzogQ29uc3RyYWluRE9NU3RyaW5nfHVuZGVmaW5lZCxhdXRvR2FpbkNvbnRyb2xDb25maWdzPzpBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+fG51bGx8dW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDtcclxuICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgPSAwO1xyXG4gICAgLy92YXIgbXNjID0gbmV3IEF1ZGlvU3RyZWFtQ29uc3RyKCk7XHJcbiAgICAvLyB2YXIgbXNjPXt9O1xyXG4gICAgLy9tc2MudmlkZW8gPSBmYWxzZTtcclxuICAgIC8vbXNjLmF1ZGlvID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc3RlcmVvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwgISFcclxuICAgIC8vIEFuZCBldmVuIHdvcnNlOiBUaGUgZGF0YSBjb21pbmcgZnJvbSB0aGUgc291cmNlIGlzIGFscmVhZHkgcHJlcHJvY2Vzc2VkIG9uIEZGIGFuZCBDaHJvbWUuIEl0IGNvbnRhaW5zIERTUCBhcnRpZmFjdHMhIVxyXG5cclxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM4NzczN1xyXG4gICAgLy8gVGhlIHdvcmthcm91bmQgdG8gc2V0IHRoZXNlIGNvbnN0cmFpbnRzIGRvZXMgX05PVF8gaGVscDpcclxuICAgIC8vdmFyIG1zYz17YXVkaW86IHtlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxjaGFubmVsQ291bnQ6IDIsIGdvb2dBdWRpb01pcnJvcmluZzogZmFsc2V9LHZpZGVvOiBmYWxzZX07XHJcblxyXG4gICAgLy8gU2FmYXJpIGF0IGxlYXN0IHZlcnNpb24gMTE6IFN1cHBvcnQgZm9yIG1lZGlhIHN0cmVhbXNcclxuICAgIC8vIFRPRE8gdGVzdCBpZiBpbnB1dCBpcyB1bnByb2Nlc3NlZFxyXG5cclxuICAgIGxldCBtc2M6TWVkaWFTdHJlYW1Db25zdHJhaW50cztcclxuICAgIGNvbnNvbGUuaW5mbygnVXNlciBhZ2VudDogJytuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuXHJcblxyXG4gICAgICBsZXQgdWE9VXNlckFnZW50QnVpbGRlci51c2VyQWdlbnQoKTtcclxuXHJcbiAgICAgIC8vIHVhLmNvbXBvbmVudHMuZm9yRWFjaCgoYyk9PntcclxuICAgICAgLy8gICBjb25zb2xlLmluZm8oXCJVQV9Db21wOiBcIitjLnRvU3RyaW5nKCkpO1xyXG4gICAgICAvLyB9KVxyXG5cclxuICAgICBsZXQgYWdjQ2ZnOkF1dG9HYWluQ29udHJvbENvbmZpZ3xudWxsPW51bGw7XHJcblxyXG4gICAgbGV0IGF1dG9HYWluQ29udHJvbD1mYWxzZTtcclxuICAgIGxldCBjaHJvbWVFY2hvQ2FuY2VsbGF0aW9uPWZhbHNlO1xyXG4gICAgaWYoYXV0b0dhaW5Db250cm9sQ29uZmlncyl7XHJcbiAgICAgIGZvcihsZXQgYWdjYyBvZiBhdXRvR2FpbkNvbnRyb2xDb25maWdzKXtcclxuICAgICAgICBpZihhZ2NjLnBsYXRmb3JtPT09Q2ZnUGxhdGZvcm0uQW5kcm9pZCAmJiB1YS5kZXRlY3RlZFBsYXRmb3JtPT09UGxhdGZvcm0uQW5kcm9pZCl7XHJcbiAgICAgICAgICAgIGFnY0NmZz1hZ2NjO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoYWdjYy5wbGF0Zm9ybT09PUNmZ1BsYXRmb3JtLldpbmRvd3MgJiYgdWEuZGV0ZWN0ZWRQbGF0Zm9ybT09PVBsYXRmb3JtLldpbmRvd3Mpe1xyXG4gICAgICAgICAgYWdjQ2ZnPWFnY2M7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoYWdjQ2ZnKXtcclxuICAgICAgICAvLyBUT0RPIHVzZSBFWEFDVC9JREVBTCBjb25zdHJhaW50XHJcbiAgICAgICAgYXV0b0dhaW5Db250cm9sPWFnY0NmZy52YWx1ZTtcclxuICAgICAgICBpZihDSFJPTUVfQUNUSVZBVEVfRUNIT19DQU5DRUxMQVRJT05fV0lUSF9BR0Mpe1xyXG4gICAgICAgICAgY2hyb21lRWNob0NhbmNlbGxhdGlvbj1hZ2NDZmcudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE8gcXVlcnkgcmVhbCBBR0Mgc3RhdHVzXHJcbiAgICAgICAgdGhpcy5hZ2NTdGF0dXM9YWdjQ2ZnLnZhbHVlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLmFnY1N0YXR1cz1mYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRlZmF1bHRcclxuICAgIG1zYyA9IHtcclxuICAgICAgYXVkaW86IHtcclxuICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgYXV0b0dhaW5Db250cm9sOiBhdXRvR2FpbkNvbnRyb2xcclxuICAgICAgfSxcclxuICAgICAgdmlkZW86IGZhbHNlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLkVkZ2UpIHtcclxuXHJcbiAgICAgIC8vIE1pY3Jvc29mdCBFZGdlIHNlbmRzIHVubW9kaWZpZWQgYXVkaW9cclxuICAgICAgLy8gVGhlIGNvbnN0cmFpbnQgY2FuIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvblxyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBNaWNyb3NvZnQgRWRnZS5cIik7XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2VcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5DaHJvbWUpIHtcclxuICAgICAgLy8gR29vZ2xlIENocm9tZTogd2UgbmVlZCB0byBzd2l0Y2ggb2YgZWFjaCBvZiB0aGUgcHJlcHJvY2Vzc2luZyB1bml0cyBpbmNsdWRpbmcgdGhlXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIEdvb2dsZSBDaHJvbWUuXCIpO1xyXG5cclxuICAgICAgLy8gQ2hyb21lIDYwIC0+IDYxIGNoYW5nZWRcclxuICAgICAgLy8gaXQgd29ya3Mgbm93IHdpdGhvdXQgbWFuZGF0b3J5L29wdGlvbmFsIHN1Yi1vYmplY3RzXHJcblxyXG5cclxuICAgICAgLy8gUmVxdWlyZXMgYXQgbGVhc3QgQ2hyb21lIDYxXHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiB7ZXhhY3Q6Y2hyb21lRWNob0NhbmNlbGxhdGlvbn0sXHJcbiAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IHtleGFjdDphdXRvR2FpbkNvbnRyb2x9LFxyXG4gICAgICAgICAgc2FtcGxlU2l6ZTp7bWluOiAxNn0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuRmlyZWZveCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBNb3ppbGxhIEZpcmVmb3guXCIpO1xyXG4gICAgICAvLyBGaXJlZm94XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sLFxyXG4gICAgICAgICAgbm9pc2VTdXBwcmVzc2lvbjogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZSxcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5TYWZhcmkpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgU2FmYXJpIGJyb3dzZXIuXCIpXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIkFwcGx5IHdvcmthcm91bmQgZm9yIFNhZmFyaTogQXZvaWQgZGlzY29ubmVjdCBvZiBzdHJlYW1zLlwiKTtcclxuXHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdFN0cmVhbXMgPSBmYWxzZTtcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gVE9ETyBkZWZhdWx0IGNvbnN0cmFpbnRzIG9yIGVycm9yIEJyb3dzZXIgbm90IHN1cHBvcnRlZFxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGNhcHR1cmUsIEFHQzogXCIrdGhpcy5hZ2NTdGF0dXMpXHJcblxyXG5cclxuICAgIGxldCB1bXAgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtc2MpO1xyXG4gICAgdW1wLnRoZW4oKHMpID0+IHtcclxuICAgICAgICB0aGlzLnN0cmVhbSA9IHM7XHJcblxyXG4gICAgICAgIGxldCBhVHJhY2tzID0gcy5nZXRBdWRpb1RyYWNrcygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFUcmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBhVHJhY2sgPSBhVHJhY2tzW2ldO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIGF1ZGlvIGluZm86IGlkOiBcIiArIGFUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgYVRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXFxcIlwiICsgYVRyYWNrLmxhYmVsICsgXCJcXFwiXCIpO1xyXG4gICAgICAgICAgbGV0IG10clN0cz1hVHJhY2suZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgICAgICAgICAvLyBUeXBlc2NyaXB0IGxpYi5kb20udHMgTWVkaWFUcmFja1NldHRpbmdzLmNoYW5uZWxDb3VudCBpcyBtaXNzaW5nXHJcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWRuL2Jyb3dzZXItY29tcGF0LWRhdGEvYmxvYi81NDkzZDhmOTM3ZTA1YjJkZGJkNDFiOTlmNWJkZmFkNGExZjJlZDg1L2FwaS9NZWRpYVRyYWNrU2V0dGluZ3MuanNvblxyXG4gICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBzZXR0aW5nczogQ2ggY250OiBcIittdHJTdHMuY2hhbm5lbENvdW50K1wiLCBBR0M6IFwiK210clN0cy5hdXRvR2FpbkNvbnRyb2wrXCIsIEVjaG8gY2FuY2VsbC46IFwiK210clN0cy5lY2hvQ2FuY2VsbGF0aW9uKTtcclxuICAgICAgICAgIGlmKG10clN0cy5hdXRvR2FpbkNvbnRyb2wpe1xyXG4gICAgICAgICAgICB0aGlzLmFnY1N0YXR1cz1tdHJTdHMuYXV0b0dhaW5Db250cm9sO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHZUcmFja3MgPSBzLmdldFZpZGVvVHJhY2tzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2VHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdlRyYWNrID0gdlRyYWNrc1tpXTtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIHZpZGVvIGluZm86IGlkOiBcIiArIHZUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgdlRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXCIgKyB2VHJhY2subGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHMpO1xyXG4gICAgICAgIC8vIHN0cmVhbSBjaGFubmVsIGNvdW50ICggaXMgYWx3YXlzIDIgISlcclxuICAgICAgICBsZXQgc3RyZWFtQ2hhbm5lbENvdW50OiBudW1iZXIgPSB0aGlzLm1lZGlhU3RyZWFtLmNoYW5uZWxDb3VudDtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJTdHJlYW0gY2hhbm5lbCBjb3VudDogXCIrc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAvLyBpcyBub3Qgc2V0ISFcclxuICAgICAgICAvL3RoaXMuY3VycmVudFNhbXBsZVJhdGUgPSB0aGlzLm1lZGlhU3RyZWFtLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSA9IHRoaXMuY29udGV4dC5zYW1wbGVSYXRlO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIlNvdXJjZSBhdWRpbyBub2RlOiBjaGFubmVsczogXCIgKyBzdHJlYW1DaGFubmVsQ291bnQgKyBcIiBzYW1wbGVyYXRlOiBcIiArIHRoaXMuY3VycmVudFNhbXBsZVJhdGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLnNldEZvcm1hdCh0aGlzLmNoYW5uZWxDb3VudCwgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFczQyAgLT4gbmV3IG5hbWUgaXMgY3JlYXRlU2NyaXB0UHJvY2Vzc29yXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBBZ2FpbiBkZXByZWNhdGVkLCBidXQgQXVkaW9Xb3JrZXIgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBzdGFibGUgcmVsZWFzZXMgKEp1bmUgMjAxNilcclxuICAgICAgICAvLyBBdWRpb1dvcmtlciBpcyBub3cgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIC4uLiAoTWF5IDIwMTcpXHJcblxyXG4gICAgICAvLyBVcGRhdGUgMTItMjAyMDpcclxuICAgICAgIC8vIFRoZSBTY3JpcHRQcm9jZXNzb3JOb2RlIEludGVyZmFjZSAtIERFUFJFQ0FURURcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSAwNi0yMDIxXHJcbiAgICAgIC8vICBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgaXMgaGVyZSB0byBzdGF5LiBXZWIgQXVkaW8gQVBJIGhhcyBub3cgUmVjb21tZW5kYXRpb24gc3RhdHVzICFcclxuXHJcbiAgICAgICAgICBpZihFTkFCTEVfQVVESU9fV09SS0xFVCAmJiB0aGlzLmNvbnRleHQuYXVkaW9Xb3JrbGV0KXtcclxuICAgICAgICAgICAgLy9jb25zdCB3b3JrbGV0RmlsZU5hbWUgPSAoJ2ZpbGUtbG9hZGVyIS4vaW50ZXJjZXB0b3Jfd29ya2xldC5qcycpO1xyXG4gICAgICAgICAgICAvL2NvbnN0IHdvcmtsZXRGaWxlTmFtZSA9ICdodHRwOi8vbG9jYWxob3N0OjQyMDAvYXNzZXRzL2ludGVyY2VwdG9yX3dvcmtsZXQuanMnO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGF3cFN0cik7XHJcbiAgICAgICAgICAgIGxldCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iPSBuZXcgQmxvYihbYXdwU3RyXSwge3R5cGU6ICd0ZXh0L2phdmFzY3JpcHQnfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYlVybD13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChhdWRpb1dvcmtsZXRNb2R1bGVCbG9iKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5hdWRpb1dvcmtsZXQuYWRkTW9kdWxlKGF1ZGlvV29ya2xldE1vZHVsZUJsb2JVcmwpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3biA9IG5ldyBBdWRpb1dvcmtsZXROb2RlKHRoaXMuY29udGV4dCwgJ2NhcHR1cmUtaW50ZXJjZXB0b3InKTtcclxuICAgICAgICAgICAgICAgICAgYXduLm9ucHJvY2Vzc29yZXJyb3I9KGV2OkV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c9J1Vua253b24gZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGV2IGluc3RhbmNlb2YgRXJyb3JFdmVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBtc2c9ZXYubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhcHR1cmUgYXVkaW8gd29ya2xldCBlcnJvcjogXCIrbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxpc3RlbmVyKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IobXNnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbGV0IGF3blB0ID0gYXduLnBvcnQ7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChhd25QdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3blB0Lm9ubWVzc2FnZSA9IChldjogTWVzc2FnZUV2ZW50PGFueT4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHQ9ZXYuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNocyA9IGR0LmNocztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkYUxlbiA9IGR0LmRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihERUJVR19UUkFDRV9MRVZFTD44KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnUmVjZWl2ZWQgZGF0YSBmcm9tIHdvcmtsZXQ6ICcgK2NocyArICcgJyArIGR0LmxlbiArJyBEYXRhIGNoczogJythZGFMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IGNodW5rTGVuID0gYWRhTGVuIC8gY2hzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmtMZW4gPSBhZGFMZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaHVuayA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNocyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGFQb3MgPSBjaCAqIGNodW5rTGVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZHQuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZhID0gbmV3IEZsb2F0MzJBcnJheShkdC5kYXRhW2NoXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtjaF0ucHVzaChmYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rW2NoXSA9IGZhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc2FtcGxlcyBvZiBjaGFubmVsIDAgdG8gY291bnQgZnJhbWVzIChzYW1wbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gZmEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUdfVFJBQ0VfTEVWRUw+OCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0NoYW5uZWwgJytjaCsnIGRhdGEgbm90IHNldCEhJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLndyaXRlKGNodW5rKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlID0gYXduO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub3BlbmVkKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5jYXRjaCgoZXJyb3I6IGFueSk9PntcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGFkZCBtb2R1bGUgJytlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIH1lbHNlIGlmKHRoaXMuY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IpIHtcclxuICAgICAgICAgICAgLy8gVGhlIFNjcmlwdFByb2Nlc3Nvck5vZGUgSW50ZXJmYWNlIC0gREVQUkVDQVRFRCBPbmx5IGFzIGZhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIHVzZSBzdHJlYW1DaGFubmVsQ291bnQgb3IgY2hhbm5lbENvdW50IGhlcmUgP1xyXG4gICAgICAgICAgICBsZXQgc2NyaXB0UHJvY2Vzc29yTm9kZT0gdGhpcy5jb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3NvcihBdWRpb0NhcHR1cmUuQlVGRkVSX1NJWkUsIHN0cmVhbUNoYW5uZWxDb3VudCwgc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlPXNjcmlwdFByb2Nlc3Nvck5vZGU7XHJcbiAgICAgICAgICAgIGxldCBjID0gMDtcclxuICAgICAgICAgICAgaWYoc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2Vzcyl7XHJcbiAgICAgICAgICAgICAgc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2VzcyA9IChlOiBBdWRpb1Byb2Nlc3NpbmdFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5CdWZmZXIgPSBlLmlucHV0QnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBpbkJ1ZmZlci5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHJlcXVlc3RlZCBjb3VudCBvZiBjaGFubmVsc1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEJ1ZmZlcnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaGFubmVsQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaDogbnVtYmVyID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzID0gaW5CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaFNhbXBsZXNDb3B5ID0gY2hTYW1wbGVzLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZmZXJzW2NoXSA9IGNoU2FtcGxlc0NvcHkuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5wdXNoKGNoU2FtcGxlc0NvcHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKERFQlVHX1RSQUNFX0xFVkVMPjgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlByb2Nlc3MgXCIrY2hTYW1wbGVzQ29weS5sZW5ndGgrXCIgc2FtcGxlcy5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gY2hTYW1wbGVzQ29weS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYysrO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ud3JpdGUoY3VycmVudEJ1ZmZlcnMpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9wZW5lZCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHByb2Nlc3NpbmcgKFNjcmlwdFByb2Nlc3Nvci5vbmF1ZGlvcHJvY2VzcyBtZXRob2Qgbm90IGZvdW5kKSEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBwcm9jZXNzaW5nIChuZWl0aGVyIEF1ZGlvV29ya2xldFByb2Nlc3NvciBub3IgU2NyaXB0UHJvY2Vzc29yKSEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlICsgXCIgRXJyb3IgbmFtZTogXCIgK2UubmFtZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICBpZignTm90QWxsb3dlZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdOb3QgYWxsb3dlZCB0byB1c2UgeW91ciBtaWNyb3Bob25lLicsJ1BsZWFzZSBtYWtlIHN1cmUgdGhhdCBtaWNyb3Bob25lIGFjY2VzcyBpcyBhbGxvd2VkIGZvciB0aGlzIHdlYiBwYWdlIGFuZCByZWxvYWQgdGhlIHBhZ2UuJyk7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCdOb3RSZWFkYWJsZUVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdDb3VsZCBub3QgcmVhZCBmcm9tIHlvdXIgYXVkaW8gZGV2aWNlLicsJ1BsZWFzZSBtYWtlIHN1cmUgeW91ciBhdWRpbyBkZXZpY2UgaXMgd29ya2luZy4nKTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoJ092ZXJjb25zdHJhaW5lZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICBsZXQgZU1zZz1lLm1zZz9lLm1zZzonT3ZlcmNvbnN0cmFpbmVkIG1lZGlhIGRldmljZSByZXF1ZXN0IGVycm9yLic7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcihlTXNnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzdGFydCgpIHtcclxuXHJcbiAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLm5leHRTdHJlYW0oKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5idWZmZXJpbmdOb2RlKSB7XHJcbiAgICAgIHRoaXMubWVkaWFTdHJlYW0uY29ubmVjdCh0aGlzLmJ1ZmZlcmluZ05vZGUpO1xyXG4gICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5zdGFydGVkKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNjb25uZWN0U3RyZWFtcyAmJiB0aGlzLmJ1ZmZlcmluZ05vZGUpIHtcclxuICAgICAgdGhpcy5tZWRpYVN0cmVhbS5kaXNjb25uZWN0KHRoaXMuYnVmZmVyaW5nTm9kZSk7XHJcbiAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZS5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS5mbHVzaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMubGlzdGVuZXIuc3RvcHBlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5tZWRpYVN0cmVhbS5kaXNjb25uZWN0KCk7XHJcbiAgICBpZiAodGhpcy5zdHJlYW0pIHtcclxuICAgICAgLy90aGlzLnN0cmVhbS5zdG9wKCk7XHJcbiAgICAgIC8vJ01lZGlhU3RyZWFtLnN0b3AoKScgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE00NywgYXJvdW5kIE5vdmVtYmVyIDIwMTUuIFBsZWFzZSB1c2UgJ01lZGlhU3RyZWFtLmFjdGl2ZScgaW5zdGVhZC5cclxuICAgICAgLy90aGlzLnN0cmVhbS5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgIHZhciBtdHMgPSB0aGlzLnN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtdHNbaV0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVuZWQ9ZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB7XHJcbiAgICBsZXQgZnJhbWVMZW46IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY2gwRGF0YSA9IHRoaXMuZGF0YVswXTtcclxuXHJcbiAgICBmb3IgKGxldCBjaDBDaGsgb2YgY2gwRGF0YSkge1xyXG4gICAgICBmcmFtZUxlbiArPSBjaDBDaGsubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IGFiOkF1ZGlvQnVmZmVyO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFiID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlcih0aGlzLmNoYW5uZWxDb3VudCwgZnJhbWVMZW4sIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKXtcclxuICAgICAgICAgIGlmKGVyci5uYW1lPT09J05vdFN1cHBvcnRlZEVycm9yJyl7XHJcbiAgICAgICAgICAgIGlmKGZyYW1lTGVuPT0wKXtcclxuICAgICAgICAgICAgICAvLyBFbXB0eSBidWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IENocm9taXVtXHJcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGR1bW15IGJ1ZmZlciB3aXRoIG9uZSBzYW1wbGVcclxuICAgICAgICAgICAgICBhYiA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXIodGhpcy5jaGFubmVsQ291bnQsIDEsIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtcclxuICAgICAgICAgIC8vIE91dCBvZiBtZW1vcnlcclxuICAgICAgICAgIC8vIFRPRE8gV2hhdCB0byBkbyA/P1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICBsZXQgY2hEID0gYWIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGNoQ2hrIG9mIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgIGxldCBidWZMZW4gPSBjaENoay5sZW5ndGg7XHJcbiAgICAgICAgICBjaEQuc2V0KGNoQ2hrLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IGJ1ZkxlbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIHJldHVybiBhYjtcclxuICB9XHJcblxyXG4gIGF1ZGlvQnVmZmVyQXJyYXkoKTpBcnJheUF1ZGlvQnVmZmVye1xyXG4gICAgICBsZXQgYWJhPW5ldyBBcnJheUF1ZGlvQnVmZmVyKHRoaXMuY2hhbm5lbENvdW50LHRoaXMuY3VycmVudFNhbXBsZVJhdGUsdGhpcy5kYXRhKTtcclxuICAgICAgcmV0dXJuIGFiYTtcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=
803
+ AudioCapture.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES = 2880000 * 5; // Default 5 minute at 48kHz
804
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQXlCLFFBQVEsSUFBSSxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0SCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLG9CQUFvQixFQUErQixNQUFNLHVCQUF1QixDQUFDO0FBR3pGLE1BQU0sQ0FBQyxNQUFNLDBDQUEwQyxHQUFDLEtBQUssQ0FBQztBQUU5RCxNQUFNLGlCQUFpQixHQUFDLENBQUMsQ0FBQztBQUUxQixnQ0FBZ0M7QUFDaEMsd0RBQXdEO0FBQ3hELE1BQU0sTUFBTSxHQUFDLHlFQUF5RTtJQUNsRixJQUFJO0lBQ0osMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5QixxRUFBcUU7SUFDckUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQix5QkFBeUI7SUFDekIsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtJQUNwQixJQUFJO0lBQ0osU0FBUztJQUNULElBQUk7SUFDSixhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsUUFBUTtJQUNSLElBQUk7SUFDSixxQ0FBcUM7SUFDckMsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4Qiw2QkFBNkI7SUFDN0IsMEJBQTBCO0lBQzFCLG9DQUFvQztJQUNwQywwQ0FBMEM7SUFDMUMsb0NBQW9DO0lBQ3BDLHlDQUF5QztJQUN6QywyQ0FBMkM7SUFDM0MsdURBQXVEO0lBQ3ZELGNBQWM7SUFDZCxVQUFVO0lBQ1YsaUVBQWlFO0lBQ2pFLG1EQUFtRDtJQUNuRCwrQkFBK0I7SUFDL0IsMkRBQTJEO0lBQzNELDRFQUE0RTtJQUM1RSxvQ0FBb0M7SUFDcEMsdUNBQXVDO0lBQ3ZDLGNBQWM7SUFDZCxVQUFVO0lBQ1YsK0RBQStEO0lBQy9ELGlEQUFpRDtJQUNqRCxtQ0FBbUM7SUFDbkMsNkNBQTZDO0lBQzdDLHdEQUF3RDtJQUN4RCx5REFBeUQ7SUFDekQsY0FBYztJQUNkLG9DQUFvQztJQUNwQywyQkFBMkI7SUFDM0IsbUNBQW1DO0lBQ25DLG9DQUFvQztJQUNwQyxxQkFBcUI7SUFDckIseUNBQXlDO0lBQ3pDLGdDQUFnQztJQUNoQyxtQ0FBbUM7SUFDbkMsVUFBVTtJQUNWLElBQUk7SUFDSiwwQ0FBMEM7SUFDMUMsd0RBQXdEO0lBQ3hELGdDQUFnQztJQUNoQywyQ0FBMkM7SUFDM0MsZ0RBQWdEO0lBQ2hELCtEQUErRDtJQUMvRCxjQUFjO0lBQ2Qsc0NBQXNDO0lBQ3RDLGdEQUFnRDtJQUNoRCxVQUFVO0lBQ1YsUUFBUTtJQUNSLHFCQUFxQjtJQUNyQixPQUFPO0lBQ1AsS0FBSztJQUNMLElBQUk7SUFDSiw4RUFBOEUsQ0FBQztBQWlCbkYsTUFBTSxPQUFPLFlBQVk7SUE4RHZCLFlBQVksT0FBcUI7UUExQnpCLCtCQUEwQixHQUFRLFlBQVksQ0FBQyxzQ0FBc0MsQ0FBQztRQUl0RixhQUFRLEdBQWEsSUFBSSxDQUFDO1FBRWxDLGNBQVMsR0FBYyxJQUFJLENBQUM7UUFDNUIsa0JBQWEsR0FBaUIsSUFBSSxDQUFDO1FBRW5DLFNBQUksR0FBa0MsSUFBSSxDQUFDO1FBRzNDLG1CQUFjLEdBQXVDLElBQUksQ0FBQztRQUNsRCxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDekIsWUFBTyxHQUFDLEtBQUssQ0FBQztRQUNkLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUIsbUJBQWMsR0FBUyxDQUFDLENBQUM7UUFFakIsc0JBQWlCLEdBQWtCLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztRQUMvRCxrQ0FBNkIsR0FBbUMsSUFBSSxDQUFDO1FBRXJFLGNBQVMsR0FBQyxJQUFJLENBQUM7UUFDZixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUM3QixxQkFBZ0IsR0FBMkIsSUFBSSxDQUFDO1FBR3RELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDbEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBcEVELElBQUkseUJBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLHlCQUF5QixDQUFDLEtBQWE7UUFDekMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztJQUMxQyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBa0I7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksZ0JBQWdCLENBQUMsS0FBdUI7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSw0QkFBNEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksNEJBQTRCLENBQUMsS0FBMEM7UUFDekUsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUF3Q08sUUFBUTtRQUNkLElBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBQyxJQUFJLENBQUM7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsR0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuRixJQUFHLGdCQUFnQixDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLDZCQUE2QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEgsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBQyxZQUFZLENBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7U0FDeEs7UUFDRCxJQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDN0QsK0RBQStEO1lBQy9ELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQXVCLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxFQUFnQixDQUFDLENBQUM7YUFDM0M7U0FDRjtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXO1FBQ1QsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRU8sWUFBWTtRQUNsQixxQ0FBcUM7UUFDckMsd0JBQXdCO1FBQ3hCLElBQUksY0FBYyxHQUEyQixFQUFDLEtBQUssRUFDL0MsRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFDO1NBQzNCLENBQUM7UUFDRixPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTdELENBQUM7SUFHTyxvQkFBb0IsQ0FBQyxXQUF1QjtRQUNoRCxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0Msc0RBQXNEO1lBQ3RELEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNuQjtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBa0QsRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFDLFdBQXdCO1FBRW5HLFNBQVMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFvQixFQUFFLEVBQUU7WUFDdEUsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFO29CQUNaLGVBQWUsR0FBRyxJQUFJLENBQUM7aUJBQ3hCO2FBQ0Y7WUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNwQix1REFBdUQ7Z0JBQ3ZELElBQUksS0FBSyxFQUFFO29CQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQTtvQkFFdEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWMsRUFBRSxFQUFFO3dCQUM1QywwQkFBMEI7d0JBRTFCLElBQUcsQ0FBQyxFQUFFOzRCQUNKLHdEQUF3RDt5QkFDekQ7NkJBQUk7NEJBQ0gsa0NBQWtDO3lCQUNuQzt3QkFDRCxvQkFBb0I7d0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUNULDBDQUEwQzt3QkFDMUMsc0JBQXNCO3dCQUN0QixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ1gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNWO2FBQ0Y7aUJBQU07Z0JBQ0wsVUFBVTtnQkFDVixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDUDtZQUNELElBQUcsV0FBVyxFQUFDO2dCQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN4QztRQUNILENBQUMsRUFBQyxDQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ1YsVUFBVTtZQUNWLHFEQUFxRDtZQUNyRCxJQUFJLEtBQUssRUFBRTtnQkFDVCx5RUFBeUU7Z0JBQ3pFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFjLEVBQUUsRUFBRTtvQkFDMUMsMEJBQTBCO29CQUMxQixpQ0FBaUM7b0JBQ2pDLElBQUcsQ0FBQyxFQUFFO3dCQUNKLHdEQUF3RDtxQkFDekQ7eUJBQUk7d0JBQ0gsa0NBQWtDO3FCQUNuQztvQkFDRCxvQkFBb0I7b0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUNWLDBDQUEwQztvQkFDMUMsc0JBQXNCO29CQUN0QixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDVjtZQUNELElBQUcsV0FBVyxFQUFDO2dCQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN4QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBSUwsQ0FBQztJQUdELFlBQVksQ0FBQyxDQUFvQjtRQUMvQixrQ0FBa0M7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUMsUUFBUSxHQUFHLFlBQVksR0FBRyxFQUFFLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0g7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFlBQW9CLEVBQUUsV0FBMEMsRUFBQyxzQkFBbUU7UUFDdkksZ0VBQWdFO1FBQ2hFLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUcsU0FBUyxFQUFDO1lBQ2hDLGdEQUFnRDtZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7Z0JBQzdCLDhFQUE4RTtnQkFDOUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDLENBQUE7U0FDSDthQUFJO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixDQUFDLENBQUM7U0FDL0Q7SUFFSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQW9CLEVBQUUsV0FBMEMsRUFBQyxzQkFBbUU7UUFDeEksSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFHeEIsb0NBQW9DO1FBQ3BDLGNBQWM7UUFDZCxvQkFBb0I7UUFDcEIsbUJBQW1CO1FBRW5CLHNEQUFzRDtRQUN0RCx3SEFBd0g7UUFFeEgsK0RBQStEO1FBQy9ELDJEQUEyRDtRQUMzRCxxR0FBcUc7UUFFckcsd0RBQXdEO1FBQ3hELG9DQUFvQztRQUVwQyxJQUFJLEdBQTBCLENBQUM7UUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRy9DLElBQUksRUFBRSxHQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXBDLCtCQUErQjtRQUMvQiw0Q0FBNEM7UUFDNUMsS0FBSztRQUVOLElBQUksTUFBTSxHQUE0QixJQUFJLENBQUM7UUFFNUMsSUFBSSxlQUFlLEdBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksc0JBQXNCLEdBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUcsc0JBQXNCLEVBQUM7WUFDeEIsS0FBSSxJQUFJLElBQUksSUFBSSxzQkFBc0IsRUFBQztnQkFDckMsSUFBRyxJQUFJLENBQUMsUUFBUSxLQUFHLFdBQVcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLGdCQUFnQixLQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUM7b0JBQzdFLE1BQU0sR0FBQyxJQUFJLENBQUM7b0JBQ1osTUFBTTtpQkFDVDtnQkFDRCxJQUFHLElBQUksQ0FBQyxRQUFRLEtBQUcsV0FBVyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEtBQUcsUUFBUSxDQUFDLE9BQU8sRUFBQztvQkFDL0UsTUFBTSxHQUFDLElBQUksQ0FBQztvQkFDWixNQUFNO2lCQUNQO2FBQ0Y7WUFDRCxJQUFHLE1BQU0sRUFBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLGVBQWUsR0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM3QixJQUFHLDBDQUEwQyxFQUFDO29CQUM1QyxzQkFBc0IsR0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUNyQztnQkFDRCw2QkFBNkI7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUM3QjtpQkFBSTtnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFDLEtBQUssQ0FBQzthQUN0QjtTQUNGO1FBRUQsVUFBVTtRQUNWLEdBQUcsR0FBRztZQUNKLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsV0FBVztnQkFDckIsZ0JBQWdCLEVBQUUsS0FBSztnQkFDdkIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLGVBQWUsRUFBRSxlQUFlO2FBQ2pDO1lBQ0QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBRUYsSUFBSSxFQUFFLENBQUMsZUFBZSxLQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFFckMsd0NBQXdDO1lBQ3hDLDhDQUE4QztZQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDcEUsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsV0FBVztvQkFDckIsZ0JBQWdCLEVBQUUsS0FBSztvQkFDdkIsWUFBWSxFQUFFLFlBQVk7b0JBQzFCLGVBQWUsRUFBRSxlQUFlO2lCQUNqQztnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUM7U0FDSDthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzlDLG9GQUFvRjtZQUNwRixPQUFPLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFFbkUsMEJBQTBCO1lBQzFCLHNEQUFzRDtZQUd0RCw4QkFBOEI7WUFDOUIsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsV0FBVztvQkFDckIsWUFBWSxFQUFFLFlBQVk7b0JBQzFCLGdCQUFnQixFQUFFLEVBQUMsS0FBSyxFQUFDLHNCQUFzQixFQUFDO29CQUNoRCxlQUFlLEVBQUUsRUFBQyxLQUFLLEVBQUMsZUFBZSxFQUFDO29CQUN4QyxVQUFVLEVBQUMsRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFDO2lCQUNyQjtnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUE7U0FFRjthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUNyRSxVQUFVO1lBQ1YsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDSCxRQUFRLEVBQUUsV0FBVztvQkFDckIsWUFBWSxFQUFFLFlBQVk7b0JBQzVCLGdCQUFnQixFQUFFLEtBQUs7b0JBQ3JCLGVBQWUsRUFBRSxlQUFlO29CQUNsQyxnQkFBZ0IsRUFBRSxLQUFLO2lCQUN4QjtnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUE7U0FFRjthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQTtZQUNuRSw0RUFBNEU7WUFFNUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixHQUFHLEdBQUc7Z0JBQ0osS0FBSyxFQUFFO29CQUNMLFFBQVEsRUFBRSxXQUFXO29CQUNyQixZQUFZLEVBQUUsWUFBWTtvQkFDMUIsZ0JBQWdCLEVBQUUsS0FBSztpQkFDeEI7Z0JBQ0QsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFBO1NBRUY7YUFBTTtZQUVMLDBEQUEwRDtTQUMzRDtRQUlELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEdBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBR3BELElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV4QixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2xILElBQUksTUFBTSxHQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFFaEMsbUVBQW1FO2dCQUNuRSx1SEFBdUg7Z0JBQ3ZILFlBQVk7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBQyxNQUFNLENBQUMsWUFBWSxHQUFDLFNBQVMsR0FBQyxNQUFNLENBQUMsZUFBZSxHQUFDLG1CQUFtQixHQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoSixJQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUM7b0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztpQkFDdkM7YUFDRjtZQUVELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxRztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCx3Q0FBd0M7WUFDeEMsSUFBSSxrQkFBa0IsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUMvRCxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUQsZUFBZTtZQUNmLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxrQkFBa0IsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsNENBQTRDO1lBQzVDLEVBQUU7WUFDRix1RkFBdUY7WUFDdkYsMERBQTBEO1lBRTVELGtCQUFrQjtZQUNqQixpREFBaUQ7WUFFbEQsaUJBQWlCO1lBQ2pCLHdGQUF3RjtZQUVwRixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFDO2dCQUMzQixtRUFBbUU7Z0JBQ25FLGdGQUFnRjtnQkFDaEYsc0JBQXNCO2dCQUN0QixJQUFJLHNCQUFzQixHQUFFLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO2dCQUUxRSxJQUFJLHlCQUF5QixHQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBRWpGLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7b0JBQ2xFLE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO29CQUN0RSxHQUFHLENBQUMsZ0JBQWdCLEdBQUMsQ0FBQyxFQUFRLEVBQUMsRUFBRTt3QkFDL0IsSUFBSSxHQUFHLEdBQUMsZUFBZSxDQUFDO3dCQUN4QixJQUFHLEVBQUUsWUFBWSxVQUFVLEVBQUM7NEJBQzFCLEdBQUcsR0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO3lCQUNoQjt3QkFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNuRCxJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUM7NEJBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQzFCO29CQUNILENBQUMsQ0FBQTtvQkFDRCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNyQixJQUFJLEtBQUssRUFBRTt3QkFDVCxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBZ0IsRUFBRSxFQUFFOzRCQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0NBQ2xCLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2YsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQ0FDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0NBQzVCLElBQUcsaUJBQWlCLEdBQUMsQ0FBQyxFQUFFO29DQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixHQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRSxhQUFhLEdBQUMsTUFBTSxDQUFDLENBQUM7aUNBQ3pGO2dDQUNELElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxDQUFlLEdBQUcsQ0FBQyxDQUFDO2dDQUN6QyxNQUFNLE9BQU8sR0FBQyxJQUFJLENBQUMsY0FBYyxHQUFDLEdBQUcsQ0FBQztnQ0FDdEMsSUFBRyxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixLQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyw0QkFBNEIsS0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sR0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUM7b0NBQ3pNLElBQUksQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDO2lDQUNoQjtnQ0FFRCx3REFBd0Q7Z0NBQ3hELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0NBQy9CLG9GQUFvRjtvQ0FDcEYsSUFBSSxFQUFFLEdBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTt3Q0FDeEIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFOzRDQUNmLElBQUksRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0Q0FDdkMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0RBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzZDQUN4Qjs0Q0FDRCxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOzRDQUNmLHFEQUFxRDs0Q0FDckQsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO2dEQUNYLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQzs2Q0FDbEM7eUNBQ0Y7cUNBQ0Y7aUNBQ0Y7Z0NBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29DQUN2QixJQUFJO3dDQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dDQUNqQyx3QkFBd0I7d0NBQ3hCLDJCQUEyQjt3Q0FDM0IsNkJBQTZCO3dDQUM3QixJQUFJO3FDQUNMO29DQUFBLE9BQU0sR0FBRyxFQUFDO3dDQUNULElBQUcsR0FBRyxZQUFZLEtBQUssRUFBQzs0Q0FDdEIsSUFBSSxDQUFDLFlBQVksR0FBQyxHQUFHLENBQUM7eUNBQ3ZCOzZDQUFJOzRDQUNILElBQUksQ0FBQyxZQUFZLEdBQUMsSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQzt5Q0FDbkU7d0NBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsR0FBQyxHQUFHLENBQUMsQ0FBQzt3Q0FDckMsSUFBSTs0Q0FDRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7eUNBQ2I7d0NBQUEsT0FBTSxJQUFJLEVBQUM7NENBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBQyxJQUFJLENBQUMsQ0FBQzt5Q0FDdEQ7Z0RBQVE7NENBQ1AsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dEQUNqQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0RBQ2pCLElBQUksR0FBRyxZQUFZLFlBQVksRUFBRTtvREFDL0IsT0FBTyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO2lEQUNoRDtnREFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsR0FBRyxPQUFPLEVBQUUsNkJBQTZCLENBQUMsQ0FBQzs2Q0FDdEc7aURBQU07Z0RBQ0wsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOzZDQUNkO3lDQUNGO3FDQUNGO2lDQUNGO2dDQUNELElBQUcsZ0JBQWdCLENBQUMsVUFBVSxLQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsNkJBQTZCLEVBQUM7b0NBQzVGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQ0FDZDs2QkFDRjt3QkFDSCxDQUFDLENBQUM7cUJBQ0g7b0JBQ0QsOERBQThEO29CQUM5RCxnQkFBZ0I7b0JBQ2hCLHFDQUFxQztvQkFDckMsa0NBQWtDO29CQUNsQyxzRUFBc0U7b0JBRXRFLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO29CQUN6QixvREFBb0Q7b0JBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ3hCO2dCQUNILENBQUMsQ0FDSixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQVUsRUFBQyxFQUFFO29CQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixHQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLENBQUMsQ0FBQzthQUVKO2lCQUFLLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtnQkFDM0Msa0VBQWtFO2dCQUNsRSwrREFBK0Q7Z0JBQy9ELElBQUksbUJBQW1CLEdBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQzlILElBQUksQ0FBQyxhQUFhLEdBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFHLG1CQUFtQixDQUFDLGNBQWMsRUFBQztvQkFDcEMsbUJBQW1CLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBdUIsRUFBRSxFQUFFO3dCQUUvRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7NEJBQ2xCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7NEJBQzdCLDJDQUEyQzs0QkFDM0MsSUFBSSxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQWUsWUFBWSxDQUFDLENBQUM7NEJBQzNELEtBQUssSUFBSSxFQUFFLEdBQVcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0NBQ2hELElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQzVDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3ZDLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUM1QyxJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7b0NBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUNBQ25DO2dDQUNELElBQUcsaUJBQWlCLEdBQUMsQ0FBQyxFQUFDO29DQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBQyxhQUFhLENBQUMsTUFBTSxHQUFDLFdBQVcsQ0FBQyxDQUFDO2lDQUM1RDtnQ0FDRCxJQUFJLENBQUMsY0FBYyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUM7NkJBQzdDOzRCQUNELENBQUMsRUFBRSxDQUFDOzRCQUNKLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQ0FDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7NkJBQzNDO3lCQUNGO29CQUNILENBQUMsQ0FBQztvQkFDRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFDcEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO3dCQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO3FCQUN4QjtpQkFDRjtxQkFBSTtvQkFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyw4RkFBOEYsQ0FBQyxDQUFDO2lCQUNySDthQUNGO2lCQUFJO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGdHQUFnRyxDQUFDLENBQUM7YUFDdkg7UUFDSCxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLGVBQWUsR0FBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNqQixJQUFHLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUM7b0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFDLDJGQUEyRixDQUFDLENBQUM7aUJBQ3hKO3FCQUFLLElBQUcsa0JBQWtCLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBQztvQkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUMsZ0RBQWdELENBQUMsQ0FBQztpQkFDaEg7cUJBQUssSUFBRyxzQkFBc0IsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFDO29CQUN6QyxJQUFJLElBQUksR0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsR0FBRyxDQUFBLENBQUMsQ0FBQSw2Q0FBNkMsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzNCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ3ZCO2FBQ0Y7UUFDSCxDQUFDLENBQ0osQ0FBQTtJQUNILENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFBO1NBQ2pDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBRyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILE1BQU0sR0FBRyxHQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzdCLElBQUcsR0FBRyxLQUFHLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDZjthQUFJO1lBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsR0FBQyxHQUFHLEdBQUMsZUFBZSxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRSxFQUFFO2dCQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQztJQUVELElBQUk7UUFFRixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pEO1FBRUQsSUFBSTtZQUNGLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUM3QjtTQUNGO1FBQUEsT0FBTSxHQUFHLEVBQUM7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLENBQUM7U0FDVjtnQkFBUTtZQUNQLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzlDLGtHQUFrRztnQkFDbEcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7YUFDOUI7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDMUQsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3pCO1NBQ0Y7SUFDSCxDQUFDO0lBR0QsS0FBSztRQUNKLCtCQUErQjtRQUMvQiw4RkFBOEY7UUFDOUYsMEZBQTBGO1FBQzFGLEVBQUU7UUFDRixhQUFhO1FBQ2IsbUNBQW1DO1FBQ25DLHdDQUF3QztRQUN4Qyx3QkFBd0I7UUFDeEIsb0VBQW9FO1FBQ3BFLDJCQUEyQjtRQUMzQiw4REFBOEQ7UUFDOUQsbURBQW1EO1FBQ25ELHNDQUFzQztRQUN0QyxnRUFBZ0U7UUFDaEUsNkVBQTZFO1FBQzdFLDZEQUE2RDtRQUM3RCw2RUFBNkU7UUFDN0Usa0NBQWtDO1FBQ2xDLHFFQUFxRTtRQUNyRSxpQkFBaUI7UUFDakIsZ0NBQWdDO1FBQ2hDLDBFQUEwRTtRQUMxRSxpQkFBaUI7UUFDakIsZUFBZTtRQUNmLDRCQUE0QjtRQUM1QixXQUFXO1FBQ1gsdUNBQXVDO1FBQ3ZDLEVBQUU7UUFDRixpQ0FBaUM7UUFDakMsNkVBQTZFO1FBQzdFLFdBQVc7UUFDWCxpQ0FBaUM7UUFDakMsbUhBQW1IO1FBQ25ILEVBQUU7UUFDRiw2RUFBNkU7UUFDN0UsNERBQTREO1FBQzVELHFDQUFxQztRQUNyQyx5REFBeUQ7UUFDekQsYUFBYTtRQUNiLEVBQUU7UUFDRixnQ0FBZ0M7UUFDaEMsaURBQWlEO1FBQ2pELDREQUE0RDtRQUM1RCxzQ0FBc0M7UUFDdEMsYUFBYTtRQUNiLFdBQVc7UUFDWCwwQkFBMEI7UUFDMUIsK0JBQStCO1FBQy9CLHNCQUFzQjtRQUN0Qix1QkFBdUI7UUFDdkIsbUVBQW1FO1FBQ25FLFNBQVM7UUFDVCxPQUFPO1FBRU4scUZBQXFGO1FBQ3JGLDJLQUEySztRQUMzSyxJQUFJO1FBQ0osSUFBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLElBQUksRUFBQztZQUVwQyxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzVELFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQ2IsdUdBQXVHO29CQUV2RyxpRUFBaUU7b0JBQ2pFLElBQUcsSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDWixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRTs0QkFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3hCLDJDQUEyQzt5QkFDNUM7cUJBQ0Y7b0JBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQ3BDLDhDQUE4Qzt3QkFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDekI7Z0JBQ0gsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO29CQUNiLDJCQUEyQjtvQkFDM0IsSUFBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO3dCQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFHLEdBQUcsQ0FBQyxDQUFDO3FCQUN0RDtnQkFDSCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBQyxLQUFLLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBR0QsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2Y7U0FDRjtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxFQUFFLEdBQW1CLElBQUksQ0FBQztRQUM5QixJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixJQUFJLFFBQVEsR0FBVyxDQUFDLENBQUM7WUFFekIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzQixLQUFLLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRTtnQkFDMUIsUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDM0I7WUFFRCxJQUFJO2dCQUNGLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3RGO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxHQUFHLFlBQVksWUFBWSxFQUFFO29CQUMvQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLEVBQUU7d0JBQ3BDLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTs0QkFDakIsOENBQThDOzRCQUM5QyxzQ0FBc0M7NEJBQ3RDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUMvRTs2QkFBTTs0QkFDTCxNQUFNLEdBQUcsQ0FBQzt5QkFDWDtxQkFDRjt5QkFBTTt3QkFDTCxNQUFNLEdBQUcsQ0FBQztxQkFDWDtpQkFDRjtxQkFBTSxJQUFJLEdBQUcsWUFBWSxVQUFVLEVBQUU7b0JBQ3BDLGdCQUFnQjtvQkFDaEIscUJBQXFCO29CQUNyQixNQUFNLEdBQUcsQ0FBQztpQkFDWDtxQkFBTTtvQkFDTCxNQUFNLEdBQUcsQ0FBQztpQkFDWDthQUNGO1lBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQzdDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDWixLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQy9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNwQixHQUFHLElBQUksTUFBTSxDQUFDO2lCQUNmO2FBQ0Y7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGdCQUFnQjtRQUNaLElBQUksS0FBSyxHQUF1QixJQUFJLENBQUM7UUFDckMsSUFBRyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1osS0FBSyxHQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFHLElBQUksQ0FBQyxZQUFZLEVBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFLO1lBQ0osT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7U0FDOUI7SUFDSCxDQUFDOztBQS91Qk0sd0JBQVcsR0FBVyxJQUFJLENBQUM7QUFDVixtREFBc0MsR0FBUSxPQUFPLEdBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbX0gZnJvbSBcIi4uL2lvL3N0cmVhbVwiO1xyXG5pbXBvcnQge0Jyb3dzZXIsIFBsYXRmb3JtLCBVc2VyQWdlbnRCdWlsZGVyfSBmcm9tIFwiLi4vLi4vdXRpbHMvdWEtcGFyc2VyXCI7XHJcblxyXG5pbXBvcnQge0F1ZGlvU3RvcmFnZVR5cGUsIEF1dG9HYWluQ29udHJvbENvbmZpZywgUGxhdGZvcm0gYXMgQ2ZnUGxhdGZvcm19IGZyb20gXCIuLi8uLi9zcGVlY2hyZWNvcmRlci9wcm9qZWN0L3Byb2plY3RcIjtcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVyfSBmcm9tIFwiLi4vYXJyYXlfYXVkaW9fYnVmZmVyXCI7XHJcbmltcG9ydCB7VVVJRH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7SW5kZXhlZERiQXVkaW9CdWZmZXIsIFBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXR9IGZyb20gXCIuLi9pbmRkYl9hdWRpb19idWZmZXJcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgQ0hST01FX0FDVElWQVRFX0VDSE9fQ0FOQ0VMTEFUSU9OX1dJVEhfQUdDPWZhbHNlO1xyXG5cclxuY29uc3QgREVCVUdfVFJBQ0VfTEVWRUw9MDtcclxuXHJcbi8vIERpcnR5IHdheSB0byBsb2FkIHRoaXMgbW9kdWxlXHJcbi8vIENvcHkgY29udGVudCBvZiBpbnRlcmNlcHRvcl93b3JrbGV0LmpzIHRvIHRoaXMgc3RyaW5nXHJcbmNvbnN0IGF3cFN0cj1cImNsYXNzIEF1ZGlvQ2FwdHVyZUludGVyY2VwdG9yUHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29ye1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgQlVGRkVSX1FVQU5UVU1TPTY0O1xcblwiICtcclxuICAgIFwiICAgIFFVQU5UVU1fRlJBTUVfTEVOPTEyODtcXG5cIiArXHJcbiAgICBcIiAgICBCVUZGRVJfRlJBTUVfTEVOPXRoaXMuUVVBTlRVTV9GUkFNRV9MRU4qdGhpcy5CVUZGRVJfUVVBTlRVTVM7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyPW51bGw7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyUG9zPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICBjb25zdHJ1Y3RvcigpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgc3VwZXIoKTtcXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgIH1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiIHByb2Nlc3MoXFxuXCIgK1xyXG4gICAgXCIgICAgICBpbnB1dHMsXFxuXCIgK1xyXG4gICAgXCIgICAgICBvdXRwdXRzLFxcblwiICtcclxuICAgIFwiICAgICAgcGFyYW1ldGVyc1xcblwiICtcclxuICAgIFwiICApe1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBpbnB1dHNDbnQ9aW5wdXRzLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGNoYW5uZWxDb3VudD0wO1xcblwiICtcclxuICAgIFwiICAgICBsZXQgaW5wdXRMZW49MDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGlucHV0TGVuQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgaWYoaW5wdXRzQ250PjApIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGxldCBpbnB1dDAgPSBpbnB1dHNbMF07XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBjaGFubmVsQ291bnQgPSBpbnB1dDAubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA+IDApIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBsZXQgaW5wdXQwY2gwPWlucHV0MFswXTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBpbnB1dExlbj1pbnB1dDBjaDAubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGlucHV0TGVuQnl0ZXM9aW5wdXQwY2gwLmJ1ZmZlci5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgaWYgKCF0aGlzLmJ1ZmZlciB8fCB0aGlzLmJ1ZmZlci5sZW5ndGggPCBjaGFubmVsQ291bnQpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KGNoYW5uZWxDb3VudCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IDBcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGZvciAobGV0IGJjaCA9IDA7IGJjaCA8IGNoYW5uZWxDb3VudDsgYmNoKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltiY2hdID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLkJVRkZFUl9GUkFNRV9MRU4pO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlclBvc0J5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGJ1ZkF2YWlsID0gdGhpcy5CVUZGRVJfRlJBTUVfTEVOIC0gdGhpcy5idWZmZXJQb3M7XFxuXCIgK1xyXG4gICAgXCIgICAgIC8vIGNoZWNrIGlmIGJ1ZmZlciBoYXMgdG8gYmUgdHJhbnNmZXJyZWRcXG5cIiArXHJcbiAgICBcIiAgICAgaWYgKGlucHV0TGVuID4gYnVmQXZhaWwpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGxldCBhZGE9bmV3IEFycmF5KGNoYW5uZWxDb3VudCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgYWRhW2NoXT10aGlzLmJ1ZmZlcltjaF0uYnVmZmVyLnNsaWNlKDApO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBkYXRhOiBhZGEsXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgY2hzOiBjaGFubmVsQ291bnQsXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGVuOiB0aGlzLmJ1ZmZlclBvc1xcblwiICtcclxuICAgIFwiICAgICAgICAgfSwgYWRhKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIC8vIGJ1ZmZlciB0cmFuc2ZlcnJlZCwgcmVzZXRcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgIGZvcihsZXQgaWk9MDtpaTxpbnB1dHNDbnQ7aWkrKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIC8vIE11dGUgb3V0cHV0c1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIC8vb3V0cHV0c1tpaV1bY2hdLmZpbGwoMCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGV0IGNoU2FtcGxlcyA9IGlucHV0c1tpaV1bY2hdO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2NoXS5zZXQoY2hTYW1wbGVzLHRoaXMuYnVmZmVyUG9zKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zKz1pbnB1dExlbjtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXMrPWlucHV0TGVuQnl0ZXM7XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICBcXG5cIiArXHJcbiAgICBcIiAgICAgcmV0dXJuIHRydWU7XFxuXCIgK1xyXG4gICAgXCIgIH1cXG5cIiArXHJcbiAgICBcIn1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwicmVnaXN0ZXJQcm9jZXNzb3IoJ2NhcHR1cmUtaW50ZXJjZXB0b3InLEF1ZGlvQ2FwdHVyZUludGVyY2VwdG9yUHJvY2Vzc29yKTtcXG5cIjtcclxuXHJcblxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9DYXB0dXJlTGlzdGVuZXIge1xyXG4gIG9wZW5lZCgpOiB2b2lkO1xyXG5cclxuICBzdGFydGVkKCk6IHZvaWQ7XHJcblxyXG4gIHN0b3BwZWQoKTogdm9pZDtcclxuXHJcbiAgY2xvc2VkKCk6IHZvaWQ7XHJcblxyXG4gIGVycm9yKG1zZz86c3RyaW5nLGFkdmljZT86c3RyaW5nKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ2FwdHVyZSB7XHJcblxyXG4gIGdldCBtYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4QXV0b05ldE1lbVN0b3JlU2FtcGxlcztcclxuICB9XHJcblxyXG4gIHNldCBtYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXMgPSB2YWx1ZTtcclxuICB9XHJcbiAgc2V0IHJlY1VVSUQodmFsdWU6IHN0cmluZ3xudWxsKSB7XHJcbiAgICB0aGlzLl9yZWNVVUlEID0gdmFsdWU7XHJcbiAgfVxyXG4gIGdldCByZWNVVUlEKCk6IHN0cmluZyB8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNVVUlEO1xyXG4gIH1cclxuICBnZXQgYXVkaW9TdG9yYWdlVHlwZSgpOiBBdWRpb1N0b3JhZ2VUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb1N0b3JhZ2VUeXBlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGF1ZGlvU3RvcmFnZVR5cGUodmFsdWU6IEF1ZGlvU3RvcmFnZVR5cGUpIHtcclxuICAgIHRoaXMuX2F1ZGlvU3RvcmFnZVR5cGUgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQoKTogUGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQ7XHJcbiAgfVxyXG5cclxuICBzZXQgcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCh2YWx1ZTogUGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCB8IG51bGwpIHtcclxuICAgIHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBvcGVuZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3BlbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIEJVRkZFUl9TSVpFOiBudW1iZXIgPSA4MTkyO1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUFYX05FVF9BVVRPX01FTV9TVE9SRV9TQU1QTEVTOm51bWJlcj0yODgwMDAwKjU7IC8vIERlZmF1bHQgNSBtaW51dGUgYXQgNDhrSHpcclxuICBwcml2YXRlIF9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzOm51bWJlcj1BdWRpb0NhcHR1cmUuREVGQVVMVF9NQVhfTkVUX0FVVE9fTUVNX1NUT1JFX1NBTVBMRVM7XHJcbiAgY29udGV4dDogQXVkaW9Db250ZXh0O1xyXG4gIHN0cmVhbSE6IE1lZGlhU3RyZWFtO1xyXG4gIGNoYW5uZWxDb3VudCE6IG51bWJlcjtcclxuICBwcml2YXRlIF9yZWNVVUlEOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgbWVkaWFTdHJlYW06IGFueTtcclxuICBhZ2NTdGF0dXM6Ym9vbGVhbnxudWxsPW51bGw7XHJcbiAgYnVmZmVyaW5nTm9kZTogQXVkaW9Ob2RlfG51bGw9bnVsbDtcclxuICBsaXN0ZW5lciE6IEF1ZGlvQ2FwdHVyZUxpc3RlbmVyO1xyXG4gIGRhdGE6IEFycmF5PEFycmF5PEZsb2F0MzJBcnJheT4+fG51bGw9bnVsbDtcclxuICBjdXJyZW50U2FtcGxlUmF0ZSE6IG51bWJlcjtcclxuICBuOiBOYXZpZ2F0b3I7XHJcbiAgYXVkaW9PdXRTdHJlYW06IFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZGlzY29ubmVjdFN0cmVhbXMgPSB0cnVlO1xyXG4gIHByaXZhdGUgX29wZW5lZD1mYWxzZTtcclxuICBwcml2YXRlIGNhcHR1cmluZyA9IGZhbHNlO1xyXG5cclxuICBmcmFtZXNSZWNvcmRlZDogbnVtYmVyPTA7XHJcblxyXG4gIHByaXZhdGUgX2F1ZGlvU3RvcmFnZVR5cGU6QXVkaW9TdG9yYWdlVHlwZT1BdWRpb1N0b3JhZ2VUeXBlLk1FTV9FTlRJUkU7XHJcbiAgcHJpdmF0ZSBfcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldDpQZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0fG51bGw9bnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBwZXJzaXN0ZWQ9dHJ1ZTtcclxuICBwcml2YXRlIHBlcnNpc3RFcnJvcjpFcnJvcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBpbmRkYkF1ZGlvQnVmZmVyOkluZGV4ZWREYkF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dDogQXVkaW9Db250ZXh0KSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgdGhpcy5uID0gbmF2aWdhdG9yO1xyXG4gICAgdGhpcy5jb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRlY2hhbmdlJywgKGV2KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RhdGUgIT09ICdydW5uaW5nJykge1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXREYXRhKCkge1xyXG4gICAgaWYoIXRoaXMuX3JlY1VVSUQpIHtcclxuICAgICAgdGhpcy5fcmVjVVVJRCA9IFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMucGVyc2lzdEVycm9yPW51bGw7XHJcbiAgICBjb25zb2xlLmluZm8oXCJBdWRpbyBjYXB0dXJlIGluaXRpYWxpemUgc3RvcmFnZSBmb3IgdHlwZTogXCIrdGhpcy5fYXVkaW9TdG9yYWdlVHlwZSk7XHJcbiAgICBpZihBdWRpb1N0b3JhZ2VUeXBlLkRCX0NIVU5LRUQgPT09IHRoaXMuX2F1ZGlvU3RvcmFnZVR5cGUgJiYgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCAmJiB0aGlzLl9yZWNVVUlEKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJDcmVhdGUgaW5kZXhlZCBkYiBhdWRpbyBidWZmZXIuXCIpO1xyXG4gICAgICB0aGlzLmluZGRiQXVkaW9CdWZmZXIgPSBuZXcgSW5kZXhlZERiQXVkaW9CdWZmZXIodGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCwgdGhpcy5jaGFubmVsQ291bnQsdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSxBdWRpb0NhcHR1cmUuQlVGRkVSX1NJWkUsMCx0aGlzLl9yZWNVVUlEKVxyXG4gICAgfVxyXG4gICAgaWYoIShBdWRpb1N0b3JhZ2VUeXBlLk5FVF9DSFVOS0VEID09PSB0aGlzLl9hdWRpb1N0b3JhZ2VUeXBlKSkge1xyXG4gICAgICAvLyBJbml0aWFsaXplIGF1ZGlvIGRhdGEgYXJyYXkgZXhjZXB0IGZvciBuZXQgYXVkaW8gYnVmZmVyIG1vZGVcclxuICAgICAgdGhpcy5kYXRhID0gbmV3IEFycmF5PEFycmF5PEZsb2F0MzJBcnJheT4+KCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVsQ291bnQ7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmZyYW1lc1JlY29yZGVkID0gMDtcclxuICB9XHJcblxyXG4gIGxpc3REZXZpY2VzKCkge1xyXG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigobDogTWVkaWFEZXZpY2VJbmZvW10pID0+IHRoaXMucHJpbnREZXZpY2VzKGwpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHVtbXlTZXNzaW9uKCk6UHJvbWlzZTxNZWRpYVN0cmVhbT57XHJcbiAgICAvLyB3b3JrYXJvdW5kIHRvIHJlcXVlc3QgcGVybWlzc2lvbnM6XHJcbiAgICAvLyBTdGFydCBhIGR1bW15IHNlc3Npb25cclxuICAgIGxldCBtZWRpYVN0ckNuc3RycyA9IDxNZWRpYVN0cmVhbUNvbnN0cmFpbnRzPnthdWRpbzpcclxuICAgICAgICB7ZWNob0NhbmNlbGF0aW9uOiBmYWxzZX1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobWVkaWFTdHJDbnN0cnMpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHN0b3BBbGxTZXNzaW9uVHJhY2tzKG1lZGlhU3RyZWFtOk1lZGlhU3RyZWFtKXtcclxuICAgICAgbGV0IGF0cyA9IG1lZGlhU3RyZWFtLmdldFRyYWNrcygpO1xyXG4gICAgICBmb3IgKGxldCBhdElkeCA9IDA7IGF0SWR4IDwgYXRzLmxlbmd0aDsgYXRJZHgrKykge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0b3AgZHVtbXkgc2Vzc2lvbiB0cmFjazogI1wiICsgYXRJZHgpXHJcbiAgICAgICAgYXRzW2F0SWR4XS5zdG9wKCk7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIGRldmljZUluZm9zKGNiOiAoZGV2aWNlSW5mb3M6IE1lZGlhRGV2aWNlSW5mb1tdIHwgbnVsbCkgPT4gYW55LCByZXRyeSA9IHRydWUsZHVtbXlTdHJlYW0/Ok1lZGlhU3RyZWFtKSB7XHJcblxyXG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigobDogTWVkaWFEZXZpY2VJbmZvW10pID0+IHtcclxuICAgICAgbGV0IGxhYmVsc0F2YWlsYWJsZSA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZGkgPSBsW2ldO1xyXG4gICAgICAgIGlmIChkaS5sYWJlbCkge1xyXG4gICAgICAgICAgbGFiZWxzQXZhaWxhYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFsYWJlbHNBdmFpbGFibGUpIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJNZWRpYSBkZXZpY2UgZW51bWVyYXRpb246IE5vIGxhYmVscy5cIilcclxuICAgICAgICBpZiAocmV0cnkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU3RhcnRpbmcgZHVtbXkgc2Vzc2lvbiB0byByZXF1ZXN0IGF1ZGlvIHBlcm1pc3Npb25zLi4uXCIpXHJcblxyXG4gICAgICAgICAgICB0aGlzLmR1bW15U2Vzc2lvbigpLnRoZW4oKHM6IE1lZGlhU3RyZWFtKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGFuZCBzdG9wIGl0IGltbWVkaWF0ZWx5XHJcblxyXG4gICAgICAgICAgICBpZihzKSB7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiR290IGR1bW15IHNlc3Npb24gc3RyZWFtOiBcIiArIHMgKyBcIiAuXCIpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk5vIGR1bW15IHN0cmVhbVwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHJldHJ5IChvbmx5IG9uY2UpXHJcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlSW5mb3MoY2IsIGZhbHNlLHMpO1xyXG4gICAgICAgICAgfSxyZWFzb24gPT4ge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uIHJlamVjdGVkLlwiKVxyXG4gICAgICAgICAgICAvLyBUT0RPIGVycm9yIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBzdWNjZXNzXHJcbiAgICAgICAgY2IobCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZHVtbXlTdHJlYW0pe1xyXG4gICAgICAgIHRoaXMuc3RvcEFsbFNlc3Npb25UcmFja3MoZHVtbXlTdHJlYW0pO1xyXG4gICAgICB9XHJcbiAgICB9LChyZWFzb24pPT4ge1xyXG4gICAgICAvL3JlamVjdGVkXHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk1lZGlhIGRldmljZSBlbnVtZXJhdGlvbiByZWplY3RlZC5cIilcclxuICAgICAgaWYgKHJldHJ5KSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RhcnRpbmcgZHVtbXkgc2Vzc2lvbiB0byByZXF1ZXN0IGF1ZGlvIHBlcm1pc3Npb25zLi4uXCIpXHJcbiAgICAgICAgdGhpcy5kdW1teVNlc3Npb24oKS50aGVuKChzOiBNZWRpYVN0cmVhbSkgPT4ge1xyXG4gICAgICAgICAgLy8gYW5kIHN0b3AgaXQgaW1tZWRpYXRlbHlcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkR1bW15IHNlc3Npb24uXCIpXHJcbiAgICAgICAgICBpZihzKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkdvdCBkdW1teSBzZXNzaW9uIHN0cmVhbTogXCIgKyBzICsgXCIgLlwiKVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk5vIGR1bW15IHN0cmVhbVwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gcmV0cnkgKG9ubHkgb25jZSlcclxuICAgICAgICAgIHRoaXMuZGV2aWNlSW5mb3MoY2IsIGZhbHNlLHMpO1xyXG4gICAgICAgIH0sIHJlYXNvbiA9PiB7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uIHJlamVjdGVkLlwiKVxyXG4gICAgICAgICAgLy8gVE9ETyBlcnJvciBjYWxsYmFja1xyXG4gICAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZHVtbXlTdHJlYW0pe1xyXG4gICAgICAgIHRoaXMuc3RvcEFsbFNlc3Npb25UcmFja3MoZHVtbXlTdHJlYW0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBwcmludERldmljZXMobDogTWVkaWFEZXZpY2VJbmZvW10pOiB2b2lkIHtcclxuICAgIC8vbGV0IHNlbERldmljZUlkID0gJ19fX2R1bW15X19fJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgZGkgPSBsW2ldO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkF1ZGlvIGRldmljZTogSWQ6IFwiICsgZGkuZGV2aWNlSWQgKyBcIiBncm91cElkOiBcIiArIGRpLmdyb3VwSWQgKyBcIiBsYWJlbDogXCIgKyBkaS5sYWJlbCArIFwiIGtpbmQ6IFwiICsgZGkua2luZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuKGNoYW5uZWxDb3VudDogbnVtYmVyLCBzZWxEZXZpY2VJZD86IENvbnN0cmFpbkRPTVN0cmluZ3x1bmRlZmluZWQsYXV0b0dhaW5Db250cm9sQ29uZmlncz86QXJyYXk8QXV0b0dhaW5Db250cm9sQ29uZmlnPnxudWxsfHVuZGVmaW5lZCl7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJDYXB0dXJlIG9wZW46IGN0eCBzdGF0ZTogXCIrdGhpcy5jb250ZXh0LnN0YXRlKTtcclxuICAgIGlmKHRoaXMuY29udGV4dC5zdGF0ZSE9PSdydW5uaW5nJyl7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNhcHR1cmUgb3BlbjogUmVzdW1lIGNvbnRleHRcIik7XHJcbiAgICAgIHRoaXMuY29udGV4dC5yZXN1bWUoKS50aGVuKCgpPT57XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2FwdHVyZSBvcGVuIChjdHggcmVzdW1lZCk6IGN0eCBzdGF0ZTogXCIrdGhpcy5jb250ZXh0LnN0YXRlKTtcclxuICAgICAgICB0aGlzLl9vcGVuKGNoYW5uZWxDb3VudCwgc2VsRGV2aWNlSWQsIGF1dG9HYWluQ29udHJvbENvbmZpZ3MpO1xyXG4gICAgICB9KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuX29wZW4oY2hhbm5lbENvdW50LCBzZWxEZXZpY2VJZCwgYXV0b0dhaW5Db250cm9sQ29uZmlncyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgX29wZW4oY2hhbm5lbENvdW50OiBudW1iZXIsIHNlbERldmljZUlkPzogQ29uc3RyYWluRE9NU3RyaW5nfHVuZGVmaW5lZCxhdXRvR2FpbkNvbnRyb2xDb25maWdzPzpBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+fG51bGx8dW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDtcclxuICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgPSAwO1xyXG5cclxuXHJcbiAgICAvL3ZhciBtc2MgPSBuZXcgQXVkaW9TdHJlYW1Db25zdHIoKTtcclxuICAgIC8vIHZhciBtc2M9e307XHJcbiAgICAvL21zYy52aWRlbyA9IGZhbHNlO1xyXG4gICAgLy9tc2MuYXVkaW8gPSB0cnVlO1xyXG5cclxuICAgIC8vIENocm9tZSBhbmQgRmlyZWZveCBzdGVyZW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbCAhIVxyXG4gICAgLy8gQW5kIGV2ZW4gd29yc2U6IFRoZSBkYXRhIGNvbWluZyBmcm9tIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSBwcmVwcm9jZXNzZWQgb24gRkYgYW5kIENocm9tZS4gSXQgY29udGFpbnMgRFNQIGFydGlmYWN0cyEhXHJcblxyXG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzg3NzM3XHJcbiAgICAvLyBUaGUgd29ya2Fyb3VuZCB0byBzZXQgdGhlc2UgY29uc3RyYWludHMgZG9lcyBfTk9UXyBoZWxwOlxyXG4gICAgLy92YXIgbXNjPXthdWRpbzoge2VjaG9DYW5jZWxsYXRpb246IGZhbHNlLGNoYW5uZWxDb3VudDogMiwgZ29vZ0F1ZGlvTWlycm9yaW5nOiBmYWxzZX0sdmlkZW86IGZhbHNlfTtcclxuXHJcbiAgICAvLyBTYWZhcmkgYXQgbGVhc3QgdmVyc2lvbiAxMTogU3VwcG9ydCBmb3IgbWVkaWEgc3RyZWFtc1xyXG4gICAgLy8gVE9ETyB0ZXN0IGlmIGlucHV0IGlzIHVucHJvY2Vzc2VkXHJcblxyXG4gICAgbGV0IG1zYzpNZWRpYVN0cmVhbUNvbnN0cmFpbnRzO1xyXG4gICAgY29uc29sZS5pbmZvKCdVc2VyIGFnZW50OiAnK25hdmlnYXRvci51c2VyQWdlbnQpO1xyXG5cclxuXHJcbiAgICAgIGxldCB1YT1Vc2VyQWdlbnRCdWlsZGVyLnVzZXJBZ2VudCgpO1xyXG5cclxuICAgICAgLy8gdWEuY29tcG9uZW50cy5mb3JFYWNoKChjKT0+e1xyXG4gICAgICAvLyAgIGNvbnNvbGUuaW5mbyhcIlVBX0NvbXA6IFwiK2MudG9TdHJpbmcoKSk7XHJcbiAgICAgIC8vIH0pXHJcblxyXG4gICAgIGxldCBhZ2NDZmc6QXV0b0dhaW5Db250cm9sQ29uZmlnfG51bGw9bnVsbDtcclxuXHJcbiAgICBsZXQgYXV0b0dhaW5Db250cm9sPWZhbHNlO1xyXG4gICAgbGV0IGNocm9tZUVjaG9DYW5jZWxsYXRpb249ZmFsc2U7XHJcbiAgICBpZihhdXRvR2FpbkNvbnRyb2xDb25maWdzKXtcclxuICAgICAgZm9yKGxldCBhZ2NjIG9mIGF1dG9HYWluQ29udHJvbENvbmZpZ3Mpe1xyXG4gICAgICAgIGlmKGFnY2MucGxhdGZvcm09PT1DZmdQbGF0Zm9ybS5BbmRyb2lkICYmIHVhLmRldGVjdGVkUGxhdGZvcm09PT1QbGF0Zm9ybS5BbmRyb2lkKXtcclxuICAgICAgICAgICAgYWdjQ2ZnPWFnY2M7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihhZ2NjLnBsYXRmb3JtPT09Q2ZnUGxhdGZvcm0uV2luZG93cyAmJiB1YS5kZXRlY3RlZFBsYXRmb3JtPT09UGxhdGZvcm0uV2luZG93cyl7XHJcbiAgICAgICAgICBhZ2NDZmc9YWdjYztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZihhZ2NDZmcpe1xyXG4gICAgICAgIC8vIFRPRE8gdXNlIEVYQUNUL0lERUFMIGNvbnN0cmFpbnRcclxuICAgICAgICBhdXRvR2FpbkNvbnRyb2w9YWdjQ2ZnLnZhbHVlO1xyXG4gICAgICAgIGlmKENIUk9NRV9BQ1RJVkFURV9FQ0hPX0NBTkNFTExBVElPTl9XSVRIX0FHQyl7XHJcbiAgICAgICAgICBjaHJvbWVFY2hvQ2FuY2VsbGF0aW9uPWFnY0NmZy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETyBxdWVyeSByZWFsIEFHQyBzdGF0dXNcclxuICAgICAgICB0aGlzLmFnY1N0YXR1cz1hZ2NDZmcudmFsdWU7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuYWdjU3RhdHVzPWZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGVmYXVsdFxyXG4gICAgbXNjID0ge1xyXG4gICAgICBhdWRpbzoge1xyXG4gICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcclxuICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IGF1dG9HYWluQ29udHJvbFxyXG4gICAgICB9LFxyXG4gICAgICB2aWRlbzogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuRWRnZSkge1xyXG5cclxuICAgICAgLy8gTWljcm9zb2Z0IEVkZ2Ugc2VuZHMgdW5tb2RpZmllZCBhdWRpb1xyXG4gICAgICAvLyBUaGUgY29uc3RyYWludCBjYW4gZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIE1pY3Jvc29mdCBFZGdlLlwiKTtcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcclxuICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgYXV0b0dhaW5Db250cm9sOiBhdXRvR2FpbkNvbnRyb2xcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLkNocm9tZSkge1xyXG4gICAgICAvLyBHb29nbGUgQ2hyb21lOiB3ZSBuZWVkIHRvIHN3aXRjaCBvZiBlYWNoIG9mIHRoZSBwcmVwcm9jZXNzaW5nIHVuaXRzIGluY2x1ZGluZyB0aGVcclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgR29vZ2xlIENocm9tZS5cIik7XHJcblxyXG4gICAgICAvLyBDaHJvbWUgNjAgLT4gNjEgY2hhbmdlZFxyXG4gICAgICAvLyBpdCB3b3JrcyBub3cgd2l0aG91dCBtYW5kYXRvcnkvb3B0aW9uYWwgc3ViLW9iamVjdHNcclxuXHJcblxyXG4gICAgICAvLyBSZXF1aXJlcyBhdCBsZWFzdCBDaHJvbWUgNjFcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IHtleGFjdDpjaHJvbWVFY2hvQ2FuY2VsbGF0aW9ufSxcclxuICAgICAgICAgIGF1dG9HYWluQ29udHJvbDoge2V4YWN0OmF1dG9HYWluQ29udHJvbH0sXHJcbiAgICAgICAgICBzYW1wbGVTaXplOnttaW46IDE2fSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZSxcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5GaXJlZm94KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIE1vemlsbGEgRmlyZWZveC5cIik7XHJcbiAgICAgIC8vIEZpcmVmb3hcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgYXV0b0dhaW5Db250cm9sOiBhdXRvR2FpbkNvbnRyb2wsXHJcbiAgICAgICAgICBub2lzZVN1cHByZXNzaW9uOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLlNhZmFyaSkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBTYWZhcmkgYnJvd3Nlci5cIilcclxuICAgICAgLy9jb25zb2xlLmluZm8oXCJBcHBseSB3b3JrYXJvdW5kIGZvciBTYWZhcmk6IEF2b2lkIGRpc2Nvbm5lY3Qgb2Ygc3RyZWFtcy5cIik7XHJcblxyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3RTdHJlYW1zID0gdHJ1ZTtcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gVE9ETyBkZWZhdWx0IGNvbnN0cmFpbnRzIG9yIGVycm9yIEJyb3dzZXIgbm90IHN1cHBvcnRlZFxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGNhcHR1cmUsIEFHQzogXCIrdGhpcy5hZ2NTdGF0dXMpXHJcblxyXG5cclxuICAgIGxldCB1bXAgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtc2MpO1xyXG4gICAgdW1wLnRoZW4oKHMpID0+IHtcclxuICAgICAgICB0aGlzLnN0cmVhbSA9IHM7XHJcblxyXG4gICAgICAgIGxldCBhVHJhY2tzID0gcy5nZXRBdWRpb1RyYWNrcygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFUcmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBhVHJhY2sgPSBhVHJhY2tzW2ldO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIGF1ZGlvIGluZm86IGlkOiBcIiArIGFUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgYVRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXFxcIlwiICsgYVRyYWNrLmxhYmVsICsgXCJcXFwiXCIpO1xyXG4gICAgICAgICAgbGV0IG10clN0cz1hVHJhY2suZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgICAgICAgICAvLyBUeXBlc2NyaXB0IGxpYi5kb20udHMgTWVkaWFUcmFja1NldHRpbmdzLmNoYW5uZWxDb3VudCBpcyBtaXNzaW5nXHJcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWRuL2Jyb3dzZXItY29tcGF0LWRhdGEvYmxvYi81NDkzZDhmOTM3ZTA1YjJkZGJkNDFiOTlmNWJkZmFkNGExZjJlZDg1L2FwaS9NZWRpYVRyYWNrU2V0dGluZ3MuanNvblxyXG4gICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBzZXR0aW5nczogQ2ggY250OiBcIittdHJTdHMuY2hhbm5lbENvdW50K1wiLCBBR0M6IFwiK210clN0cy5hdXRvR2FpbkNvbnRyb2wrXCIsIEVjaG8gY2FuY2VsbC46IFwiK210clN0cy5lY2hvQ2FuY2VsbGF0aW9uKTtcclxuICAgICAgICAgIGlmKG10clN0cy5hdXRvR2FpbkNvbnRyb2wpe1xyXG4gICAgICAgICAgICB0aGlzLmFnY1N0YXR1cz1tdHJTdHMuYXV0b0dhaW5Db250cm9sO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHZUcmFja3MgPSBzLmdldFZpZGVvVHJhY2tzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2VHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdlRyYWNrID0gdlRyYWNrc1tpXTtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIHZpZGVvIGluZm86IGlkOiBcIiArIHZUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgdlRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXCIgKyB2VHJhY2subGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHMpO1xyXG4gICAgICAgIC8vIHN0cmVhbSBjaGFubmVsIGNvdW50ICggaXMgYWx3YXlzIDIgISlcclxuICAgICAgICBsZXQgc3RyZWFtQ2hhbm5lbENvdW50OiBudW1iZXIgPSB0aGlzLm1lZGlhU3RyZWFtLmNoYW5uZWxDb3VudDtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJTdHJlYW0gY2hhbm5lbCBjb3VudDogXCIrc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAvLyBpcyBub3Qgc2V0ISFcclxuICAgICAgICAvL3RoaXMuY3VycmVudFNhbXBsZVJhdGUgPSB0aGlzLm1lZGlhU3RyZWFtLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSA9IHRoaXMuY29udGV4dC5zYW1wbGVSYXRlO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIlNvdXJjZSBhdWRpbyBub2RlOiBjaGFubmVsczogXCIgKyBzdHJlYW1DaGFubmVsQ291bnQgKyBcIiBzYW1wbGVyYXRlOiBcIiArIHRoaXMuY3VycmVudFNhbXBsZVJhdGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLnNldEZvcm1hdCh0aGlzLmNoYW5uZWxDb3VudCwgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFczQyAgLT4gbmV3IG5hbWUgaXMgY3JlYXRlU2NyaXB0UHJvY2Vzc29yXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBBZ2FpbiBkZXByZWNhdGVkLCBidXQgQXVkaW9Xb3JrZXIgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBzdGFibGUgcmVsZWFzZXMgKEp1bmUgMjAxNilcclxuICAgICAgICAvLyBBdWRpb1dvcmtlciBpcyBub3cgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIC4uLiAoTWF5IDIwMTcpXHJcblxyXG4gICAgICAvLyBVcGRhdGUgMTItMjAyMDpcclxuICAgICAgIC8vIFRoZSBTY3JpcHRQcm9jZXNzb3JOb2RlIEludGVyZmFjZSAtIERFUFJFQ0FURURcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSAwNi0yMDIxXHJcbiAgICAgIC8vICBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgaXMgaGVyZSB0byBzdGF5LiBXZWIgQXVkaW8gQVBJIGhhcyBub3cgUmVjb21tZW5kYXRpb24gc3RhdHVzICFcclxuXHJcbiAgICAgICAgICBpZih0aGlzLmNvbnRleHQuYXVkaW9Xb3JrbGV0KXtcclxuICAgICAgICAgICAgLy9jb25zdCB3b3JrbGV0RmlsZU5hbWUgPSAoJ2ZpbGUtbG9hZGVyIS4vaW50ZXJjZXB0b3Jfd29ya2xldC5qcycpO1xyXG4gICAgICAgICAgICAvL2NvbnN0IHdvcmtsZXRGaWxlTmFtZSA9ICdodHRwOi8vbG9jYWxob3N0OjQyMDAvYXNzZXRzL2ludGVyY2VwdG9yX3dvcmtsZXQuanMnO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGF3cFN0cik7XHJcbiAgICAgICAgICAgIGxldCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iPSBuZXcgQmxvYihbYXdwU3RyXSwge3R5cGU6ICd0ZXh0L2phdmFzY3JpcHQnfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYlVybD13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChhdWRpb1dvcmtsZXRNb2R1bGVCbG9iKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5hdWRpb1dvcmtsZXQuYWRkTW9kdWxlKGF1ZGlvV29ya2xldE1vZHVsZUJsb2JVcmwpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3biA9IG5ldyBBdWRpb1dvcmtsZXROb2RlKHRoaXMuY29udGV4dCwgJ2NhcHR1cmUtaW50ZXJjZXB0b3InKTtcclxuICAgICAgICAgICAgICAgICAgYXduLm9ucHJvY2Vzc29yZXJyb3I9KGV2OkV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c9J1Vua253b24gZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGV2IGluc3RhbmNlb2YgRXJyb3JFdmVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBtc2c9ZXYubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhcHR1cmUgYXVkaW8gd29ya2xldCBlcnJvcjogXCIrbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxpc3RlbmVyKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IobXNnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbGV0IGF3blB0ID0gYXduLnBvcnQ7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChhd25QdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3blB0Lm9ubWVzc2FnZSA9IChldjogTWVzc2FnZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXB0dXJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR0PWV2LmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaHMgPSBkdC5jaHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGFMZW4gPSBkdC5kYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUdfVFJBQ0VfTEVWRUw+OCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1JlY2VpdmVkIGRhdGEgZnJvbSB3b3JrbGV0OiAnICtjaHMgKyAnICcgKyBkdC5sZW4gKycgRGF0YSBjaHM6ICcrYWRhTGVuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmsgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYW1wbGVzPXRoaXMuZnJhbWVzUmVjb3JkZWQqY2hzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQ9PT10aGlzLmF1ZGlvU3RvcmFnZVR5cGUgfHwgQXVkaW9TdG9yYWdlVHlwZS5NRU1fQ0hVTktFRF9BVVRPX05FVF9DSFVOS0VEPT09dGhpcy5hdWRpb1N0b3JhZ2VUeXBlKSAmJiB0aGlzLmRhdGEgJiYgc2FtcGxlcz50aGlzLl9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGE9bnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRGF0YSBpbml0aWFsaXplZDogXCIrKHRoaXMuZGF0YSE9bnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRGF0YSBjaCBpbml0aWFsaXplZDogXCIrKHRoaXMuZGF0YSAhPW51bGwgJiYgdGhpcy5kYXRhW2NoXSAhPW51bGwpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2g8dGhpcy5jaGFubmVsQ291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdC5kYXRhW2NoXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmEgPSBuZXcgRmxvYXQzMkFycmF5KGR0LmRhdGFbY2hdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGFbY2hdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5wdXNoKGZhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1tjaF0gPSBmYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHNhbXBsZXMgb2YgY2hhbm5lbCAwIHRvIGNvdW50IGZyYW1lcyAoc2FtcGxlcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lc1JlY29yZGVkICs9IGZhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLndyaXRlKGNodW5rKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8vIFJhbmRvbSB0ZXN0IGVycm9yOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYoTWF0aC5yYW5kb20oKT4wLjk4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHRocm93IG5ldyBFcnJvcignVGVzdCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RFcnJvcj1lcnI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJzaXN0RXJyb3I9bmV3IEVycm9yKCdFcnJvciBoYW5kbGluZyByZWNvcmRlZCBhdWRpbyBkYXRhJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhcHR1cmUgZXJyb3I6IFwiK2Vycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhcHR1cmUgbmV4dCBlcnJvciAoaWdub3JlZCk6IFwiK2VycjIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJFeHBsID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyRXhwbCA9ICc6ICcgKyBlcnIubmFtZSArICc6ICcgKyBlcnIubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcihcIkNvdWxkIG5vdCBoYW5kbGUgcmVjb3JkZWQgYXVkaW8gZGF0YVwiICsgZXJyRXhwbCwgXCJQbGVhc2UgdHJ5IHRvIHJlY29yZCBhZ2Fpbi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKEF1ZGlvU3RvcmFnZVR5cGUuREJfQ0hVTktFRD09PXRoaXMuX2F1ZGlvU3RvcmFnZVR5cGUgJiYgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAvLyBUcmllZCB0byBmaXggdGhhdCBTYWZhcmkgZG9lcyBub3QgcmVjb3JkIHRoZSBzZWNvbmQgY2hhbm5lbFxyXG4gICAgICAgICAgICAgICAgICAvLyBEb2VzIG5vdCBoZWxwXHJcbiAgICAgICAgICAgICAgICAgIC8vYXduLmNoYW5uZWxDb3VudD10aGlzLmNoYW5uZWxDb3VudDtcclxuICAgICAgICAgICAgICAgICAgLy9hd24uY2hhbm5lbENvdW50TW9kZT0nZXhwbGljaXQnO1xyXG4gICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ0NoYW5uZWwgY291bnQgZXhwbGljaXRseSBzZXQgdG8gJyt0aGlzLmNoYW5uZWxDb3VudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUgPSBhd247XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5idWZmZXJpbmdOb2RlLmNoYW5uZWxDb3VudD10aGlzLmNoYW5uZWxDb3VudDtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fb3BlbmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9wZW5lZCgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICkuY2F0Y2goKGVycm9yOiBhbnkpPT57XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBhZGQgbW9kdWxlICcrZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB9ZWxzZSBpZih0aGlzLmNvbnRleHQuY3JlYXRlU2NyaXB0UHJvY2Vzc29yKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBTY3JpcHRQcm9jZXNzb3JOb2RlIEludGVyZmFjZSAtIERFUFJFQ0FURUQgT25seSBhcyBmYWxsYmFja1xyXG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSB1c2Ugc3RyZWFtQ2hhbm5lbENvdW50IG9yIGNoYW5uZWxDb3VudCBoZXJlID9cclxuICAgICAgICAgICAgbGV0IHNjcmlwdFByb2Nlc3Nvck5vZGU9IHRoaXMuY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IoQXVkaW9DYXB0dXJlLkJVRkZFUl9TSVpFLCBzdHJlYW1DaGFubmVsQ291bnQsIHN0cmVhbUNoYW5uZWxDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZT1zY3JpcHRQcm9jZXNzb3JOb2RlO1xyXG4gICAgICAgICAgICBsZXQgYyA9IDA7XHJcbiAgICAgICAgICAgIGlmKHNjcmlwdFByb2Nlc3Nvck5vZGUub25hdWRpb3Byb2Nlc3Mpe1xyXG4gICAgICAgICAgICAgIHNjcmlwdFByb2Nlc3Nvck5vZGUub25hdWRpb3Byb2Nlc3MgPSAoZTogQXVkaW9Qcm9jZXNzaW5nRXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXB0dXJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGluQnVmZmVyID0gZS5pbnB1dEJ1ZmZlcjtcclxuICAgICAgICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHJlcXVlc3RlZCBjb3VudCBvZiBjaGFubmVsc1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEJ1ZmZlcnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaGFubmVsQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaDogbnVtYmVyID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzID0gaW5CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaFNhbXBsZXNDb3B5ID0gY2hTYW1wbGVzLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZmZXJzW2NoXSA9IGNoU2FtcGxlc0NvcHkuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbY2hdLnB1c2goY2hTYW1wbGVzQ29weSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKERFQlVHX1RSQUNFX0xFVkVMPjgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlByb2Nlc3MgXCIrY2hTYW1wbGVzQ29weS5sZW5ndGgrXCIgc2FtcGxlcy5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gY2hTYW1wbGVzQ29weS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYysrO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ud3JpdGUoY3VycmVudEJ1ZmZlcnMpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9wZW5lZCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHByb2Nlc3NpbmcgKFNjcmlwdFByb2Nlc3Nvci5vbmF1ZGlvcHJvY2VzcyBtZXRob2Qgbm90IGZvdW5kKSEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBwcm9jZXNzaW5nIChuZWl0aGVyIEF1ZGlvV29ya2xldFByb2Nlc3NvciBub3IgU2NyaXB0UHJvY2Vzc29yKSEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlICsgXCIgRXJyb3IgbmFtZTogXCIgK2UubmFtZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICBpZignTm90QWxsb3dlZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdOb3QgYWxsb3dlZCB0byB1c2UgeW91ciBtaWNyb3Bob25lLicsJ1BsZWFzZSBtYWtlIHN1cmUgdGhhdCBtaWNyb3Bob25lIGFjY2VzcyBpcyBhbGxvd2VkIGZvciB0aGlzIHdlYiBwYWdlIGFuZCByZWxvYWQgdGhlIHBhZ2UuJyk7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCdOb3RSZWFkYWJsZUVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdDb3VsZCBub3QgcmVhZCBmcm9tIHlvdXIgYXVkaW8gZGV2aWNlLicsJ1BsZWFzZSBtYWtlIHN1cmUgeW91ciBhdWRpbyBkZXZpY2UgaXMgd29ya2luZy4nKTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoJ092ZXJjb25zdHJhaW5lZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICBsZXQgZU1zZz1lLm1zZz9lLm1zZzonT3ZlcmNvbnN0cmFpbmVkIG1lZGlhIGRldmljZSByZXF1ZXN0IGVycm9yLic7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcihlTXNnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdGFydCgpe1xyXG4gICAgdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS5uZXh0U3RyZWFtKClcclxuICAgIH1cclxuICAgIHRoaXMuY2FwdHVyaW5nID0gdHJ1ZTtcclxuICAgIGlmKHRoaXMuYnVmZmVyaW5nTm9kZSkge1xyXG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLmNvbm5lY3QodGhpcy5idWZmZXJpbmdOb2RlKTtcclxuICAgICAgdGhpcy5idWZmZXJpbmdOb2RlLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMubGlzdGVuZXIuc3RhcnRlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICBjb25zdCBhU3Q9dGhpcy5jb250ZXh0LnN0YXRlO1xyXG4gICAgaWYoYVN0PT09J3J1bm5pbmcnKSB7XHJcbiAgICAgIHRoaXMuX3N0YXJ0KCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkNhcHR1cmUgc3RhcnQ6IGF1ZGlvIGNvbnRleHQgbm90IHJ1bm5pbmcsIHN0YXRlOiBcIithU3QrXCIsIHJlc3VtaW5nLi4uXCIpO1xyXG4gICAgICB0aGlzLmNvbnRleHQucmVzdW1lKCkudGhlbigoKT0+e1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJDYXB0dXJlIHN0YXJ0OiBhdWRpbyBjb250ZXh0IHJlc3VtZWQsIHN0YXJ0aW5nLi4uXCIpO1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0KCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9wKCkge1xyXG5cclxuICAgIGlmICh0aGlzLmRpc2Nvbm5lY3RTdHJlYW1zICYmIHRoaXMuYnVmZmVyaW5nTm9kZSkge1xyXG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLmRpc2Nvbm5lY3QodGhpcy5idWZmZXJpbmdOb2RlKTtcclxuICAgICAgdGhpcy5idWZmZXJpbmdOb2RlLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0uZmx1c2goKTtcclxuICAgICAgfVxyXG4gICAgfWNhdGNoKGVycil7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgZmx1c2ggY2FwdHVyZSBzdHJlYW0uXCIpO1xyXG4gICAgIHRocm93IGVycjtcclxuICAgIH1maW5hbGx5IHtcclxuICAgICAgdGhpcy5jYXB0dXJpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuaW5kZGJBdWRpb0J1ZmZlciAmJiB0aGlzLnBlcnNpc3RFcnJvcikge1xyXG4gICAgICAgIC8vIERlbGV0ZSBpbnZhbGlkIHBlcnNpc3RlbnQgYXVkaW8gZGF0YSBhbmQgaG9wZSB0aGF0IGl0IHdpbGwgYmUgY29tcGxldGVseSB1cGxvYWRlZCB0byB0aGUgc2VydmVyXHJcbiAgICAgICAgdGhpcy5pbmRkYkF1ZGlvQnVmZmVyLnJlbGVhc2VBdWRpb0RhdGEoKTtcclxuICAgICAgICB0aGlzLmluZGRiQXVkaW9CdWZmZXIgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmxpc3RlbmVyICYmICh0aGlzLnBlcnNpc3RFcnJvciB8fCB0aGlzLnBlcnNpc3RlZCkpIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdG9wcGVkIGJ5IHN0b3AoKSBtZXRob2QgY2FsbFwiKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyLnN0b3BwZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHN0b3JlKCl7XHJcbiAgIC8vIGlmKHRoaXMuZGIgJiYgdGhpcy5yZWNVVUlEKXtcclxuICAgLy8gICAgbGV0IHRyPSB0aGlzLmRiLnRyYW5zYWN0aW9uKFNwckRiLlJFQ09SRElOR19GSUxFX0NIVU5LU19PQkpFQ1RfU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xyXG4gICAvLyAgICBsZXQgcmVjRmlsZU9ialN0b3JlID0gdHIub2JqZWN0U3RvcmUoU3ByRGIuUkVDT1JESU5HX0ZJTEVfQ0hVTktTX09CSkVDVF9TVE9SRV9OQU1FKTtcclxuICAgLy9cclxuICAgLy8gICAgICB0cnkge1xyXG4gICAvLyAgICAgICAgbGV0IGNoMERhdGE9dGhpcy5kYXRhWzBdO1xyXG4gICAvLyAgICAgICAgbGV0IGRhdGFDaGtDbnQ9Y2gwRGF0YS5sZW5ndGg7XHJcbiAgIC8vICAgICAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAvLyAgICAgICAgICBmb3IgKGxldCBjaENrSWR4ID0gMDsgY2hDa0lkeCA8IGRhdGFDaGtDbnQ7IGNoQ2tJZHgrKykge1xyXG4gICAvLyAgICAgICAgICAgIGxldCBidWZMZW49MDtcclxuICAgLy8gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgLy8gICAgICAgICAgICAgIGxldCBjaENoayA9IHRoaXMuZGF0YVtjaF1bY2hDa0lkeF07XHJcbiAgIC8vICAgICAgICAgICAgICBidWZMZW4gPSBjaENoay5sZW5ndGg7XHJcbiAgIC8vICAgICAgICAgICAgICAvL2xldCBjYWNoZUlkID0gdXVpZCArICdfJyArIGNoICsgJ18nICsgY2hDa0lkeDtcclxuICAgLy8gICAgICAgICAgICAgIGxldCBjaGtEYklkID0gW3RoaXMucmVjVVVJRCwgdGhpcy5pbmREYkNoa0lkeCArIGNoQ2tJZHgsIGNoXTtcclxuICAgLy8gICAgICAgICAgICAgIGxldCBjciA9IHJlY0ZpbGVPYmpTdG9yZS5hZGQoY2hDaGssIGNoa0RiSWQpO1xyXG4gICAvLyAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQWRkZWQ6IFwiK2NoK1wiIFwiKyh0aGlzLmluZERiQ2hrSWR4K2NoQ2tJZHgpKTtcclxuICAgLy8gICAgICAgICAgICAgIGNyLm9uc3VjY2Vzcz0oKT0+e1xyXG4gICAvLyAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdG9yZWQgYXVkaW8gZGF0YSB0byBpbmRleGVkIGRiXCIpO1xyXG4gICAvLyAgICAgICAgICAgICAgfVxyXG4gICAvLyAgICAgICAgICAgICAgY3Iub25lcnJvcj0oKT0+e1xyXG4gICAvLyAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc3RvcmluZyBhdWRpbyBkYXRhIHRvIGluZGV4ZWQgZGJcIik7XHJcbiAgIC8vICAgICAgICAgICAgICB9XHJcbiAgIC8vICAgICAgICAgICAgfVxyXG4gICAvLyAgICAgICAgICAgIHBvcyArPSBidWZMZW47XHJcbiAgIC8vICAgICAgICB9XHJcbiAgIC8vICAgICAgICB0aGlzLmluZERiQ2hrSWR4Kz1kYXRhQ2hrQ250O1xyXG4gICAvL1xyXG4gICAvLyAgICAgICAgdHIub25lcnJvciA9IChlcnIpID0+IHtcclxuICAgLy8gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNhY2hlIGF1ZGlvIGRhdGEgdG8gaW5kZXhlZCBkYjogJyArIGVycilcclxuICAgLy8gICAgICAgIH1cclxuICAgLy8gICAgICAgIHRyLm9uY29tcGxldGUgPSAoKSA9PiB7XHJcbiAgIC8vICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnVHJhbnNmZXJyZWQgY2FwdHVyZSBhdWRpbyBkYXRhIHRvIGluZGV4ZWQgZGIsIGRlbGV0aW5nIG9yaWdpbmFsIGRhdGEgZnJvbSBtZW1vcnkuLi4nKTtcclxuICAgLy9cclxuICAgLy8gICAgICAgICAgLy8vIEF1ZGlvIGRhdGEgc2F2ZWQgdG8gaW5kZXggZGIgZGVsZXRlIGZyb20gaW4gbWVtb3J5IGRhdGEgYXJyYXlcclxuICAgLy8gICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IHRoaXMuY2hhbm5lbENvdW50OyBjaCsrKSB7XHJcbiAgIC8vICAgICAgICAgICB0aGlzLmRhdGFbY2hdLnNwbGljZSgwKTtcclxuICAgLy8gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTcGxpY2VkL3JlbW92ZWQgY2g6IFwiK2NoKTtcclxuICAgLy8gICAgICAgICAgfVxyXG4gICAvL1xyXG4gICAvLyAgICAgICAgICB0aGlzLnBlcnNpc3RlZD10cnVlO1xyXG4gICAvLyAgICAgICAgICBpZih0aGlzLmxpc3RlbmVyICYmICF0aGlzLmNhcHR1cmluZyl7XHJcbiAgIC8vICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RvcHBlZCBieSBpbmRleGVkIGRiIGhvb2tcIik7XHJcbiAgIC8vICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5zdG9wcGVkKCk7XHJcbiAgIC8vICAgICAgICAgIH1cclxuICAgLy8gICAgICAgIH1cclxuICAgLy8gICAgICAgIC8vIENvbW1pdCBjaHVua3NcclxuICAgLy8gICAgICAgIHRoaXMucGVyc2lzdGVkPWZhbHNlO1xyXG4gICAvLyAgICAgICAgdHIuY29tbWl0KCk7XHJcbiAgIC8vICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgIC8vICAgICAgICBjb25zb2xlLmVycm9yKCdUcmFuc2ZlciBjYXB0dXJlIGF1ZGlvIGRhdGEgZXJyb3I6ICcrZXJyKTtcclxuICAgLy8gICAgICB9XHJcbiAgIC8vICAgIH1cclxuXHJcbiAgICAvLyBpZighdGhpcy5pbmRkYkF1ZGlvQnVmZmVyICYmIHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQgJiYgdGhpcy5yZWNVVUlEKSB7XHJcbiAgICAvLyAgIHRoaXMuaW5kZGJBdWRpb0J1ZmZlciA9IG5ldyBJbmRleGVkRGJBdWRpb0J1ZmZlcih0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0LCB0aGlzLmNoYW5uZWxDb3VudCx0aGlzLmN1cnJlbnRTYW1wbGVSYXRlLEF1ZGlvQ2FwdHVyZS5CVUZGRVJfU0laRSwwLHRoaXMucmVjVVVJRClcclxuICAgIC8vIH1cclxuICAgIGlmKHRoaXMuaW5kZGJBdWRpb0J1ZmZlciAmJiB0aGlzLmRhdGEpe1xyXG5cclxuICAgICAgLy8gVHJ5IHRvIGFwcGVuZCB0b1xyXG4gICAgICB0aGlzLmluZGRiQXVkaW9CdWZmZXIuYXBwZW5kUmF3QXVkaW9EYXRhKHRoaXMuZGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdUcmFuc2ZlcnJlZCBjYXB0dXJlIGF1ZGlvIGRhdGEgdG8gaW5kZXhlZCBkYiwgZGVsZXRpbmcgb3JpZ2luYWwgZGF0YSBmcm9tIG1lbW9yeS4uLicpO1xyXG5cclxuICAgICAgICAgIC8vLyBBdWRpbyBkYXRhIHNhdmVkIHRvIGluZGV4IGRiIGRlbGV0ZSBmcm9tIGluIG1lbW9yeSBkYXRhIGFycmF5XHJcbiAgICAgICAgICBpZih0aGlzLmRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IHRoaXMuY2hhbm5lbENvdW50OyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5zcGxpY2UoMCk7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3BsaWNlZC9yZW1vdmVkIGNoOiBcIitjaCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucGVyc2lzdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyICYmICF0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdG9wcGVkIGJ5IGluZGV4ZWQgZGIgaG9va1wiKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5zdG9wcGVkKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgICAgLy8gT25seSBsb2cgdGhlIGZpcnN0IGVycm9yXHJcbiAgICAgICAgICBpZighdGhpcy5wZXJzaXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5wZXJzaXN0RXJyb3IgPSBlcnI7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwZXJzaXN0aW5nIGF1ZGlvIGRhdGE6IFwiICsgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBlcnNpc3RlZD1mYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMubWVkaWFTdHJlYW0uZGlzY29ubmVjdCgpO1xyXG4gICAgaWYgKHRoaXMuc3RyZWFtKSB7XHJcbiAgICAgIGNvbnN0IG10cyA9IHRoaXMuc3RyZWFtLmdldFRyYWNrcygpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG10cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG10c1tpXS5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX29wZW5lZD1mYWxzZTtcclxuICB9XHJcblxyXG4gIGF1ZGlvQnVmZmVyKCk6IEF1ZGlvQnVmZmVyIHxudWxse1xyXG4gICAgbGV0IGFiOiBBdWRpb0J1ZmZlcnxudWxsPW51bGw7XHJcbiAgICBpZih0aGlzLmRhdGEpIHtcclxuICAgICAgbGV0IGZyYW1lTGVuOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgbGV0IGNoMERhdGEgPSB0aGlzLmRhdGFbMF07XHJcblxyXG4gICAgICBmb3IgKGxldCBjaDBDaGsgb2YgY2gwRGF0YSkge1xyXG4gICAgICAgIGZyYW1lTGVuICs9IGNoMENoay5sZW5ndGg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYWIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKHRoaXMuY2hhbm5lbENvdW50LCBmcmFtZUxlbiwgdGhpcy5jb250ZXh0LnNhbXBsZVJhdGUpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdOb3RTdXBwb3J0ZWRFcnJvcicpIHtcclxuICAgICAgICAgICAgaWYgKGZyYW1lTGVuID09IDApIHtcclxuICAgICAgICAgICAgICAvLyBFbXB0eSBidWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IENocm9taXVtXHJcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGR1bW15IGJ1ZmZlciB3aXRoIG9uZSBzYW1wbGVcclxuICAgICAgICAgICAgICBhYiA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXIodGhpcy5jaGFubmVsQ291bnQsIDEsIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpIHtcclxuICAgICAgICAgIC8vIE91dCBvZiBtZW1vcnlcclxuICAgICAgICAgIC8vIFRPRE8gV2hhdCB0byBkbyA/P1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmNoYW5uZWxDb3VudDsgY2grKykge1xyXG4gICAgICAgIGxldCBjaEQgPSBhYi5nZXRDaGFubmVsRGF0YShjaCk7XHJcbiAgICAgICAgbGV0IHBvcyA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgY2hDaGsgb2YgdGhpcy5kYXRhW2NoXSkge1xyXG4gICAgICAgICAgbGV0IGJ1ZkxlbiA9IGNoQ2hrLmxlbmd0aDtcclxuICAgICAgICAgIGNoRC5zZXQoY2hDaGssIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gYnVmTGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFiO1xyXG4gIH1cclxuXHJcbiAgYXVkaW9CdWZmZXJBcnJheSgpOkFycmF5QXVkaW9CdWZmZXJ8bnVsbHtcclxuICAgICAgbGV0IGFyckFiOkFycmF5QXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gICAgICBpZih0aGlzLmRhdGEpIHtcclxuICAgICAgICBhcnJBYj1uZXcgQXJyYXlBdWRpb0J1ZmZlcih0aGlzLmNoYW5uZWxDb3VudCwgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSwgdGhpcy5kYXRhKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXJyQWI7XHJcbiAgfVxyXG5cclxuICBpbmRkYkF1ZGlvQnVmZmVyQXJyYXkoKTpJbmRleGVkRGJBdWRpb0J1ZmZlcnxudWxse1xyXG4gICAgaWYodGhpcy5wZXJzaXN0RXJyb3Ipe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1lbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5kZGJBdWRpb0J1ZmZlcjtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuIl19