speechrecorderng 2.25.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/audio/array_audio_buffer.mjs +101 -0
- package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +86 -0
- package/esm2020/lib/audio/audio_data_holder.mjs +109 -0
- package/esm2020/lib/audio/audio_display.mjs +5 -5
- package/esm2020/lib/audio/audio_player.mjs +9 -7
- package/esm2020/lib/audio/capture/capture.mjs +6 -1
- package/esm2020/lib/audio/dsp/level_measure.mjs +97 -55
- package/esm2020/lib/audio/io/stream.mjs +3 -3
- package/esm2020/lib/audio/persistor.mjs +5 -6
- package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +265 -0
- package/esm2020/lib/audio/playback/player.mjs +184 -50
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +25 -13
- package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +2 -2
- package/esm2020/lib/audio/ui/audiosignal.mjs +206 -77
- package/esm2020/lib/audio/ui/container.mjs +14 -14
- package/esm2020/lib/audio/ui/livelevel.mjs +15 -2
- package/esm2020/lib/audio/ui/sonagram.mjs +343 -160
- package/esm2020/lib/io/stream.mjs +77 -1
- package/esm2020/lib/net/uploader.mjs +15 -3
- package/esm2020/lib/speechrecorder/recording.mjs +52 -7
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +99 -7
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +117 -101
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +34 -6
- package/esm2020/lib/speechrecorder/session/progress.mjs +2 -2
- package/esm2020/lib/speechrecorder/session/prompting.mjs +2 -2
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -3
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +182 -0
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +23 -10
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +12 -6
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +5 -5
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +13 -9
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +8 -5
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +118 -95
- package/esm2020/lib/speechrecorderng.component.mjs +2 -2
- package/esm2020/lib/speechrecorderng.module.mjs +5 -4
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/esm2020/lib/ui/recordingitem_display.mjs +2 -2
- package/fesm2015/speechrecorderng.mjs +2321 -743
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +2321 -753
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/lib/audio/array_audio_buffer.d.ts +15 -0
- package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -0
- package/lib/audio/audio_data_holder.d.ts +29 -0
- package/lib/audio/audio_display.d.ts +2 -1
- package/lib/audio/audio_player.d.ts +2 -1
- package/lib/audio/capture/capture.d.ts +2 -0
- package/lib/audio/dsp/level_measure.d.ts +2 -1
- package/lib/audio/persistor.d.ts +4 -3
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +24 -0
- package/lib/audio/playback/player.d.ts +6 -0
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +4 -1
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +2 -1
- package/lib/audio/ui/audiosignal.d.ts +3 -2
- package/lib/audio/ui/container.d.ts +3 -2
- package/lib/audio/ui/livelevel.d.ts +3 -1
- package/lib/audio/ui/sonagram.d.ts +3 -2
- package/lib/io/stream.d.ts +17 -0
- package/lib/net/uploader.d.ts +6 -1
- package/lib/speechrecorder/recording.d.ts +15 -3
- package/lib/speechrecorder/recordings/recordings.service.d.ts +2 -0
- package/lib/speechrecorder/session/audiorecorder.d.ts +2 -7
- package/lib/speechrecorder/session/basicrecorder.d.ts +9 -3
- package/lib/speechrecorder/session/progress.d.ts +1 -1
- package/lib/speechrecorder/session/prompting.d.ts +1 -1
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +3 -1
- package/lib/speechrecorder/session/recording_file_cache.d.ts +30 -0
- package/lib/speechrecorder/session/recording_list.d.ts +3 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +2 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -0
- package/lib/speechrecorder/session/sessionmanager.d.ts +5 -11
- package/lib/speechrecorderng.module.d.ts +2 -1
- package/lib/spr.module.version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Browser, Platform, UserAgentBuilder } from "../../utils/ua-parser";
|
|
2
2
|
import { Platform as CfgPlatform } from "../../speechrecorder/project/project";
|
|
3
|
+
import { ArrayAudioBuffer } from "../array_audio_buffer";
|
|
3
4
|
export const CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC = false;
|
|
4
5
|
const DEBUG_TRACE_LEVEL = 0;
|
|
5
6
|
const ENABLE_AUDIO_WORKLET = true;
|
|
@@ -570,6 +571,10 @@ export class AudioCapture {
|
|
|
570
571
|
}
|
|
571
572
|
return ab;
|
|
572
573
|
}
|
|
574
|
+
audioBufferArray() {
|
|
575
|
+
let aba = new ArrayAudioBuffer(this.channelCount, this.currentSampleRate, this.data);
|
|
576
|
+
return aba;
|
|
577
|
+
}
|
|
573
578
|
}
|
|
574
579
|
AudioCapture.BUFFER_SIZE = 8192;
|
|
575
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQXdCLFFBQVEsSUFBSSxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUdwRyxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBQyxLQUFLLENBQUM7QUFFOUQsTUFBTSxpQkFBaUIsR0FBQyxDQUFDLENBQUM7QUFFMUIsTUFBTSxvQkFBb0IsR0FBQyxJQUFJLENBQUM7QUFFaEMsc0NBQXNDO0FBQ3RDLHdEQUF3RDtBQUN4RCxNQUFNLE1BQU0sR0FBQyx5RUFBeUU7SUFDbEYsSUFBSTtJQUNKLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIscUVBQXFFO0lBQ3JFLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsSUFBSTtJQUNKLFNBQVM7SUFDVCxJQUFJO0lBQ0osYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLFFBQVE7SUFDUixJQUFJO0lBQ0oscUNBQXFDO0lBQ3JDLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsNkJBQTZCO0lBQzdCLDBCQUEwQjtJQUMxQixvQ0FBb0M7SUFDcEMsMENBQTBDO0lBQzFDLG9DQUFvQztJQUNwQyx5Q0FBeUM7SUFDekMsMkNBQTJDO0lBQzNDLHVEQUF1RDtJQUN2RCxjQUFjO0lBQ2QsVUFBVTtJQUNWLGlFQUFpRTtJQUNqRSxtREFBbUQ7SUFDbkQsK0JBQStCO0lBQy9CLDJEQUEyRDtJQUMzRCw0RUFBNEU7SUFDNUUsb0NBQW9DO0lBQ3BDLHVDQUF1QztJQUN2QyxjQUFjO0lBQ2QsVUFBVTtJQUNWLCtEQUErRDtJQUMvRCxpREFBaUQ7SUFDakQsbUNBQW1DO0lBQ25DLDZDQUE2QztJQUM3Qyx3REFBd0Q7SUFDeEQseURBQXlEO0lBQ3pELGNBQWM7SUFDZCxvQ0FBb0M7SUFDcEMsMkJBQTJCO0lBQzNCLG1DQUFtQztJQUNuQyxvQ0FBb0M7SUFDcEMscUJBQXFCO0lBQ3JCLHlDQUF5QztJQUN6QyxnQ0FBZ0M7SUFDaEMsbUNBQW1DO0lBQ25DLFVBQVU7SUFDVixJQUFJO0lBQ0osMENBQTBDO0lBQzFDLHdEQUF3RDtJQUN4RCxnQ0FBZ0M7SUFDaEMsMkNBQTJDO0lBQzNDLGdEQUFnRDtJQUNoRCwrREFBK0Q7SUFDL0QsY0FBYztJQUNkLHNDQUFzQztJQUN0QyxnREFBZ0Q7SUFDaEQsVUFBVTtJQUNWLFFBQVE7SUFDUixxQkFBcUI7SUFDckIsT0FBTztJQUNQLEtBQUs7SUFDTCxJQUFJO0lBQ0osOEVBQThFLENBQUM7QUFpQm5GLE1BQU0sT0FBTyxZQUFZO0lBdUJ2QixZQUFZLE9BQXFCO1FBYmpDLGNBQVMsR0FBYyxJQUFJLENBQUM7UUFDNUIsa0JBQWEsR0FBaUIsSUFBSSxDQUFDO1FBS25DLG1CQUFjLEdBQXVDLElBQUksQ0FBQztRQUNsRCxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDekIsWUFBTyxHQUFDLEtBQUssQ0FBQztRQUNkLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUIsbUJBQWMsR0FBUyxDQUFDLENBQUM7UUFHdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQXpCRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQXlCTyxRQUFRO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEtBQUssRUFBdUIsQ0FBQztRQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBZ0IsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVc7UUFDVCxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFTyxZQUFZO1FBQ2xCLHFDQUFxQztRQUNyQyx3QkFBd0I7UUFDeEIsSUFBSSxjQUFjLEdBQTJCLEVBQUMsS0FBSyxFQUMvQyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUM7U0FDM0IsQ0FBQztRQUNGLE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFN0QsQ0FBQztJQUdPLG9CQUFvQixDQUFDLFdBQXVCO1FBQ2hELElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQyxzREFBc0Q7WUFDdEQsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFrRCxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUMsV0FBd0I7UUFFbkcsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQW9CLEVBQUUsRUFBRTtZQUN0RSxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUU7b0JBQ1osZUFBZSxHQUFHLElBQUksQ0FBQztpQkFDeEI7YUFDRjtZQUNELElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BCLHVEQUF1RDtnQkFDdkQsSUFBSSxLQUFLLEVBQUU7b0JBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO29CQUV0RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBYyxFQUFFLEVBQUU7d0JBQzVDLDBCQUEwQjt3QkFFMUIsSUFBRyxDQUFDLEVBQUU7NEJBQ0osd0RBQXdEO3lCQUN6RDs2QkFBSTs0QkFDSCxrQ0FBa0M7eUJBQ25DO3dCQUNELG9CQUFvQjt3QkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ1QsMENBQTBDO3dCQUMxQyxzQkFBc0I7d0JBQ3RCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDWCxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ1Y7YUFDRjtpQkFBTTtnQkFDTCxVQUFVO2dCQUNWLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNQO1lBQ0QsSUFBRyxXQUFXLEVBQUM7Z0JBQ2IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxFQUFDLENBQUMsTUFBTSxFQUFDLEVBQUU7WUFDVixVQUFVO1lBQ1YscURBQXFEO1lBQ3JELElBQUksS0FBSyxFQUFFO2dCQUNULHlFQUF5RTtnQkFDekUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQWMsRUFBRSxFQUFFO29CQUMxQywwQkFBMEI7b0JBQzFCLGlDQUFpQztvQkFDakMsSUFBRyxDQUFDLEVBQUU7d0JBQ0osd0RBQXdEO3FCQUN6RDt5QkFBSTt3QkFDSCxrQ0FBa0M7cUJBQ25DO29CQUNELG9CQUFvQjtvQkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ1YsMENBQTBDO29CQUMxQyxzQkFBc0I7b0JBQ3RCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNWO1lBQ0QsSUFBRyxXQUFXLEVBQUM7Z0JBQ2IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFJTCxDQUFDO0lBR0QsWUFBWSxDQUFDLENBQW9CO1FBQy9CLElBQUksV0FBVyxHQUFHLGFBQWEsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFZCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxRQUFRLEdBQUcsWUFBWSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzSDtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsWUFBb0IsRUFBRSxXQUEwQyxFQUFDLHNCQUFtRTtRQUNySSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUMsV0FBVyxFQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQW9CLEVBQUUsV0FBMEMsRUFBQyxzQkFBbUU7UUFDeEksSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEIsb0NBQW9DO1FBQ3BDLGNBQWM7UUFDZCxvQkFBb0I7UUFDcEIsbUJBQW1CO1FBRW5CLHNEQUFzRDtRQUN0RCx3SEFBd0g7UUFFeEgsK0RBQStEO1FBQy9ELDJEQUEyRDtRQUMzRCxxR0FBcUc7UUFFckcsd0RBQXdEO1FBQ3hELG9DQUFvQztRQUVwQyxJQUFJLEdBQTBCLENBQUM7UUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRy9DLElBQUksRUFBRSxHQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXBDLCtCQUErQjtRQUMvQiw0Q0FBNEM7UUFDNUMsS0FBSztRQUVOLElBQUksTUFBTSxHQUE0QixJQUFJLENBQUM7UUFFNUMsSUFBSSxlQUFlLEdBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksc0JBQXNCLEdBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUcsc0JBQXNCLEVBQUM7WUFDeEIsS0FBSSxJQUFJLElBQUksSUFBSSxzQkFBc0IsRUFBQztnQkFDckMsSUFBRyxJQUFJLENBQUMsUUFBUSxLQUFHLFdBQVcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLGdCQUFnQixLQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUM7b0JBQzdFLE1BQU0sR0FBQyxJQUFJLENBQUM7b0JBQ1osTUFBTTtpQkFDVDtnQkFDRCxJQUFHLElBQUksQ0FBQyxRQUFRLEtBQUcsV0FBVyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEtBQUcsUUFBUSxDQUFDLE9BQU8sRUFBQztvQkFDL0UsTUFBTSxHQUFDLElBQUksQ0FBQztvQkFDWixNQUFNO2lCQUNQO2FBQ0Y7WUFDRCxJQUFHLE1BQU0sRUFBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLGVBQWUsR0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM3QixJQUFHLDBDQUEwQyxFQUFDO29CQUM1QyxzQkFBc0IsR0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUNyQztnQkFDRCw2QkFBNkI7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUM3QjtpQkFBSTtnQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFDLEtBQUssQ0FBQzthQUN0QjtTQUNGO1FBRUQsVUFBVTtRQUNWLEdBQUcsR0FBRztZQUNKLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsV0FBVztnQkFDckIsZ0JBQWdCLEVBQUUsS0FBSztnQkFDdkIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLGVBQWUsRUFBRSxlQUFlO2FBQ2pDO1lBQ0QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBRUYsSUFBSSxFQUFFLENBQUMsZUFBZSxLQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFFckMsd0NBQXdDO1lBQ3hDLDhDQUE4QztZQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDcEUsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsV0FBVztvQkFDckIsZ0JBQWdCLEVBQUUsS0FBSztvQkFDdkIsWUFBWSxFQUFFLFlBQVk7b0JBQzFCLGVBQWUsRUFBRSxlQUFlO2lCQUNqQztnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUM7U0FDSDthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzlDLG9GQUFvRjtZQUNwRixPQUFPLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFFbkUsMEJBQTBCO1lBQzFCLHNEQUFzRDtZQUd0RCw4QkFBOEI7WUFDOUIsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsV0FBVztvQkFDckIsWUFBWSxFQUFFLFlBQVk7b0JBQzFCLGdCQUFnQixFQUFFLEVBQUMsS0FBSyxFQUFDLHNCQUFzQixFQUFDO29CQUNoRCxlQUFlLEVBQUUsRUFBQyxLQUFLLEVBQUMsZUFBZSxFQUFDO29CQUN4QyxVQUFVLEVBQUMsRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFDO2lCQUNyQjtnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUE7U0FFRjthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUNyRSxVQUFVO1lBQ1YsR0FBRyxHQUFHO2dCQUNKLEtBQUssRUFBRTtvQkFDSCxRQUFRLEVBQUUsV0FBVztvQkFDckIsWUFBWSxFQUFFLFlBQVk7b0JBQzVCLGdCQUFnQixFQUFFLEtBQUs7b0JBQ3JCLGVBQWUsRUFBRSxlQUFlO29CQUNsQyxnQkFBZ0IsRUFBRSxLQUFLO2lCQUN4QjtnQkFDRCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUE7U0FFRjthQUFNLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQTtZQUNuRSxPQUFPLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFFMUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixHQUFHLEdBQUc7Z0JBQ0osS0FBSyxFQUFFO29CQUNMLFFBQVEsRUFBRSxXQUFXO29CQUNyQixZQUFZLEVBQUUsWUFBWTtvQkFDMUIsZ0JBQWdCLEVBQUUsS0FBSztpQkFDeEI7Z0JBQ0QsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFBO1NBRUY7YUFBTTtZQUVMLDBEQUEwRDtTQUMzRDtRQUlELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEdBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBR3BELElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV4QixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2xILElBQUksTUFBTSxHQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFFaEMsbUVBQW1FO2dCQUNuRSx1SEFBdUg7Z0JBQ3ZILFlBQVk7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBQyxNQUFNLENBQUMsWUFBWSxHQUFDLFNBQVMsR0FBQyxNQUFNLENBQUMsZUFBZSxHQUFDLG1CQUFtQixHQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNoSixJQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUM7b0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztpQkFDdkM7YUFDRjtZQUVELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxRztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCx3Q0FBd0M7WUFDeEMsSUFBSSxrQkFBa0IsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUMvRCxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUQsZUFBZTtZQUNmLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxrQkFBa0IsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDOUcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsNENBQTRDO1lBQzVDLEVBQUU7WUFDRix1RkFBdUY7WUFDdkYsMERBQTBEO1lBRTVELGtCQUFrQjtZQUNqQixpREFBaUQ7WUFFbEQsaUJBQWlCO1lBQ2pCLHdGQUF3RjtZQUVwRixJQUFHLG9CQUFvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFDO2dCQUNuRCxtRUFBbUU7Z0JBQ25FLGdGQUFnRjtnQkFDaEYsc0JBQXNCO2dCQUN0QixJQUFJLHNCQUFzQixHQUFFLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO2dCQUUxRSxJQUFJLHlCQUF5QixHQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBRWpGLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7b0JBQ2xFLE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO29CQUN0RSxHQUFHLENBQUMsZ0JBQWdCLEdBQUMsQ0FBQyxFQUFRLEVBQUMsRUFBRTt3QkFDL0IsSUFBSSxHQUFHLEdBQUMsZUFBZSxDQUFDO3dCQUN4QixJQUFHLEVBQUUsWUFBWSxVQUFVLEVBQUM7NEJBQzFCLEdBQUcsR0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO3lCQUNoQjt3QkFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNuRCxJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUM7NEJBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQzFCO29CQUNILENBQUMsQ0FBQTtvQkFDRCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNyQixJQUFJLEtBQUssRUFBRTt3QkFDVCxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBcUIsRUFBRSxFQUFFOzRCQUMxQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0NBQ2xCLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0NBQ2YsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztnQ0FDakIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0NBQzVCLElBQUcsaUJBQWlCLEdBQUMsQ0FBQyxFQUFFO29DQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixHQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRSxhQUFhLEdBQUMsTUFBTSxDQUFDLENBQUM7aUNBQ3pGO2dDQUNELDhCQUE4QjtnQ0FDOUIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDO2dDQUN0QixJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBZSxHQUFHLENBQUMsQ0FBQztnQ0FDekMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtvQ0FDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7d0NBQzlCLElBQUksTUFBTSxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUM7d0NBQzNCLElBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTs0Q0FDZCxJQUFJLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NENBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRDQUN2QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOzRDQUNmLHFEQUFxRDs0Q0FDckQsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO2dEQUNYLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQzs2Q0FDbEM7eUNBQ0Y7NkNBQUk7NENBQ0gsSUFBRyxpQkFBaUIsR0FBQyxDQUFDLEVBQUU7Z0RBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFDLEVBQUUsR0FBQyxpQkFBaUIsQ0FBQyxDQUFDOzZDQUNoRDt5Q0FDRjtxQ0FDRjtpQ0FDRjtnQ0FDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0NBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lDQUNsQzs2QkFDRjt3QkFDSCxDQUFDLENBQUM7cUJBQ0g7b0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ3hCO2dCQUNILENBQUMsQ0FDSixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQVUsRUFBQyxFQUFFO29CQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixHQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLENBQUMsQ0FBQzthQUVKO2lCQUFLLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtnQkFDM0Msa0VBQWtFO2dCQUNsRSwrREFBK0Q7Z0JBQy9ELElBQUksbUJBQW1CLEdBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQzlILElBQUksQ0FBQyxhQUFhLEdBQUMsbUJBQW1CLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFHLG1CQUFtQixDQUFDLGNBQWMsRUFBQztvQkFDcEMsbUJBQW1CLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBdUIsRUFBRSxFQUFFO3dCQUUvRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7NEJBQ2xCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7NEJBQzdCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7NEJBQ2pDLDJDQUEyQzs0QkFDM0MsSUFBSSxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQWUsWUFBWSxDQUFDLENBQUM7NEJBQzNELEtBQUssSUFBSSxFQUFFLEdBQVcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0NBQ2hELElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQzVDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3ZDLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQ0FDbEMsSUFBRyxpQkFBaUIsR0FBQyxDQUFDLEVBQUM7b0NBQ3JCLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUMsV0FBVyxDQUFDLENBQUM7aUNBQzVEO2dDQUNELElBQUksQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQzs2QkFDN0M7NEJBQ0QsQ0FBQyxFQUFFLENBQUM7NEJBQ0osSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dDQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQzs2QkFDM0M7eUJBQ0Y7b0JBQ0gsQ0FBQyxDQUFDO29CQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ3hCO2lCQUNGO3FCQUFJO29CQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLDhGQUE4RixDQUFDLENBQUM7aUJBQ3JIO2FBQ0Y7aUJBQUk7Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZ0dBQWdHLENBQUMsQ0FBQzthQUN2SDtRQUNILENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ1AsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsZUFBZSxHQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUcsaUJBQWlCLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBQztvQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUMsMkZBQTJGLENBQUMsQ0FBQztpQkFDeEo7cUJBQUssSUFBRyxrQkFBa0IsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFDO29CQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBQyxnREFBZ0QsQ0FBQyxDQUFDO2lCQUNoSDtxQkFBSyxJQUFHLHNCQUFzQixLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUM7b0JBQ3pDLElBQUksSUFBSSxHQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLENBQUEsQ0FBQyxDQUFBLDZDQUE2QyxDQUFDO29CQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDM0I7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDdkI7YUFDRjtRQUNILENBQUMsQ0FDSixDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFFSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUE7U0FDakM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN6QjtJQUVILENBQUM7SUFFRCxJQUFJO1FBRUYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6RDtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBR0QsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YscUJBQXFCO1lBQ3JCLCtIQUErSDtZQUMvSCwyQkFBMkI7WUFDM0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2Y7U0FDRjtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxRQUFRLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUU7WUFDMUIsUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDM0I7UUFDRCxJQUFJLEVBQWMsQ0FBQztRQUNqQixJQUFJO1lBQ0YsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDdEY7UUFBQSxPQUFNLEdBQUcsRUFBQztZQUNULElBQUcsR0FBRyxZQUFZLFlBQVksRUFBQztnQkFDN0IsSUFBRyxHQUFHLENBQUMsSUFBSSxLQUFHLG1CQUFtQixFQUFDO29CQUNoQyxJQUFHLFFBQVEsSUFBRSxDQUFDLEVBQUM7d0JBQ2IsOENBQThDO3dCQUM5QyxzQ0FBc0M7d0JBQ3RDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUMvRTt5QkFBSTt3QkFDSCxNQUFNLEdBQUcsQ0FBQztxQkFDWDtpQkFDRjtxQkFBSTtvQkFDSCxNQUFNLEdBQUcsQ0FBQztpQkFDWDthQUNGO2lCQUFLLElBQUksR0FBRyxZQUFZLFVBQVUsRUFBQztnQkFDbEMsZ0JBQWdCO2dCQUNoQixxQkFBcUI7Z0JBQ3JCLE1BQU0sR0FBRyxDQUFDO2FBQ1g7aUJBQUk7Z0JBQ0gsTUFBTSxHQUFHLENBQUM7YUFDWDtTQUNGO1FBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQy9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixHQUFHLElBQUksTUFBTSxDQUFDO2FBQ2Y7U0FDRjtRQUNILE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7QUEvaEJNLHdCQUFXLEdBQVcsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbSwgU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1NdWx0aXBsaWVyfSBmcm9tIFwiLi4vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7QnJvd3NlciwgUGxhdGZvcm0sIFVzZXJBZ2VudEJ1aWxkZXJ9IGZyb20gXCIuLi8uLi91dGlscy91YS1wYXJzZXJcIjtcclxuXHJcbmltcG9ydCB7QXV0b0dhaW5Db250cm9sQ29uZmlnLCBQbGF0Zm9ybSBhcyBDZmdQbGF0Zm9ybX0gZnJvbSBcIi4uLy4uL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdFwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBDSFJPTUVfQUNUSVZBVEVfRUNIT19DQU5DRUxMQVRJT05fV0lUSF9BR0M9ZmFsc2U7XHJcblxyXG5jb25zdCBERUJVR19UUkFDRV9MRVZFTD0wO1xyXG5cclxuY29uc3QgRU5BQkxFX0FVRElPX1dPUktMRVQ9dHJ1ZTtcclxuXHJcbi8vIFN1cGVyIGRpcnR5IHdheSB0byBsb2FkIHRoaXMgbW9kdWxlXHJcbi8vIENvcHkgY29udGVudCBvZiBpbnRlcmNlcHRvcl93b3JrbGV0LmpzIHRvIHRoaXMgc3RyaW5nXHJcbmNvbnN0IGF3cFN0cj1cImNsYXNzIEF1ZGlvQ2FwdHVyZUludGVyY2VwdG9yUHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29ye1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgQlVGRkVSX1FVQU5UVU1TPTY0O1xcblwiICtcclxuICAgIFwiICAgIFFVQU5UVU1fRlJBTUVfTEVOPTEyODtcXG5cIiArXHJcbiAgICBcIiAgICBCVUZGRVJfRlJBTUVfTEVOPXRoaXMuUVVBTlRVTV9GUkFNRV9MRU4qdGhpcy5CVUZGRVJfUVVBTlRVTVM7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyPW51bGw7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyUG9zPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICBjb25zdHJ1Y3RvcigpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgc3VwZXIoKTtcXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgIH1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiIHByb2Nlc3MoXFxuXCIgK1xyXG4gICAgXCIgICAgICBpbnB1dHMsXFxuXCIgK1xyXG4gICAgXCIgICAgICBvdXRwdXRzLFxcblwiICtcclxuICAgIFwiICAgICAgcGFyYW1ldGVyc1xcblwiICtcclxuICAgIFwiICApe1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBpbnB1dHNDbnQ9aW5wdXRzLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGNoYW5uZWxDb3VudD0wO1xcblwiICtcclxuICAgIFwiICAgICBsZXQgaW5wdXRMZW49MDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGlucHV0TGVuQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgaWYoaW5wdXRzQ250PjApIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGxldCBpbnB1dDAgPSBpbnB1dHNbMF07XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBjaGFubmVsQ291bnQgPSBpbnB1dDAubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA+IDApIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBsZXQgaW5wdXQwY2gwPWlucHV0MFswXTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBpbnB1dExlbj1pbnB1dDBjaDAubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGlucHV0TGVuQnl0ZXM9aW5wdXQwY2gwLmJ1ZmZlci5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgaWYgKCF0aGlzLmJ1ZmZlciB8fCB0aGlzLmJ1ZmZlci5sZW5ndGggPCBjaGFubmVsQ291bnQpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KGNoYW5uZWxDb3VudCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IDBcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGZvciAobGV0IGJjaCA9IDA7IGJjaCA8IGNoYW5uZWxDb3VudDsgYmNoKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltiY2hdID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLkJVRkZFUl9GUkFNRV9MRU4pO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlclBvc0J5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGJ1ZkF2YWlsID0gdGhpcy5CVUZGRVJfRlJBTUVfTEVOIC0gdGhpcy5idWZmZXJQb3M7XFxuXCIgK1xyXG4gICAgXCIgICAgIC8vIGNoZWNrIGlmIGJ1ZmZlciBoYXMgdG8gYmUgdHJhbnNmZXJyZWRcXG5cIiArXHJcbiAgICBcIiAgICAgaWYgKGlucHV0TGVuID4gYnVmQXZhaWwpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGxldCBhZGE9bmV3IEFycmF5KGNoYW5uZWxDb3VudCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgYWRhW2NoXT10aGlzLmJ1ZmZlcltjaF0uYnVmZmVyLnNsaWNlKDApO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBkYXRhOiBhZGEsXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgY2hzOiBjaGFubmVsQ291bnQsXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGVuOiB0aGlzLmJ1ZmZlclBvc1xcblwiICtcclxuICAgIFwiICAgICAgICAgfSwgYWRhKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIC8vIGJ1ZmZlciB0cmFuc2ZlcnJlZCwgcmVzZXRcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgIGZvcihsZXQgaWk9MDtpaTxpbnB1dHNDbnQ7aWkrKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIC8vIE11dGUgb3V0cHV0c1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIC8vb3V0cHV0c1tpaV1bY2hdLmZpbGwoMCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGV0IGNoU2FtcGxlcyA9IGlucHV0c1tpaV1bY2hdO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2NoXS5zZXQoY2hTYW1wbGVzLHRoaXMuYnVmZmVyUG9zKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zKz1pbnB1dExlbjtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXMrPWlucHV0TGVuQnl0ZXM7XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICBcXG5cIiArXHJcbiAgICBcIiAgICAgcmV0dXJuIHRydWU7XFxuXCIgK1xyXG4gICAgXCIgIH1cXG5cIiArXHJcbiAgICBcIn1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwicmVnaXN0ZXJQcm9jZXNzb3IoJ2NhcHR1cmUtaW50ZXJjZXB0b3InLEF1ZGlvQ2FwdHVyZUludGVyY2VwdG9yUHJvY2Vzc29yKTtcXG5cIjtcclxuXHJcblxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9DYXB0dXJlTGlzdGVuZXIge1xyXG4gIG9wZW5lZCgpOiB2b2lkO1xyXG5cclxuICBzdGFydGVkKCk6IHZvaWQ7XHJcblxyXG4gIHN0b3BwZWQoKTogdm9pZDtcclxuXHJcbiAgY2xvc2VkKCk6IHZvaWQ7XHJcblxyXG4gIGVycm9yKG1zZz86c3RyaW5nLGFkdmljZT86c3RyaW5nKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ2FwdHVyZSB7XHJcbiAgZ2V0IG9wZW5lZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVuZWQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgQlVGRkVSX1NJWkU6IG51bWJlciA9IDgxOTI7XHJcbiAgY29udGV4dDogQXVkaW9Db250ZXh0O1xyXG4gIHN0cmVhbSE6IE1lZGlhU3RyZWFtO1xyXG4gIGNoYW5uZWxDb3VudCE6IG51bWJlcjtcclxuICBtZWRpYVN0cmVhbTogYW55O1xyXG4gIGFnY1N0YXR1czpib29sZWFufG51bGw9bnVsbDtcclxuICBidWZmZXJpbmdOb2RlOiBBdWRpb05vZGV8bnVsbD1udWxsO1xyXG4gIGxpc3RlbmVyITogQXVkaW9DYXB0dXJlTGlzdGVuZXI7XHJcbiAgZGF0YSE6IEFycmF5PEFycmF5PEZsb2F0MzJBcnJheT4+O1xyXG4gIGN1cnJlbnRTYW1wbGVSYXRlITogbnVtYmVyO1xyXG4gIG46IE5hdmlnYXRvcjtcclxuICBhdWRpb091dFN0cmVhbTogU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW0gfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkaXNjb25uZWN0U3RyZWFtcyA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfb3BlbmVkPWZhbHNlO1xyXG4gIHByaXZhdGUgY2FwdHVyaW5nID0gZmFsc2U7XHJcblxyXG4gIGZyYW1lc1JlY29yZGVkOiBudW1iZXI9MDtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dDogQXVkaW9Db250ZXh0KSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgdGhpcy5uID0gbmF2aWdhdG9yO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0RGF0YSgpIHtcclxuICAgIHRoaXMuZGF0YSA9IG5ldyBBcnJheTxBcnJheTxGbG9hdDMyQXJyYXk+PigpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoYW5uZWxDb3VudDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuZGF0YS5wdXNoKG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mcmFtZXNSZWNvcmRlZCA9IDA7XHJcbiAgfVxyXG5cclxuICBsaXN0RGV2aWNlcygpIHtcclxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGw6IE1lZGlhRGV2aWNlSW5mb1tdKSA9PiB0aGlzLnByaW50RGV2aWNlcyhsKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGR1bW15U2Vzc2lvbigpOlByb21pc2U8TWVkaWFTdHJlYW0+e1xyXG4gICAgLy8gd29ya2Fyb3VuZCB0byByZXF1ZXN0IHBlcm1pc3Npb25zOlxyXG4gICAgLy8gU3RhcnQgYSBkdW1teSBzZXNzaW9uXHJcbiAgICBsZXQgbWVkaWFTdHJDbnN0cnMgPSA8TWVkaWFTdHJlYW1Db25zdHJhaW50cz57YXVkaW86XHJcbiAgICAgICAge2VjaG9DYW5jZWxhdGlvbjogZmFsc2V9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG1lZGlhU3RyQ25zdHJzKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzdG9wQWxsU2Vzc2lvblRyYWNrcyhtZWRpYVN0cmVhbTpNZWRpYVN0cmVhbSl7XHJcbiAgICAgIGxldCBhdHMgPSBtZWRpYVN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yIChsZXQgYXRJZHggPSAwOyBhdElkeCA8IGF0cy5sZW5ndGg7IGF0SWR4KyspIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdG9wIGR1bW15IHNlc3Npb24gdHJhY2s6ICNcIiArIGF0SWR4KVxyXG4gICAgICAgIGF0c1thdElkeF0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBkZXZpY2VJbmZvcyhjYjogKGRldmljZUluZm9zOiBNZWRpYURldmljZUluZm9bXSB8IG51bGwpID0+IGFueSwgcmV0cnkgPSB0cnVlLGR1bW15U3RyZWFtPzpNZWRpYVN0cmVhbSkge1xyXG5cclxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGw6IE1lZGlhRGV2aWNlSW5mb1tdKSA9PiB7XHJcbiAgICAgIGxldCBsYWJlbHNBdmFpbGFibGUgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGRpID0gbFtpXTtcclxuICAgICAgICBpZiAoZGkubGFiZWwpIHtcclxuICAgICAgICAgIGxhYmVsc0F2YWlsYWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghbGFiZWxzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTWVkaWEgZGV2aWNlIGVudW1lcmF0aW9uOiBObyBsYWJlbHMuXCIpXHJcbiAgICAgICAgaWYgKHJldHJ5KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5kdW1teVNlc3Npb24oKS50aGVuKChzOiBNZWRpYVN0cmVhbSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBhbmQgc3RvcCBpdCBpbW1lZGlhdGVseVxyXG5cclxuICAgICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkdvdCBkdW1teSBzZXNzaW9uIHN0cmVhbTogXCIgKyBzICsgXCIgLlwiKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyByZXRyeSAob25seSBvbmNlKVxyXG4gICAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICAgIH0scmVhc29uID0+IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgICAgLy8gVE9ETyBlcnJvciBjYWxsYmFja1xyXG4gICAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gc3VjY2Vzc1xyXG4gICAgICAgIGNiKGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSwocmVhc29uKT0+IHtcclxuICAgICAgLy9yZWplY3RlZFxyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoXCJNZWRpYSBkZXZpY2UgZW51bWVyYXRpb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgIGlmIChyZXRyeSkge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG4gICAgICAgIHRoaXMuZHVtbXlTZXNzaW9uKCkudGhlbigoczogTWVkaWFTdHJlYW0pID0+IHtcclxuICAgICAgICAgIC8vIGFuZCBzdG9wIGl0IGltbWVkaWF0ZWx5XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uLlwiKVxyXG4gICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJHb3QgZHVtbXkgc2Vzc2lvbiBzdHJlYW06IFwiICsgcyArIFwiIC5cIilcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJldHJ5IChvbmx5IG9uY2UpXHJcbiAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICB9LCByZWFzb24gPT4ge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgIC8vIFRPRE8gZXJyb3IgY2FsbGJhY2tcclxuICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNiKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpbnREZXZpY2VzKGw6IE1lZGlhRGV2aWNlSW5mb1tdKTogdm9pZCB7XHJcbiAgICBsZXQgc2VsRGV2aWNlSWQgPSAnX19fZHVtbXlfX18nO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBkaSA9IGxbaV07XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhcIkF1ZGlvIGRldmljZTogSWQ6IFwiICsgZGkuZGV2aWNlSWQgKyBcIiBncm91cElkOiBcIiArIGRpLmdyb3VwSWQgKyBcIiBsYWJlbDogXCIgKyBkaS5sYWJlbCArIFwiIGtpbmQ6IFwiICsgZGkua2luZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuKGNoYW5uZWxDb3VudDogbnVtYmVyLCBzZWxEZXZpY2VJZD86IENvbnN0cmFpbkRPTVN0cmluZ3x1bmRlZmluZWQsYXV0b0dhaW5Db250cm9sQ29uZmlncz86QXJyYXk8QXV0b0dhaW5Db250cm9sQ29uZmlnPnxudWxsfHVuZGVmaW5lZCl7XHJcbiAgICAgIHRoaXMuY29udGV4dC5yZXN1bWUoKS50aGVuKCgpPT57XHJcbiAgICAgICAgdGhpcy5fb3BlbihjaGFubmVsQ291bnQsc2VsRGV2aWNlSWQsYXV0b0dhaW5Db250cm9sQ29uZmlncyk7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBfb3BlbihjaGFubmVsQ291bnQ6IG51bWJlciwgc2VsRGV2aWNlSWQ/OiBDb25zdHJhaW5ET01TdHJpbmd8dW5kZWZpbmVkLGF1dG9HYWluQ29udHJvbENvbmZpZ3M/OkFycmF5PEF1dG9HYWluQ29udHJvbENvbmZpZz58bnVsbHx1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50O1xyXG4gICAgdGhpcy5mcmFtZXNSZWNvcmRlZCA9IDA7XHJcbiAgICAvL3ZhciBtc2MgPSBuZXcgQXVkaW9TdHJlYW1Db25zdHIoKTtcclxuICAgIC8vIHZhciBtc2M9e307XHJcbiAgICAvL21zYy52aWRlbyA9IGZhbHNlO1xyXG4gICAgLy9tc2MuYXVkaW8gPSB0cnVlO1xyXG5cclxuICAgIC8vIENocm9tZSBhbmQgRmlyZWZveCBzdGVyZW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbCAhIVxyXG4gICAgLy8gQW5kIGV2ZW4gd29yc2U6IFRoZSBkYXRhIGNvbWluZyBmcm9tIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSBwcmVwcm9jZXNzZWQgb24gRkYgYW5kIENocm9tZS4gSXQgY29udGFpbnMgRFNQIGFydGlmYWN0cyEhXHJcblxyXG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzg3NzM3XHJcbiAgICAvLyBUaGUgd29ya2Fyb3VuZCB0byBzZXQgdGhlc2UgY29uc3RyYWludHMgZG9lcyBfTk9UXyBoZWxwOlxyXG4gICAgLy92YXIgbXNjPXthdWRpbzoge2VjaG9DYW5jZWxsYXRpb246IGZhbHNlLGNoYW5uZWxDb3VudDogMiwgZ29vZ0F1ZGlvTWlycm9yaW5nOiBmYWxzZX0sdmlkZW86IGZhbHNlfTtcclxuXHJcbiAgICAvLyBTYWZhcmkgYXQgbGVhc3QgdmVyc2lvbiAxMTogU3VwcG9ydCBmb3IgbWVkaWEgc3RyZWFtc1xyXG4gICAgLy8gVE9ETyB0ZXN0IGlmIGlucHV0IGlzIHVucHJvY2Vzc2VkXHJcblxyXG4gICAgbGV0IG1zYzpNZWRpYVN0cmVhbUNvbnN0cmFpbnRzO1xyXG4gICAgY29uc29sZS5pbmZvKCdVc2VyIGFnZW50OiAnK25hdmlnYXRvci51c2VyQWdlbnQpO1xyXG5cclxuXHJcbiAgICAgIGxldCB1YT1Vc2VyQWdlbnRCdWlsZGVyLnVzZXJBZ2VudCgpO1xyXG5cclxuICAgICAgLy8gdWEuY29tcG9uZW50cy5mb3JFYWNoKChjKT0+e1xyXG4gICAgICAvLyAgIGNvbnNvbGUuaW5mbyhcIlVBX0NvbXA6IFwiK2MudG9TdHJpbmcoKSk7XHJcbiAgICAgIC8vIH0pXHJcblxyXG4gICAgIGxldCBhZ2NDZmc6QXV0b0dhaW5Db250cm9sQ29uZmlnfG51bGw9bnVsbDtcclxuXHJcbiAgICBsZXQgYXV0b0dhaW5Db250cm9sPWZhbHNlO1xyXG4gICAgbGV0IGNocm9tZUVjaG9DYW5jZWxsYXRpb249ZmFsc2U7XHJcbiAgICBpZihhdXRvR2FpbkNvbnRyb2xDb25maWdzKXtcclxuICAgICAgZm9yKGxldCBhZ2NjIG9mIGF1dG9HYWluQ29udHJvbENvbmZpZ3Mpe1xyXG4gICAgICAgIGlmKGFnY2MucGxhdGZvcm09PT1DZmdQbGF0Zm9ybS5BbmRyb2lkICYmIHVhLmRldGVjdGVkUGxhdGZvcm09PT1QbGF0Zm9ybS5BbmRyb2lkKXtcclxuICAgICAgICAgICAgYWdjQ2ZnPWFnY2M7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihhZ2NjLnBsYXRmb3JtPT09Q2ZnUGxhdGZvcm0uV2luZG93cyAmJiB1YS5kZXRlY3RlZFBsYXRmb3JtPT09UGxhdGZvcm0uV2luZG93cyl7XHJcbiAgICAgICAgICBhZ2NDZmc9YWdjYztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZihhZ2NDZmcpe1xyXG4gICAgICAgIC8vIFRPRE8gdXNlIEVYQUNUL0lERUFMIGNvbnN0cmFpbnRcclxuICAgICAgICBhdXRvR2FpbkNvbnRyb2w9YWdjQ2ZnLnZhbHVlO1xyXG4gICAgICAgIGlmKENIUk9NRV9BQ1RJVkFURV9FQ0hPX0NBTkNFTExBVElPTl9XSVRIX0FHQyl7XHJcbiAgICAgICAgICBjaHJvbWVFY2hvQ2FuY2VsbGF0aW9uPWFnY0NmZy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETyBxdWVyeSByZWFsIEFHQyBzdGF0dXNcclxuICAgICAgICB0aGlzLmFnY1N0YXR1cz1hZ2NDZmcudmFsdWU7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuYWdjU3RhdHVzPWZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGVmYXVsdFxyXG4gICAgbXNjID0ge1xyXG4gICAgICBhdWRpbzoge1xyXG4gICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcclxuICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IGF1dG9HYWluQ29udHJvbFxyXG4gICAgICB9LFxyXG4gICAgICB2aWRlbzogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuRWRnZSkge1xyXG5cclxuICAgICAgLy8gTWljcm9zb2Z0IEVkZ2Ugc2VuZHMgdW5tb2RpZmllZCBhdWRpb1xyXG4gICAgICAvLyBUaGUgY29uc3RyYWludCBjYW4gZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIE1pY3Jvc29mdCBFZGdlLlwiKTtcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcclxuICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgYXV0b0dhaW5Db250cm9sOiBhdXRvR2FpbkNvbnRyb2xcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLkNocm9tZSkge1xyXG4gICAgICAvLyBHb29nbGUgQ2hyb21lOiB3ZSBuZWVkIHRvIHN3aXRjaCBvZiBlYWNoIG9mIHRoZSBwcmVwcm9jZXNzaW5nIHVuaXRzIGluY2x1ZGluZyB0aGVcclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgR29vZ2xlIENocm9tZS5cIik7XHJcblxyXG4gICAgICAvLyBDaHJvbWUgNjAgLT4gNjEgY2hhbmdlZFxyXG4gICAgICAvLyBpdCB3b3JrcyBub3cgd2l0aG91dCBtYW5kYXRvcnkvb3B0aW9uYWwgc3ViLW9iamVjdHNcclxuXHJcblxyXG4gICAgICAvLyBSZXF1aXJlcyBhdCBsZWFzdCBDaHJvbWUgNjFcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IHtleGFjdDpjaHJvbWVFY2hvQ2FuY2VsbGF0aW9ufSxcclxuICAgICAgICAgIGF1dG9HYWluQ29udHJvbDoge2V4YWN0OmF1dG9HYWluQ29udHJvbH0sXHJcbiAgICAgICAgICBzYW1wbGVTaXplOnttaW46IDE2fSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZSxcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5GaXJlZm94KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIE1vemlsbGEgRmlyZWZveC5cIik7XHJcbiAgICAgIC8vIEZpcmVmb3hcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgYXV0b0dhaW5Db250cm9sOiBhdXRvR2FpbkNvbnRyb2wsXHJcbiAgICAgICAgICBub2lzZVN1cHByZXNzaW9uOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLlNhZmFyaSkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBTYWZhcmkgYnJvd3Nlci5cIilcclxuICAgICAgY29uc29sZS5pbmZvKFwiQXBwbHkgd29ya2Fyb3VuZCBmb3IgU2FmYXJpOiBBdm9pZCBkaXNjb25uZWN0IG9mIHN0cmVhbXMuXCIpO1xyXG5cclxuICAgICAgdGhpcy5kaXNjb25uZWN0U3RyZWFtcyA9IGZhbHNlO1xyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZSxcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAvLyBUT0RPIGRlZmF1bHQgY29uc3RyYWludHMgb3IgZXJyb3IgQnJvd3NlciBub3Qgc3VwcG9ydGVkXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBjb25zb2xlLmRlYnVnKFwiQXVkaW8gY2FwdHVyZSwgQUdDOiBcIit0aGlzLmFnY1N0YXR1cylcclxuXHJcblxyXG4gICAgbGV0IHVtcCA9IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG1zYyk7XHJcbiAgICB1bXAudGhlbigocykgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RyZWFtID0gcztcclxuXHJcbiAgICAgICAgbGV0IGFUcmFja3MgPSBzLmdldEF1ZGlvVHJhY2tzKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVRyYWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGFUcmFjayA9IGFUcmFja3NbaV07XHJcblxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKFwiVHJhY2sgYXVkaW8gaW5mbzogaWQ6IFwiICsgYVRyYWNrLmlkICsgXCIga2luZDogXCIgKyBhVHJhY2sua2luZCArIFwiIGxhYmVsOiBcXFwiXCIgKyBhVHJhY2subGFiZWwgKyBcIlxcXCJcIik7XHJcbiAgICAgICAgICBsZXQgbXRyU3RzPWFUcmFjay5nZXRTZXR0aW5ncygpO1xyXG5cclxuICAgICAgICAgIC8vIFR5cGVzY3JpcHQgbGliLmRvbS50cyBNZWRpYVRyYWNrU2V0dGluZ3MuY2hhbm5lbENvdW50IGlzIG1pc3NpbmdcclxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZG4vYnJvd3Nlci1jb21wYXQtZGF0YS9ibG9iLzU0OTNkOGY5MzdlMDViMmRkYmQ0MWI5OWY1YmRmYWQ0YTFmMmVkODUvYXBpL01lZGlhVHJhY2tTZXR0aW5ncy5qc29uXHJcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIGF1ZGlvIHNldHRpbmdzOiBDaCBjbnQ6IFwiK210clN0cy5jaGFubmVsQ291bnQrXCIsIEFHQzogXCIrbXRyU3RzLmF1dG9HYWluQ29udHJvbCtcIiwgRWNobyBjYW5jZWxsLjogXCIrbXRyU3RzLmVjaG9DYW5jZWxsYXRpb24pO1xyXG4gICAgICAgICAgaWYobXRyU3RzLmF1dG9HYWluQ29udHJvbCl7XHJcbiAgICAgICAgICAgIHRoaXMuYWdjU3RhdHVzPW10clN0cy5hdXRvR2FpbkNvbnRyb2w7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdlRyYWNrcyA9IHMuZ2V0VmlkZW9UcmFja3MoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZUcmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB2VHJhY2sgPSB2VHJhY2tzW2ldO1xyXG4gICAgICAgICAgY29uc29sZS5pbmZvKFwiVHJhY2sgdmlkZW8gaW5mbzogaWQ6IFwiICsgdlRyYWNrLmlkICsgXCIga2luZDogXCIgKyB2VHJhY2sua2luZCArIFwiIGxhYmVsOiBcIiArIHZUcmFjay5sYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWVkaWFTdHJlYW0gPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uocyk7XHJcbiAgICAgICAgLy8gc3RyZWFtIGNoYW5uZWwgY291bnQgKCBpcyBhbHdheXMgMiAhKVxyXG4gICAgICAgIGxldCBzdHJlYW1DaGFubmVsQ291bnQ6IG51bWJlciA9IHRoaXMubWVkaWFTdHJlYW0uY2hhbm5lbENvdW50O1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIlN0cmVhbSBjaGFubmVsIGNvdW50OiBcIitzdHJlYW1DaGFubmVsQ291bnQpO1xyXG4gICAgICAgIC8vIGlzIG5vdCBzZXQhIVxyXG4gICAgICAgIC8vdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSA9IHRoaXMubWVkaWFTdHJlYW0uc2FtcGxlUmF0ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTYW1wbGVSYXRlID0gdGhpcy5jb250ZXh0LnNhbXBsZVJhdGU7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFwiU291cmNlIGF1ZGlvIG5vZGU6IGNoYW5uZWxzOiBcIiArIHN0cmVhbUNoYW5uZWxDb3VudCArIFwiIHNhbXBsZXJhdGU6IFwiICsgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0uc2V0Rm9ybWF0KHRoaXMuY2hhbm5lbENvdW50LCB0aGlzLmN1cnJlbnRTYW1wbGVSYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVzNDICAtPiBuZXcgbmFtZSBpcyBjcmVhdGVTY3JpcHRQcm9jZXNzb3JcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIEFnYWluIGRlcHJlY2F0ZWQsIGJ1dCBBdWRpb1dvcmtlciBub3QgeWV0IGltcGxlbWVudGVkIGluIHN0YWJsZSByZWxlYXNlcyAoSnVuZSAyMDE2KVxyXG4gICAgICAgIC8vIEF1ZGlvV29ya2VyIGlzIG5vdyBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgLi4uIChNYXkgMjAxNylcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSAxMi0yMDIwOlxyXG4gICAgICAgLy8gVGhlIFNjcmlwdFByb2Nlc3Nvck5vZGUgSW50ZXJmYWNlIC0gREVQUkVDQVRFRFxyXG5cclxuICAgICAgLy8gVXBkYXRlIDA2LTIwMjFcclxuICAgICAgLy8gIEF1ZGlvV29ya2xldFByb2Nlc3NvciBpcyBoZXJlIHRvIHN0YXkuIFdlYiBBdWRpbyBBUEkgaGFzIG5vdyBSZWNvbW1lbmRhdGlvbiBzdGF0dXMgIVxyXG5cclxuICAgICAgICAgIGlmKEVOQUJMRV9BVURJT19XT1JLTEVUICYmIHRoaXMuY29udGV4dC5hdWRpb1dvcmtsZXQpe1xyXG4gICAgICAgICAgICAvL2NvbnN0IHdvcmtsZXRGaWxlTmFtZSA9ICgnZmlsZS1sb2FkZXIhLi9pbnRlcmNlcHRvcl93b3JrbGV0LmpzJyk7XHJcbiAgICAgICAgICAgIC8vY29uc3Qgd29ya2xldEZpbGVOYW1lID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NDIwMC9hc3NldHMvaW50ZXJjZXB0b3Jfd29ya2xldC5qcyc7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coYXdwU3RyKTtcclxuICAgICAgICAgICAgbGV0IGF1ZGlvV29ya2xldE1vZHVsZUJsb2I9IG5ldyBCbG9iKFthd3BTdHJdLCB7dHlwZTogJ3RleHQvamF2YXNjcmlwdCd9KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iVXJsPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGF1ZGlvV29ya2xldE1vZHVsZUJsb2IpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmF1ZGlvV29ya2xldC5hZGRNb2R1bGUoYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYlVybCkudGhlbigoKT0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgYXduID0gbmV3IEF1ZGlvV29ya2xldE5vZGUodGhpcy5jb250ZXh0LCAnY2FwdHVyZS1pbnRlcmNlcHRvcicpO1xyXG4gICAgICAgICAgICAgICAgICBhd24ub25wcm9jZXNzb3JlcnJvcj0oZXY6RXZlbnQpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZz0nVW5rbndvbiBlcnJvcic7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZXYgaW5zdGFuY2VvZiBFcnJvckV2ZW50KXtcclxuICAgICAgICAgICAgICAgICAgICAgIG1zZz1ldi5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2FwdHVyZSBhdWRpbyB3b3JrbGV0IGVycm9yOiBcIittc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubGlzdGVuZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcihtc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBsZXQgYXduUHQgPSBhd24ucG9ydDtcclxuICAgICAgICAgICAgICAgICAgaWYgKGF3blB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXduUHQub25tZXNzYWdlID0gKGV2OiBNZXNzYWdlRXZlbnQ8YW55PikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FwdHVyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkdD1ldi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hzID0gZHQuY2hzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRhTGVuID0gZHQuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHX1RSQUNFX0xFVkVMPjgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdSZWNlaXZlZCBkYXRhIGZyb20gd29ya2xldDogJyArY2hzICsgJyAnICsgZHQubGVuICsnIERhdGEgY2hzOiAnK2FkYUxlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgY2h1bmtMZW4gPSBhZGFMZW4gLyBjaHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaHVua0xlbiA9IGFkYUxlbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW2NoXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkYVBvcyA9IGNoICogY2h1bmtMZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkdC5kYXRhW2NoXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmEgPSBuZXcgRmxvYXQzMkFycmF5KGR0LmRhdGFbY2hdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5wdXNoKGZhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtbY2hdID0gZmE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBzYW1wbGVzIG9mIGNoYW5uZWwgMCB0byBjb3VudCBmcmFtZXMgKHNhbXBsZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZXNSZWNvcmRlZCArPSBmYS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihERUJVR19UUkFDRV9MRVZFTD44KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnQ2hhbm5lbCAnK2NoKycgZGF0YSBub3Qgc2V0ISEnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ud3JpdGUoY2h1bmspO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUgPSBhd247XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vcGVuZWQoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcjogYW55KT0+e1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgYWRkIG1vZHVsZSAnK2Vycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfWVsc2UgaWYodGhpcy5jb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3Nvcikge1xyXG4gICAgICAgICAgICAvLyBUaGUgU2NyaXB0UHJvY2Vzc29yTm9kZSBJbnRlcmZhY2UgLSBERVBSRUNBVEVEIE9ubHkgYXMgZmFsbGJhY2tcclxuICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgdXNlIHN0cmVhbUNoYW5uZWxDb3VudCBvciBjaGFubmVsQ291bnQgaGVyZSA/XHJcbiAgICAgICAgICAgIGxldCBzY3JpcHRQcm9jZXNzb3JOb2RlPSB0aGlzLmNvbnRleHQuY3JlYXRlU2NyaXB0UHJvY2Vzc29yKEF1ZGlvQ2FwdHVyZS5CVUZGRVJfU0laRSwgc3RyZWFtQ2hhbm5lbENvdW50LCBzdHJlYW1DaGFubmVsQ291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ05vZGU9c2NyaXB0UHJvY2Vzc29yTm9kZTtcclxuICAgICAgICAgICAgbGV0IGMgPSAwO1xyXG4gICAgICAgICAgICBpZihzY3JpcHRQcm9jZXNzb3JOb2RlLm9uYXVkaW9wcm9jZXNzKXtcclxuICAgICAgICAgICAgICBzY3JpcHRQcm9jZXNzb3JOb2RlLm9uYXVkaW9wcm9jZXNzID0gKGU6IEF1ZGlvUHJvY2Vzc2luZ0V2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FwdHVyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBpbkJ1ZmZlciA9IGUuaW5wdXRCdWZmZXI7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IGluQnVmZmVyLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3MgcmVxdWVzdGVkIGNvdW50IG9mIGNoYW5uZWxzXHJcbiAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50QnVmZmVycyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNoYW5uZWxDb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoOiBudW1iZXIgPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaFNhbXBsZXMgPSBpbkJ1ZmZlci5nZXRDaGFubmVsRGF0YShjaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoU2FtcGxlc0NvcHkgPSBjaFNhbXBsZXMuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZmZlcnNbY2hdID0gY2hTYW1wbGVzQ29weS5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbY2hdLnB1c2goY2hTYW1wbGVzQ29weSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoREVCVUdfVFJBQ0VfTEVWRUw+OCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiUHJvY2VzcyBcIitjaFNhbXBsZXNDb3B5Lmxlbmd0aCtcIiBzYW1wbGVzLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZXNSZWNvcmRlZCArPSBjaFNhbXBsZXNDb3B5Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjKys7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS53cml0ZShjdXJyZW50QnVmZmVycyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMuX29wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub3BlbmVkKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gcHJvY2Vzc2luZyAoU2NyaXB0UHJvY2Vzc29yLm9uYXVkaW9wcm9jZXNzIG1ldGhvZCBub3QgZm91bmQpIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHByb2Nlc3NpbmcgKG5laXRoZXIgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIG5vciBTY3JpcHRQcm9jZXNzb3IpIScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUgKyBcIiBFcnJvciBuYW1lOiBcIiArZS5uYW1lKTtcclxuICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIGlmKCdOb3RBbGxvd2VkRXJyb3InID09PSBlLm5hbWUpe1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ05vdCBhbGxvd2VkIHRvIHVzZSB5b3VyIG1pY3JvcGhvbmUuJywnUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IG1pY3JvcGhvbmUgYWNjZXNzIGlzIGFsbG93ZWQgZm9yIHRoaXMgd2ViIHBhZ2UgYW5kIHJlbG9hZCB0aGUgcGFnZS4nKTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoJ05vdFJlYWRhYmxlRXJyb3InID09PSBlLm5hbWUpe1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ0NvdWxkIG5vdCByZWFkIGZyb20geW91ciBhdWRpbyBkZXZpY2UuJywnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGF1ZGlvIGRldmljZSBpcyB3b3JraW5nLicpO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZignT3ZlcmNvbnN0cmFpbmVkRXJyb3InID09PSBlLm5hbWUpe1xyXG4gICAgICAgICAgICAgIGxldCBlTXNnPWUubXNnP2UubXNnOidPdmVyY29uc3RyYWluZWQgbWVkaWEgZGV2aWNlIHJlcXVlc3QgZXJyb3IuJztcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKGVNc2cpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIHN0YXJ0KCkge1xyXG5cclxuICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ubmV4dFN0cmVhbSgpXHJcbiAgICB9XHJcbiAgICB0aGlzLmNhcHR1cmluZyA9IHRydWU7XHJcbiAgICBpZih0aGlzLmJ1ZmZlcmluZ05vZGUpIHtcclxuICAgICAgdGhpcy5tZWRpYVN0cmVhbS5jb25uZWN0KHRoaXMuYnVmZmVyaW5nTm9kZSk7XHJcbiAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZS5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICB0aGlzLmxpc3RlbmVyLnN0YXJ0ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzdG9wKCkge1xyXG5cclxuICAgIGlmICh0aGlzLmRpc2Nvbm5lY3RTdHJlYW1zICYmIHRoaXMuYnVmZmVyaW5nTm9kZSkge1xyXG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLmRpc2Nvbm5lY3QodGhpcy5idWZmZXJpbmdOb2RlKTtcclxuICAgICAgdGhpcy5idWZmZXJpbmdOb2RlLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLmZsdXNoKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhcHR1cmluZyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5zdG9wcGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLm1lZGlhU3RyZWFtLmRpc2Nvbm5lY3QoKTtcclxuICAgIGlmICh0aGlzLnN0cmVhbSkge1xyXG4gICAgICAvL3RoaXMuc3RyZWFtLnN0b3AoKTtcclxuICAgICAgLy8nTWVkaWFTdHJlYW0uc3RvcCgpJyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gTTQ3LCBhcm91bmQgTm92ZW1iZXIgMjAxNS4gUGxlYXNlIHVzZSAnTWVkaWFTdHJlYW0uYWN0aXZlJyBpbnN0ZWFkLlxyXG4gICAgICAvL3RoaXMuc3RyZWFtLmFjdGl2ZT1mYWxzZTtcclxuICAgICAgdmFyIG10cyA9IHRoaXMuc3RyZWFtLmdldFRyYWNrcygpO1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG10cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG10c1tpXS5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX29wZW5lZD1mYWxzZTtcclxuICB9XHJcblxyXG4gIGF1ZGlvQnVmZmVyKCk6IEF1ZGlvQnVmZmVyIHtcclxuICAgIGxldCBmcmFtZUxlbjogbnVtYmVyID0gMDtcclxuICAgIGxldCBjaDBEYXRhID0gdGhpcy5kYXRhWzBdO1xyXG5cclxuICAgIGZvciAobGV0IGNoMENoayBvZiBjaDBEYXRhKSB7XHJcbiAgICAgIGZyYW1lTGVuICs9IGNoMENoay5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBsZXQgYWI6QXVkaW9CdWZmZXI7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYWIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKHRoaXMuY2hhbm5lbENvdW50LCBmcmFtZUxlbiwgdGhpcy5jb250ZXh0LnNhbXBsZVJhdGUpO1xyXG4gICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICBpZihlcnIgaW5zdGFuY2VvZiBET01FeGNlcHRpb24pe1xyXG4gICAgICAgICAgaWYoZXJyLm5hbWU9PT0nTm90U3VwcG9ydGVkRXJyb3InKXtcclxuICAgICAgICAgICAgaWYoZnJhbWVMZW49PTApe1xyXG4gICAgICAgICAgICAgIC8vIEVtcHR5IGJ1ZmZlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgQ2hyb21pdW1cclxuICAgICAgICAgICAgICAvLyBDcmVhdGUgZHVtbXkgYnVmZmVyIHdpdGggb25lIHNhbXBsZVxyXG4gICAgICAgICAgICAgIGFiID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlcih0aGlzLmNoYW5uZWxDb3VudCwgMSwgdGhpcy5jb250ZXh0LnNhbXBsZVJhdGUpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIFJhbmdlRXJyb3Ipe1xyXG4gICAgICAgICAgLy8gT3V0IG9mIG1lbW9yeVxyXG4gICAgICAgICAgLy8gVE9ETyBXaGF0IHRvIGRvID8/XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmNoYW5uZWxDb3VudDsgY2grKykge1xyXG4gICAgICAgIGxldCBjaEQgPSBhYi5nZXRDaGFubmVsRGF0YShjaCk7XHJcbiAgICAgICAgbGV0IHBvcyA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgY2hDaGsgb2YgdGhpcy5kYXRhW2NoXSkge1xyXG4gICAgICAgICAgbGV0IGJ1ZkxlbiA9IGNoQ2hrLmxlbmd0aDtcclxuICAgICAgICAgIGNoRC5zZXQoY2hDaGssIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gYnVmTGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgcmV0dXJuIGFiO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|
|
580
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQXdCLFFBQVEsSUFBSSxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2RCxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBQyxLQUFLLENBQUM7QUFFOUQsTUFBTSxpQkFBaUIsR0FBQyxDQUFDLENBQUM7QUFFMUIsTUFBTSxvQkFBb0IsR0FBQyxJQUFJLENBQUM7QUFFaEMsc0NBQXNDO0FBQ3RDLHdEQUF3RDtBQUN4RCxNQUFNLE1BQU0sR0FBQyx5RUFBeUU7SUFDbEYsSUFBSTtJQUNKLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIscUVBQXFFO0lBQ3JFLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsSUFBSTtJQUNKLFNBQVM7SUFDVCxJQUFJO0lBQ0osYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLFFBQVE7SUFDUixJQUFJO0lBQ0oscUNBQXFDO0lBQ3JDLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsNkJBQTZCO0lBQzdCLDBCQUEwQjtJQUMxQixvQ0FBb0M7SUFDcEMsMENBQTBDO0lBQzFDLG9DQUFvQztJQUNwQyx5Q0FBeUM7SUFDekMsMkNBQTJDO0lBQzNDLHVEQUF1RDtJQUN2RCxjQUFjO0lBQ2QsVUFBVTtJQUNWLGlFQUFpRTtJQUNqRSxtREFBbUQ7SUFDbkQsK0JB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QUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQy9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixHQUFHLElBQUksTUFBTSxDQUFDO2FBQ2Y7U0FDRjtRQUNILE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGdCQUFnQjtRQUNaLElBQUksR0FBRyxHQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQzs7QUFwaUJNLHdCQUFXLEdBQVcsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbSwgU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1NdWx0aXBsaWVyfSBmcm9tIFwiLi4vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7QnJvd3NlciwgUGxhdGZvcm0sIFVzZXJBZ2VudEJ1aWxkZXJ9IGZyb20gXCIuLi8uLi91dGlscy91YS1wYXJzZXJcIjtcclxuXHJcbmltcG9ydCB7QXV0b0dhaW5Db250cm9sQ29uZmlnLCBQbGF0Zm9ybSBhcyBDZmdQbGF0Zm9ybX0gZnJvbSBcIi4uLy4uL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdFwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi9hcnJheV9hdWRpb19idWZmZXJcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgQ0hST01FX0FDVElWQVRFX0VDSE9fQ0FOQ0VMTEFUSU9OX1dJVEhfQUdDPWZhbHNlO1xyXG5cclxuY29uc3QgREVCVUdfVFJBQ0VfTEVWRUw9MDtcclxuXHJcbmNvbnN0IEVOQUJMRV9BVURJT19XT1JLTEVUPXRydWU7XHJcblxyXG4vLyBTdXBlciBkaXJ0eSB3YXkgdG8gbG9hZCB0aGlzIG1vZHVsZVxyXG4vLyBDb3B5IGNvbnRlbnQgb2YgaW50ZXJjZXB0b3Jfd29ya2xldC5qcyB0byB0aGlzIHN0cmluZ1xyXG5jb25zdCBhd3BTdHI9XCJjbGFzcyBBdWRpb0NhcHR1cmVJbnRlcmNlcHRvclByb2Nlc3NvciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvcntcXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgIEJVRkZFUl9RVUFOVFVNUz02NDtcXG5cIiArXHJcbiAgICBcIiAgICBRVUFOVFVNX0ZSQU1FX0xFTj0xMjg7XFxuXCIgK1xyXG4gICAgXCIgICAgQlVGRkVSX0ZSQU1FX0xFTj10aGlzLlFVQU5UVU1fRlJBTUVfTEVOKnRoaXMuQlVGRkVSX1FVQU5UVU1TO1xcblwiICtcclxuICAgIFwiICAgIGJ1ZmZlcj1udWxsO1xcblwiICtcclxuICAgIFwiICAgIGJ1ZmZlclBvcz0wO1xcblwiICtcclxuICAgIFwiICAgIGJ1ZmZlclBvc0J5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgY29uc3RydWN0b3IoKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgIHN1cGVyKCk7XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICB9XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiBwcm9jZXNzKFxcblwiICtcclxuICAgIFwiICAgICAgaW5wdXRzLFxcblwiICtcclxuICAgIFwiICAgICAgb3V0cHV0cyxcXG5cIiArXHJcbiAgICBcIiAgICAgIHBhcmFtZXRlcnNcXG5cIiArXHJcbiAgICBcIiAgKXtcXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgICBsZXQgaW5wdXRzQ250PWlucHV0cy5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBjaGFubmVsQ291bnQ9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGlucHV0TGVuPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBpbnB1dExlbkJ5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIGlmKGlucHV0c0NudD4wKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBsZXQgaW5wdXQwID0gaW5wdXRzWzBdO1xcblwiICtcclxuICAgIFwiICAgICAgICAgY2hhbm5lbENvdW50ID0gaW5wdXQwLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPiAwKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGV0IGlucHV0MGNoMD1pbnB1dDBbMF07XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgaW5wdXRMZW49aW5wdXQwY2gwLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBpbnB1dExlbkJ5dGVzPWlucHV0MGNoMC5idWZmZXIubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIGlmICghdGhpcy5idWZmZXIgfHwgdGhpcy5idWZmZXIubGVuZ3RoIDwgY2hhbm5lbENvdW50KSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShjaGFubmVsQ291bnQpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3MgPSAwXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBmb3IgKGxldCBiY2ggPSAwOyBiY2ggPCBjaGFubmVsQ291bnQ7IGJjaCsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJbYmNoXSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5CVUZGRVJfRlJBTUVfTEVOKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IDA7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJQb3NCeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBidWZBdmFpbCA9IHRoaXMuQlVGRkVSX0ZSQU1FX0xFTiAtIHRoaXMuYnVmZmVyUG9zO1xcblwiICtcclxuICAgIFwiICAgICAvLyBjaGVjayBpZiBidWZmZXIgaGFzIHRvIGJlIHRyYW5zZmVycmVkXFxuXCIgK1xyXG4gICAgXCIgICAgIGlmIChpbnB1dExlbiA+IGJ1ZkF2YWlsKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBsZXQgYWRhPW5ldyBBcnJheShjaGFubmVsQ291bnQpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGFkYVtjaF09dGhpcy5idWZmZXJbY2hdLmJ1ZmZlci5zbGljZSgwKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgZGF0YTogYWRhLFxcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGNoczogY2hhbm5lbENvdW50LFxcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGxlbjogdGhpcy5idWZmZXJQb3NcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH0sIGFkYSk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAvLyBidWZmZXIgdHJhbnNmZXJyZWQsIHJlc2V0XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IDA7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvc0J5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgICBmb3IobGV0IGlpPTA7aWk8aW5wdXRzQ250O2lpKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICAvLyBNdXRlIG91dHB1dHNcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICAvL291dHB1dHNbaWldW2NoXS5maWxsKDApO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGxldCBjaFNhbXBsZXMgPSBpbnB1dHNbaWldW2NoXTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltjaF0uc2V0KGNoU2FtcGxlcyx0aGlzLmJ1ZmZlclBvcyk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvcys9aW5wdXRMZW47XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvc0J5dGVzKz1pbnB1dExlbkJ5dGVzO1xcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgXFxuXCIgK1xyXG4gICAgXCIgICAgIHJldHVybiB0cnVlO1xcblwiICtcclxuICAgIFwiICB9XFxuXCIgK1xyXG4gICAgXCJ9XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcInJlZ2lzdGVyUHJvY2Vzc29yKCdjYXB0dXJlLWludGVyY2VwdG9yJyxBdWRpb0NhcHR1cmVJbnRlcmNlcHRvclByb2Nlc3Nvcik7XFxuXCI7XHJcblxyXG5cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvQ2FwdHVyZUxpc3RlbmVyIHtcclxuICBvcGVuZWQoKTogdm9pZDtcclxuXHJcbiAgc3RhcnRlZCgpOiB2b2lkO1xyXG5cclxuICBzdG9wcGVkKCk6IHZvaWQ7XHJcblxyXG4gIGNsb3NlZCgpOiB2b2lkO1xyXG5cclxuICBlcnJvcihtc2c/OnN0cmluZyxhZHZpY2U/OnN0cmluZyk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NhcHR1cmUge1xyXG4gIGdldCBvcGVuZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3BlbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIEJVRkZFUl9TSVpFOiBudW1iZXIgPSA4MTkyO1xyXG4gIGNvbnRleHQ6IEF1ZGlvQ29udGV4dDtcclxuICBzdHJlYW0hOiBNZWRpYVN0cmVhbTtcclxuICBjaGFubmVsQ291bnQhOiBudW1iZXI7XHJcbiAgbWVkaWFTdHJlYW06IGFueTtcclxuICBhZ2NTdGF0dXM6Ym9vbGVhbnxudWxsPW51bGw7XHJcbiAgYnVmZmVyaW5nTm9kZTogQXVkaW9Ob2RlfG51bGw9bnVsbDtcclxuICBsaXN0ZW5lciE6IEF1ZGlvQ2FwdHVyZUxpc3RlbmVyO1xyXG4gIGRhdGEhOiBBcnJheTxBcnJheTxGbG9hdDMyQXJyYXk+PjtcclxuICBjdXJyZW50U2FtcGxlUmF0ZSE6IG51bWJlcjtcclxuICBuOiBOYXZpZ2F0b3I7XHJcbiAgYXVkaW9PdXRTdHJlYW06IFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZGlzY29ubmVjdFN0cmVhbXMgPSB0cnVlO1xyXG4gIHByaXZhdGUgX29wZW5lZD1mYWxzZTtcclxuICBwcml2YXRlIGNhcHR1cmluZyA9IGZhbHNlO1xyXG5cclxuICBmcmFtZXNSZWNvcmRlZDogbnVtYmVyPTA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IEF1ZGlvQ29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMubiA9IG5hdmlnYXRvcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XHJcbiAgICB0aGlzLmRhdGEgPSBuZXcgQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVsQ291bnQ7IGkrKykge1xyXG4gICAgICB0aGlzLmRhdGEucHVzaChuZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgPSAwO1xyXG4gIH1cclxuXHJcbiAgbGlzdERldmljZXMoKSB7XHJcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKChsOiBNZWRpYURldmljZUluZm9bXSkgPT4gdGhpcy5wcmludERldmljZXMobCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkdW1teVNlc3Npb24oKTpQcm9taXNlPE1lZGlhU3RyZWFtPntcclxuICAgIC8vIHdvcmthcm91bmQgdG8gcmVxdWVzdCBwZXJtaXNzaW9uczpcclxuICAgIC8vIFN0YXJ0IGEgZHVtbXkgc2Vzc2lvblxyXG4gICAgbGV0IG1lZGlhU3RyQ25zdHJzID0gPE1lZGlhU3RyZWFtQ29uc3RyYWludHM+e2F1ZGlvOlxyXG4gICAgICAgIHtlY2hvQ2FuY2VsYXRpb246IGZhbHNlfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtZWRpYVN0ckNuc3Rycyk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc3RvcEFsbFNlc3Npb25UcmFja3MobWVkaWFTdHJlYW06TWVkaWFTdHJlYW0pe1xyXG4gICAgICBsZXQgYXRzID0gbWVkaWFTdHJlYW0uZ2V0VHJhY2tzKCk7XHJcbiAgICAgIGZvciAobGV0IGF0SWR4ID0gMDsgYXRJZHggPCBhdHMubGVuZ3RoOyBhdElkeCsrKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RvcCBkdW1teSBzZXNzaW9uIHRyYWNrOiAjXCIgKyBhdElkeClcclxuICAgICAgICBhdHNbYXRJZHhdLnN0b3AoKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgZGV2aWNlSW5mb3MoY2I6IChkZXZpY2VJbmZvczogTWVkaWFEZXZpY2VJbmZvW10gfCBudWxsKSA9PiBhbnksIHJldHJ5ID0gdHJ1ZSxkdW1teVN0cmVhbT86TWVkaWFTdHJlYW0pIHtcclxuXHJcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKChsOiBNZWRpYURldmljZUluZm9bXSkgPT4ge1xyXG4gICAgICBsZXQgbGFiZWxzQXZhaWxhYmxlID0gZmFsc2U7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBkaSA9IGxbaV07XHJcbiAgICAgICAgaWYgKGRpLmxhYmVsKSB7XHJcbiAgICAgICAgICBsYWJlbHNBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWxhYmVsc0F2YWlsYWJsZSkge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk1lZGlhIGRldmljZSBlbnVtZXJhdGlvbjogTm8gbGFiZWxzLlwiKVxyXG4gICAgICAgIGlmIChyZXRyeSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCJTdGFydGluZyBkdW1teSBzZXNzaW9uIHRvIHJlcXVlc3QgYXVkaW8gcGVybWlzc2lvbnMuLi5cIilcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZHVtbXlTZXNzaW9uKCkudGhlbigoczogTWVkaWFTdHJlYW0pID0+IHtcclxuICAgICAgICAgICAgLy8gYW5kIHN0b3AgaXQgaW1tZWRpYXRlbHlcclxuXHJcbiAgICAgICAgICAgIGlmKHMpIHtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJHb3QgZHVtbXkgc2Vzc2lvbiBzdHJlYW06IFwiICsgcyArIFwiIC5cIilcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTm8gZHVtbXkgc3RyZWFtXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gcmV0cnkgKG9ubHkgb25jZSlcclxuICAgICAgICAgICAgdGhpcy5kZXZpY2VJbmZvcyhjYiwgZmFsc2Uscyk7XHJcbiAgICAgICAgICB9LHJlYXNvbiA9PiB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkR1bW15IHNlc3Npb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgICAgICAgIC8vIFRPRE8gZXJyb3IgY2FsbGJhY2tcclxuICAgICAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHN1Y2Nlc3NcclxuICAgICAgICBjYihsKTtcclxuICAgICAgfVxyXG4gICAgICBpZihkdW1teVN0cmVhbSl7XHJcbiAgICAgICAgdGhpcy5zdG9wQWxsU2Vzc2lvblRyYWNrcyhkdW1teVN0cmVhbSk7XHJcbiAgICAgIH1cclxuICAgIH0sKHJlYXNvbik9PiB7XHJcbiAgICAgIC8vcmVqZWN0ZWRcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTWVkaWEgZGV2aWNlIGVudW1lcmF0aW9uIHJlamVjdGVkLlwiKVxyXG4gICAgICBpZiAocmV0cnkpIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdGFydGluZyBkdW1teSBzZXNzaW9uIHRvIHJlcXVlc3QgYXVkaW8gcGVybWlzc2lvbnMuLi5cIilcclxuICAgICAgICB0aGlzLmR1bW15U2Vzc2lvbigpLnRoZW4oKHM6IE1lZGlhU3RyZWFtKSA9PiB7XHJcbiAgICAgICAgICAvLyBhbmQgc3RvcCBpdCBpbW1lZGlhdGVseVxyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbi5cIilcclxuICAgICAgICAgIGlmKHMpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiR290IGR1bW15IHNlc3Npb24gc3RyZWFtOiBcIiArIHMgKyBcIiAuXCIpXHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTm8gZHVtbXkgc3RyZWFtXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyByZXRyeSAob25seSBvbmNlKVxyXG4gICAgICAgICAgdGhpcy5kZXZpY2VJbmZvcyhjYiwgZmFsc2Uscyk7XHJcbiAgICAgICAgfSwgcmVhc29uID0+IHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkR1bW15IHNlc3Npb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgICAgICAvLyBUT0RPIGVycm9yIGNhbGxiYWNrXHJcbiAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYihudWxsKTtcclxuICAgICAgfVxyXG4gICAgICBpZihkdW1teVN0cmVhbSl7XHJcbiAgICAgICAgdGhpcy5zdG9wQWxsU2Vzc2lvblRyYWNrcyhkdW1teVN0cmVhbSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHByaW50RGV2aWNlcyhsOiBNZWRpYURldmljZUluZm9bXSk6IHZvaWQge1xyXG4gICAgbGV0IHNlbERldmljZUlkID0gJ19fX2R1bW15X19fJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgZGkgPSBsW2ldO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXCJBdWRpbyBkZXZpY2U6IElkOiBcIiArIGRpLmRldmljZUlkICsgXCIgZ3JvdXBJZDogXCIgKyBkaS5ncm91cElkICsgXCIgbGFiZWw6IFwiICsgZGkubGFiZWwgKyBcIiBraW5kOiBcIiArIGRpLmtpbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlbihjaGFubmVsQ291bnQ6IG51bWJlciwgc2VsRGV2aWNlSWQ/OiBDb25zdHJhaW5ET01TdHJpbmd8dW5kZWZpbmVkLGF1dG9HYWluQ29udHJvbENvbmZpZ3M/OkFycmF5PEF1dG9HYWluQ29udHJvbENvbmZpZz58bnVsbHx1bmRlZmluZWQpe1xyXG4gICAgICB0aGlzLmNvbnRleHQucmVzdW1lKCkudGhlbigoKT0+e1xyXG4gICAgICAgIHRoaXMuX29wZW4oY2hhbm5lbENvdW50LHNlbERldmljZUlkLGF1dG9HYWluQ29udHJvbENvbmZpZ3MpO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgX29wZW4oY2hhbm5lbENvdW50OiBudW1iZXIsIHNlbERldmljZUlkPzogQ29uc3RyYWluRE9NU3RyaW5nfHVuZGVmaW5lZCxhdXRvR2FpbkNvbnRyb2xDb25maWdzPzpBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+fG51bGx8dW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDtcclxuICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgPSAwO1xyXG4gICAgLy92YXIgbXNjID0gbmV3IEF1ZGlvU3RyZWFtQ29uc3RyKCk7XHJcbiAgICAvLyB2YXIgbXNjPXt9O1xyXG4gICAgLy9tc2MudmlkZW8gPSBmYWxzZTtcclxuICAgIC8vbXNjLmF1ZGlvID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc3RlcmVvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwgISFcclxuICAgIC8vIEFuZCBldmVuIHdvcnNlOiBUaGUgZGF0YSBjb21pbmcgZnJvbSB0aGUgc291cmNlIGlzIGFscmVhZHkgcHJlcHJvY2Vzc2VkIG9uIEZGIGFuZCBDaHJvbWUuIEl0IGNvbnRhaW5zIERTUCBhcnRpZmFjdHMhIVxyXG5cclxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM4NzczN1xyXG4gICAgLy8gVGhlIHdvcmthcm91bmQgdG8gc2V0IHRoZXNlIGNvbnN0cmFpbnRzIGRvZXMgX05PVF8gaGVscDpcclxuICAgIC8vdmFyIG1zYz17YXVkaW86IHtlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxjaGFubmVsQ291bnQ6IDIsIGdvb2dBdWRpb01pcnJvcmluZzogZmFsc2V9LHZpZGVvOiBmYWxzZX07XHJcblxyXG4gICAgLy8gU2FmYXJpIGF0IGxlYXN0IHZlcnNpb24gMTE6IFN1cHBvcnQgZm9yIG1lZGlhIHN0cmVhbXNcclxuICAgIC8vIFRPRE8gdGVzdCBpZiBpbnB1dCBpcyB1bnByb2Nlc3NlZFxyXG5cclxuICAgIGxldCBtc2M6TWVkaWFTdHJlYW1Db25zdHJhaW50cztcclxuICAgIGNvbnNvbGUuaW5mbygnVXNlciBhZ2VudDogJytuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuXHJcblxyXG4gICAgICBsZXQgdWE9VXNlckFnZW50QnVpbGRlci51c2VyQWdlbnQoKTtcclxuXHJcbiAgICAgIC8vIHVhLmNvbXBvbmVudHMuZm9yRWFjaCgoYyk9PntcclxuICAgICAgLy8gICBjb25zb2xlLmluZm8oXCJVQV9Db21wOiBcIitjLnRvU3RyaW5nKCkpO1xyXG4gICAgICAvLyB9KVxyXG5cclxuICAgICBsZXQgYWdjQ2ZnOkF1dG9HYWluQ29udHJvbENvbmZpZ3xudWxsPW51bGw7XHJcblxyXG4gICAgbGV0IGF1dG9HYWluQ29udHJvbD1mYWxzZTtcclxuICAgIGxldCBjaHJvbWVFY2hvQ2FuY2VsbGF0aW9uPWZhbHNlO1xyXG4gICAgaWYoYXV0b0dhaW5Db250cm9sQ29uZmlncyl7XHJcbiAgICAgIGZvcihsZXQgYWdjYyBvZiBhdXRvR2FpbkNvbnRyb2xDb25maWdzKXtcclxuICAgICAgICBpZihhZ2NjLnBsYXRmb3JtPT09Q2ZnUGxhdGZvcm0uQW5kcm9pZCAmJiB1YS5kZXRlY3RlZFBsYXRmb3JtPT09UGxhdGZvcm0uQW5kcm9pZCl7XHJcbiAgICAgICAgICAgIGFnY0NmZz1hZ2NjO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoYWdjYy5wbGF0Zm9ybT09PUNmZ1BsYXRmb3JtLldpbmRvd3MgJiYgdWEuZGV0ZWN0ZWRQbGF0Zm9ybT09PVBsYXRmb3JtLldpbmRvd3Mpe1xyXG4gICAgICAgICAgYWdjQ2ZnPWFnY2M7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoYWdjQ2ZnKXtcclxuICAgICAgICAvLyBUT0RPIHVzZSBFWEFDVC9JREVBTCBjb25zdHJhaW50XHJcbiAgICAgICAgYXV0b0dhaW5Db250cm9sPWFnY0NmZy52YWx1ZTtcclxuICAgICAgICBpZihDSFJPTUVfQUNUSVZBVEVfRUNIT19DQU5DRUxMQVRJT05fV0lUSF9BR0Mpe1xyXG4gICAgICAgICAgY2hyb21lRWNob0NhbmNlbGxhdGlvbj1hZ2NDZmcudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE8gcXVlcnkgcmVhbCBBR0Mgc3RhdHVzXHJcbiAgICAgICAgdGhpcy5hZ2NTdGF0dXM9YWdjQ2ZnLnZhbHVlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLmFnY1N0YXR1cz1mYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRlZmF1bHRcclxuICAgIG1zYyA9IHtcclxuICAgICAgYXVkaW86IHtcclxuICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgYXV0b0dhaW5Db250cm9sOiBhdXRvR2FpbkNvbnRyb2xcclxuICAgICAgfSxcclxuICAgICAgdmlkZW86IGZhbHNlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLkVkZ2UpIHtcclxuXHJcbiAgICAgIC8vIE1pY3Jvc29mdCBFZGdlIHNlbmRzIHVubW9kaWZpZWQgYXVkaW9cclxuICAgICAgLy8gVGhlIGNvbnN0cmFpbnQgY2FuIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvblxyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBNaWNyb3NvZnQgRWRnZS5cIik7XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2VcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5DaHJvbWUpIHtcclxuICAgICAgLy8gR29vZ2xlIENocm9tZTogd2UgbmVlZCB0byBzd2l0Y2ggb2YgZWFjaCBvZiB0aGUgcHJlcHJvY2Vzc2luZyB1bml0cyBpbmNsdWRpbmcgdGhlXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIEdvb2dsZSBDaHJvbWUuXCIpO1xyXG5cclxuICAgICAgLy8gQ2hyb21lIDYwIC0+IDYxIGNoYW5nZWRcclxuICAgICAgLy8gaXQgd29ya3Mgbm93IHdpdGhvdXQgbWFuZGF0b3J5L29wdGlvbmFsIHN1Yi1vYmplY3RzXHJcblxyXG5cclxuICAgICAgLy8gUmVxdWlyZXMgYXQgbGVhc3QgQ2hyb21lIDYxXHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiB7ZXhhY3Q6Y2hyb21lRWNob0NhbmNlbGxhdGlvbn0sXHJcbiAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IHtleGFjdDphdXRvR2FpbkNvbnRyb2x9LFxyXG4gICAgICAgICAgc2FtcGxlU2l6ZTp7bWluOiAxNn0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuRmlyZWZveCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBNb3ppbGxhIEZpcmVmb3guXCIpO1xyXG4gICAgICAvLyBGaXJlZm94XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sLFxyXG4gICAgICAgICAgbm9pc2VTdXBwcmVzc2lvbjogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZSxcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5TYWZhcmkpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgU2FmYXJpIGJyb3dzZXIuXCIpXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIkFwcGx5IHdvcmthcm91bmQgZm9yIFNhZmFyaTogQXZvaWQgZGlzY29ubmVjdCBvZiBzdHJlYW1zLlwiKTtcclxuXHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdFN0cmVhbXMgPSBmYWxzZTtcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gVE9ETyBkZWZhdWx0IGNvbnN0cmFpbnRzIG9yIGVycm9yIEJyb3dzZXIgbm90IHN1cHBvcnRlZFxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGNhcHR1cmUsIEFHQzogXCIrdGhpcy5hZ2NTdGF0dXMpXHJcblxyXG5cclxuICAgIGxldCB1bXAgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtc2MpO1xyXG4gICAgdW1wLnRoZW4oKHMpID0+IHtcclxuICAgICAgICB0aGlzLnN0cmVhbSA9IHM7XHJcblxyXG4gICAgICAgIGxldCBhVHJhY2tzID0gcy5nZXRBdWRpb1RyYWNrcygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFUcmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBhVHJhY2sgPSBhVHJhY2tzW2ldO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIGF1ZGlvIGluZm86IGlkOiBcIiArIGFUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgYVRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXFxcIlwiICsgYVRyYWNrLmxhYmVsICsgXCJcXFwiXCIpO1xyXG4gICAgICAgICAgbGV0IG10clN0cz1hVHJhY2suZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgICAgICAgICAvLyBUeXBlc2NyaXB0IGxpYi5kb20udHMgTWVkaWFUcmFja1NldHRpbmdzLmNoYW5uZWxDb3VudCBpcyBtaXNzaW5nXHJcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWRuL2Jyb3dzZXItY29tcGF0LWRhdGEvYmxvYi81NDkzZDhmOTM3ZTA1YjJkZGJkNDFiOTlmNWJkZmFkNGExZjJlZDg1L2FwaS9NZWRpYVRyYWNrU2V0dGluZ3MuanNvblxyXG4gICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBzZXR0aW5nczogQ2ggY250OiBcIittdHJTdHMuY2hhbm5lbENvdW50K1wiLCBBR0M6IFwiK210clN0cy5hdXRvR2FpbkNvbnRyb2wrXCIsIEVjaG8gY2FuY2VsbC46IFwiK210clN0cy5lY2hvQ2FuY2VsbGF0aW9uKTtcclxuICAgICAgICAgIGlmKG10clN0cy5hdXRvR2FpbkNvbnRyb2wpe1xyXG4gICAgICAgICAgICB0aGlzLmFnY1N0YXR1cz1tdHJTdHMuYXV0b0dhaW5Db250cm9sO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHZUcmFja3MgPSBzLmdldFZpZGVvVHJhY2tzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2VHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdlRyYWNrID0gdlRyYWNrc1tpXTtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIHZpZGVvIGluZm86IGlkOiBcIiArIHZUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgdlRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXCIgKyB2VHJhY2subGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHMpO1xyXG4gICAgICAgIC8vIHN0cmVhbSBjaGFubmVsIGNvdW50ICggaXMgYWx3YXlzIDIgISlcclxuICAgICAgICBsZXQgc3RyZWFtQ2hhbm5lbENvdW50OiBudW1iZXIgPSB0aGlzLm1lZGlhU3RyZWFtLmNoYW5uZWxDb3VudDtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJTdHJlYW0gY2hhbm5lbCBjb3VudDogXCIrc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAvLyBpcyBub3Qgc2V0ISFcclxuICAgICAgICAvL3RoaXMuY3VycmVudFNhbXBsZVJhdGUgPSB0aGlzLm1lZGlhU3RyZWFtLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSA9IHRoaXMuY29udGV4dC5zYW1wbGVSYXRlO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIlNvdXJjZSBhdWRpbyBub2RlOiBjaGFubmVsczogXCIgKyBzdHJlYW1DaGFubmVsQ291bnQgKyBcIiBzYW1wbGVyYXRlOiBcIiArIHRoaXMuY3VycmVudFNhbXBsZVJhdGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLnNldEZvcm1hdCh0aGlzLmNoYW5uZWxDb3VudCwgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFczQyAgLT4gbmV3IG5hbWUgaXMgY3JlYXRlU2NyaXB0UHJvY2Vzc29yXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBBZ2FpbiBkZXByZWNhdGVkLCBidXQgQXVkaW9Xb3JrZXIgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBzdGFibGUgcmVsZWFzZXMgKEp1bmUgMjAxNilcclxuICAgICAgICAvLyBBdWRpb1dvcmtlciBpcyBub3cgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIC4uLiAoTWF5IDIwMTcpXHJcblxyXG4gICAgICAvLyBVcGRhdGUgMTItMjAyMDpcclxuICAgICAgIC8vIFRoZSBTY3JpcHRQcm9jZXNzb3JOb2RlIEludGVyZmFjZSAtIERFUFJFQ0FURURcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSAwNi0yMDIxXHJcbiAgICAgIC8vICBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgaXMgaGVyZSB0byBzdGF5LiBXZWIgQXVkaW8gQVBJIGhhcyBub3cgUmVjb21tZW5kYXRpb24gc3RhdHVzICFcclxuXHJcbiAgICAgICAgICBpZihFTkFCTEVfQVVESU9fV09SS0xFVCAmJiB0aGlzLmNvbnRleHQuYXVkaW9Xb3JrbGV0KXtcclxuICAgICAgICAgICAgLy9jb25zdCB3b3JrbGV0RmlsZU5hbWUgPSAoJ2ZpbGUtbG9hZGVyIS4vaW50ZXJjZXB0b3Jfd29ya2xldC5qcycpO1xyXG4gICAgICAgICAgICAvL2NvbnN0IHdvcmtsZXRGaWxlTmFtZSA9ICdodHRwOi8vbG9jYWxob3N0OjQyMDAvYXNzZXRzL2ludGVyY2VwdG9yX3dvcmtsZXQuanMnO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGF3cFN0cik7XHJcbiAgICAgICAgICAgIGxldCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iPSBuZXcgQmxvYihbYXdwU3RyXSwge3R5cGU6ICd0ZXh0L2phdmFzY3JpcHQnfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYlVybD13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChhdWRpb1dvcmtsZXRNb2R1bGVCbG9iKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5hdWRpb1dvcmtsZXQuYWRkTW9kdWxlKGF1ZGlvV29ya2xldE1vZHVsZUJsb2JVcmwpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3biA9IG5ldyBBdWRpb1dvcmtsZXROb2RlKHRoaXMuY29udGV4dCwgJ2NhcHR1cmUtaW50ZXJjZXB0b3InKTtcclxuICAgICAgICAgICAgICAgICAgYXduLm9ucHJvY2Vzc29yZXJyb3I9KGV2OkV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c9J1Vua253b24gZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGV2IGluc3RhbmNlb2YgRXJyb3JFdmVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBtc2c9ZXYubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhcHR1cmUgYXVkaW8gd29ya2xldCBlcnJvcjogXCIrbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxpc3RlbmVyKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IobXNnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbGV0IGF3blB0ID0gYXduLnBvcnQ7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChhd25QdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3blB0Lm9ubWVzc2FnZSA9IChldjogTWVzc2FnZUV2ZW50PGFueT4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHQ9ZXYuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNocyA9IGR0LmNocztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkYUxlbiA9IGR0LmRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihERUJVR19UUkFDRV9MRVZFTD44KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnUmVjZWl2ZWQgZGF0YSBmcm9tIHdvcmtsZXQ6ICcgK2NocyArICcgJyArIGR0LmxlbiArJyBEYXRhIGNoczogJythZGFMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IGNodW5rTGVuID0gYWRhTGVuIC8gY2hzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmtMZW4gPSBhZGFMZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaHVuayA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNocyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGFQb3MgPSBjaCAqIGNodW5rTGVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZHQuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZhID0gbmV3IEZsb2F0MzJBcnJheShkdC5kYXRhW2NoXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtjaF0ucHVzaChmYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rW2NoXSA9IGZhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc2FtcGxlcyBvZiBjaGFubmVsIDAgdG8gY291bnQgZnJhbWVzIChzYW1wbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gZmEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUdfVFJBQ0VfTEVWRUw+OCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0NoYW5uZWwgJytjaCsnIGRhdGEgbm90IHNldCEhJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLndyaXRlKGNodW5rKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlID0gYXduO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub3BlbmVkKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5jYXRjaCgoZXJyb3I6IGFueSk9PntcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGFkZCBtb2R1bGUgJytlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIH1lbHNlIGlmKHRoaXMuY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IpIHtcclxuICAgICAgICAgICAgLy8gVGhlIFNjcmlwdFByb2Nlc3Nvck5vZGUgSW50ZXJmYWNlIC0gREVQUkVDQVRFRCBPbmx5IGFzIGZhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIHVzZSBzdHJlYW1DaGFubmVsQ291bnQgb3IgY2hhbm5lbENvdW50IGhlcmUgP1xyXG4gICAgICAgICAgICBsZXQgc2NyaXB0UHJvY2Vzc29yTm9kZT0gdGhpcy5jb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3NvcihBdWRpb0NhcHR1cmUuQlVGRkVSX1NJWkUsIHN0cmVhbUNoYW5uZWxDb3VudCwgc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlPXNjcmlwdFByb2Nlc3Nvck5vZGU7XHJcbiAgICAgICAgICAgIGxldCBjID0gMDtcclxuICAgICAgICAgICAgaWYoc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2Vzcyl7XHJcbiAgICAgICAgICAgICAgc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2VzcyA9IChlOiBBdWRpb1Byb2Nlc3NpbmdFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5CdWZmZXIgPSBlLmlucHV0QnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBpbkJ1ZmZlci5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHJlcXVlc3RlZCBjb3VudCBvZiBjaGFubmVsc1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEJ1ZmZlcnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaGFubmVsQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaDogbnVtYmVyID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzID0gaW5CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaFNhbXBsZXNDb3B5ID0gY2hTYW1wbGVzLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZmZXJzW2NoXSA9IGNoU2FtcGxlc0NvcHkuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5wdXNoKGNoU2FtcGxlc0NvcHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKERFQlVHX1RSQUNFX0xFVkVMPjgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlByb2Nlc3MgXCIrY2hTYW1wbGVzQ29weS5sZW5ndGgrXCIgc2FtcGxlcy5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gY2hTYW1wbGVzQ29weS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYysrO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ud3JpdGUoY3VycmVudEJ1ZmZlcnMpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9wZW5lZCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHByb2Nlc3NpbmcgKFNjcmlwdFByb2Nlc3Nvci5vbmF1ZGlvcHJvY2VzcyBtZXRob2Qgbm90IGZvdW5kKSEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBwcm9jZXNzaW5nIChuZWl0aGVyIEF1ZGlvV29ya2xldFByb2Nlc3NvciBub3IgU2NyaXB0UHJvY2Vzc29yKSEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlICsgXCIgRXJyb3IgbmFtZTogXCIgK2UubmFtZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICBpZignTm90QWxsb3dlZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdOb3QgYWxsb3dlZCB0byB1c2UgeW91ciBtaWNyb3Bob25lLicsJ1BsZWFzZSBtYWtlIHN1cmUgdGhhdCBtaWNyb3Bob25lIGFjY2VzcyBpcyBhbGxvd2VkIGZvciB0aGlzIHdlYiBwYWdlIGFuZCByZWxvYWQgdGhlIHBhZ2UuJyk7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCdOb3RSZWFkYWJsZUVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdDb3VsZCBub3QgcmVhZCBmcm9tIHlvdXIgYXVkaW8gZGV2aWNlLicsJ1BsZWFzZSBtYWtlIHN1cmUgeW91ciBhdWRpbyBkZXZpY2UgaXMgd29ya2luZy4nKTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoJ092ZXJjb25zdHJhaW5lZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICBsZXQgZU1zZz1lLm1zZz9lLm1zZzonT3ZlcmNvbnN0cmFpbmVkIG1lZGlhIGRldmljZSByZXF1ZXN0IGVycm9yLic7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcihlTXNnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzdGFydCgpIHtcclxuXHJcbiAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLm5leHRTdHJlYW0oKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5idWZmZXJpbmdOb2RlKSB7XHJcbiAgICAgIHRoaXMubWVkaWFTdHJlYW0uY29ubmVjdCh0aGlzLmJ1ZmZlcmluZ05vZGUpO1xyXG4gICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5zdGFydGVkKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNjb25uZWN0U3RyZWFtcyAmJiB0aGlzLmJ1ZmZlcmluZ05vZGUpIHtcclxuICAgICAgdGhpcy5tZWRpYVN0cmVhbS5kaXNjb25uZWN0KHRoaXMuYnVmZmVyaW5nTm9kZSk7XHJcbiAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZS5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS5mbHVzaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMubGlzdGVuZXIuc3RvcHBlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5tZWRpYVN0cmVhbS5kaXNjb25uZWN0KCk7XHJcbiAgICBpZiAodGhpcy5zdHJlYW0pIHtcclxuICAgICAgLy90aGlzLnN0cmVhbS5zdG9wKCk7XHJcbiAgICAgIC8vJ01lZGlhU3RyZWFtLnN0b3AoKScgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE00NywgYXJvdW5kIE5vdmVtYmVyIDIwMTUuIFBsZWFzZSB1c2UgJ01lZGlhU3RyZWFtLmFjdGl2ZScgaW5zdGVhZC5cclxuICAgICAgLy90aGlzLnN0cmVhbS5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgIHZhciBtdHMgPSB0aGlzLnN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtdHNbaV0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVuZWQ9ZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB7XHJcbiAgICBsZXQgZnJhbWVMZW46IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY2gwRGF0YSA9IHRoaXMuZGF0YVswXTtcclxuXHJcbiAgICBmb3IgKGxldCBjaDBDaGsgb2YgY2gwRGF0YSkge1xyXG4gICAgICBmcmFtZUxlbiArPSBjaDBDaGsubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IGFiOkF1ZGlvQnVmZmVyO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFiID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlcih0aGlzLmNoYW5uZWxDb3VudCwgZnJhbWVMZW4sIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKXtcclxuICAgICAgICAgIGlmKGVyci5uYW1lPT09J05vdFN1cHBvcnRlZEVycm9yJyl7XHJcbiAgICAgICAgICAgIGlmKGZyYW1lTGVuPT0wKXtcclxuICAgICAgICAgICAgICAvLyBFbXB0eSBidWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IENocm9taXVtXHJcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGR1bW15IGJ1ZmZlciB3aXRoIG9uZSBzYW1wbGVcclxuICAgICAgICAgICAgICBhYiA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXIodGhpcy5jaGFubmVsQ291bnQsIDEsIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtcclxuICAgICAgICAgIC8vIE91dCBvZiBtZW1vcnlcclxuICAgICAgICAgIC8vIFRPRE8gV2hhdCB0byBkbyA/P1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICBsZXQgY2hEID0gYWIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGNoQ2hrIG9mIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgIGxldCBidWZMZW4gPSBjaENoay5sZW5ndGg7XHJcbiAgICAgICAgICBjaEQuc2V0KGNoQ2hrLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IGJ1ZkxlbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIHJldHVybiBhYjtcclxuICB9XHJcblxyXG4gIGF1ZGlvQnVmZmVyQXJyYXkoKTpBcnJheUF1ZGlvQnVmZmVye1xyXG4gICAgICBsZXQgYWJhPW5ldyBBcnJheUF1ZGlvQnVmZmVyKHRoaXMuY2hhbm5lbENvdW50LHRoaXMuY3VycmVudFNhbXBsZVJhdGUsdGhpcy5kYXRhKTtcclxuICAgICAgcmV0dXJuIGFiYTtcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=
|