'gulp server' to copy the js to the server
authorrougeronj
Tue, 14 Apr 2015 11:30:51 +0200
changeset 148 21634b2d7609
parent 147 4902992b2783
child 149 3a74c554c9b9
'gulp server' to copy the js to the server
annot-server/static/js/annotviz.js
annot-server/static/js/annotviz.min.js
--- a/annot-server/static/js/annotviz.js	Tue Apr 14 11:30:20 2015 +0200
+++ b/annot-server/static/js/annotviz.js	Tue Apr 14 11:30:51 2015 +0200
@@ -346,9 +346,6 @@
         var startTs = _this.timeBegin;
         var endTs = Math.min(_this.timeEnd,_this.startTs);
 
-        console.log("START TS",new Date(startTs).toISOString());
-        console.log("END TS",new Date(endTs).toISOString());
-
         var url = serverUrl + '/p/api/v1/annotation';
         var filters = [
             { name: 'ts', op: '>', val: new Date(startTs).toISOString()}, //start
@@ -534,7 +531,9 @@
 *
 * This is the starting point for your application.
 * Take a look at http://browserify.org/ for more info
+*
 */
+/*jshint unused: false */
 
 'use strict';
 
@@ -571,13 +570,13 @@
     var wsPianoroll = opts.wsPianoroll;
     var wsAnnot = opts.wsAnnot;
     var stageView = opts.stageView;
-    var currentTime = Date.now() + 3600*1000;
     var channel = opts.channel;
     var serverUrl = opts.serverUrl;
-    
+
     var eventCode = opts.eventCode;
     var eventCodeSessionDay2 = opts.eventCodeSessionDay2;
 	var eventCodeSessionDay1 = opts.eventCodeSessionDay1;
+    var logger = opts.logger;
 
 	Utils.getAnnotCategories(opts.urlCategories + eventCode, this.annotCategories);
     Utils.getAnnotCategories(opts.urlCategories + eventCodeSessionDay2, this.annotCategoriesDay2);
@@ -604,7 +603,7 @@
         serverUrl: serverUrl,
         annotCategories: this.annotCategories
     });
-	
+
 	//Archive day 2
     var timeLineDay2 = new AnnotsTimeLine.AnnotsTimeLine({
     	stageView : stageView,
@@ -612,8 +611,8 @@
         yInit: 0,
         width: 1024 - 200 - 200,
         height: 768-200,
-        timeBegin: Date.parse("2015-01-23T09:30:00+01:00"),
-        timeEnd: Date.parse("2015-01-23T18:30:00+01:00"),
+        timeBegin: Date.parse('2015-01-23T09:30:00+01:00'),
+        timeEnd: Date.parse('2015-01-23T18:30:00+01:00'),
         circleX: currentDay.circleX,
         circleY: currentDay.circleY,
         intervalWidth: (currentDay.radius*2/3)* currentDay.intervalWidth / currentDay.radius,
@@ -627,7 +626,7 @@
         showClockGraphics:false,
         archive: true
     });
-	
+
 	//Archive day 1
     var timeLineDay1 = new AnnotsTimeLine.AnnotsTimeLine({
     	stageView : stageView,
@@ -635,8 +634,8 @@
         yInit: 0,
         width: 1024 - 200 - 200,
         height: 768-200,
-        timeBegin: Date.parse("2015-01-22T09:30:00+01:00"),
-        timeEnd: Date.parse("2015-01-22T18:30:00+01:00"),
+        timeBegin: Date.parse('2015-01-22T09:30:00+01:00'),
+        timeEnd: Date.parse('2015-01-22T18:30:00+01:00'),
         circleX: currentDay.circleX,
         circleY: currentDay.circleY,
         intervalWidth: (currentDay.radius*2/3)* currentDay.intervalWidth / currentDay.radius,
@@ -651,11 +650,12 @@
         archive: true,
     });
 
-    var currentTimeText = new PIXI.Text("-- : -- : --", { font: '18pt Gothic Standard', fill: '#646464' });
+    var currentTimeText = new PIXI.Text('-- : -- : --', { font: '18pt Gothic Standard', fill: '#646464' });
     currentTimeText.x = timeLineDay2.circleX - currentTimeText.width/2;
     currentTimeText.y = timeLineDay2.circleY - currentTimeText.height/2;
     this.container.addChild(currentTimeText);
 
+
     var doubleRollH = new DoubleRoll.DoubleRoll({
         stageView : stageView,
         logger: logger,
@@ -765,16 +765,26 @@
     sceneWidth: 1024,
     pianorolls : [
       {
-        height: 435,
+        height: 384,
         timeWidth: 10,
         lineInterval: 5000,
-        noteHeight: undefined
+        noteHeight: undefined,
+        range: {
+    		bottom: 40,
+    		top: 90,
+        },
+        dynamicRange: true,
       },
       {
-        height: 645,
+        height: 384,
         timeWidth: 60,
         lineInterval: 5000,
-        noteHeight: undefined
+        noteHeight: undefined,
+        range:{
+    		bottom: 0,
+    		top: 128,
+        },
+        dynamicRange: false,
       },
     ],
     framerate: 25,
@@ -841,11 +851,19 @@
         lineInterval: lineInterval,
         offsetMusic: offsetMusic,
     };
+    
+    var lineGraphics = new PIXI.Graphics()
+	    .beginFill(this.lineFillColor)
+	    .lineStyle(1, this.lineColor)
+	    .moveTo(Math.floor(sceneWidth*zeroShift), 0)
+	    .lineTo(-sceneWidth - Math.floor(sceneWidth*zeroShift), 0)
+	    .endFill();
+	this.container.addChild(lineGraphics);
 
     var yInit = opts.yInit || 0;
     var linesDown = true;
     _(opts.pianorolls).forEach(function(prDef, i) {
-        var prNoteHeight = noteHeight || prDef.noteHeight || prDef.height / 128;
+        var prNoteHeight = noteHeight || prDef.noteHeight || prDef.height / (prDef.range.top - prDef.range.bottom + 1);
         var prTimeWidth = prDef.timeWidth || timeWidth;
         pianorollList.push(new PianoRoll(_({
             yInit: yInit,
@@ -853,7 +871,9 @@
             linesDown: linesDown,
             pixelsPerSecond: Math.floor(sceneWidth / prTimeWidth),
             noteHeight: prNoteHeight,
-            lineInterval: prDef.lineInterval
+            lineInterval: prDef.lineInterval,
+            range: prDef.range,
+            dynamicRange: prDef.dynamicRange,
         }).defaults(pianorollOptions).value()));
         yInit += prDef.height;
         linesDown = !linesDown;
@@ -1018,6 +1038,10 @@
     this.noteHeight = options.noteHeight;
     this.noteDict = {};
     this.startTs = options.startTs || Date.now();
+    this.dynamicRange = options.dynamicRange;
+    this.initRange = options.range;
+    this.range = options.range;
+    
 
     var started = false;
 
@@ -1042,8 +1066,9 @@
         return color;
     };
 
-    this.getNoteRect = function(x, y, color, alpha, width, height) {
+    this.getNoteRect = function(note, x, y, color, alpha, width, height) {
         var graphics = new PIXI.Graphics();
+        graphics.note = note;
         graphics.beginFill(color, alpha);
         graphics.drawRect(0, 0, width, height);
         graphics.endFill();
@@ -1104,11 +1129,18 @@
                     // not visible. do nothing
                     return;
                 }
-                var y = Math.floor((128-note+0.5) * this.height / 128 - (this.noteHeight/2));
+            	if (this.dynamicRange && (this.range.bottom > note || note > this.range.top)){
+            		var newScale = {};
+            		newScale['bottom'] = Math.min(note, this.range.bottom);
+            		newScale['top'] = Math.max(note, this.range.top);
+            		this.rescaleScene(newScale);
+            	}
+            	var y = Math.floor(((this.range.top-this.range.bottom)-(note-this.range.bottom)+0.5) * (this.noteHeight) - (this.noteHeight/2));
                 var color = this.getColor(channel);
+                
                 var alpha = (noteVelocity / 128);
 
-                graphics = this.getNoteRect(x, y, color, alpha, width, this.noteHeight);
+                graphics = this.getNoteRect(note, x, y, color, alpha, width, this.noteHeight);
                 this.container.addChild(graphics);
             }
             else {
@@ -1120,6 +1152,32 @@
             }
         }
     };
+    
+    //rescale scene in case a note out of range is added or a note out of the range is removed
+    this.rescaleScene = function(newScale){
+    	var _this = this;
+    	var childrenToUpdate = [];
+    	var top = this.initRange.top;
+    	var bottom = this.initRange.bottom;
+    	_(_this.container.children).forEach(function(child) {
+    		if (typeof(child) !== 'undefined' && child.note && !isHidden(child)){
+    			top = Math.max(child.note, top);
+    			bottom = Math.min(child.note, bottom);
+    			return childrenToUpdate.push(child);
+    		}
+        });
+    	if (newScale){
+    		this.range = newScale;
+    	}else{
+    		this.range.top = top; 
+    		this.range.bottom = bottom; 
+    	}
+    	this.noteHeight = this.height / (this.range.top - this.range.bottom + 1);
+    	childrenToUpdate.forEach(function(child) {
+			child.y = Math.floor(((_this.range.top-_this.range.bottom)-(child.note-_this.range.bottom)+0.5) * (_this.noteHeight) - (_this.noteHeight/2));
+			child.height = _this.noteHeight;
+        });
+    };
 
     this.addLine = function(ts){
 
@@ -1179,13 +1237,21 @@
 
     this.removePassedObjets = function(){
         var childrenToRemove = [];
+        var rescale = false;
         _(_this.container.children).forEach(function(child) {
             return typeof(child) === 'undefined' ||
                 (isHidden(child) && childrenToRemove.push(child));
         });
         childrenToRemove.forEach(function(child) {
+        	if (_this.dynamicRange && (_this.range.bottom === child.note || child.note === _this.range.top)){
+                rescale = true;
+            }
             _this.container.removeChild(child);
         });
+        //externalize this test to avoid repeated call to the function rescaleScene in the previous loop
+        if (rescale){
+            _this.rescaleScene();
+        }
     };
 
     this.start = function() {
@@ -1199,12 +1265,10 @@
     };
 
     this.stop = function() {
-        //window.clearInterval(this.moveInterval);
         clearInterval(this.verticalLinesInterval);
         clearInterval(this.cleanInterval);
     };
 
-
 }
 
 module.exports = PianoRoll;
@@ -1460,4 +1524,4 @@
 
 },{}]},{},[1])(1)
 });
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL2FwcC9qcy9tYWluLmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL2Fubm90c3JvbGwuanMiLCIvVXNlcnMvcm91Z2Vyb25qL3dvcmtzcGFjZS9tb25zL2NsaWVudC9hbm5vdHZpei9hcHAvanMvYW5ub3RzdGltZWxpbmUuanMiLCIvVXNlcnMvcm91Z2Vyb25qL3dvcmtzcGFjZS9tb25zL2NsaWVudC9hbm5vdHZpei9hcHAvanMvYW5ub3Rzdml6dmlldy5qcyIsIi9Vc2Vycy9yb3VnZXJvbmovd29ya3NwYWNlL21vbnMvY2xpZW50L2Fubm90dml6L2FwcC9qcy9kb3VibGVyb2xsLmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL2xvZ2dlci5qcyIsIi9Vc2Vycy9yb3VnZXJvbmovd29ya3NwYWNlL21vbnMvY2xpZW50L2Fubm90dml6L2FwcC9qcy9waWFub3JvbGwuanMiLCIvVXNlcnMvcm91Z2Vyb25qL3dvcmtzcGFjZS9tb25zL2NsaWVudC9hbm5vdHZpei9hcHAvanMvc3RhZ2V2aWV3LmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL3V0aWxzLmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL3dzd3JhcHBlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9RQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ROQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qKlxuICogc2NyaXB0cy9tYWluLmpzXG4gKlxuICogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgYXBwbGljYXRpb24uXG4gKiBUYWtlIGEgbG9vayBhdCBodHRwOi8vYnJvd3NlcmlmeS5vcmcvIGZvciBtb3JlIGluZm9cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBkb3VibGVyb2xsID0gcmVxdWlyZSgnLi9kb3VibGVyb2xsJyk7XG52YXIgYW5ub3Rzcm9sbCA9IHJlcXVpcmUoJy4vYW5ub3Rzcm9sbCcpO1xudmFyIGFubm90c3RpbWVsaW5lID0gcmVxdWlyZSgnLi9hbm5vdHN0aW1lbGluZScpO1xudmFyIGFubm90c3ZpenZpZXcgPSByZXF1aXJlKCcuL2Fubm90c3ZpenZpZXcnKTtcbnZhciBzdGFnZXZpZXcgPSByZXF1aXJlKCcuL3N0YWdldmlldycpO1xudmFyIHdzd3JhcHBlciA9IHJlcXVpcmUoJy4vd3N3cmFwcGVyJyk7XG52YXIgbG9nZ2VyID0gcmVxdWlyZSgnLi9sb2dnZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBfKHt9KVxuICAgIC5leHRlbmQoZG91Ymxlcm9sbClcbiAgICAuZXh0ZW5kKGFubm90c3JvbGwpXG4gICAgLmV4dGVuZChhbm5vdHN0aW1lbGluZSlcbiAgICAuZXh0ZW5kKGFubm90c3ZpenZpZXcpXG4gICAgLmV4dGVuZChzdGFnZXZpZXcpXG4gICAgLmV4dGVuZCh3c3dyYXBwZXIpXG4gICAgLmV4dGVuZChsb2dnZXIpXG4gICAgLmV4dGVuZCh1dGlscylcbiAgICAudmFsdWUoKTtcbiIsIi8qKlxuKiBqcy9hbm5vdHNSb2xsLmpzXG4qXG4qIGFubm90c1JvbGwgYmFzaWMgY29tcG9uZW50XG4qXG4qL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBQSVhJID0gcmVxdWlyZSgncGl4aScpO1xudmFyIF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcblxudmFyIERFRkFVTFRfQU5OT1RfQ09MT1IgPSAnI2JhYmFiYSc7XG5cbnZhciBkZWZhdWx0QW5ub3RTdHlsZXMgPSB7XG4gICAgJ2xhYmVsJzogeyBmb250OiAnMTZwdCBBcmlhbCBCb2xkJywgZmlsbDogJyM2NUE5NTQnLCB3b3JkV3JhcDogdHJ1ZX0sXG4gICAgJ3RleHQnIDogeyBmb250OiAnMTJwdCBBcmlhbCBSZWd1bGFyJywgZmlsbDogJyM0NDQ0NDQnLCB3b3JkV3JhcDogdHJ1ZX0sXG4gICAgJ3VzZXInIDogeyBmb250OiAnMTRwdCBBcmlhbCByZWd1bGFyJywgZmlsbDogJyM2NjY2NjYnIH0sXG59O1xuXG52YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgZXh0ZXJuYWxSZWZyZXNoOiBmYWxzZSxcbiAgICBkZWZhdWx0Q29sb3I6IERFRkFVTFRfQU5OT1RfQ09MT1IsXG4gICAgYW5ub3RTdHlsZXM6IGRlZmF1bHRBbm5vdFN0eWxlcyxcbiAgICBpZ25vcmVBbm5vdHM6ZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIEFubm90c1JvbGwob3B0aW9ucykge1xuXG4vL3BhcmVudENvbnRhaW5lciwgeEluaXQsIHlJbml0LCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFJvbGwsIHBpeGVsc1BlclNlY29uZCwgYW5ub3RDb2xvcnNcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBvcHRzID0gXyhvcHRpb25zKS5kZWZhdWx0cyhkZWZhdWx0T3B0aW9ucykudmFsdWUoKTtcblxuXG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgUElYSS5EaXNwbGF5T2JqZWN0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5jb250YWluZXIueCA9IG9wdHMueEluaXQ7XG4gICAgdGhpcy5jb250YWluZXIueSA9IG9wdHMueUluaXQ7XG4gICAgdGhpcy5jb250YWluZXIud2lkdGggPSBvcHRzLndpZHRoO1xuXG4gICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICB0aGlzLndpZHRoUm9sbCA9IG9wdHMud2lkdGhSb2xsO1xuICAgIHRoaXMucGl4ZWxzUGVyU2Vjb25kID0gb3B0cy5waXhlbHNQZXJTZWNvbmQ7XG4gICAgdGhpcy5hbm5vdENvbG9ycyA9IG9wdHMuYW5ub3RDb2xvcnM7XG4gICAgdGhpcy5zdGFydFRzID0gb3B0cy5zdGFydFRzIHx8IERhdGUubm93KCk7XG4gICAgdGhpcy5pZ25vcmVBbm5vdHMgPSBvcHRzLmlnbm9yZUFubm90cztcblxuICAgIHZhciB5SW5pdCA9IG9wdHMueUluaXQ7XG4gICAgdmFyIGFubm90U3R5bGVzID0gXyhvcHRzLmFubm90U3R5bGVzKS5kZWZhdWx0cyhkZWZhdWx0QW5ub3RTdHlsZXMpLnZhbHVlKCk7XG4gICAgdmFyIG1hcmdpblggPSAxNTtcbiAgICBmb3IodmFyIHN0eWxlIGluIGFubm90U3R5bGVzKSB7XG4gICAgXHRpZiAoYW5ub3RTdHlsZXNbc3R5bGVdLndvcmRXcmFwID09PSB0cnVlKXtcbiAgICBcdFx0YW5ub3RTdHlsZXNbc3R5bGVdLndvcmRXcmFwV2lkdGggPSB0aGlzLndpZHRoUm9sbCAtIG1hcmdpblg7XG4gICAgXHR9XG4gICAgfVxuICAgIHZhciBzdGFydGVkID0gZmFsc2U7XG4gICAgdmFyIHdzID0gb3B0cy53cztcbiAgICB2YXIgZXh0ZXJuYWxSZWZyZXNoID0gb3B0cy5leHRlcm5hbFJlZnJlc2g7XG4gICAgdmFyIHN0YWdlVmlldyA9IG9wdHMuc3RhZ2VWaWV3O1xuICAgIHZhciB3YWl0SW50ZXJ2YWw7XG4gICAgdmFyIHdhaXQgPSAwO1xuXG4gICAgc3RhZ2VWaWV3LnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xuXG4gICAgdmFyIGlzSGlkZGVuID0gZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgLy8gVE9ETzogdGhlIG9yaWdpbiBwb2ludCBpcyBhbiBhcHByb3hpbWF0aW9uLiBTaG91bGQgcmVmaW5lIHRoaXNcbiAgICAgICAgdmFyIGdsb2JhbFBvcyA9IGNoaWxkLnRvR2xvYmFsKG5ldyBQSVhJLlBvaW50KDAsMCkpO1xuICAgICAgICByZXR1cm4gKChnbG9iYWxQb3MueCArIGNoaWxkLndpZHRoKSA8IDApIHx8ICgoZ2xvYmFsUG9zLnkgKyBjaGlsZC5oZWlnaHQpIDwgMCkgO1xuICAgIH07XG5cbiAgICB0aGlzLmFkZEFubm90cyA9IGZ1bmN0aW9uKGRhdGEpIHtcblxuICAgICAgICAvL3ZhciB0aXRsZSA9IGRhdGEuY29udGVudC5jYXRlZ29yeS5sYWJlbDtcbiAgICAgICAgLy92YXIgdXNlciA9IGRhdGEuY29udGVudC51c2VyO1xuICAgICAgICAvL1Rlc3QgY2F0IGFuZCBjb2xvclxuICAgICAgICAvL3ZhciBjb2xvckFubm90ID0gMHg2NUE5NTQ7XG4gICAgICAgIHZhciBjYXRlZ29yeSA9IGRhdGEuY29udGVudC5jYXRlZ29yeS5sYWJlbCxcbiAgICAgICAgICAgIHRleHQgICAgID0gZGF0YS5jb250ZW50LnRleHQsXG4gICAgICAgICAgICB1c2VyICAgICA9IGRhdGEuY29udGVudC51c2VyLFxuICAgICAgICAgICAgdHMgICAgICAgPSBEYXRlLnBhcnNlKGRhdGEudHMpLFxuICAgICAgICAgICAgY29sb3IgICAgPSBkYXRhLmNvbnRlbnQuY29sb3IgfHwgdGhpcy5nZXRDb2xvcih0cywgZGF0YS5jb250ZW50LmNhdGVnb3J5LmNvZGUpO1xuXG4gICAgICAgIHRoaXMuYWRkQW5ub3QoY2F0ZWdvcnksIHRleHQsIHVzZXIsIGNvbG9yLCB0cyk7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0Q29sb3IgPSBmdW5jdGlvbih0cywgY29kZSkge1xuICAgICAgICB2YXIgY29sb3JzRGVmO1xuICAgICAgICBfKHRoaXMuYW5ub3RDb2xvcnMpLmVhY2hSaWdodChmdW5jdGlvbihjZGVmKSB7XG4gICAgICAgICAgICBpZihjZGVmLnRzIDwgdHMpIHtcbiAgICAgICAgICAgICAgICBjb2xvcnNEZWYgPSBjZGVmLmNvbG9ycztcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVzQ29sb3I7XG4gICAgICAgIGlmKGNvbG9yc0RlZikge1xuICAgICAgICAgICAgcmVzQ29sb3IgPSBjb2xvcnNEZWZbY29kZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYoIXJlc0NvbG9yKSB7XG4gICAgICAgICAgICByZXNDb2xvciA9IGNvbG9yc0RlZi5kZWZhdWx0Q29sb3IgfHwgREVGQVVMVF9BTk5PVF9DT0xPUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzQ29sb3I7XG4gICAgfTtcblxuICAgIHRoaXMuYWRkQW5ub3QgPSBmdW5jdGlvbihjYXRlZ29yeSwgdGV4dCwgdXNlciwgY29sb3IsIHRzKXtcblxuICAgICAgICB2YXIgeCA9IDA7XG4gICAgICAgIHZhciB5ID0gKHRzLXRoaXMuc3RhcnRUcykgKiB0aGlzLnBpeGVsc1BlclNlY29uZCAvIDEwMDAgKyB5SW5pdDtcblxuICAgICAgICB2YXIgY29sb3JIZXggPSBwYXJzZUludChjb2xvci5yZXBsYWNlKC9eIy8sICcnKSwgMTYpO1xuXG4gICAgICAgIGlmICh3YWl0ID09PSAwKXtcblx0ICAgICAgICB2YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpXG5cdCAgICAgICAgICAgIC5iZWdpbkZpbGwoY29sb3JIZXgpXG5cdCAgICAgICAgICAgIC5kcmF3UmVjdCh4LCB5LCAxMCwgMylcblx0ICAgICAgICAgICAgLmVuZEZpbGwoKTtcblxuXHQgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGdyYXBoaWNzKTtcblxuXHQgICAgICAgIHZhciB0ZXh0SGVpZ2h0ID0gMDtcblx0ICAgICAgICB2YXIgY2F0TGFiZWwgPSBuZXcgUElYSS5UZXh0KFxuXHQgICAgICAgICAgICBjYXRlZ29yeSxcblx0ICAgICAgICAgICAgXyhhbm5vdFN0eWxlcy5sYWJlbCkuZXh0ZW5kKHtmaWxsOiBjb2xvcn0pLnZhbHVlKClcblx0ICAgICAgICApO1xuXHQgICAgICAgIGNhdExhYmVsLnggPSB4ICsgbWFyZ2luWDtcblx0ICAgICAgICBjYXRMYWJlbC55ID0geSAtIDIzO1xuXHQgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNhdExhYmVsKTtcblx0ICAgICAgICB0ZXh0SGVpZ2h0ICs9IChjYXRMYWJlbC5oZWlnaHQgLSAyMyArIDIpO1xuXG5cdCAgICAgICAgaWYodGV4dCkge1xuXHQgICAgICAgICAgICB2YXIgY2F0VGV4dCA9IG5ldyBQSVhJLlRleHQodGV4dCwgYW5ub3RTdHlsZXMudGV4dCk7XG5cdCAgICAgICAgICAgIGNhdFRleHQueCA9IHggKyBtYXJnaW5YO1xuXHQgICAgICAgICAgICBjYXRUZXh0LnkgPSB5ICsgdGV4dEhlaWdodDtcblx0ICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoY2F0VGV4dCk7XG5cdCAgICAgICAgICAgIHRleHRIZWlnaHQgKz0gKGNhdFRleHQuaGVpZ2h0ICsgMik7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdmFyIGNhdFVzZXIgPSBuZXcgUElYSS5UZXh0KHVzZXIsIGFubm90U3R5bGVzLnVzZXIpO1xuXHQgICAgICAgIGNhdFVzZXIueCA9IHggKyBtYXJnaW5YO1xuXHQgICAgICAgIGNhdFVzZXIueSA9IHkgKyB0ZXh0SGVpZ2h0O1xuXHQgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNhdFVzZXIpO1xuXHQgICAgICAgIHRleHRIZWlnaHQgKz0gKGNhdFVzZXIuaGVpZ2h0ICsgOCk7XG5cblx0ICAgICAgICBpZiAodGhpcy5pZ25vcmVBbm5vdHMgPT09IHRydWUpe1xuXHRcdCAgICAgICAgd2FpdCA9IHRleHRIZWlnaHQgLyB0aGlzLnBpeGVsc1BlclNlY29uZDtcblx0XHQgICAgICAgIHdhaXRJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge190aGlzLnJlZnJlc2hXYWl0KCk7fSwgMTAwMCk7XG5cdCAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRBbm5vdExpbmUoY29sb3JIZXgsIHkpO1xuICAgIH07XG5cbiAgICB0aGlzLmFkZEFubm90TGluZSA9IGZ1bmN0aW9uKGNvbG9yLCB5KSB7XG4gICAgICAgIHZhciB4ID0gdGhpcy53aWR0aFJvbGw7XG5cblxuICAgICAgICB2YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpXG4gICAgICAgICAgICAuYmVnaW5GaWxsKGNvbG9yKVxuICAgICAgICAgICAgLmRyYXdSZWN0KHgsIHksIHRoaXMud2lkdGggLSB4LCAzKVxuICAgICAgICAgICAgLmVuZEZpbGwoKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChncmFwaGljcyk7XG4gICAgfTtcblxuICAgIHRoaXMubW92ZVRvID0gZnVuY3Rpb24oZGlmZlRpbWUpe1xuICAgIFx0dGhpcy5jb250YWluZXIueSA9IE1hdGguZmxvb3IoZGlmZlRpbWUqdGhpcy5waXhlbHNQZXJTZWNvbmQpO1xuICAgIH07XG5cbiAgICB0aGlzLm1vdmUgPSB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRpZmYgPSAodGhpcy5zdGFydFRzIC0gRGF0ZS5ub3coKSkvMTAwMDtcbiAgICAgICAgdGhpcy5tb3ZlVG8oZGlmZik7XG4gICAgfTtcblxuICAgIHRoaXMucmVmcmVzaFdhaXQgPSBmdW5jdGlvbigpe1xuICAgIFx0d2FpdCAtPSAxO1xuICAgIFx0aWYgKHdhaXQgPCAwKXtcbiAgICBcdFx0d2FpdCA9IDA7XG4gICAgXHRcdGNsZWFySW50ZXJ2YWwod2FpdEludGVydmFsKTtcbiAgICBcdH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZW1vdmVQYXNzZWRPYmpldHMgPSBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgY2hpbGRyZW5Ub1JlbW92ZSA9IFtdO1xuICAgICAgICBfKF90aGlzLmNvbnRhaW5lci5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihjaGlsZCkgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgKGlzSGlkZGVuKGNoaWxkKSAmJiBjaGlsZHJlblRvUmVtb3ZlLnB1c2goY2hpbGQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNoaWxkcmVuVG9SZW1vdmUuZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICAgICAgX3RoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHdzLm1lc3NhZ2UoZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgX3RoaXMuYWRkQW5ub3RzKGRhdGEpO1xuICAgICAgICB9KTtcblxuICAgIH07XG5cblxuICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYoIXN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFuSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IF90aGlzLnJlbW92ZVBhc3NlZE9iamV0cygpOyB9LCAxMDAwICogdGhpcy5oZWlnaHQgLyB0aGlzLnBpeGVsc1BlclNlY29uZCApO1xuICAgICAgICBpZighZXh0ZXJuYWxSZWZyZXNoKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge190aGlzLm1vdmUoKTt9LCAxMDAwL3RoaXMuZnJhbWVyYXRlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNsZWFuSW50ZXJ2YWwpO1xuICAgICAgICBpZighZXh0ZXJuYWxSZWZyZXNoKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucmVmcmVzaEludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQW5ub3RzUm9sbDogQW5ub3RzUm9sbCxcbn07XG4iLCIvKipcbioganMvYW5ub3RzdGltZWxpbmVcbipcbiogYW5ub3RzdGltZWxpbmUgYmFzaWMgY29tcG9uZW50XG4qXG4qL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBQSVhJID0gcmVxdWlyZSgncGl4aScpO1xudmFyIFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy5qcycpO1xudmFyIF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcblxudmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGxvZ2dlcjogdW5kZWZpbmVkLFxuICAgIGludGVydmFsV2lkdGg6IDEwLFxuICAgIGludGVydmFsSGVpZ2h0OiA1LFxuICAgIG1heENlbGxIZWlnaHQ6IDIwMCxcbiAgICByYWRpdXM6IDMwMCxcbiAgICBzZXJ2ZXJVcmw6ICdodHRwOi8vMTI3LjAuMC4xOjgwODAnLFxuICAgIGNoYW5uZWw6ICdBTk5PVCcsXG4gICAgbWF4UGFnZXM6IDEwMDAsXG4gICAgc2hvd0Nsb2NrR3JhcGhpY3M6IHRydWUsXG4gICAgYXJjaGl2ZTogZmFsc2Vcbn07XG5cblxuZnVuY3Rpb24gQW5ub3RzVGltZUxpbmUob3B0aW9ucyl7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgb3B0cyA9IF8ob3B0aW9ucykuZGVmYXVsdHMoZGVmYXVsdE9wdGlvbnMpLnZhbHVlKCk7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBQSVhJLkRpc3BsYXlPYmplY3RDb250YWluZXIoKTtcbiAgICB0aGlzLmNvbnRhaW5lci54ID0gb3B0cy54SW5pdDtcbiAgICB0aGlzLmNvbnRhaW5lci55ID0gb3B0cy55SW5pdDtcbiAgICB0aGlzLmNvbnRhaW5lci53aWR0aCA9IG9wdHMud2lkdGg7XG4gICAgdGhpcy5jb250YWluZXIuaGVpZ2h0ID0gb3B0cy5oZWlnaHQ7XG5cbiAgICB0aGlzLnRpbWVCZWdpbiA9IG9wdHMudGltZUJlZ2luO1xuICAgIHRoaXMudGltZUVuZCA9IG9wdHMudGltZUVuZDtcbiAgICB0aGlzLmR1cmF0aW9uID0gKHRoaXMudGltZUVuZCAtIHRoaXMudGltZUJlZ2luKS8xMDAwO1xuICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gb3B0cy5oZWlnaHQ7XG4gICAgdGhpcy5pbnRlcnZhbEhlaWdodCA9IG9wdHMuaW50ZXJ2YWxIZWlnaHQ7XG4gICAgdGhpcy5pbnRlcnZhbFdpZHRoID0gb3B0cy5pbnRlcnZhbFdpZHRoO1xuICAgIHRoaXMubWF4Q2VsbEhlaWdodCA9IG9wdHMubWF4Q2VsbEhlaWdodDtcbiAgICB0aGlzLmFubm90Q2F0ZWdvcmllcyA9IG9wdHMuYW5ub3RDYXRlZ29yaWVzO1xuICAgIHRoaXMuc3RhcnRUcyA9IG9wdGlvbnMuc3RhcnRUcyB8fCBEYXRlLm5vdygpO1xuICAgIHRoaXMuc2hvd0Nsb2NrR3JhcGhpY3MgPSBvcHRzLnNob3dDbG9ja0dyYXBoaWNzO1xuICAgIHRoaXMuYXJjaGl2ZSA9IG9wdHMuYXJjaGl2ZTtcblxuICAgIHRoaXMuY2lyY2xlWCA9IG9wdHMuY2lyY2xlWCB8fCAodGhpcy53aWR0aC8yKTtcbiAgICB0aGlzLmNpcmNsZVkgPSBvcHRzLmNpcmNsZVkgfHwgKHRoaXMuaGVpZ2h0LzIpO1xuICAgIHRoaXMucmFkaXVzID0gb3B0cy5yYWRpdXM7XG4gICAgdmFyIHBlcmltZXRlciA9IDIqTWF0aC5QSSogdGhpcy5yYWRpdXM7XG4gICAgdGhpcy5pbnRlcnZhbER1cmF0aW9uID0gKHRoaXMuaW50ZXJ2YWxXaWR0aCAqIHRoaXMuZHVyYXRpb24gLyBwZXJpbWV0ZXIpO1xuXG4gICAgdmFyIGNoYW5uZWwgPSBvcHRzLmNoYW5uZWw7XG4gICAgdmFyIGV2ZW50Q29kZSA9IG9wdHMuZXZlbnRDb2RlO1xuICAgIHZhciBzZXJ2ZXJVcmwgPSBvcHRzLnNlcnZlclVybDtcbiAgICB2YXIgbWF4UGFnZXMgPSBvcHRzLm1heFBhZ2VzO1xuXG4gICAgdmFyIHRvdGFsSW5kZXggPSBNYXRoLmZsb29yKCBwZXJpbWV0ZXIvdGhpcy5pbnRlcnZhbFdpZHRoKTtcblxuICAgIHRoaXMuY2VsbHMgPSBbXTtcbiAgICBmb3IgKHZhciBpPTA7IGk8KHBlcmltZXRlci90aGlzLmludGVydmFsV2lkdGgpIDsgaSsrKXtcbiAgICAgICAgdGhpcy5jZWxsc1tpXSA9IFtdO1xuICAgICAgICB0aGlzLmNlbGxzW2ldLmkgPSBpO1xuICAgICAgICB0aGlzLmNlbGxzW2ldLnRvdGFsQW5ub3RzID0gMDtcbiAgICAgICAgdGhpcy5jZWxsc1tpXS5jYXRlZ29yaWVzID0ge307XG4gICAgfVxuXG4gICAgdmFyIHdzID0gb3B0cy53cztcbiAgICB2YXIgc3RhZ2VWaWV3ID0gb3B0cy5zdGFnZVZpZXc7XG5cbiAgICAvL2RyYXcgdGhlIGJhc2UgLSBjaXJjbGUgYW5kIGxpbmUgdG8gbG9jYXRlIHRoZSBzY2VuZVxuICAgIHZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XG4gICAgZ3JhcGhpY3MubGluZVN0eWxlKDIsIDB4NjQ2NDY0KVxuICAgICAgICAuZHJhd0NpcmNsZSh0aGlzLmNpcmNsZVgsIHRoaXMuY2lyY2xlWSwgdGhpcy5yYWRpdXMgLSAzKVxuICAgICAgICAuZW5kRmlsbCgpO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGdyYXBoaWNzKTtcblxuICAgIHN0YWdlVmlldy5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcblxuICAgIHZhciBsb2FkQXJjaGl2ZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy9zdGFydCB0aW1lQmVnaW4gZW5kIHN0YXJ0VGltZVxuICAgICAgICAvL3F1ZXJ5IC0+IG5lZWQgY2hhbm5lbCArIGV2ZW50Q29kZVxuICAgICAgICAvL2l0ZXJhdGUgb3ZlciBkYXRhIGZpbGwgY2VsbHNcbiAgICAgICAgdmFyIHN0YXJ0VHMgPSBfdGhpcy50aW1lQmVnaW47XG4gICAgICAgIHZhciBlbmRUcyA9IE1hdGgubWluKF90aGlzLnRpbWVFbmQsX3RoaXMuc3RhcnRUcyk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTVEFSVCBUU1wiLG5ldyBEYXRlKHN0YXJ0VHMpLnRvSVNPU3RyaW5nKCkpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVORCBUU1wiLG5ldyBEYXRlKGVuZFRzKS50b0lTT1N0cmluZygpKTtcblxuICAgICAgICB2YXIgdXJsID0gc2VydmVyVXJsICsgJy9wL2FwaS92MS9hbm5vdGF0aW9uJztcbiAgICAgICAgdmFyIGZpbHRlcnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICd0cycsIG9wOiAnPicsIHZhbDogbmV3IERhdGUoc3RhcnRUcykudG9JU09TdHJpbmcoKX0sIC8vc3RhcnRcbiAgICAgICAgICAgIHsgbmFtZTogJ3RzJywgb3A6ICc8PScsIHZhbDogbmV3IERhdGUoZW5kVHMpLnRvSVNPU3RyaW5nKCl9LCAvL2VuZFxuICAgICAgICAgICAgeyBuYW1lOiAnY2hhbm5lbCcsIG9wOiAnPT0nLCB2YWw6IGNoYW5uZWx9LCAvL2NoYW5uZWxcbiAgICAgICAgICAgIHsgbmFtZTogJ2V2ZW50X2NvZGUnLCBvcDogJz09JywgdmFsOiBldmVudENvZGV9IC8vZXZlbnRjb2RlXG4gICAgICAgIF07XG5cbiAgICAgICAgdXJsID0gdXJsICsgJz9xPScgKyBKU09OLnN0cmluZ2lmeSh7ZmlsdGVyczpmaWx0ZXJzfSk7XG5cbiAgICAgICAgdmFyIHRvdGFsUGFnZSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50UGFnZSA9IDE7XG5cbiAgICAgICAgdmFyIHByb2Nlc3NSZXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlJFUyBhcmNoaXZlXCIsIHJlcyk7XG4gICAgICAgICAgICBpZihyZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcy50YXJnZXQuanNvbjtcbiAgICAgICAgICAgICAgICAvKmpzaGludCAtVzA2OSAqL1xuICAgICAgICAgICAgICAgIHRvdGFsUGFnZSA9IE1hdGgubWluKG1heFBhZ2VzLHBhcnNlSW50KGRhdGFbJ3RvdGFsX3BhZ2VzJ10pKTtcbiAgICAgICAgICAgICAgICBkYXRhLm9iamVjdHMuZm9yRWFjaChmdW5jdGlvbihhbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFubm90KGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoY3VycmVudFBhZ2UgPD0gdG90YWxQYWdlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGpzb25Mb2FkZXIgPSBuZXcgUElYSS5Kc29uTG9hZGVyKHVybCsnJnBhZ2U9JytjdXJyZW50UGFnZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAganNvbkxvYWRlci5vbignbG9hZGVkJywgcHJvY2Vzc1Jlc0Z1bmN0aW9uKTtcbiAgICAgICAgICAgICAgICBqc29uTG9hZGVyLmxvYWQoKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGFnZSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzUmVzRnVuY3Rpb24oKTtcblxuICAgIH07XG5cbiAgICAvL0FkZCBBbm5vdGF0aW9uIHRvIHRoZSBUaW1lTGluZVxuICAgIHRoaXMuYWRkQW5ub3QgPSBmdW5jdGlvbihkYXRhKXtcblxuICAgICAgICB2YXIgdHMgPSBEYXRlLnBhcnNlKGRhdGEudHMpO1xuICAgICAgICB2YXIgY29sb3JzRGVmO1xuICAgICAgICBfKHRoaXMuYW5ub3RDYXRlZ29yaWVzKS5lYWNoUmlnaHQoZnVuY3Rpb24oY2RlZikge1xuICAgICAgICAgICAgaWYoY2RlZi50cyA8IHRzKSB7XG4gICAgICAgICAgICAgICAgY29sb3JzRGVmID0gY2RlZjtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmKCFjb2xvcnNEZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRpbWVFbmQgPiB0cyl7XG4gICAgICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IoKHRzIC0gdGhpcy50aW1lQmVnaW4pLygxMDAwKnRoaXMuaW50ZXJ2YWxEdXJhdGlvbikpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuY2VsbHNbaV0uZ3JhcGhpY3MpID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q2VsbCh0aGlzLmNlbGxzW2ldLCBjb2xvcnNEZWYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYW5ub3RDb2RlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihjb2xvcnNEZWYuY29sb3JzW2RhdGEuY29udGVudC5jYXRlZ29yeS5jb2RlXSkgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICBhbm5vdENvZGUgPSBkYXRhLmNvbnRlbnQuY2F0ZWdvcnkuY29kZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5ub3RDb2RlID0gJ2RlZmF1bHQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNlbGxzW2ldLmNhdGVnb3JpZXNbYW5ub3RDb2RlXS5jb3VudCArPSAxO1xuICAgICAgICAgICAgdGhpcy5jZWxsc1tpXS50b3RhbEFubm90cyArPTE7XG4gICAgICAgICAgICB0aGlzLnJlZHJhd0NlbGwodGhpcy5jZWxsc1tpXSwgY29sb3JzRGVmKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXRDbG9ja0dyYXBoaWNzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB0QmVnID0gbmV3IFBJWEkuVGV4dChVdGlscy5mb3JtYXRUaW1lKHRoaXMudGltZUJlZ2luKSwgeyBmb250OiAnMTJwdCBHb3RoaWMgU3RhbmRhcmQnLCBmaWxsOiAnIzY0NjQ2NCcgfSk7XG4gICAgICAgIHRCZWcueCA9IHRoaXMuY2lyY2xlWCArIDE1O1xuICAgICAgICB0QmVnLnkgPSB0aGlzLmNpcmNsZVkgLSB0aGlzLnJhZGl1cyAtIHRoaXMubWF4Q2VsbEhlaWdodCAtIDEwO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0QmVnKTtcblxuICAgICAgICB2YXIgdEVuZCA9IG5ldyBQSVhJLlRleHQoVXRpbHMuZm9ybWF0VGltZSh0aGlzLnRpbWVFbmQpLCB7IGZvbnQ6ICcxMnB0IEdvdGhpYyBTdGFuZGFyZCcsIGZpbGw6ICcjNjQ2NDY0JyB9KTtcbiAgICAgICAgdEVuZC54ID0gdGhpcy5jaXJjbGVYIC0gMTUgLSB0RW5kLndpZHRoO1xuICAgICAgICB0RW5kLnkgPSB0aGlzLmNpcmNsZVkgLSB0aGlzLnJhZGl1cyAtIHRoaXMubWF4Q2VsbEhlaWdodCAtIDEwO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0RW5kKTtcblxuICAgICAgICB2YXIgdDE1ID0gbmV3IFBJWEkuVGV4dChVdGlscy5mb3JtYXRUaW1lKCgodGhpcy50aW1lRW5kIC0gdGhpcy50aW1lQmVnaW4pLzQpICsgdGhpcy50aW1lQmVnaW4pLCB7IGZvbnQ6ICcxMnB0IEdvdGhpYyBTdGFuZGFyZCcsIGZpbGw6ICcjNjQ2NDY0JyB9KTtcbiAgICAgICAgdDE1LnggPSB0aGlzLmNpcmNsZVggKyB0aGlzLnJhZGl1cyArIHRoaXMubWF4Q2VsbEhlaWdodCArIDEwIDtcbiAgICAgICAgdDE1LnkgPSB0aGlzLmNpcmNsZVkgLSB0MTUuaGVpZ2h0O1xuICAgICAgICB0MTUucm90YXRpb24gPSBNYXRoLlBJIC8yO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0MTUpO1xuXG4gICAgICAgIHZhciB0MzAgPSBuZXcgUElYSS5UZXh0KFV0aWxzLmZvcm1hdFRpbWUoKCh0aGlzLnRpbWVFbmQgLSB0aGlzLnRpbWVCZWdpbikvMikgKyB0aGlzLnRpbWVCZWdpbiksIHsgZm9udDogJzEycHQgR290aGljIFN0YW5kYXJkJywgZmlsbDogJyM2NDY0NjQnIH0pO1xuICAgICAgICB0MzAueCA9IHRoaXMuY2lyY2xlWCAtIHQzMC53aWR0aC8yO1xuICAgICAgICB0MzAueSA9IHRoaXMuY2lyY2xlWSArIHRoaXMucmFkaXVzICsgdGhpcy5tYXhDZWxsSGVpZ2h0IC0gMjtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQodDMwKTtcblxuICAgICAgICB2YXIgdDQ1ID0gbmV3IFBJWEkuVGV4dChVdGlscy5mb3JtYXRUaW1lKCgodGhpcy50aW1lRW5kIC0gdGhpcy50aW1lQmVnaW4pKjMvNCkgKyB0aGlzLnRpbWVCZWdpbiksIHsgZm9udDogJzEycHQgR290aGljIFN0YW5kYXJkJywgZmlsbDogJyM2NDY0NjQnIH0pO1xuICAgICAgICB0NDUueCA9IHRoaXMuY2lyY2xlWCAtIHRoaXMucmFkaXVzIC0gdGhpcy5tYXhDZWxsSGVpZ2h0IC0gMTAgO1xuICAgICAgICB0NDUueSA9IHRoaXMuY2lyY2xlWSArIHQxNS5oZWlnaHQ7XG4gICAgICAgIHQ0NS5yb3RhdGlvbiA9IC1NYXRoLlBJLzI7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKHQ0NSk7XG5cbiAgICAgICAgdmFyIGxpbmVWID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICAgICAgbGluZVYubGluZVN0eWxlKDEsIDB4NjQ2NDY0KVxuICAgICAgICAgICAgLm1vdmVUbyh0aGlzLmNpcmNsZVgsIHRoaXMuY2lyY2xlWSAtICh0aGlzLnJhZGl1cy8zKS8yKVxuICAgICAgICAgICAgLmxpbmVUbyh0aGlzLmNpcmNsZVgsIHRoaXMuY2lyY2xlWSAtIHRoaXMucmFkaXVzIC0gdGhpcy5tYXhDZWxsSGVpZ2h0IC0gMTApXG4gICAgICAgICAgICAuZW5kRmlsbCgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChsaW5lVik7XG4gICAgfTtcblxuICAgIC8vRHJhdyB0aGUgY2VsbHVsZVxuICAgIHRoaXMucmVkcmF3Q2VsbCA9IGZ1bmN0aW9uKGNlbGwsIGNvbG9yc0RlZil7XG4gICAgICAgIHZhciB5ID0gMDtcblxuICAgICAgICAvL0NoZWNrIGlmIHRvdGFsIGhlaWdodCBpcyBoaWdoZXIgdGhhbiBNYXggQ2VsbCBIZWlnaHRcbiAgICAgICAgdmFyIGhlaWdodFN0ZXA7XG4gICAgICAgIGlmICgoY2VsbC50b3RhbEFubm90cyp0aGlzLmludGVydmFsSGVpZ2h0KSA+IHRoaXMubWF4Q2VsbEhlaWdodCl7XG4gICAgICAgICAgICBoZWlnaHRTdGVwID0gdGhpcy5tYXhDZWxsSGVpZ2h0L2NlbGwudG90YWxBbm5vdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWlnaHRTdGVwID0gdGhpcy5pbnRlcnZhbEhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vRHJhdyB0aGUgcmVjdCBkZXBlbmRpbmcgb24gdGhlIGhlaWdodCBzdGVwIGNhbGN1bGF0ZWRcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPCBjb2xvcnNEZWYub3JkZXIubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRDb2RlID0gY29sb3JzRGVmLm9yZGVyW2ldO1xuICAgICAgICAgICAgY2VsbC5ncmFwaGljcy5iZWdpbkZpbGwoY2VsbC5jYXRlZ29yaWVzW2N1cnJlbnRDb2RlXS5jb2xvci5yZXBsYWNlKCcjJywgJzB4JykpXG4gICAgICAgICAgICAgICAgLmRyYXdSZWN0KDAsIHksIHRoaXMuaW50ZXJ2YWxXaWR0aC0xLCAtY2VsbC5jYXRlZ29yaWVzW2N1cnJlbnRDb2RlXS5jb3VudCAqIGhlaWdodFN0ZXApXG4gICAgICAgICAgICAgICAgLmVuZEZpbGwoKTtcbiAgICAgICAgICAgIHkgLT0gY2VsbC5jYXRlZ29yaWVzW2N1cnJlbnRDb2RlXS5jb3VudCpoZWlnaHRTdGVwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaW5pdENlbGwgPSBmdW5jdGlvbihjZWxsLCBjb2xvcnNEZWYpe1xuICAgICAgICBjZWxsLmdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICAgICAgY2VsbC5ncmFwaGljcy5wb3NpdGlvbi54ID0gdGhpcy5jaXJjbGVYICsgdGhpcy5yYWRpdXMgKiBNYXRoLnNpbihjZWxsLmkqKDM2MC90b3RhbEluZGV4KSooTWF0aC5QSS8xODApKTtcbiAgICAgICAgY2VsbC5ncmFwaGljcy5wb3NpdGlvbi55ID0gdGhpcy5jaXJjbGVZIC0gdGhpcy5yYWRpdXMgKiBNYXRoLmNvcyhjZWxsLmkqKDM2MC90b3RhbEluZGV4KSooTWF0aC5QSS8xODApKTtcbiAgICAgICAgY2VsbC5ncmFwaGljcy5yb3RhdGlvbiA9IChjZWxsLmkpKigzNjAvdG90YWxJbmRleCkqKE1hdGguUEkvMTgwKSArICgzNjAvKHRvdGFsSW5kZXgqMikpKihNYXRoLlBJLzE4MCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNlbGwuZ3JhcGhpY3MpO1xuXG4gICAgICAgIGZvciAodmFyIGNhdGVnb3J5IGluIGNvbG9yc0RlZi5jb2xvcnMpe1xuICAgICAgICAgICAgY2VsbC5jYXRlZ29yaWVzW2NhdGVnb3J5XSA9IHtcbiAgICAgICAgICAgICAgICAnY291bnQnOiAwLFxuICAgICAgICAgICAgICAgICdjb2xvcic6IGNvbG9yc0RlZi5jb2xvcnNbY2F0ZWdvcnldXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YoY2VsbC5jYXRlZ29yaWVzWydkZWZhdWx0J10pID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICBjZWxsLmNhdGVnb3JpZXNbJ2RlZmF1bHQnXSA9IHtcbiAgICAgICAgICAgICAgICAnY291bnQnOiAwLFxuICAgICAgICAgICAgICAgICdjb2xvcic6IGNvbG9yc0RlZi5kZWZhdWx0Q29sb3JcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5hcmNoaXZlKXtcbiAgICAgICAgICAgIHdzLm1lc3NhZ2UoZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgIF90aGlzLmFkZEFubm90KGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zaG93Q2xvY2tHcmFwaGljcyl7dGhpcy5pbml0Q2xvY2tHcmFwaGljcygpO31cbiAgICB9O1xuXG5cbiAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc3RhcnRUcyA9IERhdGUubm93KCk7XG4gICAgICAgIGxvYWRBcmNoaXZlcygpO1xuICAgIH07XG5cbiAgICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblxuICAgIH07XG5cbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpe1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQW5ub3RzVGltZUxpbmU6IEFubm90c1RpbWVMaW5lXG59O1xuIiwiLyoqXG4qIGpzL2Fubm90c3ZpenZpZXcuanNcbipcbiogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgYXBwbGljYXRpb24uXG4qIFRha2UgYSBsb29rIGF0IGh0dHA6Ly9icm93c2VyaWZ5Lm9yZy8gZm9yIG1vcmUgaW5mb1xuKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG52YXIgRG91YmxlUm9sbCA9IHJlcXVpcmUoJy4vZG91Ymxlcm9sbC5qcycpO1xudmFyIEFubm90c1RpbWVMaW5lID0gcmVxdWlyZSgnLi9hbm5vdHN0aW1lbGluZS5qcycpO1xudmFyIEFubm90c1JvbGwgPSByZXF1aXJlKCcuL2Fubm90c3JvbGwuanMnKTtcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMuanMnKTtcblxudmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHhJbml0OiAwLFxuICAgIHlJbml0OiAwLFxuICAgIHdpZHRoOiAxMDI0LFxuICAgIGhlaWdodDogNzY4XG59O1xuXG5mdW5jdGlvbiBBbm5vdHNWaXpWaWV3KG9wdGlvbnMpe1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIG9wdHMgPSBfKG9wdGlvbnMpLmRlZmF1bHRzKGRlZmF1bHRPcHRpb25zKS52YWx1ZSgpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgUElYSS5EaXNwbGF5T2JqZWN0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5jb250YWluZXIueCA9IG9wdHMueEluaXQ7XG4gICAgdGhpcy5jb250YWluZXIueSA9IG9wdHMueUluaXQ7XG4gICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQ9IG9wdHMuaGVpZ2h0O1xuICAgIHRoaXMudGltZUJlZ2luID0gb3B0cy50aW1lQmVnaW47XG4gICAgdGhpcy50aW1lRW5kID0gb3B0cy50aW1lRW5kO1xuXG4gICAgdGhpcy5hbm5vdENhdGVnb3JpZXMgPSBbXTtcbiAgICB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTIgPSBbXTtcbiAgICB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTEgPSBbXTtcblxuICAgIHZhciB3c1BpYW5vcm9sbCA9IG9wdHMud3NQaWFub3JvbGw7XG4gICAgdmFyIHdzQW5ub3QgPSBvcHRzLndzQW5ub3Q7XG4gICAgdmFyIHN0YWdlVmlldyA9IG9wdHMuc3RhZ2VWaWV3O1xuICAgIHZhciBjdXJyZW50VGltZSA9IERhdGUubm93KCkgKyAzNjAwKjEwMDA7XG4gICAgdmFyIGNoYW5uZWwgPSBvcHRzLmNoYW5uZWw7XG4gICAgdmFyIHNlcnZlclVybCA9IG9wdHMuc2VydmVyVXJsO1xuICAgIFxuICAgIHZhciBldmVudENvZGUgPSBvcHRzLmV2ZW50Q29kZTtcbiAgICB2YXIgZXZlbnRDb2RlU2Vzc2lvbkRheTIgPSBvcHRzLmV2ZW50Q29kZVNlc3Npb25EYXkyO1xuXHR2YXIgZXZlbnRDb2RlU2Vzc2lvbkRheTEgPSBvcHRzLmV2ZW50Q29kZVNlc3Npb25EYXkxO1xuXG5cdFV0aWxzLmdldEFubm90Q2F0ZWdvcmllcyhvcHRzLnVybENhdGVnb3JpZXMgKyBldmVudENvZGUsIHRoaXMuYW5ub3RDYXRlZ29yaWVzKTtcbiAgICBVdGlscy5nZXRBbm5vdENhdGVnb3JpZXMob3B0cy51cmxDYXRlZ29yaWVzICsgZXZlbnRDb2RlU2Vzc2lvbkRheTIsIHRoaXMuYW5ub3RDYXRlZ29yaWVzRGF5Mik7XG4gICAgVXRpbHMuZ2V0QW5ub3RDYXRlZ29yaWVzKG9wdHMudXJsQ2F0ZWdvcmllcyArIGV2ZW50Q29kZVNlc3Npb25EYXkxLCB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTEpO1xuXG4gICAgc3RhZ2VWaWV3LnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xuXG4gICAgdmFyIGN1cnJlbnREYXkgPSBuZXcgQW5ub3RzVGltZUxpbmUuQW5ub3RzVGltZUxpbmUoe1xuICAgIFx0c3RhZ2VWaWV3IDogc3RhZ2VWaWV3LFxuICAgICAgICBsb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgd3M6IHdzQW5ub3QsXG4gICAgICAgIHhJbml0OiAwLFxuICAgICAgICB5SW5pdDogMCxcbiAgICAgICAgd2lkdGg6IDEwMjQgLSAyMDAgLSAyMDAsXG4gICAgICAgIGhlaWdodDogNzY4LTIwMCxcbiAgICAgICAgdGltZUJlZ2luOiB0aGlzLnRpbWVCZWdpbixcbiAgICAgICAgdGltZUVuZDogdGhpcy50aW1lRW5kLFxuICAgICAgICBpbnRlcnZhbFdpZHRoOiA2LFxuICAgICAgICBpbnRlcnZhbEhlaWdodDogMTAsXG4gICAgICAgIG1heENlbGxIZWlnaHQ6IDcwLFxuICAgICAgICByYWRpdXM6IDIwMCxcbiAgICAgICAgZXZlbnRDb2RlOiBldmVudENvZGUsXG4gICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgIHNlcnZlclVybDogc2VydmVyVXJsLFxuICAgICAgICBhbm5vdENhdGVnb3JpZXM6IHRoaXMuYW5ub3RDYXRlZ29yaWVzXG4gICAgfSk7XG5cdFxuXHQvL0FyY2hpdmUgZGF5IDJcbiAgICB2YXIgdGltZUxpbmVEYXkyID0gbmV3IEFubm90c1RpbWVMaW5lLkFubm90c1RpbWVMaW5lKHtcbiAgICBcdHN0YWdlVmlldyA6IHN0YWdlVmlldyxcbiAgICAgICAgeEluaXQ6IDAsXG4gICAgICAgIHlJbml0OiAwLFxuICAgICAgICB3aWR0aDogMTAyNCAtIDIwMCAtIDIwMCxcbiAgICAgICAgaGVpZ2h0OiA3NjgtMjAwLFxuICAgICAgICB0aW1lQmVnaW46IERhdGUucGFyc2UoXCIyMDE1LTAxLTIzVDA5OjMwOjAwKzAxOjAwXCIpLFxuICAgICAgICB0aW1lRW5kOiBEYXRlLnBhcnNlKFwiMjAxNS0wMS0yM1QxODozMDowMCswMTowMFwiKSxcbiAgICAgICAgY2lyY2xlWDogY3VycmVudERheS5jaXJjbGVYLFxuICAgICAgICBjaXJjbGVZOiBjdXJyZW50RGF5LmNpcmNsZVksXG4gICAgICAgIGludGVydmFsV2lkdGg6IChjdXJyZW50RGF5LnJhZGl1cyoyLzMpKiBjdXJyZW50RGF5LmludGVydmFsV2lkdGggLyBjdXJyZW50RGF5LnJhZGl1cyxcbiAgICAgICAgaW50ZXJ2YWxIZWlnaHQ6IChjdXJyZW50RGF5LmludGVydmFsSGVpZ2h0ICogKGN1cnJlbnREYXkucmFkaXVzIC0gY3VycmVudERheS5yYWRpdXMqMi8zKSkvIGN1cnJlbnREYXkubWF4Q2VsbEhlaWdodCxcbiAgICAgICAgbWF4Q2VsbEhlaWdodDogKGN1cnJlbnREYXkucmFkaXVzIC0gY3VycmVudERheS5yYWRpdXMqMi8zKS8yLFxuICAgICAgICByYWRpdXM6IGN1cnJlbnREYXkucmFkaXVzKjIvMyxcbiAgICAgICAgYW5ub3RDYXRlZ29yaWVzOiB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTIsXG4gICAgICAgIGV2ZW50Q29kZTogZXZlbnRDb2RlU2Vzc2lvbkRheTIsXG4gICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgIHNlcnZlclVybDogc2VydmVyVXJsLFxuICAgICAgICBzaG93Q2xvY2tHcmFwaGljczpmYWxzZSxcbiAgICAgICAgYXJjaGl2ZTogdHJ1ZVxuICAgIH0pO1xuXHRcblx0Ly9BcmNoaXZlIGRheSAxXG4gICAgdmFyIHRpbWVMaW5lRGF5MSA9IG5ldyBBbm5vdHNUaW1lTGluZS5Bbm5vdHNUaW1lTGluZSh7XG4gICAgXHRzdGFnZVZpZXcgOiBzdGFnZVZpZXcsXG4gICAgICAgIHhJbml0OiAwLFxuICAgICAgICB5SW5pdDogMCxcbiAgICAgICAgd2lkdGg6IDEwMjQgLSAyMDAgLSAyMDAsXG4gICAgICAgIGhlaWdodDogNzY4LTIwMCxcbiAgICAgICAgdGltZUJlZ2luOiBEYXRlLnBhcnNlKFwiMjAxNS0wMS0yMlQwOTozMDowMCswMTowMFwiKSxcbiAgICAgICAgdGltZUVuZDogRGF0ZS5wYXJzZShcIjIwMTUtMDEtMjJUMTg6MzA6MDArMDE6MDBcIiksXG4gICAgICAgIGNpcmNsZVg6IGN1cnJlbnREYXkuY2lyY2xlWCxcbiAgICAgICAgY2lyY2xlWTogY3VycmVudERheS5jaXJjbGVZLFxuICAgICAgICBpbnRlcnZhbFdpZHRoOiAoY3VycmVudERheS5yYWRpdXMqMi8zKSogY3VycmVudERheS5pbnRlcnZhbFdpZHRoIC8gY3VycmVudERheS5yYWRpdXMsXG4gICAgICAgIGludGVydmFsSGVpZ2h0OiAoY3VycmVudERheS5pbnRlcnZhbEhlaWdodCAqIChjdXJyZW50RGF5LnJhZGl1cyAtIGN1cnJlbnREYXkucmFkaXVzLzMpKS8gY3VycmVudERheS5tYXhDZWxsSGVpZ2h0LFxuICAgICAgICBtYXhDZWxsSGVpZ2h0OiAoY3VycmVudERheS5yYWRpdXMqMi8zIC0gY3VycmVudERheS5yYWRpdXMvMykvNCxcbiAgICAgICAgcmFkaXVzOiBjdXJyZW50RGF5LnJhZGl1cy8zLFxuICAgICAgICBhbm5vdENhdGVnb3JpZXM6IHRoaXMuYW5ub3RDYXRlZ29yaWVzRGF5MSxcbiAgICAgICAgZXZlbnRDb2RlOiBldmVudENvZGVTZXNzaW9uRGF5MSxcbiAgICAgICAgY2hhbm5lbDogY2hhbm5lbCxcbiAgICAgICAgc2VydmVyVXJsOiBzZXJ2ZXJVcmwsXG4gICAgICAgIHNob3dDbG9ja0dyYXBoaWNzOmZhbHNlLFxuICAgICAgICBhcmNoaXZlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdmFyIGN1cnJlbnRUaW1lVGV4dCA9IG5ldyBQSVhJLlRleHQoXCItLSA6IC0tIDogLS1cIiwgeyBmb250OiAnMThwdCBHb3RoaWMgU3RhbmRhcmQnLCBmaWxsOiAnIzY0NjQ2NCcgfSk7XG4gICAgY3VycmVudFRpbWVUZXh0LnggPSB0aW1lTGluZURheTIuY2lyY2xlWCAtIGN1cnJlbnRUaW1lVGV4dC53aWR0aC8yO1xuICAgIGN1cnJlbnRUaW1lVGV4dC55ID0gdGltZUxpbmVEYXkyLmNpcmNsZVkgLSBjdXJyZW50VGltZVRleHQuaGVpZ2h0LzI7XG4gICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoY3VycmVudFRpbWVUZXh0KTtcblxuICAgIHZhciBkb3VibGVSb2xsSCA9IG5ldyBEb3VibGVSb2xsLkRvdWJsZVJvbGwoe1xuICAgICAgICBzdGFnZVZpZXcgOiBzdGFnZVZpZXcsXG4gICAgICAgIGxvZ2dlcjogbG9nZ2VyLFxuICAgICAgICB3czogd3NQaWFub3JvbGwsXG4gICAgICAgIHlJbml0OiAodGhpcy5oZWlnaHQgLSAyMDApLFxuICAgICAgICBzY2VuZUhlaWdodDogMjAwLFxuICAgICAgICBwaWFub3JvbGxzIDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhlaWdodDogMjAwLFxuICAgICAgICAgICAgICAgIHRpbWVXaWR0aDogMTAsXG4gICAgICAgICAgICAgICAgbGluZUludGVydmFsOiA1MDAwLFxuICAgICAgICAgICAgICAgIG5vdGVIZWlnaHQ6IDEwXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfSk7XG5cbiAgICB2YXIgZG91YmxlUm9sbFYgPSBuZXcgRG91YmxlUm9sbC5Eb3VibGVSb2xsKHtcbiAgICAgICAgc3RhZ2VWaWV3IDogc3RhZ2VWaWV3LFxuICAgICAgICBsb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgd3M6IHdzUGlhbm9yb2xsLFxuICAgICAgICBvcmllbnRhdGlvbjogJ3ZlcnRpY2FsJyxcbiAgICAgICAgc2NlbmVIZWlnaHQ6IDc2OC0yMDAsXG4gICAgICAgIHBpYW5vcm9sbHMgOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAyMDAsXG4gICAgICAgICAgICAgICAgdGltZVdpZHRoOiA2MCxcbiAgICAgICAgICAgICAgICBsaW5lSW50ZXJ2YWw6IDUwMDAsXG4gICAgICAgICAgICAgICAgbm90ZUhlaWdodDogNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICB9KTtcblxuICAgIHZhciBhbm5vdHNSb2xsID0gbmV3IEFubm90c1JvbGwuQW5ub3RzUm9sbCh7XG4gICAgICAgIHN0YWdlVmlldyA6IHN0YWdlVmlldyxcbiAgICAgICAgbG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgIHdzOiB3c0Fubm90LFxuICAgICAgICBwYXJlbnRDb250YWluZXI6IGRvdWJsZVJvbGxWLnN0YWdlLFxuICAgICAgICB4SW5pdDogMTAyNCAtIDIwMCAtIDIwMCxcbiAgICAgICAgeUluaXQ6IDc2OC0yMDAsXG4gICAgICAgIHdpZHRoOiAyMDAgKyAyMDAsXG4gICAgICAgIGhlaWdodDogNzY4LTIwMCxcbiAgICAgICAgd2lkdGhSb2xsOiAyMDAsXG4gICAgICAgIGZyYW1lcmF0ZTogZG91YmxlUm9sbFYuZnJhbWVyYXRlLFxuICAgICAgICBwaXhlbHNQZXJTZWNvbmQ6IE1hdGguZmxvb3IoMTAyNCAvIDYwKSxcbiAgICAgICAgYW5ub3RDb2xvcnM6IHRoaXMuYW5ub3RDYXRlZ29yaWVzXG4gICAgfSk7XG5cbiAgICB2YXIgbGltaXRlcnMgPSBuZXcgUElYSS5HcmFwaGljcygpXG4gICAgICAgIC5saW5lU3R5bGUoMSwgMHg2NDY0NjQpXG4gICAgICAgIC5tb3ZlVG8oYW5ub3RzUm9sbC5jb250YWluZXIueCwgYW5ub3RzUm9sbC5jb250YWluZXIueSlcbiAgICAgICAgLmxpbmVUbyhhbm5vdHNSb2xsLmNvbnRhaW5lci54LCBhbm5vdHNSb2xsLmNvbnRhaW5lci55IC0gYW5ub3RzUm9sbC5oZWlnaHQpXG4gICAgICAgIC5tb3ZlVG8oYW5ub3RzUm9sbC5jb250YWluZXIueCArIGFubm90c1JvbGwud2lkdGhSb2xsLCBhbm5vdHNSb2xsLmNvbnRhaW5lci55KVxuICAgICAgICAubGluZVRvKGFubm90c1JvbGwuY29udGFpbmVyLnggKyBhbm5vdHNSb2xsLndpZHRoUm9sbCwgYW5ub3RzUm9sbC5jb250YWluZXIueSAtIGFubm90c1JvbGwuaGVpZ2h0KVxuICAgICAgICAubW92ZVRvKDAsIHRoaXMuaGVpZ2h0IC0gMjAwKVxuICAgICAgICAubGluZVRvKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0IC0gMjAwKVxuICAgICAgICAuZHJhd1JlY3QoMCwgMCwgdGhpcy53aWR0aCAtMSwgdGhpcy5oZWlnaHQgLTEpXG4gICAgICAgIC5iZWdpbkZpbGwoMHhFQ0VDRUMpXG4gICAgICAgIC5kcmF3UmVjdCgxMDI0IC0gMjAwLCAwLCAyMDAsIDc2OC0yMDApXG4gICAgICAgIC5lbmRGaWxsKCk7XG4gICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQobGltaXRlcnMpO1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24oKXtcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVUaW1lID0gZnVuY3Rpb24oKXtcbiAgICAgICAgY3VycmVudFRpbWVUZXh0LnNldFRleHQoVXRpbHMuZm9ybWF0VGltZShEYXRlLm5vdygpKSk7XG4gICAgfTtcblxuICAgIHZhciByZWZyZXNoVGltZUludGVydmFsO1xuXG4gICAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWZyZXNoVGltZUludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7X3RoaXMudXBkYXRlVGltZSgpO30sIDEwMDApO1xuICAgIH07XG5cbiAgICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcbiAgICB9O1xuXG4gICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oKXtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQW5ub3RzVml6VmlldzogQW5ub3RzVml6Vmlld1xufTtcbiIsIi8qKlxuKiBzY3JpcHRzL2RvdWJsZXJvbGwuanNcbipcbiogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgYXBwbGljYXRpb24uXG4qIFRha2UgYSBsb29rIGF0IGh0dHA6Ly9icm93c2VyaWZ5Lm9yZy8gZm9yIG1vcmUgaW5mb1xuKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBQSVhJID0gcmVxdWlyZSgncGl4aScpO1xudmFyIF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbnZhciBQaWFub1JvbGwgPSByZXF1aXJlKCcuL3BpYW5vcm9sbCcpO1xuXG52YXIgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnLFxuICAgIGxvZ2dlcjogdW5kZWZpbmVkLFxuICAgIHNjZW5lV2lkdGg6IDEwMjQsXG4gICAgcGlhbm9yb2xscyA6IFtcbiAgICAgIHtcbiAgICAgICAgaGVpZ2h0OiA0MzUsXG4gICAgICAgIHRpbWVXaWR0aDogMTAsXG4gICAgICAgIGxpbmVJbnRlcnZhbDogNTAwMCxcbiAgICAgICAgbm90ZUhlaWdodDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWlnaHQ6IDY0NSxcbiAgICAgICAgdGltZVdpZHRoOiA2MCxcbiAgICAgICAgbGluZUludGVydmFsOiA1MDAwLFxuICAgICAgICBub3RlSGVpZ2h0OiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgXSxcbiAgICBmcmFtZXJhdGU6IDI1LFxuICAgIG9mZnNldE11c2ljOiBmYWxzZSxcbiAgICBzY2VuZUJnQ29sb3I6IDB4RkZGRkZGLFxuICAgIGxpbmVDb2xvcjogMHg0NDQ0NDQsXG4gICAgbGluZUZpbGxDb2xvcjogMHhGRkZGMDAsXG4gICAgbm90ZUNvbG9yczogWzB4QjkwMDAwLCAweDRCREQ3MSwgMHhBRjkzMUUsIDB4MUMyOEJBLCAweDUzNjk5MV0sXG4gICAgbm90ZUhlaWdodDogdW5kZWZpbmVkLFxuICAgIHplcm9TaGlmdDogMC45LFxuICAgIHRpbWVXaWR0aDogNjAsXG4gICAgbGluZUludGVydmFsOiA1MDAwLFxuLy8gICAgd3NVcmk6IHVuZGVmaW5lZCxcbi8vICAgIGV2ZW50Q29kZTogdW5kZWZpbmVkXG5cbn07XG5cbmZ1bmN0aW9uIERvdWJsZVJvbGwob3B0aW9ucykge1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgb3B0cyA9IF8ob3B0aW9ucykuZGVmYXVsdHMoZGVmYXVsdENvbmZpZykudmFsdWUoKTtcblxuICAgIHZhciBvcmllbnRhdGlvbiA9IG9wdHMub3JpZW50YXRpb247XG4gICAgdmFyIGlzSG9yaXpvbnRhbCA9IChvcmllbnRhdGlvbiAhPT0gJ3ZlcnRpY2FsJyk7XG5cbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyO1xuICAgIHRoaXMubGluZUNvbG9yID0gb3B0cy5saW5lQ29sb3I7XG4gICAgdGhpcy5saW5lRmlsbENvbG9yID0gb3B0cy5saW5lRmlsbENvbG9yO1xuICAgIHRoaXMuZnJhbWVyYXRlID0gb3B0cy5mcmFtZXJhdGU7XG4gICAgdGhpcy5vZmZzZXRNdXNpYyA9IG9wdHMub2Zmc2V0TXVzaWM7XG4gICAgdGhpcy5ub3RlQ29sb3JzID0gb3B0cy5ub3RlQ29sb3JzO1xuXG4gICAgdmFyIG5vdGVIZWlnaHQgPSBvcHRzLm5vdGVIZWlnaHQ7XG4gICAgdmFyIHNjZW5lSGVpZ2h0ID0gb3B0cy5zY2VuZUhlaWdodCB8fCBfKG9wdHMucGlhbm9yb2xscykucmVkdWNlKGZ1bmN0aW9uKHMscCkgeyByZXR1cm4gcyArIHAuaGVpZ2h0OyB9LCAwKTtcbiAgICB2YXIgdGltZVdpZHRoID0gb3B0cy50aW1lV2lkdGg7XG4gICAgdmFyIGxpbmVJbnRlcnZhbCA9IG9wdHMubGluZUludGVydmFsO1xuICAgIHZhciBvZmZzZXRNdXNpYyA9IG9wdHMub2Zmc2V0TXVzaWM7XG5cbiAgICB2YXIgc2NlbmVXaWR0aCA9IG9wdHMuc2NlbmVXaWR0aDtcbiAgICB2YXIgc3RhZ2VWaWV3ID0gb3B0cy5zdGFnZVZpZXc7XG5cbiAgICB2YXIgemVyb1NoaWZ0ID0gb3B0cy56ZXJvU2hpZnQ7XG5cbiAgICB2YXIgd3MgPSBvcHRzLndzO1xuXG4gICAgdmFyIGNvbG9yc1JlZyA9IHt9O1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgUElYSS5EaXNwbGF5T2JqZWN0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5jb250YWluZXIueCA9IE1hdGguZmxvb3Ioc2NlbmVXaWR0aCp6ZXJvU2hpZnQpO1xuICAgIHRoaXMuY29udGFpbmVyLnkgPSAwO1xuXG4gICAgc3RhZ2VWaWV3LnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xuXG4gICAgdmFyIHBpYW5vcm9sbExpc3QgPSBbXTtcblxuICAgIHZhciBwaWFub3JvbGxPcHRpb25zID0ge1xuICAgICAgICBwYXJlbnRDb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb24sXG4gICAgICAgIHhJbml0OiAwLFxuICAgICAgICB3aWR0aDogc2NlbmVXaWR0aCxcbiAgICAgICAgbm90ZUNvbG9yczogdGhpcy5ub3RlQ29sb3JzLFxuICAgICAgICBjb2xvcnNSZWc6IGNvbG9yc1JlZyxcbiAgICAgICAgbGluZUNvbG9yOiB0aGlzLmxpbmVDb2xvcixcbiAgICAgICAgbGluZUludGVydmFsOiBsaW5lSW50ZXJ2YWwsXG4gICAgICAgIG9mZnNldE11c2ljOiBvZmZzZXRNdXNpYyxcbiAgICB9O1xuXG4gICAgdmFyIHlJbml0ID0gb3B0cy55SW5pdCB8fCAwO1xuICAgIHZhciBsaW5lc0Rvd24gPSB0cnVlO1xuICAgIF8ob3B0cy5waWFub3JvbGxzKS5mb3JFYWNoKGZ1bmN0aW9uKHByRGVmLCBpKSB7XG4gICAgICAgIHZhciBwck5vdGVIZWlnaHQgPSBub3RlSGVpZ2h0IHx8IHByRGVmLm5vdGVIZWlnaHQgfHwgcHJEZWYuaGVpZ2h0IC8gMTI4O1xuICAgICAgICB2YXIgcHJUaW1lV2lkdGggPSBwckRlZi50aW1lV2lkdGggfHwgdGltZVdpZHRoO1xuICAgICAgICBwaWFub3JvbGxMaXN0LnB1c2gobmV3IFBpYW5vUm9sbChfKHtcbiAgICAgICAgICAgIHlJbml0OiB5SW5pdCxcbiAgICAgICAgICAgIGhlaWdodDogcHJEZWYuaGVpZ2h0LFxuICAgICAgICAgICAgbGluZXNEb3duOiBsaW5lc0Rvd24sXG4gICAgICAgICAgICBwaXhlbHNQZXJTZWNvbmQ6IE1hdGguZmxvb3Ioc2NlbmVXaWR0aCAvIHByVGltZVdpZHRoKSxcbiAgICAgICAgICAgIG5vdGVIZWlnaHQ6IHByTm90ZUhlaWdodCxcbiAgICAgICAgICAgIGxpbmVJbnRlcnZhbDogcHJEZWYubGluZUludGVydmFsXG4gICAgICAgIH0pLmRlZmF1bHRzKHBpYW5vcm9sbE9wdGlvbnMpLnZhbHVlKCkpKTtcbiAgICAgICAgeUluaXQgKz0gcHJEZWYuaGVpZ2h0O1xuICAgICAgICBsaW5lc0Rvd24gPSAhbGluZXNEb3duO1xuXG4gICAgICAgIGlmKGk8KG9wdHMucGlhbm9yb2xscy5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgIHZhciBsaW5lR3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpXG4gICAgICAgICAgICAgICAgLmJlZ2luRmlsbChfdGhpcy5saW5lRmlsbENvbG9yKVxuICAgICAgICAgICAgICAgIC5saW5lU3R5bGUoMSwgX3RoaXMubGluZUNvbG9yKVxuICAgICAgICAgICAgICAgIC5tb3ZlVG8oTWF0aC5mbG9vcihzY2VuZVdpZHRoKnplcm9TaGlmdCksIHlJbml0KVxuICAgICAgICAgICAgICAgIC5saW5lVG8oLXNjZW5lV2lkdGggLSBNYXRoLmZsb29yKHNjZW5lV2lkdGgqemVyb1NoaWZ0KSwgeUluaXQpXG4gICAgICAgICAgICAgICAgLmVuZEZpbGwoKTtcbiAgICAgICAgICAgIF90aGlzLmNvbnRhaW5lci5hZGRDaGlsZChsaW5lR3JhcGhpY3MpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZighaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJvdGF0aW9uID0gTWF0aC5QSS8yO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci55ID0gc2NlbmVIZWlnaHQ7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnggPSBzY2VuZVdpZHRoO1xuICAgIH1cblxuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgICBcdHdzLm1lc3NhZ2UoZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgX3RoaXMuYWRkTm90ZXMoZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuXG4gICAgdGhpcy5hZGROb3RlcyA9IGZ1bmN0aW9uKGRhdGEpIHtcblxuICAgICAgICBwaWFub3JvbGxMaXN0LmZvckVhY2goZnVuY3Rpb24oYykge1xuICAgICAgICAgICAgYy5hZGROb3RlUmF3KGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHBpYW5vcm9sbExpc3QuZm9yRWFjaChmdW5jdGlvbihjKSB7XG4gICAgICAgICAgICBjLm1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIEluaXQgcGFnZSBhbmQgaW50ZXJ2YWxzXG4gICAgdmFyIHN0YXJ0VHM7XG5cbiAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgc3RhcnRUcyA9IERhdGUubm93KCk7XG4gICAgICAgIHBpYW5vcm9sbExpc3QuZm9yRWFjaChmdW5jdGlvbihjKSB7XG4gICAgICAgICAgICBjLnN0YXJ0KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpIHtcblxuICAgICAgICBwaWFub3JvbGxMaXN0LmZvckVhY2goZnVuY3Rpb24oYykge1xuICAgICAgICAgICAgYy5zdG9wKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cblxuICAgIHRoaXMubG9nID0gZnVuY3Rpb24obSkge1xuICAgICAgICBpZih0aGlzLmxvZ2dlcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKG0pO1xuICAgICAgICB9XG4gICAgfTtcblxuXG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgRG91YmxlUm9sbDogRG91YmxlUm9sbFxufTtcbiIsIi8qKlxuKiBqcy93c3dyYXBwZXIuanNcbipcbiogc2ltcGxlIGxvZ2dlciBzZXJ2aWNlXG4qXG4qL1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQ6IGZhbHNlICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gSHRtbExvZ2dlcihkb0xvZywgY29udGFpbmVyKSB7XG5cbiAgICB2YXIgbG9nQ29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIGlmKHR5cGVvZihjb250YWluZXIpID09PSAnc3RyaW5nJykge1xuICAgICAgICBsb2dDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXIpO1xuICAgIH1cbiAgICBpZighZG9Mb2cpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsb2dDb250YWluZXIpO1xuICAgICAgICBsb2dDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG5cbiAgICB0aGlzLmxvZyA9IGZ1bmN0aW9uKG1zZykge1xuICAgICAgICBpZihkb0xvZyAmJiBsb2dDb250YWluZXIpIHtcbiAgICAgICAgICAgIGxvZ0NvbnRhaW5lci5pbm5lckhUTUwgKz0gbXNnICsgJ1xcbic7XG4gICAgICAgICAgICBsb2dDb250YWluZXIuc2Nyb2xsVG9wID0gbG9nQ29udGFpbmVyLnNjcm9sbEhlaWdodDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIENvbnNvbGVMb2dnZXIoZG9Mb2cpIHtcblxuICAgIHRoaXMubG9nID0gZnVuY3Rpb24obXNnKSB7XG4gICAgICAgIGlmKGRvTG9nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgICAgICB9XG4gICAgfTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBIdG1sTG9nZ2VyOiBIdG1sTG9nZ2VyLFxuICAgIENvbnNvbGVMb2dnZXI6IENvbnNvbGVMb2dnZXJcbn07XG4iLCIvKipcbioganMvcGlhbm9yb2xsLmpzXG4qXG4qIHBpYW5vcm9sbCBiYXNpYyBjb21wb25lbnRcbipcbiovXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciByYW5kb21Db2xvciA9IHJlcXVpcmUoJ3JhbmRvbUNvbG9yJyk7XG52YXIgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuXG52YXIgTlRQX0VQT0NIX0RFTFRBID0gMjIwODk4ODgwMDsgLy9jLmYuIFJGQyA4NjhcblxuZnVuY3Rpb24gUGlhbm9Sb2xsKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFBJWEkuRGlzcGxheU9iamVjdENvbnRhaW5lcigpO1xuICAgIHRoaXMuY29udGFpbmVyLnggPSBvcHRpb25zLnhJbml0O1xuICAgIHRoaXMuY29udGFpbmVyLnkgPSBvcHRpb25zLnlJbml0O1xuICAgIG9wdGlvbnMucGFyZW50Q29udGFpbmVyLmFkZENoaWxkKHRoaXMuY29udGFpbmVyKTtcblxuICAgIHZhciBvcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgdmFyIGlzSG9yaXpvbnRhbCA9IChvcmllbnRhdGlvbiAhPT0gJ3ZlcnRpY2FsJyk7XG5cbiAgICB0aGlzLmxpbmVzRG93biA9IG9wdGlvbnMubGluZXNEb3duO1xuICAgIHRoaXMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7XG4gICAgdGhpcy5waXhlbHNQZXJTZWNvbmQgPSBvcHRpb25zLnBpeGVsc1BlclNlY29uZDtcbiAgICB0aGlzLndpZHRoID0gb3B0aW9ucy53aWR0aDtcbiAgICB0aGlzLm5vdGVDb2xvcnMgPSBvcHRpb25zLm5vdGVDb2xvcnM7XG4gICAgdGhpcy5jb2xvcnNSZWcgPSBvcHRpb25zLmNvbG9yc1JlZyB8fCB7fTtcbiAgICB0aGlzLmxpbmVDb2xvciA9IG9wdGlvbnMubGluZUNvbG9yO1xuICAgIHRoaXMubGluZUludGVydmFsID0gb3B0aW9ucy5saW5lSW50ZXJ2YWw7XG4gICAgdGhpcy5vZmZzZXRNdXNpYyA9IG9wdGlvbnMub2Zmc2V0TXVzaWMgfHwgZmFsc2U7XG4gICAgdGhpcy5ub3RlSGVpZ2h0ID0gb3B0aW9ucy5ub3RlSGVpZ2h0O1xuICAgIHRoaXMubm90ZURpY3QgPSB7fTtcbiAgICB0aGlzLnN0YXJ0VHMgPSBvcHRpb25zLnN0YXJ0VHMgfHwgRGF0ZS5ub3coKTtcblxuICAgIHZhciBzdGFydGVkID0gZmFsc2U7XG5cbiAgICB2YXIgaXNIaWRkZW4gPSBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICAvLyBUT0RPOiB0aGUgb3JpZ2luIHBvaW50IGlzIGFuIGFwcHJveGltYXRpb24uIFNob3VsZCByZWZpbmUgdGhpc1xuICAgICAgICB2YXIgZ2xvYmFsUG9zID0gY2hpbGQudG9HbG9iYWwobmV3IFBJWEkuUG9pbnQoMCwwKSk7XG4gICAgICAgIHJldHVybiAoKGdsb2JhbFBvcy54ICsgY2hpbGQud2lkdGgpIDwgMCkgfHwgKChnbG9iYWxQb3MueSArIGNoaWxkLmhlaWdodCkgPCAwKSA7XG4gICAgfTtcblxuICAgIC8vVE9ETzogSSBkbyBub3QgbGlrZSB0aGUgXCJyZWdDb2xvclwiIG9iamVjdC4gVGhpcyBzaG91bGQgbm90IGJlIGdsb2JhbCwgYnV0IGxvY2FsXG4gICAgdGhpcy5nZXRDb2xvciA9IGZ1bmN0aW9uKGNhbmFsKSB7XG4gICAgICAgIHZhciBjb2xvciA9IHRoaXMuY29sb3JzUmVnW2NhbmFsXTtcbiAgICAgICAgaWYodHlwZW9mKGNvbG9yKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHZhciBjb2xvcnNSZWdTaXplID0gT2JqZWN0LmtleXModGhpcy5jb2xvcnNSZWcpLmxlbmd0aDtcbiAgICAgICAgICAgIGlmKGNvbG9yc1JlZ1NpemUgPCB0aGlzLm5vdGVDb2xvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLmNvbG9yc1JlZ1tjYW5hbF0gPSB0aGlzLm5vdGVDb2xvcnNbY29sb3JzUmVnU2l6ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuY29sb3JzUmVnW2NhbmFsXSA9IHBhcnNlSW50KHJhbmRvbUNvbG9yKHsgbHVtaW5vc2l0eTogJ2xpZ2h0JywgaHVlOiAncmFuZG9tJywgZm9ybWF0OidoZXgnfSkucmVwbGFjZSgvXiMvLCAnJyksIDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0Tm90ZVJlY3QgPSBmdW5jdGlvbih4LCB5LCBjb2xvciwgYWxwaGEsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5GaWxsKGNvbG9yLCBhbHBoYSk7XG4gICAgICAgIGdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBncmFwaGljcy5lbmRGaWxsKCk7XG4gICAgICAgIGdyYXBoaWNzLnggPSB4O1xuICAgICAgICBncmFwaGljcy55ID0geTtcbiAgICAgICAgZ3JhcGhpY3Mud2lkdGggPSB3aWR0aDtcbiAgICAgICAgZ3JhcGhpY3MuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICByZXR1cm4gZ3JhcGhpY3M7XG4gICAgfTtcblxuICAgIHRoaXMuYWRkTm90ZVJhdyA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIG5vdGUgPSBkYXRhLmNvbnRlbnRbM107XG4gICAgICAgIHZhciB2ZWxvY2l0eSA9IGRhdGEuY29udGVudFs0XTtcbiAgICAgICAgdmFyIHRzID0gKGRhdGEuY29udGVudFswXSAtIE5UUF9FUE9DSF9ERUxUQSkqMTAwMDtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBkYXRhLmNvbnRlbnRbMl07XG4gICAgICAgIHZhciBzZXNzaW9uVHMgPSBkYXRhLmNvbnRlbnRbMV07XG5cbiAgICAgICAgdGhpcy5hZGROb3RlKG5vdGUsIHRzLCBzZXNzaW9uVHMsIHZlbG9jaXR5LCBjaGFubmVsLCAwKTtcbiAgICB9O1xuXG4gICAgdGhpcy5hZGROb3RlID0gZnVuY3Rpb24obm90ZSwgc3RhcnRUaW1lLCBzZXNzaW9uVHMsIHZlbG9jaXR5LCBjaGFubmVsLCBkdXJhdGlvbikge1xuXG4gICAgICAgIHZhciB0cyA9IHN0YXJ0VGltZTtcbiAgICAgICAgaWYodGhpcy5vZmZzZXRNdXNpYykge1xuICAgICAgICAgICAgdHMgPSB0aGlzLnN0YXJ0VHMgKyBzZXNzaW9uVHM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm90ZUR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIHZhciBub3RlVmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICAgICAgdmFyIGdyYXBoaWNzO1xuICAgICAgICBpZighZHVyYXRpb24pIHtcbiAgICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdPT09J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgICAgIHRoaXMubm90ZURpY3RbY2hhbm5lbF0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHZlbG9jaXR5PT09MCkge1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdW25vdGVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm90ZURlZiA9IHRoaXMubm90ZURpY3RbY2hhbm5lbF1bbm90ZV07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdW25vdGVdO1xuICAgICAgICAgICAgICAgICAgICBub3RlRHVyYXRpb24gPSBzZXNzaW9uVHMgLSBub3RlRGVmLnNlc3Npb25UcztcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSBub3RlRGVmLmdyYXBoaWNzO1xuICAgICAgICAgICAgICAgICAgICBub3RlVmVsb2NpdHkgPSBub3RlRGVmLnZlbG9jaXR5O1xuICAgICAgICAgICAgICAgICAgICB0cyA9IG5vdGVEZWYudHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm90ZUR1cmF0aW9uID0gTWF0aC5hYnMoRGF0ZS5ub3coKSAtIHRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdW25vdGVdID0geyB0czogdHMsIHZlbG9jaXR5OiB2ZWxvY2l0eSwgc2Vzc2lvblRzOiBzZXNzaW9uVHN9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICBpZighdGhpcy5vZmZzZXRNdXNpYyB8fCB2ZWxvY2l0eT09PTApIHtcblxuICAgICAgICAgICAgdmFyIHdpZHRoID0gbm90ZUR1cmF0aW9uICogdGhpcy5waXhlbHNQZXJTZWNvbmQgLyAxMDAwO1xuICAgICAgICAgICAgaWYoIWdyYXBoaWNzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHggPSAodHMtdGhpcy5zdGFydFRzKSAqIHRoaXMucGl4ZWxzUGVyU2Vjb25kIC8gMTAwMDtcbiAgICAgICAgICAgICAgICBpZigoeCt3aWR0aCkgPCAgKE1hdGguYWJzKHRoaXMuY29udGFpbmVyLngpIC0gdGhpcy53aWR0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90IHZpc2libGUuIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgeSA9IE1hdGguZmxvb3IoKDEyOC1ub3RlKzAuNSkgKiB0aGlzLmhlaWdodCAvIDEyOCAtICh0aGlzLm5vdGVIZWlnaHQvMikpO1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IHRoaXMuZ2V0Q29sb3IoY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgdmFyIGFscGhhID0gKG5vdGVWZWxvY2l0eSAvIDEyOCk7XG5cbiAgICAgICAgICAgICAgICBncmFwaGljcyA9IHRoaXMuZ2V0Tm90ZVJlY3QoeCwgeSwgY29sb3IsIGFscGhhLCB3aWR0aCwgdGhpcy5ub3RlSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChncmFwaGljcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBncmFwaGljcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZighZHVyYXRpb24gJiYgdmVsb2NpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdW25vdGVdLmdyYXBoaWNzID0gZ3JhcGhpY3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5hZGRMaW5lID0gZnVuY3Rpb24odHMpe1xuXG4gICAgICAgIGlmKHR5cGVvZih0cykgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0cyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHggPSAtdGhpcy5jb250YWluZXIueDtcbiAgICAgICAgdmFyIHkgPSB0aGlzLmxpbmVzRG93biA/IHRoaXMuaGVpZ2h0IC0gMjAgOiAwO1xuXG4gICAgICAgIHZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKClcbiAgICAgICAgICAgIC5iZWdpbkZpbGwoMHhGRkZGMDApXG4gICAgICAgICAgICAubGluZVN0eWxlKDEsIHRoaXMubGluZUNvbG9yKVxuICAgICAgICAgICAgLm1vdmVUbygwLCAwKVxuICAgICAgICAgICAgLmxpbmVUbygwLCAyMClcbiAgICAgICAgICAgIC5lbmRGaWxsKCk7XG4gICAgICAgIGdyYXBoaWNzLnggPSB4O1xuICAgICAgICBncmFwaGljcy55ID0geTtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuICAgICAgICAvLyBBZGQgdGV4dFxuICAgICAgICAvL3ZhciB0b3RhbFNlYyA9IGxpbmVOYiAqIHRoaXMubGluZUludGVydmFsIC8gMTAwMDtcbiAgICAgICAgdmFyIGhvdXJzID0gdHMuZ2V0SG91cnMoKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgPXRzLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgdmFyIHNlY29uZHMgPSB0cy5nZXRTZWNvbmRzKCk7XG4gICAgICAgIHZhciB0aW1lU3RyID0gKGhvdXJzIDwgMTAgPyAnMCcgKyBob3VycyA6IGhvdXJzKSArICc6JyArIChtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzIDogbWludXRlcykgKyAnOicgKyAoc2Vjb25kcyAgPCAxMCA/ICcwJyArIHNlY29uZHMgOiBzZWNvbmRzKTtcblxuICAgICAgICB2YXIgZm9udE9iaiA9IHsgZm9udDogJzEwcHQgQXJpYWwnLCBmaWxsOiAnIzQ0NDQ0NCcgfTtcbiAgICAgICAgdmFyIHQgPSBuZXcgUElYSS5UZXh0KHRpbWVTdHIsIGZvbnRPYmopO1xuICAgICAgICBpZihpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIHQueCA9IHggKyAyO1xuICAgICAgICAgICAgdC55ID0gdGhpcy5saW5lc0Rvd24gPyB0aGlzLmhlaWdodCAtIDE1IDogMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHQucm90YXRpb24gPSAtTWF0aC5QSS8yO1xuICAgICAgICAgICAgdC54ID0geCA7XG4gICAgICAgICAgICB0LnkgPSB0aGlzLmxpbmVzRG93biA/IHRoaXMuaGVpZ2h0IC0gMiA6IHQud2lkdGggKyAyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKHQpO1xuICAgIH07XG5cbiAgICB0aGlzLm1vdmVUbyA9IGZ1bmN0aW9uKGRpZmZUaW1lKXtcbiAgICAgICAgdmFyIG9sZFggPSB0aGlzLmNvbnRhaW5lci54O1xuICAgICAgICB0aGlzLmNvbnRhaW5lci54ID0gTWF0aC5mbG9vcihkaWZmVGltZSp0aGlzLnBpeGVsc1BlclNlY29uZCk7XG4gICAgICAgIHZhciBkZWx0YVggPSBNYXRoLmFicyhvbGRYLXRoaXMuY29udGFpbmVyLngpO1xuICAgICAgICBfLmZvck93bih0aGlzLm5vdGVEaWN0LCBmdW5jdGlvbihjaGFubmVsRGljdCkge1xuICAgICAgICAgICAgXy5mb3JPd24oY2hhbm5lbERpY3QsIGZ1bmN0aW9uKG5vdGVEZWYpIHtcbiAgICAgICAgICAgICAgICBpZihub3RlRGVmLmdyYXBoaWNzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGVEZWYuZ3JhcGhpY3Mud2lkdGggPSBub3RlRGVmLmdyYXBoaWNzLndpZHRoICsgZGVsdGFYO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5tb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkaWZmID0gKHRoaXMuc3RhcnRUcyAtIERhdGUubm93KCkpLzEwMDA7XG4gICAgICAgIHRoaXMubW92ZVRvKGRpZmYpO1xuICAgIH07XG5cbiAgICB0aGlzLnJlbW92ZVBhc3NlZE9iamV0cyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBjaGlsZHJlblRvUmVtb3ZlID0gW107XG4gICAgICAgIF8oX3RoaXMuY29udGFpbmVyLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mKGNoaWxkKSA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICAoaXNIaWRkZW4oY2hpbGQpICYmIGNoaWxkcmVuVG9SZW1vdmUucHVzaChjaGlsZCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2hpbGRyZW5Ub1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgICAgICBfdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZighc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuYWRkTGluZSgpO1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52ZXJ0aWNhbExpbmVzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsgX3RoaXMuYWRkTGluZSgpOyB9LCB0aGlzLmxpbmVJbnRlcnZhbCk7XG4gICAgICAgIHRoaXMuY2xlYW5JbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgX3RoaXMucmVtb3ZlUGFzc2VkT2JqZXRzKCk7IH0sIDEwMDAgKiB0aGlzLndpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5tb3ZlSW50ZXJ2YWwpO1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudmVydGljYWxMaW5lc0ludGVydmFsKTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNsZWFuSW50ZXJ2YWwpO1xuICAgIH07XG5cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBpYW5vUm9sbDtcbiIsIi8qKlxuKiBzY3JpcHRzL3N0YWdldmlldy5qc1xuKlxuKiBUaGlzIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiogVGFrZSBhIGxvb2sgYXQgaHR0cDovL2Jyb3dzZXJpZnkub3JnLyBmb3IgbW9yZSBpbmZvXG4qL1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQ6IGZhbHNlICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbnZhciBkZWZhdWx0Q29uZmlnID0ge1xuICAgIGV4dGVybmFsUmVmcmVzaDogZmFsc2UsXG4gICAgbG9nZ2VyOiB1bmRlZmluZWQsXG4gICAgc2NlbmVXaWR0aDogMTAyNCxcbiAgICBzY2VuZUhlaWdodDogNzY4LFxuICAgIGZyYW1lcmF0ZTogMjUsXG4gICAgc2NlbmVCZ0NvbG9yOiAweEZGRkZGRixcbiAgICBjYW52YXNDb250YWluZXI6ICdjYW52YXNDb250YWluZXInLFxufTtcblxuZnVuY3Rpb24gU3RhZ2VWaWV3KG9wdGlvbnMpIHtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIG9wdHMgPSBfKG9wdGlvbnMpLmRlZmF1bHRzKGRlZmF1bHRDb25maWcpLnZhbHVlKCk7XG5cbiAgICB2YXIgZXh0ZXJuYWxSZWZyZXNoID0gb3B0cy5leHRlcm5hbFJlZnJlc2g7XG5cbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyO1xuICAgIHRoaXMuZnJhbWVyYXRlID0gb3B0cy5mcmFtZXJhdGU7XG4gICAgdmFyIHNjZW5lQmdDb2xvciA9IG9wdHMuc2NlbmVCZ0NvbG9yO1xuICAgIHZhciBzY2VuZVdpZHRoID0gb3B0cy5zY2VuZVdpZHRoO1xuICAgIHZhciBzY2VuZUhlaWdodCA9IG9wdHMuc2NlbmVIZWlnaHQ7XG4gICAgdmFyIGNhbnZhc0NvbnRhaW5lciA9IG9wdHMuY2FudmFzQ29udGFpbmVyO1xuICAgIHZhciB0aW1lQ29udGFpbmVyID0gW107XG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcblxuICAgIC8vY3JlYXRlIGFuIG5ldyBpbnN0YW5jZSBvZiBhIHBpeGkgc3RhZ2VcbiAgICB0aGlzLnN0YWdlID0gbmV3IFBJWEkuU3RhZ2Uoc2NlbmVCZ0NvbG9yKTtcbiAgICAvL2NyZWF0ZSBhIHJlbmRlcmVyIGluc3RhbmNlLlxuICAgIHZhciByZW5kZXJlciA9IFBJWEkuYXV0b0RldGVjdFJlbmRlcmVyKHNjZW5lV2lkdGgsIHNjZW5lSGVpZ2h0KTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGlmKHR5cGVvZihjYW52YXNDb250YWluZXIpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0eXBlb2YodGltZUNvbnRhaW5lcikgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aW1lQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGltZUNvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBjYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQocmVuZGVyZXIudmlldyk7XG5cbiAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGMpe1xuICAgIFx0XHRjLmluaXQoKTtcbiAgICBcdH0pO1xuICAgIH07XG5cbiAgICB0aGlzLnJlZ2lzdGVyVGltZUNvbnRhaW5lciA9IGZ1bmN0aW9uKGNvbnRhaW5lcikge1xuICAgIFx0dGltZUNvbnRhaW5lci5wdXNoKGNvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnQgPSBmdW5jdGlvbihjb21wb25lbnQpIHtcbiAgICBcdGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgIFx0dGhpcy5zdGFnZS5hZGRDaGlsZChjb21wb25lbnQuY29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG4gICAgXHRjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oYyl7XG4gICAgXHRcdGMucmVmcmVzaCgpO1xuICAgIFx0fSk7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnN0YWdlKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdCBwYWdlIGFuZCBpbnRlcnZhbHNcbiAgICB2YXIgcmVmcmVzaEludGVydmFsO1xuXG4gICAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGlmKCFleHRlcm5hbFJlZnJlc2gpIHtcbiAgICAgICAgICAgIHJlZnJlc2hJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge190aGlzLnJlZnJlc2goKTt9LCAxMDAwL3RoaXMuZnJhbWVyYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjKXtcbiAgICBcdFx0Yy5zdGFydCgpO1xuICAgIFx0fSk7XG4gICAgfTtcblxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZighZXh0ZXJuYWxSZWZyZXNoKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHJlZnJlc2hJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjKXtcbiAgICBcdFx0Yy5zdG9wKCk7XG4gICAgXHR9KTtcbiAgICB9O1xuXG5cbiAgICB0aGlzLmxvZyA9IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgaWYodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhtKTtcbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBTdGFnZVZpZXc6IFN0YWdlVmlld1xufTtcbiIsIi8qKlxuKiBqcy91dGlscy5qc1xuKlxuKiBiYXNpYyB0b29sc1xuKlxuKi9cbi8qanNoaW50IGJpdHdpc2U6IGZhbHNlKi9cbi8qanNoaW50IGNhbWVsY2FzZTogZmFsc2UgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG52YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWUgKHRzKSB7XG4gICAgcmV0dXJuIG1vbWVudCh0cykuZm9ybWF0KCdISDptbTpzcycpO1xufVxuXG5mdW5jdGlvbiBjb2xvclRvSGV4KGMpIHtcbiAgICB2YXIgbSA9IC9yZ2JhP1xcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKykvLmV4ZWMoYyk7XG4gICAgcmV0dXJuIG0gPyAnIycgKyAoMSA8PCAyNCB8IG1bMV0gPDwgMTYgfCBtWzJdIDw8IDggfCBtWzNdKS50b1N0cmluZygxNikuc3Vic3RyKDEpIDogYztcbn1cblxuZnVuY3Rpb24gZ2V0QW5ub3RDYXRlZ29yaWVzKHVybENhdGVnb3JpZXMsIGFubm90Q2F0ZWdvcmllcykge1xuXG4gICAgdmFyIGpzb25Mb2FkZXIgPSBuZXcgUElYSS5Kc29uTG9hZGVyKHVybENhdGVnb3JpZXMsIHRydWUpO1xuXG4gICAganNvbkxvYWRlci5vbignbG9hZGVkJywgZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgIHZhciBkYXRhID0gcmVzLnRhcmdldC5qc29uO1xuXG4gICAgICAgIHdoaWxlKGFubm90Q2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbm5vdENhdGVnb3JpZXMucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnNlc3Npb25zLmZvckVhY2goZnVuY3Rpb24oc2Vzc2lvbikge1xuICAgICAgICAgICAgdmFyIGFubm90Q2F0ID0ge1xuICAgICAgICAgICAgICAgIHRzOiBzZXNzaW9uLnN0YXJ0X3RzID09PSBudWxsID8gbmV3IERhdGUoMCkgOiBEYXRlLnBhcnNlKHNlc3Npb24uc3RhcnRfdHMpLFxuICAgICAgICAgICAgICAgIGNvbG9yczoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgY2F0ZWdvcmllc0pzb24gPSBzZXNzaW9uLmNhdGVnb3JpZXNfanNvbjtcbiAgICAgICAgICAgIGFubm90Q2F0Lm9yZGVyID0gY2F0ZWdvcmllc0pzb24ub3JkZXI7XG4gICAgICAgICAgICBpZiAodHlwZW9mKGFubm90Q2F0Lm9yZGVyWydkZWZhdWx0J10pID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgYW5ub3RDYXQub3JkZXIucHVzaCgnZGVmYXVsdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNhdExpc3QgPSBfLmNsb25lKGNhdGVnb3JpZXNKc29uLmNhdGVnb3JpZXMpO1xuICAgICAgICAgICAgd2hpbGUoY2F0TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhdCA9IGNhdExpc3QucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYoY2F0LmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RDYXQuY29sb3JzW2NhdC5jb2RlXSA9IGNvbG9yVG9IZXgoY2F0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoY2F0LnN1YmNhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2F0TGlzdCA9IGNhdExpc3QuY29uY2F0KGNhdC5zdWJjYXRlZ29yaWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRlZ29yaWVzSnNvbi5jYXRlZ29yaWVzLmZvckVhY2goZnVuY3Rpb24oY2F0KSB7XG4gICAgICAgICAgICAgICAgaWYoY2F0LmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RDYXQuY29sb3JzW2NhdC5jb2RlXSA9IGNvbG9yVG9IZXgoY2F0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFubm90Q2F0LmRlZmF1bHRDb2xvciA9IGNhdGVnb3JpZXNKc29uLmRlZmF1bHRDb2xvciB8fCAnIzUzNjk5MSc7XG4gICAgICAgICAgICBhbm5vdENhdGVnb3JpZXMucHVzaChhbm5vdENhdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAganNvbkxvYWRlci5sb2FkKCk7XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0VGltZTogZm9ybWF0VGltZSxcbiAgICBnZXRBbm5vdENhdGVnb3JpZXM6IGdldEFubm90Q2F0ZWdvcmllcyxcbiAgICBjb2xvclRvSGV4OiBjb2xvclRvSGV4XG59O1xuIiwiLyoqXG4qIGpzL3dzd3JhcHBlci5qc1xuKlxuKiBzaW1wbGUgd2Vic2VydmljZSB3cmFwcGVyIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyBvbiBvbm1lc3NhZ2VcbipcbiovXG5cbi8qIGdsb2JhbCBXZWJTb2NrZXQ6IGZhbHNlICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gV3NXcmFwcGVyKHdzdXJsLCBsb2dnZXIpIHtcblxuICAgIHZhciB1cmwgPSB3c3VybDtcbiAgICB2YXIgc29jayA9IG5ldyBXZWJTb2NrZXQodXJsKTtcbiAgICB2YXIgbG9nZ2VyT2JqID0gbG9nZ2VyO1xuXG4gICAgdmFyIGxvZyA9IGZ1bmN0aW9uKG1zZykge1xuICAgICAgICBpZihsb2dnZXJPYmopIHtcbiAgICAgICAgICAgIGxvZ2dlck9iai5sb2cobXNnKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlcnMgPSBbXTtcblxuICAgIHNvY2sub25vcGVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGxvZygnQ29ubmVjdGVkIHRvICcgKyB1cmwpO1xuICAgIH07XG5cbiAgICBzb2NrLm9uY2xvc2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIGxvZygnQ29ubmVjdGlvbiBjbG9zZWQgKHdhc0NsZWFuID0gJyArIGUud2FzQ2xlYW4gKyAnLCBjb2RlID0gJyArIGUuY29kZSArICcsIHJlYXNvbiA9IFxcJycgKyBlLnJlYXNvbiArICdcXCcpJyk7XG4gICAgICAgIHNvY2sgPSBudWxsO1xuICAgIH07XG5cbiAgICBzb2NrLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgbG9nKCdyZWNlaXZlZCAnICsgZS5kYXRhKTtcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlcihkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgV3NXcmFwcGVyOiBXc1dyYXBwZXJcbn07XG4iXX0=
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL2FwcC9qcy9tYWluLmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL2Fubm90c3JvbGwuanMiLCIvVXNlcnMvcm91Z2Vyb25qL3dvcmtzcGFjZS9tb25zL2NsaWVudC9hbm5vdHZpei9hcHAvanMvYW5ub3RzdGltZWxpbmUuanMiLCIvVXNlcnMvcm91Z2Vyb25qL3dvcmtzcGFjZS9tb25zL2NsaWVudC9hbm5vdHZpei9hcHAvanMvYW5ub3Rzdml6dmlldy5qcyIsIi9Vc2Vycy9yb3VnZXJvbmovd29ya3NwYWNlL21vbnMvY2xpZW50L2Fubm90dml6L2FwcC9qcy9kb3VibGVyb2xsLmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL2xvZ2dlci5qcyIsIi9Vc2Vycy9yb3VnZXJvbmovd29ya3NwYWNlL21vbnMvY2xpZW50L2Fubm90dml6L2FwcC9qcy9waWFub3JvbGwuanMiLCIvVXNlcnMvcm91Z2Vyb25qL3dvcmtzcGFjZS9tb25zL2NsaWVudC9hbm5vdHZpei9hcHAvanMvc3RhZ2V2aWV3LmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL3V0aWxzLmpzIiwiL1VzZXJzL3JvdWdlcm9uai93b3Jrc3BhY2UvbW9ucy9jbGllbnQvYW5ub3R2aXovYXBwL2pzL3dzd3JhcHBlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyoqXG4gKiBzY3JpcHRzL21haW4uanNcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiAqIFRha2UgYSBsb29rIGF0IGh0dHA6Ly9icm93c2VyaWZ5Lm9yZy8gZm9yIG1vcmUgaW5mb1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGRvdWJsZXJvbGwgPSByZXF1aXJlKCcuL2RvdWJsZXJvbGwnKTtcbnZhciBhbm5vdHNyb2xsID0gcmVxdWlyZSgnLi9hbm5vdHNyb2xsJyk7XG52YXIgYW5ub3RzdGltZWxpbmUgPSByZXF1aXJlKCcuL2Fubm90c3RpbWVsaW5lJyk7XG52YXIgYW5ub3Rzdml6dmlldyA9IHJlcXVpcmUoJy4vYW5ub3Rzdml6dmlldycpO1xudmFyIHN0YWdldmlldyA9IHJlcXVpcmUoJy4vc3RhZ2V2aWV3Jyk7XG52YXIgd3N3cmFwcGVyID0gcmVxdWlyZSgnLi93c3dyYXBwZXInKTtcbnZhciBsb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IF8oe30pXG4gICAgLmV4dGVuZChkb3VibGVyb2xsKVxuICAgIC5leHRlbmQoYW5ub3Rzcm9sbClcbiAgICAuZXh0ZW5kKGFubm90c3RpbWVsaW5lKVxuICAgIC5leHRlbmQoYW5ub3Rzdml6dmlldylcbiAgICAuZXh0ZW5kKHN0YWdldmlldylcbiAgICAuZXh0ZW5kKHdzd3JhcHBlcilcbiAgICAuZXh0ZW5kKGxvZ2dlcilcbiAgICAuZXh0ZW5kKHV0aWxzKVxuICAgIC52YWx1ZSgpO1xuIiwiLyoqXG4qIGpzL2Fubm90c1JvbGwuanNcbipcbiogYW5ub3RzUm9sbCBiYXNpYyBjb21wb25lbnRcbipcbiovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFBJWEkgPSByZXF1aXJlKCdwaXhpJyk7XG52YXIgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuXG52YXIgREVGQVVMVF9BTk5PVF9DT0xPUiA9ICcjYmFiYWJhJztcblxudmFyIGRlZmF1bHRBbm5vdFN0eWxlcyA9IHtcbiAgICAnbGFiZWwnOiB7IGZvbnQ6ICcxNnB0IEFyaWFsIEJvbGQnLCBmaWxsOiAnIzY1QTk1NCcsIHdvcmRXcmFwOiB0cnVlfSxcbiAgICAndGV4dCcgOiB7IGZvbnQ6ICcxMnB0IEFyaWFsIFJlZ3VsYXInLCBmaWxsOiAnIzQ0NDQ0NCcsIHdvcmRXcmFwOiB0cnVlfSxcbiAgICAndXNlcicgOiB7IGZvbnQ6ICcxNHB0IEFyaWFsIHJlZ3VsYXInLCBmaWxsOiAnIzY2NjY2NicgfSxcbn07XG5cbnZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBleHRlcm5hbFJlZnJlc2g6IGZhbHNlLFxuICAgIGRlZmF1bHRDb2xvcjogREVGQVVMVF9BTk5PVF9DT0xPUixcbiAgICBhbm5vdFN0eWxlczogZGVmYXVsdEFubm90U3R5bGVzLFxuICAgIGlnbm9yZUFubm90czpmYWxzZVxufTtcblxuZnVuY3Rpb24gQW5ub3RzUm9sbChvcHRpb25zKSB7XG5cbi8vcGFyZW50Q29udGFpbmVyLCB4SW5pdCwgeUluaXQsIHdpZHRoLCBoZWlnaHQsIHdpZHRoUm9sbCwgcGl4ZWxzUGVyU2Vjb25kLCBhbm5vdENvbG9yc1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIG9wdHMgPSBfKG9wdGlvbnMpLmRlZmF1bHRzKGRlZmF1bHRPcHRpb25zKS52YWx1ZSgpO1xuXG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBQSVhJLkRpc3BsYXlPYmplY3RDb250YWluZXIoKTtcbiAgICB0aGlzLmNvbnRhaW5lci54ID0gb3B0cy54SW5pdDtcbiAgICB0aGlzLmNvbnRhaW5lci55ID0gb3B0cy55SW5pdDtcbiAgICB0aGlzLmNvbnRhaW5lci53aWR0aCA9IG9wdHMud2lkdGg7XG5cbiAgICB0aGlzLmhlaWdodCA9IG9wdHMuaGVpZ2h0O1xuICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoO1xuICAgIHRoaXMud2lkdGhSb2xsID0gb3B0cy53aWR0aFJvbGw7XG4gICAgdGhpcy5waXhlbHNQZXJTZWNvbmQgPSBvcHRzLnBpeGVsc1BlclNlY29uZDtcbiAgICB0aGlzLmFubm90Q29sb3JzID0gb3B0cy5hbm5vdENvbG9ycztcbiAgICB0aGlzLnN0YXJ0VHMgPSBvcHRzLnN0YXJ0VHMgfHwgRGF0ZS5ub3coKTtcbiAgICB0aGlzLmlnbm9yZUFubm90cyA9IG9wdHMuaWdub3JlQW5ub3RzO1xuXG4gICAgdmFyIHlJbml0ID0gb3B0cy55SW5pdDtcbiAgICB2YXIgYW5ub3RTdHlsZXMgPSBfKG9wdHMuYW5ub3RTdHlsZXMpLmRlZmF1bHRzKGRlZmF1bHRBbm5vdFN0eWxlcykudmFsdWUoKTtcbiAgICB2YXIgbWFyZ2luWCA9IDE1O1xuICAgIGZvcih2YXIgc3R5bGUgaW4gYW5ub3RTdHlsZXMpIHtcbiAgICBcdGlmIChhbm5vdFN0eWxlc1tzdHlsZV0ud29yZFdyYXAgPT09IHRydWUpe1xuICAgIFx0XHRhbm5vdFN0eWxlc1tzdHlsZV0ud29yZFdyYXBXaWR0aCA9IHRoaXMud2lkdGhSb2xsIC0gbWFyZ2luWDtcbiAgICBcdH1cbiAgICB9XG4gICAgdmFyIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB2YXIgd3MgPSBvcHRzLndzO1xuICAgIHZhciBleHRlcm5hbFJlZnJlc2ggPSBvcHRzLmV4dGVybmFsUmVmcmVzaDtcbiAgICB2YXIgc3RhZ2VWaWV3ID0gb3B0cy5zdGFnZVZpZXc7XG4gICAgdmFyIHdhaXRJbnRlcnZhbDtcbiAgICB2YXIgd2FpdCA9IDA7XG5cbiAgICBzdGFnZVZpZXcucmVnaXN0ZXJDb21wb25lbnQodGhpcyk7XG5cbiAgICB2YXIgaXNIaWRkZW4gPSBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICAvLyBUT0RPOiB0aGUgb3JpZ2luIHBvaW50IGlzIGFuIGFwcHJveGltYXRpb24uIFNob3VsZCByZWZpbmUgdGhpc1xuICAgICAgICB2YXIgZ2xvYmFsUG9zID0gY2hpbGQudG9HbG9iYWwobmV3IFBJWEkuUG9pbnQoMCwwKSk7XG4gICAgICAgIHJldHVybiAoKGdsb2JhbFBvcy54ICsgY2hpbGQud2lkdGgpIDwgMCkgfHwgKChnbG9iYWxQb3MueSArIGNoaWxkLmhlaWdodCkgPCAwKSA7XG4gICAgfTtcblxuICAgIHRoaXMuYWRkQW5ub3RzID0gZnVuY3Rpb24oZGF0YSkge1xuXG4gICAgICAgIC8vdmFyIHRpdGxlID0gZGF0YS5jb250ZW50LmNhdGVnb3J5LmxhYmVsO1xuICAgICAgICAvL3ZhciB1c2VyID0gZGF0YS5jb250ZW50LnVzZXI7XG4gICAgICAgIC8vVGVzdCBjYXQgYW5kIGNvbG9yXG4gICAgICAgIC8vdmFyIGNvbG9yQW5ub3QgPSAweDY1QTk1NDtcbiAgICAgICAgdmFyIGNhdGVnb3J5ID0gZGF0YS5jb250ZW50LmNhdGVnb3J5LmxhYmVsLFxuICAgICAgICAgICAgdGV4dCAgICAgPSBkYXRhLmNvbnRlbnQudGV4dCxcbiAgICAgICAgICAgIHVzZXIgICAgID0gZGF0YS5jb250ZW50LnVzZXIsXG4gICAgICAgICAgICB0cyAgICAgICA9IERhdGUucGFyc2UoZGF0YS50cyksXG4gICAgICAgICAgICBjb2xvciAgICA9IGRhdGEuY29udGVudC5jb2xvciB8fCB0aGlzLmdldENvbG9yKHRzLCBkYXRhLmNvbnRlbnQuY2F0ZWdvcnkuY29kZSk7XG5cbiAgICAgICAgdGhpcy5hZGRBbm5vdChjYXRlZ29yeSwgdGV4dCwgdXNlciwgY29sb3IsIHRzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRDb2xvciA9IGZ1bmN0aW9uKHRzLCBjb2RlKSB7XG4gICAgICAgIHZhciBjb2xvcnNEZWY7XG4gICAgICAgIF8odGhpcy5hbm5vdENvbG9ycykuZWFjaFJpZ2h0KGZ1bmN0aW9uKGNkZWYpIHtcbiAgICAgICAgICAgIGlmKGNkZWYudHMgPCB0cykge1xuICAgICAgICAgICAgICAgIGNvbG9yc0RlZiA9IGNkZWYuY29sb3JzO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZXNDb2xvcjtcbiAgICAgICAgaWYoY29sb3JzRGVmKSB7XG4gICAgICAgICAgICByZXNDb2xvciA9IGNvbG9yc0RlZltjb2RlXTtcbiAgICAgICAgfVxuICAgICAgICBpZighcmVzQ29sb3IpIHtcbiAgICAgICAgICAgIHJlc0NvbG9yID0gY29sb3JzRGVmLmRlZmF1bHRDb2xvciB8fCBERUZBVUxUX0FOTk9UX0NPTE9SO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNDb2xvcjtcbiAgICB9O1xuXG4gICAgdGhpcy5hZGRBbm5vdCA9IGZ1bmN0aW9uKGNhdGVnb3J5LCB0ZXh0LCB1c2VyLCBjb2xvciwgdHMpe1xuXG4gICAgICAgIHZhciB4ID0gMDtcbiAgICAgICAgdmFyIHkgPSAodHMtdGhpcy5zdGFydFRzKSAqIHRoaXMucGl4ZWxzUGVyU2Vjb25kIC8gMTAwMCArIHlJbml0O1xuXG4gICAgICAgIHZhciBjb2xvckhleCA9IHBhcnNlSW50KGNvbG9yLnJlcGxhY2UoL14jLywgJycpLCAxNik7XG5cbiAgICAgICAgaWYgKHdhaXQgPT09IDApe1xuXHQgICAgICAgIHZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKClcblx0ICAgICAgICAgICAgLmJlZ2luRmlsbChjb2xvckhleClcblx0ICAgICAgICAgICAgLmRyYXdSZWN0KHgsIHksIDEwLCAzKVxuXHQgICAgICAgICAgICAuZW5kRmlsbCgpO1xuXG5cdCAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuXG5cdCAgICAgICAgdmFyIHRleHRIZWlnaHQgPSAwO1xuXHQgICAgICAgIHZhciBjYXRMYWJlbCA9IG5ldyBQSVhJLlRleHQoXG5cdCAgICAgICAgICAgIGNhdGVnb3J5LFxuXHQgICAgICAgICAgICBfKGFubm90U3R5bGVzLmxhYmVsKS5leHRlbmQoe2ZpbGw6IGNvbG9yfSkudmFsdWUoKVxuXHQgICAgICAgICk7XG5cdCAgICAgICAgY2F0TGFiZWwueCA9IHggKyBtYXJnaW5YO1xuXHQgICAgICAgIGNhdExhYmVsLnkgPSB5IC0gMjM7XG5cdCAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoY2F0TGFiZWwpO1xuXHQgICAgICAgIHRleHRIZWlnaHQgKz0gKGNhdExhYmVsLmhlaWdodCAtIDIzICsgMik7XG5cblx0ICAgICAgICBpZih0ZXh0KSB7XG5cdCAgICAgICAgICAgIHZhciBjYXRUZXh0ID0gbmV3IFBJWEkuVGV4dCh0ZXh0LCBhbm5vdFN0eWxlcy50ZXh0KTtcblx0ICAgICAgICAgICAgY2F0VGV4dC54ID0geCArIG1hcmdpblg7XG5cdCAgICAgICAgICAgIGNhdFRleHQueSA9IHkgKyB0ZXh0SGVpZ2h0O1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChjYXRUZXh0KTtcblx0ICAgICAgICAgICAgdGV4dEhlaWdodCArPSAoY2F0VGV4dC5oZWlnaHQgKyAyKTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICB2YXIgY2F0VXNlciA9IG5ldyBQSVhJLlRleHQodXNlciwgYW5ub3RTdHlsZXMudXNlcik7XG5cdCAgICAgICAgY2F0VXNlci54ID0geCArIG1hcmdpblg7XG5cdCAgICAgICAgY2F0VXNlci55ID0geSArIHRleHRIZWlnaHQ7XG5cdCAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoY2F0VXNlcik7XG5cdCAgICAgICAgdGV4dEhlaWdodCArPSAoY2F0VXNlci5oZWlnaHQgKyA4KTtcblxuXHQgICAgICAgIGlmICh0aGlzLmlnbm9yZUFubm90cyA9PT0gdHJ1ZSl7XG5cdFx0ICAgICAgICB3YWl0ID0gdGV4dEhlaWdodCAvIHRoaXMucGl4ZWxzUGVyU2Vjb25kO1xuXHRcdCAgICAgICAgd2FpdEludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7X3RoaXMucmVmcmVzaFdhaXQoKTt9LCAxMDAwKTtcblx0ICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZEFubm90TGluZShjb2xvckhleCwgeSk7XG4gICAgfTtcblxuICAgIHRoaXMuYWRkQW5ub3RMaW5lID0gZnVuY3Rpb24oY29sb3IsIHkpIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLndpZHRoUm9sbDtcblxuXG4gICAgICAgIHZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKClcbiAgICAgICAgICAgIC5iZWdpbkZpbGwoY29sb3IpXG4gICAgICAgICAgICAuZHJhd1JlY3QoeCwgeSwgdGhpcy53aWR0aCAtIHgsIDMpXG4gICAgICAgICAgICAuZW5kRmlsbCgpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGdyYXBoaWNzKTtcbiAgICB9O1xuXG4gICAgdGhpcy5tb3ZlVG8gPSBmdW5jdGlvbihkaWZmVGltZSl7XG4gICAgXHR0aGlzLmNvbnRhaW5lci55ID0gTWF0aC5mbG9vcihkaWZmVGltZSp0aGlzLnBpeGVsc1BlclNlY29uZCk7XG4gICAgfTtcblxuICAgIHRoaXMubW92ZSA9IHRoaXMucmVmcmVzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGlmZiA9ICh0aGlzLnN0YXJ0VHMgLSBEYXRlLm5vdygpKS8xMDAwO1xuICAgICAgICB0aGlzLm1vdmVUbyhkaWZmKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZWZyZXNoV2FpdCA9IGZ1bmN0aW9uKCl7XG4gICAgXHR3YWl0IC09IDE7XG4gICAgXHRpZiAod2FpdCA8IDApe1xuICAgIFx0XHR3YWl0ID0gMDtcbiAgICBcdFx0Y2xlYXJJbnRlcnZhbCh3YWl0SW50ZXJ2YWwpO1xuICAgIFx0fVxuICAgIH07XG5cbiAgICB0aGlzLnJlbW92ZVBhc3NlZE9iamV0cyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBjaGlsZHJlblRvUmVtb3ZlID0gW107XG4gICAgICAgIF8oX3RoaXMuY29udGFpbmVyLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mKGNoaWxkKSA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICAoaXNIaWRkZW4oY2hpbGQpICYmIGNoaWxkcmVuVG9SZW1vdmUucHVzaChjaGlsZCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2hpbGRyZW5Ub1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgICAgICBfdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgd3MubWVzc2FnZShmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICBfdGhpcy5hZGRBbm5vdHMoZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuXG4gICAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZighc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW5JbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgX3RoaXMucmVtb3ZlUGFzc2VkT2JqZXRzKCk7IH0sIDEwMDAgKiB0aGlzLmhlaWdodCAvIHRoaXMucGl4ZWxzUGVyU2Vjb25kICk7XG4gICAgICAgIGlmKCFleHRlcm5hbFJlZnJlc2gpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7X3RoaXMubW92ZSgpO30sIDEwMDAvdGhpcy5mcmFtZXJhdGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuY2xlYW5JbnRlcnZhbCk7XG4gICAgICAgIGlmKCFleHRlcm5hbFJlZnJlc2gpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWZyZXNoSW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgfTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBBbm5vdHNSb2xsOiBBbm5vdHNSb2xsLFxufTtcbiIsIi8qKlxuKiBqcy9hbm5vdHN0aW1lbGluZVxuKlxuKiBhbm5vdHN0aW1lbGluZSBiYXNpYyBjb21wb25lbnRcbipcbiovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFBJWEkgPSByZXF1aXJlKCdwaXhpJyk7XG52YXIgVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzLmpzJyk7XG52YXIgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuXG52YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgbG9nZ2VyOiB1bmRlZmluZWQsXG4gICAgaW50ZXJ2YWxXaWR0aDogMTAsXG4gICAgaW50ZXJ2YWxIZWlnaHQ6IDUsXG4gICAgbWF4Q2VsbEhlaWdodDogMjAwLFxuICAgIHJhZGl1czogMzAwLFxuICAgIHNlcnZlclVybDogJ2h0dHA6Ly8xMjcuMC4wLjE6ODA4MCcsXG4gICAgY2hhbm5lbDogJ0FOTk9UJyxcbiAgICBtYXhQYWdlczogMTAwMCxcbiAgICBzaG93Q2xvY2tHcmFwaGljczogdHJ1ZSxcbiAgICBhcmNoaXZlOiBmYWxzZVxufTtcblxuXG5mdW5jdGlvbiBBbm5vdHNUaW1lTGluZShvcHRpb25zKXtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBvcHRzID0gXyhvcHRpb25zKS5kZWZhdWx0cyhkZWZhdWx0T3B0aW9ucykudmFsdWUoKTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFBJWEkuRGlzcGxheU9iamVjdENvbnRhaW5lcigpO1xuICAgIHRoaXMuY29udGFpbmVyLnggPSBvcHRzLnhJbml0O1xuICAgIHRoaXMuY29udGFpbmVyLnkgPSBvcHRzLnlJbml0O1xuICAgIHRoaXMuY29udGFpbmVyLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICB0aGlzLmNvbnRhaW5lci5oZWlnaHQgPSBvcHRzLmhlaWdodDtcblxuICAgIHRoaXMudGltZUJlZ2luID0gb3B0cy50aW1lQmVnaW47XG4gICAgdGhpcy50aW1lRW5kID0gb3B0cy50aW1lRW5kO1xuICAgIHRoaXMuZHVyYXRpb24gPSAodGhpcy50aW1lRW5kIC0gdGhpcy50aW1lQmVnaW4pLzEwMDA7XG4gICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBvcHRzLmhlaWdodDtcbiAgICB0aGlzLmludGVydmFsSGVpZ2h0ID0gb3B0cy5pbnRlcnZhbEhlaWdodDtcbiAgICB0aGlzLmludGVydmFsV2lkdGggPSBvcHRzLmludGVydmFsV2lkdGg7XG4gICAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gb3B0cy5tYXhDZWxsSGVpZ2h0O1xuICAgIHRoaXMuYW5ub3RDYXRlZ29yaWVzID0gb3B0cy5hbm5vdENhdGVnb3JpZXM7XG4gICAgdGhpcy5zdGFydFRzID0gb3B0aW9ucy5zdGFydFRzIHx8IERhdGUubm93KCk7XG4gICAgdGhpcy5zaG93Q2xvY2tHcmFwaGljcyA9IG9wdHMuc2hvd0Nsb2NrR3JhcGhpY3M7XG4gICAgdGhpcy5hcmNoaXZlID0gb3B0cy5hcmNoaXZlO1xuXG4gICAgdGhpcy5jaXJjbGVYID0gb3B0cy5jaXJjbGVYIHx8ICh0aGlzLndpZHRoLzIpO1xuICAgIHRoaXMuY2lyY2xlWSA9IG9wdHMuY2lyY2xlWSB8fCAodGhpcy5oZWlnaHQvMik7XG4gICAgdGhpcy5yYWRpdXMgPSBvcHRzLnJhZGl1cztcbiAgICB2YXIgcGVyaW1ldGVyID0gMipNYXRoLlBJKiB0aGlzLnJhZGl1cztcbiAgICB0aGlzLmludGVydmFsRHVyYXRpb24gPSAodGhpcy5pbnRlcnZhbFdpZHRoICogdGhpcy5kdXJhdGlvbiAvIHBlcmltZXRlcik7XG5cbiAgICB2YXIgY2hhbm5lbCA9IG9wdHMuY2hhbm5lbDtcbiAgICB2YXIgZXZlbnRDb2RlID0gb3B0cy5ldmVudENvZGU7XG4gICAgdmFyIHNlcnZlclVybCA9IG9wdHMuc2VydmVyVXJsO1xuICAgIHZhciBtYXhQYWdlcyA9IG9wdHMubWF4UGFnZXM7XG5cbiAgICB2YXIgdG90YWxJbmRleCA9IE1hdGguZmxvb3IoIHBlcmltZXRlci90aGlzLmludGVydmFsV2lkdGgpO1xuXG4gICAgdGhpcy5jZWxscyA9IFtdO1xuICAgIGZvciAodmFyIGk9MDsgaTwocGVyaW1ldGVyL3RoaXMuaW50ZXJ2YWxXaWR0aCkgOyBpKyspe1xuICAgICAgICB0aGlzLmNlbGxzW2ldID0gW107XG4gICAgICAgIHRoaXMuY2VsbHNbaV0uaSA9IGk7XG4gICAgICAgIHRoaXMuY2VsbHNbaV0udG90YWxBbm5vdHMgPSAwO1xuICAgICAgICB0aGlzLmNlbGxzW2ldLmNhdGVnb3JpZXMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgd3MgPSBvcHRzLndzO1xuICAgIHZhciBzdGFnZVZpZXcgPSBvcHRzLnN0YWdlVmlldztcblxuICAgIC8vZHJhdyB0aGUgYmFzZSAtIGNpcmNsZSBhbmQgbGluZSB0byBsb2NhdGUgdGhlIHNjZW5lXG4gICAgdmFyIGdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICBncmFwaGljcy5saW5lU3R5bGUoMiwgMHg2NDY0NjQpXG4gICAgICAgIC5kcmF3Q2lyY2xlKHRoaXMuY2lyY2xlWCwgdGhpcy5jaXJjbGVZLCB0aGlzLnJhZGl1cyAtIDMpXG4gICAgICAgIC5lbmRGaWxsKCk7XG4gICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuXG4gICAgc3RhZ2VWaWV3LnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xuXG4gICAgdmFyIGxvYWRBcmNoaXZlcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvL3N0YXJ0IHRpbWVCZWdpbiBlbmQgc3RhcnRUaW1lXG4gICAgICAgIC8vcXVlcnkgLT4gbmVlZCBjaGFubmVsICsgZXZlbnRDb2RlXG4gICAgICAgIC8vaXRlcmF0ZSBvdmVyIGRhdGEgZmlsbCBjZWxsc1xuICAgICAgICB2YXIgc3RhcnRUcyA9IF90aGlzLnRpbWVCZWdpbjtcbiAgICAgICAgdmFyIGVuZFRzID0gTWF0aC5taW4oX3RoaXMudGltZUVuZCxfdGhpcy5zdGFydFRzKTtcblxuICAgICAgICB2YXIgdXJsID0gc2VydmVyVXJsICsgJy9wL2FwaS92MS9hbm5vdGF0aW9uJztcbiAgICAgICAgdmFyIGZpbHRlcnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICd0cycsIG9wOiAnPicsIHZhbDogbmV3IERhdGUoc3RhcnRUcykudG9JU09TdHJpbmcoKX0sIC8vc3RhcnRcbiAgICAgICAgICAgIHsgbmFtZTogJ3RzJywgb3A6ICc8PScsIHZhbDogbmV3IERhdGUoZW5kVHMpLnRvSVNPU3RyaW5nKCl9LCAvL2VuZFxuICAgICAgICAgICAgeyBuYW1lOiAnY2hhbm5lbCcsIG9wOiAnPT0nLCB2YWw6IGNoYW5uZWx9LCAvL2NoYW5uZWxcbiAgICAgICAgICAgIHsgbmFtZTogJ2V2ZW50X2NvZGUnLCBvcDogJz09JywgdmFsOiBldmVudENvZGV9IC8vZXZlbnRjb2RlXG4gICAgICAgIF07XG5cbiAgICAgICAgdXJsID0gdXJsICsgJz9xPScgKyBKU09OLnN0cmluZ2lmeSh7ZmlsdGVyczpmaWx0ZXJzfSk7XG5cbiAgICAgICAgdmFyIHRvdGFsUGFnZSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50UGFnZSA9IDE7XG5cbiAgICAgICAgdmFyIHByb2Nlc3NSZXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlJFUyBhcmNoaXZlXCIsIHJlcyk7XG4gICAgICAgICAgICBpZihyZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcy50YXJnZXQuanNvbjtcbiAgICAgICAgICAgICAgICAvKmpzaGludCAtVzA2OSAqL1xuICAgICAgICAgICAgICAgIHRvdGFsUGFnZSA9IE1hdGgubWluKG1heFBhZ2VzLHBhcnNlSW50KGRhdGFbJ3RvdGFsX3BhZ2VzJ10pKTtcbiAgICAgICAgICAgICAgICBkYXRhLm9iamVjdHMuZm9yRWFjaChmdW5jdGlvbihhbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZEFubm90KGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoY3VycmVudFBhZ2UgPD0gdG90YWxQYWdlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGpzb25Mb2FkZXIgPSBuZXcgUElYSS5Kc29uTG9hZGVyKHVybCsnJnBhZ2U9JytjdXJyZW50UGFnZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAganNvbkxvYWRlci5vbignbG9hZGVkJywgcHJvY2Vzc1Jlc0Z1bmN0aW9uKTtcbiAgICAgICAgICAgICAgICBqc29uTG9hZGVyLmxvYWQoKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGFnZSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzUmVzRnVuY3Rpb24oKTtcblxuICAgIH07XG5cbiAgICAvL0FkZCBBbm5vdGF0aW9uIHRvIHRoZSBUaW1lTGluZVxuICAgIHRoaXMuYWRkQW5ub3QgPSBmdW5jdGlvbihkYXRhKXtcblxuICAgICAgICB2YXIgdHMgPSBEYXRlLnBhcnNlKGRhdGEudHMpO1xuICAgICAgICB2YXIgY29sb3JzRGVmO1xuICAgICAgICBfKHRoaXMuYW5ub3RDYXRlZ29yaWVzKS5lYWNoUmlnaHQoZnVuY3Rpb24oY2RlZikge1xuICAgICAgICAgICAgaWYoY2RlZi50cyA8IHRzKSB7XG4gICAgICAgICAgICAgICAgY29sb3JzRGVmID0gY2RlZjtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmKCFjb2xvcnNEZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRpbWVFbmQgPiB0cyl7XG4gICAgICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IoKHRzIC0gdGhpcy50aW1lQmVnaW4pLygxMDAwKnRoaXMuaW50ZXJ2YWxEdXJhdGlvbikpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mKHRoaXMuY2VsbHNbaV0uZ3JhcGhpY3MpID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0Q2VsbCh0aGlzLmNlbGxzW2ldLCBjb2xvcnNEZWYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYW5ub3RDb2RlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihjb2xvcnNEZWYuY29sb3JzW2RhdGEuY29udGVudC5jYXRlZ29yeS5jb2RlXSkgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICBhbm5vdENvZGUgPSBkYXRhLmNvbnRlbnQuY2F0ZWdvcnkuY29kZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5ub3RDb2RlID0gJ2RlZmF1bHQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNlbGxzW2ldLmNhdGVnb3JpZXNbYW5ub3RDb2RlXS5jb3VudCArPSAxO1xuICAgICAgICAgICAgdGhpcy5jZWxsc1tpXS50b3RhbEFubm90cyArPTE7XG4gICAgICAgICAgICB0aGlzLnJlZHJhd0NlbGwodGhpcy5jZWxsc1tpXSwgY29sb3JzRGVmKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXRDbG9ja0dyYXBoaWNzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB0QmVnID0gbmV3IFBJWEkuVGV4dChVdGlscy5mb3JtYXRUaW1lKHRoaXMudGltZUJlZ2luKSwgeyBmb250OiAnMTJwdCBHb3RoaWMgU3RhbmRhcmQnLCBmaWxsOiAnIzY0NjQ2NCcgfSk7XG4gICAgICAgIHRCZWcueCA9IHRoaXMuY2lyY2xlWCArIDE1O1xuICAgICAgICB0QmVnLnkgPSB0aGlzLmNpcmNsZVkgLSB0aGlzLnJhZGl1cyAtIHRoaXMubWF4Q2VsbEhlaWdodCAtIDEwO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0QmVnKTtcblxuICAgICAgICB2YXIgdEVuZCA9IG5ldyBQSVhJLlRleHQoVXRpbHMuZm9ybWF0VGltZSh0aGlzLnRpbWVFbmQpLCB7IGZvbnQ6ICcxMnB0IEdvdGhpYyBTdGFuZGFyZCcsIGZpbGw6ICcjNjQ2NDY0JyB9KTtcbiAgICAgICAgdEVuZC54ID0gdGhpcy5jaXJjbGVYIC0gMTUgLSB0RW5kLndpZHRoO1xuICAgICAgICB0RW5kLnkgPSB0aGlzLmNpcmNsZVkgLSB0aGlzLnJhZGl1cyAtIHRoaXMubWF4Q2VsbEhlaWdodCAtIDEwO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0RW5kKTtcblxuICAgICAgICB2YXIgdDE1ID0gbmV3IFBJWEkuVGV4dChVdGlscy5mb3JtYXRUaW1lKCgodGhpcy50aW1lRW5kIC0gdGhpcy50aW1lQmVnaW4pLzQpICsgdGhpcy50aW1lQmVnaW4pLCB7IGZvbnQ6ICcxMnB0IEdvdGhpYyBTdGFuZGFyZCcsIGZpbGw6ICcjNjQ2NDY0JyB9KTtcbiAgICAgICAgdDE1LnggPSB0aGlzLmNpcmNsZVggKyB0aGlzLnJhZGl1cyArIHRoaXMubWF4Q2VsbEhlaWdodCArIDEwIDtcbiAgICAgICAgdDE1LnkgPSB0aGlzLmNpcmNsZVkgLSB0MTUuaGVpZ2h0O1xuICAgICAgICB0MTUucm90YXRpb24gPSBNYXRoLlBJIC8yO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0MTUpO1xuXG4gICAgICAgIHZhciB0MzAgPSBuZXcgUElYSS5UZXh0KFV0aWxzLmZvcm1hdFRpbWUoKCh0aGlzLnRpbWVFbmQgLSB0aGlzLnRpbWVCZWdpbikvMikgKyB0aGlzLnRpbWVCZWdpbiksIHsgZm9udDogJzEycHQgR290aGljIFN0YW5kYXJkJywgZmlsbDogJyM2NDY0NjQnIH0pO1xuICAgICAgICB0MzAueCA9IHRoaXMuY2lyY2xlWCAtIHQzMC53aWR0aC8yO1xuICAgICAgICB0MzAueSA9IHRoaXMuY2lyY2xlWSArIHRoaXMucmFkaXVzICsgdGhpcy5tYXhDZWxsSGVpZ2h0IC0gMjtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQodDMwKTtcblxuICAgICAgICB2YXIgdDQ1ID0gbmV3IFBJWEkuVGV4dChVdGlscy5mb3JtYXRUaW1lKCgodGhpcy50aW1lRW5kIC0gdGhpcy50aW1lQmVnaW4pKjMvNCkgKyB0aGlzLnRpbWVCZWdpbiksIHsgZm9udDogJzEycHQgR290aGljIFN0YW5kYXJkJywgZmlsbDogJyM2NDY0NjQnIH0pO1xuICAgICAgICB0NDUueCA9IHRoaXMuY2lyY2xlWCAtIHRoaXMucmFkaXVzIC0gdGhpcy5tYXhDZWxsSGVpZ2h0IC0gMTAgO1xuICAgICAgICB0NDUueSA9IHRoaXMuY2lyY2xlWSArIHQxNS5oZWlnaHQ7XG4gICAgICAgIHQ0NS5yb3RhdGlvbiA9IC1NYXRoLlBJLzI7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKHQ0NSk7XG5cbiAgICAgICAgdmFyIGxpbmVWID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICAgICAgbGluZVYubGluZVN0eWxlKDEsIDB4NjQ2NDY0KVxuICAgICAgICAgICAgLm1vdmVUbyh0aGlzLmNpcmNsZVgsIHRoaXMuY2lyY2xlWSAtICh0aGlzLnJhZGl1cy8zKS8yKVxuICAgICAgICAgICAgLmxpbmVUbyh0aGlzLmNpcmNsZVgsIHRoaXMuY2lyY2xlWSAtIHRoaXMucmFkaXVzIC0gdGhpcy5tYXhDZWxsSGVpZ2h0IC0gMTApXG4gICAgICAgICAgICAuZW5kRmlsbCgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChsaW5lVik7XG4gICAgfTtcblxuICAgIC8vRHJhdyB0aGUgY2VsbHVsZVxuICAgIHRoaXMucmVkcmF3Q2VsbCA9IGZ1bmN0aW9uKGNlbGwsIGNvbG9yc0RlZil7XG4gICAgICAgIHZhciB5ID0gMDtcblxuICAgICAgICAvL0NoZWNrIGlmIHRvdGFsIGhlaWdodCBpcyBoaWdoZXIgdGhhbiBNYXggQ2VsbCBIZWlnaHRcbiAgICAgICAgdmFyIGhlaWdodFN0ZXA7XG4gICAgICAgIGlmICgoY2VsbC50b3RhbEFubm90cyp0aGlzLmludGVydmFsSGVpZ2h0KSA+IHRoaXMubWF4Q2VsbEhlaWdodCl7XG4gICAgICAgICAgICBoZWlnaHRTdGVwID0gdGhpcy5tYXhDZWxsSGVpZ2h0L2NlbGwudG90YWxBbm5vdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWlnaHRTdGVwID0gdGhpcy5pbnRlcnZhbEhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vRHJhdyB0aGUgcmVjdCBkZXBlbmRpbmcgb24gdGhlIGhlaWdodCBzdGVwIGNhbGN1bGF0ZWRcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPCBjb2xvcnNEZWYub3JkZXIubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRDb2RlID0gY29sb3JzRGVmLm9yZGVyW2ldO1xuICAgICAgICAgICAgY2VsbC5ncmFwaGljcy5iZWdpbkZpbGwoY2VsbC5jYXRlZ29yaWVzW2N1cnJlbnRDb2RlXS5jb2xvci5yZXBsYWNlKCcjJywgJzB4JykpXG4gICAgICAgICAgICAgICAgLmRyYXdSZWN0KDAsIHksIHRoaXMuaW50ZXJ2YWxXaWR0aC0xLCAtY2VsbC5jYXRlZ29yaWVzW2N1cnJlbnRDb2RlXS5jb3VudCAqIGhlaWdodFN0ZXApXG4gICAgICAgICAgICAgICAgLmVuZEZpbGwoKTtcbiAgICAgICAgICAgIHkgLT0gY2VsbC5jYXRlZ29yaWVzW2N1cnJlbnRDb2RlXS5jb3VudCpoZWlnaHRTdGVwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaW5pdENlbGwgPSBmdW5jdGlvbihjZWxsLCBjb2xvcnNEZWYpe1xuICAgICAgICBjZWxsLmdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICAgICAgY2VsbC5ncmFwaGljcy5wb3NpdGlvbi54ID0gdGhpcy5jaXJjbGVYICsgdGhpcy5yYWRpdXMgKiBNYXRoLnNpbihjZWxsLmkqKDM2MC90b3RhbEluZGV4KSooTWF0aC5QSS8xODApKTtcbiAgICAgICAgY2VsbC5ncmFwaGljcy5wb3NpdGlvbi55ID0gdGhpcy5jaXJjbGVZIC0gdGhpcy5yYWRpdXMgKiBNYXRoLmNvcyhjZWxsLmkqKDM2MC90b3RhbEluZGV4KSooTWF0aC5QSS8xODApKTtcbiAgICAgICAgY2VsbC5ncmFwaGljcy5yb3RhdGlvbiA9IChjZWxsLmkpKigzNjAvdG90YWxJbmRleCkqKE1hdGguUEkvMTgwKSArICgzNjAvKHRvdGFsSW5kZXgqMikpKihNYXRoLlBJLzE4MCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNlbGwuZ3JhcGhpY3MpO1xuXG4gICAgICAgIGZvciAodmFyIGNhdGVnb3J5IGluIGNvbG9yc0RlZi5jb2xvcnMpe1xuICAgICAgICAgICAgY2VsbC5jYXRlZ29yaWVzW2NhdGVnb3J5XSA9IHtcbiAgICAgICAgICAgICAgICAnY291bnQnOiAwLFxuICAgICAgICAgICAgICAgICdjb2xvcic6IGNvbG9yc0RlZi5jb2xvcnNbY2F0ZWdvcnldXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YoY2VsbC5jYXRlZ29yaWVzWydkZWZhdWx0J10pID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICBjZWxsLmNhdGVnb3JpZXNbJ2RlZmF1bHQnXSA9IHtcbiAgICAgICAgICAgICAgICAnY291bnQnOiAwLFxuICAgICAgICAgICAgICAgICdjb2xvcic6IGNvbG9yc0RlZi5kZWZhdWx0Q29sb3JcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5hcmNoaXZlKXtcbiAgICAgICAgICAgIHdzLm1lc3NhZ2UoZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgIF90aGlzLmFkZEFubm90KGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zaG93Q2xvY2tHcmFwaGljcyl7dGhpcy5pbml0Q2xvY2tHcmFwaGljcygpO31cbiAgICB9O1xuXG5cbiAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc3RhcnRUcyA9IERhdGUubm93KCk7XG4gICAgICAgIGxvYWRBcmNoaXZlcygpO1xuICAgIH07XG5cbiAgICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblxuICAgIH07XG5cbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpe1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQW5ub3RzVGltZUxpbmU6IEFubm90c1RpbWVMaW5lXG59O1xuIiwiLyoqXG4qIGpzL2Fubm90c3ZpenZpZXcuanNcbipcbiogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgYXBwbGljYXRpb24uXG4qIFRha2UgYSBsb29rIGF0IGh0dHA6Ly9icm93c2VyaWZ5Lm9yZy8gZm9yIG1vcmUgaW5mb1xuKlxuKi9cbi8qanNoaW50IHVudXNlZDogZmFsc2UgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG52YXIgRG91YmxlUm9sbCA9IHJlcXVpcmUoJy4vZG91Ymxlcm9sbC5qcycpO1xudmFyIEFubm90c1RpbWVMaW5lID0gcmVxdWlyZSgnLi9hbm5vdHN0aW1lbGluZS5qcycpO1xudmFyIEFubm90c1JvbGwgPSByZXF1aXJlKCcuL2Fubm90c3JvbGwuanMnKTtcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMuanMnKTtcblxudmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHhJbml0OiAwLFxuICAgIHlJbml0OiAwLFxuICAgIHdpZHRoOiAxMDI0LFxuICAgIGhlaWdodDogNzY4XG59O1xuXG5mdW5jdGlvbiBBbm5vdHNWaXpWaWV3KG9wdGlvbnMpe1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIG9wdHMgPSBfKG9wdGlvbnMpLmRlZmF1bHRzKGRlZmF1bHRPcHRpb25zKS52YWx1ZSgpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgUElYSS5EaXNwbGF5T2JqZWN0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5jb250YWluZXIueCA9IG9wdHMueEluaXQ7XG4gICAgdGhpcy5jb250YWluZXIueSA9IG9wdHMueUluaXQ7XG4gICAgdGhpcy53aWR0aCA9IG9wdHMud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQ9IG9wdHMuaGVpZ2h0O1xuICAgIHRoaXMudGltZUJlZ2luID0gb3B0cy50aW1lQmVnaW47XG4gICAgdGhpcy50aW1lRW5kID0gb3B0cy50aW1lRW5kO1xuXG4gICAgdGhpcy5hbm5vdENhdGVnb3JpZXMgPSBbXTtcbiAgICB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTIgPSBbXTtcbiAgICB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTEgPSBbXTtcblxuICAgIHZhciB3c1BpYW5vcm9sbCA9IG9wdHMud3NQaWFub3JvbGw7XG4gICAgdmFyIHdzQW5ub3QgPSBvcHRzLndzQW5ub3Q7XG4gICAgdmFyIHN0YWdlVmlldyA9IG9wdHMuc3RhZ2VWaWV3O1xuICAgIHZhciBjaGFubmVsID0gb3B0cy5jaGFubmVsO1xuICAgIHZhciBzZXJ2ZXJVcmwgPSBvcHRzLnNlcnZlclVybDtcblxuICAgIHZhciBldmVudENvZGUgPSBvcHRzLmV2ZW50Q29kZTtcbiAgICB2YXIgZXZlbnRDb2RlU2Vzc2lvbkRheTIgPSBvcHRzLmV2ZW50Q29kZVNlc3Npb25EYXkyO1xuXHR2YXIgZXZlbnRDb2RlU2Vzc2lvbkRheTEgPSBvcHRzLmV2ZW50Q29kZVNlc3Npb25EYXkxO1xuICAgIHZhciBsb2dnZXIgPSBvcHRzLmxvZ2dlcjtcblxuXHRVdGlscy5nZXRBbm5vdENhdGVnb3JpZXMob3B0cy51cmxDYXRlZ29yaWVzICsgZXZlbnRDb2RlLCB0aGlzLmFubm90Q2F0ZWdvcmllcyk7XG4gICAgVXRpbHMuZ2V0QW5ub3RDYXRlZ29yaWVzKG9wdHMudXJsQ2F0ZWdvcmllcyArIGV2ZW50Q29kZVNlc3Npb25EYXkyLCB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTIpO1xuICAgIFV0aWxzLmdldEFubm90Q2F0ZWdvcmllcyhvcHRzLnVybENhdGVnb3JpZXMgKyBldmVudENvZGVTZXNzaW9uRGF5MSwgdGhpcy5hbm5vdENhdGVnb3JpZXNEYXkxKTtcblxuICAgIHN0YWdlVmlldy5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcblxuICAgIHZhciBjdXJyZW50RGF5ID0gbmV3IEFubm90c1RpbWVMaW5lLkFubm90c1RpbWVMaW5lKHtcbiAgICBcdHN0YWdlVmlldyA6IHN0YWdlVmlldyxcbiAgICAgICAgbG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgIHdzOiB3c0Fubm90LFxuICAgICAgICB4SW5pdDogMCxcbiAgICAgICAgeUluaXQ6IDAsXG4gICAgICAgIHdpZHRoOiAxMDI0IC0gMjAwIC0gMjAwLFxuICAgICAgICBoZWlnaHQ6IDc2OC0yMDAsXG4gICAgICAgIHRpbWVCZWdpbjogdGhpcy50aW1lQmVnaW4sXG4gICAgICAgIHRpbWVFbmQ6IHRoaXMudGltZUVuZCxcbiAgICAgICAgaW50ZXJ2YWxXaWR0aDogNixcbiAgICAgICAgaW50ZXJ2YWxIZWlnaHQ6IDEwLFxuICAgICAgICBtYXhDZWxsSGVpZ2h0OiA3MCxcbiAgICAgICAgcmFkaXVzOiAyMDAsXG4gICAgICAgIGV2ZW50Q29kZTogZXZlbnRDb2RlLFxuICAgICAgICBjaGFubmVsOiBjaGFubmVsLFxuICAgICAgICBzZXJ2ZXJVcmw6IHNlcnZlclVybCxcbiAgICAgICAgYW5ub3RDYXRlZ29yaWVzOiB0aGlzLmFubm90Q2F0ZWdvcmllc1xuICAgIH0pO1xuXG5cdC8vQXJjaGl2ZSBkYXkgMlxuICAgIHZhciB0aW1lTGluZURheTIgPSBuZXcgQW5ub3RzVGltZUxpbmUuQW5ub3RzVGltZUxpbmUoe1xuICAgIFx0c3RhZ2VWaWV3IDogc3RhZ2VWaWV3LFxuICAgICAgICB4SW5pdDogMCxcbiAgICAgICAgeUluaXQ6IDAsXG4gICAgICAgIHdpZHRoOiAxMDI0IC0gMjAwIC0gMjAwLFxuICAgICAgICBoZWlnaHQ6IDc2OC0yMDAsXG4gICAgICAgIHRpbWVCZWdpbjogRGF0ZS5wYXJzZSgnMjAxNS0wMS0yM1QwOTozMDowMCswMTowMCcpLFxuICAgICAgICB0aW1lRW5kOiBEYXRlLnBhcnNlKCcyMDE1LTAxLTIzVDE4OjMwOjAwKzAxOjAwJyksXG4gICAgICAgIGNpcmNsZVg6IGN1cnJlbnREYXkuY2lyY2xlWCxcbiAgICAgICAgY2lyY2xlWTogY3VycmVudERheS5jaXJjbGVZLFxuICAgICAgICBpbnRlcnZhbFdpZHRoOiAoY3VycmVudERheS5yYWRpdXMqMi8zKSogY3VycmVudERheS5pbnRlcnZhbFdpZHRoIC8gY3VycmVudERheS5yYWRpdXMsXG4gICAgICAgIGludGVydmFsSGVpZ2h0OiAoY3VycmVudERheS5pbnRlcnZhbEhlaWdodCAqIChjdXJyZW50RGF5LnJhZGl1cyAtIGN1cnJlbnREYXkucmFkaXVzKjIvMykpLyBjdXJyZW50RGF5Lm1heENlbGxIZWlnaHQsXG4gICAgICAgIG1heENlbGxIZWlnaHQ6IChjdXJyZW50RGF5LnJhZGl1cyAtIGN1cnJlbnREYXkucmFkaXVzKjIvMykvMixcbiAgICAgICAgcmFkaXVzOiBjdXJyZW50RGF5LnJhZGl1cyoyLzMsXG4gICAgICAgIGFubm90Q2F0ZWdvcmllczogdGhpcy5hbm5vdENhdGVnb3JpZXNEYXkyLFxuICAgICAgICBldmVudENvZGU6IGV2ZW50Q29kZVNlc3Npb25EYXkyLFxuICAgICAgICBjaGFubmVsOiBjaGFubmVsLFxuICAgICAgICBzZXJ2ZXJVcmw6IHNlcnZlclVybCxcbiAgICAgICAgc2hvd0Nsb2NrR3JhcGhpY3M6ZmFsc2UsXG4gICAgICAgIGFyY2hpdmU6IHRydWVcbiAgICB9KTtcblxuXHQvL0FyY2hpdmUgZGF5IDFcbiAgICB2YXIgdGltZUxpbmVEYXkxID0gbmV3IEFubm90c1RpbWVMaW5lLkFubm90c1RpbWVMaW5lKHtcbiAgICBcdHN0YWdlVmlldyA6IHN0YWdlVmlldyxcbiAgICAgICAgeEluaXQ6IDAsXG4gICAgICAgIHlJbml0OiAwLFxuICAgICAgICB3aWR0aDogMTAyNCAtIDIwMCAtIDIwMCxcbiAgICAgICAgaGVpZ2h0OiA3NjgtMjAwLFxuICAgICAgICB0aW1lQmVnaW46IERhdGUucGFyc2UoJzIwMTUtMDEtMjJUMDk6MzA6MDArMDE6MDAnKSxcbiAgICAgICAgdGltZUVuZDogRGF0ZS5wYXJzZSgnMjAxNS0wMS0yMlQxODozMDowMCswMTowMCcpLFxuICAgICAgICBjaXJjbGVYOiBjdXJyZW50RGF5LmNpcmNsZVgsXG4gICAgICAgIGNpcmNsZVk6IGN1cnJlbnREYXkuY2lyY2xlWSxcbiAgICAgICAgaW50ZXJ2YWxXaWR0aDogKGN1cnJlbnREYXkucmFkaXVzKjIvMykqIGN1cnJlbnREYXkuaW50ZXJ2YWxXaWR0aCAvIGN1cnJlbnREYXkucmFkaXVzLFxuICAgICAgICBpbnRlcnZhbEhlaWdodDogKGN1cnJlbnREYXkuaW50ZXJ2YWxIZWlnaHQgKiAoY3VycmVudERheS5yYWRpdXMgLSBjdXJyZW50RGF5LnJhZGl1cy8zKSkvIGN1cnJlbnREYXkubWF4Q2VsbEhlaWdodCxcbiAgICAgICAgbWF4Q2VsbEhlaWdodDogKGN1cnJlbnREYXkucmFkaXVzKjIvMyAtIGN1cnJlbnREYXkucmFkaXVzLzMpLzQsXG4gICAgICAgIHJhZGl1czogY3VycmVudERheS5yYWRpdXMvMyxcbiAgICAgICAgYW5ub3RDYXRlZ29yaWVzOiB0aGlzLmFubm90Q2F0ZWdvcmllc0RheTEsXG4gICAgICAgIGV2ZW50Q29kZTogZXZlbnRDb2RlU2Vzc2lvbkRheTEsXG4gICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgIHNlcnZlclVybDogc2VydmVyVXJsLFxuICAgICAgICBzaG93Q2xvY2tHcmFwaGljczpmYWxzZSxcbiAgICAgICAgYXJjaGl2ZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHZhciBjdXJyZW50VGltZVRleHQgPSBuZXcgUElYSS5UZXh0KCctLSA6IC0tIDogLS0nLCB7IGZvbnQ6ICcxOHB0IEdvdGhpYyBTdGFuZGFyZCcsIGZpbGw6ICcjNjQ2NDY0JyB9KTtcbiAgICBjdXJyZW50VGltZVRleHQueCA9IHRpbWVMaW5lRGF5Mi5jaXJjbGVYIC0gY3VycmVudFRpbWVUZXh0LndpZHRoLzI7XG4gICAgY3VycmVudFRpbWVUZXh0LnkgPSB0aW1lTGluZURheTIuY2lyY2xlWSAtIGN1cnJlbnRUaW1lVGV4dC5oZWlnaHQvMjtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChjdXJyZW50VGltZVRleHQpO1xuXG5cbiAgICB2YXIgZG91YmxlUm9sbEggPSBuZXcgRG91YmxlUm9sbC5Eb3VibGVSb2xsKHtcbiAgICAgICAgc3RhZ2VWaWV3IDogc3RhZ2VWaWV3LFxuICAgICAgICBsb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgd3M6IHdzUGlhbm9yb2xsLFxuICAgICAgICB5SW5pdDogKHRoaXMuaGVpZ2h0IC0gMjAwKSxcbiAgICAgICAgc2NlbmVIZWlnaHQ6IDIwMCxcbiAgICAgICAgcGlhbm9yb2xscyA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICB0aW1lV2lkdGg6IDEwLFxuICAgICAgICAgICAgICAgIGxpbmVJbnRlcnZhbDogNTAwMCxcbiAgICAgICAgICAgICAgICBub3RlSGVpZ2h0OiAxMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgIH0pO1xuXG4gICAgdmFyIGRvdWJsZVJvbGxWID0gbmV3IERvdWJsZVJvbGwuRG91YmxlUm9sbCh7XG4gICAgICAgIHN0YWdlVmlldyA6IHN0YWdlVmlldyxcbiAgICAgICAgbG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgIHdzOiB3c1BpYW5vcm9sbCxcbiAgICAgICAgb3JpZW50YXRpb246ICd2ZXJ0aWNhbCcsXG4gICAgICAgIHNjZW5lSGVpZ2h0OiA3NjgtMjAwLFxuICAgICAgICBwaWFub3JvbGxzIDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhlaWdodDogMjAwLFxuICAgICAgICAgICAgICAgIHRpbWVXaWR0aDogNjAsXG4gICAgICAgICAgICAgICAgbGluZUludGVydmFsOiA1MDAwLFxuICAgICAgICAgICAgICAgIG5vdGVIZWlnaHQ6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfSk7XG5cbiAgICB2YXIgYW5ub3RzUm9sbCA9IG5ldyBBbm5vdHNSb2xsLkFubm90c1JvbGwoe1xuICAgICAgICBzdGFnZVZpZXcgOiBzdGFnZVZpZXcsXG4gICAgICAgIGxvZ2dlcjogbG9nZ2VyLFxuICAgICAgICB3czogd3NBbm5vdCxcbiAgICAgICAgcGFyZW50Q29udGFpbmVyOiBkb3VibGVSb2xsVi5zdGFnZSxcbiAgICAgICAgeEluaXQ6IDEwMjQgLSAyMDAgLSAyMDAsXG4gICAgICAgIHlJbml0OiA3NjgtMjAwLFxuICAgICAgICB3aWR0aDogMjAwICsgMjAwLFxuICAgICAgICBoZWlnaHQ6IDc2OC0yMDAsXG4gICAgICAgIHdpZHRoUm9sbDogMjAwLFxuICAgICAgICBmcmFtZXJhdGU6IGRvdWJsZVJvbGxWLmZyYW1lcmF0ZSxcbiAgICAgICAgcGl4ZWxzUGVyU2Vjb25kOiBNYXRoLmZsb29yKDEwMjQgLyA2MCksXG4gICAgICAgIGFubm90Q29sb3JzOiB0aGlzLmFubm90Q2F0ZWdvcmllc1xuICAgIH0pO1xuXG4gICAgdmFyIGxpbWl0ZXJzID0gbmV3IFBJWEkuR3JhcGhpY3MoKVxuICAgICAgICAubGluZVN0eWxlKDEsIDB4NjQ2NDY0KVxuICAgICAgICAubW92ZVRvKGFubm90c1JvbGwuY29udGFpbmVyLngsIGFubm90c1JvbGwuY29udGFpbmVyLnkpXG4gICAgICAgIC5saW5lVG8oYW5ub3RzUm9sbC5jb250YWluZXIueCwgYW5ub3RzUm9sbC5jb250YWluZXIueSAtIGFubm90c1JvbGwuaGVpZ2h0KVxuICAgICAgICAubW92ZVRvKGFubm90c1JvbGwuY29udGFpbmVyLnggKyBhbm5vdHNSb2xsLndpZHRoUm9sbCwgYW5ub3RzUm9sbC5jb250YWluZXIueSlcbiAgICAgICAgLmxpbmVUbyhhbm5vdHNSb2xsLmNvbnRhaW5lci54ICsgYW5ub3RzUm9sbC53aWR0aFJvbGwsIGFubm90c1JvbGwuY29udGFpbmVyLnkgLSBhbm5vdHNSb2xsLmhlaWdodClcbiAgICAgICAgLm1vdmVUbygwLCB0aGlzLmhlaWdodCAtIDIwMClcbiAgICAgICAgLmxpbmVUbyh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCAtIDIwMClcbiAgICAgICAgLmRyYXdSZWN0KDAsIDAsIHRoaXMud2lkdGggLTEsIHRoaXMuaGVpZ2h0IC0xKVxuICAgICAgICAuYmVnaW5GaWxsKDB4RUNFQ0VDKVxuICAgICAgICAuZHJhd1JlY3QoMTAyNCAtIDIwMCwgMCwgMjAwLCA3NjgtMjAwKVxuICAgICAgICAuZW5kRmlsbCgpO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGxpbWl0ZXJzKTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKCl7XG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlVGltZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGN1cnJlbnRUaW1lVGV4dC5zZXRUZXh0KFV0aWxzLmZvcm1hdFRpbWUoRGF0ZS5ub3coKSkpO1xuICAgIH07XG5cbiAgICB2YXIgcmVmcmVzaFRpbWVJbnRlcnZhbDtcblxuICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVmcmVzaFRpbWVJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge190aGlzLnVwZGF0ZVRpbWUoKTt9LCAxMDAwKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG4gICAgfTtcblxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uKCl7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzO1xuXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIEFubm90c1ZpelZpZXc6IEFubm90c1ZpelZpZXdcbn07XG4iLCIvKipcbiogc2NyaXB0cy9kb3VibGVyb2xsLmpzXG4qXG4qIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB5b3VyIGFwcGxpY2F0aW9uLlxuKiBUYWtlIGEgbG9vayBhdCBodHRwOi8vYnJvd3NlcmlmeS5vcmcvIGZvciBtb3JlIGluZm9cbiovXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG52YXIgUGlhbm9Sb2xsID0gcmVxdWlyZSgnLi9waWFub3JvbGwnKTtcblxudmFyIGRlZmF1bHRDb25maWcgPSB7XG4gICAgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyxcbiAgICBsb2dnZXI6IHVuZGVmaW5lZCxcbiAgICBzY2VuZVdpZHRoOiAxMDI0LFxuICAgIHBpYW5vcm9sbHMgOiBbXG4gICAgICB7XG4gICAgICAgIGhlaWdodDogMzg0LFxuICAgICAgICB0aW1lV2lkdGg6IDEwLFxuICAgICAgICBsaW5lSW50ZXJ2YWw6IDUwMDAsXG4gICAgICAgIG5vdGVIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2U6IHtcbiAgICBcdFx0Ym90dG9tOiA0MCxcbiAgICBcdFx0dG9wOiA5MCxcbiAgICAgICAgfSxcbiAgICAgICAgZHluYW1pY1JhbmdlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgIHRpbWVXaWR0aDogNjAsXG4gICAgICAgIGxpbmVJbnRlcnZhbDogNTAwMCxcbiAgICAgICAgbm90ZUhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgICByYW5nZTp7XG4gICAgXHRcdGJvdHRvbTogMCxcbiAgICBcdFx0dG9wOiAxMjgsXG4gICAgICAgIH0sXG4gICAgICAgIGR5bmFtaWNSYW5nZTogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gICAgZnJhbWVyYXRlOiAyNSxcbiAgICBvZmZzZXRNdXNpYzogZmFsc2UsXG4gICAgc2NlbmVCZ0NvbG9yOiAweEZGRkZGRixcbiAgICBsaW5lQ29sb3I6IDB4NDQ0NDQ0LFxuICAgIGxpbmVGaWxsQ29sb3I6IDB4RkZGRjAwLFxuICAgIG5vdGVDb2xvcnM6IFsweEI5MDAwMCwgMHg0QkRENzEsIDB4QUY5MzFFLCAweDFDMjhCQSwgMHg1MzY5OTFdLFxuICAgIG5vdGVIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICB6ZXJvU2hpZnQ6IDAuOSxcbiAgICB0aW1lV2lkdGg6IDYwLFxuICAgIGxpbmVJbnRlcnZhbDogNTAwMCxcbi8vICAgIHdzVXJpOiB1bmRlZmluZWQsXG4vLyAgICBldmVudENvZGU6IHVuZGVmaW5lZFxuXG59O1xuXG5mdW5jdGlvbiBEb3VibGVSb2xsKG9wdGlvbnMpIHtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIG9wdHMgPSBfKG9wdGlvbnMpLmRlZmF1bHRzKGRlZmF1bHRDb25maWcpLnZhbHVlKCk7XG5cbiAgICB2YXIgb3JpZW50YXRpb24gPSBvcHRzLm9yaWVudGF0aW9uO1xuICAgIHZhciBpc0hvcml6b250YWwgPSAob3JpZW50YXRpb24gIT09ICd2ZXJ0aWNhbCcpO1xuXG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlcjtcbiAgICB0aGlzLmxpbmVDb2xvciA9IG9wdHMubGluZUNvbG9yO1xuICAgIHRoaXMubGluZUZpbGxDb2xvciA9IG9wdHMubGluZUZpbGxDb2xvcjtcbiAgICB0aGlzLmZyYW1lcmF0ZSA9IG9wdHMuZnJhbWVyYXRlO1xuICAgIHRoaXMub2Zmc2V0TXVzaWMgPSBvcHRzLm9mZnNldE11c2ljO1xuICAgIHRoaXMubm90ZUNvbG9ycyA9IG9wdHMubm90ZUNvbG9ycztcblxuICAgIHZhciBub3RlSGVpZ2h0ID0gb3B0cy5ub3RlSGVpZ2h0O1xuICAgIHZhciBzY2VuZUhlaWdodCA9IG9wdHMuc2NlbmVIZWlnaHQgfHwgXyhvcHRzLnBpYW5vcm9sbHMpLnJlZHVjZShmdW5jdGlvbihzLHApIHsgcmV0dXJuIHMgKyBwLmhlaWdodDsgfSwgMCk7XG4gICAgdmFyIHRpbWVXaWR0aCA9IG9wdHMudGltZVdpZHRoO1xuICAgIHZhciBsaW5lSW50ZXJ2YWwgPSBvcHRzLmxpbmVJbnRlcnZhbDtcbiAgICB2YXIgb2Zmc2V0TXVzaWMgPSBvcHRzLm9mZnNldE11c2ljO1xuXG4gICAgdmFyIHNjZW5lV2lkdGggPSBvcHRzLnNjZW5lV2lkdGg7XG4gICAgdmFyIHN0YWdlVmlldyA9IG9wdHMuc3RhZ2VWaWV3O1xuXG4gICAgdmFyIHplcm9TaGlmdCA9IG9wdHMuemVyb1NoaWZ0O1xuXG4gICAgdmFyIHdzID0gb3B0cy53cztcblxuICAgIHZhciBjb2xvcnNSZWcgPSB7fTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFBJWEkuRGlzcGxheU9iamVjdENvbnRhaW5lcigpO1xuICAgIHRoaXMuY29udGFpbmVyLnggPSBNYXRoLmZsb29yKHNjZW5lV2lkdGgqemVyb1NoaWZ0KTtcbiAgICB0aGlzLmNvbnRhaW5lci55ID0gMDtcblxuICAgIHN0YWdlVmlldy5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcblxuICAgIHZhciBwaWFub3JvbGxMaXN0ID0gW107XG5cbiAgICB2YXIgcGlhbm9yb2xsT3B0aW9ucyA9IHtcbiAgICAgICAgcGFyZW50Q29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uLFxuICAgICAgICB4SW5pdDogMCxcbiAgICAgICAgd2lkdGg6IHNjZW5lV2lkdGgsXG4gICAgICAgIG5vdGVDb2xvcnM6IHRoaXMubm90ZUNvbG9ycyxcbiAgICAgICAgY29sb3JzUmVnOiBjb2xvcnNSZWcsXG4gICAgICAgIGxpbmVDb2xvcjogdGhpcy5saW5lQ29sb3IsXG4gICAgICAgIGxpbmVJbnRlcnZhbDogbGluZUludGVydmFsLFxuICAgICAgICBvZmZzZXRNdXNpYzogb2Zmc2V0TXVzaWMsXG4gICAgfTtcbiAgICBcbiAgICB2YXIgbGluZUdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKVxuXHQgICAgLmJlZ2luRmlsbCh0aGlzLmxpbmVGaWxsQ29sb3IpXG5cdCAgICAubGluZVN0eWxlKDEsIHRoaXMubGluZUNvbG9yKVxuXHQgICAgLm1vdmVUbyhNYXRoLmZsb29yKHNjZW5lV2lkdGgqemVyb1NoaWZ0KSwgMClcblx0ICAgIC5saW5lVG8oLXNjZW5lV2lkdGggLSBNYXRoLmZsb29yKHNjZW5lV2lkdGgqemVyb1NoaWZ0KSwgMClcblx0ICAgIC5lbmRGaWxsKCk7XG5cdHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGxpbmVHcmFwaGljcyk7XG5cbiAgICB2YXIgeUluaXQgPSBvcHRzLnlJbml0IHx8IDA7XG4gICAgdmFyIGxpbmVzRG93biA9IHRydWU7XG4gICAgXyhvcHRzLnBpYW5vcm9sbHMpLmZvckVhY2goZnVuY3Rpb24ocHJEZWYsIGkpIHtcbiAgICAgICAgdmFyIHByTm90ZUhlaWdodCA9IG5vdGVIZWlnaHQgfHwgcHJEZWYubm90ZUhlaWdodCB8fCBwckRlZi5oZWlnaHQgLyAocHJEZWYucmFuZ2UudG9wIC0gcHJEZWYucmFuZ2UuYm90dG9tICsgMSk7XG4gICAgICAgIHZhciBwclRpbWVXaWR0aCA9IHByRGVmLnRpbWVXaWR0aCB8fCB0aW1lV2lkdGg7XG4gICAgICAgIHBpYW5vcm9sbExpc3QucHVzaChuZXcgUGlhbm9Sb2xsKF8oe1xuICAgICAgICAgICAgeUluaXQ6IHlJbml0LFxuICAgICAgICAgICAgaGVpZ2h0OiBwckRlZi5oZWlnaHQsXG4gICAgICAgICAgICBsaW5lc0Rvd246IGxpbmVzRG93bixcbiAgICAgICAgICAgIHBpeGVsc1BlclNlY29uZDogTWF0aC5mbG9vcihzY2VuZVdpZHRoIC8gcHJUaW1lV2lkdGgpLFxuICAgICAgICAgICAgbm90ZUhlaWdodDogcHJOb3RlSGVpZ2h0LFxuICAgICAgICAgICAgbGluZUludGVydmFsOiBwckRlZi5saW5lSW50ZXJ2YWwsXG4gICAgICAgICAgICByYW5nZTogcHJEZWYucmFuZ2UsXG4gICAgICAgICAgICBkeW5hbWljUmFuZ2U6IHByRGVmLmR5bmFtaWNSYW5nZSxcbiAgICAgICAgfSkuZGVmYXVsdHMocGlhbm9yb2xsT3B0aW9ucykudmFsdWUoKSkpO1xuICAgICAgICB5SW5pdCArPSBwckRlZi5oZWlnaHQ7XG4gICAgICAgIGxpbmVzRG93biA9ICFsaW5lc0Rvd247XG5cbiAgICAgICAgaWYoaTwob3B0cy5waWFub3JvbGxzLmxlbmd0aC0xKSkge1xuICAgICAgICAgICAgdmFyIGxpbmVHcmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKClcbiAgICAgICAgICAgICAgICAuYmVnaW5GaWxsKF90aGlzLmxpbmVGaWxsQ29sb3IpXG4gICAgICAgICAgICAgICAgLmxpbmVTdHlsZSgxLCBfdGhpcy5saW5lQ29sb3IpXG4gICAgICAgICAgICAgICAgLm1vdmVUbyhNYXRoLmZsb29yKHNjZW5lV2lkdGgqemVyb1NoaWZ0KSwgeUluaXQpXG4gICAgICAgICAgICAgICAgLmxpbmVUbygtc2NlbmVXaWR0aCAtIE1hdGguZmxvb3Ioc2NlbmVXaWR0aCp6ZXJvU2hpZnQpLCB5SW5pdClcbiAgICAgICAgICAgICAgICAuZW5kRmlsbCgpO1xuICAgICAgICAgICAgX3RoaXMuY29udGFpbmVyLmFkZENoaWxkKGxpbmVHcmFwaGljcyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmKCFpc0hvcml6b250YWwpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIucm90YXRpb24gPSBNYXRoLlBJLzI7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnkgPSBzY2VuZUhlaWdodDtcbiAgICAgICAgdGhpcy5jb250YWluZXIueCA9IHNjZW5lV2lkdGg7XG4gICAgfVxuXG5cbiAgICB0aGlzLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICAgIFx0d3MubWVzc2FnZShmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICBfdGhpcy5hZGROb3RlcyhkYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG5cbiAgICB0aGlzLmFkZE5vdGVzID0gZnVuY3Rpb24oZGF0YSkge1xuXG4gICAgICAgIHBpYW5vcm9sbExpc3QuZm9yRWFjaChmdW5jdGlvbihjKSB7XG4gICAgICAgICAgICBjLmFkZE5vdGVSYXcoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcGlhbm9yb2xsTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICAgIGMubW92ZSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdCBwYWdlIGFuZCBpbnRlcnZhbHNcbiAgICB2YXIgc3RhcnRUcztcblxuICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbigpIHtcblxuICAgICAgICBzdGFydFRzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcGlhbm9yb2xsTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICAgIGMuc3RhcnQoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHBpYW5vcm9sbExpc3QuZm9yRWFjaChmdW5jdGlvbihjKSB7XG4gICAgICAgICAgICBjLnN0b3AoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuXG4gICAgdGhpcy5sb2cgPSBmdW5jdGlvbihtKSB7XG4gICAgICAgIGlmKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2cobSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBEb3VibGVSb2xsOiBEb3VibGVSb2xsXG59O1xuIiwiLyoqXG4qIGpzL3dzd3JhcHBlci5qc1xuKlxuKiBzaW1wbGUgbG9nZ2VyIHNlcnZpY2VcbipcbiovXG5cbi8qIGdsb2JhbCBkb2N1bWVudDogZmFsc2UgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBIdG1sTG9nZ2VyKGRvTG9nLCBjb250YWluZXIpIHtcblxuICAgIHZhciBsb2dDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgaWYodHlwZW9mKGNvbnRhaW5lcikgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxvZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcik7XG4gICAgfVxuICAgIGlmKCFkb0xvZykge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxvZ0NvbnRhaW5lcik7XG4gICAgICAgIGxvZ0NvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cblxuICAgIHRoaXMubG9nID0gZnVuY3Rpb24obXNnKSB7XG4gICAgICAgIGlmKGRvTG9nICYmIGxvZ0NvbnRhaW5lcikge1xuICAgICAgICAgICAgbG9nQ29udGFpbmVyLmlubmVySFRNTCArPSBtc2cgKyAnXFxuJztcbiAgICAgICAgICAgIGxvZ0NvbnRhaW5lci5zY3JvbGxUb3AgPSBsb2dDb250YWluZXIuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gQ29uc29sZUxvZ2dlcihkb0xvZykge1xuXG4gICAgdGhpcy5sb2cgPSBmdW5jdGlvbihtc2cpIHtcbiAgICAgICAgaWYoZG9Mb2cpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIEh0bWxMb2dnZXI6IEh0bWxMb2dnZXIsXG4gICAgQ29uc29sZUxvZ2dlcjogQ29uc29sZUxvZ2dlclxufTtcbiIsIi8qKlxuKiBqcy9waWFub3JvbGwuanNcbipcbiogcGlhbm9yb2xsIGJhc2ljIGNvbXBvbmVudFxuKlxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBQSVhJID0gcmVxdWlyZSgncGl4aScpO1xudmFyIHJhbmRvbUNvbG9yID0gcmVxdWlyZSgncmFuZG9tQ29sb3InKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbnZhciBOVFBfRVBPQ0hfREVMVEEgPSAyMjA4OTg4ODAwOyAvL2MuZi4gUkZDIDg2OFxuXG5mdW5jdGlvbiBQaWFub1JvbGwob3B0aW9ucykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgUElYSS5EaXNwbGF5T2JqZWN0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5jb250YWluZXIueCA9IG9wdGlvbnMueEluaXQ7XG4gICAgdGhpcy5jb250YWluZXIueSA9IG9wdGlvbnMueUluaXQ7XG4gICAgb3B0aW9ucy5wYXJlbnRDb250YWluZXIuYWRkQ2hpbGQodGhpcy5jb250YWluZXIpO1xuXG4gICAgdmFyIG9yaWVudGF0aW9uID0gb3B0aW9ucy5vcmllbnRhdGlvbjtcbiAgICB2YXIgaXNIb3Jpem9udGFsID0gKG9yaWVudGF0aW9uICE9PSAndmVydGljYWwnKTtcblxuICAgIHRoaXMubGluZXNEb3duID0gb3B0aW9ucy5saW5lc0Rvd247XG4gICAgdGhpcy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodDtcbiAgICB0aGlzLnBpeGVsc1BlclNlY29uZCA9IG9wdGlvbnMucGl4ZWxzUGVyU2Vjb25kO1xuICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgIHRoaXMubm90ZUNvbG9ycyA9IG9wdGlvbnMubm90ZUNvbG9ycztcbiAgICB0aGlzLmNvbG9yc1JlZyA9IG9wdGlvbnMuY29sb3JzUmVnIHx8IHt9O1xuICAgIHRoaXMubGluZUNvbG9yID0gb3B0aW9ucy5saW5lQ29sb3I7XG4gICAgdGhpcy5saW5lSW50ZXJ2YWwgPSBvcHRpb25zLmxpbmVJbnRlcnZhbDtcbiAgICB0aGlzLm9mZnNldE11c2ljID0gb3B0aW9ucy5vZmZzZXRNdXNpYyB8fCBmYWxzZTtcbiAgICB0aGlzLm5vdGVIZWlnaHQgPSBvcHRpb25zLm5vdGVIZWlnaHQ7XG4gICAgdGhpcy5ub3RlRGljdCA9IHt9O1xuICAgIHRoaXMuc3RhcnRUcyA9IG9wdGlvbnMuc3RhcnRUcyB8fCBEYXRlLm5vdygpO1xuICAgIHRoaXMuZHluYW1pY1JhbmdlID0gb3B0aW9ucy5keW5hbWljUmFuZ2U7XG4gICAgdGhpcy5pbml0UmFuZ2UgPSBvcHRpb25zLnJhbmdlO1xuICAgIHRoaXMucmFuZ2UgPSBvcHRpb25zLnJhbmdlO1xuICAgIFxuXG4gICAgdmFyIHN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIC8vIFRPRE86IHRoZSBvcmlnaW4gcG9pbnQgaXMgYW4gYXBwcm94aW1hdGlvbi4gU2hvdWxkIHJlZmluZSB0aGlzXG4gICAgICAgIHZhciBnbG9iYWxQb3MgPSBjaGlsZC50b0dsb2JhbChuZXcgUElYSS5Qb2ludCgwLDApKTtcbiAgICAgICAgcmV0dXJuICgoZ2xvYmFsUG9zLnggKyBjaGlsZC53aWR0aCkgPCAwKSB8fCAoKGdsb2JhbFBvcy55ICsgY2hpbGQuaGVpZ2h0KSA8IDApIDtcbiAgICB9O1xuXG4gICAgLy9UT0RPOiBJIGRvIG5vdCBsaWtlIHRoZSBcInJlZ0NvbG9yXCIgb2JqZWN0LiBUaGlzIHNob3VsZCBub3QgYmUgZ2xvYmFsLCBidXQgbG9jYWxcbiAgICB0aGlzLmdldENvbG9yID0gZnVuY3Rpb24oY2FuYWwpIHtcbiAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcnNSZWdbY2FuYWxdO1xuICAgICAgICBpZih0eXBlb2YoY29sb3IpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdmFyIGNvbG9yc1JlZ1NpemUgPSBPYmplY3Qua2V5cyh0aGlzLmNvbG9yc1JlZykubGVuZ3RoO1xuICAgICAgICAgICAgaWYoY29sb3JzUmVnU2l6ZSA8IHRoaXMubm90ZUNvbG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuY29sb3JzUmVnW2NhbmFsXSA9IHRoaXMubm90ZUNvbG9yc1tjb2xvcnNSZWdTaXplXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jb2xvcnNSZWdbY2FuYWxdID0gcGFyc2VJbnQocmFuZG9tQ29sb3IoeyBsdW1pbm9zaXR5OiAnbGlnaHQnLCBodWU6ICdyYW5kb20nLCBmb3JtYXQ6J2hleCd9KS5yZXBsYWNlKC9eIy8sICcnKSwgMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXROb3RlUmVjdCA9IGZ1bmN0aW9uKG5vdGUsIHgsIHksIGNvbG9yLCBhbHBoYSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICB2YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpO1xuICAgICAgICBncmFwaGljcy5ub3RlID0gbm90ZTtcbiAgICAgICAgZ3JhcGhpY3MuYmVnaW5GaWxsKGNvbG9yLCBhbHBoYSk7XG4gICAgICAgIGdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBncmFwaGljcy5lbmRGaWxsKCk7XG4gICAgICAgIGdyYXBoaWNzLnggPSB4O1xuICAgICAgICBncmFwaGljcy55ID0geTtcbiAgICAgICAgZ3JhcGhpY3Mud2lkdGggPSB3aWR0aDtcbiAgICAgICAgZ3JhcGhpY3MuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICByZXR1cm4gZ3JhcGhpY3M7XG4gICAgfTtcblxuICAgIHRoaXMuYWRkTm90ZVJhdyA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIG5vdGUgPSBkYXRhLmNvbnRlbnRbM107XG4gICAgICAgIHZhciB2ZWxvY2l0eSA9IGRhdGEuY29udGVudFs0XTtcbiAgICAgICAgdmFyIHRzID0gKGRhdGEuY29udGVudFswXSAtIE5UUF9FUE9DSF9ERUxUQSkqMTAwMDtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBkYXRhLmNvbnRlbnRbMl07XG4gICAgICAgIHZhciBzZXNzaW9uVHMgPSBkYXRhLmNvbnRlbnRbMV07XG5cbiAgICAgICAgdGhpcy5hZGROb3RlKG5vdGUsIHRzLCBzZXNzaW9uVHMsIHZlbG9jaXR5LCBjaGFubmVsLCAwKTtcbiAgICB9O1xuXG4gICAgdGhpcy5hZGROb3RlID0gZnVuY3Rpb24obm90ZSwgc3RhcnRUaW1lLCBzZXNzaW9uVHMsIHZlbG9jaXR5LCBjaGFubmVsLCBkdXJhdGlvbikge1xuXG4gICAgICAgIHZhciB0cyA9IHN0YXJ0VGltZTtcbiAgICAgICAgaWYodGhpcy5vZmZzZXRNdXNpYykge1xuICAgICAgICAgICAgdHMgPSB0aGlzLnN0YXJ0VHMgKyBzZXNzaW9uVHM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm90ZUR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIHZhciBub3RlVmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgICAgICAgdmFyIGdyYXBoaWNzO1xuICAgICAgICBpZighZHVyYXRpb24pIHtcbiAgICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdPT09J3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgICAgIHRoaXMubm90ZURpY3RbY2hhbm5lbF0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHZlbG9jaXR5PT09MCkge1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdW25vdGVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm90ZURlZiA9IHRoaXMubm90ZURpY3RbY2hhbm5lbF1bbm90ZV07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdW25vdGVdO1xuICAgICAgICAgICAgICAgICAgICBub3RlRHVyYXRpb24gPSBzZXNzaW9uVHMgLSBub3RlRGVmLnNlc3Npb25UcztcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSBub3RlRGVmLmdyYXBoaWNzO1xuICAgICAgICAgICAgICAgICAgICBub3RlVmVsb2NpdHkgPSBub3RlRGVmLnZlbG9jaXR5O1xuICAgICAgICAgICAgICAgICAgICB0cyA9IG5vdGVEZWYudHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm90ZUR1cmF0aW9uID0gTWF0aC5hYnMoRGF0ZS5ub3coKSAtIHRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGVEaWN0W2NoYW5uZWxdW25vdGVdID0geyB0czogdHMsIHZlbG9jaXR5OiB2ZWxvY2l0eSwgc2Vzc2lvblRzOiBzZXNzaW9uVHN9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICBpZighdGhpcy5vZmZzZXRNdXNpYyB8fCB2ZWxvY2l0eT09PTApIHtcblxuICAgICAgICAgICAgdmFyIHdpZHRoID0gbm90ZUR1cmF0aW9uICogdGhpcy5waXhlbHNQZXJTZWNvbmQgLyAxMDAwO1xuICAgICAgICAgICAgaWYoIWdyYXBoaWNzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHggPSAodHMtdGhpcy5zdGFydFRzKSAqIHRoaXMucGl4ZWxzUGVyU2Vjb25kIC8gMTAwMDtcbiAgICAgICAgICAgICAgICBpZigoeCt3aWR0aCkgPCAgKE1hdGguYWJzKHRoaXMuY29udGFpbmVyLngpIC0gdGhpcy53aWR0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90IHZpc2libGUuIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFx0aWYgKHRoaXMuZHluYW1pY1JhbmdlICYmICh0aGlzLnJhbmdlLmJvdHRvbSA+IG5vdGUgfHwgbm90ZSA+IHRoaXMucmFuZ2UudG9wKSl7XG4gICAgICAgICAgICBcdFx0dmFyIG5ld1NjYWxlID0ge307XG4gICAgICAgICAgICBcdFx0bmV3U2NhbGVbJ2JvdHRvbSddID0gTWF0aC5taW4obm90ZSwgdGhpcy5yYW5nZS5ib3R0b20pO1xuICAgICAgICAgICAgXHRcdG5ld1NjYWxlWyd0b3AnXSA9IE1hdGgubWF4KG5vdGUsIHRoaXMucmFuZ2UudG9wKTtcbiAgICAgICAgICAgIFx0XHR0aGlzLnJlc2NhbGVTY2VuZShuZXdTY2FsZSk7XG4gICAgICAgICAgICBcdH1cbiAgICAgICAgICAgIFx0dmFyIHkgPSBNYXRoLmZsb29yKCgodGhpcy5yYW5nZS50b3AtdGhpcy5yYW5nZS5ib3R0b20pLShub3RlLXRoaXMucmFuZ2UuYm90dG9tKSswLjUpICogKHRoaXMubm90ZUhlaWdodCkgLSAodGhpcy5ub3RlSGVpZ2h0LzIpKTtcbiAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSB0aGlzLmdldENvbG9yKGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciBhbHBoYSA9IChub3RlVmVsb2NpdHkgLyAxMjgpO1xuXG4gICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSB0aGlzLmdldE5vdGVSZWN0KG5vdGUsIHgsIHksIGNvbG9yLCBhbHBoYSwgd2lkdGgsIHRoaXMubm90ZUhlaWdodCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhpY3Mud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYoIWR1cmF0aW9uICYmIHZlbG9jaXR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RlRGljdFtjaGFubmVsXVtub3RlXS5ncmFwaGljcyA9IGdyYXBoaWNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvL3Jlc2NhbGUgc2NlbmUgaW4gY2FzZSBhIG5vdGUgb3V0IG9mIHJhbmdlIGlzIGFkZGVkIG9yIGEgbm90ZSBvdXQgb2YgdGhlIHJhbmdlIGlzIHJlbW92ZWRcbiAgICB0aGlzLnJlc2NhbGVTY2VuZSA9IGZ1bmN0aW9uKG5ld1NjYWxlKXtcbiAgICBcdHZhciBfdGhpcyA9IHRoaXM7XG4gICAgXHR2YXIgY2hpbGRyZW5Ub1VwZGF0ZSA9IFtdO1xuICAgIFx0dmFyIHRvcCA9IHRoaXMuaW5pdFJhbmdlLnRvcDtcbiAgICBcdHZhciBib3R0b20gPSB0aGlzLmluaXRSYW5nZS5ib3R0b207XG4gICAgXHRfKF90aGlzLmNvbnRhaW5lci5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgIFx0XHRpZiAodHlwZW9mKGNoaWxkKSAhPT0gJ3VuZGVmaW5lZCcgJiYgY2hpbGQubm90ZSAmJiAhaXNIaWRkZW4oY2hpbGQpKXtcbiAgICBcdFx0XHR0b3AgPSBNYXRoLm1heChjaGlsZC5ub3RlLCB0b3ApO1xuICAgIFx0XHRcdGJvdHRvbSA9IE1hdGgubWluKGNoaWxkLm5vdGUsIGJvdHRvbSk7XG4gICAgXHRcdFx0cmV0dXJuIGNoaWxkcmVuVG9VcGRhdGUucHVzaChjaGlsZCk7XG4gICAgXHRcdH1cbiAgICAgICAgfSk7XG4gICAgXHRpZiAobmV3U2NhbGUpe1xuICAgIFx0XHR0aGlzLnJhbmdlID0gbmV3U2NhbGU7XG4gICAgXHR9ZWxzZXtcbiAgICBcdFx0dGhpcy5yYW5nZS50b3AgPSB0b3A7IFxuICAgIFx0XHR0aGlzLnJhbmdlLmJvdHRvbSA9IGJvdHRvbTsgXG4gICAgXHR9XG4gICAgXHR0aGlzLm5vdGVIZWlnaHQgPSB0aGlzLmhlaWdodCAvICh0aGlzLnJhbmdlLnRvcCAtIHRoaXMucmFuZ2UuYm90dG9tICsgMSk7XG4gICAgXHRjaGlsZHJlblRvVXBkYXRlLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcblx0XHRcdGNoaWxkLnkgPSBNYXRoLmZsb29yKCgoX3RoaXMucmFuZ2UudG9wLV90aGlzLnJhbmdlLmJvdHRvbSktKGNoaWxkLm5vdGUtX3RoaXMucmFuZ2UuYm90dG9tKSswLjUpICogKF90aGlzLm5vdGVIZWlnaHQpIC0gKF90aGlzLm5vdGVIZWlnaHQvMikpO1xuXHRcdFx0Y2hpbGQuaGVpZ2h0ID0gX3RoaXMubm90ZUhlaWdodDtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuYWRkTGluZSA9IGZ1bmN0aW9uKHRzKXtcblxuICAgICAgICBpZih0eXBlb2YodHMpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdHMgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4ID0gLXRoaXMuY29udGFpbmVyLng7XG4gICAgICAgIHZhciB5ID0gdGhpcy5saW5lc0Rvd24gPyB0aGlzLmhlaWdodCAtIDIwIDogMDtcblxuICAgICAgICB2YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpXG4gICAgICAgICAgICAuYmVnaW5GaWxsKDB4RkZGRjAwKVxuICAgICAgICAgICAgLmxpbmVTdHlsZSgxLCB0aGlzLmxpbmVDb2xvcilcbiAgICAgICAgICAgIC5tb3ZlVG8oMCwgMClcbiAgICAgICAgICAgIC5saW5lVG8oMCwgMjApXG4gICAgICAgICAgICAuZW5kRmlsbCgpO1xuICAgICAgICBncmFwaGljcy54ID0geDtcbiAgICAgICAgZ3JhcGhpY3MueSA9IHk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGdyYXBoaWNzKTtcbiAgICAgICAgLy8gQWRkIHRleHRcbiAgICAgICAgLy92YXIgdG90YWxTZWMgPSBsaW5lTmIgKiB0aGlzLmxpbmVJbnRlcnZhbCAvIDEwMDA7XG4gICAgICAgIHZhciBob3VycyA9IHRzLmdldEhvdXJzKCk7XG4gICAgICAgIHZhciBtaW51dGVzID10cy5nZXRNaW51dGVzKCk7XG4gICAgICAgIHZhciBzZWNvbmRzID0gdHMuZ2V0U2Vjb25kcygpO1xuICAgICAgICB2YXIgdGltZVN0ciA9IChob3VycyA8IDEwID8gJzAnICsgaG91cnMgOiBob3VycykgKyAnOicgKyAobWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXMpICsgJzonICsgKHNlY29uZHMgIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcyk7XG5cbiAgICAgICAgdmFyIGZvbnRPYmogPSB7IGZvbnQ6ICcxMHB0IEFyaWFsJywgZmlsbDogJyM0NDQ0NDQnIH07XG4gICAgICAgIHZhciB0ID0gbmV3IFBJWEkuVGV4dCh0aW1lU3RyLCBmb250T2JqKTtcbiAgICAgICAgaWYoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICB0LnggPSB4ICsgMjtcbiAgICAgICAgICAgIHQueSA9IHRoaXMubGluZXNEb3duID8gdGhpcy5oZWlnaHQgLSAxNSA6IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0LnJvdGF0aW9uID0gLU1hdGguUEkvMjtcbiAgICAgICAgICAgIHQueCA9IHggO1xuICAgICAgICAgICAgdC55ID0gdGhpcy5saW5lc0Rvd24gPyB0aGlzLmhlaWdodCAtIDIgOiB0LndpZHRoICsgMjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0KTtcbiAgICB9O1xuXG4gICAgdGhpcy5tb3ZlVG8gPSBmdW5jdGlvbihkaWZmVGltZSl7XG4gICAgICAgIHZhciBvbGRYID0gdGhpcy5jb250YWluZXIueDtcbiAgICAgICAgdGhpcy5jb250YWluZXIueCA9IE1hdGguZmxvb3IoZGlmZlRpbWUqdGhpcy5waXhlbHNQZXJTZWNvbmQpO1xuICAgICAgICB2YXIgZGVsdGFYID0gTWF0aC5hYnMob2xkWC10aGlzLmNvbnRhaW5lci54KTtcbiAgICAgICAgXy5mb3JPd24odGhpcy5ub3RlRGljdCwgZnVuY3Rpb24oY2hhbm5lbERpY3QpIHtcbiAgICAgICAgICAgIF8uZm9yT3duKGNoYW5uZWxEaWN0LCBmdW5jdGlvbihub3RlRGVmKSB7XG4gICAgICAgICAgICAgICAgaWYobm90ZURlZi5ncmFwaGljcykge1xuICAgICAgICAgICAgICAgICAgICBub3RlRGVmLmdyYXBoaWNzLndpZHRoID0gbm90ZURlZi5ncmFwaGljcy53aWR0aCArIGRlbHRhWDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMubW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGlmZiA9ICh0aGlzLnN0YXJ0VHMgLSBEYXRlLm5vdygpKS8xMDAwO1xuICAgICAgICB0aGlzLm1vdmVUbyhkaWZmKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZW1vdmVQYXNzZWRPYmpldHMgPSBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgY2hpbGRyZW5Ub1JlbW92ZSA9IFtdO1xuICAgICAgICB2YXIgcmVzY2FsZSA9IGZhbHNlO1xuICAgICAgICBfKF90aGlzLmNvbnRhaW5lci5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihjaGlsZCkgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgKGlzSGlkZGVuKGNoaWxkKSAmJiBjaGlsZHJlblRvUmVtb3ZlLnB1c2goY2hpbGQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNoaWxkcmVuVG9SZW1vdmUuZm9yRWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBcdGlmIChfdGhpcy5keW5hbWljUmFuZ2UgJiYgKF90aGlzLnJhbmdlLmJvdHRvbSA9PT0gY2hpbGQubm90ZSB8fCBjaGlsZC5ub3RlID09PSBfdGhpcy5yYW5nZS50b3ApKXtcbiAgICAgICAgICAgICAgICByZXNjYWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvL2V4dGVybmFsaXplIHRoaXMgdGVzdCB0byBhdm9pZCByZXBlYXRlZCBjYWxsIHRvIHRoZSBmdW5jdGlvbiByZXNjYWxlU2NlbmUgaW4gdGhlIHByZXZpb3VzIGxvb3BcbiAgICAgICAgaWYgKHJlc2NhbGUpe1xuICAgICAgICAgICAgX3RoaXMucmVzY2FsZVNjZW5lKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZighc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuYWRkTGluZSgpO1xuICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52ZXJ0aWNhbExpbmVzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsgX3RoaXMuYWRkTGluZSgpOyB9LCB0aGlzLmxpbmVJbnRlcnZhbCk7XG4gICAgICAgIHRoaXMuY2xlYW5JbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgX3RoaXMucmVtb3ZlUGFzc2VkT2JqZXRzKCk7IH0sIDEwMDAgKiB0aGlzLndpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy52ZXJ0aWNhbExpbmVzSW50ZXJ2YWwpO1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuY2xlYW5JbnRlcnZhbCk7XG4gICAgfTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBpYW5vUm9sbDtcbiIsIi8qKlxuKiBzY3JpcHRzL3N0YWdldmlldy5qc1xuKlxuKiBUaGlzIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBhcHBsaWNhdGlvbi5cbiogVGFrZSBhIGxvb2sgYXQgaHR0cDovL2Jyb3dzZXJpZnkub3JnLyBmb3IgbW9yZSBpbmZvXG4qL1xuXG4vKiBnbG9iYWwgZG9jdW1lbnQ6IGZhbHNlICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbnZhciBkZWZhdWx0Q29uZmlnID0ge1xuICAgIGV4dGVybmFsUmVmcmVzaDogZmFsc2UsXG4gICAgbG9nZ2VyOiB1bmRlZmluZWQsXG4gICAgc2NlbmVXaWR0aDogMTAyNCxcbiAgICBzY2VuZUhlaWdodDogNzY4LFxuICAgIGZyYW1lcmF0ZTogMjUsXG4gICAgc2NlbmVCZ0NvbG9yOiAweEZGRkZGRixcbiAgICBjYW52YXNDb250YWluZXI6ICdjYW52YXNDb250YWluZXInLFxufTtcblxuZnVuY3Rpb24gU3RhZ2VWaWV3KG9wdGlvbnMpIHtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdmFyIG9wdHMgPSBfKG9wdGlvbnMpLmRlZmF1bHRzKGRlZmF1bHRDb25maWcpLnZhbHVlKCk7XG5cbiAgICB2YXIgZXh0ZXJuYWxSZWZyZXNoID0gb3B0cy5leHRlcm5hbFJlZnJlc2g7XG5cbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyO1xuICAgIHRoaXMuZnJhbWVyYXRlID0gb3B0cy5mcmFtZXJhdGU7XG4gICAgdmFyIHNjZW5lQmdDb2xvciA9IG9wdHMuc2NlbmVCZ0NvbG9yO1xuICAgIHZhciBzY2VuZVdpZHRoID0gb3B0cy5zY2VuZVdpZHRoO1xuICAgIHZhciBzY2VuZUhlaWdodCA9IG9wdHMuc2NlbmVIZWlnaHQ7XG4gICAgdmFyIGNhbnZhc0NvbnRhaW5lciA9IG9wdHMuY2FudmFzQ29udGFpbmVyO1xuICAgIHZhciB0aW1lQ29udGFpbmVyID0gW107XG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcblxuICAgIC8vY3JlYXRlIGFuIG5ldyBpbnN0YW5jZSBvZiBhIHBpeGkgc3RhZ2VcbiAgICB0aGlzLnN0YWdlID0gbmV3IFBJWEkuU3RhZ2Uoc2NlbmVCZ0NvbG9yKTtcbiAgICAvL2NyZWF0ZSBhIHJlbmRlcmVyIGluc3RhbmNlLlxuICAgIHZhciByZW5kZXJlciA9IFBJWEkuYXV0b0RldGVjdFJlbmRlcmVyKHNjZW5lV2lkdGgsIHNjZW5lSGVpZ2h0KTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGlmKHR5cGVvZihjYW52YXNDb250YWluZXIpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0eXBlb2YodGltZUNvbnRhaW5lcikgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aW1lQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGltZUNvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBjYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQocmVuZGVyZXIudmlldyk7XG5cbiAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGMpe1xuICAgIFx0XHRjLmluaXQoKTtcbiAgICBcdH0pO1xuICAgIH07XG5cbiAgICB0aGlzLnJlZ2lzdGVyVGltZUNvbnRhaW5lciA9IGZ1bmN0aW9uKGNvbnRhaW5lcikge1xuICAgIFx0dGltZUNvbnRhaW5lci5wdXNoKGNvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnQgPSBmdW5jdGlvbihjb21wb25lbnQpIHtcbiAgICBcdGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgIFx0dGhpcy5zdGFnZS5hZGRDaGlsZChjb21wb25lbnQuY29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG4gICAgXHRjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oYyl7XG4gICAgXHRcdGMucmVmcmVzaCgpO1xuICAgIFx0fSk7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnN0YWdlKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdCBwYWdlIGFuZCBpbnRlcnZhbHNcbiAgICB2YXIgcmVmcmVzaEludGVydmFsO1xuXG4gICAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGlmKCFleHRlcm5hbFJlZnJlc2gpIHtcbiAgICAgICAgICAgIHJlZnJlc2hJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge190aGlzLnJlZnJlc2goKTt9LCAxMDAwL3RoaXMuZnJhbWVyYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjKXtcbiAgICBcdFx0Yy5zdGFydCgpO1xuICAgIFx0fSk7XG4gICAgfTtcblxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZighZXh0ZXJuYWxSZWZyZXNoKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHJlZnJlc2hJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbihjKXtcbiAgICBcdFx0Yy5zdG9wKCk7XG4gICAgXHR9KTtcbiAgICB9O1xuXG5cbiAgICB0aGlzLmxvZyA9IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgaWYodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhtKTtcbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBTdGFnZVZpZXc6IFN0YWdlVmlld1xufTtcbiIsIi8qKlxuKiBqcy91dGlscy5qc1xuKlxuKiBiYXNpYyB0b29sc1xuKlxuKi9cbi8qanNoaW50IGJpdHdpc2U6IGZhbHNlKi9cbi8qanNoaW50IGNhbWVsY2FzZTogZmFsc2UgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG52YXIgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWUgKHRzKSB7XG4gICAgcmV0dXJuIG1vbWVudCh0cykuZm9ybWF0KCdISDptbTpzcycpO1xufVxuXG5mdW5jdGlvbiBjb2xvclRvSGV4KGMpIHtcbiAgICB2YXIgbSA9IC9yZ2JhP1xcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKykvLmV4ZWMoYyk7XG4gICAgcmV0dXJuIG0gPyAnIycgKyAoMSA8PCAyNCB8IG1bMV0gPDwgMTYgfCBtWzJdIDw8IDggfCBtWzNdKS50b1N0cmluZygxNikuc3Vic3RyKDEpIDogYztcbn1cblxuZnVuY3Rpb24gZ2V0QW5ub3RDYXRlZ29yaWVzKHVybENhdGVnb3JpZXMsIGFubm90Q2F0ZWdvcmllcykge1xuXG4gICAgdmFyIGpzb25Mb2FkZXIgPSBuZXcgUElYSS5Kc29uTG9hZGVyKHVybENhdGVnb3JpZXMsIHRydWUpO1xuXG4gICAganNvbkxvYWRlci5vbignbG9hZGVkJywgZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgIHZhciBkYXRhID0gcmVzLnRhcmdldC5qc29uO1xuXG4gICAgICAgIHdoaWxlKGFubm90Q2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhbm5vdENhdGVnb3JpZXMucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnNlc3Npb25zLmZvckVhY2goZnVuY3Rpb24oc2Vzc2lvbikge1xuICAgICAgICAgICAgdmFyIGFubm90Q2F0ID0ge1xuICAgICAgICAgICAgICAgIHRzOiBzZXNzaW9uLnN0YXJ0X3RzID09PSBudWxsID8gbmV3IERhdGUoMCkgOiBEYXRlLnBhcnNlKHNlc3Npb24uc3RhcnRfdHMpLFxuICAgICAgICAgICAgICAgIGNvbG9yczoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgY2F0ZWdvcmllc0pzb24gPSBzZXNzaW9uLmNhdGVnb3JpZXNfanNvbjtcbiAgICAgICAgICAgIGFubm90Q2F0Lm9yZGVyID0gY2F0ZWdvcmllc0pzb24ub3JkZXI7XG4gICAgICAgICAgICBpZiAodHlwZW9mKGFubm90Q2F0Lm9yZGVyWydkZWZhdWx0J10pID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgYW5ub3RDYXQub3JkZXIucHVzaCgnZGVmYXVsdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNhdExpc3QgPSBfLmNsb25lKGNhdGVnb3JpZXNKc29uLmNhdGVnb3JpZXMpO1xuICAgICAgICAgICAgd2hpbGUoY2F0TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhdCA9IGNhdExpc3QucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYoY2F0LmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RDYXQuY29sb3JzW2NhdC5jb2RlXSA9IGNvbG9yVG9IZXgoY2F0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoY2F0LnN1YmNhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2F0TGlzdCA9IGNhdExpc3QuY29uY2F0KGNhdC5zdWJjYXRlZ29yaWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRlZ29yaWVzSnNvbi5jYXRlZ29yaWVzLmZvckVhY2goZnVuY3Rpb24oY2F0KSB7XG4gICAgICAgICAgICAgICAgaWYoY2F0LmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RDYXQuY29sb3JzW2NhdC5jb2RlXSA9IGNvbG9yVG9IZXgoY2F0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFubm90Q2F0LmRlZmF1bHRDb2xvciA9IGNhdGVnb3JpZXNKc29uLmRlZmF1bHRDb2xvciB8fCAnIzUzNjk5MSc7XG4gICAgICAgICAgICBhbm5vdENhdGVnb3JpZXMucHVzaChhbm5vdENhdCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAganNvbkxvYWRlci5sb2FkKCk7XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0VGltZTogZm9ybWF0VGltZSxcbiAgICBnZXRBbm5vdENhdGVnb3JpZXM6IGdldEFubm90Q2F0ZWdvcmllcyxcbiAgICBjb2xvclRvSGV4OiBjb2xvclRvSGV4XG59O1xuIiwiLyoqXG4qIGpzL3dzd3JhcHBlci5qc1xuKlxuKiBzaW1wbGUgd2Vic2VydmljZSB3cmFwcGVyIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyBvbiBvbm1lc3NhZ2VcbipcbiovXG5cbi8qIGdsb2JhbCBXZWJTb2NrZXQ6IGZhbHNlICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gV3NXcmFwcGVyKHdzdXJsLCBsb2dnZXIpIHtcblxuICAgIHZhciB1cmwgPSB3c3VybDtcbiAgICB2YXIgc29jayA9IG5ldyBXZWJTb2NrZXQodXJsKTtcbiAgICB2YXIgbG9nZ2VyT2JqID0gbG9nZ2VyO1xuXG4gICAgdmFyIGxvZyA9IGZ1bmN0aW9uKG1zZykge1xuICAgICAgICBpZihsb2dnZXJPYmopIHtcbiAgICAgICAgICAgIGxvZ2dlck9iai5sb2cobXNnKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlcnMgPSBbXTtcblxuICAgIHNvY2sub25vcGVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGxvZygnQ29ubmVjdGVkIHRvICcgKyB1cmwpO1xuICAgIH07XG5cbiAgICBzb2NrLm9uY2xvc2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIGxvZygnQ29ubmVjdGlvbiBjbG9zZWQgKHdhc0NsZWFuID0gJyArIGUud2FzQ2xlYW4gKyAnLCBjb2RlID0gJyArIGUuY29kZSArICcsIHJlYXNvbiA9IFxcJycgKyBlLnJlYXNvbiArICdcXCcpJyk7XG4gICAgICAgIHNvY2sgPSBudWxsO1xuICAgIH07XG5cbiAgICBzb2NrLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgbG9nKCdyZWNlaXZlZCAnICsgZS5kYXRhKTtcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlcihkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgV3NXcmFwcGVyOiBXc1dyYXBwZXJcbn07XG4iXX0=
--- a/annot-server/static/js/annotviz.min.js	Tue Apr 14 11:30:20 2015 +0200
+++ b/annot-server/static/js/annotviz.min.js	Tue Apr 14 11:30:51 2015 +0200
@@ -1,1 +1,1 @@
-!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.annotviz=t()}}(function(){return function t(e,i,n){function o(r,a){if(!i[r]){if(!e[r]){var h="function"==typeof require&&require;if(!a&&h)return h(r,!0);if(s)return s(r,!0);var l=new Error("Cannot find module '"+r+"'");throw l.code="MODULE_NOT_FOUND",l}var c=i[r]={exports:{}};e[r][0].call(c.exports,function(t){var i=e[r][1][t];return o(i?i:t)},c,c.exports,t,e,i,n)}return i[r].exports}for(var s="function"==typeof require&&require,r=0;r<n.length;r++)o(n[r]);return o}({1:[function(t,e){"use strict";var i=t("./doubleroll"),n=t("./annotsroll"),o=t("./annotstimeline"),s=t("./annotsvizview"),r=t("./stageview"),a=t("./wswrapper"),h=t("./logger"),l=t("./utils"),c=t("lodash");e.exports=c({}).extend(i).extend(n).extend(o).extend(s).extend(r).extend(a).extend(h).extend(l).value()},{"./annotsroll":2,"./annotstimeline":3,"./annotsvizview":4,"./doubleroll":5,"./logger":6,"./stageview":8,"./utils":9,"./wswrapper":10,lodash:"lodash"}],2:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(a).value();this.container=new n.DisplayObjectContainer,this.container.x=i.xInit,this.container.y=i.yInit,this.container.width=i.width,this.height=i.height,this.width=i.width,this.widthRoll=i.widthRoll,this.pixelsPerSecond=i.pixelsPerSecond,this.annotColors=i.annotColors,this.startTs=i.startTs||Date.now(),this.ignoreAnnots=i.ignoreAnnots;var h=i.yInit,l=o(i.annotStyles).defaults(r).value(),c=15;for(var d in l)l[d].wordWrap===!0&&(l[d].wordWrapWidth=this.widthRoll-c);var f,g=!1,u=i.ws,v=i.externalRefresh,p=i.stageView,w=0;p.registerComponent(this);var m=function(t){var e=t.toGlobal(new n.Point(0,0));return e.x+t.width<0||e.y+t.height<0};this.addAnnots=function(t){var e=t.content.category.label,i=t.content.text,n=t.content.user,o=Date.parse(t.ts),s=t.content.color||this.getColor(o,t.content.category.code);this.addAnnot(e,i,n,s,o)},this.getColor=function(t,e){var i;o(this.annotColors).eachRight(function(e){return e.ts<t?(i=e.colors,!1):void 0});var n;return i&&(n=i[e]),n||(n=i.defaultColor||s),n},this.addAnnot=function(t,i,s,r,a){var d=0,g=(a-this.startTs)*this.pixelsPerSecond/1e3+h,u=parseInt(r.replace(/^#/,""),16);if(0===w){var v=(new n.Graphics).beginFill(u).drawRect(d,g,10,3).endFill();this.container.addChild(v);var p=0,m=new n.Text(t,o(l.label).extend({fill:r}).value());if(m.x=d+c,m.y=g-23,this.container.addChild(m),p+=m.height-23+2,i){var C=new n.Text(i,l.text);C.x=d+c,C.y=g+p,this.container.addChild(C),p+=C.height+2}var x=new n.Text(s,l.user);x.x=d+c,x.y=g+p,this.container.addChild(x),p+=x.height+8,this.ignoreAnnots===!0&&(w=p/this.pixelsPerSecond,f=setInterval(function(){e.refreshWait()},1e3))}this.addAnnotLine(u,g)},this.addAnnotLine=function(t,e){var i=this.widthRoll,o=(new n.Graphics).beginFill(t).drawRect(i,e,this.width-i,3).endFill();this.container.addChild(o)},this.moveTo=function(t){this.container.y=Math.floor(t*this.pixelsPerSecond)},this.move=this.refresh=function(){var t=(this.startTs-Date.now())/1e3;this.moveTo(t)},this.refreshWait=function(){w-=1,0>w&&(w=0,clearInterval(f))},this.removePassedObjets=function(){var t=[];o(e.container.children).forEach(function(e){return"undefined"==typeof e||m(e)&&t.push(e)}),t.forEach(function(t){e.container.removeChild(t)})},this.init=function(){u.message(function(t){e.addAnnots(t)})},this.start=function(){g||(this.startTs=Date.now(),g=!0),this.cleanInterval=setInterval(function(){e.removePassedObjets()},1e3*this.height/this.pixelsPerSecond),v||(this.refreshInterval=setInterval(function(){e.move()},1e3/this.framerate))},this.stop=function(){clearInterval(this.cleanInterval),v||clearInterval(this.refreshInterval)}}var n=t("pixi"),o=t("lodash"),s="#bababa",r={label:{font:"16pt Arial Bold",fill:"#65A954",wordWrap:!0},text:{font:"12pt Arial Regular",fill:"#444444",wordWrap:!0},user:{font:"14pt Arial regular",fill:"#666666"}},a={externalRefresh:!1,defaultColor:s,annotStyles:r,ignoreAnnots:!1};e.exports={AnnotsRoll:i}},{lodash:"lodash",pixi:"pixi"}],3:[function(t,e){"use strict";function i(t){var e=this,i=s(t).defaults(r).value();this.container=new n.DisplayObjectContainer,this.container.x=i.xInit,this.container.y=i.yInit,this.container.width=i.width,this.container.height=i.height,this.timeBegin=i.timeBegin,this.timeEnd=i.timeEnd,this.duration=(this.timeEnd-this.timeBegin)/1e3,this.width=i.width,this.height=i.height,this.intervalHeight=i.intervalHeight,this.intervalWidth=i.intervalWidth,this.maxCellHeight=i.maxCellHeight,this.annotCategories=i.annotCategories,this.startTs=t.startTs||Date.now(),this.showClockGraphics=i.showClockGraphics,this.archive=i.archive,this.circleX=i.circleX||this.width/2,this.circleY=i.circleY||this.height/2,this.radius=i.radius;var a=2*Math.PI*this.radius;this.intervalDuration=this.intervalWidth*this.duration/a;var h=i.channel,l=i.eventCode,c=i.serverUrl,d=i.maxPages,f=Math.floor(a/this.intervalWidth);this.cells=[];for(var g=0;g<a/this.intervalWidth;g++)this.cells[g]=[],this.cells[g].i=g,this.cells[g].totalAnnots=0,this.cells[g].categories={};var u=i.ws,v=i.stageView,p=new n.Graphics;p.lineStyle(2,6579300).drawCircle(this.circleX,this.circleY,this.radius-3).endFill(),this.container.addChild(p),v.registerComponent(this);var w=function(){var t=e.timeBegin,i=Math.min(e.timeEnd,e.startTs);console.log("START TS",new Date(t).toISOString()),console.log("END TS",new Date(i).toISOString());var o=c+"/p/api/v1/annotation",s=[{name:"ts",op:">",val:new Date(t).toISOString()},{name:"ts",op:"<=",val:new Date(i).toISOString()},{name:"channel",op:"==",val:h},{name:"event_code",op:"==",val:l}];o=o+"?q="+JSON.stringify({filters:s});var r=1,a=1,f=function(t){if(t){var i=t.target.json;r=Math.min(d,parseInt(i.total_pages)),i.objects.forEach(function(t){e.addAnnot(t)})}if(r>=a){var s=new n.JsonLoader(o+"&page="+a,!0);s.on("loaded",f),s.load(),a++}};f()};return this.addAnnot=function(t){var e,i=Date.parse(t.ts);if(s(this.annotCategories).eachRight(function(t){return t.ts<i?(e=t,!1):void 0}),e&&this.timeEnd>i){var n=Math.floor((i-this.timeBegin)/(1e3*this.intervalDuration));"undefined"==typeof this.cells[n].graphics&&this.initCell(this.cells[n],e);var o;o="undefined"!=typeof e.colors[t.content.category.code]?t.content.category.code:"default",this.cells[n].categories[o].count+=1,this.cells[n].totalAnnots+=1,this.redrawCell(this.cells[n],e)}},this.initClockGraphics=function(){var t=new n.Text(o.formatTime(this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});t.x=this.circleX+15,t.y=this.circleY-this.radius-this.maxCellHeight-10,this.container.addChild(t);var e=new n.Text(o.formatTime(this.timeEnd),{font:"12pt Gothic Standard",fill:"#646464"});e.x=this.circleX-15-e.width,e.y=this.circleY-this.radius-this.maxCellHeight-10,this.container.addChild(e);var i=new n.Text(o.formatTime((this.timeEnd-this.timeBegin)/4+this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});i.x=this.circleX+this.radius+this.maxCellHeight+10,i.y=this.circleY-i.height,i.rotation=Math.PI/2,this.container.addChild(i);var s=new n.Text(o.formatTime((this.timeEnd-this.timeBegin)/2+this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});s.x=this.circleX-s.width/2,s.y=this.circleY+this.radius+this.maxCellHeight-2,this.container.addChild(s);var r=new n.Text(o.formatTime(3*(this.timeEnd-this.timeBegin)/4+this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});r.x=this.circleX-this.radius-this.maxCellHeight-10,r.y=this.circleY+i.height,r.rotation=-Math.PI/2,this.container.addChild(r);var a=new n.Graphics;a.lineStyle(1,6579300).moveTo(this.circleX,this.circleY-this.radius/3/2).lineTo(this.circleX,this.circleY-this.radius-this.maxCellHeight-10).endFill(),this.container.addChild(a)},this.redrawCell=function(t,e){var i,n=0;i=t.totalAnnots*this.intervalHeight>this.maxCellHeight?this.maxCellHeight/t.totalAnnots:this.intervalHeight;for(var o=0;o<e.order.length;o++){var s=e.order[o];t.graphics.beginFill(t.categories[s].color.replace("#","0x")).drawRect(0,n,this.intervalWidth-1,-t.categories[s].count*i).endFill(),n-=t.categories[s].count*i}},this.initCell=function(t,e){t.graphics=new n.Graphics,t.graphics.position.x=this.circleX+this.radius*Math.sin(t.i*(360/f)*(Math.PI/180)),t.graphics.position.y=this.circleY-this.radius*Math.cos(t.i*(360/f)*(Math.PI/180)),t.graphics.rotation=t.i*(360/f)*(Math.PI/180)+360/(2*f)*(Math.PI/180),this.container.addChild(t.graphics);for(var i in e.colors)t.categories[i]={count:0,color:e.colors[i]};"undefined"==typeof t.categories["default"]&&(t.categories["default"]={count:0,color:e.defaultColor})},this.init=function(){this.archive||u.message(function(t){e.addAnnot(t)}),this.showClockGraphics&&this.initClockGraphics()},this.start=function(){this.startTs=Date.now(),w()},this.refresh=function(){},this.stop=function(){},this}var n=t("pixi"),o=t("./utils.js"),s=t("lodash"),r={logger:void 0,intervalWidth:10,intervalHeight:5,maxCellHeight:200,radius:300,serverUrl:"http://127.0.0.1:8080",channel:"ANNOT",maxPages:1e3,showClockGraphics:!0,archive:!1};e.exports={AnnotsTimeLine:i}},{"./utils.js":9,lodash:"lodash",pixi:"pixi"}],4:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(l).value();this.container=new n.DisplayObjectContainer,this.container.x=i.xInit,this.container.y=i.yInit,this.width=i.width,this.height=i.height,this.timeBegin=i.timeBegin,this.timeEnd=i.timeEnd,this.annotCategories=[],this.annotCategoriesDay2=[],this.annotCategoriesDay1=[];var c=i.wsPianoroll,d=i.wsAnnot,f=i.stageView,g=(Date.now()+36e5,i.channel),u=i.serverUrl,v=i.eventCode,p=i.eventCodeSessionDay2,w=i.eventCodeSessionDay1;h.getAnnotCategories(i.urlCategories+v,this.annotCategories),h.getAnnotCategories(i.urlCategories+p,this.annotCategoriesDay2),h.getAnnotCategories(i.urlCategories+w,this.annotCategoriesDay1),f.registerComponent(this);var m=new r.AnnotsTimeLine({stageView:f,logger:logger,ws:d,xInit:0,yInit:0,width:624,height:568,timeBegin:this.timeBegin,timeEnd:this.timeEnd,intervalWidth:6,intervalHeight:10,maxCellHeight:70,radius:200,eventCode:v,channel:g,serverUrl:u,annotCategories:this.annotCategories}),C=new r.AnnotsTimeLine({stageView:f,xInit:0,yInit:0,width:624,height:568,timeBegin:Date.parse("2015-01-23T09:30:00+01:00"),timeEnd:Date.parse("2015-01-23T18:30:00+01:00"),circleX:m.circleX,circleY:m.circleY,intervalWidth:2*m.radius/3*m.intervalWidth/m.radius,intervalHeight:m.intervalHeight*(m.radius-2*m.radius/3)/m.maxCellHeight,maxCellHeight:(m.radius-2*m.radius/3)/2,radius:2*m.radius/3,annotCategories:this.annotCategoriesDay2,eventCode:p,channel:g,serverUrl:u,showClockGraphics:!1,archive:!0}),x=(new r.AnnotsTimeLine({stageView:f,xInit:0,yInit:0,width:624,height:568,timeBegin:Date.parse("2015-01-22T09:30:00+01:00"),timeEnd:Date.parse("2015-01-22T18:30:00+01:00"),circleX:m.circleX,circleY:m.circleY,intervalWidth:2*m.radius/3*m.intervalWidth/m.radius,intervalHeight:m.intervalHeight*(m.radius-m.radius/3)/m.maxCellHeight,maxCellHeight:(2*m.radius/3-m.radius/3)/4,radius:m.radius/3,annotCategories:this.annotCategoriesDay1,eventCode:w,channel:g,serverUrl:u,showClockGraphics:!1,archive:!0}),new n.Text("-- : -- : --",{font:"18pt Gothic Standard",fill:"#646464"}));x.x=C.circleX-x.width/2,x.y=C.circleY-x.height/2,this.container.addChild(x);var y=(new s.DoubleRoll({stageView:f,logger:logger,ws:c,yInit:this.height-200,sceneHeight:200,pianorolls:[{height:200,timeWidth:10,lineInterval:5e3,noteHeight:10}]}),new s.DoubleRoll({stageView:f,logger:logger,ws:c,orientation:"vertical",sceneHeight:568,pianorolls:[{height:200,timeWidth:60,lineInterval:5e3,noteHeight:5}]})),I=new a.AnnotsRoll({stageView:f,logger:logger,ws:d,parentContainer:y.stage,xInit:624,yInit:568,width:400,height:568,widthRoll:200,framerate:y.framerate,pixelsPerSecond:Math.floor(1024/60),annotColors:this.annotCategories}),T=(new n.Graphics).lineStyle(1,6579300).moveTo(I.container.x,I.container.y).lineTo(I.container.x,I.container.y-I.height).moveTo(I.container.x+I.widthRoll,I.container.y).lineTo(I.container.x+I.widthRoll,I.container.y-I.height).moveTo(0,this.height-200).lineTo(this.width,this.height-200).drawRect(0,0,this.width-1,this.height-1).beginFill(15527148).drawRect(824,0,200,568).endFill();this.container.addChild(T),this.init=function(){},this.updateTime=function(){x.setText(h.formatTime(Date.now()))};var D;return this.start=function(){D=setInterval(function(){e.updateTime()},1e3)},this.refresh=function(){},this.stop=function(){},this}var n=t("pixi"),o=t("lodash"),s=t("./doubleroll.js"),r=t("./annotstimeline.js"),a=t("./annotsroll.js"),h=t("./utils.js"),l={xInit:0,yInit:0,width:1024,height:768};e.exports={AnnotsVizView:i}},{"./annotsroll.js":2,"./annotstimeline.js":3,"./doubleroll.js":5,"./utils.js":9,lodash:"lodash",pixi:"pixi"}],5:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(r).value(),a=i.orientation,h="vertical"!==a;this.logger=i.logger,this.lineColor=i.lineColor,this.lineFillColor=i.lineFillColor,this.framerate=i.framerate,this.offsetMusic=i.offsetMusic,this.noteColors=i.noteColors;var l=i.noteHeight,c=i.sceneHeight||o(i.pianorolls).reduce(function(t,e){return t+e.height},0),d=i.timeWidth,f=i.lineInterval,g=i.offsetMusic,u=i.sceneWidth,v=i.stageView,p=i.zeroShift,w=i.ws,m={};this.container=new n.DisplayObjectContainer,this.container.x=Math.floor(u*p),this.container.y=0,v.registerComponent(this);var C=[],x={parentContainer:this.container,orientation:a,xInit:0,width:u,noteColors:this.noteColors,colorsReg:m,lineColor:this.lineColor,lineInterval:f,offsetMusic:g},y=i.yInit||0,I=!0;o(i.pianorolls).forEach(function(t,r){var a=l||t.noteHeight||t.height/128,h=t.timeWidth||d;if(C.push(new s(o({yInit:y,height:t.height,linesDown:I,pixelsPerSecond:Math.floor(u/h),noteHeight:a,lineInterval:t.lineInterval}).defaults(x).value())),y+=t.height,I=!I,r<i.pianorolls.length-1){var c=(new n.Graphics).beginFill(e.lineFillColor).lineStyle(1,e.lineColor).moveTo(Math.floor(u*p),y).lineTo(-u-Math.floor(u*p),y).endFill();e.container.addChild(c)}}),h||(this.container.rotation=Math.PI/2,this.container.y=c,this.container.x=u),this.init=function(){w.message(function(t){e.addNotes(t)})},this.addNotes=function(t){C.forEach(function(e){e.addNoteRaw(t)})},this.refresh=function(){C.forEach(function(t){t.move()})};var T;return this.start=function(){T=Date.now(),C.forEach(function(t){t.start()})},this.stop=function(){C.forEach(function(t){t.stop()})},this.log=function(t){this.logger&&this.logger.log(t)},this}var n=t("pixi"),o=t("lodash"),s=t("./pianoroll"),r={orientation:"horizontal",logger:void 0,sceneWidth:1024,pianorolls:[{height:435,timeWidth:10,lineInterval:5e3,noteHeight:void 0},{height:645,timeWidth:60,lineInterval:5e3,noteHeight:void 0}],framerate:25,offsetMusic:!1,sceneBgColor:16777215,lineColor:4473924,lineFillColor:16776960,noteColors:[12124160,4971889,11506462,1845434,5466513],noteHeight:void 0,zeroShift:.9,timeWidth:60,lineInterval:5e3};e.exports={DoubleRoll:i}},{"./pianoroll":7,lodash:"lodash",pixi:"pixi"}],6:[function(t,e){"use strict";function i(t,e){var i=e;"string"==typeof e&&(i=document.getElementById(e)),t||(document.body.removeChild(i),i=void 0),this.log=function(e){t&&i&&(i.innerHTML+=e+"\n",i.scrollTop=i.scrollHeight)}}function n(t){this.log=function(e){t&&console.log(e)}}e.exports={HtmlLogger:i,ConsoleLogger:n}},{}],7:[function(t,e){"use strict";function i(t){var e=this;this.container=new n.DisplayObjectContainer,this.container.x=t.xInit,this.container.y=t.yInit,t.parentContainer.addChild(this.container);var i=t.orientation,a="vertical"!==i;this.linesDown=t.linesDown,this.height=t.height,this.pixelsPerSecond=t.pixelsPerSecond,this.width=t.width,this.noteColors=t.noteColors,this.colorsReg=t.colorsReg||{},this.lineColor=t.lineColor,this.lineInterval=t.lineInterval,this.offsetMusic=t.offsetMusic||!1,this.noteHeight=t.noteHeight,this.noteDict={},this.startTs=t.startTs||Date.now();var h=!1,l=function(t){var e=t.toGlobal(new n.Point(0,0));return e.x+t.width<0||e.y+t.height<0};this.getColor=function(t){var e=this.colorsReg[t];if("undefined"==typeof e){var i=Object.keys(this.colorsReg).length;e=this.colorsReg[t]=i<this.noteColors.length?this.noteColors[i]:parseInt(o({luminosity:"light",hue:"random",format:"hex"}).replace(/^#/,""),16)}return e},this.getNoteRect=function(t,e,i,o,s,r){var a=new n.Graphics;return a.beginFill(i,o),a.drawRect(0,0,s,r),a.endFill(),a.x=t,a.y=e,a.width=s,a.height=r,a},this.addNoteRaw=function(t){var e=t.content[3],i=t.content[4],n=1e3*(t.content[0]-r),o=t.content[2],s=t.content[1];this.addNote(e,n,s,i,o,0)},this.addNote=function(t,e,i,n,o,s){var r=e;this.offsetMusic&&(r=this.startTs+i);var a,h=s,l=n;if(!s)if("undefined"==typeof this.noteDict[o]&&(this.noteDict[o]={}),0===n){if("undefined"!=typeof this.noteDict[o][t]){var c=this.noteDict[o][t];delete this.noteDict[o][t],h=i-c.sessionTs,a=c.graphics,l=c.velocity,r=c.ts}}else h=Math.abs(Date.now()-r),this.noteDict[o][t]={ts:r,velocity:n,sessionTs:i};if(!this.offsetMusic||0===n){var d=h*this.pixelsPerSecond/1e3;if(a)a.width=d;else{var f=(r-this.startTs)*this.pixelsPerSecond/1e3;if(f+d<Math.abs(this.container.x)-this.width)return;var g=Math.floor((128-t+.5)*this.height/128-this.noteHeight/2),u=this.getColor(o),v=l/128;a=this.getNoteRect(f,g,u,v,d,this.noteHeight),this.container.addChild(a)}!s&&n&&(this.noteDict[o][t].graphics=a)}},this.addLine=function(t){"undefined"==typeof t&&(t=new Date);var e=-this.container.x,i=this.linesDown?this.height-20:0,o=(new n.Graphics).beginFill(16776960).lineStyle(1,this.lineColor).moveTo(0,0).lineTo(0,20).endFill();o.x=e,o.y=i,this.container.addChild(o);var s=t.getHours(),r=t.getMinutes(),h=t.getSeconds(),l=(10>s?"0"+s:s)+":"+(10>r?"0"+r:r)+":"+(10>h?"0"+h:h),c={font:"10pt Arial",fill:"#444444"},d=new n.Text(l,c);a?(d.x=e+2,d.y=this.linesDown?this.height-15:2):(d.rotation=-Math.PI/2,d.x=e,d.y=this.linesDown?this.height-2:d.width+2),this.container.addChild(d)},this.moveTo=function(t){var e=this.container.x;this.container.x=Math.floor(t*this.pixelsPerSecond);var i=Math.abs(e-this.container.x);s.forOwn(this.noteDict,function(t){s.forOwn(t,function(t){t.graphics&&(t.graphics.width=t.graphics.width+i)})})},this.move=function(){var t=(this.startTs-Date.now())/1e3;this.moveTo(t)},this.removePassedObjets=function(){var t=[];s(e.container.children).forEach(function(e){return"undefined"==typeof e||l(e)&&t.push(e)}),t.forEach(function(t){e.container.removeChild(t)})},this.start=function(){h||(this.startTs=Date.now(),this.addLine(),h=!0),this.verticalLinesInterval=setInterval(function(){e.addLine()},this.lineInterval),this.cleanInterval=setInterval(function(){e.removePassedObjets()},1e3*this.width/this.pixelsPerSecond)},this.stop=function(){clearInterval(this.verticalLinesInterval),clearInterval(this.cleanInterval)}}var n=t("pixi"),o=t("randomColor"),s=t("lodash"),r=2208988800;e.exports=i},{lodash:"lodash",pixi:"pixi",randomColor:"randomColor"}],8:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(s).value(),r=i.externalRefresh;this.logger=i.logger,this.framerate=i.framerate;var a=i.sceneBgColor,h=i.sceneWidth,l=i.sceneHeight,c=i.canvasContainer,d=[],f=[];this.stage=new n.Stage(a);var g=n.autoDetectRenderer(h,l);this.init=function(){"string"==typeof c&&(c=document.getElementById(c)),"string"==typeof d&&(d=document.getElementById(d)),c.appendChild(g.view),f.forEach(function(t){t.init()})},this.registerTimeContainer=function(t){d.push(t)},this.registerComponent=function(t){f.push(t),this.stage.addChild(t.container)},this.refresh=function(){f.forEach(function(t){t.refresh()}),g.render(this.stage)};var u;return this.start=function(){r||(u=setInterval(function(){e.refresh()},1e3/this.framerate)),f.forEach(function(t){t.start()})},this.stop=function(){r||clearInterval(u),f.forEach(function(t){t.stop()})},this.log=function(t){this.logger&&this.logger.log(t)},this}var n=t("pixi"),o=t("lodash"),s={externalRefresh:!1,logger:void 0,sceneWidth:1024,sceneHeight:768,framerate:25,sceneBgColor:16777215,canvasContainer:"canvasContainer"};e.exports={StageView:i}},{lodash:"lodash",pixi:"pixi"}],9:[function(t,e){"use strict";function i(t){return a(t).format("HH:mm:ss")}function n(t){var e=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(t);return e?"#"+(1<<24|e[1]<<16|e[2]<<8|e[3]).toString(16).substr(1):t}function o(t,e){var i=new s.JsonLoader(t,!0);i.on("loaded",function(t){for(var i=t.target.json;e.length>0;)e.pop();i.sessions.forEach(function(t){var i={ts:null===t.start_ts?new Date(0):Date.parse(t.start_ts),colors:{}},o=t.categories_json;i.order=o.order,"undefined"==typeof i.order["default"]&&i.order.push("default");for(var s=r.clone(o.categories);s.length>0;){var a=s.pop();a.code&&(i.colors[a.code]=n(a.color)),a.subcategories&&(s=s.concat(a.subcategories))}o.categories.forEach(function(t){t.code&&(i.colors[t.code]=n(t.color))}),i.defaultColor=o.defaultColor||"#536991",e.push(i)})}),i.load()}var s=t("pixi"),r=t("lodash"),a=t("moment");e.exports={formatTime:i,getAnnotCategories:o,colorToHex:n}},{lodash:"lodash",moment:"moment",pixi:"pixi"}],10:[function(t,e){"use strict";function i(t,e){var i=t,n=new WebSocket(i),o=e,s=function(t){o&&o.log(t)},r=[];n.onopen=function(){s("Connected to "+i)},n.onclose=function(t){s("Connection closed (wasClean = "+t.wasClean+", code = "+t.code+", reason = '"+t.reason+"')"),n=null},n.onmessage=function(t){s("received "+t.data);var e=JSON.parse(t.data);r.forEach(function(t){t(e)})},this.message=function(t){t&&r.push(t)}}e.exports={WsWrapper:i}},{}]},{},[1])(1)});
\ No newline at end of file
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.annotviz=t()}}(function(){return function t(e,i,n){function o(r,a){if(!i[r]){if(!e[r]){var h="function"==typeof require&&require;if(!a&&h)return h(r,!0);if(s)return s(r,!0);var l=new Error("Cannot find module '"+r+"'");throw l.code="MODULE_NOT_FOUND",l}var c=i[r]={exports:{}};e[r][0].call(c.exports,function(t){var i=e[r][1][t];return o(i?i:t)},c,c.exports,t,e,i,n)}return i[r].exports}for(var s="function"==typeof require&&require,r=0;r<n.length;r++)o(n[r]);return o}({1:[function(t,e){"use strict";var i=t("./doubleroll"),n=t("./annotsroll"),o=t("./annotstimeline"),s=t("./annotsvizview"),r=t("./stageview"),a=t("./wswrapper"),h=t("./logger"),l=t("./utils"),c=t("lodash");e.exports=c({}).extend(i).extend(n).extend(o).extend(s).extend(r).extend(a).extend(h).extend(l).value()},{"./annotsroll":2,"./annotstimeline":3,"./annotsvizview":4,"./doubleroll":5,"./logger":6,"./stageview":8,"./utils":9,"./wswrapper":10,lodash:"lodash"}],2:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(a).value();this.container=new n.DisplayObjectContainer,this.container.x=i.xInit,this.container.y=i.yInit,this.container.width=i.width,this.height=i.height,this.width=i.width,this.widthRoll=i.widthRoll,this.pixelsPerSecond=i.pixelsPerSecond,this.annotColors=i.annotColors,this.startTs=i.startTs||Date.now(),this.ignoreAnnots=i.ignoreAnnots;var h=i.yInit,l=o(i.annotStyles).defaults(r).value(),c=15;for(var d in l)l[d].wordWrap===!0&&(l[d].wordWrapWidth=this.widthRoll-c);var g,f=!1,u=i.ws,v=i.externalRefresh,p=i.stageView,m=0;p.registerComponent(this);var w=function(t){var e=t.toGlobal(new n.Point(0,0));return e.x+t.width<0||e.y+t.height<0};this.addAnnots=function(t){var e=t.content.category.label,i=t.content.text,n=t.content.user,o=Date.parse(t.ts),s=t.content.color||this.getColor(o,t.content.category.code);this.addAnnot(e,i,n,s,o)},this.getColor=function(t,e){var i;o(this.annotColors).eachRight(function(e){return e.ts<t?(i=e.colors,!1):void 0});var n;return i&&(n=i[e]),n||(n=i.defaultColor||s),n},this.addAnnot=function(t,i,s,r,a){var d=0,f=(a-this.startTs)*this.pixelsPerSecond/1e3+h,u=parseInt(r.replace(/^#/,""),16);if(0===m){var v=(new n.Graphics).beginFill(u).drawRect(d,f,10,3).endFill();this.container.addChild(v);var p=0,w=new n.Text(t,o(l.label).extend({fill:r}).value());if(w.x=d+c,w.y=f-23,this.container.addChild(w),p+=w.height-23+2,i){var C=new n.Text(i,l.text);C.x=d+c,C.y=f+p,this.container.addChild(C),p+=C.height+2}var x=new n.Text(s,l.user);x.x=d+c,x.y=f+p,this.container.addChild(x),p+=x.height+8,this.ignoreAnnots===!0&&(m=p/this.pixelsPerSecond,g=setInterval(function(){e.refreshWait()},1e3))}this.addAnnotLine(u,f)},this.addAnnotLine=function(t,e){var i=this.widthRoll,o=(new n.Graphics).beginFill(t).drawRect(i,e,this.width-i,3).endFill();this.container.addChild(o)},this.moveTo=function(t){this.container.y=Math.floor(t*this.pixelsPerSecond)},this.move=this.refresh=function(){var t=(this.startTs-Date.now())/1e3;this.moveTo(t)},this.refreshWait=function(){m-=1,0>m&&(m=0,clearInterval(g))},this.removePassedObjets=function(){var t=[];o(e.container.children).forEach(function(e){return"undefined"==typeof e||w(e)&&t.push(e)}),t.forEach(function(t){e.container.removeChild(t)})},this.init=function(){u.message(function(t){e.addAnnots(t)})},this.start=function(){f||(this.startTs=Date.now(),f=!0),this.cleanInterval=setInterval(function(){e.removePassedObjets()},1e3*this.height/this.pixelsPerSecond),v||(this.refreshInterval=setInterval(function(){e.move()},1e3/this.framerate))},this.stop=function(){clearInterval(this.cleanInterval),v||clearInterval(this.refreshInterval)}}var n=t("pixi"),o=t("lodash"),s="#bababa",r={label:{font:"16pt Arial Bold",fill:"#65A954",wordWrap:!0},text:{font:"12pt Arial Regular",fill:"#444444",wordWrap:!0},user:{font:"14pt Arial regular",fill:"#666666"}},a={externalRefresh:!1,defaultColor:s,annotStyles:r,ignoreAnnots:!1};e.exports={AnnotsRoll:i}},{lodash:"lodash",pixi:"pixi"}],3:[function(t,e){"use strict";function i(t){var e=this,i=s(t).defaults(r).value();this.container=new n.DisplayObjectContainer,this.container.x=i.xInit,this.container.y=i.yInit,this.container.width=i.width,this.container.height=i.height,this.timeBegin=i.timeBegin,this.timeEnd=i.timeEnd,this.duration=(this.timeEnd-this.timeBegin)/1e3,this.width=i.width,this.height=i.height,this.intervalHeight=i.intervalHeight,this.intervalWidth=i.intervalWidth,this.maxCellHeight=i.maxCellHeight,this.annotCategories=i.annotCategories,this.startTs=t.startTs||Date.now(),this.showClockGraphics=i.showClockGraphics,this.archive=i.archive,this.circleX=i.circleX||this.width/2,this.circleY=i.circleY||this.height/2,this.radius=i.radius;var a=2*Math.PI*this.radius;this.intervalDuration=this.intervalWidth*this.duration/a;var h=i.channel,l=i.eventCode,c=i.serverUrl,d=i.maxPages,g=Math.floor(a/this.intervalWidth);this.cells=[];for(var f=0;f<a/this.intervalWidth;f++)this.cells[f]=[],this.cells[f].i=f,this.cells[f].totalAnnots=0,this.cells[f].categories={};var u=i.ws,v=i.stageView,p=new n.Graphics;p.lineStyle(2,6579300).drawCircle(this.circleX,this.circleY,this.radius-3).endFill(),this.container.addChild(p),v.registerComponent(this);var m=function(){var t=e.timeBegin,i=Math.min(e.timeEnd,e.startTs),o=c+"/p/api/v1/annotation",s=[{name:"ts",op:">",val:new Date(t).toISOString()},{name:"ts",op:"<=",val:new Date(i).toISOString()},{name:"channel",op:"==",val:h},{name:"event_code",op:"==",val:l}];o=o+"?q="+JSON.stringify({filters:s});var r=1,a=1,g=function(t){if(t){var i=t.target.json;r=Math.min(d,parseInt(i.total_pages)),i.objects.forEach(function(t){e.addAnnot(t)})}if(r>=a){var s=new n.JsonLoader(o+"&page="+a,!0);s.on("loaded",g),s.load(),a++}};g()};return this.addAnnot=function(t){var e,i=Date.parse(t.ts);if(s(this.annotCategories).eachRight(function(t){return t.ts<i?(e=t,!1):void 0}),e&&this.timeEnd>i){var n=Math.floor((i-this.timeBegin)/(1e3*this.intervalDuration));"undefined"==typeof this.cells[n].graphics&&this.initCell(this.cells[n],e);var o;o="undefined"!=typeof e.colors[t.content.category.code]?t.content.category.code:"default",this.cells[n].categories[o].count+=1,this.cells[n].totalAnnots+=1,this.redrawCell(this.cells[n],e)}},this.initClockGraphics=function(){var t=new n.Text(o.formatTime(this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});t.x=this.circleX+15,t.y=this.circleY-this.radius-this.maxCellHeight-10,this.container.addChild(t);var e=new n.Text(o.formatTime(this.timeEnd),{font:"12pt Gothic Standard",fill:"#646464"});e.x=this.circleX-15-e.width,e.y=this.circleY-this.radius-this.maxCellHeight-10,this.container.addChild(e);var i=new n.Text(o.formatTime((this.timeEnd-this.timeBegin)/4+this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});i.x=this.circleX+this.radius+this.maxCellHeight+10,i.y=this.circleY-i.height,i.rotation=Math.PI/2,this.container.addChild(i);var s=new n.Text(o.formatTime((this.timeEnd-this.timeBegin)/2+this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});s.x=this.circleX-s.width/2,s.y=this.circleY+this.radius+this.maxCellHeight-2,this.container.addChild(s);var r=new n.Text(o.formatTime(3*(this.timeEnd-this.timeBegin)/4+this.timeBegin),{font:"12pt Gothic Standard",fill:"#646464"});r.x=this.circleX-this.radius-this.maxCellHeight-10,r.y=this.circleY+i.height,r.rotation=-Math.PI/2,this.container.addChild(r);var a=new n.Graphics;a.lineStyle(1,6579300).moveTo(this.circleX,this.circleY-this.radius/3/2).lineTo(this.circleX,this.circleY-this.radius-this.maxCellHeight-10).endFill(),this.container.addChild(a)},this.redrawCell=function(t,e){var i,n=0;i=t.totalAnnots*this.intervalHeight>this.maxCellHeight?this.maxCellHeight/t.totalAnnots:this.intervalHeight;for(var o=0;o<e.order.length;o++){var s=e.order[o];t.graphics.beginFill(t.categories[s].color.replace("#","0x")).drawRect(0,n,this.intervalWidth-1,-t.categories[s].count*i).endFill(),n-=t.categories[s].count*i}},this.initCell=function(t,e){t.graphics=new n.Graphics,t.graphics.position.x=this.circleX+this.radius*Math.sin(t.i*(360/g)*(Math.PI/180)),t.graphics.position.y=this.circleY-this.radius*Math.cos(t.i*(360/g)*(Math.PI/180)),t.graphics.rotation=t.i*(360/g)*(Math.PI/180)+360/(2*g)*(Math.PI/180),this.container.addChild(t.graphics);for(var i in e.colors)t.categories[i]={count:0,color:e.colors[i]};"undefined"==typeof t.categories["default"]&&(t.categories["default"]={count:0,color:e.defaultColor})},this.init=function(){this.archive||u.message(function(t){e.addAnnot(t)}),this.showClockGraphics&&this.initClockGraphics()},this.start=function(){this.startTs=Date.now(),m()},this.refresh=function(){},this.stop=function(){},this}var n=t("pixi"),o=t("./utils.js"),s=t("lodash"),r={logger:void 0,intervalWidth:10,intervalHeight:5,maxCellHeight:200,radius:300,serverUrl:"http://127.0.0.1:8080",channel:"ANNOT",maxPages:1e3,showClockGraphics:!0,archive:!1};e.exports={AnnotsTimeLine:i}},{"./utils.js":9,lodash:"lodash",pixi:"pixi"}],4:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(l).value();this.container=new n.DisplayObjectContainer,this.container.x=i.xInit,this.container.y=i.yInit,this.width=i.width,this.height=i.height,this.timeBegin=i.timeBegin,this.timeEnd=i.timeEnd,this.annotCategories=[],this.annotCategoriesDay2=[],this.annotCategoriesDay1=[];var c=i.wsPianoroll,d=i.wsAnnot,g=i.stageView,f=i.channel,u=i.serverUrl,v=i.eventCode,p=i.eventCodeSessionDay2,m=i.eventCodeSessionDay1,w=i.logger;h.getAnnotCategories(i.urlCategories+v,this.annotCategories),h.getAnnotCategories(i.urlCategories+p,this.annotCategoriesDay2),h.getAnnotCategories(i.urlCategories+m,this.annotCategoriesDay1),g.registerComponent(this);var C=new r.AnnotsTimeLine({stageView:g,logger:w,ws:d,xInit:0,yInit:0,width:624,height:568,timeBegin:this.timeBegin,timeEnd:this.timeEnd,intervalWidth:6,intervalHeight:10,maxCellHeight:70,radius:200,eventCode:v,channel:f,serverUrl:u,annotCategories:this.annotCategories}),x=new r.AnnotsTimeLine({stageView:g,xInit:0,yInit:0,width:624,height:568,timeBegin:Date.parse("2015-01-23T09:30:00+01:00"),timeEnd:Date.parse("2015-01-23T18:30:00+01:00"),circleX:C.circleX,circleY:C.circleY,intervalWidth:2*C.radius/3*C.intervalWidth/C.radius,intervalHeight:C.intervalHeight*(C.radius-2*C.radius/3)/C.maxCellHeight,maxCellHeight:(C.radius-2*C.radius/3)/2,radius:2*C.radius/3,annotCategories:this.annotCategoriesDay2,eventCode:p,channel:f,serverUrl:u,showClockGraphics:!1,archive:!0}),y=(new r.AnnotsTimeLine({stageView:g,xInit:0,yInit:0,width:624,height:568,timeBegin:Date.parse("2015-01-22T09:30:00+01:00"),timeEnd:Date.parse("2015-01-22T18:30:00+01:00"),circleX:C.circleX,circleY:C.circleY,intervalWidth:2*C.radius/3*C.intervalWidth/C.radius,intervalHeight:C.intervalHeight*(C.radius-C.radius/3)/C.maxCellHeight,maxCellHeight:(2*C.radius/3-C.radius/3)/4,radius:C.radius/3,annotCategories:this.annotCategoriesDay1,eventCode:m,channel:f,serverUrl:u,showClockGraphics:!1,archive:!0}),new n.Text("-- : -- : --",{font:"18pt Gothic Standard",fill:"#646464"}));y.x=x.circleX-y.width/2,y.y=x.circleY-y.height/2,this.container.addChild(y);var I=(new s.DoubleRoll({stageView:g,logger:w,ws:c,yInit:this.height-200,sceneHeight:200,pianorolls:[{height:200,timeWidth:10,lineInterval:5e3,noteHeight:10}]}),new s.DoubleRoll({stageView:g,logger:w,ws:c,orientation:"vertical",sceneHeight:568,pianorolls:[{height:200,timeWidth:60,lineInterval:5e3,noteHeight:5}]})),T=new a.AnnotsRoll({stageView:g,logger:w,ws:d,parentContainer:I.stage,xInit:624,yInit:568,width:400,height:568,widthRoll:200,framerate:I.framerate,pixelsPerSecond:Math.floor(1024/60),annotColors:this.annotCategories}),b=(new n.Graphics).lineStyle(1,6579300).moveTo(T.container.x,T.container.y).lineTo(T.container.x,T.container.y-T.height).moveTo(T.container.x+T.widthRoll,T.container.y).lineTo(T.container.x+T.widthRoll,T.container.y-T.height).moveTo(0,this.height-200).lineTo(this.width,this.height-200).drawRect(0,0,this.width-1,this.height-1).beginFill(15527148).drawRect(824,0,200,568).endFill();this.container.addChild(b),this.init=function(){},this.updateTime=function(){y.setText(h.formatTime(Date.now()))};var D;return this.start=function(){D=setInterval(function(){e.updateTime()},1e3)},this.refresh=function(){},this.stop=function(){},this}var n=t("pixi"),o=t("lodash"),s=t("./doubleroll.js"),r=t("./annotstimeline.js"),a=t("./annotsroll.js"),h=t("./utils.js"),l={xInit:0,yInit:0,width:1024,height:768};e.exports={AnnotsVizView:i}},{"./annotsroll.js":2,"./annotstimeline.js":3,"./doubleroll.js":5,"./utils.js":9,lodash:"lodash",pixi:"pixi"}],5:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(r).value(),a=i.orientation,h="vertical"!==a;this.logger=i.logger,this.lineColor=i.lineColor,this.lineFillColor=i.lineFillColor,this.framerate=i.framerate,this.offsetMusic=i.offsetMusic,this.noteColors=i.noteColors;var l=i.noteHeight,c=i.sceneHeight||o(i.pianorolls).reduce(function(t,e){return t+e.height},0),d=i.timeWidth,g=i.lineInterval,f=i.offsetMusic,u=i.sceneWidth,v=i.stageView,p=i.zeroShift,m=i.ws,w={};this.container=new n.DisplayObjectContainer,this.container.x=Math.floor(u*p),this.container.y=0,v.registerComponent(this);var C=[],x={parentContainer:this.container,orientation:a,xInit:0,width:u,noteColors:this.noteColors,colorsReg:w,lineColor:this.lineColor,lineInterval:g,offsetMusic:f},y=(new n.Graphics).beginFill(this.lineFillColor).lineStyle(1,this.lineColor).moveTo(Math.floor(u*p),0).lineTo(-u-Math.floor(u*p),0).endFill();this.container.addChild(y);var I=i.yInit||0,T=!0;o(i.pianorolls).forEach(function(t,r){var a=l||t.noteHeight||t.height/(t.range.top-t.range.bottom+1),h=t.timeWidth||d;if(C.push(new s(o({yInit:I,height:t.height,linesDown:T,pixelsPerSecond:Math.floor(u/h),noteHeight:a,lineInterval:t.lineInterval,range:t.range,dynamicRange:t.dynamicRange}).defaults(x).value())),I+=t.height,T=!T,r<i.pianorolls.length-1){var c=(new n.Graphics).beginFill(e.lineFillColor).lineStyle(1,e.lineColor).moveTo(Math.floor(u*p),I).lineTo(-u-Math.floor(u*p),I).endFill();e.container.addChild(c)}}),h||(this.container.rotation=Math.PI/2,this.container.y=c,this.container.x=u),this.init=function(){m.message(function(t){e.addNotes(t)})},this.addNotes=function(t){C.forEach(function(e){e.addNoteRaw(t)})},this.refresh=function(){C.forEach(function(t){t.move()})};var b;return this.start=function(){b=Date.now(),C.forEach(function(t){t.start()})},this.stop=function(){C.forEach(function(t){t.stop()})},this.log=function(t){this.logger&&this.logger.log(t)},this}var n=t("pixi"),o=t("lodash"),s=t("./pianoroll"),r={orientation:"horizontal",logger:void 0,sceneWidth:1024,pianorolls:[{height:384,timeWidth:10,lineInterval:5e3,noteHeight:void 0,range:{bottom:40,top:90},dynamicRange:!0},{height:384,timeWidth:60,lineInterval:5e3,noteHeight:void 0,range:{bottom:0,top:128},dynamicRange:!1}],framerate:25,offsetMusic:!1,sceneBgColor:16777215,lineColor:4473924,lineFillColor:16776960,noteColors:[12124160,4971889,11506462,1845434,5466513],noteHeight:void 0,zeroShift:.9,timeWidth:60,lineInterval:5e3};e.exports={DoubleRoll:i}},{"./pianoroll":7,lodash:"lodash",pixi:"pixi"}],6:[function(t,e){"use strict";function i(t,e){var i=e;"string"==typeof e&&(i=document.getElementById(e)),t||(document.body.removeChild(i),i=void 0),this.log=function(e){t&&i&&(i.innerHTML+=e+"\n",i.scrollTop=i.scrollHeight)}}function n(t){this.log=function(e){t&&console.log(e)}}e.exports={HtmlLogger:i,ConsoleLogger:n}},{}],7:[function(t,e){"use strict";function i(t){var e=this;this.container=new n.DisplayObjectContainer,this.container.x=t.xInit,this.container.y=t.yInit,t.parentContainer.addChild(this.container);var i=t.orientation,a="vertical"!==i;this.linesDown=t.linesDown,this.height=t.height,this.pixelsPerSecond=t.pixelsPerSecond,this.width=t.width,this.noteColors=t.noteColors,this.colorsReg=t.colorsReg||{},this.lineColor=t.lineColor,this.lineInterval=t.lineInterval,this.offsetMusic=t.offsetMusic||!1,this.noteHeight=t.noteHeight,this.noteDict={},this.startTs=t.startTs||Date.now(),this.dynamicRange=t.dynamicRange,this.initRange=t.range,this.range=t.range;var h=!1,l=function(t){var e=t.toGlobal(new n.Point(0,0));return e.x+t.width<0||e.y+t.height<0};this.getColor=function(t){var e=this.colorsReg[t];if("undefined"==typeof e){var i=Object.keys(this.colorsReg).length;e=this.colorsReg[t]=i<this.noteColors.length?this.noteColors[i]:parseInt(o({luminosity:"light",hue:"random",format:"hex"}).replace(/^#/,""),16)}return e},this.getNoteRect=function(t,e,i,o,s,r,a){var h=new n.Graphics;return h.note=t,h.beginFill(o,s),h.drawRect(0,0,r,a),h.endFill(),h.x=e,h.y=i,h.width=r,h.height=a,h},this.addNoteRaw=function(t){var e=t.content[3],i=t.content[4],n=1e3*(t.content[0]-r),o=t.content[2],s=t.content[1];this.addNote(e,n,s,i,o,0)},this.addNote=function(t,e,i,n,o,s){var r=e;this.offsetMusic&&(r=this.startTs+i);var a,h=s,l=n;if(!s)if("undefined"==typeof this.noteDict[o]&&(this.noteDict[o]={}),0===n){if("undefined"!=typeof this.noteDict[o][t]){var c=this.noteDict[o][t];delete this.noteDict[o][t],h=i-c.sessionTs,a=c.graphics,l=c.velocity,r=c.ts}}else h=Math.abs(Date.now()-r),this.noteDict[o][t]={ts:r,velocity:n,sessionTs:i};if(!this.offsetMusic||0===n){var d=h*this.pixelsPerSecond/1e3;if(a)a.width=d;else{var g=(r-this.startTs)*this.pixelsPerSecond/1e3;if(g+d<Math.abs(this.container.x)-this.width)return;if(this.dynamicRange&&(this.range.bottom>t||t>this.range.top)){var f={};f.bottom=Math.min(t,this.range.bottom),f.top=Math.max(t,this.range.top),this.rescaleScene(f)}var u=Math.floor((this.range.top-this.range.bottom-(t-this.range.bottom)+.5)*this.noteHeight-this.noteHeight/2),v=this.getColor(o),p=l/128;a=this.getNoteRect(t,g,u,v,p,d,this.noteHeight),this.container.addChild(a)}!s&&n&&(this.noteDict[o][t].graphics=a)}},this.rescaleScene=function(t){var e=this,i=[],n=this.initRange.top,o=this.initRange.bottom;s(e.container.children).forEach(function(t){return"undefined"!=typeof t&&t.note&&!l(t)?(n=Math.max(t.note,n),o=Math.min(t.note,o),i.push(t)):void 0}),t?this.range=t:(this.range.top=n,this.range.bottom=o),this.noteHeight=this.height/(this.range.top-this.range.bottom+1),i.forEach(function(t){t.y=Math.floor((e.range.top-e.range.bottom-(t.note-e.range.bottom)+.5)*e.noteHeight-e.noteHeight/2),t.height=e.noteHeight})},this.addLine=function(t){"undefined"==typeof t&&(t=new Date);var e=-this.container.x,i=this.linesDown?this.height-20:0,o=(new n.Graphics).beginFill(16776960).lineStyle(1,this.lineColor).moveTo(0,0).lineTo(0,20).endFill();o.x=e,o.y=i,this.container.addChild(o);var s=t.getHours(),r=t.getMinutes(),h=t.getSeconds(),l=(10>s?"0"+s:s)+":"+(10>r?"0"+r:r)+":"+(10>h?"0"+h:h),c={font:"10pt Arial",fill:"#444444"},d=new n.Text(l,c);a?(d.x=e+2,d.y=this.linesDown?this.height-15:2):(d.rotation=-Math.PI/2,d.x=e,d.y=this.linesDown?this.height-2:d.width+2),this.container.addChild(d)},this.moveTo=function(t){var e=this.container.x;this.container.x=Math.floor(t*this.pixelsPerSecond);var i=Math.abs(e-this.container.x);s.forOwn(this.noteDict,function(t){s.forOwn(t,function(t){t.graphics&&(t.graphics.width=t.graphics.width+i)})})},this.move=function(){var t=(this.startTs-Date.now())/1e3;this.moveTo(t)},this.removePassedObjets=function(){var t=[],i=!1;s(e.container.children).forEach(function(e){return"undefined"==typeof e||l(e)&&t.push(e)}),t.forEach(function(t){!e.dynamicRange||e.range.bottom!==t.note&&t.note!==e.range.top||(i=!0),e.container.removeChild(t)}),i&&e.rescaleScene()},this.start=function(){h||(this.startTs=Date.now(),this.addLine(),h=!0),this.verticalLinesInterval=setInterval(function(){e.addLine()},this.lineInterval),this.cleanInterval=setInterval(function(){e.removePassedObjets()},1e3*this.width/this.pixelsPerSecond)},this.stop=function(){clearInterval(this.verticalLinesInterval),clearInterval(this.cleanInterval)}}var n=t("pixi"),o=t("randomColor"),s=t("lodash"),r=2208988800;e.exports=i},{lodash:"lodash",pixi:"pixi",randomColor:"randomColor"}],8:[function(t,e){"use strict";function i(t){var e=this,i=o(t).defaults(s).value(),r=i.externalRefresh;this.logger=i.logger,this.framerate=i.framerate;var a=i.sceneBgColor,h=i.sceneWidth,l=i.sceneHeight,c=i.canvasContainer,d=[],g=[];this.stage=new n.Stage(a);var f=n.autoDetectRenderer(h,l);this.init=function(){"string"==typeof c&&(c=document.getElementById(c)),"string"==typeof d&&(d=document.getElementById(d)),c.appendChild(f.view),g.forEach(function(t){t.init()})},this.registerTimeContainer=function(t){d.push(t)},this.registerComponent=function(t){g.push(t),this.stage.addChild(t.container)},this.refresh=function(){g.forEach(function(t){t.refresh()}),f.render(this.stage)};var u;return this.start=function(){r||(u=setInterval(function(){e.refresh()},1e3/this.framerate)),g.forEach(function(t){t.start()})},this.stop=function(){r||clearInterval(u),g.forEach(function(t){t.stop()})},this.log=function(t){this.logger&&this.logger.log(t)},this}var n=t("pixi"),o=t("lodash"),s={externalRefresh:!1,logger:void 0,sceneWidth:1024,sceneHeight:768,framerate:25,sceneBgColor:16777215,canvasContainer:"canvasContainer"};e.exports={StageView:i}},{lodash:"lodash",pixi:"pixi"}],9:[function(t,e){"use strict";function i(t){return a(t).format("HH:mm:ss")}function n(t){var e=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(t);return e?"#"+(1<<24|e[1]<<16|e[2]<<8|e[3]).toString(16).substr(1):t}function o(t,e){var i=new s.JsonLoader(t,!0);i.on("loaded",function(t){for(var i=t.target.json;e.length>0;)e.pop();i.sessions.forEach(function(t){var i={ts:null===t.start_ts?new Date(0):Date.parse(t.start_ts),colors:{}},o=t.categories_json;i.order=o.order,"undefined"==typeof i.order["default"]&&i.order.push("default");for(var s=r.clone(o.categories);s.length>0;){var a=s.pop();a.code&&(i.colors[a.code]=n(a.color)),a.subcategories&&(s=s.concat(a.subcategories))}o.categories.forEach(function(t){t.code&&(i.colors[t.code]=n(t.color))}),i.defaultColor=o.defaultColor||"#536991",e.push(i)})}),i.load()}var s=t("pixi"),r=t("lodash"),a=t("moment");e.exports={formatTime:i,getAnnotCategories:o,colorToHex:n}},{lodash:"lodash",moment:"moment",pixi:"pixi"}],10:[function(t,e){"use strict";function i(t,e){var i=t,n=new WebSocket(i),o=e,s=function(t){o&&o.log(t)},r=[];n.onopen=function(){s("Connected to "+i)},n.onclose=function(t){s("Connection closed (wasClean = "+t.wasClean+", code = "+t.code+", reason = '"+t.reason+"')"),n=null},n.onmessage=function(t){s("received "+t.data);var e=JSON.parse(t.data);r.forEach(function(t){t(e)})},this.message=function(t){t&&r.push(t)}}e.exports={WsWrapper:i}},{}]},{},[1])(1)});
\ No newline at end of file